Reserveringen
Rol: lid (reservering plaatsen en eigen reserveringen bekijken), eigenaar (alle reserveringen beheren, goedkeuren en annuleren)
De Reservaties-tab stelt leden in staat om een van de drie padelbanen te boeken voor een tijdslot van 60 of 90 minuten. Reserveringen starten altijd met de status pending en worden door de eigenaar handmatig bevestigd of geannuleerd.
Boekingsflow
Statusdiagram
UI-details
Dagselectie
Bovenaan het scherm verschijnt een horizontale rij met datumpillen voor vandaag en de komende drie dagen. De geselecteerde dag is gemarkeerd met de teal-accentkleur (#2e8b76).
Slotgrid Per geselecteerde dag en baan wordt een grid van tijdslots weergegeven (bv. 08:00 – 22:00 in stappen van 30 minuten). Bezette slots worden visueel doorgestreept en zijn niet aanklikbaar. Beschikbare slots zijn wit op het donkere achtergrondoppervlak.
Bottom sheet modal Na het kiezen van datum, tijdslot, baan en duur verschijnt een bevestigingsmodal als bottom sheet met een samenvatting van de reservering. De gebruiker kan bevestigen of annuleren voordat de API-aanroep plaatsvindt.
Eigen overzicht
Onder de boekingsinterface ziet het lid een lijst van eigen reserveringen, gesorteerd op datum. De statusbadge toont pending (amber), confirmed (groen) of cancelled (grijs).
Datamodel
Baanreserveringen door leden. Status loopt van pending → confirmed of cancelled.
| Veld | Type | Verplicht | Beschrijving | Beperkingen |
|---|---|---|---|---|
user | relation | ✓ | Lid dat de baan reserveert | → users |
date | date | ✓ | Datum van de reservering | — |
court | select | ✓ | Gereserveerde baan | baan1 | baan2 | baan3 |
startTime | text | ✓ | Starttijd als HH:MM string | — |
duration | select | ✓ | Duur van de reservering in minuten | 60 | 90 |
status | select | ✓ | Status van de reservering | pending | confirmed | cancelled |
notes | text | — | Optionele notitie van het lid | — |
Toegangsregels
| Regel | Expressie |
|---|---|
list | @request.auth.id = user.id || @request.auth.role = 'eigenaar' |
view | @request.auth.id = user.id || @request.auth.role = 'eigenaar' |
create | @request.auth.id != '' |
update | @request.auth.id = user.id || @request.auth.role = 'eigenaar' |
delete | @request.auth.id = user.id || @request.auth.role = 'eigenaar' |
Ontwerpkeuzes
Pending als beginstatus Er is bewust gekozen voor een goedkeuringsflow in plaats van directe bevestiging. De eigenaar heeft zo controle over de baanbezetting, kan dubbelboekingen corrigeren en kan rekening houden met geplande onderhoudsmomenten die niet in het systeem zijn ingevoerd.
Drie banen (baan1–baan3) De banen zijn vastgelegd als een select-veld met drie opties, aansluitend op de fysieke accommodatie. Het toevoegen van een vierde baan vereist een schema-aanpassing in PocketBase en een update van de UI.
Duur: 60 of 90 minuten Alleen twee gangbare duraties worden aangeboden om de slotberekening eenvoudig te houden. Een vrij invoerveld voor duur zou overlappende reserveringen lastiger detecteerbaar maken.
Bekende beperking
Er bestaat geen UNIQUE-constraint op de combinatie (date, court, startTime) in PocketBase. Conflictdetectie (overlappende reserveringen op dezelfde baan) wordt momenteel alleen aan de clientzijde afgedwongen door bezette slots in de UI te markeren als niet-selecteerbaar. Bij gelijktijdige boekingen door twee leden is een dubbelreservering technisch mogelijk. Een server-side constraint of een transactionele check via een PocketBase hook wordt aanbevolen als toekomstige verbetering.