Changelog
Vrijdag 1 mei 2026
19 wijzigingen
v1.19.0
- Nieuw Demo-omgeving op demo.bowlscore.nl: bezoekers vragen via bowlscore.nl/demo een demo-account aan en ontvangen na goedkeuring per mail drie inloggegevens (bestuur, leagueleider en speler) die zeven dagen geldig zijn. De demo-data wordt elke nacht om 03:00 ververst zodat alles weer fris is voor de volgende bezoeker
- Nieuw Gele "DEMO-OMGEVING"-banner staat op iedere pagina binnen demo.bowlscore.nl, zodat duidelijk is dat het een testomgeving is en wijzigingen elke nacht verdwijnen
- Nieuw Demo-competities krijgen automatisch een NBF league-ID toegewezen, zodat de NBF-upload-pagina meteen volledig getest kan worden in de demo (de upload-knop is gemockt — er gaat niets daadwerkelijk naar bowlingnbf.nl)
- Verbetering "Probeer de demo"-link toegevoegd in de topbar, footer en als CTA op de landingspagina, zodat bezoekers makkelijk een demo kunnen starten
- Verbetering Op het demo-aanvraagformulier zijn vereniging en telefoonnummer nu verplichte velden, zodat we contact op kunnen nemen bij vragen over je aanvraag
- Verbetering Demo-omgeving heeft nu volledige speeldagen met scores: elke vereniging heeft drie teams van vier spelers en de eerste drie speeldagen van het huidige seizoen zijn afgespeeld met realistische scores rond het pasgemiddelde van elke speler, inclusief handicap. Ranglijsten, hoogtepunten en team-standen zijn dus direct gevuld bij het inloggen op de demo
- Verbetering Op de NBF-upload-pagina, de bevestig-pagina en het NBF-upload-log staat in de demo-omgeving nu een duidelijke melding dat er geen echte scores naar bowlingnbf.nl worden gestuurd — de knoppen werken wel, maar uploads zijn gemockt
- Verbetering Demo-omgeving uitgebreid met meer realistische dataset: drie verenigingen met elk 32 spelers en 8 teams; per vereniging een League én Cup-toernooi in beide seizoenen plus een regio-competitie waarin teams van alle drie de verenigingen door elkaar spelen. Het voorgaand seizoen is volledig uitgespeeld en het huidige seizoen heeft de helft van de speeldagen al gespeeld, zodat ranglijsten, historische standen en hoogtepunten direct bij inloggen een volle dataset tonen
- Verbetering Demo-scores zijn niet meer allemaal op baan 1 — matches verdelen automatisch over banen 1 t/m 12 zoals in een echte bowlinghal, en teams wisselen per game van baan binnen hun paar
- Verbetering Hoogtepunten op de demo-omgeving zijn nu voor élk type gevuld (perfect game 300, 250+, 200+, high game, high series, clean game) en verspreid over verschillende spelers en verenigingen, zodat de hoogtepunten-pagina een complete indruk geeft
- Verbetering De demo-speler die je per mail krijgt is nu gekoppeld aan een echte speler in de demo-data: bij inloggen zie je direct je games, je team, je pasgemiddelde en je positie in de ranglijst — geen leeg account meer
- Verbetering In de demo-omgeving zijn gebruikers wijzigen, aanmaken, verwijderen en CSV-importeren uitgeschakeld. De gebruikers-lijst is wel zichtbaar zodat je de pagina kunt bekijken zoals in productie, maar de actieknoppen zijn gegrijsd en een banner legt uit waarom
- Verbetering Standaard-thema voor nieuwe gebruikers is nu lichte modus (was donker). Bestaande gebruikers behouden hun eigen voorkeur — die kun je nog steeds wisselen via de zon/maan-knop in de topbar
- Verbetering Demo-omgeving heeft nu alleen League-competities (geen toernooi-competities meer) en geen cross-vereniging regio-competitie meer; per vereniging zijn er twee leagues (A en B) per seizoen, elk met alle acht teams. Dat lost ook op dat teams verwezen naar een competitie die niet in jouw eigen vereniging zichtbaar was
- Verbetering Elke demo-competitie en elke periode krijgt nu een willekeurig oliepatroon uit de bibliotheek toegewezen, zodat het oliepatroon op het dashboard, in het competitie-overzicht en bij de periode-details direct zichtbaar is
- Fix Thema-keuze (donker/licht) onthoudt nu correct je voorkeur op de demo-omgeving — voorheen sprong hij na een refresh terug naar het donkere thema
- Fix Op de Ranking Individueel-pagina toonde de optie "hele seizoen" in de demo-omgeving "Geen rankings gevonden" terwijl de periode-keuze wél een ranglijst gaf. De seizoen-ranking gebruikt een aparte tussen-tabel die in de demo-data niet werd gevuld; deze wordt nu na elke nightly reset bijgewerkt
- Fix In de demo-omgeving had een speler op dezelfde datum games in twee verschillende competities (League A en League B met dezelfde teams). Er is nu één League per vereniging per seizoen waarin alle acht teams spelen, zodat een speler maximaal één wedstrijd per speeldag heeft en datums logisch over het seizoen verspreid staan
- Fix Status van demo-speeldagen wordt nu bepaald op basis van de datum: speeldagen die al voorbij zijn staan op "voltooid" (met scores), speeldagen die nog komen op "gepland". Voorheen kon een speeldag in het verleden onterecht als "gepland" verschijnen
Donderdag 30 april 2026
6 wijzigingen
v1.18.0
- Nieuw SEO: robots.txt en dynamische /sitemap.xml toegevoegd. robots.txt staat publieke pagina's toe en blokkeert privé-portaal-routes (dashboard, scores, beheer, etc.). Sitemap lijst homepage, contact, privacy, voorwaarden en changelog met lastmod en priority
- Nieuw SEO: canonical-URL en per-page Open Graph URL automatisch op basis van huidige pagina, plus Twitter Card meta-tags (summary_large_image), hreflang nl-NL en x-default, og:locale en og:site_name. Voorkomt duplicate-content en geeft nette social-sharing previews
- Nieuw SEO: JSON-LD structured data ingebouwd in landing-layout met @graph van drie schema's — Organization (BlueTeamDev), WebSite en SoftwareApplication (BowlScore met featureList). Google kan hiermee rich results en kennis-graaf-entries genereren
- Verbetering Construction-banner + topbar zijn samen sticky bovenaan het scherm via een wrapper-div met position: sticky; top: 0. Banner en topbar scrollen niet meer weg bij neerwaarts scrollen op de landing
- Verbetering Meta description landing uitgebreid en keyword-rijker: vermeldt expliciet NBF-bowlingverenigingen, scores, ranglijsten, NBF-upload, oliepatronen-bibliotheek en multi-device. Author-meta-tag met BlueTeamDev
- Beveiliging Site-status flag in config/app.php ('construction' / 'live'). Bij 'construction': alle publieke pagina's krijgen <meta robots='noindex, nofollow'> zodat Google de pre-launch site niet indexeert met de "Nog in ontwikkeling"-banner als snippet. Bij live-gang: zet site_status op 'live'
Woensdag 29 april 2026
10 wijzigingen
v1.17.0
- Nieuw Privacyverklaring herschreven naar productieversie: 15 secties incl. expliciete rolverdeling (vereniging = verwerkingsverantwoordelijke, BlueTeamDev = verwerker), verwerkersovereenkomst-vermelding, datalek-meldplicht (72u Autoriteit Persoonsgegevens, 48u richting vereniging), doorgifte buiten EER, geautomatiseerde besluitvorming, en duidelijk klachtrecht-pad. AVG-conform conform art. 13/14
- Nieuw Algemene voorwaarden herschreven naar productieversie: 17 artikelen met betaalvoorwaarden (30 dagen netto, jaarindexering max 5%, automatische verlenging), aanvaardbaar gebruik, intellectueel eigendom, AVG/DPA-clausule, geheimhouding (5 jaar), aansprakelijkheidsplafond (€ 5.000/jaar of 12 maanden vergoeding), overmacht (60 dagen), beëindiging + 30-dagen data-export-window. Geschilbeslechting bij Rechtbank Noord-Nederland
- Nieuw Landingspagina toont nu de echte pattern-afbeeldingen uit de database in plaats van CSS-mocks. Nieuwe publieke route /oliepatronen/{id}/landing-image (alleen actieve patronen, hardcoded thumbnail-breedte 160px). LandingController haalt 8 curated patronen op met bestaande image; valt netjes terug bij DB-fout of lege bibliotheek
- Nieuw Contactpagina /contact met formulier (naam, e-mail, onderwerp, bericht) en bedrijfsgegevens-blok. Topbar- en footer-link "Contact" wijzen nu naar deze aparte pagina i.p.v. de mailto-link. Beveiliging: CSRF, honeypot-veld, 1-bericht-per-60-sec rate-limit en e-mailverzending via PHPMailer/SMTP
- Verbetering Concept-banners weg op /privacy en /voorwaarden — teksten zijn nu de officiële versie. Datum bijgewerkt naar 29 april 2026
- Verbetering Bedrijfsgegevens ingevuld op /contact, /privacy en /voorwaarden: BowlScore is een product van BlueTeamDev, Kleasterwei 16, 8851 GP Tzummarum. Geen telefoonnummer, IBAN, BTW of KvK getoond op verzoek; bedrijfsgegevens-blok op contactpagina is daardoor compacter
- Verbetering Landing-teksten herschreven naar plain Nederlands: technische termen (NBF Huisleagues-API, multi-tenant, AVG-compliant CDN, AES-256-CBC, NIS2-ready, PWA, composite-view) zijn vervangen door begrijpelijke uitleg. Doelgroep-kaarten, oliepatronen-sectie, hero-tagline en screenshot-meta in dezelfde toon
- Verbetering Flash-berichten worden nu ook op de publieke landing-layout gerenderd zodat formulier-feedback (bv. van het contactformulier) zichtbaar is
- Fix Oliepatronen-showcase op de landing: alle 8 mock-kaarten zagen er identiek uit omdat :nth-child binnen .col-6 niet matchte. Per kaart krijgt nu een data-variant=0..7 attribuut met eigen olie-distributie-patroon zodat ze visueel onderscheidend zijn
- Fix Backfill van Kegel: filter "missing" was te ruim — voor records waarvoor de Kegel-API geen Logo of PatternImage levert bleef logo_filename/image_filename NULL en kwamen ze in elke batch opnieuw terug (oneindige lus, "verwerkt 1625 / verwacht 2542" terwijl de DB maar 1260 records bevat). Filter is nu strict op kegel_data IS NULL; client-side modal locked het totaal bij de eerste response en stopt bij onverwachte loop
Dinsdag 28 april 2026
6 wijzigingen
v1.15.0
- Nieuw Landingspagina krijgt een light-thema (default) + dark-thema met toggle-knop in de topbar (sun/moon icoon). Voorkeur persisteert in localStorage (1 jaar bewaartermijn — geen cookie, geen netwerkverkeer, geen tracking-overweging). Inline pre-render script in <head> voorkomt FOUC bij refresh
- Nieuw Smooth thema-overgang: bij toggle vloeien achtergrond, tekst, randen en schaduwen in 250 ms naar de nieuwe kleuren. Honoreert OS-instelling "Reduce motion" (WCAG 2.3.3)
- Nieuw Nieuwe oliepatronen-showcase sectie op / : grid van 8 mock-pattern-kaarten met lane-visualisatie + Distance/Volume/Ratio, plus drie USP-iconen (PDF in één klik, composite-view, per competitie/periode). Vertelt het verhaal van de 1.259 ingebouwde Kegel-patronen zonder DB-call op de publieke pagina
- Verbetering Doelgroep-kaarten op de landing uitgebreid met recente features: AVG-compliance + SHA-384 SRI (Verenigingen), audit-log + oliepatronen-koppeling (Bestuur), goud/zilver/brons-medailles + PWA-installatie + dagelijks oliepatroon (Spelers)
- Verbetering landing.css gerefactored naar CSS custom properties — alle thema-kleuren leven in :root (light) en html[data-bs-theme="dark"]. Onderhoudbaarder en uitbreidbaar voor toekomstige thema's
- Beveiliging Theme-persistentie via localStorage gekozen boven cookie: geen HttpOnly-debat, gaat nooit over het netwerk, niet stelable via cookie-XSS-vectoren. Past binnen de privacyverklaring "alleen functionele opslag, geen tracking"
Maandag 27 april 2026
6 wijzigingen
v1.14.2
- Nieuw Migratie 026 populeert eenmalig data/vendor-state.json met current_version → installed_version per pakket, zodat bestaande deployments naadloos overgaan. Idempotent: skipt records die al een installed_version hadden
- Verbetering Oliepatronen-overzicht sorteert standaard op kolom Naam (oplopend) bij paginalaad. Generieke ondersteuning toegevoegd via data-default-order='[[colIndex, "asc|desc"]]' op .data-table elementen, herbruikbaar voor andere tabellen
- Verbetering config/vendor.php raakt nu nooit meer geschreven door de admin-UI: de "Installeer"-knop schrijft uitsluitend naar data/vendor-state.json. Manifest is daarmee echte declaratieve config en blijft schoon in git
- Fix Dashboard-filters (seizoen / periode / competitie): wijzigen van een dropdown navigeerde naar / (de publieke landingspagina) i.p.v. /dashboard, waardoor ingelogde gebruikers de marketing-site te zien kregen. URL is nu /dashboard?season_id=…&period_id=…&competition_id=…
- Fix Vendor-assets: een git pull op de server overschreef voorheen config/vendor.php met de baseline-versie uit dev, waardoor net via /vendor-assets uitgevoerde updates terug naar oud sprongen. data/vendor-state.json (gitignored) is voortaan single source of truth voor installed_version per pakket; vendor_asset() en vendor_sri() lezen state-first met fallback op de baseline
- Beveiliging VendorAssetService.getInstalledVersion() helper toegevoegd als centrale lookup; voorkomt verspreide read-paths van versie-info en vermindert drift tussen UI, helpers en service
Zondag 26 april 2026
20 wijzigingen
v1.13.5
- Nieuw Patroon-detailpagina krijgt drie nieuwe tabs onder de hero: "Composite-view" rendert client-side een gestapelde Chart.js bar-chart van Forward+Reverse olieverdeling per board (39 staafjes, kleuren uit Pattern.ColorScheme); "Forward loads" en "Reverse loads" tonen compacte tabellen van de actieve loadscreens met Index, Bereik (UIStart→UIStop), aantal Loads, Tank, Volume per load, Snelheid (md+), Eind-afstand (lg+)
- Nieuw Oliepatronen-overzicht: drie nieuwe sorteerbare kolommen Distance / Volume / Ratio met data-order voor numerieke sortering. Distance + Volume zichtbaar vanaf md, Ratio vanaf lg. Records zonder waarde sorteren onderaan (data-order=-1) bij oplopend
- Nieuw Pattern.Logo (Kegel-branding) wordt nu apart als bestand opgeslagen onder data/oil-patterns/logos/<guid>.png en op de detail-pagina naast de patroon-naam getoond. Migratie 025 voegt logo_filename kolom toe; bestaande Kegel-records krijgen hun logo via Backfill / Refresh erbij
- Nieuw Lightbox / zoom op patroon-detailpagina: klik op de patroon-afbeelding opent een fullscreen Bootstrap-modal met de originele PNG; sluit met Esc, klik op de afbeelding zelf, of de X-knop. Hover toont een "Klik om te vergroten"-badge
- Nieuw Server-side thumbnail-resize via GD: /oliepatronen/{id}/image accepteert nu ?w=80|160|280|560 voor automatisch geresizede PNG's (origineel ~80 KB → thumbnail ~5-15 KB). Cache onder data/oil-patterns/images/thumbs/<guid>-<w>.png; gehergenereerd zodra origineel verandert. DataTable thumbnails (160px) en dashboard-kaart (280px) profiteren direct van veel snellere paginalaad
- Nieuw Oliepatroon-import via Kegel-URL: admin plakt op /oliepatronen/nieuw één Kegel-pattern-URL en de server haalt automatisch naam, beschrijving, categorie, distance, volume, ratio, volledige Pattern-JSON, PDF én visuele afbeelding op via de publieke Kegel-API
- Nieuw Patroon-detailpagina /oliepatronen/{id}: grote afbeelding, technische gegevens (Tank-config, Volumes, Boards, Pump), keywords en download-knop. Voor admin uitklapbaar de volledige Kegel-JSON. Toegankelijk voor alle ingelogde gebruikers
- Nieuw Thumbnail-kolom op admin /oliepatronen overzicht: ~48px afbeelding maakt 1259+ patronen visueel scanbaar, klikbaar naar de detailpagina
- Nieuw Dashboard "Oliepatroon"-kaart toont nu een 140×80 thumbnail naast de patroon-naam (klikbaar naar detailpagina); valt terug op druppel-icoon als er nog geen afbeelding is
- Nieuw Backfill-knop "Backfill van Kegel" op /oliepatronen: opent modal met progress-bar die in batches van 25 records de bestaande seeded patronen verrijkt met metadata + afbeelding via de Kegel-API. Stop-knop, foutenlijst, geslaagd/mislukt-tellers
- Nieuw Per-record refresh-knop in /oliepatronen actiekolom: ververst metadata + image (en eventueel ontbrekende PDF) voor één Kegel-record vanuit de API
- Verbetering Geen DB-migratie nodig: alle loadscreens / forward-data / reverse-data komen al uit het bestaande kegel_data JSON-blob, en de service.all() returned distance_feet, volume_ml, ratio sinds migratie 024
- Verbetering kegel_data JSON-blob is voortaan ~3.5 KB lichter per record: het Logo-veld wordt vóór opslag gestript en als bestand bewaard. Backfill-filter pakt automatisch records op zonder logo (kegel_data IS NULL OR image_filename IS NULL OR logo_filename IS NULL)
- Verbetering oil_patterns tabel uitgebreid met 8 kolommen (description, category, distance_feet, volume_ml, ratio, image_filename, kegel_data MEDIUMTEXT, imported_at) + ENUM source uitgebreid met "kegel" via idempotente migratie 024
- Fix Oliepatronen-tabel thumbnail (.oil-pattern-thumb-sm): originele Kegel-PNG's zijn portrait (~160×588) maar werden geforceerd in een 56×32 landscape-box met object-fit: cover, waardoor het patroon onleesbaar gecropt werd. Nu gebruiken we object-fit: contain met max-width 40px / max-height 96px zodat de natuurlijke verhouding behouden blijft en het patroon volledig zichtbaar is
- Fix Migratie 024 mislukte met "syntax error near '?'" — MariaDB/MySQL ondersteunt geen placeholders in SHOW COLUMNS LIKE. Kolomnaam wordt nu veilig geescaped en inline ingevoegd (whitelist a-z0-9_) zodat de migratie idempotent kan slagen
- Beveiliging Whitelist op thumbnail-breedtes [80, 160, 280, 560] voorkomt resize-DoS via willekeurige ?w= waarden; transparantie wordt behouden bij PNG-resize
- Beveiliging Kegel-API calls met SSRF-mitigaties: harde host-whitelist (patternlibrary.kegel.net), CURLOPT_FOLLOWLOCATION=false, SSL-verify, timeouts. PNG decode in strict-mode + magic-bytes-check (\x89PNG); PDF magic-bytes-check (%PDF-); max-sizes 1 MB image, 10 MB PDF
- Beveiliging Image-bestanden buiten public-map (data/oil-patterns/images/) en alleen via auth-protected endpoint serveerbaar; gitignored zodat Kegel-images handmatig op de server staan en niet in repo
- Beveiliging Audit-log uitgebreid met events oil_pattern_imported_kegel, oil_pattern_refreshed_kegel, oil_pattern_backfill_started, oil_pattern_backfill_completed voor volledig spoor van Kegel-activiteiten
Zaterdag 25 april 2026
12 wijzigingen
v1.12.3
- Nieuw Oliepatronen-overzicht: tabel is nu sorteerbaar op alle kolommen (Naam, Bron, PDF-status, Gebruik, Actief-status) met DataTables, paginering 25 per pagina, ingebouwde zoekfunctie en Nederlandse labels
- Nieuw Oliepatroon verwijderen: nieuwe rode prullenbak-knop in de actiekolom met bevestigings-dialog. Verwijdert het DB-record én de bijbehorende PDF van schijf; verwijzingen vanuit competities en periodes worden automatisch ontkoppeld (FOREIGN KEY ON DELETE SET NULL). Audit-log noteert oude waarden + of de PDF van schijf is gehaald
- Nieuw Oliepatronen-bibliotheek: admin/bestuur/league_leader kunnen via een zoekbare dropdown een oliepatroon (Kegel-bibliotheek) koppelen aan een competitie en/of periode. Periode-patroon overschrijft het patroon van de competitie. Spelers zien op het dashboard een "Oliepatroon"-kaart met PDF-download voor elke actieve competitie waar ze in spelen
- Nieuw Admin-pagina /oliepatronen: overzicht van ~1259 geseede patronen + filter, status-toggle, PDF-vervang-knop en upload-form voor eigen patronen. Per patroon zichtbaar of de PDF op disk staat én hoeveel competities/periodes het gebruiken
- Nieuw Tom Select toegevoegd aan vendor-bibliotheek: lichte zoekbare dropdown (~36 KB) zodat 1259 patronen instant doorzoekbaar zijn — typ "stone" en je ziet direct Stonehenge, Stone Street, etc.
- Verbetering Dashboard empty-state voor oliepatroon: als de speler in actieve competities zit waarvoor nog géén oliepatroon is ingesteld, verschijnt nu een gele alert "Nog geen oliepatroon bekend" met de namen van die competities en een uitleg dat bestuur/league-leider/wedstrijdleider nog moet instellen. Bij geen actieve competities blijft het dashboard onveranderd
- Verbetering Replace-PDF modals zijn nu buiten de tabel gerenderd zodat ze blijven werken bij DataTables-paginering
- Verbetering Sidebar Beheer-sectie opgesplitst in drie logische groepen: "Beheer" (Gebruikers, Verenigingen, Oliepatronen, Configuratie), "Logs" (NBF upload log, Audit Log) en "Systeem" (Migraties, Vendor-assets, Legacy Import, Changelog) — items binnen elke groep gesorteerd op gebruiksfrequentie en hiërarchie zodat veelgebruikte zaken bovenaan staan
- Verbetering Migraties 022 (oil_patterns tabel + competitions/periods kolommen) en 023 (seed van Kegel-bibliotheek uit database/seeds/oil-patterns-urls.txt) toegevoegd, beide idempotent uit te voeren via /migraties
- Verbetering Response::download() helper toegevoegd in src/Core/Response.php — hergebruikbaar voor PDF/CSV/binary downloads met Content-Disposition: attachment + nosniff + cache-control
- Beveiliging PDF-bestanden van oliepatronen worden buiten de public-map opgeslagen (data/oil-patterns/pdfs/) en uitsluitend via een auth-protected controller-endpoint geserveerd. Iedere download wordt gelogd in de audit-log; PDFs zijn niet hotlinkbaar
- Beveiliging Upload-validatie voor PDF: extensie + MIME-type via finfo + magic-bytes ("%PDF-" header) check, max 10 MB. Atomic write (Windows-veilig: unlink dan rename)
Vrijdag 24 april 2026
21 wijzigingen
v1.11.5
- Nieuw Construction-banner bovenaan de landingspagina: bezoekers zien direct dat het platform nog in ontwikkeling is en deze zomer live gaat — animated rood/goud-gradient strip met cone-striped icoon, schaalt netjes op mobiel
- Nieuw Publieke /privacy en /voorwaarden pagina's: marketing-bezoekers van bowlscore.nl kunnen nu zonder in te loggen de privacyverklaring en algemene voorwaarden lezen, met een uitgebreide concept-tekst conform AVG (categorieën gegevens, grondslagen, bewaartermijnen, rechten, contact)
- Nieuw Changelog publiek toegankelijk: /changelog opent zonder login en past automatisch de juiste layout toe — landing-stijl voor anonieme bezoekers, portaal-stijl voor ingelogde gebruikers
- Nieuw Publieke landingspagina op bowlscore.nl: een sportieve, dynamische marketing-pagina met hero ("Van scorebriefje naar live ranking"), 4 doelgroep-kaarten (Verenigingen, Bestuur, Wedstrijdleiders, Spelers), screenshots-sectie en login-CTA — zichtbaar voor iedereen die naar / surft, ingelogde gebruikers krijgen een "Naar dashboard"-knop
- Nieuw Landingspagina-afbeeldingen: ondersteunt WebP + SVG met placeholders die automatisch invallen tot AI-gegenereerde plaatjes klaar staan; prompts voor hero, dashboard, scoresheet en ranking gebundeld in docs/landing-images.md
- Nieuw Vendor-assets beheer onder /vendor-assets (admin): overzicht van alle front-end libraries (Bootstrap, jQuery, Chart.js, DataTables, Bootstrap Icons, Inter-font) met status, versies en "Check updates"-knop die via jsDelivr de laatste versies ophaalt
- Nieuw Vendor-assets installer: met één klik de huidige of laatste versie van een package downloaden naar /public/assets/vendor/ — inclusief Google Fonts (CSS + woff2) zodat er geen 3rd-party fetches meer nodig zijn
- Verbetering Sidebar herschikking: Scoresheet verhuisd van "Statistieken" naar "Scores", bovenaan boven CSV Import. Het Scores-menu is nu zichtbaar voor álle ingelogde gebruikers (Scoresheet voor iedereen), terwijl CSV Import / Bulk Import / NBF upload nog steeds alleen toegankelijk zijn voor wedstrijdleiders en hoger — gewone leden krijgen dus voortaan ook een Scores-sectie in de sidebar maar zien daarbinnen alleen de Scoresheet
- Verbetering PWA op mobiel opent nu direct het dashboard (of login als niet ingelogd) i.p.v. de marketing-landingspagina — manifest start_url gewijzigd naar /dashboard, plus client-side display-mode-detect op de landing als veiligheidsnet voor iOS/iPadOS
- Verbetering PWA-manifest bijgewerkt: naam BowlingScore → BowlScore, theme_color en background_color afgestemd op de nieuwe donkere landing-kleuren (#1e3a8a / #0b1220) zodat splash-screens en task-switcher consistent ogen
- Verbetering Legal page styling toegevoegd aan landing.css: nette typografie, table-of-contents, callouts, accent-kleuren — zorgt dat juridische teksten leesbaar en professioneel ogen op de marketing-site
- Verbetering Routing-aanpassing: / wijst nu naar de publieke landingspagina, het ingelogde dashboard staat onder /dashboard. Login-redirects en topbar-links wijzen naar /dashboard zodat ingelogde gebruikers direct in het portaal landen
- Fix Landingspagina: <picture>-bronnen verwijzen nu naar PNG (hero.png, screen-dashboard.png, screen-scoresheet.png, screen-ranking.png) i.p.v. WebP — voorkomt 404's op de geüploade PNG-images. SVG-placeholders blijven als onerror-fallback dienen totdat alle PNG's zijn geüpload
- Fix Vendor-assets: na "Installeer" werd het manifest (config/vendor.php) op Windows niet overschreven omdat rename() daar faalt als het doelbestand bestaat — nu eerst unlink + opcache invalidate zodat nieuwe versies direct zichtbaar zijn i.p.v. dat de pagina blijft melden dat er een update beschikbaar is
- Fix Vendor-assets: Inter Google Font versie toonde "vv2024" / "vv77f0a3ef" (dubbele v-prefix) — "v" komt nu alleen nog vanuit het template zodat het netjes als "v2024" en "v77f0a3ef" wordt weergegeven
- Fix PWA meta-tags: apple-mobile-web-app-capable aangevuld met de nieuwe standaard mobile-web-app-capable zodat Chrome/Edge geen deprecation-waarschuwing meer geeft (Apple-versie blijft staan voor iOS-compatibiliteit)
- Fix Service worker cache-versie gebumpt naar v3: lokale vendor-bestanden (onder /assets/vendor/) worden automatisch via stale-while-revalidate gecached zodra de app ze voor het eerst laadt — biedt volledige offline-werking ook voor Bootstrap/jQuery/Chart.js/DataTables/Inter-font
- Beveiliging Layouts (main + auth) laden front-end dependencies nu vanaf de eigen origin i.p.v. cdn.jsdelivr.net en fonts.googleapis.com — volledig AVG-compliant (geen IP-leak naar Google Fonts meer) en immuun voor CDN-supply-chain-aanvallen of DNS-hijacks
- Beveiliging Subresource Integrity-attributen (sha384) op alle vendor <link>/<script>-tags: de browser verifieert elk gedownload bestand en weigert het bij tampering
- Beveiliging SHA-384 integrity-hashes worden per gedownload vendor-bestand opgeslagen in data/vendor-state.json en automatisch gerenderd in de layouts
- Beveiliging Audit-log krijgt nu "vendor_asset_updated" / "vendor_asset_update_failed" entries bij elke installatie/upgrade van een front-end library (oude → nieuwe versie + aantal bestanden)
Donderdag 23 april 2026
17 wijzigingen
v1.9.4
- Nieuw PWA-basis toegevoegd: BowlingScore is installeerbaar op Android en iOS (Toevoegen aan beginscherm), opent standalone zonder browser-chrome, en toont een offline-fallbackpagina bij netwerkfouten — basis voor distributie via Play Store en App Store
- Verbetering Changelog-pagina: entries binnen een dag worden nu gegroepeerd op type (Nieuw → Verbetering → Fix → Beveiliging) i.p.v. door elkaar in de volgorde waarin ze zijn toegevoegd
- Verbetering Dashboard medaille-rijen "overig": outline-stijl (transparante achtergrond met dunne rand) i.p.v. grijs gevuld — voorkomt verwarring met de zilveren medaille
- Verbetering Dashboard: "Gemiddelde per baan" en "Gemiddelde per game" gebruiken nu goud-/zilver-/brons-medailles voor de top-3 gemiddeldes (met gradient-effect) i.p.v. groen (hoogste) / rood (laagste) — geeft een duidelijker rank-gevoel i.p.v. alleen uitschieters te markeren
- Verbetering Mobile-friendly UI-refactor: filter-rijen (Dashboard, Teams, Speeldagen, Gebruikers), actie-knoppen (Competitie-detail, Gebruiker-detail) en klassementsregels in Configuratie stacken nu netjes op mobiel i.p.v. horizontaal te overflowen
- Verbetering Speeldagen-tabel: minder kritieke kolommen (Vereniging, Seizoen, Locatie, Wedstrijden) progressief verborgen op kleinere schermen zodat essentiële info (Dag, Competitie, Datum, Status, Acties) leesbaar blijft op mobiel
- Verbetering Scoresheet mobiel: speler-naam kolom blijft sticky aan de linkerkant tijdens horizontaal scrollen door game-scores, zodat je altijd ziet om wie het gaat
- Verbetering Dashboard Score Verloop grafiek: Y-as schaalt nu automatisch mee met de data (met 15% ademruimte en dynamische stepSize) i.p.v. vaste 0-300 — fluctuaties tussen bv. 150-200 zijn daardoor veel duidelijker zichtbaar
- Verbetering Scoresheet dark-mode: cel-kleuren voor winst (groen), 200+ games (paars), blind (beige) en gelijkspel (geel) flink opvallender gemaakt met hogere verzadiging + witte/donkere tekst voor sterk contrast
- Verbetering Scoresheet dark-mode kleurenblind-vriendelijker: blind krijgt nu een diagonaal streep-patroon (dubbele indicatie: kleur + textuur), gelijkspel is omgezet van geel naar fel oranje voor beter onderscheid van groen-winst bij rood-groen kleurenblindheid, high-score paars en win-groen zijn feller + duidelijker afgetekend
- Fix Cache-busting: asset-URLs (CSS, JS) krijgen nu automatisch een ?v=<app-versie> query-string zodat browsers en service worker nieuwe versies direct ophalen i.p.v. een oude gecachte versie te blijven serveren — voorkomt verwarrende situaties waarbij styling/JS-wijzigingen niet doorkomen tot cache handmatig geleegd wordt
- Fix Service worker cache-versie gebumpt naar v2: oude gecachte assets worden bij eerstvolgende paginalaad geëvicteerd en vervangen door de nieuwe
- Fix PWA-install op login-scherm: manifest- en service-worker-tags nu ook op auth-layout zodat bezoekers de app direct vanaf de loginpagina kunnen installeren (was anders pas beschikbaar na inloggen)
- Fix Beheer-tabellen (Competities, Teams, Spelers, Seizoenen, Gebruikers, Verenigingen) op mobiel: tabellen nu netjes horizontaal scrollbaar binnen een .table-responsive wrapper, met progressief verbergen van minder kritieke kolommen op smalle schermen zodat Naam en Acties altijd zichtbaar blijven
- Fix Scoresheet dark-mode: cel-kleuren (blind, leeg, win, tie, high-score 200+, team-header/totals) zijn nu thema-bewust — in donkere modus worden transparante tinten over de donkere achtergrond gebruikt zodat cijfers leesbaar blijven, in lichte modus blijven de originele pastelkleuren behouden
- Fix Profiel-switcher in topbar op mobiel: naam/rol/vereniging stapelen nu netjes op eigen regels binnen het scherm i.p.v. horizontaal buiten beeld te overflowen
- Fix Profiel-wissel-dropdown (rechtsboven) op mobiel: menu blijft binnen het scherm i.p.v. buiten beeld te vallen, lange profielnamen breken netjes over meerdere regels en het menu is intern scrollbaar wanneer er veel gekoppelde profielen zijn
Woensdag 22 april 2026
36 wijzigingen
v1.8.0
- Nieuw NBF upload log-pagina onder Beheer: volledig overzicht van alle verzendpogingen (geslaagd + mislukt) met filters op competitie, status en datum, HTTP-codes en uitklapbare foutmeldingen
- Nieuw NBF upload: scores per speeldag (of bulk meerdere speeldagen op chronologische volgorde) rechtstreeks insturen naar de NBF (individueleLeague), met per-vereniging API-config (API-key encrypted opgeslagen), per-competitie NBF-league-ID, blinds automatisch overgeslagen en sync-historie met foutafhandeling
- Nieuw Profiel-switcher in topbar: wissel zonder uit te loggen naar een ander account dat aan hetzelfde e-mailadres is gekoppeld
- Nieuw Persoonlijke hoogtepunten op dashboard: 200+ games, topseries (600+/800+) en gemiddelde per baan voor de ingelogde speler
- Nieuw Nieuwe games.lane kolom met crossover-afleiding (baanpaar + home/away + game_number) incl. backfill voor alle bestaande geïmporteerde scores
- Nieuw Gemiddelde per game (1, 2, 3, ...) op dashboard naast gemiddelde per baan — laat zien in welke game je gemiddeld het sterkst bent
- Nieuw Hoogtepunten-pagina voor de hele vereniging: top-10 individuele records, team records, verenigingsmijlpalen en sociale hoogtepunten (most improved, nieuwkomers, streaks), filterbaar per seizoen
- Nieuw Ranking Verenigingen: vergelijk verenigingen onderling per kalenderjaar op gemiddelde score, mijlpaal-games (200+/250+/300), hoogste individuele records, team-totalen (gesplitst 3/4 games) en activiteit
- Nieuw Ranking Individueel & Ranking Teams: extra league-filter — standaard alle leagues, of selecteer één specifieke competitie
- Nieuw Highscores per baan: top-10 hoogste game-scores per baan met filter op seizoen (default actief) of Alle seizoenen, zichtbaar voor alle ingelogde leden onder Statistieken
- Verbetering Ranking Teams: competities op brede schermen twee naast elkaar i.p.v. onder elkaar
- Verbetering Ranking Individueel: competities op brede schermen twee naast elkaar i.p.v. onder elkaar
- Verbetering Gemiddelde per baan: hoogste baan groen en laagste baan rood gemarkeerd voor snelle visuele vergelijking
- Verbetering Hoogtepunten: top-10 hoogste series gesplitst in aparte lijsten voor 3-game en 4-game series zodat kortere series niet meer worden weggedrukt
- Verbetering Hoogtepunten: info-tooltips toegevoegd bij elk record en bij de verenigingsmijlpalen die uitleggen wat het hoogtepunt precies inhoudt
- Verbetering Hoogtepunten: team-totalen (scratch én handicap) gesplitst in 3-game en 4-game competities zodat het vergelijk eerlijk is; nieuwkomers-overzicht verwijderd
- Verbetering Wachtwoord-reset mails: HTML-template met knop en platte-tekst fallback
- Verbetering Dashboard: Recente Games verplaatst naar onderaan de persoonlijke sectie (na Mijn hoogtepunten) zodat de hoogtepunten beter in beeld staan
- Verbetering Dashboard: Score Verloop chart gebruikt nu stappen van 50 op de verticale as i.p.v. elke 10 — veel leesbaarder
- Verbetering Ranking Verenigingen: filter op bowling-seizoen (1 sep → 31 aug, label bv. 2025-2026) i.p.v. kalenderjaar — sluit aan op hoe een competitie-jaar loopt
- Verbetering Sidebar: Hoogtepunten direct onder de Statistieken-header zodat het belangrijkste overzicht bovenaan staat
- Verbetering Dashboard: hoogtepunten-tabellen compacter op mobiel — Game/Baan kolommen verborgen onder 576px, datum op één regel, kleinere score-badges
- Verbetering Dashboard mobiel: Recente Games krijgt dezelfde compacte layout als de hoogtepunten (Game-kolom verborgen op xs, datum op één regel); Gemiddelde per baan/game verbergen Games-kolom onder 576px
- Verbetering Dashboard mobiel: Score Verloop toont alleen de laatste 20 speeldagen onder 576px zodat de x-as leesbaar blijft
- Verbetering Hoogtepunten: mobiele layout verbeterd — compacte tabellen (kleiner lettertype en padding op xs), datums op één regel, minder essentiële kolommen (Competitie/Punten/Wedstrijd/Vorig/Tot-datum) verborgen onder respectievelijk 576px en 768px, kleinere mijlpaal-cijfers op xs
- Verbetering Rankings (Individueel/Teams/Verenigingen): mobiele layout uniform compact — highlights-table styling, Games-kolom verborgen op xs bij individueel, Pinfall/HCP verborgen op xs bij teams, Spelers/Games/per-1000 verborgen bij verenigingen, card-headers wrappen met kleinere titel
- Fix Sidebar: menu is nu intern scrollbaar zodat bij veel items (admin) de onderste opties (Migraties / Legacy Import / Changelog) altijd bereikbaar blijven i.p.v. buiten beeld te vallen
- Fix Mailverzending: nieuwe MailService via SMTP (PHPMailer) met From: noreply@bowlscore.nl — vervangt PHP mail() die niet aankwam
- Fix Wachtwoord-vergeten flow: zelf-service reset verstuurt nu daadwerkelijk een e-mail (was alleen token genereren in DB zonder notificatie)
- Fix Ranking Verenigingen: verenigingsnamen worden nu gedecrypt in plaats van als hashed string getoond
- Fix Topbar mobiel: verenigingsbadge/-switcher toont alleen icoon op smartphones zodat het user-dropdown niet meer buiten beeld valt; paginatitel wordt ingekort met ellipsis
- Fix Dashboard: Score Verloop chart heeft op mobiel een vaste hoogte (260px) zodat hij niet meer minuscuul klein wordt gerenderd
- Beveiliging Auditlog uitgebreid met wachtwoord-reset acties: password_reset_requested (self-service), password_reset_completed (self-service) en password_reset_sent (admin)
- Beveiliging Wachtwoord-reset: expiry voor admin-geïnitieerde resets teruggebracht van 24 uur naar 1 uur (consistent met self-service reset en e-mail-tekst)
- Beveiliging CSV-upload (enkel en bulk): MIME-type validatie via finfo en 5MB size-limit toegevoegd
- Beveiliging Auditlog-dekking uitgebreid: CRUD-acties op Spelers, Speeldagen, Periodes en Configuratie-instellingen worden nu gelogd
Dinsdag 21 april 2026
3 wijzigingen
v1.7.0
- Nieuw Automatische herberekening van handicap, punten en totalen voor latere speeldagen na een score-import (in dezelfde transactie)
- Nieuw Beheerpagina: competitie herberekenen vanaf datum, zonder nieuwe CSV-upload
- Verbetering Persist-logica verhuisd van ScoreController naar ScoreImportService zodat import en herberekening dezelfde code hergebruiken
Maandag 20 april 2026
13 wijzigingen
v1.6.0
- Nieuw Speeldag wordt automatisch aangemaakt bij score import op basis van datum in CSV
- Nieuw Gedeactiveerde gebruikers kunnen weer geheractiveerd worden door admin
- Nieuw Legacy import: competities, teams en team-leden importeren uit oude database SQL-dumps met rapportage van niet-gevonden NBF-nummers (incl. CSV-download)
- Nieuw Bulk score import: meerdere CSV-bestanden tegelijk uploaden, automatisch op datum gesorteerd, in één transactie verwerkt
- Verbetering Speeldag selectie verwijderd uit score import formulier
- Verbetering Datums in de hele UI weergegeven in Nederlands formaat dag-maand-jaar (bv. 20-04-2026)
- Verbetering Score import: team_id wordt nu afgeleid uit team_players (NBF-based) i.p.v. teamnaam; import blokkeert met duidelijke foutmelding als een speler niet in een team van de competitie zit
- Verbetering Bulk score import: pre-validatie vóór transactie toont alle fouten per bestand op één gestructureerde pagina (i.p.v. stoppen bij het eerste falende bestand)
- Fix Competitieleider kan nu ook scores importeren (geen 403 meer)
- Fix Datum-kolommen in sorteerbare tabellen sorteren weer chronologisch (was alfabetisch op dag-van-maand na overstap naar dag-maand-jaar weergave)
- Fix Dashboard: "Hele seizoen" en "Alle competities" werken nu correct (werd eerder overschreven door auto-selectie van huidige periode/eerste competitie)
- Fix Team naam aanpassen gaf fatal error (Database::execute bestaat niet) — nu vervangen door delete()
- Beveiliging Configuratie pagina alleen toegankelijk voor admin en bestuur
Woensdag 8 april 2026
5 wijzigingen
v1.5.1
- Verbetering Footer blijft altijd zichtbaar onderaan het scherm
- Fix Admin dashboard toont nu correct de verenigingsgegevens
- Fix Nieuwe speeldag knop verborgen op competitie detail voor leden
- Beveiliging Leden zien alleen nog inzien-knoppen, geen bewerk/verwijder acties
- Beveiliging Spelers pagina alleen toegankelijk voor admin en bestuur
Zaterdag 4 april 2026
11 wijzigingen
v1.5.0
- Nieuw Versienummer per dag in changelog
- Nieuw Footer met privacy/voorwaarden links en klikbaar versienummer
- Nieuw Changelog pagina toegankelijk voor alle ingelogde gebruikers
- Nieuw Dashboard filters voor seizoen, periode en competitie
- Nieuw Score chart toont gemiddelde per speeldag
- Nieuw Games automatisch herlinken bij score import na heraanmaken speler
- Nieuw Migratie 018: bestaande wezen-games herlinken op basis van NBF ID
- Nieuw UNIQUE constraint op NBF lidnummer per vereniging (database-niveau)
- Fix Tweede gebruiker aanmaken met zelfde e-mailadres werkt nu correct
- Fix NBF lidnummer uniciteit wordt nu per vereniging gecontroleerd
- Fix Kies-profiel scherm toont nu de verenigingsnaam per profiel
Donderdag 2 april 2026
7 wijzigingen
v1.4.0
- Nieuw Audit logging systeem met viewer onder beheer
- Nieuw Ranking teams pagina met periode filter
- Nieuw Periode filter voor ranking en scoresheet pagina's
- Nieuw Punten opslaan in match_points tabel bij import
- Fix Audit log toont gedecrypte gebruikersnaam en versleutelt IP-adres
- Fix Team ranking kolommen aangepast (Pinfall, HCP, Gem.)
- Fix Team ranking aggregeert nu uit matches tabel
Woensdag 1 april 2026
7 wijzigingen
v1.3.0
- Nieuw Individuele ranking pagina per competitie
- Nieuw Scoresheet viewer met kalender datumpicker
- Nieuw Play position opslaan per game voor correcte scoresheet
- Verbetering Scoresheet filters horizontaal en tabel volle breedte
- Verbetering Login pagina standaard licht thema
- Fix Gemiddelde en blindscore opslaan bij import
- Fix Kalender dropdown z-index boven content
Zaterdag 28 maart 2026
8 wijzigingen
v1.2.0
- Nieuw CSV score import met preview voor QubicaAMF BES X bestanden
- Nieuw Score verwijderen per speeldag
- Nieuw Competitie kolom en filter op teams overzicht
- Fix Gemiddelden met decimalen opslaan, alleen floor voor handicap
- Fix Floor i.p.v. round voor gemiddelden conform NBF reglement
- Fix Score import verbeterd: her-import en foutafhandeling
- Fix Gedeelde e-mailadressen bij CSV import (gezinsleden)
- Beveiliging IDOR bescherming op score import controller
Vrijdag 27 maart 2026
7 wijzigingen
v1.1.0
- Nieuw Periodes binnen seizoenen om speeldagen te groeperen
- Nieuw Web-based migratie runner voor admins
- Nieuw CSV import voor gebruikers met duplicaat detectie
- Nieuw Alle NBF velden toegevoegd aan gebruiker/speler beheer
- Nieuw Multi-vereniging ondersteuning bij gebruiker aanmaken
- Fix CSV import werkt bestaande spelers bij in plaats van overslaan
- Beveiliging Versleuteling van initialen, voorvoegsel, huisnummer, nationaliteit
Donderdag 26 maart 2026
8 wijzigingen
v1.0.1
- Nieuw Donker/licht thema toggle met opslag per gebruiker
- Nieuw Team aanmaken met competitie en speler toewijzing
- Nieuw Bulk speeldagen genereren vanuit datumbereik en weekdagen
- Nieuw Competitie dupliceren functionaliteit
- Nieuw Vereniging filter op seizoen, competitie en speeldag pagina's
- Nieuw Gebruiker aanmaken met rollen en vereniging toewijzing
- Fix Admin ziet nu alle gebruikers ongeacht actieve vereniging
- Fix Dashboard fout bij ontbrekende vereniging opgelost
Woensdag 25 maart 2026
1 wijziging
v1.0.0
- Nieuw Eerste versie van het platform met basis CRUD functionaliteit