From 565649e50d909beb8da442aa78fa4535cb982061 Mon Sep 17 00:00:00 2001 From: Gustavo Date: Thu, 20 Aug 2026 11:34:43 -0300 Subject: [PATCH] docs: plano das secoes escondidas na tela de log --- .../plans/2026-08-20-log-secoes-escondidas.md | 235 ++++++++++++++++++ 1 file changed, 235 insertions(+) create mode 100644 docs/superpowers/plans/2026-08-20-log-secoes-escondidas.md diff --git a/docs/superpowers/plans/2026-08-20-log-secoes-escondidas.md b/docs/superpowers/plans/2026-08-20-log-secoes-escondidas.md new file mode 100644 index 0000000..e25cfae --- /dev/null +++ b/docs/superpowers/plans/2026-08-20-log-secoes-escondidas.md @@ -0,0 +1,235 @@ +# Log: Seções Escondidas por Padrão — Implementation Plan + +> **For agentic workers:** REQUIRED SUB-SKILL: Use superpowers:subagent-driven-development (recommended) or superpowers:executing-plans to implement this plan task-by-task. Steps use checkbox (`- [ ]`) syntax for tracking. + +**Goal:** Fazer as duas seções da tela `/log` ("Ações no painel" e "Envios +automáticos de chave (n8n)") começarem fechadas ao carregar a página, +exigindo um clique no título ou em um botão "Mostrar" para expandir. + +**Architecture:** Envolver cada seção em `
` +nativo do HTML (fechado por padrão, sem `open`), com um `` que +contém o título e um botão `Mostrar`/`Ocultar`. Um script inline pequeno +sincroniza o texto do botão e `aria-expanded` com o evento `toggle` nativo +do `
` — a abertura/fechamento em si não precisa de JavaScript, +só o texto do botão. + +**Tech Stack:** Jinja2 (`app/templates/log.html`), CSS puro +(`app/static/estilo.css`), JavaScript vanilla inline, pytest + +`fastapi.testclient.TestClient` (`tests/test_router_log.py`). + +## Global Constraints + +- Nenhuma seção pode abrir automaticamente ao carregar a página (spec: + "Fora de escopo" — abrir automaticamente qualquer seção por padrão). +- Estado aberto/fechado não é persistido entre recarregamentos (sem + localStorage, cookie ou parâmetro de URL). +- Nenhum dado exibido, paginação, limite de 20 registros em "Ações no + painel" ou o botão "Limpar log" (visível só para admin) pode mudar de + comportamento — só o wrapper de exibição muda. +- A ordem das seções continua: "Ações no painel" primeiro, "Envios + automáticos de chave (n8n)" embaixo. + +--- + +### Task 1: Seções `
` no template + estilo + teste + +**Files:** +- Modify: `app/templates/log.html` +- Modify: `app/static/estilo.css` +- Test: `tests/test_router_log.py` + +**Interfaces:** +- Consumes: contexto já passado pela rota `GET /log` em + `app/routers/log.py` (`acoes`, `envios`, `envios_configurado`, `eh_admin`, + `csrf_token`, `mensagem`, `mensagem_tipo`) — nenhuma mudança nesse router + nesta tarefa. +- Produces: nada consumido por outras tasks (task única). + +- [ ] **Step 1: Escrever o teste que falha** + +Adicionar ao final de `tests/test_router_log.py`: + +```python +def test_pagina_log_secoes_comecam_fechadas(monkeypatch): + monkeypatch.setattr(router_log.db_log, "listar", lambda limite=20: []) + monkeypatch.setattr(router_log.n8n_client, "listar_envios", lambda limite=50: []) + monkeypatch.setattr(router_log.n8n_client, "configurado", lambda: False) + + resposta = client.get("/log") + assert resposta.status_code == 200 + texto = resposta.text + assert texto.count('
') == 2 + assert "
" not in texto + assert "
" not in texto +``` + +- [ ] **Step 2: Rodar o teste para confirmar que falha** + +Run: `pytest tests/test_router_log.py::test_pagina_log_secoes_comecam_fechadas -v` +Expected: FAIL — o HTML atual não tem `
`. + +- [ ] **Step 3: Reescrever `app/templates/log.html`** + +Substituir o conteúdo do bloco `{% block conteudo %}` inteiro por: + +```html +{% block conteudo %} +

Log

+ +
+ + Ações no painel + + +
+ {% if eh_admin %} +
+ + +
+ {% endif %} + {% if acoes %} +
+ + + {% for a in acoes %} + + + + + + + + + {% endfor %} +
QuandoUsuárioAçãoEntidadeStatusDetalhe
{{ a.CRIADO_EM }}{{ a.USUARIO }}{{ a.ACAO }}{{ a.ENTIDADE }}{% if a.ENTIDADE_ID %} #{{ a.ENTIDADE_ID }}{% endif %}{{ "OK" if a.SUCESSO else "ERRO" }}{{ a.DETALHE or "" }}
+
+ {% else %} +

Nenhuma ação registrada ainda.

+ {% endif %} +
+
+ +
+ + Envios automáticos de chave (n8n) + + +
+ {% if not envios_configurado %} +
+

+ Integração com o n8n não configurada — defina N8N_API_URL e + N8N_API_KEY no ambiente (ver .env.example) para ver + aqui os envios automáticos de chave feitos pelo workflow do n8n. +

+
+ {% elif not envios %} +

Nenhum envio encontrado (ou não foi possível consultar o n8n agora).

+ {% else %} +
+ + + + + + {% for e in envios %} + + + + + + + + + + {% endfor %} +
DataClienteCódigoCompetênciaStatusTelefones enviadosTelefones com erro
{{ e.data_processamento }}{{ e.nome_cliente }}{{ e.codigo_cliente }}{{ e.competencia }}{{ e.status }}{{ e.telefones_enviados }}{{ e.telefones_com_erro or "" }}
+
+ {% endif %} +
+
+ + +{% endblock %} +``` + +Notas importantes: +- O `