feat: secoes da tela de log comecam fechadas, com clique para abrir

This commit is contained in:
Gustavo
2026-08-20 11:39:11 -03:00
parent 565649e50d
commit cf742b4341
3 changed files with 115 additions and 56 deletions
+19
View File
@@ -252,6 +252,25 @@ a.botao:hover { border-color: var(--cor-acento); color: var(--cor-acento); }
.status-dot-ativo { background: var(--cor-sucesso); } .status-dot-ativo { background: var(--cor-sucesso); }
.status-dot-inativo { background: var(--cor-perigo); } .status-dot-inativo { background: var(--cor-perigo); }
.secao-log { margin-bottom: 20px; }
.secao-log summary {
display: flex; align-items: center; gap: 10px; cursor: pointer;
list-style: none; padding: 10px 0; user-select: none;
}
.secao-log summary::-webkit-details-marker { display: none; }
.secao-log summary::before {
content: "▸"; display: inline-block; color: var(--cor-texto-secundario);
transition: transform 0.15s ease;
}
.secao-log[open] summary::before { transform: rotate(90deg); }
.secao-log-titulo { font-size: 1.17em; font-weight: 700; }
.botao-toggle-log {
margin-top: 0; padding: 6px 12px; font-size: 0.85rem; font-weight: 400;
background: transparent; border: 1px solid var(--cor-borda); color: var(--cor-texto);
}
.botao-toggle-log:hover { border-color: var(--cor-acento); color: var(--cor-acento); }
.secao-log-conteudo { padding-top: 4px; }
@media (prefers-reduced-motion: reduce) { @media (prefers-reduced-motion: reduce) {
*, *::before, *::after { transition: none !important; } *, *::before, *::after { transition: none !important; }
} }
+29 -2
View File
@@ -4,7 +4,12 @@
{% block conteudo %} {% block conteudo %}
<h1>Log</h1> <h1>Log</h1>
<h2>Ações no painel</h2> <details class="secao-log">
<summary>
<span class="secao-log-titulo">Ações no painel</span>
<button type="button" class="botao-toggle-log" aria-expanded="false">Mostrar</button>
</summary>
<div class="secao-log-conteudo">
{% if eh_admin %} {% if eh_admin %}
<form method="post" action="/log/limpar" style="margin-bottom:14px"> <form method="post" action="/log/limpar" style="margin-bottom:14px">
<input type="hidden" name="csrf_token" value="{{ csrf_token }}"> <input type="hidden" name="csrf_token" value="{{ csrf_token }}">
@@ -30,8 +35,15 @@
{% else %} {% else %}
<p>Nenhuma ação registrada ainda.</p> <p>Nenhuma ação registrada ainda.</p>
{% endif %} {% endif %}
</div>
</details>
<h2>Envios automáticos de chave (n8n)</h2> <details class="secao-log">
<summary>
<span class="secao-log-titulo">Envios automáticos de chave (n8n)</span>
<button type="button" class="botao-toggle-log" aria-expanded="false">Mostrar</button>
</summary>
<div class="secao-log-conteudo">
{% if not envios_configurado %} {% if not envios_configurado %}
<div class="cartao"> <div class="cartao">
<p> <p>
@@ -63,4 +75,19 @@
</table> </table>
</div> </div>
{% endif %} {% endif %}
</div>
</details>
<script>
document.querySelectorAll(".secao-log").forEach(function (secao) {
var botao = secao.querySelector(".botao-toggle-log");
var atualizar = function () {
var aberto = secao.hasAttribute("open");
botao.textContent = aberto ? "Ocultar" : "Mostrar";
botao.setAttribute("aria-expanded", aberto ? "true" : "false");
};
secao.addEventListener("toggle", atualizar);
atualizar();
});
</script>
{% endblock %} {% endblock %}
+13
View File
@@ -105,3 +105,16 @@ def test_limpar_log_usuario_padrao_toma_403():
app_teste.dependency_overrides[exigir_login] = lambda: UsuarioLogado(login="fulano", nome="Fulano", perfil="PADRAO") app_teste.dependency_overrides[exigir_login] = lambda: UsuarioLogado(login="fulano", nome="Fulano", perfil="PADRAO")
resposta = client.post("/log/limpar", data={"csrf_token": CSRF_TESTE}) resposta = client.post("/log/limpar", data={"csrf_token": CSRF_TESTE})
assert resposta.status_code == 403 assert resposta.status_code == 403
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('<details class="secao-log">') == 2
assert "<details class=\"secao-log\" open>" not in texto
assert "<details class='secao-log' open>" not in texto