diff --git a/README.md b/README.md index 913b9f0..5d8fb92 100644 --- a/README.md +++ b/README.md @@ -70,6 +70,21 @@ For databasens layout (dvs. tabeller, kolonner, etc.) se [database-layout](db/da For bruk av databasen se [database-usage](db/database-usage.md). +## Paginering + +Resultatlista viser 20 spill per side, med "forrige" og "neste" og "side X av Y" under lista. + +**Cursor-paginering i stedet for sidetall.** Backend bruker cursor-paginering (`first`/`after` og `last`/`before` i `games`-queryen). I stedet for "gi meg side 300" ber frontend om "de 20 neste etter dette spillet". Databasen kan da bruke indeksen direkte og slipper å telle seg forbi alle radene foran, så det er like raskt uansett hvor langt ut i lista man er. Det er viktig når datasettet er stort. Ulempen er at man blar side for side i stedet for å hoppe rett til et sidetall, noe vi mente er en unødvendig feature uansett. + +**Hvordan det henger sammen i frontend:** +- `pageInfo` fra backend gir `startCursor` og `endCursor` (bokmerker for første og siste spill på siden) og om det finnes en neste side. +- "Neste" sender `first: 20, after: endCursor`, "forrige" sender `last: 20, before: startCursor`. +- Sidetallet holdes i frontend, og totalt antall sider regnes ut fra `totalCount`. +- Nytt søk, nytt filter eller klikk på logoen starter på side 1, siden en gammel cursor ikke passer til en ny liste. +- Apollo cacher hver side, så å bla tilbake gir som regel ingen ny forespørsel. + +**Tilgjengelighet:** Når man bytter side, scrolles siden til toppen og fokus flyttes til overskriften over lista, så tastatur- og skjermleserbrukere vet at innholdet er nytt. Knappene er deaktivert på første og siste side, og pagineringen ligger i en `