GUI/Logic/Database
GUI-logikk-DB.md (full spesifikasjon)
GUI-logikk vs. Database-logikk
KRITISK PRINSIPP: UI-struktur skal ALDRI blokkeres av data-lasting
Retningslinjer for stabil UI-rendering uavhengig av datainnhold
FormÄl:
Sikre at brukere ALLTID ser en komplett GUI-struktur UMIDDELBART nÄr de navigerer, selv mens data laster. UI skal aldri vise kun en spinner. Et tomt datasett skal behandles som en gyldig tilstand, ikke som en feil som hindrer rendering av UI.
Bakgrunn:
Brukere forventer at siden laster umiddelbart med layout, navigasjon og struktur - deretter fylles data inn. I dagens logikk blokkeres HELE UI av if (loading) som gjĂžr at siden viser KUN spinner i 5+ minutter. Dette bryter brukeropplevelsen helt. LĂžsningen er "progressive loading":
- Render UI-struktur STRAKS (layout, headers, sidebar, knapper)
- Vis skeleton/placeholder for data-omrÄder
- Fyll data inn etterhvert som den ankommer
Krav til systemdesign:
- UI-struktur skal ALLTID rendres UMIDDELBART - IKKE blokkert av loading
FEIL MĂNSTER (blokkerer UI):
if (loading) {
return <div>Laster...</div>; // â HELE siden forsvinner
}
return <div>{/* full UI */}</div>;
RIKTIG MĂNSTER (progressive loading):
return (
<div>
{/* Layout, header, sidebar - ALLTID synlig */}
<div className="page-header">
<h1>Dashboard</h1>
</div>
<div className="content-area">
{/* Data-omrÄder viser skeleton/placeholder mens loading */}
{loading ? (
<SkeletonLoader /> // Viser form/struktur, ikke tekst
) : (
<DataContent data={rentals} /> // Data fylles inn
)}
</div>
</div>
);
-
Data-omrÄder skal vise skeleton/placeholder - IKKE bare spinner
-
Skeleton skal ha SAMME layout som endelig innhold
- Bruker ser hvor data kommer
-
Opplevelse: "data laster inn" ikke "siden laster"
-
Tre tilstander skal hÄndteres INNENFOR UI, ikke blokkere den
a) Loading-state: Skeleton/placeholder i data-omrÄder b) Error-state: Feilmelding inline (ikke blokkering) c) Empty-state: Informativ melding: "Ingen data funnet for valgt dato. Dette er ikke en feil."
- Datamodellen mÄ stÞtte tomt resultat
UI skal implementere tre tydelige tilstander
a) Loading-state: Vis spinner eller skeleton.
b) Error-state: Vis feilmelding ved tekniske feil (nettverk, timeout, 500-feil).
c) Empty-state: Aktiveres nÄr API svarer tomt datasett. Vis informasjonsboks:
âIngen data funnet for valgt dato. Dette er ikke en feil.â
Prinsipp for utviklere
Prinsipp for utviklere
HOVEDDOKTRIN: Render fÞrst, sÄ last data. Aldri blokkér UI pÄ data.
UI skal vÊre stabil og alltid synlig. Data kan vÊre tomt, laster eller har feil. Hver tilstand hÄndteres innenfor UI-strukturen, aldri ved Ä gjemme siden.
Spesifikke regler:
- â ALDRI:
if (loading) return <Spinner /> - â JA: Render layout + skeletons innenfor
- â ALDRI: Null eller exception fra API nĂ„r 0 rows
- â
JA: Returnér
[]og hĂ„ndtĂ©r i UI - â ALDRI: Skjul hele siden mens data laster
- â JA: Vis struktur med placeholder-data
Standardtekster for tomt datasett
Ingen registrerte hendelser for valgt dato.
Ingen data funnet. Dette er ikke en feil.
Ingen bookinger for valgt filtrering.
PrĂžv en annen dato eller juster filteret.
Konsekvens for videre utvikling
Backend skal aldri kaste feil ved 0 rows.
Frontend skal aldri la rendering avhenge av data-mengde.
Komponenter skal ha definerte tilstander for empty/loading/error.
Dokumentasjonen skal inkluderes i prosjektets arkitektur.
Ansvar og versjonskontroll
Denne filen skal lagres i docs/architecture eller docs/guidelines og oppdateres nÄr nye moduler bygges.
Sist oppdatert: 2025-12-04 Ansvarlig: Owe Stangeland / GKIT Status: CRITICAL - Gjeldende implementering bryter disse reglene
GUI-logikk-DB-kommentarer.md (punkt 1â8)
GUI-logikk vs DB â Kommentarer punkt 1â8
Brukerens logikk:
Brukeren forventer at appen viser hele UI-et uansett, og at mangel pÄ data kun vises som en tom-tilstand.
Utvikler-/database-logikk:
Typisk logikk stopper rendering hvis databasen returnerer null eller 0 rader.
Hovedproblem:
NÄr det ikke finnes data for valgt dato, vises ingenting eller appen feiler.
Krav:
UI skal rendres uansett. âIngen dataâ er ikke en feiltilstand.
LĂžsning:
API og datalag skal returnere tomme objekter/lister i stedet for null eller exception.
UI-tilstander:
Appen mÄ stÞtte loading, error og empty som tre separate tilstander.
Kommunikasjon til utviklere:
Forklar at tomt datasett er en helt normal state og ikke skal stoppe rendering.
Konsekvens:
Konsekvens for videre utvikling
- Alle sider mÄ refaktoreres fra
if (loading) return spinnertil progressive loading - Skeletonscreens mÄ implementeres for alle data-omrÄder
- Loading/Error/Empty states mÄ hÄndteres INNENFOR layout, ikke blokkere det
- API skal ALDRI returnere null - returnér
{ items: [], count: 0 } - Inline error-handling for API-feil (ikke bare ErrorBoundary)
- Standardiserte meldinger for empty-state
IMPLEMENTERINGS-SJEKKLISTE:
- [ ] DashboardHome: Refaktor loading pattern, add skeletons for stats cards
- [ ] BookingsListPage: Add skeleton table while loading
- [ ] CartsPage: Add skeleton grid while loading
- [ ] RevenueReportPage: Add skeleton charts while loading
- [ ] BookingAnalyticsPage: Add skeleton heatmap while loading
- [ ] CartPerformancePage: Add skeleton metrics while loading
- [ ] BookingPage: Render calendar + grid immediately, load data into it
- [ ] Alle Step-komponenter: Render form structure immediately
- [ ] Add SkeletonLoader.tsx component for consistent placeholders
- [ ] Standardize empty-state messages across all pages
- [ ] Add error-state inline (not just boundary)