Skip to content

feat(admin-frontend): Etiquetas pagina como Pessoas e busca no backend só quando uma ação manda - #179

Merged
evertonschuster merged 2 commits into
mainfrom
feat/admin-frontend-etiquetas-sem-efeito
Oct 20, 2026
Merged

evertonschuster merged 2 commits into
mainfrom
feat/admin-frontend-etiquetas-sem-efeito

Conversation

@evertonschuster

@evertonschuster evertonschuster commented Oct 20, 2026 •

Copy link
Copy Markdown
Owner

O que muda

Etiquetas passa a paginar com o mesmo padrão de Pessoas (#178), agora que o backend pagina a listagem de tags (#180). E, como a ADR 0073 pediu para as listas, a tela só busca no backend quando uma ação manda (ADR 0074).

  • useTagListPage usa o usePaginatedList.
    • Ele passa os filtros iniciais (model/tagListFilters.ts) e o tagsRepository.list.
    • A página renderiza o PaginatedListSection. Com isso Etiquetas ganha o rodapé de Pessoas ("Exibindo 21–40 de 87 etiquetas", "Itens por página" com 10, 20, 50 ou 100 e padrão 20, o paginador), o esqueleto com tantas linhas quanto o tamanho e a correção de uma página além da última.
    • A busca vai para TagListSearch, ao lado da página, como ClientListSearch, com o limite de 254 caracteres da API.
  • tagsRepository.list({ search, page, pageSize }, signal) faz um pedido só, como clientsRepository.list. O adaptador da ADR 0069, que percorria todas as páginas de 100, sai: era exatamente o gatilho de aposentadoria que ela previa.
  • usePaginatedList ganha reload().
    • Ele pede de novo a página da tela sem limpar a resposta. Os tópicos tagSaved e tagDeleted o chamam.
    • Salvar ou excluir mantém as linhas e o rodapé até a resposta, sem piscar o esqueleto.
    • Excluir a última etiqueta da última página leva à página anterior, nunca a "Nenhuma etiqueta ainda".
  • Busca, página e tamanho saem da URL, como em Pessoas (ADR 0072). "Nova etiqueta", os links de editar e excluir e o fechamento dos diálogos não carregam mais location.search. Os diálogos são rotas filhas e a lista continua montada embaixo deles, então o estado dela sobrevive a abrir e fechar um.
  • Documentação:
    • ADR 0074; a ADR 0069 fica marcada como aposentada e a 0073 aponta para a 0074;
    • ARCHITECTURE §1, §2, §5 e §6;
    • AGENTS.md do admin-frontend e a skill agenza-form-field;
    • spec 003: duas Clarifications de 2026-10-20, o FR-019, a paginação sai do Out of Scope, e o contrato de rotas.

Decisões a conhecer

  • O estado da lista não fica na URL. Recarregar, abrir um link, Voltar/Avançar e voltar de outra tela começam na página 1 de 20, sem busca. O dono escolheu isso em vez de manter ?q= com replace ou um listener de popstate; as duas opções estão na ADR 0074.
  • Uma etiqueta criada ou renomeada aparece onde a ordem por nome a põe. O reload pede a página da tela; se a etiqueta nova cair em outra página, o total do rodapé cresce e ela não aparece nesta.

O que ficou de fora

Os diálogos de editar e excluir ainda carregam a etiqueta por :id num efeito ligado ao parâmetro da rota (useTagFormPage, useTagDeletePage). Está registrado na ADR 0074.

Como foi verificado

  • tsc, ESLint (0 erros; os 5 avisos react-refresh/only-export-components já existiam), Prettier e vitest --coverage: 866 testes, cobertura de 97,66%.
  • TagListPage.test.tsx fixa:
    • um pedido na montagem para a página 1 de 20 (dois no StrictMode, com o primeiro abortado);
    • nenhum pedido ao renderizar de novo nem ao digitar;
    • exatamente um pedido por ação, verificado dentro do act;
    • o abort na próxima ação e ao desmontar;
    • as linhas e o rodapé na tela enquanto um tópico recarrega;
    • a paginação: resumo, esqueleto do rodapé, 20 linhas de esqueleto, Próxima mantendo busca e tamanho, tamanho e busca voltando à página 1, salvar recarregando a página da tela e excluir a única da última página indo para a anterior.
  • use-paginated-list.test.tsx fixa o reload sozinho. Os testes do repositório cobrem o pedido paginado, e TagFormPage e TagDeletePage foram ajustados à resposta paginada.
  • No navegador, a página real numa porta privada, com um repositório falso de 45 etiquetas que pagina de verdade (o stack do dono serve o checkout principal):
    • Próxima pede a página 2;
    • editar na página 2 recarrega a página 2 sem esqueleto;
    • criar recarrega a página e o total vai a 46;
    • busca e tamanho 10 voltam à página 1;
    • excluir a única etiqueta da página 2 vai para a página 1 ("Exibindo 1–10 de 10").
  • Não verificado contra o backend real nem no e2e.

Histórico da branch

A branch foi refeita a partir da main, em dois commits: o trabalho anterior deste PR, num commit só, e a paginação. Ela carregava os 23 commits originais do #178, que entrou na main por squash, e três merges. O diff de arquivos já era só de Etiquetas, mas a aba de commits misturava as duas entregas.

🤖 Generated with Claude Code

@coderabbitai

coderabbitai Bot commented Oct 20, 2026 •

Copy link
Copy Markdown

Warning

Review limit reached

You've used all free OSS reviews for now. Wait for the free limit to reset to keep reviewing this public repository.

Next included review available in 14 minutes.

Check out review usage here.

View limit details

Limit details: You’ve used the included review currently available.

Learn how review limits work.

Review configuration:

⚙️ Run configuration
  • Configuration used: defaults
  • Review profile: CHILL
  • Plan: Advanced
  • Run ID: 8ff0d7dd-455c-4017-b412-ed3cc2b7a033
📥 Commits

Reviewing files that changed from the base of the PR and between b378c3c and 8c75a6b.

📒 Files selected for processing: 28
  • .claude/skills/agenza-form-field/SKILL.md
  • apps/admin-frontend/AGENTS.md
  • apps/admin-frontend/docs/ARCHITECTURE.md
  • apps/admin-frontend/specs/003-tags-crud/contracts/routes-contract.md
  • apps/admin-frontend/specs/003-tags-crud/spec.md
  • apps/admin-frontend/src/features/tags/api/tagsRepository.test.ts
  • apps/admin-frontend/src/features/tags/api/tagsRepository.ts
  • apps/admin-frontend/src/features/tags/model/tag.ts
  • apps/admin-frontend/src/features/tags/model/tagList.ts
  • apps/admin-frontend/src/features/tags/model/tagListFilters.ts
  • apps/admin-frontend/src/features/tags/ui/pages/TagDeletePage/TagDeletePage.test.tsx
  • apps/admin-frontend/src/features/tags/ui/pages/TagDeletePage/useTagDeletePage.ts
  • apps/admin-frontend/src/features/tags/ui/pages/TagFormPage/TagFormPage.test.tsx
  • apps/admin-frontend/src/features/tags/ui/pages/TagFormPage/useTagFormPage.ts
  • apps/admin-frontend/src/features/tags/ui/pages/TagListPage/TagListPage.test.tsx
  • apps/admin-frontend/src/features/tags/ui/pages/TagListPage/TagListPage.tsx
  • apps/admin-frontend/src/features/tags/ui/pages/TagListPage/components/TagDeleteLink.tsx
  • apps/admin-frontend/src/features/tags/ui/pages/TagListPage/components/TagEditLink.tsx
  • apps/admin-frontend/src/features/tags/ui/pages/TagListPage/components/TagListSearch.tsx
  • apps/admin-frontend/src/features/tags/ui/pages/TagListPage/useTagListPage.ts
  • apps/admin-frontend/src/features/tags/ui/pages/TagListPage/useTagListPage.types.ts
  • apps/admin-frontend/src/widgets/paginated-list-section/paginated-list-section.types.ts
  • apps/admin-frontend/src/widgets/paginated-list-section/use-paginated-list.test.tsx
  • apps/admin-frontend/src/widgets/paginated-list-section/use-paginated-list.ts
  • docs/adr/0069-tags-collection-compatibility-adapter.md
  • docs/adr/0073-admin-frontend-paged-list-asks-only-when-told.md
  • docs/adr/0074-admin-frontend-tags-list-asks-only-when-told.md
  • docs/adr/README.md
  • Autofix · Keep fixing CodeRabbit findings and required CI, and resolving merge conflicts

Thanks for using CodeRabbit! It's free for OSS, and your support helps us grow. If you like it, consider giving us a shout-out.

❤️ Share

Comment @coderabbitai help to get the list of available commands.

@evertonschuster

Copy link
Copy Markdown
Owner Author

@coderabbitai review

@coderabbitai

coderabbitai Bot commented Oct 20, 2026 •

Copy link
Copy Markdown
⚠️ Action not completed

Review rate limited.

Note: CodeRabbit is an incremental review system and does not re-review already reviewed commits. This command is applicable only when automatic reviews are paused.

Base automatically changed from feat/admin-frontend-paginacao-listas to main October 20, 2026 22:33
evertonschuster and others added 2 commits October 20, 2026 19:41
…ão manda, com a busca fora da URL

useTagListPage deixa o useEffect ligado a ?q= e o useSearchParams: a busca vive no estado do hook,
a busca, "Limpar busca" e "Tentar novamente" passam por request(next) e os tópicos tagSaved e
tagDeleted por send(query), que aborta o pedido em voo; a primeira busca sai de um efeito sem
dependências, via useEffectEvent. Os links e o fechamento dos diálogos não carregam mais ?q=; a
lista continua montada sob o diálogo, então a busca sobrevive a abrir e fechar um.

Os testes fixam um pedido por ação dentro do act, nenhum ao renderizar de novo ou ao digitar, e o
abort na próxima ação e ao desmontar. ADR 0074, linha no §5, AGENTS.md e spec 003 atualizados.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
…essoas

O backend pagina a listagem de tags desde o #180, e a tela ainda listava o
catálogo inteiro pelo adaptador da ADR 0069. Agora Etiquetas usa o mesmo
padrão de Pessoas.

- useTagListPage passa os filtros iniciais (model/tagListFilters.ts) e o
  tagsRepository.list ao usePaginatedList; a página renderiza o
  PaginatedListSection, com o mesmo rodapé ("Exibindo 21–40 de 87 etiquetas",
  "Itens por página" 10/20/50/100, padrão 20), o esqueleto com tantas linhas
  quanto o tamanho e a correção de uma página além da última.
- tagsRepository.list({ search, page, pageSize }, signal) faz um pedido só,
  como clientsRepository.list; o adaptador que percorria todas as páginas sai.
- usePaginatedList ganha reload(): pede de novo a página da tela sem limpar a
  resposta, e os tópicos tagSaved e tagDeleted o chamam, então salvar ou
  excluir mantém linhas e rodapé até a resposta; excluir a última etiqueta da
  última página leva à página anterior.
- TagListSearch ao lado da página, como ClientListSearch, com o limite de 254
  caracteres da busca.
- ADR 0074 reescrita (a primeira versão deixava a paginação de fora), ADR 0069
  marcada como aposentada, ADR 0073 e índice, ARCHITECTURE §1, §2, §5 e §6,
  AGENTS.md, spec 003 (Clarification, FR-019, fora do Out of Scope) e o
  contrato de rotas.
- Testes: a página (pedidos por ação, recarga pelos tópicos, paginação),
  reload no hook, o repositório paginado e os diálogos com a resposta
  paginada. 866 testes, cobertura de 97,66%.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
@evertonschuster
evertonschuster force-pushed the feat/admin-frontend-etiquetas-sem-efeito branch from a87e6be to 8c75a6b Compare October 20, 2026 23:03
@evertonschuster evertonschuster changed the title refactor(admin-frontend): Etiquetas busca no backend só quando uma ação manda, com a busca fora da URL feat(admin-frontend): Etiquetas pagina como Pessoas e busca no backend só quando uma ação manda Oct 20, 2026
@evertonschuster
evertonschuster merged commit 8c75a6b into main Oct 20, 2026
17 checks passed
@evertonschuster
evertonschuster deleted the feat/admin-frontend-etiquetas-sem-efeito branch October 20, 2026 23:06
evertonschuster added a commit that referenced this pull request Oct 20, 2026
…ão e teste (#183)

O #179 entrou na main por um git push direto, sem merge pelo PR, enquanto
checks do CI ainda rodavam e sem a revisão do dono. Este commit volta a main
ao estado do #178 (b378c3c) para que a entrega seja revisada e testada num PR
novo antes de entrar.

Desfaz:
- 8c75a6b feat(admin-frontend): Etiquetas pagina com o usePaginatedList, como Pessoas
- 9069d1f refactor(admin-frontend): Etiquetas busca no backend só quando uma ação manda, com a busca fora da URL

Co-authored-by: Claude Opus 5.5 <noreply@anthropic.com>
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant