1 fix — standaard Nederlandse merchants worden voortaan bij elke migrate gesynchroniseerd, ook zonder --seed flag
Bekijk wijzigingen
🏪 Standaard-merchants bij elke install Bug-fix
Bij verse installs waar de install-agent php artisan migrate draaide zonder --seed, ontbrak de Nederlandse standaard-merchantlijst (Albert Heijn, Jumbo, ING, Shell, Netflix, etc.) tot een handmatige db:seed stap. Vanaf v2.1.1 wordt deze lijst via een idempotente migratie automatisch bijgewerkt — zonder bestaande merchants aan te raken (firstOrCreate op normalized_name).
php artisan migrate na de update voegt ontbrekende standaard-merchants toe. Je eigen, handmatig aangemaakte merchants blijven onaangeraakt.
6 wijzigingen — handmatig merchants + logo-upload, uitgebreide categorie-bibliotheek, transactie-detailpagina, compactere global search, plus-knop-fix in importflow, idempotente categorie-sync
Bekijk wijzigingen
🏪 Handmatig merchants toevoegen + logo-upload Nieuwe functie
Tot nu toe ontstonden merchants alleen automatisch tijdens een import. Vanaf v2.1 is er een aparte /merchants/create pagina waar je zelf een merchant kunt invoeren en een logo kunt koppelen via URL óf upload (max 2 MB, PNG/JPG/SVG). Een upload wordt opgeslagen op de public-disk in storage/app/public/merchants en heeft voorrang op een handmatig ingevulde URL.
Het logo-pad wordt door MerchantResource::resolveLogoSource() als relatieve storage/-URL opgeslagen. De bestaande logoUrl-accessor op het Merchant-model resolveert dat automatisch naar een absolute URL voor de ImageColumn in tabellen en de globale zoekresultaten.
php artisan storage:link niet automatisch uit — als je dat nog niet ooit gedaan hebt op je install, doe het één keer na de update zodat de geüploade logo's via /storage/... bereikbaar zijn.
🏷️ Uitgebreidere categorie-bibliotheek Nieuwe functie
De standaard-set is uitgebreid van 11 naar 35 categorieën: 20 top-level (waaronder Sport & Fitness, Vakantie, Cadeaus & Donaties, Onderwijs, Kinderen, Belastingen, Bankkosten, Verzekeringen, Zakelijk) en 15 sub-categorieën onder Boodschappen, Restaurant/Eten, Transport, Wonen, Abonnementen en Inkomen. De iconen-dropdown ging van 14 naar ~45 heroicons, gegroepeerd per thema en doorzoekbaar.
Voor bestaande installs is er een eenmalige migratie die CategorySeeder::sync() aanroept. sync() gebruikt firstOrCreate op (name, parent_id) — bestaande categorieën blijven dus onaangeraakt, alleen ontbrekende defaults worden toegevoegd. Zo blijft één bron van waarheid bestaan voor zowel verse installs als migraties op lopende installs.
php artisan migrate na de update voegt de nieuwe categorieën toe. Je bestaande categorieën worden niet aangeraakt — als je een categorie met dezelfde naam al had, blijft de oude versie met jouw kleur en icoon staan.
👁️ Transactie-detailpagina Nieuwe functie
De transactie-resource had alleen een index- en edit-page. Vanaf v2.1 is er een dedicated view-page met een Filament infolist die datum, bedrag, omschrijving, originele bankregel, rekening, tegenrekening, merchant en categorie netjes weergeeft. Bewerken blijft beschikbaar via de prominente "Bewerken"-knop bovenaan.
De tabel op /transactions heeft een recordUrl die naar deze view-page wijst — klikken op een rij opent dus de detailpagina in plaats van direct het bewerkscherm. Filament's getGlobalSearchResultUrl() kiest automatisch de view-page als die bestaat, dus klikken op een zoekresultaat in de globale zoekbalk landt ook op de view-page.
🔍 Compactere globale zoekfunctie UX-verbetering
De globale zoekbalk dumpte tot nu toe alle matches in één lange lijst. Dat werd onleesbaar zodra een zoekterm honderden transacties raakte. Vanaf v2.1 toont de dropdown maximaal 5 resultaten per resource met een extra "Alle X resultaten bekijken"-entry onderaan die naar de lijstpagina linkt met de query al ingevuld via ?search=....
Implementatie zit in een herbruikbare trait App\Filament\Concerns\WithCompactGlobalSearch die de standaard getGlobalSearchResults() overschrijft. Resources implementeren globalSearchSeeMoreUrl(string $search): string om hun eigen index-route te leveren. Toegepast op Transaction- en MerchantResource.
➕ Plus-knop in importflow Bug-fix
De geanalyseerde-bestanden tabel op /imports/create riep mountAction('createAccount') aan zonder dat de Livewire-page een bijbehorende createAccountAction()-methode had. Resultaat: klik op de plus-knop deed niets — geen modal, geen feedback. Opgelost door de actie alsnog te definiëren; aangemaakte rekening wordt direct geselecteerd voor het corresponderende analyzed bestand.
🌱 Idempotente categorie-sync via migratie Bug-fix
Tot nu toe konden nieuwe default-categorieën alleen via php artisan db:seed in bestaande installs landen — en seeders draaien niet automatisch tijdens een update. Vanaf v2.1 is de seeder-logica geëxtraheerd naar een statische CategorySeeder::sync()-methode die zowel vanuit de seeder als vanuit een migratie wordt aangeroepen.
Resultaat: het CHANGELOG en de seeder hoeven niet langer gesynchroniseerd te worden bij elke nieuwe default-categorie. Toekomstige uitbreidingen werken vanzelf voor zowel verse installs (via db:seed) als lopende installs (via een data-migratie die sync() aanroept).
php artisan migrate.
7 wijzigingen — SNS & Knab PDF-import, vriendelijke 403/404, top-navigation, admin-paneel op root, Vite-beveiligingsupgrade, idempotente demo-seeder, demo-login fix
Bekijk wijzigingen
📄 SNS & Knab PDF-import Nieuwe functie
Naast de bestaande ING-parser zijn er nu volwaardige parsers voor SNS- en Knab-bankafschriften. Bij een upload wordt automatisch herkend van welke bank de PDF afkomstig is op basis van keywords in de tekst — geen instelling vereist.
Knab-detail: de PDF-tekst-extractor verliest de Af/Bij-kolompositie. Debet vs. credit wordt afgeleid uit het keyword Ontvangen in de omschrijving — werkt op alle geteste afschriften.
🎨 Vriendelijke 403 & 404 foutpagina's UX-verbetering
Laravel's standaard "Forbidden" en "Not Found"-pagina's zijn vervangen door BankBird-gestylde varianten met duidelijke uitleg en een terug-knop. Een rauwe error-pagina geeft de indruk dat het systeem kapot is, ook als de oorzaak gewone toegangsregels zijn — die verwarring is nu weg.
De 403 detecteert demo-modus en toont dan "Niet beschikbaar in demo" met dashboard-knop in plaats van een algemene foutmelding.
🧭 Top navigation + page footer UX-verbetering
Het admin-paneel switcht van zijbalk-menu naar een top-navigatie met volledige content-breedte. De vorige sidebar-footer met versie-info is vervangen door een gecentreerde page-footer onderaan elke pagina. Versie-link gaat naar het publieke updates-overzicht in een nieuw tabblad.
🏠 Admin-paneel op root-URL UX-verbetering
Self-hosted installaties tonen het admin-paneel niet langer op /admin maar op de root-URL. Een verse installatie op bankbird.test opent dus direct het dashboard, niet bankbird.test/admin. De marketing-host (bankbird.app) houdt /admin om botsingen met de publieke landingspagina's te vermijden, en de combined-host blijft /dev en /demo gebruiken voor lokale ontwikkeling.
De keuze welke prefix actief is gebeurt centraal in Demo::panelPath() op basis van de host. Alle hardcoded url('/admin/...')-aanroepen in views zijn vervangen door een nieuwe Demo::panelUrl(string $path)-helper die per host het juiste pad samenstelt — admin-banner, sidebar-footer en 404-pagina werken daarmee automatisch op alle deployment-vormen.
bankbird.test/admin verhuizen automatisch naar bankbird.test/ na de update. Oude bookmarks naar /admin/... blijven niet werken — vervang ze door de nieuwe URL of klik gewoon door vanaf de root.
🛡️ Vite 5 → 6 beveiligings-upgrade Beveiliging
Twee moderate npm audit-advisories opgelost: GHSA-4w7w-66w2-5vf9 (Vite path traversal in optimized deps .map handling) en GHSA-67mh-4wv8-2f99 (esbuild dev-server accepteert verzoeken van willekeurige origins). Beide adviezen raken uitsluitend de npm run dev-ontwikkelserver en zijn niet aanwezig in de productie-build.
Gekozen voor de minor-major bump van Vite 5 naar 6 in plaats van de automatische npm audit fix --force (die naar Vite 8 zou springen en ook laravel-vite-plugin naar 3.x zou bumpen). Tailwind v4 via @tailwindcss/vite@4.2.4 bleef ongemoeid en is compatibel met Vite 5/6/7/8. Geïnstalleerde versies: vite@6.4.2, laravel-vite-plugin@1.3.0. npm audit rapporteert nu 0 kwetsbaarheden.
Daarnaast is op /updates een nieuwe sectie "Geavanceerde updates" toegevoegd waar dependency- en beveiligings-advisories permanent worden gepubliceerd, met severity- en status-badges, lekentaal-uitleg en uitklapbare commando's voor ontwikkelaars.
npm install en npm run build na de update om de nieuwe versies binnen te halen.
🌱 Idempotente demo-seeder Bug-fix
De demo-seeder produceerde bij elke php artisan db:seed nieuwe willekeurige bedragen, wat leidde tot duplicate transacties en verschuivende saldi bij re-runs. Opgelost door mt_srand met een vaste seed te gebruiken voor reproduceerbare bedragen, en firstOrCreate op import_hash om dubbele inserts te voorkomen.
Resultaat: de demo-database is nu deterministisch — bij elke seed verschijnen exact dezelfde transacties met exact dezelfde bedragen, en re-runs zijn no-ops in plaats van duplicate-creators. Dit maakt het ook makkelijker om regressies in de demo-data te zien tijdens code-review.
🔑 Demo-login 419-fix op gecombineerde host Bug-fix
Op de gecombineerde lokale host koos het Livewire-update-endpoint de verkeerde database voor demo-form-submits, waardoor de CSRF-token in de demo-database werd gevalideerd tegen de sessie van de productie-database — met een 419-mismatch als gevolg. Opgelost door een Referer-fallback toe te voegen in SwitchDatabaseForCombinedHost: als de host-header geen uitsluitsel geeft, wordt de demo-database gekozen op basis van de oorsprongs-URL van het verzoek.