App: Open de app — https://bos.val.run/ Val: https://www.val.town/x/raymondv/biljartcompetitie
De homepage toont nu de tussenstand en daaronder alle partijen, nieuwste datum eerst. Nieuwe partij is voor iedereen klikbaar: kies jezelf, kies een nog beschikbare tegenstander, vul beide scores en de datum in. Vandaag is vooraf ingevuld.
Dit is bewust een frontendprototype: toevoegen past uitsluitend de tijdelijke browserweergave aan. Vernieuwen herstelt de online stand. Er worden geen openbare wijzigingen naar de database geschreven. Formulieren, login en beheer zijn uit de nieuwe voorkant gehaald; de eerdere serverfuncties zijn behouden voor later.
Vormgeving: frontend/style.css. Invoer: frontend/components/PartyForm.tsx.
Lokale voorbeeldserver: node tests/preview-server.ts (poort 4173), met een
kopie van de getranspileerde clientmodules in preview/. Testdata blijven
lokaal.
De onderstaande beschrijving documenteert de eerdere versie en backend.
- Bezoekers zien standen, uitslagen, nog mogelijke tegenstanders en weekformulieren.
- Alle openbare namen zijn unieke afkortingen van 4 letters; bij botsingen 5 letters en zo nodig een deelnemersnummer. Volledige namen worden uitsluitend aan ingelogde beheerders geleverd.
- Log in met Val Town. De eigenaar beheert de toegang van spelleiders via hun exacte Val Town-gebruikersnaam. Een gratis account volstaat.
- De app start als demonstratie met 60 fictieve uitslagen uit het aangeleverde Excelbestand. De eigenaar kan via Beheer expliciet een lege echte competitie starten. Startmoyennes zijn onbekend en worden niet verzonnen.
- De 16 deelnemers kunnen hernoemd worden en hebben bewerkbare startmoyennes. Naamscorrecties gelden ook voor eerdere uitslagen; een persoon vervangen midden in een seizoen vereist aparte migratie.
- Elke speler heeft 20 beurten. Winst 2 punten, gelijk 1, verlies 0. Sortering: punten, actueel moyenne, bij volledige gelijkstand oorspronkelijke deelnemersvolgorde. Geen handicapberekening.
- Download wekelijks de JSON-back-up onder Beheer. Deze bevat de volledige stand en alle wijzigingsmomenten. CSV bevat uitslagen met afkortingen. Geen automatische externe back-up ingesteld.
- Print: Weekformulier, kies actueel of blanco. A4 staand, 100%, browserkop- en voetteksten uit. Het blanco formulier toont geen uitslagstatus of actuele punten.
React 18.2, Hono en Val Town SQLite (std/sqlite/main.ts, val-scoped). Geen
betaald extern systeem, geen persoonlijke cloudschijven.
index.ts: API, OAuth-rollencontrole, CSRF-controle, export en frontend-routes.frontend/logic.ts: spelregels, validatie en afkortingen.frontend/components/App.tsx: navigatie en schermen.frontend/components/Forms.tsx: uitslagformulier, stand, deelnemersbeheer.frontend/components/WeekForm.tsxenfrontend/print.css: A4-formulieren.frontend/root.tsx: HTML-shell en versiegebonden assets.
Database:
competition: één JSON-document met spelers/uitslagen en een integerversion.history: SQLite-trigger bewaart elke wijziging atomair met oude/nieuwe stand, actor en actie.admins: eigenaar op onveranderlijk Val Town-user-ID; spelleiders op toegekende gebruikersnaam.access_check: lege tabel voor toegangstests.
Updates gebruiken WHERE version = ? plus RETURNING; een verouderde update
geeft HTTP 409. Servervalidatie weigert ontbrekende scores,
negatieve/breuk-scores, ongeldige datums, dezelfde speler en dubbele paren in
beide richtingen.
Codex kan via de Val Town-plugin code en de val-database onderhouden. Namen en
uitslagen staan in de database, niet in de publieke broncode. Publiceer geen
lokale data/ of back-upbestanden als broncode.
Herstel door Codex: valideer een JSON-back-up, exporteer eerst de huidige stand,
voer daarna een parametergebonden update van competition uit met
versiecontrole, hogere versie en herstelactie. De trigger bewaart de eerdere
stand. Verwijder de geschiedenis niet stilzwijgend.