# 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ênciaStatus Telefones 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 `