const { Icon, IconButton } = window.ACRFlowDesignSystem_ba1e9c;
/** Paginação no padrão GLPI: N linhas por página, ajustável de 5 em 5,
* com navegação primeira / anterior / páginas / próxima / última.
* A escolha de cada tela é lembrada no navegador. */
function usePaginacao(linhas, chave, padrao = 15) {
const guardado = Number(window.localStorage.getItem("acr.porPagina." + chave));
const [porPagina, setPorPaginaBruto] = React.useState(guardado >= 5 ? guardado : padrao);
const [pagina, setPagina] = React.useState(1);
const total = linhas.length;
const paginas = Math.max(1, Math.ceil(total / porPagina));
React.useEffect(() => { if (pagina > paginas) setPagina(paginas); }, [paginas, pagina]);
React.useEffect(() => { setPagina(1); }, [total]);
const setPorPagina = (n) => {
const v = Math.max(5, Math.min(200, Math.round(n / 5) * 5));
window.localStorage.setItem("acr.porPagina." + chave, String(v));
setPorPaginaBruto(v);
setPagina(1);
};
const ini = (pagina - 1) * porPagina;
return { fatia: linhas.slice(ini, ini + porPagina), pagina, setPagina, paginas, porPagina, setPorPagina, total, de: total ? ini + 1 : 0, ate: Math.min(ini + porPagina, total) };
}
function Paginacao({ p }) {
if (!p.total) return null;
const botao = (nome, rotulo, alvo, desab) => (
} onClick={() => p.setPagina(alvo)} />
);
// janela de no máximo 5 números em volta da página atual
const ini = Math.max(1, Math.min(p.pagina - 2, p.paginas - 4));
const nums = [];
for (let i = ini; i < ini + 5 && i <= p.paginas; i++) nums.push(i);
return (
} onClick={() => p.setPorPagina(p.porPagina - 5)} />
p.setPorPagina(Number(e.target.value) || 5)}
style={{ width: 68, textAlign: "center", font: "var(--type-body)", color: "var(--text-strong)", background: "var(--surface-input, var(--surface-raised))", border: "1px solid var(--border-strong)", borderRadius: "var(--radius-control, 8px)", padding: "6px 8px" }} />
= 200}
icon={} onClick={() => p.setPorPagina(p.porPagina + 5)} />
linhas / página
Exibindo {p.de} a {p.ate} de {p.total} {p.total === 1 ? "demanda" : "demandas"}
{botao("chevrons-left", "Primeira página", 1, p.pagina === 1)}
{botao("chevron-left", "Página anterior", p.pagina - 1, p.pagina === 1)}
{nums.map((n) => (
))}
{botao("chevron-right", "Próxima página", p.pagina + 1, p.pagina === p.paginas)}
{botao("chevrons-right", "Última página", p.paginas, p.pagina === p.paginas)}
);
}
Object.assign(window, { usePaginacao, Paginacao });