Spaces:
Sleeping
Sleeping
Update app.py
Browse filesRetificação do botão resetar analytics
app.py
CHANGED
|
@@ -1432,6 +1432,8 @@ with gr.Blocks(theme=custom_theme, title="Gerador de Posts e Chatbot (Completo)"
|
|
| 1432 |
with gr.Row():
|
| 1433 |
gerar_relatorio_btn = gr.Button("Atualizar Relatório", variant="secondary")
|
| 1434 |
resetar_analytics_btn = gr.Button("Resetar Analytics (CUIDADO)", variant="stop")
|
|
|
|
|
|
|
| 1435 |
|
| 1436 |
with gr.TabItem("⚙️ Configurações", id=4):
|
| 1437 |
gr.Markdown("### Configurações do Gerador")
|
|
@@ -1517,6 +1519,58 @@ with gr.Blocks(theme=custom_theme, title="Gerador de Posts e Chatbot (Completo)"
|
|
| 1517 |
show_progress="full"
|
| 1518 |
)
|
| 1519 |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 1520 |
# Lista de outputs para o botão Limpar
|
| 1521 |
limpar_outputs = [
|
| 1522 |
# Aba Gerador
|
|
@@ -1620,11 +1674,34 @@ with gr.Blocks(theme=custom_theme, title="Gerador de Posts e Chatbot (Completo)"
|
|
| 1620 |
outputs=[analytics_display]
|
| 1621 |
)
|
| 1622 |
|
|
|
|
|
|
|
|
|
|
| 1623 |
resetar_analytics_btn.click(
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 1624 |
fn=resetar_analytics,
|
| 1625 |
inputs=None,
|
| 1626 |
-
outputs=[analytics_display]
|
| 1627 |
-
js="() => { return confirm('Tem certeza que deseja resetar TODOS os dados de analytics e cache? Esta ação não pode ser desfeita.') }"
|
| 1628 |
)
|
| 1629 |
|
| 1630 |
# Lançar aplicação
|
|
|
|
| 1432 |
with gr.Row():
|
| 1433 |
gerar_relatorio_btn = gr.Button("Atualizar Relatório", variant="secondary")
|
| 1434 |
resetar_analytics_btn = gr.Button("Resetar Analytics (CUIDADO)", variant="stop")
|
| 1435 |
+
# Botão oculto para confirmação
|
| 1436 |
+
resetar_analytics_btn_confirm = gr.Button("Confirmar Reset", visible=False, elem_id="reset_confirm_hidden_btn")
|
| 1437 |
|
| 1438 |
with gr.TabItem("⚙️ Configurações", id=4):
|
| 1439 |
gr.Markdown("### Configurações do Gerador")
|
|
|
|
| 1519 |
show_progress="full"
|
| 1520 |
)
|
| 1521 |
|
| 1522 |
+
# Botão copiar (com _js e fallback)
|
| 1523 |
+
copiar_btn.click(
|
| 1524 |
+
fn=copiar_feedback,
|
| 1525 |
+
inputs=[texto_output],
|
| 1526 |
+
outputs=[status_output],
|
| 1527 |
+
_js="""
|
| 1528 |
+
(texto_do_output) => {
|
| 1529 |
+
// Tenta a API moderna (navigator.clipboard)
|
| 1530 |
+
if (navigator.clipboard && window.isSecureContext) {
|
| 1531 |
+
navigator.clipboard.writeText(texto_do_output)
|
| 1532 |
+
.then(() => {
|
| 1533 |
+
console.log("Texto copiado com sucesso (navigator.clipboard)");
|
| 1534 |
+
})
|
| 1535 |
+
.catch(err => {
|
| 1536 |
+
console.warn("Falha ao copiar (navigator.clipboard), tentando fallback...", err);
|
| 1537 |
+
// Fallback: Tentar execCommand
|
| 1538 |
+
const elem = document.createElement('textarea');
|
| 1539 |
+
elem.value = texto_do_output;
|
| 1540 |
+
elem.style.position = 'absolute';
|
| 1541 |
+
elem.style.left = '-9999px';
|
| 1542 |
+
document.body.appendChild(elem);
|
| 1543 |
+
elem.select();
|
| 1544 |
+
try {
|
| 1545 |
+
document.execCommand('copy');
|
| 1546 |
+
console.log("Texto copiado com sucesso (execCommand fallback)");
|
| 1547 |
+
} catch (e) {
|
| 1548 |
+
console.error("Falha ao copiar (execCommand fallback)", e);
|
| 1549 |
+
}
|
| 1550 |
+
document.body.removeChild(elem);
|
| 1551 |
+
});
|
| 1552 |
+
} else {
|
| 1553 |
+
// Fallback final para HTTP ou navegadores muito antigos
|
| 1554 |
+
const elem = document.createElement('textarea');
|
| 1555 |
+
elem.value = texto_do_output;
|
| 1556 |
+
elem.style.position = 'absolute';
|
| 1557 |
+
elem.style.left = '-9999px';
|
| 1558 |
+
document.body.appendChild(elem);
|
| 1559 |
+
elem.select();
|
| 1560 |
+
try {
|
| 1561 |
+
document.execCommand('copy');
|
| 1562 |
+
console.log("Texto copiado com sucesso (execCommand fallback 2)");
|
| 1563 |
+
} catch (e) {
|
| 1564 |
+
console.error("Falha ao copiar (execCommand fallback 2)", e);
|
| 1565 |
+
}
|
| 1566 |
+
document.body.removeChild(elem);
|
| 1567 |
+
}
|
| 1568 |
+
// Retorna o valor para a função Python (copiar_feedback)
|
| 1569 |
+
return texto_do_output;
|
| 1570 |
+
}
|
| 1571 |
+
"""
|
| 1572 |
+
)
|
| 1573 |
+
|
| 1574 |
# Lista de outputs para o botão Limpar
|
| 1575 |
limpar_outputs = [
|
| 1576 |
# Aba Gerador
|
|
|
|
| 1674 |
outputs=[analytics_display]
|
| 1675 |
)
|
| 1676 |
|
| 1677 |
+
# CORREÇÃO: Implementação do botão de reset com 2 botões (visível e oculto)
|
| 1678 |
+
|
| 1679 |
+
# 1. O botão visível SÓ executa o JS.
|
| 1680 |
resetar_analytics_btn.click(
|
| 1681 |
+
fn=None, # Nenhuma função Python aqui
|
| 1682 |
+
inputs=None,
|
| 1683 |
+
outputs=None,
|
| 1684 |
+
js="""
|
| 1685 |
+
() => {
|
| 1686 |
+
if (confirm('Tem certeza que deseja resetar TODOS os dados de analytics e cache? Esta ação não pode ser desfeita.')) {
|
| 1687 |
+
// Encontra o botão oculto pelo elem_id e clica nele
|
| 1688 |
+
const hidden_btn = document.getElementById('reset_confirm_hidden_btn');
|
| 1689 |
+
if (hidden_btn) {
|
| 1690 |
+
hidden_btn.click();
|
| 1691 |
+
} else {
|
| 1692 |
+
console.error('Botão oculto de confirmação não encontrado');
|
| 1693 |
+
}
|
| 1694 |
+
}
|
| 1695 |
+
// Se o usuário clicar em "Cancelar", nada acontece.
|
| 1696 |
+
}
|
| 1697 |
+
"""
|
| 1698 |
+
)
|
| 1699 |
+
|
| 1700 |
+
# 2. O botão oculto (definido na UI) executa a função Python.
|
| 1701 |
+
resetar_analytics_btn_confirm.click(
|
| 1702 |
fn=resetar_analytics,
|
| 1703 |
inputs=None,
|
| 1704 |
+
outputs=[analytics_display]
|
|
|
|
| 1705 |
)
|
| 1706 |
|
| 1707 |
# Lançar aplicação
|