Atualização Automatica dos numeros e correção de erro e falha de segurança
This commit is contained in:
45
app/javascript/controllers/auto_refresh_controller.js
Normal file
45
app/javascript/controllers/auto_refresh_controller.js
Normal file
@@ -0,0 +1,45 @@
|
||||
import { Controller } from "@hotwired/stimulus"
|
||||
|
||||
// Atualiza o painel automaticamente, sem o usuário precisar apertar F5.
|
||||
//
|
||||
// A cada `interval` ms faz um Turbo.visit "replace" na própria URL: o Turbo
|
||||
// re-renderiza o corpo (KPIs, gráficos, mapa) e re-executa os <script> inline,
|
||||
// preservando os filtros — que vivem na query string. Pausa quando a aba está
|
||||
// oculta ou quando o usuário está com um campo em foco, e restaura a posição de
|
||||
// rolagem após cada atualização (para não "pular" para o topo).
|
||||
//
|
||||
// Uso:
|
||||
// <div data-controller="auto-refresh"
|
||||
// data-auto-refresh-interval-value="300000"> ... </div>
|
||||
export default class extends Controller {
|
||||
static values = { interval: { type: Number, default: 300000 } } // 5 min
|
||||
|
||||
connect() {
|
||||
// Restaura a rolagem salva antes da última atualização automática.
|
||||
const y = sessionStorage.getItem("autoRefreshScroll")
|
||||
if (y !== null) {
|
||||
window.scrollTo(0, parseInt(y, 10))
|
||||
sessionStorage.removeItem("autoRefreshScroll")
|
||||
}
|
||||
this.timer = setInterval(() => this.refresh(), this.intervalValue)
|
||||
}
|
||||
|
||||
disconnect() {
|
||||
clearInterval(this.timer)
|
||||
}
|
||||
|
||||
refresh() {
|
||||
// Não recarrega em aba oculta (economiza recursos) nem se o usuário estiver
|
||||
// digitando/selecionando algo (evita perder o que está fazendo).
|
||||
if (document.visibilityState !== "visible") return
|
||||
const ativo = document.activeElement
|
||||
if (ativo && ["INPUT", "SELECT", "TEXTAREA"].includes(ativo.tagName)) return
|
||||
|
||||
sessionStorage.setItem("autoRefreshScroll", String(window.scrollY))
|
||||
if (window.Turbo) {
|
||||
window.Turbo.visit(window.location.href, { action: "replace" })
|
||||
} else {
|
||||
window.location.reload()
|
||||
}
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user