feat(tenants): publico/ passa a vir de ConfigMap, nao mais so da imagem

This commit is contained in:
deploy
2026-09-30 00:11:48 +00:00
parent d65f4e5638
commit 19cc64729f
2 changed files with 230 additions and 46 deletions
+115 -23
View File
@@ -1698,6 +1698,20 @@ data:
.termos-uso-caixa input { margin-right: 6px; }
.termos-uso-aceite { margin: 10px 0; }
/* ── Abas (2026-09-29) — mesmo desenho do painel do dono ───────────────────── */
.abas { display: flex; gap: 4px; border-bottom: 1px solid var(--line); margin: 4px 0 18px; overflow-x: auto; }
.aba {
background: none; border: 0; border-bottom: 3px solid transparent; padding: 10px 16px;
font: inherit; font-weight: 600; color: var(--muted); cursor: pointer; white-space: nowrap;
}
.aba:hover { color: var(--navy); }
.aba.ativa { color: var(--navy); border-bottom-color: var(--orange); }
.aba .badge {
display: inline-block; min-width: 8px; height: 8px; margin-left: 6px; border-radius: 999px;
background: var(--orange); vertical-align: middle;
}
.aba .badge.num { min-width: 18px; height: auto; padding: 0 6px; font-size: 12px; color: #fff; line-height: 18px; }
minha-conta.html: |
<!DOCTYPE html>
<html lang="pt-BR">
@@ -1722,7 +1736,7 @@ data:
numero a cada publicacao que mexa nesses arquivos.
-->
<link rel="stylesheet" href="/publico/fontes/fontes.css">
<link rel="stylesheet" href="/publico/minha-conta.css?v=2.88">
<link rel="stylesheet" href="/publico/minha-conta.css?v=2.90">
</head>
<body>
@@ -1765,23 +1779,56 @@ data:
</section>
<section id="conteudo" class="oculto">
<!-- N16: a visao geral das escolinhas DESTE comprador, lado a lado e somada.
So numeros agregados, que cada escolinha envia uma vez por dia.
Fica oculta enquanto nenhuma escolinha tiver mandado o resumo. -->
<section id="visao" class="cartao visao oculto" aria-labelledby="visaoTitulo">
<h2 id="visaoTitulo">Vis&atilde;o <span class="hl">geral</span></h2>
<p id="visaoSub" class="ajuda"></p>
<div id="visaoTabela" class="visao-tabela"></div>
</section>
<!-- Abas (2026-09-29, pedido do dono): a pagina empilhava visao geral, Termos,
escolas ativas e canceladas numa coluna so. Mesmo padrao do painel do dono. -->
<nav class="abas" role="tablist" aria-label="Se&ccedil;&otilde;es da conta">
<button type="button" class="aba ativa" data-aba="escolas" role="tab">Minhas escolas</button>
<button type="button" class="aba" data-aba="visao" role="tab">Vis&atilde;o geral</button>
<button type="button" class="aba" data-aba="termos" role="tab">Termos de Uso <span id="termosBadge" class="badge oculto"></span></button>
<button type="button" class="aba oculto" data-aba="canceladas" role="tab" id="abaCanceladas">Canceladas</button>
</nav>
<div id="produtos" class="produtos"></div>
<div id="aba-escolas" class="painel-aba">
<div id="produtos" class="produtos"></div>
<div id="nenhum" class="cartao oculto">
<h2>Nenhum produto ainda</h2>
<p class="ajuda">
Se voc&ecirc; acabou de pagar, a conta pode estar sendo criada &mdash; isso leva
alguns minutos. Se j&aacute; faz mais tempo, fale com a gente.
</p>
<div id="nenhum" class="cartao oculto">
<h2>Nenhum produto ainda</h2>
<p class="ajuda">
Se voc&ecirc; acabou de pagar, a conta pode estar sendo criada &mdash; isso leva
alguns minutos. Se j&aacute; faz mais tempo, fale com a gente.
</p>
</div>
</div>
<div id="aba-visao" class="painel-aba oculto">
<!-- N16: a visao geral das escolinhas DESTE comprador, lado a lado e somada.
So numeros agregados, que cada escolinha envia uma vez por dia.
Fica oculta enquanto nenhuma escolinha tiver mandado o resumo. -->
<section id="visao" class="cartao visao oculto" aria-labelledby="visaoTitulo">
<h2 id="visaoTitulo">Vis&atilde;o <span class="hl">geral</span></h2>
<p id="visaoSub" class="ajuda"></p>
<div id="visaoTabela" class="visao-tabela"></div>
</section>
<div id="visaoVazia" class="cartao">
<h2>Vis&atilde;o <span class="hl">geral</span></h2>
<p class="ajuda">Os n&uacute;meros aparecem aqui quando as suas escolinhas enviarem o primeiro resumo
(uma vez por dia, de madrugada).</p>
</div>
</div>
<div id="aba-termos" class="painel-aba oculto">
<div id="termosDeUso"></div>
<div id="termosEmDia" class="cartao oculto">
<h2>Termos de Uso</h2>
<p class="ajuda">Nada pendente: a vers&atilde;o vigente j&aacute; foi aceita para todas as suas escolinhas.
<a href="/termos" target="_blank" rel="noopener">Ler os Termos de Uso</a>.</p>
</div>
</div>
<div id="aba-canceladas" class="painel-aba oculto">
<p class="ajuda">Assinaturas canceladas. Regularize o pagamento para voltar a entrar; os dados ficam
guardados por 30 dias depois do cancelamento.</p>
<div id="produtosCancelados" class="produtos"></div>
</div>
<p class="rodape">
@@ -1801,7 +1848,7 @@ data:
<footer class="direitos">&copy; 2026 Athletic Map. Todos os direitos reservados.</footer>
<script src="/publico/minha-conta.js?v=2.89"></script>
<script src="/publico/minha-conta.js?v=2.90"></script>
</body>
</html>
@@ -1870,6 +1917,36 @@ data:
var erroTexto = document.getElementById("erroTexto");
var botaoSair = document.getElementById("sair");
/* ── ABAS (2026-09-29) ────────────────────────────────────────────────────────
* Minhas escolas | Visao geral | Termos de Uso | Canceladas. A ultima aba aberta
* fica no localStorage (conveniencia deste navegador; sem ela, "escolas"). */
var ABA_CHAVE = "atm.conta.aba";
function abrirAba(nome) {
var botao = document.querySelector('.aba[data-aba="' + nome + '"]');
if (!botao || botao.classList.contains("oculto")) { nome = "escolas"; botao = document.querySelector('.aba[data-aba="escolas"]'); }
if (!botao) return;
document.querySelectorAll(".aba").forEach(function (b) { b.classList.toggle("ativa", b === botao); });
document.querySelectorAll(".painel-aba").forEach(function (painel) {
painel.classList.toggle("oculto", painel.id !== "aba-" + nome);
});
try { localStorage.setItem(ABA_CHAVE, nome); } catch (e) { /* aba privada */ }
}
function abaLembrada() { try { return localStorage.getItem(ABA_CHAVE) || "escolas"; } catch (e) { return "escolas"; } }
/* Marca a aba: `pendente` acende a bolinha; `quantos` escreve o numero. */
function marcarAba(nome, pendente, quantos) {
var botao = document.querySelector('.aba[data-aba="' + nome + '"]');
if (!botao) return;
var badge = botao.querySelector(".badge");
if (badge) {
badge.classList.toggle("oculto", !pendente && !quantos);
badge.classList.toggle("num", !!quantos);
badge.textContent = quantos ? String(quantos) : "";
}
}
document.querySelectorAll(".aba").forEach(function (b) {
b.addEventListener("click", function () { abrirAba(b.getAttribute("data-aba")); });
});
function mostrar(qual) {
[porta, carregando, conteudo, caixaErro].forEach(function (s) {
if (s) s.classList.add("oculto");
@@ -2018,9 +2095,19 @@ data:
.then(function (lista) {
enderecos = {};
(lista || []).forEach(function (p) { if (p.tenant) enderecos[p.tenant] = p.endereco; });
produtos.innerHTML = (lista || []).map(cartao).join("");
nenhum.classList.toggle("oculto", (lista || []).length > 0);
var ativas = (lista || []).filter(function (p) { return p.situacao !== "CANCELADA"; });
var canceladas = (lista || []).filter(function (p) { return p.situacao === "CANCELADA"; });
produtos.innerHTML = ativas.map(cartao).join("");
var caixaCanceladas = document.getElementById("produtosCancelados");
if (caixaCanceladas) caixaCanceladas.innerHTML = canceladas.map(cartao).join("");
var abaCanceladas = document.getElementById("abaCanceladas");
if (abaCanceladas) {
abaCanceladas.classList.toggle("oculto", canceladas.length === 0);
abaCanceladas.textContent = "Canceladas" + (canceladas.length ? " (" + canceladas.length + ")" : "");
}
nenhum.classList.toggle("oculto", ativas.length > 0);
mostrar(conteudo);
abrirAba(abaLembrada());
(lista || []).forEach(function (p) {
if (p.tenant && p.situacao === "ATIVA" && !p.demonstracao) acrescentarBotaoDePlano(p.tenant);
});
@@ -2329,8 +2416,10 @@ data:
.then(function (d) {
var velho = document.getElementById("avisoTermos");
if (velho) velho.parentNode.removeChild(velho);
if (!d || !d.versao || !d.escolinhas) return;
var faltam = d.escolinhas.filter(function (e) { return !e.aceito; });
var emDia = document.getElementById("termosEmDia");
var faltam = (d && d.versao && d.escolinhas) ? d.escolinhas.filter(function (e) { return !e.aceito; }) : [];
if (emDia) emDia.classList.toggle("oculto", faltam.length > 0);
marcarAba("termos", faltam.length > 0);
if (!faltam.length) return;
var aviso = document.createElement("section");
aviso.id = "avisoTermos";
@@ -2341,7 +2430,8 @@ data:
+ ". Voc&ecirc; continua usando o sistema, vendo faturas e dados normalmente; s&oacute; trocar de plano"
+ " e comprar m&oacute;dulos pedem o aceite.</p>"
+ caixaDeAceite(d.versao, "Aceitar");
produtos.parentNode.insertBefore(aviso, produtos);
var caixaTermos = document.getElementById("termosDeUso");
if (caixaTermos) caixaTermos.appendChild(aviso); else produtos.parentNode.insertBefore(aviso, produtos);
aviso.querySelector("button").addEventListener("click", function () {
aceitarTermosDeUso(aviso, d.versao);
});
@@ -2594,7 +2684,9 @@ data:
.then(function (r) { return r.ok ? r.json() : null; })
.then(function (d) {
var tabela = d ? blocoDaVisao(d) : null;
if (!tabela) { caixa.classList.add("oculto"); return; }
var vazia = document.getElementById("visaoVazia");
if (!tabela) { caixa.classList.add("oculto"); if (vazia) vazia.classList.remove("oculto"); return; }
if (vazia) vazia.classList.add("oculto");
var semDados = (d.escolas || []).filter(function (e) { return !e.temDados; }).length;
document.getElementById("visaoSub").innerHTML = "N&uacute;meros de " + nomeDoMes(d.competencia)
+ ". S&oacute; totais &mdash; nenhum dado de aluno sai da escolinha. Atualizados uma vez por dia.";
+115 -23
View File
@@ -1698,6 +1698,20 @@ data:
.termos-uso-caixa input { margin-right: 6px; }
.termos-uso-aceite { margin: 10px 0; }
/* ── Abas (2026-09-29) — mesmo desenho do painel do dono ───────────────────── */
.abas { display: flex; gap: 4px; border-bottom: 1px solid var(--line); margin: 4px 0 18px; overflow-x: auto; }
.aba {
background: none; border: 0; border-bottom: 3px solid transparent; padding: 10px 16px;
font: inherit; font-weight: 600; color: var(--muted); cursor: pointer; white-space: nowrap;
}
.aba:hover { color: var(--navy); }
.aba.ativa { color: var(--navy); border-bottom-color: var(--orange); }
.aba .badge {
display: inline-block; min-width: 8px; height: 8px; margin-left: 6px; border-radius: 999px;
background: var(--orange); vertical-align: middle;
}
.aba .badge.num { min-width: 18px; height: auto; padding: 0 6px; font-size: 12px; color: #fff; line-height: 18px; }
minha-conta.html: |
<!DOCTYPE html>
<html lang="pt-BR">
@@ -1722,7 +1736,7 @@ data:
numero a cada publicacao que mexa nesses arquivos.
-->
<link rel="stylesheet" href="/publico/fontes/fontes.css">
<link rel="stylesheet" href="/publico/minha-conta.css?v=2.88">
<link rel="stylesheet" href="/publico/minha-conta.css?v=2.90">
</head>
<body>
@@ -1765,23 +1779,56 @@ data:
</section>
<section id="conteudo" class="oculto">
<!-- N16: a visao geral das escolinhas DESTE comprador, lado a lado e somada.
So numeros agregados, que cada escolinha envia uma vez por dia.
Fica oculta enquanto nenhuma escolinha tiver mandado o resumo. -->
<section id="visao" class="cartao visao oculto" aria-labelledby="visaoTitulo">
<h2 id="visaoTitulo">Vis&atilde;o <span class="hl">geral</span></h2>
<p id="visaoSub" class="ajuda"></p>
<div id="visaoTabela" class="visao-tabela"></div>
</section>
<!-- Abas (2026-09-29, pedido do dono): a pagina empilhava visao geral, Termos,
escolas ativas e canceladas numa coluna so. Mesmo padrao do painel do dono. -->
<nav class="abas" role="tablist" aria-label="Se&ccedil;&otilde;es da conta">
<button type="button" class="aba ativa" data-aba="escolas" role="tab">Minhas escolas</button>
<button type="button" class="aba" data-aba="visao" role="tab">Vis&atilde;o geral</button>
<button type="button" class="aba" data-aba="termos" role="tab">Termos de Uso <span id="termosBadge" class="badge oculto"></span></button>
<button type="button" class="aba oculto" data-aba="canceladas" role="tab" id="abaCanceladas">Canceladas</button>
</nav>
<div id="produtos" class="produtos"></div>
<div id="aba-escolas" class="painel-aba">
<div id="produtos" class="produtos"></div>
<div id="nenhum" class="cartao oculto">
<h2>Nenhum produto ainda</h2>
<p class="ajuda">
Se voc&ecirc; acabou de pagar, a conta pode estar sendo criada &mdash; isso leva
alguns minutos. Se j&aacute; faz mais tempo, fale com a gente.
</p>
<div id="nenhum" class="cartao oculto">
<h2>Nenhum produto ainda</h2>
<p class="ajuda">
Se voc&ecirc; acabou de pagar, a conta pode estar sendo criada &mdash; isso leva
alguns minutos. Se j&aacute; faz mais tempo, fale com a gente.
</p>
</div>
</div>
<div id="aba-visao" class="painel-aba oculto">
<!-- N16: a visao geral das escolinhas DESTE comprador, lado a lado e somada.
So numeros agregados, que cada escolinha envia uma vez por dia.
Fica oculta enquanto nenhuma escolinha tiver mandado o resumo. -->
<section id="visao" class="cartao visao oculto" aria-labelledby="visaoTitulo">
<h2 id="visaoTitulo">Vis&atilde;o <span class="hl">geral</span></h2>
<p id="visaoSub" class="ajuda"></p>
<div id="visaoTabela" class="visao-tabela"></div>
</section>
<div id="visaoVazia" class="cartao">
<h2>Vis&atilde;o <span class="hl">geral</span></h2>
<p class="ajuda">Os n&uacute;meros aparecem aqui quando as suas escolinhas enviarem o primeiro resumo
(uma vez por dia, de madrugada).</p>
</div>
</div>
<div id="aba-termos" class="painel-aba oculto">
<div id="termosDeUso"></div>
<div id="termosEmDia" class="cartao oculto">
<h2>Termos de Uso</h2>
<p class="ajuda">Nada pendente: a vers&atilde;o vigente j&aacute; foi aceita para todas as suas escolinhas.
<a href="/termos" target="_blank" rel="noopener">Ler os Termos de Uso</a>.</p>
</div>
</div>
<div id="aba-canceladas" class="painel-aba oculto">
<p class="ajuda">Assinaturas canceladas. Regularize o pagamento para voltar a entrar; os dados ficam
guardados por 30 dias depois do cancelamento.</p>
<div id="produtosCancelados" class="produtos"></div>
</div>
<p class="rodape">
@@ -1801,7 +1848,7 @@ data:
<footer class="direitos">&copy; 2026 Athletic Map. Todos os direitos reservados.</footer>
<script src="/publico/minha-conta.js?v=2.89"></script>
<script src="/publico/minha-conta.js?v=2.90"></script>
</body>
</html>
@@ -1870,6 +1917,36 @@ data:
var erroTexto = document.getElementById("erroTexto");
var botaoSair = document.getElementById("sair");
/* ── ABAS (2026-09-29) ────────────────────────────────────────────────────────
* Minhas escolas | Visao geral | Termos de Uso | Canceladas. A ultima aba aberta
* fica no localStorage (conveniencia deste navegador; sem ela, "escolas"). */
var ABA_CHAVE = "atm.conta.aba";
function abrirAba(nome) {
var botao = document.querySelector('.aba[data-aba="' + nome + '"]');
if (!botao || botao.classList.contains("oculto")) { nome = "escolas"; botao = document.querySelector('.aba[data-aba="escolas"]'); }
if (!botao) return;
document.querySelectorAll(".aba").forEach(function (b) { b.classList.toggle("ativa", b === botao); });
document.querySelectorAll(".painel-aba").forEach(function (painel) {
painel.classList.toggle("oculto", painel.id !== "aba-" + nome);
});
try { localStorage.setItem(ABA_CHAVE, nome); } catch (e) { /* aba privada */ }
}
function abaLembrada() { try { return localStorage.getItem(ABA_CHAVE) || "escolas"; } catch (e) { return "escolas"; } }
/* Marca a aba: `pendente` acende a bolinha; `quantos` escreve o numero. */
function marcarAba(nome, pendente, quantos) {
var botao = document.querySelector('.aba[data-aba="' + nome + '"]');
if (!botao) return;
var badge = botao.querySelector(".badge");
if (badge) {
badge.classList.toggle("oculto", !pendente && !quantos);
badge.classList.toggle("num", !!quantos);
badge.textContent = quantos ? String(quantos) : "";
}
}
document.querySelectorAll(".aba").forEach(function (b) {
b.addEventListener("click", function () { abrirAba(b.getAttribute("data-aba")); });
});
function mostrar(qual) {
[porta, carregando, conteudo, caixaErro].forEach(function (s) {
if (s) s.classList.add("oculto");
@@ -2018,9 +2095,19 @@ data:
.then(function (lista) {
enderecos = {};
(lista || []).forEach(function (p) { if (p.tenant) enderecos[p.tenant] = p.endereco; });
produtos.innerHTML = (lista || []).map(cartao).join("");
nenhum.classList.toggle("oculto", (lista || []).length > 0);
var ativas = (lista || []).filter(function (p) { return p.situacao !== "CANCELADA"; });
var canceladas = (lista || []).filter(function (p) { return p.situacao === "CANCELADA"; });
produtos.innerHTML = ativas.map(cartao).join("");
var caixaCanceladas = document.getElementById("produtosCancelados");
if (caixaCanceladas) caixaCanceladas.innerHTML = canceladas.map(cartao).join("");
var abaCanceladas = document.getElementById("abaCanceladas");
if (abaCanceladas) {
abaCanceladas.classList.toggle("oculto", canceladas.length === 0);
abaCanceladas.textContent = "Canceladas" + (canceladas.length ? " (" + canceladas.length + ")" : "");
}
nenhum.classList.toggle("oculto", ativas.length > 0);
mostrar(conteudo);
abrirAba(abaLembrada());
(lista || []).forEach(function (p) {
if (p.tenant && p.situacao === "ATIVA" && !p.demonstracao) acrescentarBotaoDePlano(p.tenant);
});
@@ -2329,8 +2416,10 @@ data:
.then(function (d) {
var velho = document.getElementById("avisoTermos");
if (velho) velho.parentNode.removeChild(velho);
if (!d || !d.versao || !d.escolinhas) return;
var faltam = d.escolinhas.filter(function (e) { return !e.aceito; });
var emDia = document.getElementById("termosEmDia");
var faltam = (d && d.versao && d.escolinhas) ? d.escolinhas.filter(function (e) { return !e.aceito; }) : [];
if (emDia) emDia.classList.toggle("oculto", faltam.length > 0);
marcarAba("termos", faltam.length > 0);
if (!faltam.length) return;
var aviso = document.createElement("section");
aviso.id = "avisoTermos";
@@ -2341,7 +2430,8 @@ data:
+ ". Voc&ecirc; continua usando o sistema, vendo faturas e dados normalmente; s&oacute; trocar de plano"
+ " e comprar m&oacute;dulos pedem o aceite.</p>"
+ caixaDeAceite(d.versao, "Aceitar");
produtos.parentNode.insertBefore(aviso, produtos);
var caixaTermos = document.getElementById("termosDeUso");
if (caixaTermos) caixaTermos.appendChild(aviso); else produtos.parentNode.insertBefore(aviso, produtos);
aviso.querySelector("button").addEventListener("click", function () {
aceitarTermosDeUso(aviso, d.versao);
});
@@ -2594,7 +2684,9 @@ data:
.then(function (r) { return r.ok ? r.json() : null; })
.then(function (d) {
var tabela = d ? blocoDaVisao(d) : null;
if (!tabela) { caixa.classList.add("oculto"); return; }
var vazia = document.getElementById("visaoVazia");
if (!tabela) { caixa.classList.add("oculto"); if (vazia) vazia.classList.remove("oculto"); return; }
if (vazia) vazia.classList.add("oculto");
var semDados = (d.escolas || []).filter(function (e) { return !e.temDados; }).length;
document.getElementById("visaoSub").innerHTML = "N&uacute;meros de " + nomeDoMes(d.competencia)
+ ". S&oacute; totais &mdash; nenhum dado de aluno sai da escolinha. Atualizados uma vez por dia.";