428 lines
16 KiB
Markdown
428 lines
16 KiB
Markdown
# 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: `frontend` mit Vue, Vite, Pinia und Vue Router.
|
|
- Backend: `backend` mit 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:
|
|
|
|
```text
|
|
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.css`
|
|
- `frontend/src/App.vue`
|
|
- `frontend/src/components/SideMenu.vue`
|
|
- `frontend/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 `#e0ffe0` und 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.
|
|
- 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.
|
|
- `TcStatusBox`
|
|
- Visuell und funktional an `StatusBox.vue` angelehnt.
|
|
- Zuerst mit Mock-/Preview-Daten, spaeter mit API-Daten.
|
|
- `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:
|
|
|
|
```text
|
|
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/Pause` als 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-app` anlegen.
|
|
- Android-Build lauffaehig machen.
|
|
- `TimeClockTheme` mit 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
|
|
|
|
1. OAuth-Deep-Link/Custom-Tab-Flow mit Backend-Konfiguration umsetzen.
|
|
2. Offline-Stempeln mit UI-Anzeige, Konfliktbehandlung und Sync-Status erweitern.
|
|
3. Compose-Screenshot-/Instrumented-Tests fuer Smartphone und Tablet ergaenzen.
|