Skip to content

Pagination

Composant de pagination pour naviguer dans des listes paginables.

Fichier source : frontend/src/components/Pagination.tsx

Props

PropTypeDescription
totalnumberNombre total d'elements
pagenumberPage courante (commence a 1)
pageSizenumberNombre d'elements par page
onPageChange(page: number) => voidCallback lors du changement de page

Comportement

  • Calcule totalPages = Math.ceil(total / pageSize) (minimum 1)
  • Affiche "Affichage X-Y sur Z resultats" (ou "Aucun resultat" si total === 0)
  • Bouton "Precedent" desactive sur la page 1
  • Bouton "Suivant" desactive sur la derniere page
  • Indicateur "Page X / Y" au centre

Exemple d'utilisation

tsx
import Pagination from '../components/Pagination';

const [page, setPage] = useState(1);
const pageSize = 10;

<Pagination
  total={items.length}
  page={page}
  pageSize={pageSize}
  onPageChange={setPage}
/>

Implementation

tsx
export default function Pagination({ total, page, pageSize, onPageChange }: PaginationProps) {
  const totalPages = Math.max(1, Math.ceil(total / pageSize));
  const start = total === 0 ? 0 : (page - 1) * pageSize + 1;
  const end = Math.min(page * pageSize, total);

  return (
    <div className="flex items-center justify-between border-t border-slate-200 bg-white px-4 py-3 text-sm">
      <span className="text-slate-600">
        {total === 0 ? 'Aucun resultat' : `Affichage ${start}--${end} sur ${total} resultats`}
      </span>
      <div className="flex items-center gap-2">
        <button onClick={() => onPageChange(page - 1)} disabled={page <= 1}>
          <ChevronLeft size={14} /> Precedent
        </button>
        <span>Page {page} / {totalPages}</span>
        <button onClick={() => onPageChange(page + 1)} disabled={page >= totalPages}>
          Suivant <ChevronRight size={14} />
        </button>
      </div>
    </div>
  );
}

Accessibilite

Les boutons de navigation ont des aria-label descriptifs : "Page precedente" et "Page suivante".

Tests

Voir frontend/src/components/__tests__/Pagination.test.tsx.

Released under the MIT License.