16 KiB
Android-Frontend Plan
Ziel: Ein funktional und visuell identisches Android-Frontend fuer TimeClock v3, das dieselbe Backend-API nutzt wie das bestehende Vue-Frontend und sich auf Smartphone und Tablet unterschiedlich bedienen laesst.
Ausgangslage
- Bestehendes Web-Frontend:
frontendmit Vue, Vite, Pinia und Vue Router. - Backend:
backendmit REST-API unter/api. - Authentifizierung: JWT per
Authorization: Bearer <token>. - Rollen: normaler Benutzer und Admin, sichtbar in der Navigation.
- Design: helle, sachliche Web-Oberflaeche mit fester Titel-/Navigationsleiste, Statusbereich, dezenten Karten, kompakten Formularen und Bootstrap-aehnlichen Button-Zustaenden.
- Aktuelle Hauptnavigation:
- Buchungen: Wochenuebersicht, Zeitkorrekturen, Urlaub, Krankheit, Arbeitstage, Kalender.
- Export.
- Einstellungen: Persoenliches, Passwort aendern, Zeitwuensche, Zugriffe verwalten, Einladen.
- Verwaltung fuer Admins: Feiertage, Rechte.
- Weitere vorhandene Routen: Eintraege, Statistiken.
Empfohlene technische Basis
Neue App als eigenes Modul neben Web-Frontend und Backend:
mobile-app/
Empfehlung: Kotlin Multiplatform mit Compose Multiplatform fuer Android.
Gruende:
- Native Android-Bedienung und gute Tablet-Unterstuetzung.
- Gemeinsame UI-Patterns fuer Smartphone und Tablet per adaptivem Layout.
- Klare Trennung vom bestehenden Vue-Web-Frontend.
- Gute Erweiterbarkeit, falls spaeter Desktop oder weitere Plattformen relevant werden.
Alternative: React Native oder Expo. Das waere schneller, wenn JavaScript/TypeScript wichtiger ist als native Android-Integration. Fuer diese Codebasis ist die native Kotlin/Compose-Variante langfristig sauberer, weil das Android-Frontend eigenstaendig und nicht als WebView-Klon entstehen soll.
Nicht-Ziele
- Kein WebView, das nur das bestehende Frontend einbettet.
- Keine Backend-Neuentwicklung.
- Keine Veraenderung der fachlichen Regeln ohne separaten Auftrag.
- Keine Vermischung von Android-Code im bestehenden
frontend-Verzeichnis. - Keine freie Neugestaltung der App. Das Android-Design soll die Webversion wiedererkennbar und konsistent nachbilden.
Design-Paritaet zur Webversion
Das Android-Frontend soll von Anfang an mit einem eigenen Compose-Designsystem aufgebaut werden, das die bestehende Webversion uebersetzt statt neu zu interpretieren.
Web-Design als Quelle
Primaere Quellen:
frontend/src/assets/main.cssfrontend/src/App.vuefrontend/src/components/SideMenu.vuefrontend/src/components/StatusBox.vue- Styles in den einzelnen Views, soweit sie fuer konkrete Screens relevant sind.
Zu uebernehmende Merkmale:
- Heller Hintergrund: weiss als App-Hintergrund.
- Textfarbe: schwarz/dunkelgrau.
- Schrift: System-Schrift analog Web (
-apple-system,Segoe UI, Roboto, Arial). Android nutzt entsprechend Roboto/System Default. - Navbar: feste, helle gruenliche Leiste mit
#f0ffec, dezenter Border#e0ffe0und leichtem Schatten. - Seitentitel: kompakte Box mit hellem Hintergrund, grauem Rand und 3 px Radius.
- Karten:
#fafafa, Rand#e0e0e0, Radius 6 px, dezenter Schatten. - Buttons:
- Standard:
#f5f5f5, Rand#ccc, Text#333. - Primary:
#5bc0de, Rand#46b8da, Text weiss. - Success:
#5cb85c, Rand#4cae4c, Text weiss. - Danger:
#d9534f, Rand#d43f3a, Text weiss. - Secondary:
#6c757d, Text weiss.
- Standard:
- Inputs: 1 px Rand
#ddd, 4 px Radius, 8/12 px Innenabstand, Fokusfarbe#5bc0de. - Layout: grosszuegiger horizontaler Rand auf Tablet, kompakter auf Smartphone.
- StatusBox: eigene wiederverwendbare Komponente mit Aktionsbuttons und Statuszeilen.
Android-Designsystem
In der Grundapp sollen diese Bausteine zuerst entstehen:
TimeClockTheme- Farben aus der Webversion.
- Typografie auf Basis der Android-Systemschrift.
- Standard-Abstaende und Radien.
TcScaffold- Gemeinsame App-Shell fuer angemeldete Screens.
- Navbar/Header, Seitentitel, Statusbereich, Content und optional Footer-Ersatz.
TcTopBar- Brand
Stechuhr, aktueller Seitentitel, Benutzerbereich, Logout.
- Brand
TcStatusBox- Visuell und funktional an
StatusBox.vueangelehnt. - Zuerst mit Mock-/Preview-Daten, spaeter mit API-Daten.
- Visuell und funktional an
TcButton- Varianten: default, primary, success, danger, secondary.
- Gleiche Farb- und Randlogik wie Web.
TcCard- Kartencontainer mit Web-Radius, Rand, Hintergrund und Schatten.
TcTextField- Formularfelder mit Web-Input-Stil.
TcSectionMenu- Mobile und Tablet-Varianten der Web-Navigation.
TcLoading,TcError,TcEmptyState- Einheitliche Zustandsanzeigen im Web-Stil.
Design-Validierung
Jede neue Android-Screen-Implementierung soll gegen die Webversion geprueft werden:
- Farben stimmen mit den Web-CSS-Werten ueberein.
- Abstaende und Dichte wirken wie die Webversion, nicht wie ein neues Material-Design.
- Buttons, Karten, Inputs und Tabellen verwenden die gemeinsamen
Tc*-Widgets. - Smartphone und Tablet duerfen unterschiedlich bedient werden, muessen aber klar dieselbe TimeClock-Oberflaeche bleiben.
- Screens werden nicht direkt mit Compose-Material-Defaults gebaut, wenn dadurch das Web-Design verloren geht.
Funktionsumfang Paritaet
Authentifizierung
- Login.
- Registrierung, falls weiterhin mobil erlaubt.
- Passwort vergessen.
- Passwort zuruecksetzen.
- Passwort aendern.
- Session-Wiederherstellung beim App-Start.
- Logout.
- Token sicher speichern, nicht in Klartext-Preferences.
- OAuth/Google pruefen: Fuer Android braucht der bestehende Web-OAuth-Flow wahrscheinlich eine eigene Deep-Link- oder App-Link-Strategie.
Zeiterfassung und Buchungen
- Aktueller Status aus
/time-entries/current-state. - Stempeln ueber
/time-entries/clock. - Laufenden Eintrag anzeigen.
- Wochenuebersicht.
- Zeitkorrekturen.
- Urlaub.
- Krankheit.
- Arbeitstage.
- Kalender.
- Eintraege anzeigen, bearbeiten und loeschen, soweit im Web-Frontend vorhanden.
- Statistiken.
Einstellungen
- Persoenliches Profil.
- Passwort aendern.
- Zeitwuensche.
- Zugriffe verwalten.
- Einladen.
Export
- Exportfunktion analog Web.
- Auf Android muss geklaert werden, ob Dateien direkt heruntergeladen, geteilt oder im System-Dateidialog gespeichert werden sollen.
Admin
- Feiertage.
- Rechte/Rollen.
- Nur sichtbar und erreichbar fuer Admin-Benutzer.
API-Schicht
Die Android-App bekommt eine eigene API-Schicht, die die bestehenden Endpunkte typisiert kapselt.
Vorgeschlagene Struktur:
mobile-app/
composeApp/
src/
commonMain/
kotlin/
api/
auth/
model/
repository/
ui/
util/
androidMain/
kotlin/
API-Aufgaben:
- Basis-URL konfigurierbar machen.
- JSON-Serialisierung zentral definieren.
- Auth-Header automatisch setzen.
- 401 zentral behandeln und Session beenden.
- Fehlertexte aus Backend-Antworten normalisieren.
- Datums- und Zeitzonenlogik konsistent zur Web-App halten.
Navigation
Smartphone
Smartphone-Layout priorisiert schnelle Bedienung mit einer Hand, bleibt aber visuell an der Web-Navigation orientiert.
- Bottom Navigation fuer die wichtigsten Bereiche:
- Buchungen.
- Kalender.
- Export oder Statistik, je nach tatsaechlicher Nutzung.
- Einstellungen.
- Buchungen erhalten eine eigene Unterseite mit Liste oder Tabs:
- Wochenuebersicht.
- Zeitkorrekturen.
- Urlaub.
- Krankheit.
- Arbeitstage.
- Der aktuelle Stempelstatus bleibt prominent oben sichtbar.
- Primaere Aktion
Kommen/Gehen/Pauseals klarer Hauptbutton. - Admin-Funktionen nicht in der Bottom Navigation, sondern unter einem Verwaltungsbereich in Einstellungen oder einem Overflow-Menue.
Tablet
Tablet-Layout nutzt die Breite fuer parallele Navigation und Inhalt und kommt der Webversion am naechsten.
- Permanente Navigation links als Navigation Rail oder Side Drawer.
- Statusbereich dauerhaft im oberen Inhaltskopf.
- Master-Detail-Ansichten, wo sinnvoll:
- Kalender links, Tagesdetails rechts.
- Wochenuebersicht links, Eintragsdetails/Bearbeitung rechts.
- Rollen/Feiertage mit Liste und Detailpanel.
- Keine reine Smartphone-Skalierung auf grosse Breite.
- Dialoge auf Tablet als zentrierte Panels oder seitliche Detailbereiche, nicht als vollflaechige Seiten, sofern der Workflow dadurch klarer bleibt.
Breakpoints
Vorschlag:
- Compact: Smartphone-Portrait und kleine Breiten.
- Medium: grosse Smartphones, Foldables, kleine Tablets.
- Expanded: Tablets im Landscape-Modus.
Die konkrete Entscheidung sollte nicht nur an Pixeln haengen, sondern an Android Window Size Classes.
Screen-Liste
| Web-Route | Android-Screen | Smartphone | Tablet |
|---|---|---|---|
/login |
LoginScreen | Vollbildformular | schmales Formular in ruhigem Layout |
/register |
RegisterScreen | Vollbildformular | Formularpanel |
/password-forgot |
PasswordForgotScreen | Vollbildformular | Formularpanel |
/password-reset |
PasswordResetScreen | Deep-Link-faehig | Deep-Link-faehig |
/bookings/week |
WeekOverviewScreen | Liste/Tagesgruppen | Wochenraster plus Detailbereich |
/bookings/timefix |
TimefixScreen | Formular/Liste getrennt | Liste plus Bearbeitung |
/bookings/vacation |
VacationScreen | Antrag und Verlauf | Kalender/Liste plus Details |
/bookings/sick |
SickScreen | Antrag und Verlauf | Liste plus Details |
/bookings/workdays |
WorkdaysScreen | kompakte Wochenliste | tabellarische Monats-/Wochenansicht |
/calendar |
CalendarScreen | Monatsansicht mit Tagesdetails | Kalender plus Seitenpanel |
/export |
ExportScreen | Filter plus Aktion | Filter links, Ergebnis/Aktion rechts |
/settings/profile |
ProfileScreen | Formular | Formularpanel |
/settings/password |
PasswordChangeScreen | Formular | Formularpanel |
/settings/timewish |
TimewishScreen | Liste/Formular | Liste plus Detail |
/settings/invite |
InviteScreen | Formular/Liste | Verwaltungspanel |
/settings/permissions |
PermissionsScreen | Liste | Liste plus Detail |
/admin/holidays |
HolidaysAdminScreen | Admin-Liste | Tabelle plus Detail |
/admin/roles |
RolesAdminScreen | Admin-Liste | Tabelle plus Detail |
/entries |
EntriesScreen | Liste mit Filtern | Tabelle plus Detail |
/stats |
StatsScreen | Karten/Diagramme untereinander | Dashboard-Raster |
Datenhaltung und Offline-Verhalten
Die erste fachlich nutzbare Android-Version sollte online-first bleiben:
- Kein vollstaendiger Offline-Modus.
- Token und Benutzerprofil lokal speichern.
- Letzten bekannten aktuellen Status optional cachen.
- Bei fehlender Verbindung klare Fehlermeldung und keine riskanten lokalen Buchungen.
Optional spaeter:
- Offline-Warteschlange fuer Stempelaktionen.
- Konfliktbehandlung bei Zeitkorrekturen.
- Lokaler Read-Cache fuer Kalender und Wochenuebersicht.
Sicherheit
- Token im Android Keystore oder ueber eine sichere Storage-Abstraktion speichern.
- Screens mit sensiblen Daten optional gegen Screenshots schuetzen, falls gewuenscht.
- Logout loescht lokale Session vollstaendig.
- API-Basis-URL nicht hart im Code fuer alle Umgebungen fest verdrahten.
- OAuth-Redirects nur ueber erlaubte App-/Deep-Link-Hosts.
Projektphasen
Phase 1: Grundapp und Designsystem
mobile-appanlegen.- Android-Build lauffaehig machen.
TimeClockThememit Farben, Typografie, Abstaenden, Radien und Schatten aus der Webversion.- Grundlegende
Tc*-Widgets: Scaffold, TopBar, StatusBox, Button, Card, TextField, SectionMenu, Loading/Error. - Preview-/Demo-Screens fuer Smartphone und Tablet mit Mock-Daten.
- Adaptive Grundnavigation, aber noch ohne vollstaendige fachliche Implementierung.
- Designabgleich mit Web-Frontend anhand der bestehenden CSS-/Vue-Komponenten.
Akzeptanz:
- App startet auf Emulator/Device.
- Grundshell sieht wie die Webversion aus.
- Smartphone und Tablet haben unterschiedliche Layouts, aber identische visuelle Sprache.
- Neue Screens koennen auf Basis der gemeinsamen Widgets gebaut werden.
Phase 2: API- und Auth-Fundament
- App-Konfiguration fuer API-Basis-URL.
- HTTP-Client, JSON, Fehlerbehandlung.
- Secure Token Storage.
- Auth-Flow: Login, Logout, Session-Wiederherstellung,
/auth/me.
Akzeptanz:
- Login gegen bestehendes Backend funktioniert.
- Geschuetzter Bereich wird nach App-Neustart wiederhergestellt.
- Auth-Screens verwenden bereits die gemeinsamen Design-Widgets.
Phase 3: Shell und adaptive Navigation
- Gemeinsames App-Layout.
- Smartphone: Bottom Navigation plus Unterbereiche.
- Tablet: permanente Navigation plus Inhaltsbereich.
- Rollenbasierte Sichtbarkeit.
- Statusleiste/Statusbereich analog Web-App.
Akzeptanz:
- Smartphone und Tablet zeigen bewusst unterschiedliche Navigation.
- Admin-Menues erscheinen nur fuer Admins.
- Session-Ablauf fuehrt sauber zurueck zum Login.
Phase 4: Kern-Zeiterfassung
- Aktueller Status.
- Kommen/Gehen/Pause ueber
/time-entries/clock. - Laufender Eintrag.
- Wochenuebersicht.
- Eintraege anzeigen.
Akzeptanz:
- Kernworkflow kann mobil vollstaendig genutzt werden.
- Web und Android zeigen danach konsistente Daten.
Phase 5: Buchungs-Workflows
- Zeitkorrekturen.
- Urlaub.
- Krankheit.
- Arbeitstage.
- Kalender.
Akzeptanz:
- Jeder Buchungsbereich deckt die Web-Funktionen ab.
- Tablet nutzt Detailpanels, Smartphone nutzt fokussierte Einzelseiten.
Phase 6: Einstellungen
- Profil.
- Passwort aendern.
- Zeitwuensche.
- Zugriffe verwalten.
- Einladen.
- Kein Export in der Android-App, da laut Entscheidung nicht gewuenscht.
Akzeptanz:
- Alle Nicht-Admin-Web-Funktionen sind mobil verfuegbar.
Phase 7: Admin und Navigation
- Feiertage.
- Rollen/Rechte.
- Menüpunkte für alle bereiche implementieren. mit submenüs arbeiten, wie in der weboberfläche
Akzeptanz:
- Admin-Funktionen sind mobil und auf Tablet sinnvoll bedienbar.
- Nicht-Admins koennen sie weder sehen noch aufrufen.
- Alle Bereiche sind ansteuerbar
Phase 8: Qualitaet
- Unit-Tests fuer API/Repository/Auth.
- UI-Tests fuer Login, Navigation und Kern-Zeiterfassung.
- Manuelle Tests auf Smartphone- und Tablet-Emulator.
- Dark-Mode-Entscheidung treffen: entweder sauber unterstuetzen oder explizit deaktivieren.
- Accessibility pruefen: Touch-Zielgroessen, Kontrast, TalkBack-Beschriftungen.
- Visuelle Regressionen zumindest ueber dokumentierte Screenshots fuer Smartphone und Tablet pruefen.
Implementierungsstand
- Phase 1 umgesetzt: Grundapp, responsives App-Shell-Layout und Web-Farbdesign.
- Phase 2 umgesetzt: Login, Session-Restore, Logout, API-Konfiguration und Token-Store.
- Phase 3 umgesetzt: aktueller Status, Stempeln, laufender Eintrag und Wochenuebersicht.
- Phase 4 umgesetzt: Zeitkorrekturen, Urlaub, Krankheit, Arbeitstage und Kalender.
- Phase 5 umgesetzt: Profil, Passwort, Zeitwuensche, Zugriffe verwalten und Einladen.
- Phase 6 umgesetzt: Admin-Feiertage und Rollen/Rechte.
- Phase 7 umgesetzt: Smartphone-Submenues wie in der Web-Navigation, dynamische Hauptnavigation, Eintraege und Statistiken.
- Phase 8 umgesetzt als erste Qualitaetsschicht: lokale Unit-Tests, Offline-Stempel-Queue, technischer OAuth-/Offline-Plan und erfolgreicher Test-/Buildlauf.
- Export ist in Android aus Navigation und Menues entfernt.
Offene Entscheidungen
- Soll die Android-App nur intern installiert werden oder spaeter in den Play Store? - später im playstore
- Welche Android-Mindestversion ist gewuenscht? 15
- Soll Registrierung in der App erlaubt sein oder nur Login? registrierung
- Soll Google OAuth in Android direkt unterstuetzt werden oder vorerst nur E-Mail/Passwort? oauth
- Soll Stempeln offline moeglich sein? ja
- Welche Export-Zielform ist mobil gewuenscht: Download, Teilen, E-Mail oder System-Dateiauswahl? kein export
- Gibt es bestehende Corporate-Design-Vorgaben ausser dem aktuellen Web-Look? nein
- Soll der Web-Look exakt nachgebaut werden, auch wenn einzelne Material-Android-Konventionen dadurch weniger stark genutzt werden? ja.
Risiken
- OAuth braucht fuer Android eine eigene Redirect-Strategie.
- Datums-/Zeitzonenlogik kann zwischen Web, Backend und Android abweichen, wenn sie nicht frueh getestet wird.
- Tablet-Paritaet braucht eigene Layout-Entscheidungen, sonst entsteht nur eine gestreckte Smartphone-App.
- Backend-Endpunkte muessen fuer alle Web-Funktionen ausreichend dokumentiert oder aus den Controllern abgeleitet werden.
- Wenn die Grundwidgets nicht zuerst stehen, entsteht spaeter schnell ein uneinheitlicher Mix aus Web-Look und Android-Material-Defaults.
Naechster sinnvoller Schritt
- OAuth-Deep-Link/Custom-Tab-Flow mit Backend-Konfiguration umsetzen.
- Offline-Stempeln mit UI-Anzeige, Konfliktbehandlung und Sync-Status erweitern.
- Compose-Screenshot-/Instrumented-Tests fuer Smartphone und Tablet ergaenzen.