46 lines
1.7 KiB
JavaScript
46 lines
1.7 KiB
JavaScript
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()
|
|
}
|
|
}
|
|
}
|