En plug-and-play kiosk- og adminløsning til vertikale 16:9 infoskærme, nu drevet af Firebase. Kiosken viser overblikket for medarbejdere og gæster, mens adminportalen giver fuld kontrol over data, slides og politikker – alt gemmes i Firestore og billeder placeres i Firebase Storage, så løsningen kan hostes statisk (fx på GitHub Pages).
- Pauseskærm med cyklende fuldskærmsslides, velkomst-overlay og glas-effekt.
- Medarbejderstatus: søg, tjek ind/ud, registrér fravær og noter.
- Gæsteregistrering med krav om NDA/IT-politik og log over besøgende.
- Adminportal (selvstændig webapp) med login, styring af medarbejdere/slides/QR-links og CSV-eksport.
- Realtime-synkronisering via Firestore (enten live-lytning eller fallback med polling).
- Firebase Storage-integration til slides/billeder direkte fra browseren.
- QR-selvbetjening: generer QR-koder til medarbejder- og gæsteflows.
Kiosk (index.html + app.js) ┐ ┌── Firestore (kiosks/<ID>)
├───────┤
Admin (admin.html + admin.js)┘ └── Firebase Storage (screensaver/<ID>)
└── Firebase Auth (E-mail/Password + Anonymous)
firebase-config.jsrummer projektets Firebase-konfiguration (API-key m.m.).local-config.jsdefinerer hvilke Firestore-dokumenter og Storage-mapper kiosken/admin skal arbejde mod.firebase-adapter.jser et tyndt lag oven på Firebase SDK'erne og bruges af både kiosk og admin.- Alle filer er rene HTML/CSS/JS og kan derfor hostes statisk (GitHub Pages, Netlify, Vercel Static osv.).
Guiden er tænkt som “copy-paste” reference til både udviklere og ikke-udviklere. Hvert punkt forklarer hvad du skal gøre, hvor du gør det, og hvorfor det er nødvendigt.
-
Opret et nyt projekt i Firebase Console
- Hvor: https://console.firebase.google.com → “Add project”.
- Hvorfor: Projektet samler Auth, Firestore og Storage under ét ID, som webappen senere refererer til.
-
Tilføj en Web-app til projektet (
</>-ikonet under “Build > Get started”).- Hvor: Projektoversigten → knappen “Web”.
- Hvorfor: Du får den konfigurationsblok (apiKey, authDomain osv.), der skal ind i
firebase-config.js. - Reference: Kopier koden fra trinets popup til
firebase-config.js(se næste hovedafsnit).
-
Aktivér Authentication-udbydere
- Hvor:
Build > Authentication > Sign-in method. - Gør: Aktivér Email/Password (til adminbrugere) og Anonymous (til kiosken).
- Hvorfor: Kiosken logger ind anonymt og har læse-/skriveadgang til ét Firestore-dokument. Admin-portalen bruger email+kode for sikker administration.
- Hvor:
-
Opret minimum én adminbruger
- Hvor:
Authentication > Users > Add user. - Hvorfor: Adminportalen kræver login, før den kan læse/ændre state. Flere admins kan oprettes samme sted.
- Hvor:
-
Opret Cloud Firestore-database
- Hvor:
Build > Firestore Database > Create database(Production mode anbefales). - Hvorfor: Hele kioskens state gemmes i dokumentet
kiosks/<stateDocId>(navne bestemmes ilocal-config.js). - Reference: Efter oprettelsen kan du manuelt tilføje dokumentet
kiosks/subra-hqhvis du vil seed’e tom struktur.
- Hvor:
-
Opsæt Firestore-sikkerhedsregler (eksempel)
- Hvor:
Firestore Database > Rules. - Hvorfor: Sikrer at kun loggede brugere kan læse/ændre state. Justér efter eget behov.
- Eksempelregler:
rules_version = '2'; service cloud.firestore { match /databases/{database}/documents { match /kiosks/{kioskId} { allow read: if true; // kiosken må læse uden login (offentlig skærm) allow write: if request.auth != null; // kræver auth (admin eller anonym kiosk) } } }Ønsker du at begrænse anonyme skriverettigheder yderligere, kan du udvide reglen med
request.auth.token.firebase. sign_in_provider == "anonymous" && request.auth.uid.startsWith("kiosk-")eller lignende.
- Hvor:
-
Aktivér Firebase Storage
- Hvor:
Build > Storage > Get started. - Hvorfor: Slides/uploadede billeder gemmes her. Standardbucket-navnet (
<projekt-id>.appspot.com) bruges ifirebase-config.js.
- Hvor:
-
Opdater Storage-regler (minimum)
- Hvor:
Storage > Rules. - Forslag:
rules_version = '2'; service firebase.storage { match /b/{bucket}/o { match /screensaver/{kioskId}/{allPaths=**} { allow read; // kiosken må hente billeder uden auth allow write: if request.auth != null; // kræver login (admin eller anonym kiosk) } } }- Hvorfor: Forhindrer uautoriserede uploads, men lader slides blive hentet offentligt af kioskvisningen.
- Hvor:
-
Udfyld
firebase-config.js- Hvor: Projektroden → filen
firebase-config.js(kopiérfirebase-config.example.js). - Gør: Indsæt de værdier du modtog i trin 1.2 (
apiKey,authDomain,projectId,storageBucket,messagingSenderId,appId). - Hvorfor: Filen eksponerer
window.SUBRA_FIREBASE_CONFIG, somfirebase-adapter.jslæser ved init.
- Hvor: Projektroden → filen
-
Justér
local-config.js- Gør: Opdatér
stateCollection,stateDocIdogstorageFolder, så de matcher dine Firebase-ruter. - Hvorfor: Disse værdier afgør hvilket Firestore-dokument (fx
kiosks/subra-hq) og hvilken Storage-mappe (screensaver/subra-hq) kiosken/admin læser/skrives til. - Ekstra:
authMode: 'anonymous'betyder, at kiosken logger ind anonymt. Ændr til fx'none'hvis du vil håndtere login manuelt.
- Gør: Opdatér
-
Del konfigurationen med GitHub Pages
firebase-config.jsindeholder ingen hemmeligheder (Firebase Web API keys er offentlige), så filen må gerne ligge i repoet.- Hvis du bruger flere miljøer, kan du have forskellige versioner af
firebase-config.jspå forskellige grene.
-
Lokalt (uden backend)
- Åbn
index.htmlelleradmin.htmldirekte i din browser (evt. vianpx serve .). - Login i admin-portalen med den bruger du oprettede i Authentication → brug portalen til at indtaste rigtige data.
- Kiosken lytter automatisk efter ændringer i Firestore.
- Åbn
-
GitHub Pages
- Commit alle filer (inkl.
firebase-config.jsog justeretlocal-config.js). - Aktivér GitHub Pages (Settings → Pages → Deploy from branch →
main→/root). - Besøg
https://<brugernavn>.github.io/<repo>/for kiosken og.../admin.htmlfor adminportalen. - Firebase Auth og Firestore fungerer direkte fra den statiske hosting, fordi al logik ligger i browseren.
- Commit alle filer (inkl.
Tip: Hvis du vil teste data før GoLive, kan du initialisere Firestore-dokumentet ved at importere
defaults.js-indholdet via adminportalens “Importer JSON”.
Firebase Hosting og flere Firebase-værktøjer kræver Firebase CLI. Installer den globalt og verificér installationen:
npm install -g firebase-tools
firebase --version
Hvis din maskine ikke kan nå npm-registret (fx 403 Forbidden), skal netværksadgangen justeres eller installationen køres fra en maskine med adgang.
-
Synkronisering:
- Kiosk (
app.js) kører realtime-lytning (enableRealtime: true). Kan slås fra ilocal-config.js, hvorefter den poler Firestore hvert 15. sekund. - Admin (
admin.js) gemmer ændringer viafirebaseAdapter.saveState()og lytter live på samme dokument.
- Kiosk (
-
Slides:
- Upload fra admin-portalen sender filen direkte til Storage under
screensaver/<stateDocId>/...og opdaterer download-URL’en i Firestore. Sletning brugerfirebaseAdapter.deleteSlide.
- Upload fra admin-portalen sender filen direkte til Storage under
-
Medarbejdere & gæster:
- Alt data (employees, guests, logs, qrLinks, policyLinks) ligger i samme Firestore-dokument. Eksport (CSV/JSON) hentes direkte fra den lokale state i browseren.
-
Sikkerhed:
- Kun brugere der er logget ind (anonymt eller med email/kode) får lov til at skrive. Finjustér reglerne hvis kun bestemte konti skal have rettigheder til bestemte kiosker.
- Defaults:
defaults.jsindeholder demo-data. De bliver brugt som seed hvis Firestore-dokumentet er tomt. - Temaer: Slides bruger
SLIDE_THEMESiapp.js/admin.js. Tilføj nye entries for flere farvetemaer. - Realtime: Sæt
enableRealtimetilfalseilocal-config.jshvis du vil reducere Firestore-read belastning. - Egne uploads: Udskift
firebaseAdapter.uploadSlideifirebase-adapter.jshvis du ønsker at bruge et andet CDN.
- “Firebase er ikke konfigureret …” → Kontroller at
firebase-config.jser udfyldt og indlæst førfirebase-adapter.js. - “Kunne ikke logge ind anonymt” → Sørg for at Anonymous sign-in er aktiveret i Authentication.
- “permission-denied” i konsollen → Justér Firestore/Storage reglerne så de matcher dine auth-krav.
- Slides vises ikke → Kontroller at Storage-reglerne tillader
allow readfor skærmens mappe, og at download-URL’en findes i Firestore understate.screensaver.slides[].image.
- Ren HTML, CSS og JavaScript uden build-step.
- Firebase SDK (App/Auth/Firestore/Storage) via CDN.
firebase-adapter.jscentraliserer login, realtime-lytning og filupload, så både kiosk og admin deler logik.
Projektet er leveret som eksempel og kan frit videreudvikles internt hos SUBRA.