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 });