chore(tenants): conteudo de publico/ atualizado

This commit is contained in:
deploy
2026-10-13 17:27:44 +00:00
parent 7fdf3d28ef
commit c979d59041
10 changed files with 750 additions and 0 deletions
@@ -5787,6 +5787,7 @@ data:
<button type="button" class="aba" data-aba="atividade" role="tab">Atividade</button>
<button type="button" class="aba" data-aba="termo" role="tab">Termo de dados</button>
<button type="button" class="aba" data-aba="termosdeuso" role="tab">Termos de Uso</button>
<button type="button" class="aba" data-aba="titulares" role="tab">Pedidos de titulares</button>
<button type="button" class="aba" data-aba="catalogo" role="tab">Produtos e pre&ccedil;os</button>
</nav>
@@ -5941,6 +5942,25 @@ data:
</div>
</section>
<!-- PEDIDOS DE TITULARES (LGPD): quem pediu exclusao/acesso/correcao na pagina /excluir-conta -->
<section id="aba-titulares" class="painel-aba oculto">
<div class="cartao">
<h2>Pedidos de titulares de dados</h2>
<p class="ajuda">
Pedidos feitos na p&aacute;gina p&uacute;blica <b>/excluir-conta</b> (excluir conta e dados, acessar, corrigir).
A escola &eacute; a controladora: encaminhe o pedido a ela, marque <b>Encaminhado</b> e, quando a escola
responder ao titular, <b>Conclu&iacute;do</b>. Prazo para responder: <b>15 dias</b>. Cada pedido tamb&eacute;m
chega por e-mail em suporte@athleticmap.com.
</p>
<div class="tabela-rolagem">
<table class="tabela"><thead><tr><th>Recebido</th><th>Pedido</th><th>Quem</th><th>Escola</th><th>Mensagem</th><th>Situa&ccedil;&atilde;o</th></tr></thead>
<tbody id="titularesLinhas"><tr><td colspan="6" class="ajuda">Abra esta aba para carregar.</td></tr></tbody>
</table>
</div>
<p id="titularesErro" class="erro oculto"></p>
</div>
</section>
<!-- TERMO DE DADOS: o que autoriza ler o uso de dentro de cada sistema -->
<section id="aba-termo" class="painel-aba oculto">
<div class="cartao">
@@ -6058,6 +6078,7 @@ data:
var API_TERMO = "/api/plataforma/painel/termo-de-dados";
var API_CATALOGO = "/api/plataforma/painel/catalogo";
var API_TERMOS_DE_USO = "/api/plataforma/painel/termos-de-uso";
var API_TITULARES = "/api/plataforma/painel/pedidos-do-titular";
var INTERVALO_SINO_MS = 60000;
var OIDC = {
@@ -7108,6 +7129,59 @@ data:
+ "</td></tr>";
}
/* ── pedidos de titulares de dados (LGPD) ─────────────────────────── */
var ROTULO_PEDIDO = { EXCLUSAO: "Excluir conta e dados", ACESSO: "Acessar dados", CORRECAO: "Corrigir dados", OUTRO: "Outro" };
var SITUACOES_PEDIDO = [["RECEBIDO", "Recebido"], ["ENCAMINHADO", "Encaminhado à escola"], ["CONCLUIDO", "Concluído"]];
function linhaDoPedido(p) {
var opcoes = SITUACOES_PEDIDO.map(function (s) {
return '<option value="' + s[0] + '"' + (s[0] === p.situacao ? " selected" : "") + ">" + s[1] + "</option>";
}).join("");
return '<tr><td>' + esc(ha(p.recebidoEm)) + "</td><td>" + esc(ROTULO_PEDIDO[p.tipo] || p.tipo) + "</td><td>" + esc(p.nome)
+ '<br><span class="ajuda">' + esc(p.email) + "</span></td><td>" + esc(p.escola || "—") + "</td><td>"
+ esc(p.mensagem || "—") + '</td><td><select data-pedido="' + esc(p.id) + '">' + opcoes + "</select></td></tr>";
}
function carregarTitulares() {
if (!cred) return Promise.resolve();
var corpo = $("titularesLinhas"), erro = $("titularesErro");
erro.classList.add("oculto");
return pedir(API_TITULARES)
.then(function (r) { if (!r.ok) throw new Error("HTTP " + r.status); return r.json(); })
.then(function (lista) {
corpo.innerHTML = (lista || []).map(linhaDoPedido).join("")
|| '<tr><td colspan="6" class="ajuda">Nenhum pedido até agora.</td></tr>';
})
.catch(function (e) {
corpo.innerHTML = '<tr><td colspan="6" class="ajuda">Não consegui carregar: ' + esc(e.message) + "</td></tr>";
});
}
function mudarSituacaoDoPedido(sel) {
var erro = $("titularesErro");
erro.classList.add("oculto");
return pedir(API_TITULARES + "/" + encodeURIComponent(sel.getAttribute("data-pedido")) + "/situacao", {
method: "POST",
headers: { "Content-Type": "application/json" },
body: JSON.stringify({ situacao: sel.value })
}).then(function (r) {
if (!r.ok) throw new Error("HTTP " + r.status);
}).catch(function (e) {
erro.textContent = "Não consegui mudar a situação: " + e.message;
erro.classList.remove("oculto");
return carregarTitulares();
});
}
/* Delegado na tabela (e nao no document): o elemento morre com a pagina, o ouvinte do document ficaria. */
if ($("titularesLinhas")) {
$("titularesLinhas").addEventListener("change", function (ev) {
var t = ev.target;
if (t && t.tagName === "SELECT" && t.hasAttribute("data-pedido")) mudarSituacaoDoPedido(t);
});
}
function carregarTermosDeUso() {
if (!cred) return Promise.resolve();
return pedir(API_TERMOS_DE_USO)
@@ -7253,6 +7327,7 @@ data:
});
if (b.getAttribute("data-aba") === "termo") carregarTermo();
if (b.getAttribute("data-aba") === "termosdeuso") carregarTermosDeUso();
if (b.getAttribute("data-aba") === "titulares") carregarTitulares();
if (b.getAttribute("data-aba") === "catalogo") carregarCatalogo();
});
});
+75
View File
@@ -5787,6 +5787,7 @@ data:
<button type="button" class="aba" data-aba="atividade" role="tab">Atividade</button>
<button type="button" class="aba" data-aba="termo" role="tab">Termo de dados</button>
<button type="button" class="aba" data-aba="termosdeuso" role="tab">Termos de Uso</button>
<button type="button" class="aba" data-aba="titulares" role="tab">Pedidos de titulares</button>
<button type="button" class="aba" data-aba="catalogo" role="tab">Produtos e pre&ccedil;os</button>
</nav>
@@ -5941,6 +5942,25 @@ data:
</div>
</section>
<!-- PEDIDOS DE TITULARES (LGPD): quem pediu exclusao/acesso/correcao na pagina /excluir-conta -->
<section id="aba-titulares" class="painel-aba oculto">
<div class="cartao">
<h2>Pedidos de titulares de dados</h2>
<p class="ajuda">
Pedidos feitos na p&aacute;gina p&uacute;blica <b>/excluir-conta</b> (excluir conta e dados, acessar, corrigir).
A escola &eacute; a controladora: encaminhe o pedido a ela, marque <b>Encaminhado</b> e, quando a escola
responder ao titular, <b>Conclu&iacute;do</b>. Prazo para responder: <b>15 dias</b>. Cada pedido tamb&eacute;m
chega por e-mail em suporte@athleticmap.com.
</p>
<div class="tabela-rolagem">
<table class="tabela"><thead><tr><th>Recebido</th><th>Pedido</th><th>Quem</th><th>Escola</th><th>Mensagem</th><th>Situa&ccedil;&atilde;o</th></tr></thead>
<tbody id="titularesLinhas"><tr><td colspan="6" class="ajuda">Abra esta aba para carregar.</td></tr></tbody>
</table>
</div>
<p id="titularesErro" class="erro oculto"></p>
</div>
</section>
<!-- TERMO DE DADOS: o que autoriza ler o uso de dentro de cada sistema -->
<section id="aba-termo" class="painel-aba oculto">
<div class="cartao">
@@ -6058,6 +6078,7 @@ data:
var API_TERMO = "/api/plataforma/painel/termo-de-dados";
var API_CATALOGO = "/api/plataforma/painel/catalogo";
var API_TERMOS_DE_USO = "/api/plataforma/painel/termos-de-uso";
var API_TITULARES = "/api/plataforma/painel/pedidos-do-titular";
var INTERVALO_SINO_MS = 60000;
var OIDC = {
@@ -7108,6 +7129,59 @@ data:
+ "</td></tr>";
}
/* ── pedidos de titulares de dados (LGPD) ─────────────────────────── */
var ROTULO_PEDIDO = { EXCLUSAO: "Excluir conta e dados", ACESSO: "Acessar dados", CORRECAO: "Corrigir dados", OUTRO: "Outro" };
var SITUACOES_PEDIDO = [["RECEBIDO", "Recebido"], ["ENCAMINHADO", "Encaminhado à escola"], ["CONCLUIDO", "Concluído"]];
function linhaDoPedido(p) {
var opcoes = SITUACOES_PEDIDO.map(function (s) {
return '<option value="' + s[0] + '"' + (s[0] === p.situacao ? " selected" : "") + ">" + s[1] + "</option>";
}).join("");
return '<tr><td>' + esc(ha(p.recebidoEm)) + "</td><td>" + esc(ROTULO_PEDIDO[p.tipo] || p.tipo) + "</td><td>" + esc(p.nome)
+ '<br><span class="ajuda">' + esc(p.email) + "</span></td><td>" + esc(p.escola || "—") + "</td><td>"
+ esc(p.mensagem || "—") + '</td><td><select data-pedido="' + esc(p.id) + '">' + opcoes + "</select></td></tr>";
}
function carregarTitulares() {
if (!cred) return Promise.resolve();
var corpo = $("titularesLinhas"), erro = $("titularesErro");
erro.classList.add("oculto");
return pedir(API_TITULARES)
.then(function (r) { if (!r.ok) throw new Error("HTTP " + r.status); return r.json(); })
.then(function (lista) {
corpo.innerHTML = (lista || []).map(linhaDoPedido).join("")
|| '<tr><td colspan="6" class="ajuda">Nenhum pedido até agora.</td></tr>';
})
.catch(function (e) {
corpo.innerHTML = '<tr><td colspan="6" class="ajuda">Não consegui carregar: ' + esc(e.message) + "</td></tr>";
});
}
function mudarSituacaoDoPedido(sel) {
var erro = $("titularesErro");
erro.classList.add("oculto");
return pedir(API_TITULARES + "/" + encodeURIComponent(sel.getAttribute("data-pedido")) + "/situacao", {
method: "POST",
headers: { "Content-Type": "application/json" },
body: JSON.stringify({ situacao: sel.value })
}).then(function (r) {
if (!r.ok) throw new Error("HTTP " + r.status);
}).catch(function (e) {
erro.textContent = "Não consegui mudar a situação: " + e.message;
erro.classList.remove("oculto");
return carregarTitulares();
});
}
/* Delegado na tabela (e nao no document): o elemento morre com a pagina, o ouvinte do document ficaria. */
if ($("titularesLinhas")) {
$("titularesLinhas").addEventListener("change", function (ev) {
var t = ev.target;
if (t && t.tagName === "SELECT" && t.hasAttribute("data-pedido")) mudarSituacaoDoPedido(t);
});
}
function carregarTermosDeUso() {
if (!cred) return Promise.resolve();
return pedir(API_TERMOS_DE_USO)
@@ -7253,6 +7327,7 @@ data:
});
if (b.getAttribute("data-aba") === "termo") carregarTermo();
if (b.getAttribute("data-aba") === "termosdeuso") carregarTermosDeUso();
if (b.getAttribute("data-aba") === "titulares") carregarTitulares();
if (b.getAttribute("data-aba") === "catalogo") carregarCatalogo();
});
});
+75
View File
@@ -5787,6 +5787,7 @@ data:
<button type="button" class="aba" data-aba="atividade" role="tab">Atividade</button>
<button type="button" class="aba" data-aba="termo" role="tab">Termo de dados</button>
<button type="button" class="aba" data-aba="termosdeuso" role="tab">Termos de Uso</button>
<button type="button" class="aba" data-aba="titulares" role="tab">Pedidos de titulares</button>
<button type="button" class="aba" data-aba="catalogo" role="tab">Produtos e pre&ccedil;os</button>
</nav>
@@ -5941,6 +5942,25 @@ data:
</div>
</section>
<!-- PEDIDOS DE TITULARES (LGPD): quem pediu exclusao/acesso/correcao na pagina /excluir-conta -->
<section id="aba-titulares" class="painel-aba oculto">
<div class="cartao">
<h2>Pedidos de titulares de dados</h2>
<p class="ajuda">
Pedidos feitos na p&aacute;gina p&uacute;blica <b>/excluir-conta</b> (excluir conta e dados, acessar, corrigir).
A escola &eacute; a controladora: encaminhe o pedido a ela, marque <b>Encaminhado</b> e, quando a escola
responder ao titular, <b>Conclu&iacute;do</b>. Prazo para responder: <b>15 dias</b>. Cada pedido tamb&eacute;m
chega por e-mail em suporte@athleticmap.com.
</p>
<div class="tabela-rolagem">
<table class="tabela"><thead><tr><th>Recebido</th><th>Pedido</th><th>Quem</th><th>Escola</th><th>Mensagem</th><th>Situa&ccedil;&atilde;o</th></tr></thead>
<tbody id="titularesLinhas"><tr><td colspan="6" class="ajuda">Abra esta aba para carregar.</td></tr></tbody>
</table>
</div>
<p id="titularesErro" class="erro oculto"></p>
</div>
</section>
<!-- TERMO DE DADOS: o que autoriza ler o uso de dentro de cada sistema -->
<section id="aba-termo" class="painel-aba oculto">
<div class="cartao">
@@ -6058,6 +6078,7 @@ data:
var API_TERMO = "/api/plataforma/painel/termo-de-dados";
var API_CATALOGO = "/api/plataforma/painel/catalogo";
var API_TERMOS_DE_USO = "/api/plataforma/painel/termos-de-uso";
var API_TITULARES = "/api/plataforma/painel/pedidos-do-titular";
var INTERVALO_SINO_MS = 60000;
var OIDC = {
@@ -7108,6 +7129,59 @@ data:
+ "</td></tr>";
}
/* ── pedidos de titulares de dados (LGPD) ─────────────────────────── */
var ROTULO_PEDIDO = { EXCLUSAO: "Excluir conta e dados", ACESSO: "Acessar dados", CORRECAO: "Corrigir dados", OUTRO: "Outro" };
var SITUACOES_PEDIDO = [["RECEBIDO", "Recebido"], ["ENCAMINHADO", "Encaminhado à escola"], ["CONCLUIDO", "Concluído"]];
function linhaDoPedido(p) {
var opcoes = SITUACOES_PEDIDO.map(function (s) {
return '<option value="' + s[0] + '"' + (s[0] === p.situacao ? " selected" : "") + ">" + s[1] + "</option>";
}).join("");
return '<tr><td>' + esc(ha(p.recebidoEm)) + "</td><td>" + esc(ROTULO_PEDIDO[p.tipo] || p.tipo) + "</td><td>" + esc(p.nome)
+ '<br><span class="ajuda">' + esc(p.email) + "</span></td><td>" + esc(p.escola || "—") + "</td><td>"
+ esc(p.mensagem || "—") + '</td><td><select data-pedido="' + esc(p.id) + '">' + opcoes + "</select></td></tr>";
}
function carregarTitulares() {
if (!cred) return Promise.resolve();
var corpo = $("titularesLinhas"), erro = $("titularesErro");
erro.classList.add("oculto");
return pedir(API_TITULARES)
.then(function (r) { if (!r.ok) throw new Error("HTTP " + r.status); return r.json(); })
.then(function (lista) {
corpo.innerHTML = (lista || []).map(linhaDoPedido).join("")
|| '<tr><td colspan="6" class="ajuda">Nenhum pedido até agora.</td></tr>';
})
.catch(function (e) {
corpo.innerHTML = '<tr><td colspan="6" class="ajuda">Não consegui carregar: ' + esc(e.message) + "</td></tr>";
});
}
function mudarSituacaoDoPedido(sel) {
var erro = $("titularesErro");
erro.classList.add("oculto");
return pedir(API_TITULARES + "/" + encodeURIComponent(sel.getAttribute("data-pedido")) + "/situacao", {
method: "POST",
headers: { "Content-Type": "application/json" },
body: JSON.stringify({ situacao: sel.value })
}).then(function (r) {
if (!r.ok) throw new Error("HTTP " + r.status);
}).catch(function (e) {
erro.textContent = "Não consegui mudar a situação: " + e.message;
erro.classList.remove("oculto");
return carregarTitulares();
});
}
/* Delegado na tabela (e nao no document): o elemento morre com a pagina, o ouvinte do document ficaria. */
if ($("titularesLinhas")) {
$("titularesLinhas").addEventListener("change", function (ev) {
var t = ev.target;
if (t && t.tagName === "SELECT" && t.hasAttribute("data-pedido")) mudarSituacaoDoPedido(t);
});
}
function carregarTermosDeUso() {
if (!cred) return Promise.resolve();
return pedir(API_TERMOS_DE_USO)
@@ -7253,6 +7327,7 @@ data:
});
if (b.getAttribute("data-aba") === "termo") carregarTermo();
if (b.getAttribute("data-aba") === "termosdeuso") carregarTermosDeUso();
if (b.getAttribute("data-aba") === "titulares") carregarTitulares();
if (b.getAttribute("data-aba") === "catalogo") carregarCatalogo();
});
});
@@ -5787,6 +5787,7 @@ data:
<button type="button" class="aba" data-aba="atividade" role="tab">Atividade</button>
<button type="button" class="aba" data-aba="termo" role="tab">Termo de dados</button>
<button type="button" class="aba" data-aba="termosdeuso" role="tab">Termos de Uso</button>
<button type="button" class="aba" data-aba="titulares" role="tab">Pedidos de titulares</button>
<button type="button" class="aba" data-aba="catalogo" role="tab">Produtos e pre&ccedil;os</button>
</nav>
@@ -5941,6 +5942,25 @@ data:
</div>
</section>
<!-- PEDIDOS DE TITULARES (LGPD): quem pediu exclusao/acesso/correcao na pagina /excluir-conta -->
<section id="aba-titulares" class="painel-aba oculto">
<div class="cartao">
<h2>Pedidos de titulares de dados</h2>
<p class="ajuda">
Pedidos feitos na p&aacute;gina p&uacute;blica <b>/excluir-conta</b> (excluir conta e dados, acessar, corrigir).
A escola &eacute; a controladora: encaminhe o pedido a ela, marque <b>Encaminhado</b> e, quando a escola
responder ao titular, <b>Conclu&iacute;do</b>. Prazo para responder: <b>15 dias</b>. Cada pedido tamb&eacute;m
chega por e-mail em suporte@athleticmap.com.
</p>
<div class="tabela-rolagem">
<table class="tabela"><thead><tr><th>Recebido</th><th>Pedido</th><th>Quem</th><th>Escola</th><th>Mensagem</th><th>Situa&ccedil;&atilde;o</th></tr></thead>
<tbody id="titularesLinhas"><tr><td colspan="6" class="ajuda">Abra esta aba para carregar.</td></tr></tbody>
</table>
</div>
<p id="titularesErro" class="erro oculto"></p>
</div>
</section>
<!-- TERMO DE DADOS: o que autoriza ler o uso de dentro de cada sistema -->
<section id="aba-termo" class="painel-aba oculto">
<div class="cartao">
@@ -6058,6 +6078,7 @@ data:
var API_TERMO = "/api/plataforma/painel/termo-de-dados";
var API_CATALOGO = "/api/plataforma/painel/catalogo";
var API_TERMOS_DE_USO = "/api/plataforma/painel/termos-de-uso";
var API_TITULARES = "/api/plataforma/painel/pedidos-do-titular";
var INTERVALO_SINO_MS = 60000;
var OIDC = {
@@ -7108,6 +7129,59 @@ data:
+ "</td></tr>";
}
/* ── pedidos de titulares de dados (LGPD) ─────────────────────────── */
var ROTULO_PEDIDO = { EXCLUSAO: "Excluir conta e dados", ACESSO: "Acessar dados", CORRECAO: "Corrigir dados", OUTRO: "Outro" };
var SITUACOES_PEDIDO = [["RECEBIDO", "Recebido"], ["ENCAMINHADO", "Encaminhado à escola"], ["CONCLUIDO", "Concluído"]];
function linhaDoPedido(p) {
var opcoes = SITUACOES_PEDIDO.map(function (s) {
return '<option value="' + s[0] + '"' + (s[0] === p.situacao ? " selected" : "") + ">" + s[1] + "</option>";
}).join("");
return '<tr><td>' + esc(ha(p.recebidoEm)) + "</td><td>" + esc(ROTULO_PEDIDO[p.tipo] || p.tipo) + "</td><td>" + esc(p.nome)
+ '<br><span class="ajuda">' + esc(p.email) + "</span></td><td>" + esc(p.escola || "—") + "</td><td>"
+ esc(p.mensagem || "—") + '</td><td><select data-pedido="' + esc(p.id) + '">' + opcoes + "</select></td></tr>";
}
function carregarTitulares() {
if (!cred) return Promise.resolve();
var corpo = $("titularesLinhas"), erro = $("titularesErro");
erro.classList.add("oculto");
return pedir(API_TITULARES)
.then(function (r) { if (!r.ok) throw new Error("HTTP " + r.status); return r.json(); })
.then(function (lista) {
corpo.innerHTML = (lista || []).map(linhaDoPedido).join("")
|| '<tr><td colspan="6" class="ajuda">Nenhum pedido até agora.</td></tr>';
})
.catch(function (e) {
corpo.innerHTML = '<tr><td colspan="6" class="ajuda">Não consegui carregar: ' + esc(e.message) + "</td></tr>";
});
}
function mudarSituacaoDoPedido(sel) {
var erro = $("titularesErro");
erro.classList.add("oculto");
return pedir(API_TITULARES + "/" + encodeURIComponent(sel.getAttribute("data-pedido")) + "/situacao", {
method: "POST",
headers: { "Content-Type": "application/json" },
body: JSON.stringify({ situacao: sel.value })
}).then(function (r) {
if (!r.ok) throw new Error("HTTP " + r.status);
}).catch(function (e) {
erro.textContent = "Não consegui mudar a situação: " + e.message;
erro.classList.remove("oculto");
return carregarTitulares();
});
}
/* Delegado na tabela (e nao no document): o elemento morre com a pagina, o ouvinte do document ficaria. */
if ($("titularesLinhas")) {
$("titularesLinhas").addEventListener("change", function (ev) {
var t = ev.target;
if (t && t.tagName === "SELECT" && t.hasAttribute("data-pedido")) mudarSituacaoDoPedido(t);
});
}
function carregarTermosDeUso() {
if (!cred) return Promise.resolve();
return pedir(API_TERMOS_DE_USO)
@@ -7253,6 +7327,7 @@ data:
});
if (b.getAttribute("data-aba") === "termo") carregarTermo();
if (b.getAttribute("data-aba") === "termosdeuso") carregarTermosDeUso();
if (b.getAttribute("data-aba") === "titulares") carregarTitulares();
if (b.getAttribute("data-aba") === "catalogo") carregarCatalogo();
});
});
@@ -5787,6 +5787,7 @@ data:
<button type="button" class="aba" data-aba="atividade" role="tab">Atividade</button>
<button type="button" class="aba" data-aba="termo" role="tab">Termo de dados</button>
<button type="button" class="aba" data-aba="termosdeuso" role="tab">Termos de Uso</button>
<button type="button" class="aba" data-aba="titulares" role="tab">Pedidos de titulares</button>
<button type="button" class="aba" data-aba="catalogo" role="tab">Produtos e pre&ccedil;os</button>
</nav>
@@ -5941,6 +5942,25 @@ data:
</div>
</section>
<!-- PEDIDOS DE TITULARES (LGPD): quem pediu exclusao/acesso/correcao na pagina /excluir-conta -->
<section id="aba-titulares" class="painel-aba oculto">
<div class="cartao">
<h2>Pedidos de titulares de dados</h2>
<p class="ajuda">
Pedidos feitos na p&aacute;gina p&uacute;blica <b>/excluir-conta</b> (excluir conta e dados, acessar, corrigir).
A escola &eacute; a controladora: encaminhe o pedido a ela, marque <b>Encaminhado</b> e, quando a escola
responder ao titular, <b>Conclu&iacute;do</b>. Prazo para responder: <b>15 dias</b>. Cada pedido tamb&eacute;m
chega por e-mail em suporte@athleticmap.com.
</p>
<div class="tabela-rolagem">
<table class="tabela"><thead><tr><th>Recebido</th><th>Pedido</th><th>Quem</th><th>Escola</th><th>Mensagem</th><th>Situa&ccedil;&atilde;o</th></tr></thead>
<tbody id="titularesLinhas"><tr><td colspan="6" class="ajuda">Abra esta aba para carregar.</td></tr></tbody>
</table>
</div>
<p id="titularesErro" class="erro oculto"></p>
</div>
</section>
<!-- TERMO DE DADOS: o que autoriza ler o uso de dentro de cada sistema -->
<section id="aba-termo" class="painel-aba oculto">
<div class="cartao">
@@ -6058,6 +6078,7 @@ data:
var API_TERMO = "/api/plataforma/painel/termo-de-dados";
var API_CATALOGO = "/api/plataforma/painel/catalogo";
var API_TERMOS_DE_USO = "/api/plataforma/painel/termos-de-uso";
var API_TITULARES = "/api/plataforma/painel/pedidos-do-titular";
var INTERVALO_SINO_MS = 60000;
var OIDC = {
@@ -7108,6 +7129,59 @@ data:
+ "</td></tr>";
}
/* ── pedidos de titulares de dados (LGPD) ─────────────────────────── */
var ROTULO_PEDIDO = { EXCLUSAO: "Excluir conta e dados", ACESSO: "Acessar dados", CORRECAO: "Corrigir dados", OUTRO: "Outro" };
var SITUACOES_PEDIDO = [["RECEBIDO", "Recebido"], ["ENCAMINHADO", "Encaminhado à escola"], ["CONCLUIDO", "Concluído"]];
function linhaDoPedido(p) {
var opcoes = SITUACOES_PEDIDO.map(function (s) {
return '<option value="' + s[0] + '"' + (s[0] === p.situacao ? " selected" : "") + ">" + s[1] + "</option>";
}).join("");
return '<tr><td>' + esc(ha(p.recebidoEm)) + "</td><td>" + esc(ROTULO_PEDIDO[p.tipo] || p.tipo) + "</td><td>" + esc(p.nome)
+ '<br><span class="ajuda">' + esc(p.email) + "</span></td><td>" + esc(p.escola || "—") + "</td><td>"
+ esc(p.mensagem || "—") + '</td><td><select data-pedido="' + esc(p.id) + '">' + opcoes + "</select></td></tr>";
}
function carregarTitulares() {
if (!cred) return Promise.resolve();
var corpo = $("titularesLinhas"), erro = $("titularesErro");
erro.classList.add("oculto");
return pedir(API_TITULARES)
.then(function (r) { if (!r.ok) throw new Error("HTTP " + r.status); return r.json(); })
.then(function (lista) {
corpo.innerHTML = (lista || []).map(linhaDoPedido).join("")
|| '<tr><td colspan="6" class="ajuda">Nenhum pedido até agora.</td></tr>';
})
.catch(function (e) {
corpo.innerHTML = '<tr><td colspan="6" class="ajuda">Não consegui carregar: ' + esc(e.message) + "</td></tr>";
});
}
function mudarSituacaoDoPedido(sel) {
var erro = $("titularesErro");
erro.classList.add("oculto");
return pedir(API_TITULARES + "/" + encodeURIComponent(sel.getAttribute("data-pedido")) + "/situacao", {
method: "POST",
headers: { "Content-Type": "application/json" },
body: JSON.stringify({ situacao: sel.value })
}).then(function (r) {
if (!r.ok) throw new Error("HTTP " + r.status);
}).catch(function (e) {
erro.textContent = "Não consegui mudar a situação: " + e.message;
erro.classList.remove("oculto");
return carregarTitulares();
});
}
/* Delegado na tabela (e nao no document): o elemento morre com a pagina, o ouvinte do document ficaria. */
if ($("titularesLinhas")) {
$("titularesLinhas").addEventListener("change", function (ev) {
var t = ev.target;
if (t && t.tagName === "SELECT" && t.hasAttribute("data-pedido")) mudarSituacaoDoPedido(t);
});
}
function carregarTermosDeUso() {
if (!cred) return Promise.resolve();
return pedir(API_TERMOS_DE_USO)
@@ -7253,6 +7327,7 @@ data:
});
if (b.getAttribute("data-aba") === "termo") carregarTermo();
if (b.getAttribute("data-aba") === "termosdeuso") carregarTermosDeUso();
if (b.getAttribute("data-aba") === "titulares") carregarTitulares();
if (b.getAttribute("data-aba") === "catalogo") carregarCatalogo();
});
});
@@ -5787,6 +5787,7 @@ data:
<button type="button" class="aba" data-aba="atividade" role="tab">Atividade</button>
<button type="button" class="aba" data-aba="termo" role="tab">Termo de dados</button>
<button type="button" class="aba" data-aba="termosdeuso" role="tab">Termos de Uso</button>
<button type="button" class="aba" data-aba="titulares" role="tab">Pedidos de titulares</button>
<button type="button" class="aba" data-aba="catalogo" role="tab">Produtos e pre&ccedil;os</button>
</nav>
@@ -5941,6 +5942,25 @@ data:
</div>
</section>
<!-- PEDIDOS DE TITULARES (LGPD): quem pediu exclusao/acesso/correcao na pagina /excluir-conta -->
<section id="aba-titulares" class="painel-aba oculto">
<div class="cartao">
<h2>Pedidos de titulares de dados</h2>
<p class="ajuda">
Pedidos feitos na p&aacute;gina p&uacute;blica <b>/excluir-conta</b> (excluir conta e dados, acessar, corrigir).
A escola &eacute; a controladora: encaminhe o pedido a ela, marque <b>Encaminhado</b> e, quando a escola
responder ao titular, <b>Conclu&iacute;do</b>. Prazo para responder: <b>15 dias</b>. Cada pedido tamb&eacute;m
chega por e-mail em suporte@athleticmap.com.
</p>
<div class="tabela-rolagem">
<table class="tabela"><thead><tr><th>Recebido</th><th>Pedido</th><th>Quem</th><th>Escola</th><th>Mensagem</th><th>Situa&ccedil;&atilde;o</th></tr></thead>
<tbody id="titularesLinhas"><tr><td colspan="6" class="ajuda">Abra esta aba para carregar.</td></tr></tbody>
</table>
</div>
<p id="titularesErro" class="erro oculto"></p>
</div>
</section>
<!-- TERMO DE DADOS: o que autoriza ler o uso de dentro de cada sistema -->
<section id="aba-termo" class="painel-aba oculto">
<div class="cartao">
@@ -6058,6 +6078,7 @@ data:
var API_TERMO = "/api/plataforma/painel/termo-de-dados";
var API_CATALOGO = "/api/plataforma/painel/catalogo";
var API_TERMOS_DE_USO = "/api/plataforma/painel/termos-de-uso";
var API_TITULARES = "/api/plataforma/painel/pedidos-do-titular";
var INTERVALO_SINO_MS = 60000;
var OIDC = {
@@ -7108,6 +7129,59 @@ data:
+ "</td></tr>";
}
/* ── pedidos de titulares de dados (LGPD) ─────────────────────────── */
var ROTULO_PEDIDO = { EXCLUSAO: "Excluir conta e dados", ACESSO: "Acessar dados", CORRECAO: "Corrigir dados", OUTRO: "Outro" };
var SITUACOES_PEDIDO = [["RECEBIDO", "Recebido"], ["ENCAMINHADO", "Encaminhado à escola"], ["CONCLUIDO", "Concluído"]];
function linhaDoPedido(p) {
var opcoes = SITUACOES_PEDIDO.map(function (s) {
return '<option value="' + s[0] + '"' + (s[0] === p.situacao ? " selected" : "") + ">" + s[1] + "</option>";
}).join("");
return '<tr><td>' + esc(ha(p.recebidoEm)) + "</td><td>" + esc(ROTULO_PEDIDO[p.tipo] || p.tipo) + "</td><td>" + esc(p.nome)
+ '<br><span class="ajuda">' + esc(p.email) + "</span></td><td>" + esc(p.escola || "—") + "</td><td>"
+ esc(p.mensagem || "—") + '</td><td><select data-pedido="' + esc(p.id) + '">' + opcoes + "</select></td></tr>";
}
function carregarTitulares() {
if (!cred) return Promise.resolve();
var corpo = $("titularesLinhas"), erro = $("titularesErro");
erro.classList.add("oculto");
return pedir(API_TITULARES)
.then(function (r) { if (!r.ok) throw new Error("HTTP " + r.status); return r.json(); })
.then(function (lista) {
corpo.innerHTML = (lista || []).map(linhaDoPedido).join("")
|| '<tr><td colspan="6" class="ajuda">Nenhum pedido até agora.</td></tr>';
})
.catch(function (e) {
corpo.innerHTML = '<tr><td colspan="6" class="ajuda">Não consegui carregar: ' + esc(e.message) + "</td></tr>";
});
}
function mudarSituacaoDoPedido(sel) {
var erro = $("titularesErro");
erro.classList.add("oculto");
return pedir(API_TITULARES + "/" + encodeURIComponent(sel.getAttribute("data-pedido")) + "/situacao", {
method: "POST",
headers: { "Content-Type": "application/json" },
body: JSON.stringify({ situacao: sel.value })
}).then(function (r) {
if (!r.ok) throw new Error("HTTP " + r.status);
}).catch(function (e) {
erro.textContent = "Não consegui mudar a situação: " + e.message;
erro.classList.remove("oculto");
return carregarTitulares();
});
}
/* Delegado na tabela (e nao no document): o elemento morre com a pagina, o ouvinte do document ficaria. */
if ($("titularesLinhas")) {
$("titularesLinhas").addEventListener("change", function (ev) {
var t = ev.target;
if (t && t.tagName === "SELECT" && t.hasAttribute("data-pedido")) mudarSituacaoDoPedido(t);
});
}
function carregarTermosDeUso() {
if (!cred) return Promise.resolve();
return pedir(API_TERMOS_DE_USO)
@@ -7253,6 +7327,7 @@ data:
});
if (b.getAttribute("data-aba") === "termo") carregarTermo();
if (b.getAttribute("data-aba") === "termosdeuso") carregarTermosDeUso();
if (b.getAttribute("data-aba") === "titulares") carregarTitulares();
if (b.getAttribute("data-aba") === "catalogo") carregarCatalogo();
});
});
+75
View File
@@ -5787,6 +5787,7 @@ data:
<button type="button" class="aba" data-aba="atividade" role="tab">Atividade</button>
<button type="button" class="aba" data-aba="termo" role="tab">Termo de dados</button>
<button type="button" class="aba" data-aba="termosdeuso" role="tab">Termos de Uso</button>
<button type="button" class="aba" data-aba="titulares" role="tab">Pedidos de titulares</button>
<button type="button" class="aba" data-aba="catalogo" role="tab">Produtos e pre&ccedil;os</button>
</nav>
@@ -5941,6 +5942,25 @@ data:
</div>
</section>
<!-- PEDIDOS DE TITULARES (LGPD): quem pediu exclusao/acesso/correcao na pagina /excluir-conta -->
<section id="aba-titulares" class="painel-aba oculto">
<div class="cartao">
<h2>Pedidos de titulares de dados</h2>
<p class="ajuda">
Pedidos feitos na p&aacute;gina p&uacute;blica <b>/excluir-conta</b> (excluir conta e dados, acessar, corrigir).
A escola &eacute; a controladora: encaminhe o pedido a ela, marque <b>Encaminhado</b> e, quando a escola
responder ao titular, <b>Conclu&iacute;do</b>. Prazo para responder: <b>15 dias</b>. Cada pedido tamb&eacute;m
chega por e-mail em suporte@athleticmap.com.
</p>
<div class="tabela-rolagem">
<table class="tabela"><thead><tr><th>Recebido</th><th>Pedido</th><th>Quem</th><th>Escola</th><th>Mensagem</th><th>Situa&ccedil;&atilde;o</th></tr></thead>
<tbody id="titularesLinhas"><tr><td colspan="6" class="ajuda">Abra esta aba para carregar.</td></tr></tbody>
</table>
</div>
<p id="titularesErro" class="erro oculto"></p>
</div>
</section>
<!-- TERMO DE DADOS: o que autoriza ler o uso de dentro de cada sistema -->
<section id="aba-termo" class="painel-aba oculto">
<div class="cartao">
@@ -6058,6 +6078,7 @@ data:
var API_TERMO = "/api/plataforma/painel/termo-de-dados";
var API_CATALOGO = "/api/plataforma/painel/catalogo";
var API_TERMOS_DE_USO = "/api/plataforma/painel/termos-de-uso";
var API_TITULARES = "/api/plataforma/painel/pedidos-do-titular";
var INTERVALO_SINO_MS = 60000;
var OIDC = {
@@ -7108,6 +7129,59 @@ data:
+ "</td></tr>";
}
/* ── pedidos de titulares de dados (LGPD) ─────────────────────────── */
var ROTULO_PEDIDO = { EXCLUSAO: "Excluir conta e dados", ACESSO: "Acessar dados", CORRECAO: "Corrigir dados", OUTRO: "Outro" };
var SITUACOES_PEDIDO = [["RECEBIDO", "Recebido"], ["ENCAMINHADO", "Encaminhado à escola"], ["CONCLUIDO", "Concluído"]];
function linhaDoPedido(p) {
var opcoes = SITUACOES_PEDIDO.map(function (s) {
return '<option value="' + s[0] + '"' + (s[0] === p.situacao ? " selected" : "") + ">" + s[1] + "</option>";
}).join("");
return '<tr><td>' + esc(ha(p.recebidoEm)) + "</td><td>" + esc(ROTULO_PEDIDO[p.tipo] || p.tipo) + "</td><td>" + esc(p.nome)
+ '<br><span class="ajuda">' + esc(p.email) + "</span></td><td>" + esc(p.escola || "—") + "</td><td>"
+ esc(p.mensagem || "—") + '</td><td><select data-pedido="' + esc(p.id) + '">' + opcoes + "</select></td></tr>";
}
function carregarTitulares() {
if (!cred) return Promise.resolve();
var corpo = $("titularesLinhas"), erro = $("titularesErro");
erro.classList.add("oculto");
return pedir(API_TITULARES)
.then(function (r) { if (!r.ok) throw new Error("HTTP " + r.status); return r.json(); })
.then(function (lista) {
corpo.innerHTML = (lista || []).map(linhaDoPedido).join("")
|| '<tr><td colspan="6" class="ajuda">Nenhum pedido até agora.</td></tr>';
})
.catch(function (e) {
corpo.innerHTML = '<tr><td colspan="6" class="ajuda">Não consegui carregar: ' + esc(e.message) + "</td></tr>";
});
}
function mudarSituacaoDoPedido(sel) {
var erro = $("titularesErro");
erro.classList.add("oculto");
return pedir(API_TITULARES + "/" + encodeURIComponent(sel.getAttribute("data-pedido")) + "/situacao", {
method: "POST",
headers: { "Content-Type": "application/json" },
body: JSON.stringify({ situacao: sel.value })
}).then(function (r) {
if (!r.ok) throw new Error("HTTP " + r.status);
}).catch(function (e) {
erro.textContent = "Não consegui mudar a situação: " + e.message;
erro.classList.remove("oculto");
return carregarTitulares();
});
}
/* Delegado na tabela (e nao no document): o elemento morre com a pagina, o ouvinte do document ficaria. */
if ($("titularesLinhas")) {
$("titularesLinhas").addEventListener("change", function (ev) {
var t = ev.target;
if (t && t.tagName === "SELECT" && t.hasAttribute("data-pedido")) mudarSituacaoDoPedido(t);
});
}
function carregarTermosDeUso() {
if (!cred) return Promise.resolve();
return pedir(API_TERMOS_DE_USO)
@@ -7253,6 +7327,7 @@ data:
});
if (b.getAttribute("data-aba") === "termo") carregarTermo();
if (b.getAttribute("data-aba") === "termosdeuso") carregarTermosDeUso();
if (b.getAttribute("data-aba") === "titulares") carregarTitulares();
if (b.getAttribute("data-aba") === "catalogo") carregarCatalogo();
});
});
@@ -5787,6 +5787,7 @@ data:
<button type="button" class="aba" data-aba="atividade" role="tab">Atividade</button>
<button type="button" class="aba" data-aba="termo" role="tab">Termo de dados</button>
<button type="button" class="aba" data-aba="termosdeuso" role="tab">Termos de Uso</button>
<button type="button" class="aba" data-aba="titulares" role="tab">Pedidos de titulares</button>
<button type="button" class="aba" data-aba="catalogo" role="tab">Produtos e pre&ccedil;os</button>
</nav>
@@ -5941,6 +5942,25 @@ data:
</div>
</section>
<!-- PEDIDOS DE TITULARES (LGPD): quem pediu exclusao/acesso/correcao na pagina /excluir-conta -->
<section id="aba-titulares" class="painel-aba oculto">
<div class="cartao">
<h2>Pedidos de titulares de dados</h2>
<p class="ajuda">
Pedidos feitos na p&aacute;gina p&uacute;blica <b>/excluir-conta</b> (excluir conta e dados, acessar, corrigir).
A escola &eacute; a controladora: encaminhe o pedido a ela, marque <b>Encaminhado</b> e, quando a escola
responder ao titular, <b>Conclu&iacute;do</b>. Prazo para responder: <b>15 dias</b>. Cada pedido tamb&eacute;m
chega por e-mail em suporte@athleticmap.com.
</p>
<div class="tabela-rolagem">
<table class="tabela"><thead><tr><th>Recebido</th><th>Pedido</th><th>Quem</th><th>Escola</th><th>Mensagem</th><th>Situa&ccedil;&atilde;o</th></tr></thead>
<tbody id="titularesLinhas"><tr><td colspan="6" class="ajuda">Abra esta aba para carregar.</td></tr></tbody>
</table>
</div>
<p id="titularesErro" class="erro oculto"></p>
</div>
</section>
<!-- TERMO DE DADOS: o que autoriza ler o uso de dentro de cada sistema -->
<section id="aba-termo" class="painel-aba oculto">
<div class="cartao">
@@ -6058,6 +6078,7 @@ data:
var API_TERMO = "/api/plataforma/painel/termo-de-dados";
var API_CATALOGO = "/api/plataforma/painel/catalogo";
var API_TERMOS_DE_USO = "/api/plataforma/painel/termos-de-uso";
var API_TITULARES = "/api/plataforma/painel/pedidos-do-titular";
var INTERVALO_SINO_MS = 60000;
var OIDC = {
@@ -7108,6 +7129,59 @@ data:
+ "</td></tr>";
}
/* ── pedidos de titulares de dados (LGPD) ─────────────────────────── */
var ROTULO_PEDIDO = { EXCLUSAO: "Excluir conta e dados", ACESSO: "Acessar dados", CORRECAO: "Corrigir dados", OUTRO: "Outro" };
var SITUACOES_PEDIDO = [["RECEBIDO", "Recebido"], ["ENCAMINHADO", "Encaminhado à escola"], ["CONCLUIDO", "Concluído"]];
function linhaDoPedido(p) {
var opcoes = SITUACOES_PEDIDO.map(function (s) {
return '<option value="' + s[0] + '"' + (s[0] === p.situacao ? " selected" : "") + ">" + s[1] + "</option>";
}).join("");
return '<tr><td>' + esc(ha(p.recebidoEm)) + "</td><td>" + esc(ROTULO_PEDIDO[p.tipo] || p.tipo) + "</td><td>" + esc(p.nome)
+ '<br><span class="ajuda">' + esc(p.email) + "</span></td><td>" + esc(p.escola || "—") + "</td><td>"
+ esc(p.mensagem || "—") + '</td><td><select data-pedido="' + esc(p.id) + '">' + opcoes + "</select></td></tr>";
}
function carregarTitulares() {
if (!cred) return Promise.resolve();
var corpo = $("titularesLinhas"), erro = $("titularesErro");
erro.classList.add("oculto");
return pedir(API_TITULARES)
.then(function (r) { if (!r.ok) throw new Error("HTTP " + r.status); return r.json(); })
.then(function (lista) {
corpo.innerHTML = (lista || []).map(linhaDoPedido).join("")
|| '<tr><td colspan="6" class="ajuda">Nenhum pedido até agora.</td></tr>';
})
.catch(function (e) {
corpo.innerHTML = '<tr><td colspan="6" class="ajuda">Não consegui carregar: ' + esc(e.message) + "</td></tr>";
});
}
function mudarSituacaoDoPedido(sel) {
var erro = $("titularesErro");
erro.classList.add("oculto");
return pedir(API_TITULARES + "/" + encodeURIComponent(sel.getAttribute("data-pedido")) + "/situacao", {
method: "POST",
headers: { "Content-Type": "application/json" },
body: JSON.stringify({ situacao: sel.value })
}).then(function (r) {
if (!r.ok) throw new Error("HTTP " + r.status);
}).catch(function (e) {
erro.textContent = "Não consegui mudar a situação: " + e.message;
erro.classList.remove("oculto");
return carregarTitulares();
});
}
/* Delegado na tabela (e nao no document): o elemento morre com a pagina, o ouvinte do document ficaria. */
if ($("titularesLinhas")) {
$("titularesLinhas").addEventListener("change", function (ev) {
var t = ev.target;
if (t && t.tagName === "SELECT" && t.hasAttribute("data-pedido")) mudarSituacaoDoPedido(t);
});
}
function carregarTermosDeUso() {
if (!cred) return Promise.resolve();
return pedir(API_TERMOS_DE_USO)
@@ -7253,6 +7327,7 @@ data:
});
if (b.getAttribute("data-aba") === "termo") carregarTermo();
if (b.getAttribute("data-aba") === "termosdeuso") carregarTermosDeUso();
if (b.getAttribute("data-aba") === "titulares") carregarTitulares();
if (b.getAttribute("data-aba") === "catalogo") carregarCatalogo();
});
});
+75
View File
@@ -5787,6 +5787,7 @@ data:
<button type="button" class="aba" data-aba="atividade" role="tab">Atividade</button>
<button type="button" class="aba" data-aba="termo" role="tab">Termo de dados</button>
<button type="button" class="aba" data-aba="termosdeuso" role="tab">Termos de Uso</button>
<button type="button" class="aba" data-aba="titulares" role="tab">Pedidos de titulares</button>
<button type="button" class="aba" data-aba="catalogo" role="tab">Produtos e pre&ccedil;os</button>
</nav>
@@ -5941,6 +5942,25 @@ data:
</div>
</section>
<!-- PEDIDOS DE TITULARES (LGPD): quem pediu exclusao/acesso/correcao na pagina /excluir-conta -->
<section id="aba-titulares" class="painel-aba oculto">
<div class="cartao">
<h2>Pedidos de titulares de dados</h2>
<p class="ajuda">
Pedidos feitos na p&aacute;gina p&uacute;blica <b>/excluir-conta</b> (excluir conta e dados, acessar, corrigir).
A escola &eacute; a controladora: encaminhe o pedido a ela, marque <b>Encaminhado</b> e, quando a escola
responder ao titular, <b>Conclu&iacute;do</b>. Prazo para responder: <b>15 dias</b>. Cada pedido tamb&eacute;m
chega por e-mail em suporte@athleticmap.com.
</p>
<div class="tabela-rolagem">
<table class="tabela"><thead><tr><th>Recebido</th><th>Pedido</th><th>Quem</th><th>Escola</th><th>Mensagem</th><th>Situa&ccedil;&atilde;o</th></tr></thead>
<tbody id="titularesLinhas"><tr><td colspan="6" class="ajuda">Abra esta aba para carregar.</td></tr></tbody>
</table>
</div>
<p id="titularesErro" class="erro oculto"></p>
</div>
</section>
<!-- TERMO DE DADOS: o que autoriza ler o uso de dentro de cada sistema -->
<section id="aba-termo" class="painel-aba oculto">
<div class="cartao">
@@ -6058,6 +6078,7 @@ data:
var API_TERMO = "/api/plataforma/painel/termo-de-dados";
var API_CATALOGO = "/api/plataforma/painel/catalogo";
var API_TERMOS_DE_USO = "/api/plataforma/painel/termos-de-uso";
var API_TITULARES = "/api/plataforma/painel/pedidos-do-titular";
var INTERVALO_SINO_MS = 60000;
var OIDC = {
@@ -7108,6 +7129,59 @@ data:
+ "</td></tr>";
}
/* ── pedidos de titulares de dados (LGPD) ─────────────────────────── */
var ROTULO_PEDIDO = { EXCLUSAO: "Excluir conta e dados", ACESSO: "Acessar dados", CORRECAO: "Corrigir dados", OUTRO: "Outro" };
var SITUACOES_PEDIDO = [["RECEBIDO", "Recebido"], ["ENCAMINHADO", "Encaminhado à escola"], ["CONCLUIDO", "Concluído"]];
function linhaDoPedido(p) {
var opcoes = SITUACOES_PEDIDO.map(function (s) {
return '<option value="' + s[0] + '"' + (s[0] === p.situacao ? " selected" : "") + ">" + s[1] + "</option>";
}).join("");
return '<tr><td>' + esc(ha(p.recebidoEm)) + "</td><td>" + esc(ROTULO_PEDIDO[p.tipo] || p.tipo) + "</td><td>" + esc(p.nome)
+ '<br><span class="ajuda">' + esc(p.email) + "</span></td><td>" + esc(p.escola || "—") + "</td><td>"
+ esc(p.mensagem || "—") + '</td><td><select data-pedido="' + esc(p.id) + '">' + opcoes + "</select></td></tr>";
}
function carregarTitulares() {
if (!cred) return Promise.resolve();
var corpo = $("titularesLinhas"), erro = $("titularesErro");
erro.classList.add("oculto");
return pedir(API_TITULARES)
.then(function (r) { if (!r.ok) throw new Error("HTTP " + r.status); return r.json(); })
.then(function (lista) {
corpo.innerHTML = (lista || []).map(linhaDoPedido).join("")
|| '<tr><td colspan="6" class="ajuda">Nenhum pedido até agora.</td></tr>';
})
.catch(function (e) {
corpo.innerHTML = '<tr><td colspan="6" class="ajuda">Não consegui carregar: ' + esc(e.message) + "</td></tr>";
});
}
function mudarSituacaoDoPedido(sel) {
var erro = $("titularesErro");
erro.classList.add("oculto");
return pedir(API_TITULARES + "/" + encodeURIComponent(sel.getAttribute("data-pedido")) + "/situacao", {
method: "POST",
headers: { "Content-Type": "application/json" },
body: JSON.stringify({ situacao: sel.value })
}).then(function (r) {
if (!r.ok) throw new Error("HTTP " + r.status);
}).catch(function (e) {
erro.textContent = "Não consegui mudar a situação: " + e.message;
erro.classList.remove("oculto");
return carregarTitulares();
});
}
/* Delegado na tabela (e nao no document): o elemento morre com a pagina, o ouvinte do document ficaria. */
if ($("titularesLinhas")) {
$("titularesLinhas").addEventListener("change", function (ev) {
var t = ev.target;
if (t && t.tagName === "SELECT" && t.hasAttribute("data-pedido")) mudarSituacaoDoPedido(t);
});
}
function carregarTermosDeUso() {
if (!cred) return Promise.resolve();
return pedir(API_TERMOS_DE_USO)
@@ -7253,6 +7327,7 @@ data:
});
if (b.getAttribute("data-aba") === "termo") carregarTermo();
if (b.getAttribute("data-aba") === "termosdeuso") carregarTermosDeUso();
if (b.getAttribute("data-aba") === "titulares") carregarTitulares();
if (b.getAttribute("data-aba") === "catalogo") carregarCatalogo();
});
});
+75
View File
@@ -5787,6 +5787,7 @@ data:
<button type="button" class="aba" data-aba="atividade" role="tab">Atividade</button>
<button type="button" class="aba" data-aba="termo" role="tab">Termo de dados</button>
<button type="button" class="aba" data-aba="termosdeuso" role="tab">Termos de Uso</button>
<button type="button" class="aba" data-aba="titulares" role="tab">Pedidos de titulares</button>
<button type="button" class="aba" data-aba="catalogo" role="tab">Produtos e pre&ccedil;os</button>
</nav>
@@ -5941,6 +5942,25 @@ data:
</div>
</section>
<!-- PEDIDOS DE TITULARES (LGPD): quem pediu exclusao/acesso/correcao na pagina /excluir-conta -->
<section id="aba-titulares" class="painel-aba oculto">
<div class="cartao">
<h2>Pedidos de titulares de dados</h2>
<p class="ajuda">
Pedidos feitos na p&aacute;gina p&uacute;blica <b>/excluir-conta</b> (excluir conta e dados, acessar, corrigir).
A escola &eacute; a controladora: encaminhe o pedido a ela, marque <b>Encaminhado</b> e, quando a escola
responder ao titular, <b>Conclu&iacute;do</b>. Prazo para responder: <b>15 dias</b>. Cada pedido tamb&eacute;m
chega por e-mail em suporte@athleticmap.com.
</p>
<div class="tabela-rolagem">
<table class="tabela"><thead><tr><th>Recebido</th><th>Pedido</th><th>Quem</th><th>Escola</th><th>Mensagem</th><th>Situa&ccedil;&atilde;o</th></tr></thead>
<tbody id="titularesLinhas"><tr><td colspan="6" class="ajuda">Abra esta aba para carregar.</td></tr></tbody>
</table>
</div>
<p id="titularesErro" class="erro oculto"></p>
</div>
</section>
<!-- TERMO DE DADOS: o que autoriza ler o uso de dentro de cada sistema -->
<section id="aba-termo" class="painel-aba oculto">
<div class="cartao">
@@ -6058,6 +6078,7 @@ data:
var API_TERMO = "/api/plataforma/painel/termo-de-dados";
var API_CATALOGO = "/api/plataforma/painel/catalogo";
var API_TERMOS_DE_USO = "/api/plataforma/painel/termos-de-uso";
var API_TITULARES = "/api/plataforma/painel/pedidos-do-titular";
var INTERVALO_SINO_MS = 60000;
var OIDC = {
@@ -7108,6 +7129,59 @@ data:
+ "</td></tr>";
}
/* ── pedidos de titulares de dados (LGPD) ─────────────────────────── */
var ROTULO_PEDIDO = { EXCLUSAO: "Excluir conta e dados", ACESSO: "Acessar dados", CORRECAO: "Corrigir dados", OUTRO: "Outro" };
var SITUACOES_PEDIDO = [["RECEBIDO", "Recebido"], ["ENCAMINHADO", "Encaminhado à escola"], ["CONCLUIDO", "Concluído"]];
function linhaDoPedido(p) {
var opcoes = SITUACOES_PEDIDO.map(function (s) {
return '<option value="' + s[0] + '"' + (s[0] === p.situacao ? " selected" : "") + ">" + s[1] + "</option>";
}).join("");
return '<tr><td>' + esc(ha(p.recebidoEm)) + "</td><td>" + esc(ROTULO_PEDIDO[p.tipo] || p.tipo) + "</td><td>" + esc(p.nome)
+ '<br><span class="ajuda">' + esc(p.email) + "</span></td><td>" + esc(p.escola || "—") + "</td><td>"
+ esc(p.mensagem || "—") + '</td><td><select data-pedido="' + esc(p.id) + '">' + opcoes + "</select></td></tr>";
}
function carregarTitulares() {
if (!cred) return Promise.resolve();
var corpo = $("titularesLinhas"), erro = $("titularesErro");
erro.classList.add("oculto");
return pedir(API_TITULARES)
.then(function (r) { if (!r.ok) throw new Error("HTTP " + r.status); return r.json(); })
.then(function (lista) {
corpo.innerHTML = (lista || []).map(linhaDoPedido).join("")
|| '<tr><td colspan="6" class="ajuda">Nenhum pedido até agora.</td></tr>';
})
.catch(function (e) {
corpo.innerHTML = '<tr><td colspan="6" class="ajuda">Não consegui carregar: ' + esc(e.message) + "</td></tr>";
});
}
function mudarSituacaoDoPedido(sel) {
var erro = $("titularesErro");
erro.classList.add("oculto");
return pedir(API_TITULARES + "/" + encodeURIComponent(sel.getAttribute("data-pedido")) + "/situacao", {
method: "POST",
headers: { "Content-Type": "application/json" },
body: JSON.stringify({ situacao: sel.value })
}).then(function (r) {
if (!r.ok) throw new Error("HTTP " + r.status);
}).catch(function (e) {
erro.textContent = "Não consegui mudar a situação: " + e.message;
erro.classList.remove("oculto");
return carregarTitulares();
});
}
/* Delegado na tabela (e nao no document): o elemento morre com a pagina, o ouvinte do document ficaria. */
if ($("titularesLinhas")) {
$("titularesLinhas").addEventListener("change", function (ev) {
var t = ev.target;
if (t && t.tagName === "SELECT" && t.hasAttribute("data-pedido")) mudarSituacaoDoPedido(t);
});
}
function carregarTermosDeUso() {
if (!cred) return Promise.resolve();
return pedir(API_TERMOS_DE_USO)
@@ -7253,6 +7327,7 @@ data:
});
if (b.getAttribute("data-aba") === "termo") carregarTermo();
if (b.getAttribute("data-aba") === "termosdeuso") carregarTermosDeUso();
if (b.getAttribute("data-aba") === "titulares") carregarTitulares();
if (b.getAttribute("data-aba") === "catalogo") carregarCatalogo();
});
});