TeamApp Admin
Hold
Brugere
Kampe
Spillere
Træninger
Noter
Åbninger
Øvelser
Brugere
Database
Hold
Indlæser…
Coaching Spiller-indhold Træning Kør API tests
Alle brugere
Brugernavn Visningsnavn Rolle Hold Oprettet
Tabeller · diskforbrug
Tabel Rækker Størrelse Sidst opdateret
ℹ️ Flyt spillere bruges ved årgangsskifte og flytter kun de valgte spilleres roster-profil. Kopiér indhold er ikke-destruktiv og lader et nyt hold genbruge fx et eksisterende åbnings-/øvelses-/beach-bibliotek. Kampe, træninger, noter og sæsoner er historik og røres aldrig af nogen af de to.
↓ vælg hvilke spillere der flytter

Vælg et hold for at se spillere.

Vælg et hold i listen for at se detaljer.
🏆 Hvad er TeamApp?

TeamApp er en digital platform til sportshold, der samler coaching, spillerudvikling, træningsplanlægning og taktik på ét sted. Platformen styrker kommunikationen mellem trænere og spillere og giver bedre overblik over holdets udvikling.

Systemet består af to primære brugerflader: Coach-siden (browser-baseret) til trænere og administratorer, og Spiller-appen (PWA) der er optimeret til mobilbrug for spillere.

👥 Roller i systemet
RolleAdgangTypisk bruger
Admin Fuld adgang inkl. brugeradministration og systemindstillinger Systemadministrator
Træner Dashboard, kampe, spillere, træninger, åbninger, tegning Cheftræner
Assistent Fuld adgang til dashboard, kampnoter, spiller-indhold, træning, øvelsesark, tegning, modstander-scouting, styrke/skadeforebyggelse og Beach — men kun læsning i link-bibliotek og ingen adgang til omkostnings-satser/afregning Assistenttræner
Spiller Spiller-appen (PWA): forside, åbninger, kampe, udvikling. Ingen adgang til dashboard, kampnoter, spiller-indhold, træning, øvelsesark, tegning, modstander-scouting eller omkostninger — kun læsning i styrke- & skadeforebyggelse, Beach og link-bibliotek Holdspiller
🛡️ Rettighedsmatrix — hvem må hvad

Assistent har fuld adgang til de daglige coach-værktøjer på linje med træner, men ikke til link-bibliotek eller omkostnings-satser/afregning. Spiller har slet ingen adgang til coach-værktøjerne eller til omkostninger (kun til spiller-appen, samt læsning i Beach og link-bibliotek). Håndhæves to steder: i api.php blokerer requireTraener() skrivekald server-side (assistent slipper igennem, undtagen ved requireTraenerKunIkkeAssistent()-endpoints), og et separat rolle-tjek blokerer al adgang (læsning og skrivning) for spiller til de coach-specifikke endpoints. Siderne selv omdirigerer en spiller væk med det samme (til spiller.html), og deaktiverer skriveknapper for assistent/spiller hvor relevant.

OmrådeAdminTrænerAssistentSpiller
Admin-panel (admin.html)Fuld adgang
Dashboard, kampnoter, spiller-indhold, træning, øvelsesark, tegning, modstander-scoutingFuld adgangFuld adgangFuld adgangIngen adgang
Beach håndboldFuld adgangFuld adgangFuld adgangKun læsning
Styrke & skadeforebyggelse (styrke-skade.html)Fuld adgangFuld adgangFuld adgangKun læsning
Link-bibliotek (links-admin.html)Fuld adgangFuld adgangKun læsningKun læsning
Omkostninger — egne udgifter og profil
Omkostninger — andres udgifter, satser og afregningFuld adgangFuld adgang
Kommentarer og reaktioner (like)Alle + slet andresAlle + slet andresKun egne kan slettesKun egne kan slettes
Spiller-appen (spiller.html)AdgangAdgangAdgangMålgruppen
🔐 Login og adgang

Alle brugere logger ind via login.html med brugernavn og kodeord. Systemet gemmer en JWT-token lokalt og omdirigerer automatisk til den korrekte side baseret på brugerens rolle.

  1. Gå til login.html og indtast brugernavn + kodeord
  2. Systemet validerer og udsteder en JWT-token
  3. Trænere og admins videresendes til dashboard.html
  4. Spillere videresendes til spiller.html (PWA)
  5. Tokens udløber automatisk og kræver nyt login
📱 Coaching-dashboard (dashboard.html)

Hoveddashboardet for trænere. Her oprettes og styres kampe, kampnoter, taktiske åbninger og spillerindhold. Sidebjælken giver hurtig navigation imellem funktioner.

  1. Log ind som træner og åbn dashboard.html
  2. Vælg eller opret en kamp i kampmenuen til venstre
  3. Tilføj taktiske noter, åbninger og spillerobservationer
  4. Del indhold med spillere via "Spiller-indhold" (spiller-admin.html)
  5. Se spillernes reaktioner og kommentarer på delt indhold
👟 Spiller-app (spiller.html)

Den mobilvenlige spiller-app er implementeret som en PWA og kan installeres på spillerens telefon direkte fra browseren uden app store.

  1. Spilleren åbner spiller.html i mobilbrowseren og installerer appen
  2. Forside: Overblik over næste kamp og seneste opslag fra træneren
  3. Åbninger: Taktiske angrebsåbninger med video og tegning
  4. Kampe: Kampforberedelse og evaluering med noter og video
  5. Udvikling: Personlig udviklingsindhold opdelt i kategorier
  6. Refleksion: Personlige refleksioner efter kamp/træning — guidede spørgsmål med hurtigsvar, gemt lokalt på spillerens egen telefon (ingen serveradgang)
  7. Spilleren kan like og kommentere på alt delt indhold
✏️ Taktisk tegneværktøj (tegning.html)

Det interaktive tegneværktøj bruges til at illustrere taktiske spillesekvenser på et baneudsnit. Tegningerne gemmes og kan vedhæftes åbninger.

  1. Åbn tegneværktøjet fra dashboardet eller direkte via tegning.html
  2. Placer spillere (hold A / hold B) på banen med drag & drop
  3. Tegn bevægelses- og pasningslinjer med penselværktøjet
  4. Brug pileredskabet til at vise retning og spillerflow
  5. Gem tegningen – den tilknyttes automatisk den aktuelle åbning
🔍 Modstander-scouting (modstandere.html)

Et scouting-ark pr. modstanderhold, hvor trænerteamet samler observationer før en kamp. Arket er koblet til dashboardet, hvor den aktuelle modstander får et link til sit ark, og noterne kan foldes ud i kampnoter.html under den aktuelle kamp.

  1. Søg i listen efter modstanderholdet, eller opret et nyt ark med holdets navn
  2. Noter typisk forsvarsformation (fx 6-0, 5-1) og angrebsstil
  3. Beskriv farlige spillere og målvogter-tendenser
  4. Tilføj generelle noter til resten af holdet
  5. Arket kan tilgås igen fra dashboardet, når holdet igen møder modstanderen
🏋️ Træningsplanlægning (traening.html)

Træningsmodulet bruges til at planlægge og dokumentere træningssessioner med et struktureret øvelsesbibliotek.

  1. Opret en ny træningssession med dato og titel
  2. Tilføj øvelser fra biblioteket eller opret nye øvelser
  3. Angiv varighed og antal gentagelser per øvelse
  4. Gem sessionen – den er synlig for hele coachingteamet
💪 Styrke & skadeforebyggelse (styrke-skade.html)

Modulet har to faner: et fælles øvelsesbibliotek for hele klubben (delt på tværs af hold) og programmer, som det enkelte hold sammensætter af øvelser fra biblioteket.

  1. Bibliotek: Opret styrke-/skadeforebyggelsesøvelser med kategori, søg og filtrér i det klubfælles bibliotek
  2. Programmer: Sammensæt et program for jeres hold ved at tilføje øvelser fra biblioteket
  3. Programmer er hold-specifikke, mens biblioteket deles af hele klubben
🔗 Link-bibliotek (links.html / links-admin.html)

En kurateret linksamling til håndbold-ressourcer (taktik, Instagram-profiler, regler, videokanaler m.m.), organiseret i op til to niveauer af kategorier. Den offentlige side links.html kræver ikke login — alle (spillere, forældre, trænere) kan browse og søge frit. Administrationen sker via links-admin.html (kræver login som træner/admin — assistent har kun læseadgang her, spiller slet ingen).

  1. Log ind som træner/admin og åbn links-admin.html
  2. Opret hovedkategorier (evt. med billede) og underkategorier under dem
  3. Opret enkelte links manuelt via "+ Nyt link", eller importér mange på én gang via "⬆ Importer links": vælg en mål-kategori, upload en CSV-fil med kolonnerne titel, url og beskrivelse (en skabelon kan downloades i dialogen), gennemse forhåndsvisningen — rækker med manglende felter, ugyldige URL'er eller dubletter (i filen eller allerede i biblioteket) markeres og springes automatisk over — og bekræft importen
  4. Brug "Tjek alle links" periodisk for at finde og rette døde links
  5. Se klik-statistik pr. link for at identificere de mest brugte ressourcer
🔧 Admin-panel (admin.html)

Admin-panelet bruges til systemadministration og er kun tilgængeligt for brugere med admin-rollen.

  1. Overblik: Statistik over alle hold, brugere og data på tværs af systemet
  2. Brugere: Opret, nulstil kodeord, spær/genaktivér og slet brugere og spillere — samt importér en eksisterende spiller som login-bruger
  3. Database: Se diskforbrug og tabelstørrelser for alle tabeller
  4. Skema: Visualiser databaseskemaet — tabeller grupperet i domæner med kolonner og relationer
  5. Hold-værktøjer: Flyt spillere ved årgangsskifte, eller kopiér indhold (åbninger/øvelser) ikke-destruktivt til et andet hold
  6. Hold-røntgen: Se alt tilknyttet data for ét hold i dybden — roster, adgang, sæson, historik og sundhedsadvarsler
🏗️ Systemarkitektur

TeamApp er en serverless-lean webapplikation baseret på statiske HTML/CSS/JS-sider der kommunikerer med en PHP-backend via REST API. Der er ingen build-pipeline – alt deployes direkte som statiske filer.

LagTeknologiDetaljer
FrontendHTML5 · CSS3 · Vanilla JSIngen frameworks. Statiske filer på CDN/webhotel
BackendPHP 8+api.php og admin2.php – REST-endpoints
DatabaseMySQL / MariaDBRelationel database med JOINs og indeksering
AuthJWT (JSON Web Tokens)HS256-signerede tokens, gemt i localStorage
Hostingteamapp.dkWebhotel med PHP og MySQL support
PWAService Worker + Web App ManifestSpiller-appen kan installeres og køre offline
TypografiGoogle FontsOutfit · Space Grotesk · DM Mono
🔑 Autentificering og autorisation

Systemet anvender JWT-baseret autentificering. Login-flowet er:

  1. Brugeren sender brugernavn + kodeord via POST til api.php?action=login
  2. Backend validerer credentials mod databasen (bcrypt-hashet kodeord)
  3. Returnerer JWT-token med payload: { id, navn, rolle, hold_id, exp }
  4. Frontend gemmer token i localStorage.kn_token
  5. Alle efterfølgende API-kald sender token i Authorization: Bearer <token>
  6. Backend validerer signaturen og udløbsdatoen på hvert kald

Token-levetid: Sættes af backend-konfiguration. Fornyelse kræver nyt login.

🔌 API-endpoints

Der er to API-filer: api.php til generel brug og admin2.php til admin-funktioner (kræver admin-rolle i JWT).

EndpointMetodeBeskrivelse
api.php?action=loginPOSTLogin – returnerer JWT token
api.php?action=kampeGETHent kampe for holdet
api.php?action=aabningerGETHent taktiske åbninger
api.php?action=spillereGETHent spillerliste
api.php?action=traeningerGETHent træningssessioner
api.php?action=opret_spillerPOSTOpret ny spillerbruger
admin2.php?action=overblikGETAlle hold med statistik (admin)
admin2.php?action=brugereGETAlle brugere (admin)
admin2.php?action=opret_brugerPOSTOpret ny bruger (admin)
admin2.php?action=reset_kodeordPOSTNulstil kodeord (admin)
admin2.php?action=slet_brugerDELETESlet bruger (admin)
admin2.php?action=hold_spillereGETSpillere-roster for ét hold (admin)
admin2.php?action=flyt_spillerePOSTFlyt udvalgte spillere til andet hold (admin)
admin2.php?action=kopier_indholdPOSTKopiér åbninger/øvelser/beach-indhold til andet hold, ikke-destruktivt (admin)
admin2.php?action=hold_detaljeGETFuldt røntgenbillede af ét hold på tværs af alle moduler (admin)
admin2.php?action=tabel_storrelseGETDatabase-statistik (admin)
api.php?action=link_kategorierGETAlle link-kategorier, hierarkisk (offentligt, ingen auth)
api.php?action=linksGETAlle links, evt. filtreret på kategori/sortering (offentligt)
api.php?action=linkPOSTOpret nyt link, inkl. CSV-import (træner/admin, ikke assistent)
api.php?action=valider_linksGETHTTP HEAD-tjek af alle links – finder døde links (træner/admin)
api.php?action=omkostningerGETHent udgifter for holdet (egne, eller alles for træner/admin)
api.php?action=afregningerGETHent afregninger (træner/admin, ikke assistent)
api.php?action=beach_noterGETHent Beach-noter for holdet
api.php?action=modstandereGETHent modstander-scouting-ark for holdet
api.php?action=fysiske_programmerGETHent holdets styrke-/skadeforebyggelses-programmer
🗄️ Databasestruktur

Databasen er relationel MySQL med hold som central entitet. Al data er hold-isoleret via hold_id-fremmednøgler. Tabellisten herunder hentes live fra databasen (samme kilde som "Database"-siden), så den altid matcher den faktiske struktur.

TabelRækkerSidst opdateret
📱 PWA (Progressive Web App)

Spiller-appen (spiller.html) er implementeret som en PWA og kan installeres på iOS og Android uden en app store.

FeatureImplementering
InstallationWeb App Manifest – ikon, navn, display: standalone
Offline supportService Worker cacher statiske assets
Ikonerteamapp.dk/icons/ – 192px og 512px PNG
Push-notifikationerIkke implementeret (planlagt fremtidig feature)
🔗 Link-bibliotek

Globalt modul uden hold_id – to tabeller: link_kategorier (hierarkisk via selvreferentiel parent_id, max to niveauer) og links (med klik-tæller og manuel sortering).

MekanismeImplementering
Thumbnail-fallbackManuelt uploadet billede → auto-screenshot via thum.io → favicon (onerror-kæde i frontend)
Klik-tællerFire-and-forget POST action=link_klik ved hvert klik på et link
SorteringManuel / mest populære / nyeste / alfabetisk – valgt via sort-parameter
Link-valideringSekventielle HTTP HEAD-requests server-side (cURL, 5s timeout pr. link)
CSV-importRen client-side parsing/validering i links-admin.html (selvskrevet CSV-parser, ingen bibliotek) – dublet-tjek mod eksisterende links, preview før commit, sekventielle kald til det eksisterende POST action=link-endpoint. Ingen nye API-endpoints eller databasetabeller
AdgangrequireTraenerKunIkkeAssistent() på alle skrive-endpoints – assistent har bevidst kun læseadgang til link-biblioteket, i modsætning til resten af coach-værktøjerne
🛡️ Sikkerhed
OmrådeImplementering
Kodeordbcrypt-hashing i PHP (password_hash() / password_verify())
SQL InjectionPDO prepared statements i alle database-queries
XSSAlle brugerinput escaped med htmlspecialchars() og JS esc()
Auth-guardAlle sider validerer JWT lokalt + backend validerer på hvert API-kald
Rolle-checkAdmin-endpoints kræver rolle = 'admin' i JWT-payload
CORSBegrænset til teamapp.dk-domænet
🎯 Brand og designprincipper

TeamApp følger et dark-first designprincip med et markant accent-orange der skaber energi og sportsfølelse. Interfacet er funktionelt frem for dekorativt – data er i centrum.

Kerneprincipper: Klarhed · Hastighed · Fokus · Sportsenergisk

Kilde til sandhed: alle farver og fonte er samlet i design.css (roden). Siderne bruger var(--token) frem for hardcodede værdier. Mørkt er standard (:root); lyst aktiveres via klassen .light<html> og huskes i localStorage['kn_theme']. Fuld reference: docs/design-system.md.

Bløde flader (badges, hover, alerts): --accent-soft, --green-dim, --red-soft. Domæne-tokens (kampnoter/dashboard): --taktik, --spiller, --timeout m.fl. — aliaser oven på grundfarverne.

🌙 Farvepalette – Mørkt tema (standard)

Farverne herunder læses live fra design.css via CSS-variablerne — ændres et token dér, opdateres denne side automatisk.

☀️ Farvepalette – Lyst tema
✍️ Typografi
FontRolleVægteEksempel
Outfit Overskrifter, logoer, tal 400–800 TeamApp
Space Grotesk Brødtekst, navigation, labels 400–700 Coaching platform
DM Mono Kode, tal, tekniske data 400, 500 api.php · JWT
StørrelseBrug
26–36px · Outfit 800Sideoverskrifter og store tal (stat-num)
18–20px · Outfit 700Kortoverskrifter og modaltitler
15–16px · Space Grotesk 600–700Primær tekst, kortnavne
13px · Space Grotesk 400–500Brødtekst, tabelindhold
10–11px · Space Grotesk 600Labels, badges, uppercase metadata
11–12px · DM MonoTekniske værdier, diskforbrug, datoer
🧱 UI-komponenter

Knapper

Badges og tags

Admin Træner Assistent Spiller Taktik Video Udvikling

Alerts

✓ Handling gennemført korrekt
✕ Der opstod en fejl – prøv igen
ℹ Informationsbesked til brugeren
📐 Layout og spacing
ElementSpecifikation
Sidebar bredde260px fast (alle moduler)
Main padding36px 32px (desktop) · 20px 16px (mobil <700px)
Kortradius14–16px (cards) · 10px (knapper/inputs) · 20px (modals)
Kortpadding18–28px afhængig af kontekst
GitterCSS Grid med auto-fill og minmax()
Responsiv breakpoint700px – sidebar skjules, layout skifter til single-column
Transitionsbackground/border/color: .2s ease · transform: .15s
BaggrundsgradientSubtil radial gradient øverst og nederst – accent og blue toner
🖼️ Ikonografi

Ikonerne er linje-baserede SVG'er tegnet på et 24×24-grid med ensartet streg. De arver farve fra teksten (stroke: currentColor) og skalerer frit. De defineres som <symbol>-sprites og bruges via <use href="#icon-…">; stregattributterne sættes af container-klassen (fx .nav-icon i design.css), ikke på selve symbolet.

EgenskabVærdi
Grid24 × 24
Stregtykkelse1.8
Linecap / linejoinround
FarvecurrentColor – arver fra tekst/kontekst
Fyldingen (fill: none)
Brug<svg><use href="#icon-navn"></svg>

Admin-modulets ikonsæt (eksempel på husstilen)

Ikonerne defineres i dag pr. side som inline-sprites (ca. 122 distinkte på tværs af appen; genbrugte ikoner deler bevidst identisk path-data for pixel-perfekt konsistens). En genereret reference med style-spec ligger under docs/icon-sets/. En samlet, central ikon-fil er et muligt næste skridt.

🤖 Oversigt

Projektet har en .claude/-mappe, der udvider Claude Code (og Cowork) med projekt-specifikke værktøjer til udvikling af TeamApp. Der er tre slags — de bruges på hver sin måde:

TypeHvad det erHvordan det startes
SkillViden / fremgangsmåde Claude trækker indAutomatisk, når opgaven matcher
SubagentEn separat Claude, der løser en delopgaveAutomatisk eller ved at nævne navnet
KommandoGenvej til en arbejdsgangDu skriver /navn
🧠 Skills

En skill er en mappe med en SKILL.md, der giver Claude specialiseret viden eller en arbejdsgang. Claude læser den automatisk ind, når din besked matcher skillens triggere — du aktiverer den ikke selv.

Sådan bruger du dem: beskriv bare opgaven. Fx udløser "fejlsøg et PHP-endpoint" web-udvikler, og "prioritér backloggen" udløser projektleder.

🕵️ Subagenter

En subagent er en selvstændig Claude, der kører en afgrænset opgave i sit eget vindue og kun sender resultatet tilbage. Det sparer kontekst og giver den en snæver rolle. Projektets agenter ligger i .claude/agents/:

AgentFormål
frontend-reviewGennemgår og optimerer frontend-design på en side
backend-reviewReviewer api.php / admin2.php — sikkerhed først
pwa-deployTjekker service worker, manifest, cache og deploy
web-testerStatisk sundhedstjek (brudte links, syntaks, PWA)
e2e-testerSkriver og vedligeholder tværgående testcases på tværs af moduler (docs/testcases.md)
ide-generatorBrainstormer nye features + håndboldindhold
design-systemVedligeholder det fælles designsystem (tokens)
docs-syncSynkroniserer dokumentationen i admin.html/CLAUDE.md med koden

Sådan bruger du dem: beskriv opgaven ("reviewer kampnoter.html"), eller nævn agenten direkte ("brug web-tester på hele repoet"). Vil du kun have forslag, så sig "foreslå kun, lav ikke ændringer".

⌨️ Kommandoer

En slash-kommando er en genvej, du selv starter ved at skrive /navn. Den kører en forudskrevet arbejdsgang — ofte ved at kalde en eller flere agenter. De ligger i .claude/commands/:

KommandoGør
/pre-deployFuldt review af ændringer + GO/NO-GO før deploy
/testTeknisk sundhedstjek af repoet (kalder web-tester)
/designVedligehold designsystemet (audit / migrér en side til tokens)
/ny-sideStil en ny rod-HTML-side op efter projektets mønster
/ny-pwaStil en ny undermappe-PWA op (manifest, sw, ikoner, design.css)
/docs-syncSammenlign og synkroniser dokumentationen med koden (kalder docs-sync)

Sådan bruger du dem: skriv kommandoen, evt. med et argument — fx /test kampnoter.html eller /ny-side statistik.html. Uden argument kører de deres standard.

📁 Hvor de ligger
.claude/agents/Subagenter (én .md pr. agent)
.claude/commands/Slash-kommandoer
.claude/skills/Projekt-skills (SKILL.md)

Sådan hænger det sammen: en skill er passiv viden, en subagent er en aktiv proces (kan bruge en skill undervejs), og en kommando er knappen du selv trykker på for at sætte det i gang. Alle tre er værktøjer til at udvikle TeamApp — ikke funktioner i selve appen for trænere og spillere.

🗂️ TeamApp.dk — arkitektur på ét blik

En samling statiske HTML-sider (vanilla JS, ingen build-step) med én fælles PHP-backend mod MySQL. Flere sider er installerbare PWA'er.

17
HTML-sider
2
PHP API'er
6
Standalone apps
8
Claude skills
Hoved-app teamapp.dk
api.php
PHP + MySQL backend · JWT · setupDB()
admin2.php
Admin-API
login.html
JWT auth
index.html
Startside / shell
kampnoter
Live kampnoter
traening
Planlægning
oevelsesark
Øvelsesbibliotek
spiller
Spilleroversigt
dashboard
Trænerdashboard
tegning
Taktiktegning
modstandere
Scouting-ark
styrke-skade
Styrke & skadeforebyg.
links
HUK Links
links-admin
Links-admin
mini-turnering
Turneringsstyring
spiller-admin
Spillerindhold
admin
Generel admin
test
API-testside
404
Fejlside
Standalone egne PWA'er
Beach
Beach håndbold-app
Timer
Interval-timer til træning
Teamgenerator
Generér hold fra spillerliste
Sekvens
Sekvens Timer
Omkostningsgodtgørelse
Udgifter + køreseddel
turnering
Mini-turnering (PWA-version)

Dokumentation

Kampnoter — Brugervejledning v3
Kampnoter — Teknisk spec v3
TeamApp Designmanual
docs/design-system.md
docs/linkbibliotek-spec.md

Infrastruktur

GitHub Actions → FTP deploy
.htaccess (Apache/UnoEuro)
MySQL 8.0 · UnoEuro hosting
JWT (HS256) auth
design.css designsystem

Claude skills · 11

web-udviklerfrontend-designux-ekspert navigationprojektledericon-set web-designagent-browserdesign-taste find-skillsremotion
ℹ️ mini-turnering.html i roden er en redirect-stub til turnering/mini-turnering.html (den vedligeholdte PWA-version) — bevaret for gamle bogmærker, ikke et duplikat.
🗺️ Systemoverblik

Sådan hænger TeamApp sammen — fra bruger til database. Statiske sider taler med én PHP-backend, beskyttet af JWT, og deployes via FTP. Diagrammet følger appens tema.

👥Brugereroller
TrænerAssistentSpillerAdmin
login.html → JWT-token i localStorage
🖥️Frontend — modulerstatisk HTML/JS/CSS · ingen build-step
dashboardkampnoterspillerspiller-admintraeningoevelsesarktegningmodstanderestyrke-skadeadminlinkslinks-admin
BeachTimerTeamgeneratorSekvensturneringOmkostningsgodtgørelse
🎨 design.css — fælles tokens (farver · fonte · mørkt/lyst tema) på tværs af alle sider
PWA-lag
📲PWAinstallerbar · offline
sw.js — network-first, cacher aldrig api.phpmanifest.json
fetch · Authorization: Bearer <JWT> · hold-scoping
🔌API — api.phpPHP · routing via ?action=
Auth: JWT (HS256) · roller: admin / træner / assistent / spiller admin2.php — separat admin-API
SQL (prepared statements)
🗄️Database — MySQL 8 (UnoEuro)auto-migreret via setupDB()
holdbrugerespillerekampenoteraabningeroevelsertraeningermodstanderefysiske_programmeromkostningerlinks
🚀 Deploy-flow
Push til main GitHub Actions FTP-upload UnoEuro /public_html/ teamapp.dk (live)

Ingen staging — main er produktion. config.local.php ligger kun på serveren og overskrives ikke ved deploy. HTML serveres med no-cache, så nye versioner hentes straks.

🗺️ Systemoversigt

TeamApp består af 14 HTML-moduler der tilsammen dækker hele løsningen – fra spillerens mobil-app til administratorens systempanel. Alle moduler deler samme design-system og API-backend.

📊
Admin Panel
admin.html · Kræver admin-rolle
Systemadministration: brugerstyring, databaseoverblik, hold-statistik på tværs af alle hold og data-flytning mellem hold.
Admin
🏆
Coaching Dashboard
dashboard.html · Kræver login
Primært trænerpanel. Opret og administrer kampe, taktiske åbninger, kampnoter og spilanalyser med overblik over holdets aktiviteter.
Træner Assistent
📋
Spiller-indhold Admin
spiller-admin.html · Kræver login
Opret og rediger indhold til spillerne: åbninger, kampanalyser og udviklingsopslag. Kontroller synlighed og deling med spillerne.
Træner
📱
Spiller App (PWA)
spiller.html · Kræver spiller-login
Mobiloptimeret PWA til spillere med fem faneblade: Forside, Åbninger, Kampe, Udvikling og Refleksion. Spillere kan like og kommentere indhold.
Spiller
✏️
Taktisk Tegneværktøj
tegning.html · Kræver login
SVG-baseret tegneapplikation til taktiske diagrammer. Placer spillere, tegn linjer og pile. Gemte tegninger vedhæftes åbninger automatisk.
Træner
🏋️
Træningsplanlægning
traening.html · Kræver login
Planlæg og dokumenter træningssessioner med et struktureret øvelsesbibliotek. Organiser øvelser i sessioner med varighed og gentagelser.
Træner Assistent
📝
Kampnoter
kampnoter.html · Kræver login
Live kampnoter under kampen: taktik-, spiller- og timeout-noter i realtid. Noterne samles på kampen og kan deles med spiller-appen.
Træner Assistent
📄
Øvelsesark
oevelsesark.html · Kræver login
Sammensæt og vis øvelsesark ud fra øvelsesbiblioteket med varighed, gentagelser og beskrivelser – egnet til visning og print ved træning.
Træner Assistent
🔍
Modstander-scouting
modstandere.html · Kræver login
Scouting-ark pr. modstanderhold: forsvarsformation, angrebsstil, farlige spillere og målvogter-tendenser. Kobles til dashboard og kampnoter.
Træner Assistent
💪
Styrke & skadeforebyggelse
styrke-skade.html · Kræver login
Klubfælles øvelsesbibliotek og holdspecifikke programmer til styrke og skadeforebyggelse. Spillere har læseadgang via spiller-appen.
Træner Assistent Spiller (læs)
🔗
Link-bibliotek
links.html · Offentlig
Kurateret linksamling til håndbold-ressourcer i op til to niveauer af kategorier, med søgning, favoritter (localStorage) og "Nyt"-badges. Kræver ikke login – installerbar som egen PWA.
Alle
📥
Link-bibliotek Admin
links-admin.html · Kræver login
Kategori- og linkstyring, CSV-import af mange links på én gang, link-validering (finder døde links) og klik-statistik. Assistent har kun læseadgang; spiller ingen.
Træner
🧪
API Test Panel
test.html · Kræver admin-login
Udviklingsværktøj til at teste API-endpoints direkte i browseren. Send forespørgsler og se råt JSON-svar med syntaksfremhævning.
Admin
🔐
Login
login.html · Offentlig
Fælles loginside for alle brugertyper. JWT-baseret autentificering med automatisk omdirigering til korrekt side baseret på brugerrolle.
Alle
🔗 Modulrelationer og dataflow
Fra modul→ Til modulDatatype
spiller-admin.htmlspiller.htmlÅbninger, kampanalyser og udviklingsopslag deles med spillerne
tegning.htmldashboard.html / spiller-admin.htmlTegninger gemmes og vedhæftes åbninger
traening.htmldashboard.htmlTræningssessioner ses i coaching-overblikket
admin.htmlAlle modulerBrugere og hold administreres centralt – påvirker adgang overalt
login.htmldashboard.html / spiller.htmlJWT-token bruges på tværs af alle moduler til auth
⚙️ Teknisk profil per modul
ModulAPIPWACanvasTema
admin.htmladmin2.phpMørkt + Lyst
dashboard.htmlapi.phpMørkt + Lyst
spiller-admin.htmlapi.phpMørkt
spiller.htmlapi.phpMørkt + Lyst
tegning.htmlapi.phpMørkt
traening.htmlapi.phpMørkt + Lyst
kampnoter.htmlapi.phpMørkt + Lyst
oevelsesark.htmlapi.phpMørkt + Lyst
modstandere.htmlapi.phpMørkt + Lyst
styrke-skade.htmlapi.phpMørkt + Lyst
links.htmlapi.php✓ (manifest-links.json)Mørkt + Lyst
links-admin.htmlapi.phpMørkt + Lyst
test.htmladmin2.php + api.phpMørkt
login.htmlapi.php (login)Mørkt