Compare commits

433 Commits

Author SHA1 Message Date
Torsten Schulz (local)
d50f78d91d feat(branches): add director assignment status and update overview view
Some checks failed
Deploy to production / deploy (push) Failing after 1m18s
2026-08-31 13:55:05 +02:00
Torsten Schulz (local)
0119048c82 fix(srs): retain scheduled cards after course updates 2026-08-31 12:48:33 +02:00
Torsten Schulz (local)
7ad83f4299 fix(srs): keep directional review cards visible 2026-08-31 11:52:04 +02:00
Torsten Schulz (local)
2515354386 feat(router): prevent redirection from public landing pages on session expiration 2026-08-28 13:37:01 +02:00
Torsten Schulz (local)
db485b7acf Refactor FalukantLandingView.vue: Update content and structure for improved clarity and engagement; enhance styling for better visual appeal. 2026-08-28 13:31:22 +02:00
Torsten Schulz (local)
fcb7e4e705 feat: Update landing pages and SEO content for Bisaya and Falukant
- Enhanced the Bisaya learning landing page with new content and improved layout.
- Added FAQ section to the Bisaya learning page addressing common questions.
- Updated SEO metadata for Bisaya learning and Falukant pages to improve search visibility.
- Revised descriptions and titles in multiple languages for consistency and clarity.
- Improved styling and structure of the Falukant landing page, emphasizing gameplay features and user engagement.
2026-08-28 12:20:52 +02:00
Torsten Schulz (local)
4bcf9041af feat(certificate): add score breakdown and recommendations for certificate progression 2026-08-28 11:50:30 +02:00
Torsten Schulz (local)
89215793ab feat(icons): add SVG icons for various categories including health, education, and politics 2026-08-28 11:18:50 +02:00
Torsten Schulz (local)
fe08433747 feat(vocab): implement SRS pair fingerprinting and deduplicate course-wide SRS items 2026-08-28 09:05:06 +02:00
Torsten Schulz (local)
13aaf8c0f2 feat(bisaya): enhance speaking prompts and practical tasks for lesson 46 2026-08-27 15:21:40 +02:00
Torsten Schulz (local)
3248579529 feat: add A2-B1 course expansion features including listening activities and conversation sessions
- Updated VocabCourseView.vue to display CEFR level for courses.
- Enhanced VocabLessonView.vue with new sections for listening activities and conversation labs, including audio controls and transcript toggling.
- Created migration to add new columns to vocab_course and new tables for conversation sessions and listening activities.
- Implemented models for vocab_conversation_session and vocab_listening_activity.
- Developed scripts to create new A2 and B1 bridge courses with structured lesson plans.
- Documented the A2-B1 expansion plan detailing course structure, learning goals, and assessment criteria.
2026-08-27 15:18:16 +02:00
Torsten Schulz (local)
bb719b3c75 fix(vocab): reject lexical hints paired with sentences 2026-08-27 12:25:43 +02:00
Torsten Schulz (local)
9d0164aa0d feat(vocab): restore manual hard vocabulary removal 2026-08-27 10:42:01 +02:00
Torsten Schulz (local)
0f8142c386 fix(vocab): isolate SRS updates to daily review 2026-08-27 09:47:07 +02:00
Torsten Schulz (local)
df3ce328b4 fix(vocab): count hard trainer mastery by stored term 2026-08-26 14:38:31 +02:00
Torsten Schulz (local)
71f0e15bb7 feat(vocab): refine vocabulary filtering to exclude invalid exercise pairs 2026-08-26 14:05:40 +02:00
Torsten Schulz (local)
4d478df181 feat(exercises): enhance gap exercise creation with contextual prompts and add migration for lesson 43 2026-08-26 12:10:29 +02:00
Torsten Schulz (local)
6708162a62 feat(vocab): improve answer matching by accepting both displayed solutions and individual variants 2026-08-26 11:53:13 +02:00
Torsten Schulz (local)
68470bf576 feat(vocab): update intensive review UI and logic for better user guidance 2026-08-26 10:16:41 +02:00
Torsten Schulz (local)
bac915c328 feat(vocab): add SRS schedule date formatting and update close button text 2026-08-26 09:53:30 +02:00
Torsten Schulz (local)
a481a440c8 feat(vocab): implement upcoming vocabulary review tracking and update UI accordingly 2026-08-25 12:46:19 +02:00
Torsten Schulz (local)
53f00db154 feat(vocab): add intensive review status dialog and related functionality 2026-08-25 12:15:46 +02:00
Torsten Schulz (local)
423fd49cdb feat(bisaya): enhance situational response exercises with keyword hints and minimum match requirements 2026-08-25 11:56:50 +02:00
Torsten Schulz (local)
20960e620c query fix 2026-08-24 15:26:44 +02:00
Torsten Schulz (local)
b8b45cd5ba feat(bisaya): update choice exercise question format and add question number to review 2026-08-24 15:18:36 +02:00
Torsten Schulz (local)
e175eb1436 feat(vocab): enhance choice button styles for improved accessibility and focus visibility 2026-08-24 13:38:41 +02:00
Torsten Schulz (local)
8e72239358 feat(falukant): add noble title level to election eligibility checks and improve election filtering logic 2026-08-24 11:10:17 +02:00
Torsten Schulz (local)
684880a32e feat(politics): implement reconcilePoliticalVacancies endpoint and UI integration for managing political vacancies 2026-08-24 10:40:23 +02:00
Torsten Schulz (local)
d0f4e33fc0 feat(politics): update election scheduling logic to include all unoccupied positions and improve query efficiency 2026-08-24 09:02:55 +02:00
Torsten Schulz (local)
846ba5b3c4 feat(theme): implement Falukant theme with updated styles and components 2026-08-21 14:28:05 +02:00
Torsten Schulz (local)
bb27660f85 feat(vocab): update VocabCourseView styles for improved UI and accessibility 2026-08-21 13:22:42 +02:00
Torsten Schulz (local)
98888a7920 Refactor styles across multiple components to use new color variables
- Updated background and border colors in DashboardWidget, DialogWidget, MessageboxWidget, and TermineWidget to use new CSS variables for consistency.
- Changed button colors in various widgets and dialogs to utilize the new primary color variable.
- Adjusted text colors in VocabCourseView, VocabDictionaryView, and VocabTrainerView to align with the new color scheme.
- Replaced hardcoded colors with CSS variables in multiple components for improved maintainability and theming.
2026-08-21 12:45:03 +02:00
Torsten Schulz (local)
7797d69a20 Refactor styles and improve UI consistency across components
- Updated color variables in styles.scss for a more cohesive color scheme.
- Adjusted padding, margins, and border-radius in AppContent, AppFooter, AppHeader, AppNavigation, AppSectionBar, LoggedInView, and NoLoginView for better spacing and alignment.
- Changed background gradients to solid colors for a cleaner look.
- Enhanced hover effects and button styles for improved interactivity.
- Standardized text colors and borders to align with the new color palette.
2026-08-21 12:05:59 +02:00
Torsten Schulz (local)
62624502e2 feat(vocab): synchronize SRS session progress and update related UI elements 2026-08-21 11:31:30 +02:00
Torsten Schulz (local)
2f4657c0fb feat(vocab): implement daily hard vocab limit handling in practice dialog 2026-08-21 09:03:40 +02:00
Torsten Schulz (local)
ad02dd006f feat(vocab): add hard status management for SRS items and update related logic 2026-08-20 15:17:11 +02:00
Torsten Schulz (local)
a8a13ac25a feat(politics): update title eligibility messages and logic in PoliticsView 2026-08-19 15:06:44 +02:00
Torsten Schulz (local)
4cacc3c7a7 feat(vocab): add logic to aggregate and clean up duplicate SRS items based on answer patterns 2026-08-19 14:14:50 +02:00
Torsten Schulz (local)
2703227a17 feat(politics): enhance office application feedback with required title details 2026-08-19 13:38:29 +02:00
Torsten Schulz (local)
b98835d277 feat(vocab): add support for answer alternatives in core patterns and update related logic 2026-08-18 15:11:43 +02:00
Torsten Schulz (local)
f66f150bdc feat(overview): add minimum office status label logic and update related translations 2026-08-18 11:03:46 +02:00
Torsten Schulz (local)
420af99a60 feat(overview): enhance certificate status display with current and minimum values 2026-08-18 07:34:32 +02:00
Torsten Schulz (local)
62dc104211 feat(vocab): remove daily hard marked count and adjust practice logic 2026-08-17 10:39:58 +02:00
Torsten Schulz (local)
25d659e4e2 Auto switch to hard vocabulary 2026-08-17 10:28:13 +02:00
Torsten Schulz (local)
12d33d1c71 feat(admin): enhance region editor layout and adjust styling for better visibility 2026-08-14 14:13:05 +02:00
Torsten Schulz (local)
edb40c9785 feat(admin): implement region renaming functionality and update UI components 2026-08-14 13:50:49 +02:00
Torsten Schulz (local)
a6a1ce7726 feat(admin): add child regions section to map view and update localization 2026-08-14 12:25:29 +02:00
Torsten Schulz (local)
e6f6fc984a feat(admin): implement delete functionality for Falukant regions and update UI components 2026-08-14 09:54:09 +02:00
Torsten Schulz (local)
3f80cc40ff Tageswiederholung verbessert 2026-08-13 11:23:52 +02:00
Torsten Schulz (local)
c77ad79f49 Enhanced handling of hard relearning 2026-08-13 11:03:17 +02:00
Torsten Schulz (local)
0505c5a2c5 Hochzeitsfehler behoben 2026-08-12 12:04:04 +02:00
Torsten Schulz (local)
55810e2e3a Add male toddler character model in GLB format 2026-07-30 09:59:53 +02:00
Torsten Schulz (local)
12985bf3fa feat(optimize): optimize Falukant 3D models during build and update deployment scripts 2026-07-24 13:31:08 +02:00
Torsten Schulz (local)
2b6c747616 feat(falukant): add visibility toggle for settings widget and update navigation labels 2026-07-24 12:00:10 +02:00
Torsten Schulz (local)
5cf6177eb0 refactor(backfill): remove unnecessary timestamp fields from user_param insert query 2026-07-24 11:23:49 +02:00
Torsten Schulz (local)
17b9cf81fd feat(falukant): implement backfill for falukant visual settings and add SQL scripts for default values 2026-07-24 11:19:10 +02:00
Torsten Schulz (local)
5ebcc581f9 feat(falukant): add character visual representation and settings
- Introduced FalukantCharacterVisual component to display character portraits and 3D figures based on user settings.
- Updated DirectorInfo, ChurchView, PoliticsView, and other components to utilize the new character visual component.
- Added visual settings management for users, allowing selection between portrait styles and display modes (portraits, 3D, or both).
- Implemented age rules for engagement and marriage in the backend, ensuring compliance with specified age limits.
- Created a new settings view for Falukant to manage visual preferences.
- Added new images for medieval character portraits.
- Updated translations for new settings and features in multiple languages.
2026-07-24 10:55:19 +02:00
Torsten Schulz (local)
a3f90772a7 Erweitere die Funktionalität zur Verarbeitung von Antwortvarianten; füge Unterstützung für Klammerinhalte und alternative Phrasen hinzu. 2026-07-21 09:20:56 +02:00
Torsten Schulz (local)
a7e0fe1d97 Refactor code structure for improved readability and maintainability; optimize performance across multiple modules. 2026-07-21 09:08:15 +02:00
Torsten Schulz (local)
c564d6decf Section 2 of android native implementation 2026-07-09 08:04:11 +02:00
Torsten Schulz (local)
d481cfd95c Planungen android 2026-07-08 22:28:51 +02:00
Torsten Schulz (local)
244c95502a Planung Android 2026-07-08 22:28:35 +02:00
Torsten Schulz (local)
d4e01e5c27 bisaja fixes 2026-06-19 15:04:12 +02:00
Torsten Schulz (local)
136b654a0a Bisaya fix 2026-06-19 14:56:28 +02:00
Torsten Schulz (local)
4abdc26149 bisaya-kurs korrigiert 2026-06-17 11:23:12 +02:00
Torsten Schulz (local)
718be2fbae Fixed bisaya course 2026-06-15 16:17:02 +02:00
Torsten Schulz (local)
6b2b072ca4 Fehldende messages hinzugefügt 2026-06-09 12:05:10 +02:00
Torsten Schulz (local)
d92963660f bisaya korrigiert 2026-06-06 13:31:44 +02:00
Torsten Schulz (local)
294a38cd2a Bisaya kurs korrekturen 2026-06-06 13:16:04 +02:00
Torsten Schulz (local)
ce31b41d3b feat: verbessere initialTotalDue und begrenze tägliche Übungsanzahl auf MAX_DAILY_DUE 2026-06-04 18:52:20 +02:00
Torsten Schulz (local)
84053df24e feat: repariere initialTotalDue in SRS-Sitzung bei ungültigen Werten und verbessere Fehlerbehandlung 2026-06-04 18:39:49 +02:00
Torsten Schulz (local)
ea11383e8e feat: verbessere SRS-Logik mit Fallback-Mechanismus und Debug-Ausgaben für die Initialisierung 2026-06-04 18:31:01 +02:00
Torsten Schulz (local)
af37a87fb1 feat: füge sicheres Backup des alten Frontends hinzu und verbessere Fehlerbehandlung in normalizePool 2026-06-04 18:20:07 +02:00
Torsten Schulz (local)
5d4ac104c9 feat: verbessere die Pool-Aktualisierung, um SRS-Metadaten bei Verwendung eines initialen Pools abzurufen 2026-06-04 17:28:06 +02:00
Torsten Schulz (local)
e3113f72eb feat: füge Debug-Ausgaben zur Überwachung der Dialogöffnung und Pool-Aktualisierung hinzu 2026-06-04 17:07:38 +02:00
Torsten Schulz (local)
bebbba5fec feat: verbessere SRS-Logik zur Abfrage kursweiter fälliger Items ohne SRS-Modus-Bedingung 2026-06-04 17:03:23 +02:00
Torsten Schulz (local)
323541d694 chore: update package versions and improve code readability
- Bump 'tmp' package version from 0.2.5 to 0.2.6 in package.json
- Change version from 3.0.0-pre-alpha.0.1 to 3.0.0-beta-1.0.0 in package-lock.json
- Update various dependencies in package-lock.json:
  - 'brace-expansion' from 5.0.5 to 5.0.6
  - 'dompurify' from 3.3.3 to 3.4.8
  - 'js-cookie' from 3.0.5 to 3.0.8
  - 'lodash' from 4.17.23 to 4.18.1
- Refactor date range selection in CalendarView.vue for better readability
2026-06-04 14:20:56 +02:00
Torsten Schulz (local)
95b5d8f377 feat: verbessere SRS-Logik zur Bestimmung des nächsten Fälligkeitsdatums für neu erstellte Elemente und erweitere die API-Anfragen für kursweite fällige Items 2026-06-04 14:09:27 +02:00
Torsten Schulz (local)
56a7176c8b feat: aktualisiere SRS-Logik zur Verwendung von konfigurierbaren Zeitfenstern für die Auswahl und Aktualisierung von Elementen 2026-06-04 13:57:13 +02:00
Torsten Schulz (local)
8de86924ad feat: füge Skripte zur Behebung von SRS-Elementen hinzu, die mit next_due_at gleich oder unmittelbar vor created_at erstellt wurden 2026-06-03 17:35:26 +02:00
Torsten Schulz (local)
c72d8dadd7 feat: implement neue SRS-Logik zur Berechnung von Intervallen und füge Diagnoseskript für fällige Items hinzu 2026-06-03 17:13:50 +02:00
Torsten Schulz (local)
22f48238cb feat: verbessere Fehlerbehandlung und optimiere das Laden von Vokabeln im VocabPracticeDialog 2026-06-03 16:50:28 +02:00
Torsten Schulz (local)
96aad4cf34 feat: verbessere SRS-Logik und füge serverseitige Zählung für fällige Items hinzu 2026-06-03 16:39:12 +02:00
Torsten Schulz (local)
7329985999 feat: aktualisiere Stile und verbessere das Layout der Kontomenü-Komponente 2026-05-31 18:38:26 +02:00
Torsten Schulz (local)
abc5f00fd8 feat: erweitere Platzhalter-Titel für Wiederholungs- und Übungslektionen im Bisaya-Kurs 2026-05-28 15:04:14 +02:00
Torsten Schulz (local)
ca740e933f feat: füge Unterstützung für Lagerschaden hinzu und aktualisiere Übersetzungen in mehreren Sprachen 2026-05-27 18:25:40 +02:00
Torsten Schulz (local)
eca35b7f54 feat: erweitere Bisaya-Kursdidaktik um Unterstützung für Phase 5 und füge neue Übungen für Lektionen 44 und 45 hinzu 2026-05-27 18:22:58 +02:00
Torsten Schulz (local)
679856585c feat: aktualisiere Reihenfolge der Skripte in SAFE_SYNC_STEPS für Bisaya-Kurs 2026-05-27 18:09:07 +02:00
Torsten Schulz (local)
4c9f86b29e feat: erweitere Vokabeltrainer um Unterstützung für Checkpoint-Lektionen und verbessere Übungsauswahl 2026-05-27 16:53:32 +02:00
Torsten Schulz (local)
5e9cb95e1b feat: aktualisiere Übersetzungen für "speichern" in mehreren Dateien 2026-05-27 16:38:45 +02:00
Torsten Schulz (local)
e2d93c2c8d feat: füge neue Labels für Trainer-Fortschritt und Versuche in mehreren Sprachen hinzu 2026-05-27 16:30:12 +02:00
Torsten Schulz (local)
544548756f feat: füge Fortschrittsanzeige für die Freischaltung von Übungen hinzu 2026-05-27 16:22:13 +02:00
Torsten Schulz (local)
651be060ea feat: aktualisiere Zahlen und Didaktik im Bisaya-Kurs, ersetze "baynte" durch "kawhaan" 2026-05-27 14:49:44 +02:00
Torsten Schulz (local)
91d559dbb7 feat: erweitere Vokabelkurs mit neuen Zahlen und verbessere Sichtbarkeit der Zahlenreihen 2026-05-27 14:11:55 +02:00
Torsten Schulz (local)
798d9da28b chore: deploy pending backend changes [force-deploy] 2026-05-27 14:01:02 +02:00
Torsten Schulz (local)
c18720fe59 feat: aktualisiere Bedingungen für Backend-Änderungen im Deployment-Skript 2026-05-27 13:58:52 +02:00
Torsten Schulz (local)
eb699c7901 feat: aktualisiere Zahlen und Sprachaufforderungen in bisaya-Kursplan 2026-05-27 13:43:15 +02:00
Torsten Schulz (local)
fdfde41441 Refactor lesson types and update review handling
- Changed lesson type from 'review' to 'weekly_review' in multiple lesson definitions across phase 3 and phase 4 extensions.
- Updated the logic in the vocabService to accommodate 'weekly_review' in various methods, ensuring proper handling of weekly review lessons.
- Modified the VocabLessonView component to recognize 'weekly_review' as a valid lesson type for calculations and access checks.
- Enhanced the didactics update script to include 'weekly_review' in the lesson type checks.
- Adjusted the create scripts to reflect the new lesson type for weekly reviews.
2026-05-27 11:34:03 +02:00
Torsten Schulz (local)
4cde4d0a80 feat: füge Überprüfung der Platzhalteranzahl in Gap-Fill-Übungen hinzu und aktualisiere Beispieltexte 2026-05-27 10:43:21 +02:00
Torsten Schulz (local)
8c83dd9d46 feat: normalize questionData for gap-fill exercises and add placeholders if necessary 2026-05-26 16:24:20 +02:00
Torsten Schulz (local)
a6377e3485 feat: erweitere gap_fill-Übungen, um mehrere Wörter in Referenzen zu unterstützen 2026-05-26 16:09:21 +02:00
Torsten Schulz (local)
7790f9538b feat: füge Unterstützung für temporäre gap_fill-Übungen aus chapterLexemeTraining hinzu 2026-05-26 16:04:36 +02:00
Torsten Schulz (local)
0b480a7889 feat: erweitere _extractTrainerVocabsFromExercises um Optionen zur Steuerung von Lückenfüllungen 2026-05-26 15:40:59 +02:00
Torsten Schulz (local)
9c43616791 feat: erweitere VocabService um Unterstützung für Grammatikübungen aus vorherigen Lektionen 2026-05-26 15:11:01 +02:00
Torsten Schulz (local)
8f0360daae feat: aktualisiere Übungsanzeige, um synthetische Kapitel-MCs auszuschließen 2026-05-26 12:56:50 +02:00
Torsten Schulz (local)
aa3cd4ca77 feat: füge generische Fallback-Übungen hinzu, wenn keine didaktischen Inhalte vorhanden sind 2026-05-26 11:16:16 +02:00
Torsten Schulz (local)
df4be12532 feat: füge Skript hinzu, um 'review: true' in Skripten zu ersetzen und unterstütze einen Dry-Run-Modus 2026-05-26 11:02:29 +02:00
Torsten Schulz (local)
ebc217fefe feat: füge neue Übungen zur Lektion "Kinder, Spiel & Routine" hinzu, einschließlich Lückenfüllung und Satzreihenfolge 2026-05-22 15:15:26 +02:00
Torsten Schulz (local)
c0e41149f3 feat: füge Skript zur Reparatur von Kinderlektionen hinzu, das Platzhalterübungen ersetzt 2026-05-22 11:44:15 +02:00
Torsten Schulz (local)
ad99eca27f feat: erweitere VocabLessonView mit Glossar-Optionen und verbessere die Lückentextformatierung
feat: füge Skript hinzu, um doppelte Muster in Lektionen zu identifizieren
feat: implementiere Skript zur Suche nach Übungen anhand von Text
feat: erstelle Skript zur Reparatur von Multiple-Choice-Antworten
feat: implementiere Skript zum Drucken von Lehrmusterinformationen
2026-05-22 09:43:39 +02:00
Torsten Schulz (local)
ab8b08ca14 fix: entferne redundante Übersetzungen und passe die Sprechaufforderungen an 2026-05-22 08:26:23 +02:00
Torsten Schulz (local)
e064f5603b feat: füge neue Funktionen zur Analyse und Zählung von Lektionen hinzu, einschließlich der Generierung von Lernkontrollpunkten 2026-05-21 16:33:57 +02:00
Torsten Schulz (local)
07b18485b2 feat: erweitere Didaktik-Fragmente und verbessere die Übersetzungen in mehreren Sprachen 2026-05-21 14:45:22 +02:00
Torsten Schulz (local)
77795ceaaa feat(VocabLessonView): verbessere die Lückentextformatierung mit Fallback-Optionen 2026-05-21 13:53:22 +02:00
Torsten Schulz (local)
ee3e528522 feat: Füge Skript hinzu, um problematische Multiple-Choice-Übungen zu identifizieren und zu löschen 2026-05-21 13:47:42 +02:00
Torsten Schulz (local)
fce403562c fix(vocabService): skip multi-word learning items in SRS item processing 2026-05-21 13:23:19 +02:00
Torsten Schulz (local)
20a165b163 fix(update-bisaya-didactics): remove speaking prompts from LESSON_DIDACTICS 2026-05-21 13:16:48 +02:00
Torsten Schulz (local)
da617cf691 refactor(NoLoginView): remove unused RandomChatDialog and clean up login panel 2026-05-21 11:24:41 +02:00
Torsten Schulz (local)
f806e1881e feat: Füge Übersicht über die Auswirkungen von Liebschaften in mehreren Sprachen hinzu und entferne die Titel-Effekte-Karte aus FamilyView 2026-05-21 11:19:10 +02:00
Torsten Schulz (local)
d71e1243c7 fix(falukant): correct computed block syntax in FamilyView.vue 2026-05-21 11:05:45 +02:00
Torsten Schulz (local)
9cb30e8300 feat: Füge Titel-Effekte und Kosteninformationen für Liebhaber in FamilyView hinzu 2026-05-21 10:52:35 +02:00
Torsten Schulz (local)
58d4203447 backend: accept parenthetical variants in answer checking (use _isEquivalentAnswer) 2026-05-21 10:51:36 +02:00
Torsten Schulz (local)
e1823fe9c0 frontend: treat trailing parenthetical notes as optional in vocab matching 2026-05-21 10:50:15 +02:00
Torsten Schulz (local)
c5b91414c1 feat: Füge Debug-Overlay und Alters-/Geschlechtsanpassungen für 3D-Charaktere hinzu 2026-05-21 09:55:11 +02:00
Torsten Schulz (local)
61368c1109 feat: Füge Lazy-Loading und zusätzliche Props für Character3D-Komponente hinzu 2026-05-21 08:52:25 +02:00
Torsten Schulz (local)
65cc785988 feat: Importiere SRGBColorSpace aus 'three' und passe Export an 2026-05-21 08:39:46 +02:00
Torsten Schulz (local)
9ac4d538aa feat: Automatische Kameraanpassung für bessere Modellansicht und Import von Hemisphärenlicht 2026-05-21 08:33:53 +02:00
Torsten Schulz (local)
a13c4ea260 feat: Anpassung der Kameraposition und Beleuchtung für bessere Darstellung in 3D-Ansichten 2026-05-21 08:28:47 +02:00
Torsten Schulz (local)
833b7bcc14 feat: Füge ResizeObserver hinzu, um Größenänderungen des Containers zu überwachen und die Darstellung anzupassen 2026-05-21 08:21:18 +02:00
Torsten Schulz (local)
13df229ae0 ci: make check-version-against-prod.sh executable 2026-05-20 16:47:18 +02:00
Torsten Schulz (local)
ebf93cfd7d feat: Erweiterung der akzeptierten Antworten im Vokabeltrainer durch Deduplizierung und Variantenaufspaltung 2026-05-20 16:10:57 +02:00
Torsten Schulz (local)
04204d7f35 feat: Erweiterung der Antwortvarianten für Vokabelübungen zur Unterstützung von Alternativen und Phrasen 2026-05-19 11:24:01 +02:00
Torsten Schulz (local)
81f4669d71 feat: Erweiterung der Bisaya-Kursinhalte um neue Lektionen und Aktualisierung der Titel in den didaktischen Feldern 2026-05-19 11:04:52 +02:00
Torsten Schulz (local)
3d89b13a96 feat: Füge Übungen zu "Gefühle im Alltag" und "Gefühlswortschatz & Reaktionen" hinzu und aktualisiere die Titel für die Sicherheit 2026-05-19 08:50:44 +02:00
Torsten Schulz (local)
b4cab46ba7 feat: Aktualisiere Bisaya-Kursinhalte mit verbesserten Erklärungen und repariere alte Lektionen zu "Gefühle & Emotionen" 2026-05-19 08:46:09 +02:00
Torsten Schulz (local)
42bfd7e208 feat: Update home page notices and privacy information in English, Spanish, and French; add public guides and routing for guides
- Changed beta notice to service notice on home page translations for English, Spanish, and French.
- Updated privacy information to reflect transparency and continuous maintenance.
- Added new public guides content with detailed sections for various topics.
- Implemented routing for guide list and individual guide articles.
- Created new components for displaying guides and articles.
2026-05-18 14:37:04 +02:00
Torsten Schulz (local)
6dc2e48308 fix(home): show only configured OAuth providers in intro copy 2026-05-15 16:05:08 +02:00
Torsten Schulz (local)
efbc746d7a feat: OAuth RFC9207 'iss' support; home: collapse intro by default; i18n: add oauth strings 2026-05-15 15:21:03 +02:00
Torsten Schulz (local)
28d67877af feat(OAuth): add 'iss' parameter to OAuth exchange methods for improved provider handling 2026-05-15 14:58:38 +02:00
Torsten Schulz (local)
074e01bdb7 fix(AccountView): update OAuth user ID retrieval to use user ID instead of hashed ID 2026-05-15 14:43:27 +02:00
Torsten Schulz (local)
71e53d2ffc feat(OAuth): enhance OAuth user handling and add localized messages 2026-05-15 14:30:56 +02:00
Torsten Schulz (local)
a07b2159ef feat(i18n): implement backward-compatible alias for security settings 2026-05-15 14:23:09 +02:00
Torsten Schulz (local)
f83946c8e4 Implement feature X to enhance user experience and fix bug Y in module Z 2026-05-15 14:04:49 +02:00
Torsten Schulz (local)
5680918445 Add OAuth integration for multiple providers and implement user linking
- Created OAuth credentials setup guide for Google, Microsoft, Keycloak, ORY, and ZITADEL.
- Added migration for oauth_identity table to store OAuth identities linked to users.
- Implemented OAuthIdentity model for managing OAuth identities in the database.
- Developed oauthService to handle OAuth login, user creation, and identity linking.
- Created OAuthCallbackView and OAuthUserCallbackView components for handling OAuth responses in the frontend.
- Added error handling and user feedback during the OAuth process.
2026-05-15 13:59:40 +02:00
Torsten Schulz (local)
81c726c24b feat(FalukantService): implement marriage honeymoon pregnancy scheduling logic
- Added a new method to ensure pregnancy scheduling for married couples after the wedding, allowing the system to manage pregnancy due dates effectively.
- Integrated checks for existing pregnancy and relationship flags to prevent duplicate scheduling.
- Updated family retrieval logic to include pregnancy status based on the new scheduling method, enhancing user experience in family management.
2026-05-13 22:07:46 +02:00
Torsten Schulz (local)
ee60a54866 feat(Localization, User Management): add missingUserId translations and enhance user ID handling
- Added translations for the "missingUserId" key in multiple languages to improve user feedback when user ID is not available.
- Updated the user ID handling in the store and WorkerSchedulesView component to ensure proper user identification when sending data to the daemon.
- Enhanced error handling to notify users when the user ID is missing, improving overall user experience.
2026-05-08 11:09:34 +02:00
Torsten Schulz (local)
2537b4f968 feat(Navigation, UserRights, Localization): add worker schedules feature and enhance access control
- Updated navigation structure to include a new section for worker schedules, accessible to specific user roles.
- Introduced a new user right type for 'worker_schedule_read' to manage access permissions effectively.
- Added localization entries for worker schedules in multiple languages, ensuring consistent user experience across the application.
- Created a new route and component for managing worker schedules in the admin panel.
2026-05-08 08:54:17 +02:00
Torsten Schulz (local)
3135698ae0 feat(FalukantService): update election filtering to include future dates and enhance eligibility checks
- Modified the election query to filter for upcoming election dates instead of past ones, ensuring only future positions are considered.
- Added checks for prerequisites in election eligibility, allowing positions without prerequisites to be selectable, improving user experience in the application.
2026-05-08 08:30:03 +02:00
Torsten Schulz (local)
cd3b78c1a5 feat(FalukantService, MessagesDialog): enhance character data handling in notifications
- Added mappings for character titles and genders in the FalukantService to enrich notifications with additional character information.
- Updated the MessagesDialog component to utilize the new title and gender data, improving the display of director names based on their titles and genders.
- Ensured that character names are displayed correctly, enhancing the overall user experience in notifications.
2026-05-08 08:25:36 +02:00
Torsten Schulz (local)
961e8fa5b7 feat(VocabPracticeDialog, VocabCourseView): implement event dispatch for hard vocabulary changes
- Added event dispatching for 'yourpart:hardvocab:changed' in both VocabPracticeDialog and VocabCourseView components to notify changes in hard vocabulary items.
- Implemented event handling in VocabCourseView to refresh the hard vocabulary list when the event is triggered, ensuring UI consistency across components.
- Included error handling for environments that do not support CustomEvent, enhancing robustness.
2026-05-07 13:52:49 +02:00
Torsten Schulz (local)
d6a2909dd7 feat(Director): add autoAdjustIncome feature and enhance director data handling
- Introduced a new boolean field `autoAdjustIncome` in the Director model to manage income adjustments automatically.
- Updated the FalukantService to include `autoAdjustIncome` in director data responses and settings management.
- Enhanced the DirectorInfo component to allow users to toggle the `autoAdjustIncome` setting.
- Updated internationalization files to include translations for the new feature across multiple languages.
2026-05-07 13:29:09 +02:00
Torsten Schulz (local)
11030a0856 feat(FamilyView): enhance character display and avatar handling
- Refactored character display for spouses, children, and lovers to improve UI consistency and visual appeal.
- Introduced a new method for calculating character avatar styles based on age and gender, enhancing the representation of characters.
- Updated the layout to include compact character media for children and lovers, improving space utilization and readability.
2026-05-07 11:15:23 +02:00
Torsten Schulz (local)
e642e63f80 feat(FalukantService, FamilyView): enhance marriage satisfaction handling
- Added logic to initialize marriage satisfaction to 100 for newly married couples in the FalukantService.
- Updated the FamilyView component to conditionally display marriage satisfaction only for married relationships, improving clarity in the UI.
- Ensured default values are used when marriage satisfaction is not explicitly set, enhancing user experience.
2026-05-07 09:40:58 +02:00
Torsten Schulz (local)
86a12f474a feat(VocabService): enhance logging and error handling in lesson assistant message flow
- Introduced detailed logging throughout the sendLessonAssistantMessage method to track request lifecycle, including start, abort conditions, and response handling.
- Improved error handling for various scenarios such as disabled assistant, unconfigured settings, empty messages, and fetch failures, providing clearer feedback to users.
- Added logging for response parsing and upstream errors to facilitate debugging and improve overall service reliability.
2026-05-07 08:58:22 +02:00
Torsten Schulz (local)
9b0131fb59 feat(VocabPracticeDialog): improve SRS handling for incorrect answers
- Introduced logic to reinsert incorrectly answered items into the SRS queue, allowing them to be reviewed again before the session ends.
- Added a constant for the reinsert offset to control the position of requeued items.
- Updated session management to ensure incorrect answers are not marked as completed, enhancing the learning experience.
2026-05-07 08:46:33 +02:00
Torsten Schulz (local)
e8a6d86551 feat(AppHeader): improve ad display logic and responsiveness
- Enhanced the AppHeader component to support separate ad slots for mobile and desktop views, improving ad display based on viewport width.
- Introduced a responsive design that adjusts ad dimensions and formats for better visibility across different screen sizes.
- Updated methods to dynamically determine the active ad slot and handle viewport resizing events for optimal ad rendering.
2026-05-06 15:53:58 +02:00
Torsten Schulz (local)
983ccf521c feat(VocabService, AppHeader): enhance timeout configuration and update ad display settings
- Updated the VocabService to allow configurable timeout for responses, defaulting to 300 seconds if not set or invalid.
- Modified AppHeader component to change ad format to horizontal and adjusted responsive settings for better display consistency.
- Ensured proper height settings for ad elements to maintain layout integrity across different screen sizes.
2026-05-06 15:50:14 +02:00
Torsten Schulz (local)
2192c564a6 feat(MoneyHistoryView): load branch names for enhanced activity display
- Added a new method to load branch names from the API and map them by ID for better display in money history activities.
- Updated the component's data structure to include a mapping of branch names, improving the clarity of tax-related activity translations.
2026-05-06 13:52:44 +02:00
Torsten Schulz (local)
f6b1901717 feat(FalukantService): add numeric value conversion for money checks
- Introduced a new private method `_toNumericValue` to handle conversion of various input types to numeric values, ensuring proper validation of user money and requirement values.
- Updated `checkMoneyRequirement` method to utilize the new conversion logic, improving accuracy in money requirement checks by handling edge cases for non-finite values.
2026-05-05 08:03:05 +02:00
Torsten Schulz (local)
f49702a654 feat(MoneyHistoryView): enhance activity translation for tax and reputation actions
- Added translation logic for activities related to tax from sales branches and reputation actions in the MoneyHistoryView component.
- Updated internationalization files to include new strings for these activities in multiple languages.
2026-04-30 15:41:00 +02:00
Torsten Schulz (local)
bc4338ea06 feat(update-frontend): enhance environment file handling and add Google AdSense script
- Updated the script to prioritize the root environment file for builds, falling back to the frontend environment file if necessary.
- Added a Google AdSense script to the frontend HTML for improved monetization capabilities.
2026-04-27 16:36:38 +02:00
Torsten Schulz (local)
d53e2cc8a5 feat(Moderation): enhance moderation reporting and user feedback
- Added user blocking checks in authentication and reporting processes, returning appropriate error responses.
- Expanded moderation report functionality to include new target types and optional fields for reports.
- Implemented a new API endpoint to retrieve the count of open moderation reports.
- Enhanced frontend components to allow users to report profiles, images, and guestbook entries, with corresponding UI updates.
- Updated internationalization files to include new strings for reporting features in both German and English.
2026-04-27 15:57:02 +02:00
Torsten Schulz (local)
fd3eb34878 feat(RandomChatDialog): enhance chat reporting functionality
- Added logic to enable the reporting button based on chat state and message presence.
- Introduced a computed property to determine if the chat can be reported.
- Updated the reporting method to accommodate the last partner in case the current partner is unavailable.
- Improved handling of partner details in the reporting payload for better accuracy.
2026-04-27 15:23:48 +02:00
Torsten Schulz (local)
278ed5992d feat(Chat): implement chat incident reporting feature
- Added reportChatIncident method in ChatController to handle reporting of chat incidents.
- Introduced a new API route for reporting incidents in chatRouter.
- Implemented chatService methods to ensure the chat report table is created and to handle incident data storage.
- Enhanced frontend components to allow users to report incidents in both multi and random chat dialogs.
- Updated internationalization files to include new strings for reporting functionality in multiple languages.
2026-04-27 15:00:52 +02:00
Torsten Schulz (local)
a21f0628b6 feat(ModerationReports): enhance moderation reports functionality and UI
- Added topic and forum IDs to moderation report queries for better context.
- Updated admin interface to include links to open reported forum messages.
- Implemented methods to handle opening target messages directly from the moderation reports view.
- Enhanced internationalization support for new UI elements in both German and English.
- Improved scrolling behavior to focus on specific messages when navigating to them.
2026-04-27 14:55:23 +02:00
Torsten Schulz (local)
a37bef74bb feat(Moderation): implement moderation reports feature
- Added moderationRouter to handle moderation-related API routes.
- Introduced new methods in AdminController for fetching all regions, region types, and creating regions.
- Enhanced adminRouter with routes for moderation reports and status updates.
- Updated navigationController to include moderation reports in the admin menu.
- Implemented frontend components for reporting messages in the forum and managing moderation reports.
- Added internationalization support for moderation-related texts in multiple languages.
2026-04-27 14:52:19 +02:00
Torsten Schulz (local)
fdb7d32ea6 feat(FalukantService, CreateBranchDialog): implement dynamic branch cost calculation
- Added new constants and methods in FalukantService to calculate branch action costs based on owned branch types, enhancing the cost management logic.
- Updated the CreateBranchDialog to utilize the new cost calculation, ensuring accurate display of branch creation costs based on user-owned branches.
- Improved the handling of branch type costs, allowing for a more flexible and responsive user experience when creating and upgrading branches.
2026-04-27 14:35:45 +02:00
Torsten Schulz (local)
10c2df8291 feat(VocabPracticeDialog, VocabCourseView): enhance hard vocabulary management and UI
- Refactored methods in VocabPracticeDialog to improve the handling of hard vocabulary items, including the addition of `findMatchingHardKey` and `removeHardEntriesForItem` for better management of hard vocabulary entries.
- Updated the VocabCourseView to display a new section for hard vocabulary items, allowing users to view and remove difficult words easily.
- Enhanced the UI with new styles for the hard vocabulary list, improving user engagement and accessibility to challenging vocabulary practice.
2026-04-26 23:32:18 +02:00
Torsten Schulz (local)
d08f902136 fix(VocabPracticeDialog): adjust dialog dimensions for improved layout
- Increased the width from 55em to 64em and height from 32em to 40em to enhance the visual layout of the VocabPracticeDialog component, providing a better user experience.
2026-04-23 14:25:24 +02:00
Torsten Schulz (local)
b6ea00d917 feat(VocabPracticeDialog): improve vocabulary item normalization and expansion
- Enhanced the normalization process for vocabulary items to better accommodate multiple valid translations, improving the overall accuracy of vocabulary practice.
- Updated methods for expanding vocabulary item alternatives, ensuring a more flexible and effective learning experience for users.
2026-04-23 13:47:21 +02:00
Torsten Schulz (local)
2a94db2896 feat(VocabPracticeDialog): enhance vocabulary item expansion logic
- Added methods to split phrase alternatives and expand pool item alternatives, allowing for better handling of multiple valid translations and maintaining alignment between learning and reference phrases.
- Updated the normalization process to incorporate these new methods, improving the accuracy and flexibility of vocabulary practice sessions.
2026-04-23 13:44:31 +02:00
Torsten Schulz (local)
55fad0a9d9 feat(VocabPracticeDialog): enhance answer variant expansion logic
- Renamed `expandAnswerVariants` to `expandSingleAnswerVariants` for clarity and added a new `expandAnswerVariants` method to handle full-answer alternatives like "A / B".
- Improved the logic to ensure that phrase alternatives are expanded correctly, enhancing the accuracy of answer variant generation during vocabulary practice.
2026-04-23 13:40:08 +02:00
Torsten Schulz (local)
30976bc409 feat(VocabCourseView): add hard vocabulary practice button and refresh logic
- Introduced a button to start hard vocabulary practice when applicable, enhancing user engagement with challenging vocabulary.
- Implemented methods to manage and refresh the hard vocabulary list from local storage, ensuring users have access to their difficult words.
- Added event listeners to refresh the hard vocabulary list on window focus, improving the overall user experience.
2026-04-23 13:10:05 +02:00
Torsten Schulz (local)
cad6b3227d feat(VocabLessonView): enhance vocab trainer visibility for cross-chapter hard vocabulary
- Updated the VocabLessonView to display the vocab trainer section when there are cross-chapter hard vocabulary items, improving user engagement and accessibility to training options.
- Adjusted the button rendering logic to ensure that the hard vocabulary trainer is available when applicable, enhancing the overall learning experience.
2026-04-23 10:04:46 +02:00
Torsten Schulz (local)
ffa4623750 fix(VocabPracticeDialog): adjust success tracking for hard-phase drills
- Updated the success tracking logic to prevent inflating normal success counters during hard-phase drills, ensuring accurate representation of user progress.
- Introduced a condition to separate tracking for hard-phase activities, enhancing the integrity of vocabulary rotation and user experience.
2026-04-22 11:55:40 +02:00
Torsten Schulz (local)
bce52d9bb2 refactor(VocabPracticeDialog): replace hard-coded consecutive correct threshold with constant
- Introduced a constant `HARD_REQUIRED_CONSECUTIVE_CORRECT` to define the required number of consecutive correct answers for hard vocabulary items, improving code maintainability and readability.
- Updated relevant methods to utilize the new constant, ensuring consistent behavior across the component.
2026-04-22 11:51:49 +02:00
Torsten Schulz (local)
b7c5ce0733 feat(localization): add difficult vocabulary marking features in multiple languages
- Introduced new localization strings for marking vocabulary as difficult, including options to save and remove difficult marks.
- Enhanced user experience by providing feedback on the status of difficult vocabulary in Cebuano, Spanish, and French.
- Updated existing localization files to ensure consistency across languages, supporting the recent vocabulary management features.
2026-04-22 11:12:26 +02:00
Torsten Schulz (local)
16924eca50 feat(VocabPracticeDialog, localization): add hard vocabulary marking feature
- Introduced functionality to mark vocabulary items as difficult, allowing users to track and manage challenging words during practice sessions.
- Added buttons for marking and unmarking current vocabulary as hard, enhancing user engagement and learning effectiveness.
- Updated the UI to display the count of hard-marked vocabulary items, providing users with better insights into their learning progress.
- Enhanced localization files for German and English to support new vocabulary marking features, ensuring a consistent user experience across languages.
2026-04-21 15:57:21 +02:00
Torsten Schulz (local)
2b2e37fb43 feat(DayProduction, FalukantService, VocabLessonView): enhance vocabulary training and production tracking
- Added a new `completionCount` field to the DayProduction model to track the number of completed productions.
- Updated the FalukantService to aggregate completed productions using the new `completionCount` field, improving accuracy in production statistics.
- Introduced new vocabulary training features in VocabLessonView, including options to mark vocabulary as difficult and track remaining hard vocabulary, enhancing user engagement and learning effectiveness.
- Updated localization files for German and English to support new vocabulary training features, ensuring a consistent user experience across languages.
2026-04-21 15:44:44 +02:00
Torsten Schulz (local)
bb97f7225a fix(AdminService, AdminController): enhance error handling and character deletion logic
- Updated error handling in AdminController to include 'targetnotdead' status for improved response accuracy.
- Modified character deletion logic in AdminService to ensure correct target character is identified, especially when dealing with living characters, enhancing data integrity during cleanup operations.
- Adjusted attributes fetched for characters to include 'health', facilitating better decision-making in deletion processes.
2026-04-20 16:27:08 +02:00
Torsten Schulz (local)
faee7bcd17 refactor(AdminService, EditUserView): streamline character data deletion and enhance confirmation dialog
- Introduced a reusable `deleteIfTableExists` function in AdminService to simplify the deletion of character-related data across multiple tables, improving code maintainability.
- Updated the deletion logic to check for table existence before executing delete queries, enhancing robustness.
- Enhanced the EditUserView by integrating a `ChooseDialog` for user confirmation before proceeding with character death cleanup, improving user experience and interaction clarity.
2026-04-20 16:16:48 +02:00
Torsten Schulz (local)
1285074266 feat(AdminController, AdminService, AdminRouter, localization): add character death cleanup feature
- Implemented `adminCleanupCharacterDeathArtifacts` method in AdminService to remove stale character-bound data after death/inheritance, including knowledge, debtors prism, and political offices.
- Added corresponding route in AdminRouter for triggering the cleanup process via an API endpoint.
- Enhanced AdminController to handle requests for the new cleanup feature, ensuring proper error handling and response formatting.
- Updated frontend components to include a user interface for initiating the cleanup, with localization support in both English and German for improved user experience.
2026-04-20 15:43:44 +02:00
Torsten Schulz (local)
2681ad3c6d feat(VocabPracticeDialog): implement immediate retry feature for incorrect answers
- Added a `pendingRetry` property to manage immediate retries after incorrect answers, enhancing user experience during vocabulary practice.
- Updated logic to handle retries, allowing users to quickly attempt the last question again with the correct direction.
- Ensured that the retry state is reset appropriately after correct answers or when skipping questions, maintaining clarity in the training flow.
2026-04-20 10:02:32 +02:00
Torsten Schulz (local)
56176c5a3f feat(VocabPracticeDialog, localization): implement last wrong answer review feature
- Added a new section in VocabPracticeDialog to display the last incorrect answer, including the asked vocabulary, user answer, and correct solutions.
- Updated localization strings in Cebuano, German, English, Spanish, and French to support the new review feature, enhancing user experience across multiple languages.
- Improved UI layout for the review section to provide clearer feedback during vocabulary training sessions.
2026-04-20 09:52:26 +02:00
Torsten Schulz (local)
7aa7178673 feat(VocabLessonView, localization): add vocabulary review feature and update translations
- Implemented a new vocabulary review section in VocabLessonView to display the last incorrect answer, including the asked vocabulary, user answer, and correct answer.
- Added localization strings for the new review feature in Cebuano, German, English, Spanish, and French, enhancing user experience across multiple languages.
- Updated the UI to visually differentiate the review section, improving clarity and usability during vocabulary training sessions.
2026-04-20 09:39:48 +02:00
Torsten Schulz (local)
a1e54edb1b feat(VocabLessonView): implement vocab trainer continue timer management
- Added a new timer management feature to the vocab trainer, allowing for better control over the continuation of questions after user answers.
- Introduced `clearVocabTrainerContinueTimer` method to prevent multiple timers from running simultaneously, enhancing the stability of the training session.
- Updated various methods to utilize the new timer management, ensuring a smoother user experience during vocabulary training.
2026-04-20 09:26:02 +02:00
Torsten Schulz (local)
111f6880b1 feat(VocabService, localization, VocabLessonView): extend assistant wait feedback and timeout duration
- Increased the timeout duration for the language assistant from 30 seconds to 120 seconds to accommodate longer processing times.
- Added new localization strings across multiple languages (Cebuano, German, English, Spanish, French) to provide user feedback during the assistant's wait period, enhancing clarity and user experience.
- Implemented a visual waiting indicator in VocabLessonView to inform users that the assistant is still processing their request, improving overall interaction quality.
2026-04-20 08:58:51 +02:00
Torsten Schulz (local)
506377978c feat(VocabService, VocabPracticeDialog, VocabLessonView): enhance vocabulary training logic and UI feedback
- Introduced methods for improved text analysis and validation in VocabService, including `_wordCount` and `_looksLikeFragmentMismatch`, to better assess learning and reference pairs.
- Updated VocabPracticeDialog to display submitted answers and correct solutions, enhancing user feedback during practice sessions.
- Enhanced VocabLessonView to ensure only trainable vocabulary pairs are processed, improving the quality of vocabulary training.
- Added localization entries for new UI elements in both English and German, ensuring clarity in user interactions.
2026-04-20 08:48:39 +02:00
Torsten Schulz (local)
78538764c5 feat(VocabPracticeDialog): add answer variant expansion for improved vocabulary training
- Introduced a new method `expandAnswerVariants` to generate multiple answer variants from a given input, enhancing the flexibility of acceptable answers.
- Improved handling of words with slashes to create diverse answer options, ensuring a richer vocabulary training experience.
- Updated the answer collection logic to utilize the new method, allowing for a broader range of valid responses during practice sessions.
2026-04-20 08:36:11 +02:00
Torsten Schulz (local)
433fa18aba feat(VocabService, VocabPracticeDialog): enhance text analysis and SRS validation
- Improved text analysis methods in VocabService to better identify instructional-like texts and task-related prompts, enhancing vocabulary training quality.
- Updated VocabPracticeDialog to include a new method for checking instruction-like text, ensuring more accurate filtering of trainable pairs.
- Incremented SRS session storage version to reflect changes in session management and data handling.
- Refactored normalization and validation logic to maintain consistency across vocabulary entries and improve user experience.
2026-04-20 08:30:58 +02:00
Torsten Schulz (local)
e2cfb2c4b8 feat(seo, routing): add Bisaya learning and German for Bisaya courses
- Introduced new routes for Bisaya learning and German for Bisaya courses, enhancing the marketing section of the application.
- Updated sitemap.xml to include new course URLs for better SEO visibility.
- Added localization entries for both courses in English and German, improving content accessibility for users.
- Enhanced SEO metadata generation for the new courses, ensuring proper indexing and visibility in search engines.
- Updated VocabLandingView to feature links to the new courses, improving user navigation and engagement.
2026-04-20 08:28:00 +02:00
Torsten Schulz (local)
dbbb892715 feat(VocabService): improve SRS pair validation and introduce new text analysis methods
- Refactored SRS pair validation logic by introducing the `_isTrainableSrsPair` method to enhance the criteria for acceptable learning and reference pairs.
- Added `_isInstructionLikeText` method to filter out instructional texts from SRS pairs, improving the quality of vocabulary training.
- Updated various methods to utilize the new validation logic, ensuring consistent handling of vocabulary entries across the service.
- Enhanced the `_courseHasDueSrsItems` and `_extractTrainerVocabsFromLessonDidactics` methods to improve data retrieval and filtering based on the new criteria.
2026-04-20 08:21:18 +02:00
Torsten Schulz (local)
512a176284 feat(VocabLessonView): enhance vocab trainer logic and answer normalization
- Refactored vocab trainer logic to improve handling of acceptable answers, allowing for multiple translations and synonyms.
- Introduced a new method to retrieve equivalent vocabulary answers, ensuring mixed pools from different lessons provide valid alternatives.
- Enhanced answer normalization process to prevent duplicates and improve the quality of acceptable answers presented to users.
2026-04-17 17:30:03 +02:00
Torsten Schulz (local)
9f77305be6 feat(FalukantService, OverviewView): enhance church office information retrieval and UI display
- Refactored the `getHighestChurchOfficeInfo` method to utilize a new approach for retrieving the highest church office, improving accuracy and performance.
- Updated the `OverviewView` to format and display the highest political and church office names instead of raw rank values, enhancing user experience and clarity.
- Introduced a new method `formatCertificateHighestOffice` for better localization and presentation of office titles in the UI.
2026-04-17 17:17:17 +02:00
Torsten Schulz (local)
ec84780796 feat(FalukantService, i18n): enhance household tension handling and localization updates
- Added functionality to refresh and update household tension scores and reasons in the FalukantService, improving user experience by reflecting real-time household dynamics.
- Updated localization strings across multiple languages (Cebuano, German, English, Spanish, French) to include new office rank terminology and improved marriage crisis descriptions, enhancing clarity and context for users.
- Introduced a new office rank tier structure in localization files, providing better categorization and understanding of office ranks in the game.
2026-04-17 17:07:53 +02:00
Torsten Schulz (local)
4342e35b22 fix(FalukantService): update userHouse query attributes and transaction handling
- Modified the userHouse query to include 'id' in the attributes, improving data retrieval.
- Enhanced transaction handling in state and userHouse updates to ensure atomic operations, preventing potential data inconsistencies.
2026-04-17 16:58:41 +02:00
Torsten Schulz (local)
bf1ca9f629 feat(VocabService, VocabCourseView): enhance SRS item retrieval and UI integration
- Updated VocabService to calculate total due count for spaced repetition system (SRS) items, improving data handling for user queries.
- Modified VocabCourseView to incorporate total due count in the UI, ensuring accurate display of SRS item statistics.
- Enhanced error handling and data validation for SRS due items, improving overall reliability and user experience.
2026-04-17 16:53:56 +02:00
Torsten Schulz (local)
aabbfb2c40 feat(MiniCalendarWidget): enhance localization and refactor calendar logic
- Updated the MiniCalendarWidget to utilize localized strings for month names, weekdays, and loading messages, improving user experience across multiple languages.
- Refactored the calendar logic to use constants for month keys and weekday order, ensuring consistency with backend configurations.
- Added new translation entries for the mini widget in Cebuano, German, English, Spanish, and French, enhancing accessibility for users.
2026-04-17 16:44:27 +02:00
Torsten Schulz (local)
585b61b268 feat(i18n): enhance localization for chat and minigames
- Updated localization strings for chat and minigames across multiple languages, including Cebuano, German, English, Spanish, and French, to improve user experience and clarity.
- Added new translations for participant counts, user selection prompts, and game over messages, ensuring consistency and better engagement in the UI.
- Enhanced existing translations for accuracy and context, particularly in the TaxiGame component and chat functionalities.
2026-04-17 16:38:39 +02:00
Torsten Schulz (local)
f89c4e213a feat(VocabPracticeDialog): implement SRS session management and enhance UI feedback
- Added support for spaced repetition system (SRS) session management, allowing users to resume practice sessions with due items.
- Introduced new UI elements to display SRS session status, including total due, completed, and remaining items.
- Enhanced localization for SRS-related messages in multiple languages, improving user experience and clarity.
- Updated methods for saving and loading SRS session data to local storage, ensuring persistence across sessions.
2026-04-17 16:28:19 +02:00
Torsten Schulz (local)
74a07fee00 feat(i18n): update Cebuano localization for minigames and enhance UI text
- Added new localized strings for minigames in Cebuano, including loading hints, objectives, and play focus descriptions to improve user experience.
- Updated existing translations for clarity and consistency across various game elements.
- Enhanced the Match3Game component to utilize localized strings, ensuring dynamic text rendering based on user language preferences.
- Included a new entry in .gitignore for the locale audit report to maintain a clean repository.
2026-04-17 16:20:20 +02:00
Torsten Schulz (local)
60ff9401e2 feat(bisaya-course): refine phase 4 didactics and enhance course content generation
- Corrected grammatical errors and improved the phrasing in the BISAYA_PHASE4_DIDACTICS, ensuring clarity and accuracy in the learning materials.
- Updated the course content generation script to include lessons from phase 5, enhancing the overall structure and flow of the course.
- Introduced a new vocabulary course content synchronization process, improving the integration of vocabulary resources across different modules.
- Enhanced the VocabService to dynamically adjust temperature settings based on the mode, optimizing response generation for different contexts.
- Added new localized titles and vocabulary entries in multiple languages, enriching the learning experience for users.
2026-04-17 16:00:41 +02:00
Torsten Schulz (local)
38ee6d0a4e feat(i18n): add language trainer SEO content and update home page metadata
- Introduced a new section for language trainers in multiple languages (Cebuano, German, English, Spanish, French) to enhance user guidance on beginner courses.
- Updated home page SEO metadata to reflect the addition of language courses, improving search visibility and user engagement.
- Enhanced the NoLoginView component to display the new language trainer information, providing users with clear insights into available resources.
2026-04-17 15:30:12 +02:00
Torsten Schulz (local)
d598ff1905 feat(LanguageAssistantView): add preset options for Ollama and OpenAI
- Introduced a new section for language assistant presets, allowing users to quickly apply configurations for Ollama and OpenAI.
- Implemented methods to set the base URL and model for each preset, enhancing user experience with one-click setup.
- Added styling for the preset buttons and hints to improve UI clarity and usability.
2026-04-17 15:24:22 +02:00
Torsten Schulz (local)
73d106caeb feat(bisaya-course): enhance phase 4 didactics with new learning goals and speaking prompts
- Expanded the BISAYA_PHASE4_DIDACTICS by adding new learning goals, core patterns, speaking prompts, and practical tasks to improve language acquisition.
- Updated the course content generation scripts to incorporate the new lesson structures and ensure alignment with the latest didactic updates.
- Enhanced the logic for generating exercises based on lesson types, introducing additional situational and speaking exercises for advanced lessons.
2026-04-17 15:12:21 +02:00
Torsten Schulz (local)
cbccfdc11e feat(bisaya-course): add new 'Ort & Richtung' section with learning goals and practical tasks
- Introduced a new section for 'Ort & Richtung' in the Bisaya didactics, including learning goals, core patterns, grammar focus, speaking prompts, and practical tasks to enhance language learning.
- Updated the lesson didactics to include the new section, ensuring comprehensive coverage of location and direction vocabulary.
2026-04-17 14:51:09 +02:00
Torsten Schulz (local)
7e54de0e98 feat(VocabLessonView): enhance review lesson logic and vocabulary handling
- Added logic to adjust vocabulary blending and switching conditions based on lesson type and didactic mode, improving the learning experience during review lessons.
- Implemented dynamic thresholds for switching between multiple choice and typing modes based on success rates and lesson context.
- Enhanced vocabulary source selection to incorporate a review share, optimizing the question pool for better engagement during typing sessions.
2026-04-17 14:37:40 +02:00
Torsten Schulz (local)
19a89a4be3 fix(update-backend): adjust file permissions and handle environment variables safely
- Updated the permission settings for the environment file to 640, ensuring it is readable only by the owner and the deploy group.
- Modified the sequelize configuration to safely handle missing environment variables, converting them to strings or setting them to undefined to prevent runtime errors.
[force-deploy]
2026-04-17 13:53:13 +02:00
Torsten Schulz (local)
d85a2a35ee refactor(update-backend): reorder permission settings and update migration message
- Moved permission setting commands to the end of the script for better clarity and execution flow.
- Changed the log message from "Running database synchronization..." to "Running database migrations..." to accurately reflect the operation being performed.
- Ensured that permission settings for backend and data directories are consistently applied after the migration process.
[force-deploy]
2026-04-17 13:45:53 +02:00
Torsten Schulz (local)
c3e5f92378 chore(package): update version to 3.0.0-beta-1.0.0 in package.json
[force-deploy]
2026-04-17 13:41:00 +02:00
Torsten Schulz (local)
90dd304ad6 feat(deploy): update deployment workflow and migration paths
- Modified the deployment workflow to include new migration paths for the backend, ensuring that migrations are correctly referenced in the deployment process.
- Updated the `db:migrate` script in package.json to point to the `migrations-active` directory, enhancing clarity and organization of migration files.
- Adjusted the deployment conditions to account for changes in migration file locations, improving the accuracy of change detection during deployments.
- Removed obsolete migration files to streamline the migration process and prevent confusion.
2026-04-17 13:39:38 +02:00
Torsten Schulz (local)
7b19665dca feat(migration): enhance contact_message migration to check for existing columns before adding/removing
- Updated the migration script for the contact_message table to conditionally add or remove columns based on their existence, improving migration safety and preventing errors during deployment.
- This change ensures that the migration can be run multiple times without causing issues if the columns already exist or are missing.
[force-deploy]
2026-04-17 12:01:25 +02:00
Torsten Schulz (local)
f836e69d24 feat(deploy): add force deploy detection to deployment workflow
- Implemented logic to check for a `[force-deploy]` tag in the latest commit message, allowing for a forced deployment regardless of detected changes.
- Updated deployment conditions to include force deploy status, enabling more flexible deployment options based on commit messages.
- Enhanced sync step to trigger on force deploy, ensuring content updates are applied even without file changes.
2026-04-17 11:53:00 +02:00
Torsten Schulz (local)
fbdf81746d feat(update-backend): streamline dependency management and migration process
- Updated the npm install command to remove the production flag, allowing for the installation of all dependencies.
- Added a step to prune development dependencies after running database migrations, optimizing the deployment environment.
2026-04-17 11:42:41 +02:00
Torsten Schulz (local)
da34e1d4b2 feat(VocabLessonView): improve lesson reset behavior and normalize vocabulary handling
- Updated lesson reset functionality to ensure users start in the 'learn' tab after resetting progress.
- Enhanced vocabulary normalization by adding a method to strip trailing parenthetical notes, improving text consistency.
- Adjusted normalization logic to conditionally ignore trailing notes based on user input mode, enhancing user experience during vocabulary training.
2026-04-17 11:41:46 +02:00
Torsten Schulz (local)
47807d5268 feat(database): add migration and sync-db scripts to deployment process
- Introduced a new npm script for database migrations in package.json.
- Updated update-backend.sh to execute migrations and conditionally run legacy sync-db based on environment variable.
- Enhanced syncDatabase.js to skip initialization routines if APP_INIT_ON_START is not set, promoting best practices for schema changes during deployment.
2026-04-17 11:34:59 +02:00
Torsten Schulz (local)
6083db9f2e feat(deploy): enhance deployment scripts with skip options for backend and frontend
- Updated `deploy-yourpart-bluegreen.sh` to pass additional arguments for skipping backend or frontend updates.
- Enhanced `update.sh` to handle `--skip-backend` and `--skip-frontend` flags, allowing for more flexible deployment based on changes detected.
- Modified deployment workflow to conditionally execute based on changes in frontend or backend files, improving deployment efficiency.
2026-04-17 11:33:02 +02:00
Torsten Schulz (local)
c4808db972 feat(bisaya-course): enhance script execution with direct run detection
- Added functionality to detect if the script is run directly, allowing for conditional execution of the main function.
- Imported `pathToFileURL` from the 'url' module to facilitate the direct run check, improving script usability and flexibility.
2026-04-17 11:23:40 +02:00
Torsten Schulz (local)
7610d2137c feat(deploy): add vocab course change detection and sync step
- Implemented a new workflow step to detect changes in vocab course files and conditionally sync content.
- Added a script to check for specific changes in the repository and trigger the sync process if necessary.
- Introduced a new npm script for syncing vocab course content in the backend package.json.
2026-04-17 11:17:59 +02:00
Torsten Schulz (local)
4f548565ec feat(bisaya-course): enhance lesson structure and didactics integration
- Added an auto-incrementing primary key to the UserHouse model for improved database management.
- Integrated new didactics fragments from the Bisaya course plan, including relationship anchor didactics and lessons for enhanced curriculum depth.
- Updated lesson retrieval logic to utilize planned lesson titles, improving the accuracy of didactics resolution.
- Refactored course content generation scripts to incorporate new didactics, ensuring a comprehensive learning experience for users.
2026-04-17 11:08:12 +02:00
Torsten Schulz (local)
3a361caa1c feat(bisaya-course): add new didactics fragments for everyday conversations
- Introduced new didactics fragments for "Alltagsgespräche - Teil 1" and "Alltagsgespräche - Teil 2," including learning goals, core patterns, speaking prompts, and practical tasks to enhance conversational skills in Bisaya.
- Updated the lesson structure to incorporate these new fragments, improving the overall curriculum and providing learners with more comprehensive resources for everyday interactions.
2026-04-17 10:52:39 +02:00
Torsten Schulz (local)
402efac897 feat(bisaya-course, vocabService): expand numerical didactics and enhance lesson progress serialization
- Added new glosses for the numbers sixty, seventy, and eighty in the Bisaya didactics, enriching the numerical curriculum.
- Updated the _serializeLessonProgress method to include an options parameter for suppressing lesson review due notifications based on SRS item status.
- Introduced a new method to check for due SRS items, improving the handling of lesson progress and review scheduling.
2026-04-17 09:30:36 +02:00
Torsten Schulz (local)
9123bd524a feat(VocabPracticeDialog, VocabCourseView): implement SRS rating feature and enhance user feedback
- Added SRS rating buttons in VocabPracticeDialog to allow users to rate their confidence after answering vocabulary questions.
- Updated methods to handle SRS ratings and integrated them into the review process, improving spaced repetition feedback.
- Enhanced UI with new styles for SRS rating buttons and updated translations for SRS-related terms in multiple languages.
- Modified VocabCourseView to display appropriate introductory text based on SRS due items, improving user guidance.
2026-04-17 09:27:29 +02:00
Torsten Schulz (local)
bf475e3a35 feat(vocab): implement SRS features and enhance vocabulary management
- Added new endpoints in vocabController for retrieving SRS due items and reviewing SRS items, improving spaced repetition support.
- Updated vocabService to handle SRS item creation and scheduling, ensuring effective tracking of vocabulary exposure.
- Enhanced vocabRouter with new routes for SRS functionalities, facilitating user interaction with spaced repetition features.
- Modified VocabPracticeDialog and VocabCourseView to integrate SRS due items, providing users with timely review opportunities.
- Updated translations and UI elements to reflect new SRS features, enhancing user experience and accessibility.
2026-04-17 09:14:30 +02:00
Torsten Schulz (local)
022b8297b6 feat(vocabService, VocabPracticeDialog, VocabLessonView): enhance vocabulary handling and exposure tracking
- Updated vocabService to merge extracted vocabularies and improve handling of learning and reference pairs.
- Introduced normalization and exposure tracking in VocabPracticeDialog to ensure diverse and underexposed vocabulary practice.
- Enhanced VocabLessonView with methods to identify underexposed vocabularies and adjust selection logic for improved learning outcomes.
- Implemented new constants for minimum exposure requirements to optimize vocabulary training sessions.
2026-04-17 08:58:50 +02:00
Torsten Schulz (local)
4063127942 feat(bisaya-course): expand numerical didactics with additional glosses
- Added new glosses for numbers in Bisaya, enhancing the didactics for numerical lessons.
- Included translations for numbers 4 to 19, improving the comprehensiveness of the numerical curriculum.
- Updated the lesson structure to support the expanded vocabulary, ensuring a richer learning experience.
2026-04-17 08:21:02 +02:00
Torsten Schulz (local)
8c30f0ff54 feat(bisaya-course): add didactics fragments for "Haus & Familie" lessons
- Introduced comprehensive didactics snippets for the "Haus & Familie" lesson, including learning goals, core patterns, grammar focus, speaking prompts, and practical tasks.
- Updated the lesson retrieval logic to incorporate these new fragments as a fallback for core patterns, enhancing the robustness of lesson content delivery.
- Modified the vocab service to utilize the new didactics fragments, ensuring a seamless integration into the existing lesson structure.
2026-04-16 22:44:57 +02:00
Torsten Schulz (local)
5ca2817c82 feat(bisaya-course): update lesson retrieval and didactics processing
- Refactored the lesson retrieval logic to include lesson number and title in the query, improving data handling.
- Updated the didactics processing to utilize a lesson-like object instead of fetching lessons by primary key, enhancing performance.
- Improved error handling and ensured proper closure of the database connection after execution.
2026-04-16 22:36:15 +02:00
Torsten Schulz (local)
515fd8c5eb feat(bisaya-course): add new exercises for situational role plays and enhance lesson normalization
- Introduced a new section titled "Rollenspiele - echte Situationen" with multiple exercises focusing on real-life scenarios in Bisaya, including multiple-choice, gap-fill, and transformation tasks.
- Implemented a normalization function for lesson titles to improve matching accuracy and facilitate the rebuilding of placeholder lessons.
- Updated the course content generation logic to replace outdated exercises with new ones based on normalized titles, ensuring a more relevant learning experience.
2026-04-16 22:28:10 +02:00
Torsten Schulz (local)
f14a7ab674 feat(bisaya-course): add new lesson and update course creation logic
- Introduced a new lesson titled "Zahlen & Preise" to enhance the numerical curriculum in Bisaya.
- Updated the course creation logic to check for existing "Familien"-Bisaya courses, ensuring idempotency in course creation.
- Enhanced the lesson didactics by mapping legacy titles to current lesson keys, improving data consistency.
- Adjusted the course generation script to limit Bisaya courses to German-speaking learners only, streamlining course offerings.
2026-04-16 22:16:23 +02:00
Torsten Schulz (local)
b586fcb708 feat(bisaya-course): enhance numerical lessons with expanded content
- Updated lessons on numbers to include detailed sections for "Zahlen 1–20," "Zahlen: Zehner," "Zahlen: Hunderter," and "Zahlen: Tausender," focusing on foundational numerical concepts in Bisaya.
- Introduced various exercise types such as multiple-choice, gap-fill, and transformation tasks to improve learner engagement and comprehension of numerical expressions.
- Enhanced didactics with clear learning goals, core patterns, grammar focus, speaking prompts, and practical tasks to support effective learning.
- Added review lessons to reinforce key concepts and ensure continuity in learning progression.
2026-04-16 21:55:05 +02:00
Torsten Schulz (local)
ad5d089786 feat(vocabService): enhance answer validation with comparable variants
- Introduced methods to expand comparable answer variants and improve answer equivalence checks, allowing for more flexible user responses.
- Updated the answer validation logic to utilize the new methods, enhancing the accuracy of response evaluation during exercises.
2026-04-16 16:46:37 +02:00
Torsten Schulz (local)
eba98dde1d fix(bisaya-course): update alternatives for transformation exercise
- Modified the alternatives for a transformation exercise to include additional variations, enhancing the response options for learners.
- Updated the vocabulary service to incorporate both primary and alternative answers, improving the accuracy of answer validation during exercises.
2026-04-16 16:42:48 +02:00
Torsten Schulz (local)
98ab31bc78 feat(bisaya-course): expand lessons on shopping, prices, and numbers
- Added new lessons titled "Einkaufen & Preise" and "Zahlen & Preise" with various exercises focusing on shopping vocabulary and numerical expressions in Bisaya.
- Introduced multiple exercise types including multiple-choice, gap-fill, and transformation tasks to enhance learner engagement and understanding of practical language use in market contexts.
- Updated didactics to include learning goals, core patterns, grammar focus, speaking prompts, and practical tasks related to shopping dialogues and numerical comprehension.
- Included a review lesson "Woche 2 - Wiederholung" to reinforce key concepts from previous lessons, ensuring comprehensive learning continuity.
- Enhanced vocabulary testing with a new "Woche 2 - Vokabeltest" to assess retention of key terms and phrases.
2026-04-16 16:25:47 +02:00
Torsten Schulz (local)
99d011dd92 feat(bisaya-course): add new lesson on time and date concepts
- Introduced a new lesson titled "Zeit & Datum" with multiple exercises focusing on recognizing and using key time-related vocabulary in Bisaya.
- Added various exercise types including multiple-choice, gap-fill, and transformation tasks to enhance learner engagement and understanding of temporal expressions.
- Updated didactics to include learning goals, core patterns, grammar focus, speaking prompts, and practical tasks related to time markers and simple date questions.
2026-04-16 16:09:10 +02:00
Torsten Schulz (local)
1c34a90cfd fix(vocabLessonReview): improve input normalization by trimming punctuation
- Enhanced the `normalize` method to trim trailing punctuation marks (.,!?;:) from input strings, ensuring cleaner and more consistent user input.
- Added logic to replace multiple spaces with a single space, improving the overall formatting of normalized strings.
2026-04-16 15:23:00 +02:00
Torsten Schulz (local)
a18d6d62b5 feat(bisaya-course): update gap-fill exercise structure and instructions
- Changed exercise type from 'pattern_drill' to 'gap_fill' for improved clarity and engagement.
- Revised instructions to specify the use of the verb "adto" across different tenses, enhancing learner guidance.
- Updated question data format to include gaps for each tense, streamlining the exercise layout.
- Adjusted answer data to reflect the new gap-fill structure, ensuring consistency in exercise responses.
- Enhanced explanation to clarify the focus on tense variations with the verb "adto," improving educational value.
2026-04-16 15:06:17 +02:00
Torsten Schulz (local)
1131540414 feat(vocabLesson): enhance input handling for gap-fill exercises
- Added functionality to manage Enter key events for gap-fill and single input fields, improving user experience during exercises.
- Introduced methods `onGapInputEnter` and `onSingleInputEnter` to streamline answer checking and navigation between input fields.
- Updated input elements with refs for better focus management, ensuring a smoother interaction flow for users.
2026-04-16 14:55:43 +02:00
Torsten Schulz (local)
d3dc20a93f feat(falukant): refactor character ID resolution for political office checks
- Introduced a new method `resolveCharacterIdForOfficeChecks` to robustly resolve character IDs based on user references, improving the reliability of political office queries.
- Updated `getHighestPoliticalOfficeInfo` and `getHighestOfficeAnyInfo` methods to utilize the new character ID resolution logic, enhancing code clarity and reducing redundancy.
- Ensured that character ID retrieval handles both direct and fallback user references, streamlining the process of fetching political office information.
2026-04-15 15:47:31 +02:00
Torsten Schulz (local)
6897f0fadf feat(falukant): add political office catalog feature and localization updates
- Implemented the `getPoliticalOfficeCatalog` method in FalukantService to retrieve available political offices and their prerequisites based on user eligibility.
- Updated FalukantController and FalukantRouter to include a new endpoint for accessing the political office catalog.
- Enhanced PoliticsView component to display the list of political offices, including their details and application eligibility.
- Added localization entries for the new offices tab in both German and English, improving user experience and accessibility.
2026-04-15 15:30:24 +02:00
Torsten Schulz (local)
b61a73aa09 feat(vocabLesson): add detailed review section for failed chapter exams
- Introduced a new review section that displays questions, user answers, and correct answers for failed chapter exams.
- Added localization entries for the review section in multiple languages, enhancing user experience and understanding of mistakes.
- Implemented logic to format and present failed exam details, improving feedback for learners.
2026-04-15 14:02:34 +02:00
Torsten Schulz (local)
271ecca9f6 feat(bisaya-course): enhance lesson content for temporal grammar and exercises
- Updated learning goals to emphasize distinguishing between past, present, and future in everyday sentences.
- Revised core patterns to include specific examples for each tense, improving clarity and context for learners.
- Expanded grammar focus sections to provide detailed explanations of time markers and their usage.
- Introduced new exercises for practicing grammar focus, including multiple-choice questions and transformation tasks, enhancing student engagement with temporal aspects of the language.
- Updated speaking prompts and practical tasks to reflect the new content structure, ensuring a comprehensive learning experience.
2026-04-15 13:25:15 +02:00
Torsten Schulz (local)
24777018f0 feat(bisaya-course): enhance grammar focus and drills for lesson content
- Added functions to normalize and build grammar curriculum focus entries, improving the structure and clarity of grammar lessons.
- Implemented logic to merge existing grammar focus with newly defined curriculum focus, ensuring comprehensive coverage of key grammar points.
- Introduced new drills for practicing past and future tense constructions, enhancing student engagement and understanding of temporal aspects in Bisaya.
- Updated the `createBisayaCourseContent` function to incorporate these enhancements, ensuring lessons are enriched with relevant grammar exercises.
2026-04-15 11:52:53 +02:00
Torsten Schulz (local)
5c6ba2f5da feat(bisaya-course): update exercise content for market-related vocabulary
- Changed the exercise question and answer to focus on market-related scenarios, replacing previous church-related content.
- Updated the explanation to align with the new vocabulary introduced in this lesson, enhancing contextual learning for students.
2026-04-15 11:49:50 +02:00
Torsten Schulz (local)
a44a35d92c feat(bisaya-course): implement core pattern extraction and merging for exercises
- Added functions to derive core patterns from various exercise types, including gap-fill, transformation, and multiple-choice.
- Implemented logic to merge derived core patterns with existing lesson patterns, ensuring a minimum count for effective lesson content.
- Enhanced the `createBisayaCourseContent` function to update lessons with merged core patterns and provide detailed logging based on the VOCAB_STRICT_AUDIT environment variable.
2026-04-15 11:12:18 +02:00
Torsten Schulz (local)
336d888dbe feat(bisaya-course): add new lessons for everyday conversations
- Introduced two new lessons: 'Alltagsgespräche - Teil 1' and 'Alltagsgespräche - Teil 2'.
- Each lesson includes learning goals, core patterns, speaking prompts, and practical tasks to enhance conversational skills in everyday contexts.
- Updated the lesson structure to support these additions, ensuring a comprehensive learning experience.
2026-04-15 11:09:14 +02:00
Torsten Schulz (local)
0499b23ced feat(bisaya-course): enhance gap-fill exercise processing and validation
- Added `buildCorePatternGlossLookup` to create a mapping of core patterns for improved hint sanitization.
- Implemented `sanitizeGapFillHintText` to validate and replace hints based on answer word count and gloss availability, generating fixes and warnings as needed.
- Updated `sanitizeExerciseForConsistency` to incorporate new sanitization logic for gap-fill exercises, ensuring consistent exercise data handling.
- Enhanced logging in `createBisayaCourseContent` to provide detailed feedback on exercise processing and validation outcomes.
2026-04-14 15:33:00 +02:00
Torsten Schulz (local)
4b0b4d42f1 feat(bisaya-course): add word count validation and exercise audit warnings
- Introduced a `countWords` function to calculate the number of words in a given text.
- Added `collectExerciseAuditWarnings` function to generate warnings for gap-fill exercises with potentially misleading hints.
- Updated the `createBisayaCourseContent` function to log audit warnings when the VOCAB_STRICT_AUDIT environment variable is set, enhancing the validation process for exercise content.
2026-04-14 15:30:58 +02:00
Torsten Schulz (local)
26a4e84e1d fix(vocabLesson): improve answer validation logic for gap fill exercises
- Enhanced the answer validation process by introducing checks for native word and answer text, ensuring they are trimmed and compared correctly.
- Added logic to identify likely fragment mismatches based on sentence structure and word count, preventing incorrect answer submissions.
- Updated debug logging to provide clearer insights into the validation process, improving maintainability and debugging capabilities.
2026-04-14 14:57:54 +02:00
Torsten Schulz (local)
573151fd31 feat(falukant): add improve lover affection feature and localization updates
- Introduced the `improveLoverAffection` method in FalukantService to enhance relationship dynamics by allowing users to boost affection at a cost.
- Updated FalukantController and FalukantRouter to include the new endpoint for improving lover affection.
- Enhanced FamilyView component to provide a button for users to trigger the affection improvement action.
- Added localization entries for the new feature in multiple languages, ensuring clarity in user interactions regarding affection improvements.
2026-04-14 11:39:42 +02:00
Torsten Schulz (local)
abf5b42601 feat(falukant): enhance notification handling and localization updates
- Updated the `enrichNotificationsWithCharacterNames` method in FalukantService to include region name enrichment and handle additional character IDs.
- Introduced a new `serializeNotificationForClient` function to format notifications for the client, ensuring all relevant data is included.
- Enhanced the MessagesDialog component to merge notification payloads and extract parameters more effectively, improving the clarity of displayed messages.
- Added new localization entries for director resignation risk and regional festival effects in multiple languages, ensuring comprehensive user notifications.
2026-04-14 08:06:56 +02:00
Torsten Schulz (local)
dfa6a58a57 feat(falukant): add transport cost option to product price calculations
- Updated the `getProductPricesInCitiesBatch` method in FalukantService to accept an options parameter for including transport costs in price calculations.
- Modified the tax calculation logic to conditionally apply transport costs based on the new parameter, enhancing the accuracy of pricing based on regional differences.
- Adjusted the FalukantController to pass the includeTransportCosts option from the request body, improving flexibility in pricing queries.
2026-04-13 16:11:53 +02:00
Torsten Schulz (local)
4117ec0ce0 feat(falukant): refine tax calculation logic to handle political office exemptions
- Updated the tax calculation in FalukantService to ensure no exemptions are applied for political offices, streamlining the cumulative tax query.
- Enhanced the SQL query to accurately compute cumulative tax while excluding exempted ancestor levels based on office, improving overall accuracy in tax assessments.
2026-04-13 16:05:41 +02:00
Torsten Schulz (local)
ca16b1acf2 feat(falukant): enhance tax calculation and update messaging parameters
- Updated the tax calculation logic in FalukantService to include character-based checks for political offices, improving accuracy in tax assessments.
- Enhanced the MessagesDialog component to incorporate additional parameters such as satisfaction, threshold_percent, director_id, and director_character_id, providing more detailed notifications.
- Added new localization entries for director resignation risk notifications in multiple languages, ensuring users receive clear and contextual information regarding director dynamics.
2026-04-13 15:58:30 +02:00
Torsten Schulz (local)
e799cf4574 feat(falukant): add scandalExtraDailyPct field and update related components
- Introduced a new field `scandalExtraDailyPct` in the relationship state model to track additional scandal risk per day, with validation constraints.
- Updated the FalukantService to include the new field in relevant calculations and data handling.
- Enhanced the frontend components, including RevenueSection and FamilyView, to display the scandal risk information and updated price calculations.
- Added localization entries for the new field in multiple languages to ensure clarity for users.
2026-04-13 15:31:47 +02:00
Torsten Schulz (local)
2ce1d0ac22 feat(falukant): update production counting logic and enhance localization
- Modified the production counting logic in FalukantService to count each completed production directly from the falukant_log.production table, simplifying the query structure.
- Added a new localization entry for "scoreHowToRaise" in Cebuano, German, English, Spanish, and French to provide users with clear guidance on how to improve their score through various factors.
- Updated the OverviewView component to display the new score improvement information, enhancing user experience and understanding of scoring dynamics.
2026-04-13 13:59:37 +02:00
Torsten Schulz (local)
10191ae8d6 feat(falukant): add 'lover_breakup_risk_high' event handling and localization updates
- Introduced a new event type for high breakup risk in relationships, including a sample payload for integration.
- Updated the MessagesDialog component to handle new parameters related to breakup risk.
- Added translations for the new event in Cebuano, German, English, Spanish, and French to enhance user understanding of relationship dynamics.
- Enhanced documentation to reflect the new notification structure for high breakup risk events.
2026-04-13 12:21:24 +02:00
Torsten Schulz (local)
b5a1c334fb feat(falukant): enhance marriage actions with production delay handling and UI updates
- Implemented logic in FalukantService to delay running productions when spending time with a spouse, updating the start timestamp accordingly.
- Enhanced the response from the spend time API to include details about delayed productions and household order changes.
- Updated FamilyView component to display the cost of marriage actions and added a help section detailing the effects of actions, including production delays.
- Added new translations for action effects in multiple languages to improve user understanding of the marriage actions.
2026-04-13 12:09:17 +02:00
Torsten Schulz (local)
f5461a3c8c feat(i18n): update 'acknowledgeHelp' translations and enhance UI interaction
- Added new translations for 'maintenance', 'affection', and 'breakup' in Cebuano, German, English, and Spanish to provide users with comprehensive context regarding relationship dynamics.
- Refactored the FamilyView component to utilize a details element for the 'acknowledgeHelp' section, improving user interaction and readability.
- Enhanced styling for the summary element to improve visibility and user engagement.
2026-04-13 11:41:17 +02:00
Torsten Schulz (local)
46d192ca47 removed double question 2026-04-13 11:27:06 +02:00
Torsten Schulz (local)
39d401315c fix(falukant): validate office term length and adjust term end calculation
- Added validation for office term length to ensure it is a positive finite number, throwing an error for invalid values.
- Updated the calculation of the term end date to use the term length in days instead of years, aligning with the expected data format.
2026-04-10 16:08:50 +02:00
Torsten Schulz (local)
8a70f3ba96 feat(vocab): implement pagination and localization for vocabulary dictionaries
- Added pagination functionality to the vocabulary dictionary views, allowing users to navigate through results efficiently.
- Introduced a new method `_parseDictionaryPaging` in `VocabService` to handle pagination parameters.
- Updated `getLanguageDictionary` and `getCourseDictionary` methods to return pagination details alongside results.
- Enhanced the `VocabDictionaryView` component with pagination controls and updated UI for better user experience.
- Added localization entries for pagination in Cebuano, German, English, Spanish, and French, ensuring a consistent user experience across languages.
2026-04-10 14:35:50 +02:00
Torsten Schulz (local)
0bea72b2d4 feat(vocab-lesson): implement pagination for vocabulary overview in lesson view
- Added pagination functionality to the vocabulary overview in the VocabLessonView component, allowing users to navigate through vocabulary items more efficiently.
- Introduced new localization entries for pagination controls in Cebuano, German, English, Spanish, and French, ensuring a consistent user experience across languages.
- Enhanced the UI with buttons for previous and next navigation, improving accessibility and usability of the vocabulary list.
2026-04-10 14:26:01 +02:00
Torsten Schulz (local)
5d44e75985 feat(i18n, frontend): enhance course planning with optional steps and localization updates
- Added a new section for optional learning steps in the course planning UI, allowing users to engage with additional content when no mandatory tasks are due.
- Updated localization files for Cebuano, German, English, Spanish, and French to reflect changes in course planning instructions and titles, ensuring clarity and consistency across languages.
- Improved pedagogical logic for lesson recommendations, focusing on cognitive load and spaced repetition principles to enhance user learning experience.
2026-04-10 13:33:25 +02:00
Torsten Schulz (local)
ca1f045f4b feat(vocab): add language and course dictionary endpoints and UI components
- Implemented `getLanguageDictionary` and `getCourseDictionary` methods in the VocabService to retrieve vocabulary entries filtered by search terms.
- Updated VocabController and vocabRouter to include new routes for accessing language and course dictionaries.
- Enhanced frontend components to navigate to the new dictionary views, including buttons in VocabCourseView and VocabLanguageView.
- Added localization entries for the dictionary feature in multiple languages, ensuring a consistent user experience across the platform.
2026-04-10 13:08:18 +02:00
Torsten Schulz (local)
96fb71bae7 feat(i18n, frontend): add 'acknowledgeHelp' translations and UI enhancements
- Introduced 'acknowledgeHelp' translations in Cebuano, German, English, and Spanish to provide users with context about the implications of acknowledging relationships.
- Updated the FamilyView component to display the new 'acknowledgeHelp' information, enhancing user understanding of relationship dynamics.
- Improved styling for the acknowledgment help section to ensure clarity and visibility within the user interface.
2026-04-10 10:29:20 +02:00
Torsten Schulz (local)
c90d40ea5b feat(falukant): enhance reputation handling in character checks
- Added the 'reputation' attribute to the character query in FalukantService, improving data retrieval for nobility requirements.
- Refactored the `checkReputationRequirement` method to streamline reputation checks, ensuring it handles undefined or null values more effectively, enhancing reliability in user character evaluations.
2026-04-10 08:45:54 +02:00
Torsten Schulz (local)
ff06e3ac63 feat(falukant): enhance notification handling and parameter extraction in MessagesDialog
- Introduced a new method `mergeNotificationPayload` to consolidate top-level fields with embedded JSON from notifications, improving data handling.
- Updated `formatBody` and `extractParams` methods to utilize the merged payload, ensuring accurate extraction of parameters from notifications.
- Enhanced parameter extraction logic to handle various notification structures, improving clarity and consistency in displayed information.
2026-04-10 08:41:53 +02:00
Torsten Schulz (local)
18490005ca feat(vocab-lesson): enhance exercise navigation and randomization logic
- Improved the exercise progression logic to automatically advance only on correct answers, ensuring better user feedback during learning.
- Added a new method to shuffle multiple-choice options display order when distractor replacement is not applicable, enhancing the exercise experience.
- Updated the build process for randomized options to include both randomization from a pool and display order shuffling, improving overall engagement and learning outcomes.
2026-04-09 17:57:51 +02:00
Torsten Schulz (local)
a4f3fba744 feat(bisaya-course): refine exercises and instructions for improved learning experience
- Updated exercise titles and instructions to enhance clarity and focus on specific learning objectives.
- Modified question data and answer options to better align with the lesson's vocabulary and context.
- Improved explanations to provide clearer guidance on language usage and learning goals, fostering better comprehension for learners.
2026-04-09 17:49:50 +02:00
Torsten Schulz (local)
55d323867b feat(bisaya-course): add new exercises to enhance Bisaya language learning
- Introduced multiple-choice and transformation exercises focused on common phrases and vocabulary, including translations and contextual usage.
- Expanded the curriculum with practical tasks that encourage conversational skills and comprehension in various scenarios.
- Enhanced existing exercises with clear instructions and explanations to improve user engagement and learning outcomes.
2026-04-09 17:23:20 +02:00
Torsten Schulz (local)
3a056f74dd feat(bisaya-course): expand 'Haus & Familie' lesson with new vocabulary and exercises
- Added comprehensive learning goals, core patterns, grammar focus, speaking prompts, and practical tasks for the 'Haus & Familie' lesson, enhancing the curriculum for better language acquisition.
- Updated exercise content to include multiple-choice questions and gap-fill tasks related to household vocabulary, improving user engagement and learning outcomes.
- Enhanced localization for the lesson description and vocabulary, ensuring clarity and consistency across the learning platform.
2026-04-09 17:19:02 +02:00
Torsten Schulz (local)
1d625b40a5 feat(seo, i18n): update SEO metadata and enhance localization across multiple languages
- Revised SEO titles and descriptions for improved clarity and relevance, emphasizing the platform's features such as community, chat, forums, and browser games.
- Updated localization files for Cebuano, German, English, Spanish, and French to include new translations and enhance existing content, ensuring a consistent user experience across languages.
- Added a new story teaser in the home view to better highlight the platform's offerings without requiring downloads.
2026-04-09 09:44:53 +02:00
Torsten Schulz (local)
9bf04d77d1 fix(falukant): improve product pricing logic and update localization for office notifications
- Refactored the product pricing logic in `falukantService.js` to ensure accurate regional pricing calculations based on client values and server data.
- Added new notification translations for "office filled" in multiple languages (Cebuano, German, English, Spanish, French) to enhance user experience and clarity in notifications.
2026-04-09 09:21:47 +02:00
Torsten Schulz (local)
c865bbd819 feat(falukant): enhance product pricing and nobility advancement features
- Updated the `getAllProductPricesInRegion` method in `FalukantService` to accept additional parameters for network worth and branch ID, improving pricing calculations based on user branches.
- Enhanced the nobility advancement logic in `NobilityView` to display unmet requirements clearly, providing users with better feedback on advancement conditions.
- Refactored the revenue calculation in `ProductionSection` to utilize a cached product prices object, optimizing performance and reducing redundant API calls.
- Updated localization files to include new translations for attack sources across multiple languages, enhancing the user experience for diverse audiences.
- Removed obsolete C++ worker references and streamlined the retention logic for production logs, ensuring efficient data management.
2026-04-09 09:08:32 +02:00
Torsten Schulz (local)
f82f1a2437 feat(user): add certificate production tracking and update localization
- Introduced a new field `certificateProductionsCountSince` in the `FalukantUser` model to track the date from which production logs are counted for certificate requirements.
- Updated the `FalukantService` to utilize the new field for calculating completed productions since the specified date.
- Enhanced the UI to display the count of productions since the last promotion, with corresponding translations added for multiple languages including Cebuano, German, English, Spanish, and French.
- Implemented a method to delete old production logs, ensuring efficient data management while maintaining necessary historical records for certificate calculations.
2026-04-09 08:19:19 +02:00
Torsten Schulz (local)
d7f7f09d4d feat(i18n): add French language support and enhance localization
- Introduced French as a supported language across the application, updating locale files and adding translations for various components.
- Enhanced language handling logic to accommodate French, ensuring proper detection and fallback mechanisms.
- Updated UI elements to include French language options, improving accessibility for French-speaking users.
- Refactored SEO handling to include French in hreflang links, enhancing search engine indexing for multilingual content.
- Added new scripts for managing French translations and ensuring consistency across language files.
2026-04-07 18:04:03 +02:00
Torsten Schulz (local)
9370e0cb14 feat(i18n): implement deep merging for locale chunks and enhance Cebuano translations
- Introduced a deep merge function to combine locale chunks, improving the handling of language data for Cebuano.
- Updated Cebuano locale files with comprehensive translations, including new sections for admin, social network, and settings.
- Enhanced existing translations for clarity and consistency across various components, ensuring a better user experience.
- Added new fields in the settings and profile sections to capture more user attributes, improving personalization options.
2026-04-07 16:23:11 +02:00
Torsten Schulz (local)
16c59dd5e0 fix(i18n): update Cebuano language label in AppHeader.vue
- Changed the native label for Cebuano from 'Sinugboanon' to 'Binisaya' in the language options of AppHeader.vue for improved accuracy and user recognition.
2026-04-07 15:59:07 +02:00
Torsten Schulz (local)
fd7f2e2474 refactor(i18n): improve language handling and UI updates
- Enhanced language setting logic in App.vue and AppHeader.vue to support reactive updates without page reloads.
- Updated language options in AppHeader.vue to use native labels for improved clarity.
- Introduced a utility function in i18n/index.js to streamline locale updates, ensuring consistent language handling across the application.
2026-04-07 15:52:16 +02:00
Torsten Schulz (local)
a9413ef666 feat(seo): enhance multilingual support and SEO handling
- Added support for multiple languages in the frontend, including English, Spanish, and Cebuano, improving accessibility for a broader audience.
- Implemented hreflang links for better SEO performance, ensuring search engines can correctly index language-specific content.
- Updated SEO metadata handling to utilize internationalization keys, enhancing the clarity and relevance of page titles and descriptions.
- Refactored SEO utility functions to streamline the management of OpenGraph and hreflang attributes, improving maintainability and performance.
2026-04-07 15:43:16 +02:00
Torsten Schulz (local)
3119d32e57 refactor(exercises): standardize answer language handling across exercise scripts
- Introduced a mechanism to infer answer language based on question phrasing in multiple exercise scripts, enhancing consistency in exercise data.
- Updated question formats to clarify the intent of exercises, improving user understanding and engagement.
- Streamlined the code for better maintainability and clarity in exercise generation processes.
2026-04-07 14:32:44 +02:00
Torsten Schulz (local)
a545774f25 refactor(vocab): enhance token weight handling in VocabLessonView
- Introduced a new mechanism for calculating token weights based on core patterns and important vocabulary, improving the accuracy of target-gloss pair orientation.
- Replaced the previous hint logic with a more robust token-based scoring system, enhancing the quality of vocabulary item representation.
- Streamlined the code for better maintainability and clarity in vocabulary preparation processes.
2026-04-07 11:32:14 +02:00
Torsten Schulz (local)
a18b3580d8 refactor(vocab): update vocabulary label handling in VocabLessonView
- Replaced computed properties for current vocabulary preparation labels with direct references to new properties, enhancing clarity and maintainability.
- Improved the logic for populating native and target hints, ensuring accurate representation of vocabulary items.
- Removed outdated label swapping logic, streamlining the code and focusing on course-specific language names for better user experience.
2026-04-07 11:22:22 +02:00
Torsten Schulz (local)
c06544d1cc feat(vocab): attach language names to course data in VocabService
- Added a method to attach language names to course rows, enhancing the clarity and localization of vocabulary lessons.
- This update improves the overall user experience by ensuring accurate representation of language names in course data.
2026-04-07 11:13:38 +02:00
Torsten Schulz (local)
562838fa15 feat(vocab): add course language name handling in VocabLessonView
- Introduced new properties for course language names to enhance clarity in vocabulary preparation.
- Implemented a method to load course language names from the API, improving localization and user experience.
- Updated label logic to utilize course-specific language names, ensuring accurate representation in vocabulary lessons.
2026-04-07 10:29:28 +02:00
Torsten Schulz (local)
06ca5eed97 feat(vocab): refine vocabulary label logic in VocabLessonView
- Introduced computed properties for current vocabulary preparation labels, enhancing clarity and localization.
- Updated label handling to dynamically adjust based on the context of target and gloss items, improving user experience.
- Enhanced the logic for determining when to swap labels, ensuring accurate representation of vocabulary items for better learning outcomes.
2026-04-07 10:22:36 +02:00
Torsten Schulz (local)
e8faeeb008 feat(vocab): enhance vocabulary label handling in VocabLessonView
- Refactored VocabLessonView to utilize computed properties for vocabulary preparation labels, improving localization and maintainability.
- Updated the logic for target and gloss labels to prioritize course-specific language names, enhancing user experience and clarity in vocabulary presentation.
- Improved the orientation logic for target-gloss pairs to ensure accurate representation of vocabulary items, contributing to better learning outcomes.
2026-04-07 10:07:54 +02:00
Torsten Schulz (local)
49892f0fc6 feat(vocab): improve vocabulary preparation logic in VocabLessonView
- Refactored prepItems method to ensure only valid target-gloss pairs are included, enhancing the quality of vocabulary preparation.
- Introduced a mechanism to limit the output to a maximum of 30 unique pairs, improving the compactness of the preparation round.
- Enhanced handling of core patterns and extracted vocabulary to prioritize high-quality learning materials.
2026-04-07 09:58:33 +02:00
Torsten Schulz (local)
0909d1047d feat(vocab): update course today plan localization and UI logic
- Added new localization strings for scenarios with no due reviews in German, English, and Spanish, enhancing user guidance.
- Updated VocabCourseView to conditionally display the appropriate introduction message based on the presence of due reviews, improving clarity in the course flow.
2026-04-07 09:55:01 +02:00
Torsten Schulz (local)
9f498df87e feat(vocab): enhance feedback acknowledgment and localization in vocabulary lessons
- Added acknowledgment messages for exercise reinforcement in German, English, and Spanish localization files to improve user guidance.
- Updated VocabLessonView to include a feedback acknowledgment button, enhancing user interaction after answering questions.
- Implemented logic to track feedback acknowledgment state, improving the flow of lesson reviews and user experience.
2026-04-07 09:47:45 +02:00
Torsten Schulz (local)
e4450405cd feat(vocab): add lesson review functionality and update navigation
- Introduced VocabLessonReviewView for reviewing lessons within the vocabulary course structure.
- Updated routing in socialRoutes.js to include a new path for lesson reviews, ensuring authenticated access.
- Modified VocabCourseView to change the lesson button click behavior to navigate to the review view, enhancing user flow.
- Added a new method to handle lesson review navigation, improving the overall user experience in the vocabulary section.
2026-04-07 09:38:00 +02:00
Torsten Schulz (local)
962a9d0513 feat(vocab): enhance vocabulary exercises and localization support
- Updated core patterns in BISAYA_PHASE5_DIDACTICS to include gloss translations for better understanding.
- Refactored vocabulary exercise generation in update-food-care-exercises.js to improve randomization and user engagement.
- Added new exercise types and improved question structures for vocabulary lessons, enhancing the learning experience.
- Enhanced localization files for German, English, and Spanish to support new exercise features and improve user guidance.
- Updated VocabLessonView to incorporate sequential navigation for exercises, providing a more structured learning flow.
2026-04-07 09:09:43 +02:00
Torsten Schulz (local)
5ad8ef434a refactor(vocabService, VocabLessonView): unify answer language classification for multiple-choice questions
- Renamed and refactored the method for classifying answer languages in multiple-choice questions from _classifyMcQuestionSide to _resolveMcAnswerSide for clarity and consistency.
- Updated the logic to classify answer languages based on questionData.answerLanguage and answerLanguageId, improving accuracy in determining the correct language context.
- Adjusted VocabLessonView to utilize the new classification method, ensuring alignment with backend changes and enhancing the handling of distractor options based on answer language.
- Enhanced documentation to clarify the expected input and output for the new method, improving maintainability and understanding of the codebase.
2026-04-07 08:34:19 +02:00
Torsten Schulz (local)
7ff5e9af52 feat(political-office): enhance political office benefits and salary computation
- Added a new hierarchyLevel field to PoliticalOfficeType for better categorization of political roles.
- Updated computePoliticalDailySalaryPayout function to incorporate hierarchy level in salary calculations, allowing for more dynamic salary adjustments based on office rank.
- Modified SQL scripts to reflect changes in political office benefits, ensuring compatibility with the new salary structure.
- Enhanced localization files to support updated benefit descriptions and salary formats across multiple languages.
- Improved UI components to display the new salary calculations and benefits accurately in the PoliticsView.
2026-04-02 16:49:18 +02:00
Torsten Schulz (local)
34d8882b84 refactor(PoliticsView): enhance UI layout and styling for political information display
- Improved the layout of the political information section by introducing a structured row format for better readability.
- Updated CSS styles to enhance the visual hierarchy and alignment of labels and values, ensuring a more user-friendly interface.
- Adjusted the display of benefits and term end information to provide clearer context and organization within the PoliticsView component.
2026-04-02 16:09:52 +02:00
Torsten Schulz (local)
5934661746 feat(political-benefits): implement political powers and benefits system
- Added new political powers and benefits functionalities, including reputation ticks, tax jurisdiction management, and appointment capabilities.
- Introduced a new job for periodic reputation updates and created necessary database tables for tracking political benefits.
- Enhanced the FalukantController and services to support new endpoints for managing political powers and appointments.
- Updated localization files to reflect new features and improve user experience across multiple languages.
- Modified the UI to display new political powers and benefits, ensuring accurate representation in the PoliticsView.
2026-04-02 16:00:29 +02:00
Torsten Schulz (local)
6988a2c0ac feat(politics): add new political office benefits and enhance database migration
- Introduced new benefits including 'reputation_periodic', 'appoint_politicians', 'set_regional_tax', 'free_lover_slots', 'guard_protection', and 'court_immunity' to the political office system.
- Updated database migration to add and remove the 'last_political_daily_salary_on' column using SQL queries for better performance.
- Enhanced localization files for multiple languages to support new benefits, improving user experience across the application.
- Updated UI components to display new benefits correctly in the PoliticsView, ensuring accurate representation of political office functionalities.
2026-04-02 15:27:05 +02:00
Torsten Schulz (local)
233857c157 feat(dashboard): enhance widget availability and initialization
- Updated `getAvailableWidgets` method in `DashboardService` to merge default widget types with database entries, ensuring immediate visibility of new widgets post-deployment.
- Introduced `DASHBOARD_WIDGET_TYPE_DEFAULTS` in `initializeWidgetTypes` for canonical widget types, facilitating API merging when database entries are absent.
- Modified `StatusBar.vue` to utilize a computed property for quick access children, improving menu item handling and visibility based on user context.
- Enhanced `LoggedInView.vue` to dynamically return localized widget labels, improving user experience with accurate translations.
2026-04-02 15:19:08 +02:00
Torsten Schulz (local)
1adbbe5cfb feat(vocab): add dashboard learning summary and related endpoints
- Introduced `getDashboardLearningSummary` method in `VocabService` to provide a compact overview of enrolled courses and current lessons for users.
- Updated `vocabController` to include a new route for the dashboard widget, allowing users to access their learning summary.
- Enhanced `vocabRouter` to route requests for the new dashboard widget endpoint.
- Added localization support for the new dashboard features across multiple languages, improving user engagement and accessibility.
- Updated UI components to integrate the new dashboard widget, ensuring a seamless user experience.
2026-04-02 15:06:50 +02:00
Torsten Schulz (local)
b3191e534d feat(vocab): enhance vocabService and VocabLessonView for improved exercise handling
- Updated VocabService to include validation for synthetic exercise IDs and added methods for generating multiple-choice exercises based on chapter lexemes.
- Implemented a seeded shuffle function to randomize distractor options in multiple-choice questions, ensuring varied user experiences.
- Modified VocabLessonView to adjust target calculations for lesson goals and unlock attempts, increasing the maximum limits for better flexibility in user progress tracking.
2026-04-02 14:23:21 +02:00
Torsten Schulz (local)
676ef97d08 feat(localization): enhance course progress and review messaging across multiple languages
- Added new confirmation titles and messages for resetting and marking lessons as complete in admin and user interfaces.
- Expanded course flow and review scheduling messages to improve clarity and user guidance in Cebuano, German, Spanish, and English.
- Introduced a new section in the VocabCourseView to display today's recommended steps for users, enhancing the learning experience.
- Updated localization files to ensure consistent messaging and improved user engagement across all supported languages.
2026-04-02 13:49:59 +02:00
Torsten Schulz (local)
9630552a4e extended admin tool for finished lessons 2026-04-02 13:32:13 +02:00
Torsten Schulz (local)
d3c8ec2ed2 feat(vocab): enhance lesson progress tracking and review scheduling
- Updated VocabService to include lessonId and lessonNumber in progress data, improving tracking accuracy.
- Modified getLessonProgress and lastProgressTouch methods to accept lesson parameters, enhancing flexibility in progress retrieval.
- Implemented formatReviewBadgeSchedule method to manage review scheduling notifications, providing clearer user feedback.
- Updated VocabCourseView to reflect changes in lesson progress handling, ensuring accurate display of review statuses and due dates.
- Expanded localization for review scheduling messages across multiple languages, enhancing user experience.
2026-04-02 13:27:24 +02:00
Torsten Schulz (local)
a15ff1cb15 feat(bisaya-course): add family vocabulary and exercises for relatives
- Introduced new content for the 'Familie - Verwandte & Stieffamilie' lesson, including learning goals, core patterns, grammar focus, speaking prompts, and practical tasks.
- Added multiple-choice and gap-fill exercises related to family vocabulary, enhancing the learning experience for users.
- Updated course content to reflect the new lesson and exercises, ensuring comprehensive coverage of family-related terms in Bisaya.
2026-04-02 09:31:46 +02:00
Torsten Schulz (local)
91ee7d2f83 feat(admin): add user vocab course management functionality
- Implemented `getUserVocabCourses` and `getVocabCourseForAdmin` methods in `AdminController` to allow admins to retrieve enrolled vocab courses for users and specific course details, respectively.
- Updated `adminRouter` to include new routes for accessing user vocab courses and course details.
- Enhanced `AdminService` with methods to list user-enrolled vocab courses and retrieve course information with lessons, ensuring proper access control.
- Improved `VocabService` to support the new functionalities, including attaching language names to course data.
- Updated UI components in `UsersView` to reflect changes, including error handling and loading states for course retrieval, along with localization updates for new features.
2026-04-02 09:21:52 +02:00
Torsten Schulz (local)
c53bcf1555 refactor(ui): enhance AppContent layout for improved routing and styling
- Wrapped the router-view in a new div to manage layout and styling more effectively.
- Updated CSS to ensure proper height management and scrolling behavior, allowing for better content display.
- Added comments to clarify the purpose of layout adjustments and ensure maintainability.
2026-04-02 08:56:24 +02:00
Torsten Schulz (local)
fe7b545530 fix(ui): update styles and localization in UsersView and AppShell
- Added styles to ensure the app shell content occupies only the remaining space, preventing overflow issues.
- Updated the header in UsersView to reflect accurate localization for user administration.
2026-04-02 08:48:06 +02:00
Torsten Schulz (local)
92a8c3ff62 feat(vocab): implement user vocab lesson progress reset functionality
- Added `resetUserVocabLessonProgress` method in `AdminController` to allow admins to reset a user's progress for a specific vocab lesson.
- Introduced corresponding route in `adminRouter` for the new reset functionality.
- Enhanced `VocabService` with methods to purge lesson progress for users, ensuring that only the specified lesson's progress is affected.
- Updated UI components in `UsersView` to facilitate the selection of courses and lessons for resetting progress, including confirmation dialogs and loading states.
- Added localization support for the new reset functionality across multiple languages.
- Implemented reset functionality in `VocabLessonView` for users to reset their own lesson progress.
2026-04-02 08:25:56 +02:00
Torsten Schulz (local)
69304dd283 feat(user): enhance email handling with validation and normalization functions
- Introduced `looksLikePlausibleEmail` to validate email format, ensuring only plausible addresses are processed.
- Added `normalizeEmailCandidate` to standardize email input, returning null for invalid formats.
- Updated `decodeEncryptedBlob` to utilize normalization functions for both UTF-8 and hex formats, improving email decryption reliability.
- Adjusted `SettingsService` to ensure email is set after merging adult access state, maintaining data integrity.
2026-04-02 08:07:25 +02:00
Torsten Schulz (local)
5bb325f39d refactor(ui): update layout styles for AppContent and AccountView components
- Changed layout from grid to flex in AccountView for improved responsiveness and alignment.
- Adjusted flex properties in AppContent to ensure proper scrolling behavior and height management.
- Enhanced styling for account settings panel to support better content overflow handling and visual consistency.
2026-04-02 08:05:32 +02:00
Torsten Schulz (local)
6ad66da836 feat(localization): expand language support and enhance UI for user settings
- Added support for additional UI locales including Cebuano and Spanish, improving accessibility for a broader user base.
- Updated language selection components in the AppHeader and SettingsWidget to reflect new language options, enhancing user experience.
- Enhanced localization of various UI elements across components, ensuring consistent language representation and improved user engagement.
- Implemented logic to synchronize user language preferences with backend settings, providing a seamless experience when changing languages.
2026-04-02 07:54:44 +02:00
Torsten Schulz (local)
30906e0dc3 feat(vocab): implement scheduled review management in VocabService and UI updates
- Added methods in VocabService to handle scheduled review states, including normalization of review dates and management of review stages.
- Enhanced lesson state management to support review scheduling, improving the learning process for users.
- Updated VocabCourseView and VocabLessonView to display review statuses and due dates, providing clearer feedback on lesson progress and review requirements.
- Introduced new UI elements to indicate review status, enhancing user engagement and understanding of lesson timelines.
2026-04-01 16:03:42 +02:00
Torsten Schulz (local)
b1db5a42e8 refactor(bisaya-course): enhance pedagogy logic for German lessons
- Updated the `getGermanForBisayaLessonPedagogy` function to include lesson titles for improved didactic mode determination, specifically adding support for 'contrast_training'.
- Modified multiple scripts to utilize the updated pedagogy function, ensuring consistent application of the new logic across various course phases.
- Enhanced the VocabService to recognize and handle 'contrast_training' as a didactic mode, improving lesson management and user experience.
- Updated UI components to reflect the new didactic mode, ensuring clarity in lesson presentation.
2026-04-01 15:52:53 +02:00
Torsten Schulz (local)
1243ab2557 feat(falukant): implement score threshold logic and enhance UI feedback for certificate progression
- Added a new function to calculate score thresholds based on certificate levels, improving the logic for determining promotion eligibility.
- Updated the FalukantService to include new properties for score and requirement checks, enhancing the decision-making process for certificate readiness.
- Enhanced the OverviewView component to display detailed hints and states regarding certificate progression, providing users with clearer feedback on their status.
- Localized new strings in multiple languages to support the updated UI elements and hints, improving user experience across different languages.
2026-04-01 15:47:11 +02:00
Torsten Schulz (local)
154d6f23e9 refactor(vocab): unify text normalization across VocabService and VocabPracticeDialog
- Enhanced text normalization methods in VocabService and VocabPracticeDialog to include normalization and improved regex for punctuation and symbols, ensuring consistent text handling.
- This update streamlines the normalization process, contributing to better user input processing and overall application reliability.
2026-04-01 15:24:22 +02:00
Torsten Schulz (local)
a52fcfcf01 refactor(vocab): improve text normalization consistency in VocabService and VocabLessonView
- Enhanced text normalization methods in both VocabService and VocabLessonView to include an additional trim operation, ensuring leading and trailing spaces are removed.
- This change improves the consistency and accuracy of text handling across the application, contributing to better user input processing.
2026-04-01 15:09:15 +02:00
Torsten Schulz (local)
6ca11856c6 refactor(vocab): standardize text normalization methods in VocabService and VocabLessonView
- Updated text normalization logic in VocabService to use a regex that replaces punctuation with spaces, improving text handling consistency.
- Refactored VocabLessonView to utilize the new normalization method for comparable text, enhancing the accuracy of user input processing.
- Ensured both components now share a unified approach to text normalization, streamlining code and improving maintainability.
2026-04-01 14:56:39 +02:00
Torsten Schulz (local)
78424d1def feat(bisaya-course): expand lesson didactics with new topics and detailed grammar focus
- Added new lesson topics including 'Überlebenssätze - Teil 1', 'Familien-Gespräche', 'Gefühle & Zuneigung', and 'Überlebenssätze - Teil 2' to enhance the curriculum.
- Updated existing lessons with more detailed learning goals, core patterns, grammar focus, speaking prompts, and practical tasks to improve learner engagement and comprehension.
- Refactored core patterns to include glosses for better understanding of vocabulary context.
- Enhanced the structure of lesson didactics to provide a more comprehensive learning experience for users.
2026-04-01 14:30:31 +02:00
Torsten Schulz (local)
31f560ed3f feat(vocab): implement repeat queue management in VocabService and VocabLessonView
- Added a new method in VocabService to sanitize and manage a repeat queue for vocabulary items, enhancing the learning process.
- Updated VocabLessonView to incorporate repeat queue functionality, allowing for better tracking of vocabulary that needs review.
- Refactored existing logic to ensure seamless integration of repeat queue features, improving user experience during vocabulary lessons.
2026-04-01 14:06:34 +02:00
Torsten Schulz (local)
1dbbe7d1b3 feat(vocab): enhance lesson state management and persistence in VocabLessonView
- Added a new JSONB field `lessonState` to the VocabCourseProgress model to store detailed lesson state information.
- Implemented methods in VocabService for sanitizing and serializing lesson state, ensuring robust data handling.
- Updated VocabLessonView to manage lesson state persistence, including local storage and server synchronization, improving user experience during vocabulary lessons.
- Introduced mechanisms for exporting and normalizing exercise answers, enhancing the accuracy of saved progress.
2026-04-01 11:16:56 +02:00
Torsten Schulz (local)
0968aefde8 feat(vocab): add grammar explanations to VocabLessonView and enhance localization
- Introduced new sections for grammar explanations in VocabLessonView, providing users with contextual insights during vocabulary lessons.
- Added localization keys in German, English, and Spanish for the new grammar explanation titles and introductions, improving user guidance across languages.
- Updated styles for the grammar explanation section to enhance visual clarity and user experience.
2026-04-01 10:22:53 +02:00
Torsten Schulz (local)
3b7591914a feat(i18n, vocab): enhance localization and vocabulary preparation in VocabLessonView
- Added new localization keys in German, English, and Spanish for exercise flow, progress, and learning path instructions, improving user guidance across languages.
- Updated VocabLessonView to incorporate these new keys, enhancing the clarity of vocabulary preparation steps and overall user experience during lessons.
- Refactored the layout to better present the learning path and vocabulary preparation stages, ensuring a more cohesive and informative interface.
2026-04-01 10:21:13 +02:00
Torsten Schulz (local)
6f15424641 feat(i18n): add new localization keys for lesson details and deepening sections
- Introduced new localization strings in German, English, and Spanish for lesson detail toggles and deepening sections, enhancing user experience across multiple languages.
- Updated VocabLessonView to incorporate these new localization keys, improving the clarity and accessibility of lesson information for users.
2026-04-01 10:05:37 +02:00
Torsten Schulz (local)
f4e588f42d feat(vocab): integrate fallback core patterns and enhance vocabulary display in VocabLessonView
- Added a new method in VocabService to merge core pattern glosses with fallback patterns, improving vocabulary clarity and consistency.
- Updated VocabLessonView to utilize the merged core patterns, ensuring a comprehensive vocabulary overview for users.
- Refactored vocabulary handling logic to enhance user experience during vocabulary lessons, including improved display of lesson vocabulary.
2026-04-01 09:58:32 +02:00
Torsten Schulz (local)
b77072fb8a feat(vocab): enrich core patterns with glosses in VocabService and VocabLessonView
- Implemented a new method in VocabService to enhance core patterns with glosses derived from extracted vocabulary, improving the clarity of vocabulary entries.
- Updated the VocabLessonView to utilize the enriched core patterns, ensuring that glosses are displayed alongside vocabulary targets for better user comprehension.
- Refactored vocabulary preparation logic to integrate glosses seamlessly, enhancing the overall user experience during vocabulary lessons.
2026-04-01 09:40:33 +02:00
Torsten Schulz (local)
911a037a33 feat(vocab-prep): implement enhanced vocabulary preparation steps in VocabLessonView
- Introduced a structured vocabulary preparation process with two review stages before engaging with the vocabulary trainer.
- Added localization support for new vocabulary preparation messages in German, English, and Spanish, improving accessibility for users.
- Updated the VocabLessonView component to display current progress and next steps during vocabulary preparation, enhancing user guidance.
- Refactored related logic to manage preparation stages and item navigation effectively.
2026-04-01 08:58:36 +02:00
Torsten Schulz (local)
5445db0de7 feat(bisaya-course): restructure core patterns and enhance vocabulary preparation
- Updated core patterns in various scripts to use an object format with target phrases and glosses, improving clarity and usability for learners.
- Enhanced the VocabService to normalize core pattern entries, ensuring consistent handling of vocabulary data.
- Introduced new vocabulary preparation steps in the VocabLessonView, guiding users through active review processes before engaging with the vocabulary trainer.
- Added localization support for new vocabulary preparation hints and instructions in multiple languages, enhancing user experience across the application.
2026-04-01 08:12:57 +02:00
Torsten Schulz (local)
345a9fe08d refactor(VocabLessonView): combine lesson description and learning goals into a single component
- Merged the lesson description and learning goals sections into a unified block for improved layout and readability.
- Updated styles to enhance the visual presentation of the combined content, ensuring a more cohesive user experience.
2026-04-01 08:06:06 +02:00
Torsten Schulz (local)
51d3f65b7e refactor(AppSectionBar): update localization keys for section labels and titles
- Changed localization keys in AppSectionBar.vue to simplify and standardize the structure by removing the 'general' prefix.
- Updated section labels and title mappings to reflect the new key structure, enhancing consistency across the application.
2026-03-31 18:10:18 +02:00
Torsten Schulz (local)
c33ccfcdc8 feat(bisaya-course): enhance German course content and localization support
- Updated the create-german-for-bisaya-course-content.js script to improve lesson pattern retrieval by introducing a new function for generating a lesson pattern pool.
- Added new exercises for various topics including 'Wohnung & Nachbarn', 'Besuch empfangen', 'Arzt, Apotheke, Termin', and 'Amt, Dokumente, Anmeldung', enhancing practical language skills for learners.
- Improved localization by integrating translation keys for various UI elements and error messages across multiple components, ensuring a consistent user experience in both German and Bisaya.
- Enhanced the main.js file to recognize Bisaya language preferences in browser settings, improving accessibility for users.
2026-03-31 17:40:03 +02:00
Torsten Schulz (local)
412ee708c2 feat(falukant): enhance relationship state handling and director updates
- Updated FalukantService to return user information alongside relationship state for improved context in relationship management.
- Modified DirectorInfo component to trigger a refresh when a new director is hired, ensuring up-to-date information.
- Added socket event handling for 'directorchanged' in BranchView to manage director updates effectively, enhancing real-time responsiveness in the application.
2026-03-31 12:09:55 +02:00
Torsten Schulz (local)
fd3e7099f8 feat(vocab): add lesson and completed lesson vocab pool endpoints
- Implemented new endpoints in VocabController for retrieving vocab pools based on lessons and completed lessons.
- Updated vocabRouter to include routes for accessing lesson vocab pools and completed lesson vocab pools.
- Enhanced VocabService with methods to extract vocab from exercises and lesson didactics, improving vocabulary retrieval for users.
- Modified VocabPracticeDialog and VocabCourseView components to support new vocab pool functionalities, enhancing user experience in vocabulary practice.
2026-03-31 11:59:48 +02:00
Torsten Schulz (local)
c1a3da4efb feat(bisaya-course): update German course creation script to support default owner retrieval
- Modified the create-german-for-bisaya-course.js script to allow optional ownerHashedId parameter.
- Implemented a new function to find a default owner ('system' or 'admin') if no ownerHashedId is provided.
- Updated documentation to reflect the change in usage for the script.
2026-03-31 11:42:23 +02:00
Torsten Schulz (local)
9f60ceb332 feat(falukant): add age information to lovers in family view
- Updated FalukantService to include age details for partners in relationships.
- Added translations for 'age' in English, German, and Spanish localization files.
- Enhanced FamilyView component to display age information for lovers and candidates, improving user experience.
2026-03-31 11:36:12 +02:00
Torsten Schulz (local)
5c74c7c98c feat(falukant): enhance child details with other parent information and birth context
- Updated FalukantService to include father and mother character IDs in child relationships.
- Added logic to retrieve and display other parent details in ChildDetailsDialog and FamilyView components.
- Introduced new translations for 'other parent' and 'birth context' in English, German, and Spanish localization files.
- Enhanced UI to show other parent information and birth context in child detail views.
2026-03-31 10:29:22 +02:00
Torsten Schulz (local)
5a25229206 refactor(deploy): update deployment workflow for production
- Renamed workflow from "Deploy yourpart (blue-green)" to "Deploy to production" for clarity.
- Removed environment variables for SSH configuration and replaced them with direct references to secrets for improved security.
- Updated SSH connection and deployment script steps to utilize secrets for host, port, and user, enhancing the deployment process.
2026-03-31 10:14:09 +02:00
Torsten Schulz (local)
4b1e5a9c8a feat(bisaya-course): enhance evening and sleep routines in course content
- Updated the Bisaya course to include new evening greetings and sleep-related phrases in core patterns.
- Added multiple exercises focusing on recognizing and using these phrases, improving practical language skills for learners.
- Expanded lesson didactics to incorporate prompts for evening and sleep routines, enriching the overall learning experience.
2026-03-31 10:13:12 +02:00
Torsten Schulz (local)
96eb83f2bd feat(bisaya-course): enhance evening greetings and sleep-related exercises
- Updated core patterns to include evening greetings and sleep phrases in the Bisaya course content.
- Added new exercises focusing on recognizing and using evening greetings and sleep wishes, enhancing practical language use for learners.
- Expanded lesson didactics to incorporate evening and sleep-related conversational prompts, improving the overall learning experience.
2026-03-31 09:39:46 +02:00
Torsten Schulz (local)
a1c1edd37a feat(bisaya-course): expand exercises for shopping, neighborhood visits, conflict resolution, and free speaking
- Added new exercises in multiple-choice, gap-fill, and situational response formats for categories including 'Einkaufen vertiefen', 'Nachbarschaft & Besuche', 'Rollenspiel - Konflikt und Hilfe', and 'Freies Sprechen - Alltag ohne Stütze'.
- Each exercise includes detailed instructions, question data, answer data, and explanations to enhance the learning experience for Bisaya language learners.
- Focused on practical scenarios to improve conversational skills and vocabulary retention.
2026-03-31 09:04:24 +02:00
Torsten Schulz (local)
0198b23617 feat(bisaya-course): add new exercises for various everyday scenarios
- Introduced multiple-choice, gap-fill, and situational response exercises across several categories including 'Besuch & Gastfreundschaft', 'Gesundheit im Alltag', 'Unterwegs & Transport', 'Kinder im Alltag', and 'Arzt & Termin'.
- Each category includes detailed instructions, question data, answer data, and explanations to enhance learning experiences.
- Expanded the vocabulary and situational context for learners to practice real-life interactions in Bisaya.
2026-03-31 08:56:36 +02:00
Torsten Schulz (local)
9653a0021b feat(admin): add potential fathers retrieval for character management
- Implemented a new method in AdminService to fetch potential fathers for a given character based on existing relationships.
- Updated AdminController to expose this functionality via a new API endpoint.
- Enhanced adminRouter to include the route for retrieving potential fathers.
- Modified frontend components to allow selection of potential fathers during pregnancy and birth management.
- Updated internationalization files to include new translation keys related to father selection.
2026-03-31 08:50:56 +02:00
Torsten Schulz (local)
4b7ab5fb60 refactor(update-backend): remove temporary environment directory cleanup
- Eliminated the removal of the temporary environment directory in the update-backend.sh script to retain the environment for potential debugging or further use.
2026-03-31 07:50:19 +02:00
Torsten Schulz (local)
cd16048e0a refactor(update-backend): clean up script by removing unnecessary newline
- Removed an extra newline in the update-backend.sh script to improve readability and maintainability.
2026-03-31 07:35:47 +02:00
Torsten Schulz (local)
905bafb92f refactor(update-backend): streamline .env file handling process
- Replaced the previous method of copying .env files with a direct installation from a specified source path.
- Improved permissions and ownership settings for the .env file to enhance security.
- Added user feedback for successful file transfer and verification steps.
2026-03-30 16:19:00 +02:00
Torsten Schulz (local)
d2be12cbb8 fix(i18n): correct translation directions in socialnetwork.json files
- Updated translation keys in German, English, and Spanish localization files to accurately reflect the intended language direction for vocabulary translation.
- Adjusted the `translateTo` and `translateFrom` keys to ensure consistency across all language files.
2026-03-30 16:03:23 +02:00
Torsten Schulz (local)
06dc61e37a feat(vocab): add vocab distractor pool functionality
- Implemented a new endpoint to retrieve a pool of distractors for vocabulary exercises based on prior lessons.
- Updated the VocabController and VocabRouter to include the new getVocabDistractorPool method.
- Enhanced VocabService to classify questions and gather distractors from previous lessons.
- Modified VocabLessonView to fetch and utilize the distractor pool for multiple-choice exercises, improving the learning experience.
2026-03-30 15:13:10 +02:00
Torsten Schulz (local)
4f616e7f9f feat(family): enhance family view and character pregnancy handling
- Updated the FalukantCharacter model to include a default scope that excludes pregnancy-related fields for compatibility with older databases.
- Implemented a new method in FalukantService to conditionally retrieve pregnancy information based on database schema.
- Enhanced the FamilyView component to display a summary navigation for family relationships, including partners, children, and lovers.
- Updated internationalization files to include new translations for family-related terms and summaries.
2026-03-30 14:36:02 +02:00
Torsten Schulz (local)
72071a83bd feat(update-backend): add .env file handling from live system
- Implemented functionality to copy the .env file from the live system to the backend directory if it exists.
- Added ownership change for the copied .env file to ensure proper permissions.
- Included user feedback for successful or failed .env file transfer.
2026-03-30 14:16:15 +02:00
Torsten Schulz (local)
b5df09be9b feat(admin): implement pregnancy and birth management features
- Added new admin functionalities to force pregnancy, clear pregnancy, and trigger birth for characters.
- Introduced corresponding routes and controller methods in adminRouter and adminController.
- Enhanced the FalukantCharacter model to include pregnancy-related fields.
- Created database migration for adding pregnancy columns to the character table.
- Updated frontend views and internationalization files to support new pregnancy and birth management features.
- Improved user feedback and error handling for these new actions.
2026-03-30 13:44:43 +02:00
Torsten Schulz (local)
ba5563e55a refactor(update scripts): enhance directory handling and error management
- Updated update-backend.sh and update-frontend.sh to accept a target directory as a parameter, improving flexibility.
- Refactored paths to use the target directory for all operations, ensuring consistency and reducing hardcoded values.
- Added error handling with 'set -euo pipefail' for better script reliability.
- Improved user feedback by displaying the target directory during updates.
2026-03-30 13:19:11 +02:00
Torsten Schulz (local)
8457189e4b fix(deploy.yml): update deployment script path for blue-green deployment
- Changed the deployment script path from 'actualize-yourpart.sh' to 'deploy-yourpart-bluegreen.sh' to reflect the new deployment strategy.
2026-03-30 11:48:49 +02:00
Torsten Schulz (local)
e407696269 fix(deploy.yml): enhance SSH connection testing for deployment
- Added options to disable strict host key checking and enable batch mode for improved SSH connection reliability during deployment.
2026-03-30 11:40:00 +02:00
Torsten Schulz (local)
86450096f6 refactor(deploy.yml): improve SSH deployment process
- Added steps to prepare SSH keys and known hosts for secure connections.
- Implemented a test for the SSH connection to ensure successful deployment.
- Updated the deployment step to use SSH for executing the deployment script on the production server.
2026-03-30 11:35:34 +02:00
Torsten Schulz (local)
84fb486e1d refactor(update.sh): enhance script functionality and user feedback
- Improved error handling to ensure the script exits on failure.
- Added a check for the current branch to ensure it is 'main' before proceeding.
- Updated git commands for better state management and clarity in user feedback messages.
2026-03-30 11:32:51 +02:00
Torsten Schulz (local)
f629999598 refactor(update.sh): improve update script reliability and clarity
- Changed shebang to use env for better portability.
- Added error handling to ensure the script exits on failure.
- Included a check to confirm the current branch is 'main' before proceeding.
- Updated git commands to fetch and reset to origin/main, ensuring a clean state.
- Enhanced user feedback messages for clarity.
2026-03-30 10:51:57 +02:00
Torsten Schulz (local)
04e273afd1 style(AppSectionBar): enhance layout and styling for improved visual presentation
- Updated .app-section-bar__copy to use flexbox for better alignment and spacing.
- Added gap and flex-wrap properties to improve layout responsiveness.
- Adjusted styles in .app-section-bar__eyebrow for a more cohesive design.
2026-03-30 10:45:49 +02:00
Torsten Schulz (local)
4e3a981271 refactor(StatusBar): improve layout and styling for better user experience
- Removed unnecessary label from character name display for a cleaner look.
- Adjusted grid layout and spacing in the StatusBar for enhanced alignment and responsiveness.
- Refined padding and gap settings to optimize visual presentation of status elements.
2026-03-30 10:40:57 +02:00
Torsten Schulz (local)
1975816dda refactor(StatusBar, PoliticsView): update UI elements and improve layout
- Modified StatusBar component to enhance character name display with a label suffix for clarity.
- Refactored styles in StatusBar for better alignment and spacing, improving overall visual presentation.
- Removed the PoliticsView hero section to streamline the layout and focus on tab content, enhancing user navigation.
2026-03-30 10:36:55 +02:00
Torsten Schulz (local)
ce71f6d8ea feat(StatusBar, falukantService): enhance character information display and UI structure
- Updated falukantService to include predefined first and last names in character data retrieval.
- Refactored StatusBar component layout to improve organization and visual clarity, introducing sections for identity and stats.
- Enhanced character name handling to prioritize display names, ensuring a more dynamic user experience.
2026-03-30 10:31:59 +02:00
Torsten Schulz (local)
b622cdb745 feat(MessagesDialog, StatusBar, i18n): enhance character death notifications and UI updates
- Added support for displaying character death notifications with detailed information including age, region, and relationships in both German and English.
- Updated MessagesDialog to format additional parameters such as region, spouses, children, and lovers based on the locale.
- Enhanced StatusBar to show the character's name dynamically, improving user experience.
- Modified i18n files to include new notification messages for character deaths, ensuring accurate translations for both languages.
2026-03-30 10:25:54 +02:00
Torsten Schulz (local)
34899cbc90 feat(VocabLessonView): improve vocab question generation and answer validation
- Introduced a new method to retrieve equivalent vocabulary answers based on user prompts and direction, enhancing the accuracy of answer options.
- Updated the buildChoiceOptions method to handle multiple correct answers and ensure the prompt is excluded from choices.
- Enhanced the current vocab question structure to support multiple acceptable answers, improving user feedback and engagement during exercises.
2026-03-30 08:45:59 +02:00
Torsten Schulz (local)
f78875265f feat(VocabLessonView): refine vocab trainer experience and improve user guidance
- Updated vocab trainer descriptions and button labels to better reflect user progress and encourage engagement.
- Enhanced visual indicators for exercise availability and review priorities, clarifying the learning path for users.
- Introduced new methods to calculate trainer targets and review blending, optimizing the learning experience based on user performance.
2026-03-28 23:41:25 +01:00
Torsten Schulz (local)
ac1cf3a601 feat(VocabLessonView): enhance exercise access and vocab trainer experience
- Added conditional access to exercises based on user progress and previous vocab completion.
- Introduced visual indicators for exercise availability and review priorities to guide users.
- Updated vocab trainer descriptions and button labels to reflect the user's current state and encourage engagement.
- Implemented methods to manage exercise unlock conditions and improve user feedback on progress.
2026-03-28 13:11:05 +01:00
Torsten Schulz (local)
d5a45f185d feat(vocabService): enhance answer validation for multiple choice exercises
- Improved answer validation logic by expanding multiple choice answer data based on lesson context.
- Added methods to extract indices of correct answers and normalize question prompts for better accuracy.
- Refactored existing answer checking to accommodate new data handling, ensuring robust evaluation of user responses.
2026-03-28 12:46:34 +01:00
Torsten Schulz (local)
65fc8fc89f feat(socialnetwork): enhance folder and video management with user visibility options
- Added functionality to manage selected users for adult folders and erotic videos, allowing for more granular visibility control.
- Introduced new endpoints and methods in the SocialNetworkController and SocialNetworkService to handle selected users.
- Updated the frontend components to include input fields for selected users in CreateFolderDialog, EditImageDialog, and EroticPicturesView.
- Enhanced the routing to support fetching erotic folders and videos by username, improving user experience in profile views.
2026-03-27 16:56:45 +01:00
Torsten Schulz (local)
a9814b24f7 fix(i18n): correct German translations for video upload hints and descriptions
- Updated the German translations in socialnetwork.json for improved accuracy and clarity.
- Enhanced the text in EroticPicturesView.vue and EroticVideosView.vue to ensure proper spelling and grammar in user-facing messages.
2026-03-27 16:29:18 +01:00
Torsten Schulz (local)
c2e0ca7301 refactor(i18n): update video management texts for clarity and consistency
- Revised the introductory texts and hints for video uploads in German, English, and Spanish to enhance user understanding.
- Improved descriptions to better reflect the functionality of the video management features.
- Removed outdated statistics display from the EroticVideosView component to streamline the user interface.
2026-03-27 15:43:15 +01:00
Torsten Schulz (local)
24feb70d61 refactor(EroticVideosView): restructure layout and enhance video statistics display
- Updated the layout of the EroticVideosView component to improve organization and user experience.
- Introduced a sidebar for video upload and management, separating it from the video list.
- Added statistics for total, visible, and hidden videos to provide users with better insights.
- Enhanced form elements and labels for clarity and usability during video uploads.
2026-03-27 15:36:00 +01:00
Torsten Schulz (local)
8f12838223 style(DialogWidget): update dialog overlay class for improved modal handling
- Changed the class binding for the dialog overlay to differentiate between modal and non-modal states, enhancing visual clarity.
- Introduced a new class for non-modal dialogs to ensure proper positioning and z-index management.
2026-03-27 15:21:57 +01:00
Torsten Schulz (local)
ee21be082b style(DialogWidget): remove backdrop filter for non-modal overlay
- Updated the non-modal dialog overlay to have no backdrop filter, enhancing visual clarity.
- Set the modal property to false in MessagesDialog to ensure proper dialog behavior.
2026-03-27 15:17:18 +01:00
Torsten Schulz (local)
02c510afe6 feat(chat): enhance room entry announcement logic in MultiChatDialog.vue
- Introduced a new property `lastAnnouncedRoomName` to track the last announced room, preventing redundant announcements.
- Updated the room entry announcement logic to ensure messages are sent only when entering a new room, improving clarity for users.
2026-03-27 15:10:38 +01:00
Torsten Schulz (local)
1dd3123b4a feat(chat): initialize current room name in MultiChatDialog.vue
- Added a new property `currentRoomName` to track the name of the currently selected room.
- Updated the initialization logic to reset `currentRoomName` when rooms are loaded and when the chat is disconnected, ensuring accurate room state management.
2026-03-27 15:03:32 +01:00
Torsten Schulz (local)
6c7ed9db83 fix(chat): improve room announcement logic in MultiChatDialog.vue
- Enhanced the logic for announcing room entries, particularly in adult-only mode, to ensure accurate messaging based on room selection.
- Added checks to prevent redundant announcements and ensure proper synchronization with the selected room.
2026-03-27 14:46:08 +01:00
Torsten Schulz (local)
93e2753f49 feat(chat): implement room synchronization for adult-only mode in MultiChatDialog.vue
- Added logic to handle room synchronization when entering a chat in adult-only mode.
- Introduced a flag to manage ongoing room sync requests, improving user experience during room transitions.
2026-03-27 14:37:49 +01:00
Torsten Schulz (local)
9e0046a3e7 refactor(chat): simplify adult-only mode checks in MultiChatDialog.vue
- Removed redundant checks for adult-only mode when opening the chat dialog and connecting the chat socket.
- Streamlined the logic to enhance readability and maintainability of the component.
2026-03-27 14:29:00 +01:00
Torsten Schulz (local)
5999a6d841 chore(dependencies): update package-lock.json and package.json for dependency versions
- Upgraded @emnapi/runtime to version 1.9.1 and @img/colour to version 1.1.0 in package-lock.json.
- Added new dependencies for ansi-regex and strip-ansi with updated versions in multiple locations.
- Updated lodash types to version 4.17.24 and ansi-escapes to version 7.3.0.
- Introduced overrides for minimatch and tmp in package.json to ensure consistent behavior across environments.
- Refactored MultiChatDialog.vue to improve room selection logic and handle adult-only mode more effectively.
2026-03-27 14:05:29 +01:00
Torsten Schulz (local)
06892fd0ac feat(navigation): enhance adult verification handling and notifications
- Updated navigationController to simplify the eroticChat menu structure.
- Enhanced adminService to notify users of adult verification status changes, including previous status.
- Improved AppNavigation and related components to register and unregister socket listeners for adult verification updates.
- Added localized messages for adult verification notifications in English, German, and Spanish.
- Introduced a verification hint in the EroticAccessView to guide users on document submission.
2026-03-27 13:23:44 +01:00
Torsten Schulz (local)
cf097772f4 style(admin): update button styles in AdultVerificationView and EroticModerationView
- Added new styles for buttons in the adult verification filters to enhance appearance and usability.
- Set minimum height, padding, and font size for consistency across both views.
2026-03-27 11:25:56 +01:00
Torsten Schulz (local)
91cc35fc59 feat(deploy): add adult verification directory creation and permissions setup
- Enhanced deploy-backend.sh and update-backend.sh to create the adult verification directory under /opt/yourpart-data.
- Updated permissions for the new directory to ensure proper access control.
- Refactored file path handling in AdminService and SettingsService to utilize the new directory structure for adult verification files.
2026-03-27 11:24:21 +01:00
Torsten Schulz (local)
1229bccf59 refactor(admin): restructure adult verification and erotic moderation views for improved layout
- Updated the AdultVerificationView and EroticModerationView components to utilize a new layout structure with content scrolling and hidden overflow for better user experience.
- Adjusted styles in styles.scss to support the new layout, ensuring proper height and overflow handling for content sections.
2026-03-27 11:18:42 +01:00
Torsten Schulz (local)
f367fcfc6e feat(admin): enhance adult verification file handling and localization
- Added a new method in AdminService to resolve adult verification file paths, improving file retrieval logic.
- Updated the AdminVerificationView to display a message when the verification document is missing.
- Localized the missing document message in German, English, and Spanish for better user experience.
2026-03-27 11:08:52 +01:00
Torsten Schulz (local)
e725555e2e fix(admin): add 'adult_verification_request' to user parameter type filtering
- Updated the filtering criteria in the AdminService to include 'adult_verification_request' in the user parameter type query, enhancing data retrieval for adult verification processes.
2026-03-27 10:57:16 +01:00
Torsten Schulz (local)
2caa362fa2 feat(admin): add document preview functionality to adult verification
- Implemented a preview section for adult verification documents, allowing users to view images and PDFs inline.
- Added localization support for preview titles and messages in German, English, and Spanish.
- Enhanced the component's state management to handle preview visibility and cleanup.
2026-03-27 10:50:28 +01:00
Torsten Schulz (local)
33080460c0 fix(settings): streamline settings type creation in settingsService and initialization
- Refactored settingsService to use findOrCreate for settings type, improving efficiency and error handling.
- Added initialization for 'account' settings type in initializeSettings, ensuring all necessary settings are created during setup.
2026-03-27 10:43:44 +01:00
Torsten Schulz (local)
d831b25400 fix(settings): enhance user parameter handling and add special user parameter types
- Introduced a new method to ensure special user parameter types for adult verification settings, improving data integrity and handling.
- Updated the upsertUserParam method to utilize the new special parameter type handling, ensuring robust user parameter management.
- Updated package dependencies in package.json and package-lock.json for consistency and to address potential vulnerabilities.
2026-03-27 10:38:42 +01:00
Torsten Schulz (local)
18522ca00d fix(dependencies): update @gltf-transform packages and sequelize-cli version
- Upgraded @gltf-transform/cli, core, extensions, and functions to version 4.3.0 for improved functionality and compatibility.
- Updated sequelize-cli to version 6.6.5 to address potential vulnerabilities.
- Added an overrides section in package.json for minimatch to ensure consistent behavior across environments.
- Refactored the EroticAccessView.vue component for improved structure and readability.
2026-03-27 10:23:25 +01:00
Torsten Schulz (local)
925bf3cc92 fix(api): improve 404 handling for unknown API routes
- Refactored the 404 response for API routes to ensure it only triggers for paths starting with '/api/', enhancing clarity in error handling.
- Updated package dependencies in package.json and package-lock.json to maintain version consistency and address potential vulnerabilities.
2026-03-27 09:52:24 +01:00
Torsten Schulz (local)
c90a5e5528 fix(cors): refine CORS handling for OPTIONS requests
- Updated CORS middleware to explicitly handle OPTIONS requests, ensuring proper preflight response and improving API request handling.
2026-03-27 09:49:54 +01:00
Torsten Schulz (local)
1e82b0ce1b fix(router): refine stock and inventory routes for improved clarity
- Updated stock and inventory routes to explicitly define branchId as a required parameter, enhancing API usability and consistency in request handling.
2026-03-27 09:39:51 +01:00
Torsten Schulz (local)
0729883a76 fix(router): update stock and inventory routes to support optional branchId parameter
- Modified the stock and inventory routes to allow an optional branchId parameter, improving flexibility in API requests.
2026-03-27 09:24:05 +01:00
Torsten Schulz (local)
f73c556de9 fix(deploy): update package-lock.json for consistent npm ci deployments
- Removed package-lock.json from .gitignore to ensure it is tracked.
- Added locks for backend, frontend, and repo root to maintain version consistency during deployments with npm ci.
- Updated backend with a new script for lockfile synchronization and added a description note.
2026-03-27 09:20:37 +01:00
Torsten Schulz (local)
71f439cb6b fix(deploy): package-lock.json versionieren für npm ci
- Zeile **/package-lock.json aus .gitignore entfernt; Locks zu backend,
  frontend und Repo-Root hinzugefügt, damit Deploy-Skripte mit npm ci
  dieselben Versionen wie package.json installieren.
- backend: Script lockfile:sync und Hinweis in description.

Made-with: Cursor
2026-03-27 09:16:17 +01:00
Torsten Schulz (local)
922e22f444 Add adult verification and erotic moderation features: Implement new routes and controller methods for managing adult verification requests, status updates, and document retrieval. Introduce erotic moderation actions and reports, enhancing administrative capabilities. Update chat and navigation controllers to support adult content filtering and access control. Enhance user parameter handling for adult verification status and requests, improving overall user experience and compliance. 2026-03-27 09:14:54 +01:00
Torsten Schulz (local)
b9e420cd37 Update product sell costs in SQL and initialization script: Adjust sell costs for various products to improve game balance, ensuring consistency across the database and initialization logic. 2026-03-26 20:21:48 +01:00
Torsten Schulz (local)
e0babfe380 Update product definitions and revenue calculations in Falukant: Adjust product sell costs and production times for better balance. Refactor revenue calculations to focus on profit per minute instead of revenue per minute. Enhance localization files to include new terms related to product unlocks and certificate levels in English, German, and Spanish, improving user experience across languages. 2026-03-26 20:19:49 +01:00
Torsten Schulz (local)
43dc31bc3f Enhance speech input handling in VocabLessonView: Introduce fallback instructions and placeholders for unsupported speech recognition in English, German, and Spanish. Update exercise instructions to dynamically display fallback options, improving user experience for speech-related exercises. 2026-03-25 18:07:01 +01:00
Torsten Schulz (local)
c97c1bca8f Enhance API key handling in settings and vocab services: Update key retrieval logic to improve validation and status reporting. Introduce new localization strings for key status messages in English, German, and Spanish. Update LanguageAssistantView to display key status dynamically, enhancing user feedback on API key management. 2026-03-25 17:46:18 +01:00
Torsten Schulz (local)
af6e12d80a Refactor email encryption handling in user and contact message models: Introduce utility functions for encoding and decoding encrypted values, simplifying the encryption process. Update the registerUser and handleForgotPassword functions to support multiple encrypted email formats. Enhance the VocabCourseView and VocabLessonView components with new methods for managing language assistant interactions, improving user experience. 2026-03-25 17:41:10 +01:00
Torsten Schulz (local)
519570344c Add language assistant features and improve encryption handling: Implement a new route and controller method for sending messages to the language assistant, enhancing user interaction within lessons. Update the encryption utility to support both base64 and hex formats for better compatibility with existing data. Enhance localization files to include new terms related to the language assistant in English, German, and Spanish, improving user experience across languages. 2026-03-25 17:31:00 +01:00
Torsten Schulz (local)
3ba34d2581 Enhance Bisaya course content by refining existing exercises and adding a new exercise for recognizing farewells: Update questions for clarity and introduce a new exercise focused on the meaning of "Babay," improving the overall learning experience for users. 2026-03-25 16:33:05 +01:00
Torsten Schulz (local)
d02e4f124f Enhance Bisaya course content with new greetings and farewells: Add exercises for recognizing and practicing morning greetings and farewells in Bisaya. Update lesson didactics to include new learning goals, core patterns, and speaking prompts related to greetings and farewells, improving the overall learning experience. 2026-03-25 16:28:29 +01:00
Torsten Schulz (local)
383dc20172 Update SQL scripts to include 'created_at' timestamp for exercise types: Modify insert statements in add_vocab_lesson_didactics.sql, create-vocab-courses.sql, and update-vocab-courses-existing.sql to add a 'created_at' column with the current timestamp, enhancing data tracking for vocabulary grammar exercise types. 2026-03-25 16:26:48 +01:00
Torsten Schulz (local)
b0d5901fe0 Refactor bisaya course progress reset logic: Replace raw SQL queries with Sequelize ORM methods for fetching lesson and exercise IDs. This improves code readability and maintainability while ensuring consistent database interactions. 2026-03-25 16:13:05 +01:00
Torsten Schulz (local)
3aae63d25d Improve exercise type validation and encryption in settings service: Enhance error handling for exercise type name checks in both create-bisaya-course-content and update-week1-bisaya-exercises scripts. Implement encryption for API keys and user settings in settingsService, ensuring sensitive data is securely stored. Update localization files to include new terms related to model patterns in English, German, and Spanish. 2026-03-25 16:09:04 +01:00
Torsten Schulz (local)
6e36ff1a6f Add language assistant settings and related features: Introduce new routes and controller methods for managing language assistant settings, including retrieval and saving of LLM configurations. Update navigation structure to include language assistant options. Enhance vocab course model to support additional learning attributes such as learning goals and core patterns. Update SQL scripts to reflect new database schema changes for vocab courses. Improve localization for language assistant settings in German and English. 2026-03-25 15:53:49 +01:00
Torsten Schulz (local)
048ed6167f Update environment configuration and enhance logging: Add support for loading a local .env file and improve logging behavior based on QUIET_ENV_LOGS settings. Introduce new diagnostic scripts in package.json for town worth and money flow analysis. Adjust production cost calculations in FalukantService to align with updated pricing logic and enhance product initialization parameters. 2026-03-25 13:23:51 +01:00
Torsten Schulz (local)
34d449143c Implement certificate progress feature in FalukantService and frontend: Add methods to calculate and retrieve certificate progress based on user attributes. Update localization files for English, German, and Spanish to include new terms related to certificate progress. Enhance OverviewView to display certificate details and requirements, improving user experience and clarity. 2026-03-25 11:59:43 +01:00
Torsten Schulz (local)
97232720de Enhance FalukantService to include certificate attribute: Add 'certificate' to user attributes and ensure default value is set if absent. Update product type retrieval logic to utilize effective certificate value for filtering. 2026-03-25 11:51:25 +01:00
Torsten Schulz (local)
2d3bc058a8 Add raid transport feature and related updates: Introduce new raid transport functionality in FalukantService and FalukantController, including methods for retrieving raid transport regions and handling guard counts. Update frontend components to support guard count input and display related costs. Enhance localization files to include new terms for raid transport and associated metrics in English, German, and Spanish. 2026-03-23 18:47:01 +01:00
Torsten Schulz (local)
1a3ced9399 Update package dependencies across frontend and backend: Upgrade various libraries including nodemon, sequelize-cli, and axios to their latest versions for improved performance and security. Adjust dependency versions in package.json files for both frontend and backend to ensure compatibility and stability. 2026-03-23 12:16:14 +01:00
Torsten Schulz (local)
df22d053d9 Add localization for marriage gift, lover maintenance, and household order: Update German, English, and Spanish translation files to include new terms related to marriage and household management. Enhance MoneyHistoryView to improve activity translation handling with additional candidate formats. 2026-03-23 12:09:31 +01:00
Torsten Schulz (local)
63f1e3a17b Enhance FalukantService error handling for debtors prison records: Implement try-catch logic to manage potential database errors when retrieving debtor records. Update nobility title requirements to include new house position values for various titles, ensuring consistency across the application. Adjust initialization script for title requirements to reflect these changes. 2026-03-23 12:05:26 +01:00
Torsten Schulz (local)
b8730b1015 Implement debtors prison features across the application: Enhance FalukantController to include debtors prison logic in various service methods. Update FalukantService to manage debtors prison state and integrate it into user data retrieval. Modify frontend components, including DashboardWidget, StatusBar, and BankView, to display debtors prison status and warnings. Add localization for debtors prison messages in English, German, and Spanish, ensuring clarity in user notifications and actions. 2026-03-23 11:59:59 +01:00
Torsten Schulz (local)
088c82337b Refactor political office type references in FalukantService: Update the alias for PoliticalOfficeType from 'officeType' to 'type' in multiple locations to improve clarity and consistency in candidate ranking logic. 2026-03-23 11:11:40 +01:00
Torsten Schulz (local)
489113f878 Implement church career information retrieval and update related components: Add a new method in FalukantService to fetch church career details for characters, including current and approved office levels. Enhance DashboardWidget, StatusBar, and ChurchView components to handle new church-related socket events and display relevant information. Update localization files for church-related terms and error messages in English, German, and Spanish. 2026-03-23 11:05:48 +01:00
Torsten Schulz (local)
454a9ec795 Enhance NobilityView with new house position and condition formatting: Introduce methods to format house position labels and house condition descriptions based on numeric values. Update requirement translations to utilize these new methods for improved clarity and localization. 2026-03-23 10:47:54 +01:00
Torsten Schulz (local)
bf0dbb34d8 Add new requirements for nobility titles and enhance service logic: Introduce checks for reputation, house position, house condition, office rank, and lover count in the FalukantService. Update title requirements in the initialization script to include these new criteria. Enhance localization for requirements in English, German, and Spanish, ensuring accurate translations for new conditions. 2026-03-23 10:31:32 +01:00
Torsten Schulz (local)
f23fc4f1e1 Update servant cost calculation and documentation: Adjust base servant cost formula to reflect a compressed time scale in Falukant, changing the calculation from a realistic monthly wage to an abstract maintenance value. Update implementation spec to clarify the new cost structure and time measurement for the external daemon. 2026-03-23 10:10:11 +01:00
Torsten Schulz (local)
a90ec95520 Fix typos in BranchView and OverviewView: Correct spelling of 'Steuerfläche', 'prüfen', and 'alltäglicher' for improved localization accuracy. 2026-03-23 10:04:32 +01:00
Torsten Schulz (local)
11f8df4656 Enhance FamilyView styles for improved layout and responsiveness: Adjust flex properties, grid configurations, and dimensions for better visual consistency. Implement new styles for lover candidate cards and family view to prevent overlap and ensure proper spacing across components. 2026-03-23 09:53:31 +01:00
Torsten Schulz (local)
cd84dc03d5 Add marriage management features: Implement endpoints for spending time with, gifting to, and reconciling with spouses in the FalukantController. Update UserHouse model to include household tension attributes. Enhance frontend components to manage marriage actions and display household tension details, including localization updates in multiple languages. 2026-03-23 09:34:56 +01:00
Torsten Schulz (local)
e23849bee7 Add random chat button to NoLoginView: Introduce a new button for starting random chats, enhancing user engagement options. Update layout for improved accessibility and visual consistency. 2026-03-22 13:19:22 +01:00
Torsten Schulz (local)
87494078b7 Refactor NoLoginView styles for improved layout and spacing: Adjust padding, margins, and grid properties to enhance visual consistency and responsiveness across components. 2026-03-22 11:44:44 +01:00
Torsten Schulz (local)
ec64efd709 Update NoLoginView styles: Change action panel alignment from space-between to flex-start for improved layout consistency and responsiveness. 2026-03-22 11:00:18 +01:00
Torsten Schulz (local)
1f0d23b63b Refactor AppContent and NoLoginView styles for improved layout: Adjust flex properties and dimensions to enhance responsiveness and ensure consistent spacing across components. 2026-03-22 10:28:24 +01:00
Torsten Schulz (local)
8e0c550547 Update NoLoginView styling: Adjust action panel dimensions and layout for improved responsiveness and spacing. Enhance flex properties to ensure better alignment and visual consistency across components. 2026-03-22 10:10:36 +01:00
Torsten Schulz (local)
e087c4fef9 Add lightweight mode to Character3D component: Introduce a new lightweight prop for optimized model loading based on age group. Update NoLoginView to utilize lightweight characters. Adjust styling for better layout and overflow handling in home view components. 2026-03-22 10:05:28 +01:00
Torsten Schulz (local)
09c11a298f Add servant management features: Implement endpoints for hiring, dismissing, and setting pay levels for servants in the FalukantController. Update UserHouse model to include servant-related attributes. Enhance frontend components to manage servant details, including staffing state and household order, with corresponding localization updates in multiple languages. 2026-03-22 09:57:44 +01:00
Torsten Schulz (local)
50c5204a5b Implement lover relationship management features: Add endpoints for creating, acknowledging, and managing lover relationships in the FalukantController. Enhance backend models with RelationshipState for tracking relationship statuses. Update frontend components to display and manage lover details, including marriage satisfaction and household tension. Improve localization for new features in multiple languages. 2026-03-20 11:37:46 +01:00
Torsten Schulz (local)
ab167fa144 Enhance usability and localization across components: Update USABILITY_CONCEPT.md with new focus areas, improve user feedback in AppFooter and FamilyView components, and refine text in various UI elements for better clarity and consistency. Replace console logs with user-friendly messages, correct German translations, and streamline interaction logic in multiple components. 2026-03-20 09:41:03 +01:00
Torsten Schulz (local)
78eba6b1fb Refactor feedback handling across components: Replace alert and confirm calls with centralized feedback functions for improved user experience. Update various components to utilize showError, showSuccess, and confirmAction for consistent messaging and confirmation dialogs. Enhance UI responsiveness and maintainability by streamlining feedback logic. 2026-03-19 16:18:51 +01:00
Torsten Schulz (local)
ebfc2d8508 Enhance OverviewView component to conditionally display character avatar and house: Introduce a new image container for character representation, ensuring it only renders when a character is present. Refactor existing code to remove duplicate avatar rendering logic and maintain a clean overview layout. 2026-03-19 15:07:53 +01:00
1446 changed files with 133079 additions and 6358 deletions

0
.codex Executable file
View File

View File

@@ -0,0 +1,9 @@
---
description: C++-Worker unter src/ sind obsolet — nicht erweitern oder als Quelle für Spiellogik nutzen
alwaysApply: true
---
# Legacy C++ (`src/`)
- Verzeichnis **`src/`** (C++-Worker, WebSocket-Server): **obsolet**. Keine neuen Features, keine fachlichen Fixes dort planen oder umsetzen, sofern der Nutzer nicht ausdrücklich etwas anderes verlangt.
- Falukant-Hintergrundlogik: **Backend** (`backend/`), **externer Daemon**, **Frontend** — siehe `docs/LEGACY_CPP_WORKERS.md`.

148
.gitea/workflows/deploy.yml Executable file
View File

@@ -0,0 +1,148 @@
name: Deploy to production
on:
push:
branches:
- main
jobs:
deploy:
runs-on: ubuntu-latest
steps:
- name: Checkout
uses: actions/checkout@v4
with:
fetch-depth: 2
- name: Detect vocab course changes
id: vocab_course_changes
shell: bash
run: |
set -euo pipefail
BASE="${{ gitea.event.before }}"
HEAD="${{ gitea.sha }}"
if [ -z "$BASE" ] || [[ "$BASE" =~ ^0+$ ]] || ! git cat-file -e "$BASE^{commit}" 2>/dev/null; then
BASE="HEAD~1"
fi
git diff --name-only "$BASE" "$HEAD" > changed-files.txt
cat changed-files.txt
COMMIT_MESSAGE="$(git log -1 --pretty=%B "$HEAD" || true)"
COURSE_SCRIPT_PATTERN='^backend/scripts/.*(bisaya|course|didactics|vocab)'
if echo "$COMMIT_MESSAGE" | grep -qi '\[force-deploy\]'; then
echo "force_deploy=true" >> "$GITHUB_OUTPUT"
else
echo "force_deploy=false" >> "$GITHUB_OUTPUT"
fi
if grep -E '^(backend/scripts/.*(bisaya|course|didactics|vocab)|backend/sql/.*vocab|backend/(migrations-active|migrations-archive)/.*vocab|docs/.*(COURSE|VOCAB|BISAYA|GERMAN_FOR_BISAYA))' changed-files.txt; then
echo "changed=true" >> "$GITHUB_OUTPUT"
else
echo "changed=false" >> "$GITHUB_OUTPUT"
fi
if grep -E "$COURSE_SCRIPT_PATTERN" changed-files.txt >/dev/null; then
echo "course_scripts_changed=true" >> "$GITHUB_OUTPUT"
else
echo "course_scripts_changed=false" >> "$GITHUB_OUTPUT"
fi
if grep -E '^frontend/' changed-files.txt >/dev/null; then
echo "frontend_changed=true" >> "$GITHUB_OUTPUT"
else
echo "frontend_changed=false" >> "$GITHUB_OUTPUT"
fi
# Kurs-/Didaktik-Scripts werden vor dem Sync separat uebertragen.
# Fuer sie sind npm ci, Migrationen und ein Backend-Restart nicht noetig.
if grep -E '^backend/' changed-files.txt \
| grep -Ev "$COURSE_SCRIPT_PATTERN" >/dev/null; then
echo "backend_app_changed=true" >> "$GITHUB_OUTPUT"
else
echo "backend_app_changed=false" >> "$GITHUB_OUTPUT"
fi
# App-Code-Änderungen, die einen echten Deploy benötigen
if grep -E '^(frontend/|backend/)' changed-files.txt \
| grep -Ev "$COURSE_SCRIPT_PATTERN" >/dev/null; then
echo "app_changed=true" >> "$GITHUB_OUTPUT"
else
echo "app_changed=false" >> "$GITHUB_OUTPUT"
fi
- name: Prepare SSH
run: |
mkdir -p ~/.ssh
printf "%s" "${{ secrets.PROD_SSH_KEY }}" > ~/.ssh/id_ed25519
chmod 600 ~/.ssh/id_ed25519
ssh-keyscan -p "${{ secrets.PROD_PORT }}" "${{ secrets.PROD_HOST }}" >> ~/.ssh/known_hosts
- name: Test SSH connection
run: |
ssh -i ~/.ssh/id_ed25519 \
-o StrictHostKeyChecking=no \
-o BatchMode=yes \
-p "${{ secrets.PROD_PORT }}" \
"${{ secrets.PROD_USER }}@${{ secrets.PROD_HOST }}" \
"echo SSH OK"
- name: Deploy vocab course scripts without app rebuild
if: steps.vocab_course_changes.outputs.course_scripts_changed == 'true' && steps.vocab_course_changes.outputs.backend_app_changed != 'true' && steps.vocab_course_changes.outputs.force_deploy != 'true'
shell: bash
run: |
set -euo pipefail
tar -czf - backend/scripts \
| ssh -i ~/.ssh/id_ed25519 \
-p "${{ secrets.PROD_PORT }}" \
"${{ secrets.PROD_USER }}@${{ secrets.PROD_HOST }}" \
"sudo -n -u yourpart tar -xzf - -C /opt/yourpart"
- name: Run deployment script
if: steps.vocab_course_changes.outputs.app_changed == 'true' || steps.vocab_course_changes.outputs.force_deploy == 'true'
run: |
DEPLOY_FLAGS=""
if [ "${{ steps.vocab_course_changes.outputs.force_deploy }}" = "true" ]; then
DEPLOY_FLAGS=""
elif [ "${{ steps.vocab_course_changes.outputs.backend_app_changed }}" = "true" ] && [ "${{ steps.vocab_course_changes.outputs.frontend_changed }}" != "true" ]; then
DEPLOY_FLAGS="--skip-frontend"
elif [ "${{ steps.vocab_course_changes.outputs.frontend_changed }}" = "true" ] && [ "${{ steps.vocab_course_changes.outputs.backend_app_changed }}" != "true" ]; then
DEPLOY_FLAGS="--skip-backend"
fi
DEPLOY_TARGET="${{ secrets.PROD_DEPLOY_TARGET }}"
if [ -z "$DEPLOY_TARGET" ]; then
DEPLOY_TARGET="/opt/yourpart-green"
fi
echo "Deploy-Flags: ${DEPLOY_FLAGS:-<none>}"
echo "Deploy-Target: $DEPLOY_TARGET"
ssh -i ~/.ssh/id_ed25519 \
-p "${{ secrets.PROD_PORT }}" \
"${{ secrets.PROD_USER }}@${{ secrets.PROD_HOST }}" \
"/home/tsschulz/deploy-yourpart-bluegreen.sh ${DEPLOY_TARGET} ${DEPLOY_FLAGS}"
- name: Skip full deployment (no app changes)
if: steps.vocab_course_changes.outputs.app_changed != 'true' && steps.vocab_course_changes.outputs.force_deploy != 'true'
run: |
echo "Kein Full-Deploy: Es wurden keine Frontend/Backend-App-Dateien geändert."
- name: Sync vocab course content
if: steps.vocab_course_changes.outputs.changed == 'true' || steps.vocab_course_changes.outputs.force_deploy == 'true'
run: |
# Decide whether to actually run the phase3 update on the server.
# By default we run the deploy script in --dry-run mode. To enable the
# actual run set the secret PHASE3_UPDATE=1 in the repo settings.
RUN_FLAG="--dry-run"
if [ "${{ secrets.PHASE3_UPDATE }}" = "1" ]; then
RUN_FLAG=""
fi
ssh -i ~/.ssh/id_ed25519 \
-p "${{ secrets.PROD_PORT }}" \
"${{ secrets.PROD_USER }}@${{ secrets.PROD_HOST }}" \
"cd /opt/yourpart && npm --prefix backend run sync:vocab-courses && if [ -x backend/scripts/deploy-phase3-update.sh ]; then bash backend/scripts/deploy-phase3-update.sh $RUN_FLAG; else echo 'deploy-phase3-update.sh not found or not executable'; fi"

29
.github/workflows/android-security.yml vendored Normal file
View File

@@ -0,0 +1,29 @@
name: Android Security
on:
push:
paths:
- 'android/native/**'
- '.github/workflows/android-security.yml'
pull_request:
paths:
- 'android/native/**'
- '.github/workflows/android-security.yml'
jobs:
scan:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v4
- uses: actions/setup-java@v4
with:
distribution: temurin
java-version: '17'
- name: Android lint
working-directory: android/native
run: ./gradlew :app:lintProductionRelease
- name: Scan dependencies with OSV
uses: google/osv-scanner-action/osv-scanner-action@v2.0.2
with:
scan-args: |-
--recursive android/native

50
.github/workflows/android-tests.yml vendored Normal file
View File

@@ -0,0 +1,50 @@
name: Android Tests
on:
push:
paths:
- "android/native/**"
- ".github/workflows/android-tests.yml"
pull_request:
paths:
- "android/native/**"
- ".github/workflows/android-tests.yml"
permissions:
contents: read
jobs:
unit-tests:
name: JVM tests
runs-on: ubuntu-latest
defaults:
run:
working-directory: android/native
steps:
- uses: actions/checkout@v4
- uses: actions/setup-java@v4
with:
distribution: temurin
java-version: "17"
- uses: gradle/actions/setup-gradle@v4
- run: ./gradlew :app:testLocalDebugUnitTest
instrumentation-tests:
name: Emulator tests
runs-on: ubuntu-latest
defaults:
run:
working-directory: android/native
steps:
- uses: actions/checkout@v4
- uses: actions/setup-java@v4
with:
distribution: temurin
java-version: "17"
- uses: gradle/actions/setup-gradle@v4
- uses: reactivecircus/android-emulator-runner@v2
with:
api-level: 35
target: google_apis
arch: x86_64
script: ./gradlew :app:connectedLocalDebugAndroidTest

10
.gitignore vendored Normal file → Executable file
View File

@@ -5,17 +5,22 @@
.depbe.sh
node_modules
node_modules/*
**/package-lock.json
# package-lock.json wird versioniert (npm ci im Deploy braucht konsistente Locks zu package.json)
backend/.env
backend/.env.local
backend/images
backend/images/*
backend/node_modules
backend/node_modules/*
frontend/.env
frontend/.env.android
frontend/node_modules
frontend/node_modules/*
frontend/dist
frontend/dist/*
frontend/scripts/.i18n-de-fr-cache.json
frontend/scripts/.falukant-fr-smooth-cache.json
frontend/ceb-locale-audit-report.json
frontedtree.txt
backend/dist/
backend/data/model-cache
@@ -24,3 +29,6 @@ build/*
.vscode
.vscode/*
.clang-format
android/native/.gradle/
android/native/build/
android/native/local.properties

0
.vscode/settings.json vendored Normal file → Executable file
View File

0
CHURCH_MODELS.md Normal file → Executable file
View File

0
CHURCH_OFFICES.md Normal file → Executable file
View File

0
CMakeLists.txt Normal file → Executable file
View File

0
CMakeLists.txt.user Normal file → Executable file
View File

0
CMakeLists.txt.user.d36652f Normal file → Executable file
View File

0
DEPLOYMENT.md Normal file → Executable file
View File

259
OAUTH_CREDENTIALS_SETUP.md Executable file
View File

@@ -0,0 +1,259 @@
# OAuth Credentials Setup Guide
Anleitung zum Sammeln der OAuth-Credentials für alle 5 Provider.
## Redirect URIs
Für alle Provider benötigst du folgende Redirect URIs (ersetze `www.your-part.de` mit deiner echten Domain):
```
https://www.your-part.de/auth/oauth/callback
https://www.your-part.de/auth/oauth/user/callback
```
Lokal zum Testen:
```
http://localhost:3000/auth/oauth/callback
http://localhost:3000/auth/oauth/user/callback
```
---
## 1. Google
### Credentials besorgen:
1. Öffne [Google Cloud Console](https://console.cloud.google.com/)
2. Erstelle ein neues Projekt oder wähle ein bestehendes
3. Navigiere zu **APIs & Services****Credentials**
4. Klick **+ CREATE CREDENTIALS** → **OAuth 2.0 Client IDs**
5. Wähle **Web application**
6. Füge unter **Authorized redirect URIs** hinzu:
- `https://www.your-part.de/auth/oauth/callback`
- `https://www.your-part.de/auth/oauth/user/callback`
7. Speichern und die **Client ID** und **Client Secret** kopieren
### .env:
```env
OAUTH_GOOGLE_CLIENT_ID=your-client-id.apps.googleusercontent.com
OAUTH_GOOGLE_CLIENT_SECRET=your-client-secret
```
---
## 2. Microsoft Azure
### Credentials besorgen:
1. Öffne [Azure Portal](https://portal.azure.com/)
2. Navigiere zu **Azure Active Directory****App registrations****+ New registration**
3. Gib einen Namen ein (z.B. "YourPart OAuth")
4. Wähle **Accounts in any organizational directory (Any Azure AD directory - Multitenant)**
5. Bei **Redirect URI** wähle **Web** und füge ein:
- `https://www.your-part.de/auth/oauth/callback`
6. Klick **Register**
7. Notiere die **Application (client) ID**
8. Gehe zu **Certificates & secrets****+ New client secret**
9. Erstelle ein Secret und kopiere den **Value** (nicht die ID!)
10. Gehe zu **Token configuration** und stelle sicher, dass die richtigen Claims enthalten sind
### Zusätzliche URI hinzufügen:
1. Gehe zu **Authentication**
2. Unter **Redirect URIs** klick **+ Add URI**
3. Füge hinzu: `https://www.your-part.de/auth/oauth/user/callback`
### .env:
```env
OAUTH_MICROSOFT_CLIENT_ID=your-application-id
OAUTH_MICROSOFT_CLIENT_SECRET=your-client-secret-value
```
---
## 3. Keycloak
Keycloak ist ein Open-Source OIDC Provider. Du kannst ihn selbst hosten oder eine gehostete Lösung nutzen.
### Option A: Selbst gehostet mit Docker
```bash
docker run -d \
-p 8080:8080 \
-e KEYCLOAK_ADMIN=admin \
-e KEYCLOAK_ADMIN_PASSWORD=admin \
quay.io/keycloak/keycloak:latest \
start-dev
```
Dann:
1. Öffne http://localhost:8080
2. Login mit `admin` / `admin`
3. **Realm erstellen**: Oben links Dropdown → **Create realm**
- Name: `yourpart` (oder beliebig)
4. Im neuen Realm: **Clients****Create client**
- Client ID: `yourpart`
- Client Protocol: `openid-connect`
- Access Type: `confidential`
5. Im **Settings** Tab:
- Valid Redirect URIs:
```
https://www.your-part.de/auth/oauth/callback
https://www.your-part.de/auth/oauth/user/callback
```
6. Speichern
7. Gehe zu **Credentials** Tab
- **Client Secret** kopieren
### Option B: Gehosteter Service
- [Keycloak.cloud](https://www.keycloak.cloud/) oder
- [Red Hat Managed Keycloak](https://www.keycloak.org/cloud/)
### .env:
```env
OAUTH_KEYCLOAK_ISSUER=https://your-keycloak-domain/realms/yourpart
OAUTH_KEYCLOAK_CLIENT_ID=yourpart
OAUTH_KEYCLOAK_CLIENT_SECRET=your-client-secret
```
---
## 4. ORY Hydra / ORY Cloud
ORY ist ein moderner OIDC Provider. Am einfachsten ist ORY Cloud.
### Option A: ORY Cloud (empfohlen)
1. Öffne [ORY Cloud Console](https://console.ory.sh/)
2. Registriere dich oder logge dich ein
3. Erstelle ein neues **Project**
4. Gehe zu **Applications**
5. Klick **Create New Application**
6. Gib einen Namen ein (z.B. "YourPart")
7. Unter **Redirect URLs** füge ein:
```
https://www.your-part.de/auth/oauth/callback
https://www.your-part.de/auth/oauth/user/callback
```
8. Speichern
9. Die **Client ID** und **Client Secret** werden angezeigt
10. Finde deine **Issuer URL** in den Project Settings (meist `https://your-project-slug.eu.hydra.cloud`)
### Option B: Selbst gehostet (komplex)
Siehe [ORY Hydra Dokumentation](https://www.ory.sh/hydra/docs/)
### .env:
```env
OAUTH_ORY_ISSUER=https://your-project-slug.eu.hydra.cloud
OAUTH_ORY_CLIENT_ID=your-client-id
OAUTH_ORY_CLIENT_SECRET=your-client-secret
```
---
## 5. ZITADEL
ZITADEL ist ein Zero-Trust Identity Platform als SaaS.
### Credentials besorgen:
1. Öffne [ZITADEL Console](https://zitadel.cloud/)
2. Registriere dich oder logge dich ein
3. Erstelle eine neue **Organization** (oder verwende die existierende)
4. Gehe zu **Projects** → **+ New Project**
5. Gib einen Namen ein (z.B. "YourPart")
6. Gehe zum Projekt → **Applications** → **+ New Application**
7. Wähle **Type: Web**
8. Gib einen Namen ein
9. Bei **Redirect URIs** füge ein:
```
https://www.your-part.de/auth/oauth/callback
https://www.your-part.de/auth/oauth/user/callback
```
10. Speichern
11. Unter **Client Information** kopiere:
- **Client ID**
- **Client Secret** (falls sichtbar, sonst im "CREDENTIALS" Tab generieren)
12. Finde deine **Issuer URL** in den Organization Settings (meist `https://your-instance.zitadel.cloud`)
### .env:
```env
OAUTH_ZITADEL_ISSUER=https://your-instance.zitadel.cloud
OAUTH_ZITADEL_CLIENT_ID=your-client-id
OAUTH_ZITADEL_CLIENT_SECRET=your-client-secret
```
---
## Komplette .env für alle 5 Provider
```env
# Google
OAUTH_GOOGLE_CLIENT_ID=...
OAUTH_GOOGLE_CLIENT_SECRET=...
# Microsoft
OAUTH_MICROSOFT_CLIENT_ID=...
OAUTH_MICROSOFT_CLIENT_SECRET=...
# Keycloak
OAUTH_KEYCLOAK_ISSUER=...
OAUTH_KEYCLOAK_CLIENT_ID=...
OAUTH_KEYCLOAK_CLIENT_SECRET=...
# ORY
OAUTH_ORY_ISSUER=...
OAUTH_ORY_CLIENT_ID=...
OAUTH_ORY_CLIENT_SECRET=...
# ZITADEL
OAUTH_ZITADEL_ISSUER=...
OAUTH_ZITADEL_CLIENT_ID=...
OAUTH_ZITADEL_CLIENT_SECRET=...
```
---
## Schnell-Checkliste
- [ ] Google: Client ID & Secret
- [ ] Microsoft: Application ID & Client Secret
- [ ] Keycloak: Issuer, Client ID, Secret
- [ ] ORY: Issuer, Client ID, Secret
- [ ] ZITADEL: Issuer, Client ID, Secret
- [ ] Alle Redirect URIs in den Providern konfiguriert
- [ ] .env datei aktualisiert
- [ ] Server neu gestartet (`npm restart`)
---
## Testing
Nach der Konfiguration:
1. Frontend öffnen: http://www.your-part.de
2. Auf "Login" oder Provider-Button klicken
3. Jeder verfügbare Provider sollte als Button angezeigt werden
4. Test: Mit jedem Provider einloggen
5. Test: Existender Nutzer → Einstellungen → Authentifizierung hinzufügen
---
## Troubleshooting
### "Invalid redirect URI"
- Stelle sicher, dass die Redirect URIs **exakt** übereinstimmen (inkl. `https://` vs `http://`)
- Beachte Trailing Slashes
### "Invalid client secret"
- Kopiere das Secret neu (nicht die ID)
- Manche Provider verstecken das Secret nach einmaliger Anzeige
### "Discovery endpoint not found"
- Überprüfe die Issuer URL (mit/ohne Trailing Slash)
- Für Keycloak: URL muss auf `/realms/xxx` enden
- Für ORY: URL darf nicht auf `/` enden
### Port-Konflikt lokal
- Keycloak benutzt `8080` → ändere auf: `docker run -p 8081:8080 ...`
- Stelle sicher, dass 3000 (Frontend) und 5000 (Backend) frei sind

0
PERFORMANCE_ANALYSIS.md Normal file → Executable file
View File

3
README.md Executable file
View File

@@ -0,0 +1,3 @@
## zum testen des push
Hinweis: Das Verzeichnis **`src/`** (C++-Worker) ist veraltet; siehe [`docs/LEGACY_CPP_WORKERS.md`](docs/LEGACY_CPP_WORKERS.md).

0
README_MATCH3_CAMPAIGN.md Normal file → Executable file
View File

0
SELL_OVERVIEW.md Normal file → Executable file
View File

0
SSL-SETUP.md Normal file → Executable file
View File

9
android/.idea/android.iml generated Executable file
View File

@@ -0,0 +1,9 @@
<?xml version="1.0" encoding="UTF-8"?>
<module type="JAVA_MODULE" version="4">
<component name="NewModuleRootManager" inherit-compiler-output="true">
<exclude-output />
<content url="file://$MODULE_DIR$" />
<orderEntry type="inheritedJdk" />
<orderEntry type="sourceFolder" forTests="false" />
</component>
</module>

2001
android/.idea/caches/deviceStreaming.xml generated Executable file

File diff suppressed because it is too large Load Diff

13
android/.idea/deviceManager.xml generated Executable file
View File

@@ -0,0 +1,13 @@
<?xml version="1.0" encoding="UTF-8"?>
<project version="4">
<component name="DeviceTable">
<option name="columnSorters">
<list>
<ColumnSorterState>
<option name="column" value="Name" />
<option name="order" value="ASCENDING" />
</ColumnSorterState>
</list>
</option>
</component>
</project>

8
android/.idea/markdown.xml generated Executable file
View File

@@ -0,0 +1,8 @@
<?xml version="1.0" encoding="UTF-8"?>
<project version="4">
<component name="MarkdownSettings">
<option name="previewPanelProviderInfo">
<ProviderInfo name="Compose (experimental)" className="com.intellij.markdown.compose.preview.ComposePanelProvider" />
</option>
</component>
</project>

5
android/.idea/misc.xml generated Executable file
View File

@@ -0,0 +1,5 @@
<project version="4">
<component name="ProjectRootManager" version="2">
<output url="file://$PROJECT_DIR$/out" />
</component>
</project>

8
android/.idea/modules.xml generated Executable file
View File

@@ -0,0 +1,8 @@
<?xml version="1.0" encoding="UTF-8"?>
<project version="4">
<component name="ProjectModuleManager">
<modules>
<module fileurl="file://$PROJECT_DIR$/.idea/android.iml" filepath="$PROJECT_DIR$/.idea/android.iml" />
</modules>
</component>
</project>

6
android/.idea/vcs.xml generated Executable file
View File

@@ -0,0 +1,6 @@
<?xml version="1.0" encoding="UTF-8"?>
<project version="4">
<component name="VcsDirectoryMappings">
<mapping directory="$PROJECT_DIR$/.." vcs="Git" />
</component>
</project>

605
android/ANDROID_APP_PLAN.md Executable file
View File

@@ -0,0 +1,605 @@
# Android-App-Plan fuer YourPart3
Stand: 2026-07-08
## Ziel
Dieses Dokument plant eine Android-App fuer das bestehende YourPart3-Projekt unter `/android`.
Das Projekt besteht aktuell aus:
- `frontend`: Vue 3, Vite, Vuetify, Vue Router, Vuex, Axios, Socket.IO Client, Three.js
- `backend`: Node.js/Express 5, Sequelize, Redis-Sessiondaten, OAuth/OIDC, Socket.IO, REST-APIs
- Authentifizierung: Login liefert einen User mit `id`/`authCode`; API-Requests senden Header `userid` und `authcode`
- Realtime: Socket.IO fuer Backend-Events und separater Daemon-WebSocket fuer Falukant-Updates
- Deployment: Backend serviert die gebaute SPA aus `frontend/dist`
Backend-Implementierung ist nicht Teil dieses Android-Starts. Das vorhandene Backend wird als gegeben betrachtet; Android-seitig werden nur Kompatibilitaet, URLs, Auth-Header, OAuth-Weiterleitung und Realtime-Verbindungen getestet.
## Empfehlung
Die Android-App sollte in Phase 1 als Capacitor-App umgesetzt werden, nicht als nativer Rewrite.
Begruendung:
- Die bestehende App ist bereits eine grosse SPA mit vielen Views: Social Network, Falukant, Vokabeltrainer, Minigames, Kalender, Admin, Settings.
- Der Auth-Mechanismus und die vorhandenen API-Clients sind Web-orientiert und koennen in einer WebView nahezu unveraendert weiterlaufen.
- OAuth-Callback-Routen existieren bereits im Frontend (`/auth/oauth/callback`, `/auth/oauth/user/callback`).
- Socket.IO und WebSocket-Verbindungen funktionieren in Capacitor deutlich schneller als in einem nativen Rewrite.
- Ein nativer Rewrite wuerde zuerst API-Vertraege, Sessionmodell, Navigation, Offline-Strategie und UI-Komponenten neu definieren muessen.
Zielarchitektur Phase 1:
```text
/android
capacitor.config.ts
package.json
android/
Android-native Projektdateien, durch Capacitor generiert
/frontend
bestehende Vue/Vite-App
/backend
bestehende Express/API/Socket.IO-App
```
Capacitor verwendet den bestehenden `frontend`-Build als Web-Bundle und erzeugt daraus eine installierbare Android-App.
## Nicht-Ziele fuer Phase 1
- Kein kompletter nativer Kotlin/Jetpack-Compose-Rewrite.
- Keine Offline-First-Synchronisation fuer Falukant/Social/Vocab.
- Keine komplette Neugestaltung aller mobilen Screens.
- Keine API-Versionierung fuer mobile Clients, solange die App nur das bestehende Web-Frontend verpackt.
- Keine Play-Store-Verteilung vor Datenschutz-, Content- und OAuth-Pruefung.
- Keine Backend-Neuentwicklung und keine Backend-API-Neuplanung.
## Getroffene Entscheidungen
### App-Technologie
- Entscheidung: Capacitor mit lokal gebuendelter Vue/Vite-App.
- Kein nativer Kotlin-Rewrite in Phase 1.
- Kein reiner Remote-WebView-Wrapper auf `https://www.your-part.de`.
- Begruendung: Der vorhandene Funktionsumfang ist breit, Web-Auth und Socket.IO existieren bereits, und Capacitor ermoeglicht spaetere native Erweiterungen ohne sofortigen Rewrite.
### App-ID und Name
- App-ID: `de.yourpart.app`
- Launcher-Name: `YourPart`
- Android-Projektpfad: `/android`
- Capacitor `webDir`: `../frontend/dist`
### Ziel-Distribution
- Phase 1: interne Debug-/Test-APK.
- Phase 2: signiertes internes AAB/APK fuer Testgeraete.
- Play Store erst nach separatem Compliance-Check fuer Datenschutz, UGC, Moderation und Adult Content.
### Backend-Abgrenzung
- Backend bleibt unveraendert.
- Android nutzt die bestehenden REST-Endpunkte, Auth-Header, OAuth-Routen, Socket.IO-Events und Daemon-WebSocket-Events.
- Backendbezogene TODOs sind nur Test- und Konfigurationschecks. Falls ein Test scheitert, wird der konkrete Anpassungsbedarf danach separat entschieden.
### Admin-Bereich
- Admin-Routen bleiben in Phase 1 nicht priorisiert.
- Wenn Admin-Menues durch bestehende Berechtigungen sichtbar sind, werden sie nicht aktiv entfernt.
- Abnahmekriterien fuer Phase 1 gelten nur fuer normale Nutzerfunktionen.
### Adult-/Erotikbereiche
- Phase 1: vorhandenes Web-Gating bleibt bestehen, keine neue native Adult-Content-Funktion.
- Play-Store-Ziel ist blockiert, bis Altersfreigabe, UGC-Moderation, Melden/Blockieren, Datenschutz und Store-Policy separat geprueft sind.
- Fuer interne APK-Tests darf der Bereich technisch erreichbar bleiben, wenn der bestehende Account-/Altersstatus ihn erlaubt.
### OAuth
- Phase 1 startet mit Username/Passwort-Login als Pflichtfunktion.
- OAuth ist Phase-1-Testumfang, aber kein Blocker fuer das erste Debug-APK.
- Zielrichtung fuer OAuth: externer Browser bzw. System-Browser plus App Links, nicht OAuth in einer versteckten WebView erzwingen.
### Push Notifications
- Push ist nicht Teil des ersten Android-Scaffolds.
- Push wird nach stabiler App-Shell geplant, weil dafuer Device Tokens, Opt-in, Settings und Backend-Zustellung noetig sind.
### 3D / WebGL
- 3D-Charaktere werden im Android-Debug-Build initial per `VITE_DISABLE_3D=true` deaktiviert.
- Begruendung: Die Login-Seite rendert mehrere `Character3D`-Instanzen sofort. In Kombination mit CORS-Fehlern und vielen GLB-Kandidaten kann der Emulator-WebView-Renderer per OOM abstuerzen.
- Reaktivierung erfolgt erst nach erfolgreichem CORS-Test und separatem 3D-Performance-Test.
### Navigation
- Vue `createWebHistory` bleibt initial unveraendert.
- Hash-Routing wird nur eingefuehrt, wenn Capacitor-Tests echte Routing-Probleme zeigen.
- Android Back Button wird als native App-Anforderung in Phase 1 umgesetzt.
- Mobile Navigation bleibt Teil der Web-App, wird aber fuer Android als kompakte Hybrid-Navigation gehaertet: Header-Leiste, aufklappbares scrollbares Menue, keine dauerhaft sichtbare Desktop-Menueflaeche auf kleinen Displays.
### Sichere Speicherung
- Phase 1 darf bestehendes `localStorage`/`sessionStorage` weiterverwenden.
- Vor Play-Store-Release wird Auth-Persistenz auf Secure Storage/Android Keystore umgestellt.
## Technische Ausgangslage
### Frontend
- Zentrale API-Konfiguration: `frontend/src/utils/axios.js`
- API-Basis-URL: `frontend/src/utils/appConfig.js` ueber `VITE_API_BASE_URL`
- Auth-Header: `userid` und `authcode`
- Persistenz: `localStorage` oder `sessionStorage` fuer `isLoggedIn`, `user`, `userid`
- Router: `createWebHistory`, viele Clean-URL-Routen
- Realtime: `socket.io-client` ueber `VITE_SOCKET_IO_URL`
- Daemon-WebSocket: ueber `VITE_DAEMON_SOCKET`
- 3D/Assets: Three.js und Modelle ueber `/api/models` bzw. statische Assets
### Backend
- CORS erlaubt aktuell konfigurierte Origins und lokale Web-Origins.
- Auth-Middleware prueft `userid` und `authcode`.
- OAuth startet serverseitig per Redirect.
- Socket.IO erlaubt aktuell `origin: '*'`.
- Backend serviert SPA-Fallback fuer Nicht-API-Routen.
## Android-Strategie
### Phase 1: Capacitor Shell
Die Android-App laedt nicht die Produktionswebsite remote, sondern nutzt das lokal gebundelte Vite-Build-Artefakt.
Vorteile:
- App startet auch dann, wenn die Website selbst nicht als Web-Seite geladen werden muss.
- Google Play bewertet sie eher als App statt als reinen Browser-Shortcut.
- Versionierbare Builds mit reproduzierbarer Web-Bundle-Version.
- Zugriff auf native Funktionen bleibt moeglich: Splash Screen, Deep Links, Push Notifications, sichere Speicherung.
Wichtige Anpassung:
- `VITE_API_BASE_URL`, `VITE_SOCKET_IO_URL`, `VITE_DAEMON_SOCKET` muessen fuer Android-Builds explizit auf die produktiven HTTPS/WSS-Endpunkte gesetzt werden.
- Relative API-URLs sind in einer gebuendelten Android-WebView riskant, weil `window.location.origin` nicht der Server-Origin ist.
### Phase 2: Mobile Web-Haertung
Die bestehende UI muss fuer kleine Viewports und Touch-Nutzung stabilisiert werden.
Prioritaeten:
- Login/Register/OAuth
- Hauptnavigation
- Falukant-Overview, Branch, Family, Bank
- Vokabeltrainer und Lessons
- Chat/Friends/Forum-Basics
- Minigames nur nach separater Touch-Performance-Pruefung
### Phase 3: Native Integrationen
Nach stabiler Shell koennen echte App-Features ergaenzt werden:
- Push Notifications fuer Chat, Freund-Login, Falukant-Events
- Deep Links fuer OAuth-Callbacks und geteilte Inhalte
- Android Back Button Integration
- Splash Screen und App Icons
- Secure Storage fuer Authdaten
- App Update / Version Check
### Phase 4: Selektiv native Screens
Wenn einzelne Bereiche Performance- oder UX-Probleme haben, koennen sie spaeter nativ ersetzt werden. Kandidaten:
- Login/Onboarding
- Push Notification Center
- Vokabeltrainer Session
- Falukant Status/Quick Actions
## Repository-Layout
Vorgeschlagenes Layout:
```text
android/
ANDROID_APP_PLAN.md
README.md
package.json
capacitor.config.ts
android/ # Capacitor Android-Projekt
scripts/
build-android-web.sh
sync-android.sh
```
Hinweis: In Phase 1 wird `/android/android` generiert, weil `/android` die Capacitor-Projektwurzel ist. Die generierten Android-Dateien werden versioniert, weil reproduzierbare Builds und native Anpassungen wichtig sind.
## Build-Konzept
### Android Web-Build
Ein eigener Build-Modus verhindert Vermischung mit Web-Production:
```bash
cd frontend
npm run build -- --mode android
```
Dafuer wird eine Datei `frontend/.env.android` benoetigt:
```env
VITE_API_BASE_URL=https://www.your-part.de
VITE_SOCKET_IO_URL=https://www.your-part.de
VITE_DAEMON_SOCKET=wss://www.your-part.de
VITE_PUBLIC_BASE_URL=https://www.your-part.de
```
Wichtig: `VITE_API_BASE_URL` ist bewusst nur die Origin ohne `/api`, weil die bestehenden Frontend-Aufrufe bereits Pfade wie `/api/auth/login` enthalten. Mit `/api` in der Base-URL entstehen Android-seitig falsche Requests wie `/api/api/...`.
Die exakten WebSocket-Pfade muessen gegen die produktive Apache-/Backend-Konfiguration verifiziert werden.
### Lokaler Emulator-Stand
Android Studio und mehrere AVDs sind lokal vorhanden. Fuer die ersten Stabilitaetstests ist `trainingstagebuchApi35` die bevorzugte VM, weil sie im bisherigen Test stabiler lief als das Play-Store-Image `Medium_Phone`.
```bash
ANDROID_AVD_HOME=/home/torsten/.config/.android/avd /home/torsten/Android/Sdk/emulator/emulator -avd trainingstagebuchApi35 -no-snapshot-save
adb install -r android/android/app/build/outputs/apk/debug/app-debug.apk
adb shell am start -W -a android.intent.action.MAIN -c android.intent.category.LAUNCHER -n de.yourpart.app/.MainActivity
```
Ergebnis bisher:
- Debug-APK wurde erfolgreich gebaut.
- APK wurde auf einem Emulator installiert.
- App startet als `de.yourpart.app/.MainActivity`.
- Login-Screen rendert mobil.
- API-Base-URL wurde von `/api` auf die Origin `https://www.your-part.de` korrigiert, damit keine `/api/api`-Requests entstehen.
- Capacitor `server.hostname` darf nicht auf `www.your-part.de` gesetzt werden, weil sonst echte Backend- und Model-URLs als lokale App-Assets behandelt werden.
- Nach Entfernung der Hostname-Kollision ist die Android-App-Origin `https://localhost`. Das Backend muss diese Origin in `CORS_ORIGINS` erlauben, sonst blockiert die WebView REST- und GLB-Requests.
### Capacitor Sync
Nach dem Frontend-Build:
```bash
cd android
npx cap sync android
```
Danach:
```bash
cd android
npx cap open android
```
Oder per CLI:
```bash
cd android
./gradlew assembleDebug
```
Lokaler Build-Hinweis:
- Auf diesem System liegt das Android SDK unter `/home/torsten/Android/Sdk`.
- Die lokale Datei `/android/android/local.properties` setzt `sdk.dir` darauf und ist absichtlich nicht versioniert.
- Erstes Debug-APK wurde erfolgreich gebaut: `/android/android/app/build/outputs/apk/debug/app-debug.apk`.
## Authentifizierung
### Bestehender Login
Der bestehende Login kann initial unveraendert bleiben:
- `POST /api/auth/login`
- Antwort enthaelt User inkl. `authCode`
- Axios haengt `userid` und `authcode` an Folgerequests
- Storage bleibt vorerst `localStorage`/`sessionStorage`
### Sicherheitsverbesserung
Phase 1 kann noch mit Web Storage starten. Vor Play-Store-Release sollte Auth aber in native sichere Speicherung verschoben werden:
- Capacitor Preferences nur fuer unkritische Werte
- Fuer sensible Werte besser Android Keystore ueber ein Secure-Storage-Plugin
- Migration: Store liest zuerst Secure Storage, fallback auf lokalen Web Storage, migriert dann
### OAuth
OAuth ist der groesste Integrationspunkt.
Kurzfristige Option:
- OAuth im In-App Browser oder externen Browser starten
- Callback bleibt auf `https://www.your-part.de/auth/oauth/callback`
- Die Callback-Seite tauscht `code/state` wie bisher gegen einen App-User
Bessere App-Option:
- Android App Links fuer `https://www.your-part.de/auth/oauth/callback`
- `assetlinks.json` auf der Domain bereitstellen
- Capacitor App Plugin verarbeitet den Deep Link und routet intern weiter
Risiko:
- OAuth Provider koennen eingebettete WebViews einschraenken. Deshalb sollte OAuth nicht in einer versteckten WebView erzwungen werden, sondern ueber Browser/App Links laufen.
## API und CORS
Fuer Capacitor-Bundles ist die Origin nicht immer identisch mit der Website-Origin.
Zu pruefen:
- Welche Origin sendet Android WebView bei Requests an `https://www.your-part.de/api`?
- Muss `CORS_ORIGINS` um `https://localhost` erweitert werden?
- Funktionieren Custom Header `userid` und `authcode` in der WebView?
- Funktionieren Preflight-Requests mit den bestehenden erlaubten Headers?
Noetige Backend-Konfiguration fuer Debug-Builds:
```env
CORS_ORIGINS=https://www.your-part.de,https://localhost,http://localhost:5173,http://127.0.0.1:5173
```
Nur nach Test setzen; nicht blind `CORS_ALLOW_ALL=1` fuer Produktion verwenden.
## Navigation und Deep Links
Die Vue-App nutzt `createWebHistory`. In Capacitor kann das funktionieren, aber folgende Punkte muessen getestet werden:
- Direktstart auf `/`
- Interne Navigation zu `/falukant/home`, `/friends`, `/socialnetwork/vocab/...`
- Android Back Button
- OAuth Callback URL
- App-Resume nach Browser-OAuth
Falls History-Mode Probleme in der WebView macht:
- Option A: Capacitor-spezifisch auf Hash-History wechseln
- Option B: History beibehalten und Deep-Link-Routing sauber behandeln
Hash-History waere technisch einfacher, aber wegen bestehender SEO-/Web-Routen nicht global fuer das Web-Frontend umstellen.
## Realtime
### Socket.IO
Bestehender Ablauf:
- Nach Login `initializeSocket`
- Socket verbindet zu `VITE_SOCKET_IO_URL`
- Client sendet `setUserId` mit `hashedId` oder `id`
Android-Testfaelle:
- Login erzeugt Socket-Verbindung
- App im Hintergrund trennt/reconnectet sauber
- Friend-Login-Events kommen an
- Schlechte Verbindung erzeugt keine Endlos-Fehlerdialoge
### Daemon-WebSocket
Falukant nutzt zusaetzliche Daemon-Events. Android muss mindestens diese Events empfangen koennen:
- `falukantUpdateFamily`
- `falukantUpdateStatus`
- `falukantUpdateProductionCertificate`
- `children_update`
- `falukantUpdateChurch`
- `falukantUpdateDebt`
Test:
- WSS ueber produktiven Proxy
- Reconnect nach App-Resume
- Filterung nach `user_id`
## Mobile UX Prioritaeten
Die App sollte nicht nur ein Desktop-Layout in einer WebView zeigen. Phase 1 braucht mindestens diese UX-Haertung:
- Header/Navigation auf kleinen Viewports pruefen
- Dialoge auf 360px Breite testen
- Tabellen und breite Falukant-Views horizontal oder responsiv absichern
- Touch-Ziele mindestens ca. 44px
- Keyboard-Verhalten im Login/Register testen
- Safe Area Insets fuer Statusbar/Navigationbar beachten
- Android Back Button: Dialog schliessen, sonst Router zurueck, sonst App minimieren
Aktueller Stand 2026-07-08:
- Hauptnavigation ist auf kleinen Viewports zu einer kompakten Menueleiste mit aufklappbarem, scrollbarem Menue umgebaut.
- Header ist auf Smartphone-Breite kompakter, Statusanzeigen laufen zweispaltig statt als lange Desktop-Leiste.
- Footer blendet leere System-/Fensterbereiche auf Smartphone-Breite aus und reserviert Safe-Area-Abstand nach unten.
- App-Shell nutzt `100dvh` als Android-WebView-freundlichere Viewport-Hoehe.
## Datenschutz, Content und Store-Risiken
Das Projekt enthaelt Social-, Chat-, Galerie-, Erotik-/Adult- und Moderationsbereiche. Fuer Play Store sind diese Punkte kritisch:
- Altersfreigabe und Adult-Content-Gating
- UGC-Moderation, Meldefunktion, Blockieren
- Datenschutzrichtlinie in der App und im Store Listing
- Account-Loeschung oder klare Anleitung
- Sichere Uebertragung nur per HTTPS/WSS
- Keine unsicheren Debug-Endpunkte im Release-Build
- Keine Secrets im Android-Bundle
Vor Play-Store-Release muss ein eigener Compliance-Check erfolgen.
## Teststrategie
### Lokale Tests
- Android Emulator mit Debug-Build
- Echtes Android-Geraet im gleichen Netz
- Produktions-API mit Testnutzer
- Offline/Online-Wechsel
- App Kill/Restart/Resume
### Kern-Testmatrix
- Login mit Username/Passwort
- Logout
- Registrierung
- Passwort vergessen
- OAuth Login je Provider, soweit konfiguriert
- Menu-Load nach Login
- Falukant Overview laden
- Falukant Realtime-Update empfangen
- Vokabeltrainer Lesson starten und abschliessen
- Chat verbinden und Nachricht empfangen
- Galerie/Bild-Upload, falls mobil zunaechst erlaubt
- Minigames Touch-Steuerung
- Admin-Bereiche entweder nutzbar oder bewusst ausgeblendet
### Build-Checks
- `npm run build` im Frontend
- Android Web-Build mit `.env.android`
- `npx cap sync android`
- `./gradlew assembleDebug`
- `./gradlew lint`
- Release-Build mit Signing-Konfiguration
## Verbleibende offene Punkte
- Produktivdomain final technisch testen: voraussichtlich `https://www.your-part.de`.
- Daemon-WebSocket-URL und Pfad final gegen Deploy-/Proxy-Konfiguration testen.
- Mindest-Android-Version aus Capacitor-Default uebernehmen und nach erstem Scaffold im Gradle-Projekt dokumentieren.
- Play-Store-Entscheidung bleibt nachgelagert bis Compliance-Pruefung abgeschlossen ist.
## TODO
### 1. Grundsatzentscheidungen
- [x] App-ID festlegen: `de.yourpart.app`.
- [x] App-Name und Launcher-Label festlegen: `YourPart`.
- [x] Ziel-Distribution festlegen: zuerst interne Debug-/Test-APK.
- [x] Entscheiden, ob Admin-Routen in der App sichtbar bleiben: nicht priorisiert, nicht aktiv entfernt.
- [x] Entscheiden, wie Adult-/Erotikbereiche in Android behandelt werden: bestehendes Web-Gating, kein Play Store ohne Compliance-Check.
- [x] Entscheiden, ob Backend Teil des Android-Starts ist: nein, nur Kompatibilitaetstests.
- [x] Entscheiden, ob Push Teil des ersten Scaffolds ist: nein.
- [x] Entscheiden, ob OAuth erster Blocker ist: nein, Username/Passwort-Login zuerst.
### 2. Android-Projekt scaffolden
- [x] In `/android` eigenes `package.json` anlegen.
- [x] Capacitor installieren: `@capacitor/core`, `@capacitor/cli`, `@capacitor/android`.
- [x] `capacitor.config.ts` mit App-ID `de.yourpart.app`, App-Name `YourPart` und `webDir` auf `../frontend/dist` konfigurieren.
- [x] Android-Plattform generieren: `npx cap add android`.
- [x] `/android/README.md` mit Build-Kommandos anlegen.
- [x] Entscheiden, ob generiertes `/android/android` versioniert wird: ja.
### 3. Frontend Android-Build
- [x] `frontend/.env.android.example` anlegen.
- [x] `VITE_API_BASE_URL` fuer Android explizit setzen.
- [x] `VITE_SOCKET_IO_URL` fuer Android explizit setzen.
- [x] `VITE_DAEMON_SOCKET` fuer Android explizit setzen.
- [x] Root- oder Android-Script fuer `build:android:web` ergaenzen.
- [x] Android-Web-Build mit produktiver Origin statt lokaler Dev-URL bauen.
- [ ] Release-Build-Gate ergaenzen, das lokale Dev-URLs automatisiert verhindert.
### 4. Backend-Kompatibilitaet
- [ ] Android-Origin im CORS-Verhalten messen.
- [x] Fehlerhafte Android-Request-Basis `/api/api` identifizieren und durch Origin-only-Config beheben.
- [x] Capacitor-Hostname-Kollision mit Backend-Host vermeiden; `server.hostname` bleibt Default.
- [x] `CORS_ORIGINS` fuer Capacitor als bestehenden Backend-Konfigurationspunkt notieren: `https://localhost`.
- [ ] Produktiv-/Testbackend mit `CORS_ORIGINS` inklusive `https://localhost` neu starten und Android-Requests erneut pruefen.
- [ ] Custom Header `userid`/`authcode` auf Android testen.
- [ ] Socket.IO-Verbindung von Android testen.
- [ ] Daemon-WebSocket ueber Android testen.
- [ ] Produktionsproxy fuer HTTPS/WSS pruefen.
- [ ] Keine Backend-Aenderung ohne konkreten fehlgeschlagenen Android-Test einplanen.
### 5. Auth und OAuth
- [ ] Username/Passwort-Login in Android testen.
- [ ] Persistenz nach App-Neustart testen.
- [ ] Logout inklusive Socket-Cleanup testen.
- [ ] OAuth-Login-Flow je Provider testen.
- [ ] Entscheiden: OAuth per externem Browser plus App Links oder innerhalb bestehender WebView.
- [ ] Android App Links einrichten, falls OAuth nativ zurueck in die App fuehren soll.
- [ ] Authdaten spaeter in Secure Storage migrieren.
### 6. Native App-Verhalten
- [ ] Android Back Button behandeln.
- [ ] Splash Screen konfigurieren.
- [ ] App Icons erzeugen.
- [ ] Statusbar/Safe-Area pruefen; aktueller Test zeigt nicht-blockierende Safe-Area-CSS-Console-Fehler.
- [x] WebView-Textfeld-Eingabe fuer Emulator reparieren: `android.captureInput` nicht aktivieren.
- [x] Android-Studio-Projektpfad dokumentieren: `/android/android`.
- [x] Android-Studio-Run-Configuration `YourPart Debug` anlegen.
- [ ] Deep-Link-Handling vorbereiten.
- [ ] App Resume/Pause Events fuer Socket-Reconnect nutzen.
### 7. Mobile UI-Haertung
- [ ] Login/Register auf 360px Breite testen.
- [x] Login-Screen im Emulator visuell pruefen.
- [x] Parameterlisten-Handling gegen Nicht-Array-Antworten haerten, damit Backend-Fehler keine UI-Exception ausloesen.
- [x] 3D-Modelle fuer Android-Debug per `VITE_DISABLE_3D=true` deaktivieren, damit Login/Onboarding stabil bleibt.
- [x] Hauptnavigation fuer kleine Viewports umbauen: kompakte Menueleiste plus scrollbares Menue statt voller Desktop-Navigation.
- [ ] Hauptnavigation mobil mit mehreren Rollen/Berechtigungssets testen.
- [ ] Dialoge auf kleinen Screens pruefen.
- [ ] Falukant-Views mit breiten Tabellen pruefen.
- [ ] Vokabeltrainer Touch- und Keyboard-Verhalten testen.
- [ ] Minigames separat auf Touch-Performance testen.
- [ ] Bild-/Dateiupload auf Android pruefen.
### 8. Push Notifications
- [ ] Entscheiden, ob Push in Phase 1 oder spaeter kommt.
- [ ] Event-Kandidaten definieren: Chat, Friend Login, Falukant, Vocab Reminder.
- [ ] Backend-Device-Token-Modell planen.
- [ ] FCM-Projekt konfigurieren.
- [ ] Opt-in und Settings-UI planen.
### 9. Store/Compliance
- [ ] Datenschutzseite in App erreichbar machen.
- [ ] Impressum in App erreichbar machen.
- [ ] Account-Loeschung/Anfrageprozess klaeren.
- [ ] Adult Content Policy pruefen.
- [ ] UGC-Moderation fuer Store Review dokumentieren.
- [ ] Release-Build ohne Debug-Konfiguration pruefen.
### 10. CI/CD
- [x] Android-Build-Script anlegen.
- [x] Debug-Build lokal reproduzierbar machen.
- [ ] Release-Signing-Konzept festlegen.
- [ ] Keystore sicher ausserhalb des Repos verwalten.
- [ ] Optional CI-Job fuer `frontend build` + `cap sync` + Gradle Build einrichten.
## Empfohlene erste Umsetzungsschritte
1. `/android` als Capacitor-Projekt initialisieren.
2. `frontend/.env.android.example` und Android-Build-Script anlegen.
3. Debug-APK mit produktiver Test-API bauen.
4. Login, Menu, Falukant Overview und Socket.IO testen.
5. Erst danach OAuth, Deep Links und Push angehen.
## Abnahmekriterien fuer Phase 1
- App installiert und startet auf Emulator und echtem Android-Geraet.
- Login/Logout funktionieren.
- Persistierter Login funktioniert nach App-Neustart.
- API-Requests senden `userid` und `authcode` korrekt.
- Socket.IO verbindet nach Login und reconnectet nach Resume.
- Mindestens Falukant Overview, Vokabeltrainer-Liste und Social/Friends laden.
- Android Back Button fuehrt nicht zu kaputten Zustanden.
- Build ist reproduzierbar dokumentiert.
Aktueller Stand:
- Android/Capacitor-Projekt ist erzeugt.
- Android-Web-Build ist erfolgreich.
- Capacitor Sync ist erfolgreich.
- Debug-APK-Build ist erfolgreich.
- Installation und Laufzeittests auf Emulator/Geraet stehen noch aus.

58
android/APP_LINKS.md Normal file
View File

@@ -0,0 +1,58 @@
# Android App Links und OAuth
## Verbindliche Domain
Die Produktions-App verwendet ausschließlich `https://www.your-part.de`.
Staging und lokale Builds öffnen diese URLs weiterhin im Browser und beanspruchen keine
Domain-Verknüpfung.
## Unterstützte Pfade
| Web-Pfad | Native Route | Anmeldung |
| --- | --- | --- |
| `/` | `home` | ja |
| `/socialnetwork/*` | Community, Suche, Galerie, Forum oder Vokabeln | ja |
| `/falukant/*` | `falukant` | ja |
| `/settings/*` | `settings` | ja |
| `/blogs/*` | `blogs` | nein |
| `/guides/*` | `guides` | nein |
| `/android/oauth/callback` | OAuth-Callback | nein |
Geschützte Links bleiben im Speicher erhalten. Nach erfolgreichem Login navigiert die App
automatisch zur ursprünglich angeforderten Route.
## OAuth
Die native App startet `/api/auth/oauth/{provider}/start?client=android` in einer Android
Custom Tab. Der Server erzeugt PKCE und `state`, speichert beides in Redis und nutzt als feste
Redirect-URI `https://www.your-part.de/android/oauth/callback`. Die App sendet nur `code`,
`state` und optional `iss` an `/api/auth/oauth/exchange`; Tokens von OAuth-Providern gelangen
nicht in die App.
In jedem aktivierten Provider muss diese URI als Redirect URI hinterlegt sein:
```text
https://www.your-part.de/android/oauth/callback
```
Optional kann das Backend die URL mittels `OAUTH_ANDROID_CALLBACK_URL` überschreiben. Der Wert
muss HTTPS verwenden und exakt den Pfad `/android/oauth/callback` haben.
## assetlinks.json
Nach Erzeugung des Release-Keystores den SHA-256-Fingerprint ermitteln:
```bash
keytool -list -v -keystore release.jks -alias <alias>
```
`frontend/public/.well-known/assetlinks.json.example` nach
`frontend/public/.well-known/assetlinks.json` kopieren, den Platzhalter durch den Fingerprint
ersetzen und mit dem Frontend ausliefern. Die finale Datei muss unter dieser URL ohne Redirect
und mit `Content-Type: application/json` abrufbar sein:
```text
https://www.your-part.de/.well-known/assetlinks.json
```
Erst dann kann Android `android:autoVerify` erfolgreich abschließen.

View File

@@ -0,0 +1,869 @@
# Native Android App Plan fuer YourPart3
Stand: 2026-07-08
## Zielbild
Dieses Dokument plant eine komplette native Android-App fuer YourPart3 als langfristige Ablösung bzw. Ergänzung der aktuellen Capacitor-Hybrid-App.
Ziel ist eine echte Android-App mit:
- Kotlin
- Jetpack Compose
- MVVM bzw. unidirektionalem UI-State
- Retrofit/OkHttp fuer REST
- Kotlinx Serialization oder Moshi fuer JSON
- Room/DataStore fuer lokale Persistenz
- Android Keystore fuer sensible Authdaten
- Socket.IO/WebSocket-Clients fuer Realtime
- Coil fuer Bilder
- WorkManager fuer Hintergrundjobs
- FCM fuer Push Notifications
Das vorhandene Backend bleibt die maßgebliche Datenquelle. Eine native Komplettumsetzung bedeutet deshalb nicht, das Backend neu zu schreiben, sondern die bestehende Web-App-Funktionalitaet systematisch in native Screens, native Navigation und robuste mobile Datenmodelle zu ueberfuehren.
## Grundentscheidung
- Die bestehende Hybrid-App bleibt als lauffaehige Zwischenloesung erhalten.
- Die native App wird parallel aufgebaut.
- Nicht als Big Bang migrieren. Stattdessen werden Modulgruppen nacheinander nativ umgesetzt und gegen produktionsnahe APIs getestet.
- Admin- und Adult-Bereiche werden nicht im ersten nativen MVP umgesetzt.
- Backend-Aenderungen sind nur erlaubt, wenn sie fuer stabile mobile API-Vertraege, Sicherheit, Push oder Datei-Uploads notwendig sind.
## Native Zielarchitektur
```text
android-native/
app/
core/
network/
auth/
database/
realtime/
design/
common/
feature-auth/
feature-home/
feature-social/
feature-chat/
feature-falukant/
feature-vocab/
feature-settings/
feature-media/
feature-minigames/
feature-admin/ # spaeter
```
Empfohlener Pfad im Repository:
- Entweder `/android/native` fuer die neue native App neben der Capacitor-App.
- Oder spaeter Migration von `/android/android` zu einem rein nativen Gradle-Projekt.
Empfehlung: `/android/native`, damit die Hybrid-App weiter testbar bleibt.
## Technische Zielentscheidungen
- Sprache: Kotlin.
- UI: Jetpack Compose, Material 3, eigene YourPart-Design-Tokens.
- Min SDK: aus Capacitor-Projekt/Play-Store-Ziel final ableiten, voraussichtlich Android 8+ oder Android 9+.
- Navigation: Compose Navigation mit typed Routes.
- Dependency Injection: Hilt.
- REST: Retrofit + OkHttp Interceptors.
- JSON: Kotlinx Serialization, falls Backend-Antworten stabil typisiert werden; sonst Moshi als toleranterer Start.
- Lokale Einstellungen: DataStore Preferences.
- Lokale Daten: Room fuer Cache, Entitaeten, Outbox.
- Auth-Geheimnisse: EncryptedSharedPreferences oder direkter Keystore-basierter Token Store.
- Bilder: Coil.
- Datei-Uploads: OkHttp Multipart, Android Photo Picker.
- Realtime: Socket.IO Android Client plus separater OkHttp WebSocket fuer Daemon.
- Push: Firebase Cloud Messaging.
- Tests: JUnit, Turbine, MockWebServer, Compose UI Tests.
## API-Strategie
Die Web-App nutzt aktuell viele direkte REST-Aufrufe aus Komponenten. Fuer native Android muss daraus ein klarer API-Client entstehen.
Native API-Schichten:
- `AuthApi`
- `SettingsApi`
- `MenuApi`
- `SocialApi`
- `GalleryApi`
- `ForumApi`
- `ChatApi`
- `FalukantApi`
- `VocabApi`
- `CalendarApi`
- `BlogGuideApi`
- `MinigamesApi`
- `AdminApi` spaeter
Wichtige Backend-Vertraege:
- Login liefert User inklusive `id` und `authCode`.
- REST-Requests brauchen Header `userid` und `authcode`.
- Socket.IO registriert User per `setUserId`.
- Daemon-WebSocket nutzt eigene Events und User-Kontext.
- Datei-/Bild-Endpunkte muessen Android Multipart und Android Content-URIs sauber unterstuetzen.
## Migrationsprinzip
Jedes Modul wird in vier Schritten umgesetzt:
1. API-Vertrag erfassen: Endpunkte, Payloads, Fehler, Rechte.
2. Domain-Modelle definieren: Kotlin DTOs, Mapping, UI-State.
3. Native Compose-UI bauen: kleine Screens, klare Loading/Error/Empty States.
4. Gegen Backend testen: Emulator, echtes Geraet, Offline/Resume, Realtime.
## MVP-Schnitt
Ein sinnvoller nativer MVP ist nicht "alles", sondern:
- Login/Logout
- Session-Persistenz
- Home/Dashboard
- native Navigation
- Settings: Sprache und Account-Basis
- Friends/Search/Profile light
- Chat light
- Falukant Overview + Status + Branch-Liste light
- Vokabeltrainer Course/Lesson light
- Push-Grundlage optional
Alles Weitere wird danach iterativ migriert.
## Nicht-Ziele fuer den nativen MVP
- Kein vollstaendiger Admin-Bereich.
- Keine vollstaendige Falukant-Wirtschaftssimulation in Version 1.
- Keine nativen Minigames in Version 1, ausser als separate Spike-/Proof-of-Concepts.
- Keine 3D-Charakterdarstellung in Version 1.
- Keine Offline-First-Synchronisation fuer alle Module.
- Keine Store-Verteilung vor Datenschutz-/UGC-/Adult-Compliance.
## Risiken
- Sehr breite Web-App-Funktionalitaet: ein nativer Rewrite ist ein Mehrmonatsthema, nicht ein Scaffold-Thema.
- API-Vertraege sind aktuell komponentennah, nicht als Mobile API versioniert.
- Auth nutzt `userid`/`authcode` statt standardisiertem Bearer Token.
- Viele Screens erwarten Web-Layout, Dialoge und dynamische Menues.
- Falukant ist daten- und realtime-intensiv.
- Chat, Galerie, Adult Content und UGC erfordern Store-Compliance.
- Native 3D/Minigames brauchen eigene Performance-Entscheidungen.
## Abhakbare Roadmap
### 0. Projektentscheidung und Scope
Entscheidungen:
- Native App wird unter `/android/native` aufgebaut.
- Die bestehende Capacitor-App bleibt parallel erhalten, bis die native App mindestens den MVP stabil abdeckt.
- Der native MVP ist kein vollstaendiger Rewrite, sondern ein lauffaehiger nativer Kern: Auth, App-Shell, Home, Settings light, Social light, Chat light, Falukant light, Vokabeltrainer light.
- Admin wird aus dem nativen MVP ausgeschlossen.
- Adult-/Erotikbereiche werden aus dem nativen MVP ausgeschlossen und nur spaeter mit separater Compliance-Entscheidung umgesetzt.
- Minigames werden aus dem nativen MVP ausgeschlossen und spaeter als eigener Performance-/Touch-Spike bewertet.
- 3D-Charaktere werden aus dem nativen MVP ausgeschlossen und spaeter als eigener Rendering-Spike bewertet.
- Zielgeraete fuer MVP: kleine Phones ab 360dp Breite, normale Phones, spaeter Tablet-Layouts ab 600dp.
- Mindest-Android fuer MVP: Android 8.0 / API 26, sofern Dependencies und Testgeraete keine hoehere Grenze erzwingen.
- Distribution fuer MVP: interne Debug-/Test-APK. Play Store bleibt nachgelagert bis Compliance, Signing, Datenschutz und Store-Review vorbereitet sind.
Todo:
- [x] Entscheiden, ob die native App unter `/android/native` angelegt wird.
- [x] Entscheiden, ob die Capacitor-App langfristig parallel gepflegt bleibt.
- [x] Native MVP-Funktionsumfang final freigeben.
- [x] Admin-Bereich aus MVP ausschliessen oder explizit aufnehmen.
- [x] Adult-/Erotikbereiche aus MVP ausschliessen oder explizit mit Compliance-Aufwand aufnehmen.
- [x] Minigames aus MVP ausschliessen oder als separaten Spike aufnehmen.
- [x] 3D-Charaktere aus MVP ausschliessen oder als separaten Spike aufnehmen.
- [x] Zielgeraete festlegen: kleine Phones, Tablets, Mindest-Android-Version.
- [x] Play-Store-Zieltermin oder interne Distribution als Ziel definieren.
### 1. Native Projektbasis
Stand 2026-07-09:
- Native Projektbasis ist unter `/android/native` angelegt.
- Gradle Kotlin DSL ist aktiv.
- Separate Native-App-ID ist bewusst gewaehlt: `de.yourpart.nativeapp` mit Flavor-/Build-Type-Suffixen fuer parallele Installation.
- Flavors `local`, `staging`, `production` sind angelegt.
- Build Types `debug`, `release` sind angelegt.
- Versionierung ist initial definiert: `versionCode`, `versionName`, `BuildConfig.GIT_SHA`.
- Compose, Material 3, Hilt, Retrofit/OkHttp, Kotlinx Serialization JSON, Room, DataStore, Coil, WorkManager und FCM-Dependency sind im Projekt hinterlegt.
- Ein reproduzierbarer lokaler Build laeuft erfolgreich: `:app:assembleLocalDebug`.
- [x] Neues natives Gradle-Projekt unter `/android/native` erstellen.
- [x] Kotlin DSL fuer Gradle verwenden.
- [x] App-ID `de.yourpart.app` oder separate Dev-ID `de.yourpart.native.dev` entscheiden.
- [x] Produktflavors anlegen: `local`, `staging`, `production`.
- [x] Build Types anlegen: `debug`, `release`.
- [x] Versionierung definieren: `versionCode`, `versionName`, Git-Hash im Build.
- [x] Compose aktivieren.
- [x] Material 3 aktivieren.
- [x] Hilt einrichten.
- [x] Retrofit/OkHttp einrichten.
- [x] JSON-Library festlegen und einrichten.
- [x] Room einrichten.
- [x] DataStore einrichten.
- [x] Coil einrichten.
- [x] WorkManager einrichten.
- [x] FCM Dependency vorbereiten, aber noch nicht aktiv schalten.
- [x] Lint, Detekt oder Ktlint einrichten.
- [x] CI-Build-Script fuer native App definieren.
### 2. Design System
Stand 2026-07-09:
- Die Web-Farbpalette ist in native Tokens uebertragen.
- Typography, Spacing und Shapes sind als Theme-Tokens angelegt.
- Wiederverwendbare Compose-Bausteine existieren fuer Buttons, Textfelder, Dialoge, Info-/Loading-/Empty-States, Avatar und Status-Chips.
- Das Light Theme ist aktiv und die Demo-Shell nutzt die neuen Komponenten bereits.
- Ein minimales Dark-Theme-Grundgeruest existiert technisch, die Produktentscheidung dafuer bleibt aber offen.
- [x] YourPart-Farbpalette aus Web-App ableiten.
- [x] Typography fuer Android definieren.
- [x] Spacing-Skala definieren.
- [x] Shape-/Radius-System definieren.
- [x] Button-Komponenten definieren.
- [x] TextField-Komponenten definieren.
- [x] Dialog-Komponenten definieren.
- [x] Error-/Info-/Success-Komponenten definieren.
- [x] Loading/Empty-State-Komponenten definieren.
- [x] Avatar-/Image-Komponenten definieren.
- [x] Status-Chips fuer Backend/Daemon definieren.
- [x] Light Theme implementieren.
- [x] Dark Theme bewusst entscheiden: nein, nicht Teil des MVP.
- [x] Kleine Displaybreiten 360dp und 393dp als Design-Baseline testen: nein, nicht Teil des MVP.
### 3. App Shell und Navigation
Stand 2026-07-09:
- Die Demo-App ist zu einer nativen Shell mit Navigation ausgebaut.
- Top App Bar, Bottom Navigation und Drawer existieren.
- Primaere und sekundaere Bereiche sind als Route-Objekte modelliert.
- Eine erste Menue-Policy auf Basis von Session/Rollen ist vorhanden.
- Drawer-Back-Handling und Session-expired Rueckfuehrung zur Auth-Route sind umgesetzt.
- Offline-Banner sowie kompakte Backend-/Daemon-Status-Chips sind sichtbar.
- [x] Root Compose App mit Theme erstellen.
- [x] Top App Bar definieren.
- [x] Bottom Navigation fuer Hauptbereiche definieren.
- [x] Navigation Drawer fuer Sekundaerbereiche definieren.
- [x] Typed Routes fuer Auth, Home, Social, Falukant, Vocab, Settings anlegen.
- [x] Rollen-/Rechte-basierte Menueeintraege modellieren.
- [x] Backend-Menue-Response analysieren und native Menue-Policy definieren.
- [x] Android Back Button Verhalten definieren.
- [x] Dialog-Back-Handling implementieren.
- [x] Session-expired Navigation implementieren.
- [x] Offline-Banner implementieren.
- [x] Backend-/Daemon-Status sichtbar, aber kompakt darstellen.
### 4. Konfiguration und Environments
Stand 2026-07-09:
- Flavor-spezifische URLs fuer `local`, `staging`, `production` sind im Build hinterlegt.
- `local` nutzt bewusst `10.0.2.2` fuer Emulator-Zugriff.
- Release-Builds validieren automatisch, dass `staging` und `production` keine lokalen oder unverschluesselten URLs verwenden.
- Debug und Release nutzen getrennte Network-Security-Configs.
- Release verbietet Cleartext komplett.
- Feature Flags fuer `Admin`, `Adult`, `3D`, `Minigames` und `Push` sind als BuildConfig-Felder angelegt.
- Eine zentrale `AppConfig` liest die Flavor-/Build-Konfiguration aus `BuildConfig`.
- [x] API Base URLs fuer `local`, `staging`, `production` definieren.
- [x] Socket.IO URLs je Flavor definieren.
- [x] Daemon WebSocket URLs je Flavor definieren.
- [x] Lokale Emulator-Regel dokumentieren: Host-Rechner ist `10.0.2.2`.
- [x] Release-Build gegen lokale URLs blockieren.
- [x] Network Security Config fuer Debug und Release definieren.
- [x] TLS-only fuer Release sicherstellen.
- [x] Secrets aus APK fernhalten.
- [x] Feature Flags definieren: Admin, Adult, 3D, Minigames, Push.
### 5. Auth und Session
Stand 2026-07-09:
- Login, Logout und Session-Persistenz sind nativ angebunden.
- REST-Requests setzen automatisch `userid` und `authcode`.
- 401-Antworten fuehren zu Session-Loeschung und Session-expired-Hinweis.
- Registrierung, Passwort-Reset und OAuth-Provider-Liste sind als native Auth-Bausteine vorhanden.
- [x] Login-Endpunkt dokumentieren.
- [x] Login DTOs erstellen.
- [x] Login Repository implementieren.
- [x] Auth Interceptor fuer `userid` und `authcode` implementieren.
- [x] Session Store mit sicherer Speicherung implementieren.
- [x] Auto-Login beim App-Start implementieren.
- [x] Logout implementieren.
- [x] Session-expired Handling implementieren.
- [x] User-Aktivstatus pruefen.
- [x] Account gesperrt Handling implementieren.
- [x] Registrierung API-Vertrag erfassen.
- [x] Registrierung Screen implementieren.
- [ ] Account-Aktivierung Flow bewerten.
- [x] Passwort-Reset Flow implementieren.
- [x] OAuth-Provider-Liste laden.
- [ ] OAuth per Custom Tabs planen.
- [ ] App Links fuer OAuth Callback planen.
- [ ] OAuth erst nach Username/Passwort stabil aktivieren.
### 6. Netzwerk-Grundlage
Stand 2026-07-09:
- Eine zentrale `ApiResult`/`NetworkError`-Basis ist angelegt.
- Backend-Fehler werden zentral geparst und in lesbare Meldungen ueberfuehrt.
- Timeout- und Retry-Policy sind als feste Netzwerk-Defaults definiert.
- Debug-Logging laeuft nur ausserhalb von Release.
- Multipart- und Download-Helfer sind vorhanden.
- Ein MockWebServer-Test prueft den Auth-Header-Interceptor.
- Ein zentraler `NetworkRequestExecutor` fasst OkHttp-Fehlerbehandlung fuer Repository-Aufrufe zusammen.
- [x] Zentrale `ApiResult`/`NetworkError` Struktur definieren.
- [x] Fehlercodes und Backend-Fehlerformate erfassen.
- [x] Retry-Policy definieren.
- [x] Timeout-Policy definieren.
- [x] Request Logging nur fuer Debug aktivieren.
- [x] Auth Header Tests mit MockWebServer schreiben.
- [x] CORS ist nativ irrelevant, aber Backend-Origin-Checks gegen mobile Clients pruefen.
- [x] Multipart Upload Helper bauen.
- [x] Download Helper fuer Bilder/Dateien bauen.
- [x] Pagination Pattern definieren.
- [x] Refresh Pattern definieren.
### 7. Lokale Persistenz und Cache
Stand 2026-07-09:
- Ein zentraler Preferences-Store fuer UI-Sprache und Feature-Flags ist angelegt.
- Eine Room-Cache-Basis mit ersten Tabellen fuer Profil, Friends-Search, Falukant-Status und Vokabeldaten ist definiert.
- Cache-TTLs und Invalidierungsregeln sind als feste Policy hinterlegt.
- Die MVP-Entscheidung lautet: Offline-Anzeige statt Offline-First.
- Outbox/Offline-Write-Queues werden im MVP nur geplant, nicht erzwungen.
- [x] DataStore fuer UI-Sprache verwenden.
- [x] DataStore fuer Feature Flags verwenden.
- [x] Room Schema fuer User/Profile Cache definieren.
- [x] Room Schema fuer Friends/Search Cache definieren.
- [x] Room Schema fuer Falukant Status light definieren.
- [x] Room Schema fuer Vocab Course/Lesson Cache definieren.
- [x] Cache-Invalidation Regeln definieren.
- [x] Offline-Anzeige statt Offline-First fuer MVP festlegen.
- [x] Outbox fuer spaetere Offline-Aktionen nur planen, nicht im MVP erzwingen.
### 8. Realtime
Stand 2026-07-09:
- Socket.IO ist als Backend-Realtime-Transport in die native App eingebunden.
- Der Client sendet nach Login automatisch `setUserId` an Backend und Daemon.
- App-Foreground/Background koppelt die Verbindung an den Lifecycle.
- Backend- und Daemon-Status sind in der Shell sichtbar.
- Der Daemon-WebSocket-Client ist technisch angebunden.
- Realtime-Event-Basis und Daemon-Message-Parser sind vorhanden.
- Realtime-Events invalidieren nun gezielt Cache-/UI-Zustaende und erscheinen im internen Debug-Screen.
- [x] Socket.IO Android Client evaluieren.
- [x] Verbindung nach Login aufbauen.
- [x] `setUserId` nach Verbindungsaufbau senden.
- [x] Events erfassen: `forumschanged`, `friendloginchanged`, `reloadmenu`, `adultVerificationChanged`, `moderationReportChanged`, `userAccessChanged`.
- [x] Falukant-Events erfassen: `falukantUpdateStatus`, `falukantUpdateFamily`, `falukantUpdateChurch`, `falukantUpdateDebt`, `children_update`, `falukantUpdateProductionCertificate`, `falukantBranchUpdate`, `stock_change`, `familychanged`.
- [x] Socket Lifecycle an App Foreground/Background koppeln.
- [x] Reconnect Policy definieren.
- [x] Daemon-WebSocket Client implementieren.
- [x] Daemon-Message Parsing robust gegen unbekannte Events machen.
- [x] Realtime Events in Repositories einspeisen.
- [x] UI-State bei Events gezielt invalidieren.
- [x] Realtime Debug Screen fuer interne Builds planen.
### 9. Home und Dashboard
Stand 2026-07-09:
- Die nicht eingeloggte Startseite ist als native Landing/Auth-Kombination umgesetzt.
- Die eingeloggte Startseite laedt Dashboard-Daten aus dem Backend und zeigt Karten fuer Termine, Geburtstage, Falukant und Vokabeln.
- Dashboard-Widget- und Kalender-Widget-Vertraege sind nativ angebunden.
- Backend-/Daemon-Status bleibt als kompakte Info sichtbar.
- [x] Home API-Vertraege erfassen.
- [x] Eingeloggt/Nicht-eingeloggt Home getrennt modellieren.
- [x] Native Startseite fuer nicht eingeloggte Nutzer bauen.
- [x] Native Startseite fuer eingeloggte Nutzer bauen.
- [x] Dashboard Widget API-Vertraege erfassen.
- [x] Termine/Upcoming Events als native Cards umsetzen.
- [x] Falukant Kurzstatus als native Card umsetzen.
- [x] Backend-/Daemon-Status light anzeigen.
### 10. Settings
- [x] Settings API-Vertraege erfassen: `/api/settings/filter`, `/api/settings/update`, `/api/settings/account`, `/api/settings/set-account`, `/api/settings/visibilities`.
- [x] Spracheinstellung nativ implementieren.
- [x] Account-Basisdaten nativ implementieren.
- [x] Sichtbarkeitseinstellungen modellieren.
- [x] Personal/View/Sexuality/Flirt Settings priorisieren.
- [x] Interessen-Settings implementieren.
- [x] Language Assistant Settings bewerten.
- [x] Account-Loeschung oder Anfrageprozess fuer Store-Compliance klaeren.
### 11. Social Basis
- Stand 2026-07-09:
- Friends, Benutzersuche, Profil-Light und Gästebuch-Light sind nativ angebunden.
- Freundschaftsaktionen laufen in der nativen Friends-Ansicht gegen die vorhandenen Backend-APIs.
- Profilfelder werden inklusive Backend-Visibility-Regeln angezeigt.
- Moderationsmeldungen fuer Profile und Gästebucheintraege sind in der nativen UX integriert.
- [x] Friends API-Vertraege erfassen.
- [x] Friends Screen implementieren: bestehend, angefragt, offen, abgelehnt.
- [x] User Search API-Vertraege erfassen.
- [x] User Search Screen implementieren.
- [x] User Profile API-Vertraege erfassen.
- [x] Profile Light Screen implementieren.
- [x] Guestbook API-Vertraege erfassen.
- [x] Guestbook light implementieren.
- [x] Friend Request Aktionen implementieren.
- [x] Blockieren/Melden UX fuer Store-Compliance planen.
- [x] Privacy/Visibility Regeln aus Backend nativ abbilden.
### 12. Chat
Stand 2026-07-09:
- Der nativen MVP-Schnitt fuer Chat ist begonnen.
- Öffentliche Räume, eigene Räume, ein einfacher 1:1-Verlauf und Random Chat sind nativ angebunden.
- Direktnachrichten, Random Chat und die Raumlisten werden per Polling aktualisiert, bis die Socket.IO-Paritaet fuer den Chat folgt.
- Die MultiChat-Raumübersicht ist nativ verfuegbar; die historischen Socket.IO-Kommandos fuer den alten MultiChat bleiben als separate Paritaetsaufgabe offen.
- Direktnachrichten koennen gesendet und gemeldet werden.
- Push-Kandidaten fuer Chat sind identifiziert: Direktchat, Random-Chat, Raumbeitritt, Moderationsmeldungen.
- Socket.IO-Paritaet fuer Chat ist ein Pflichtpunkt und muss vor dem nativen Chat-Full-Release abgeschlossen werden.
- [x] Aktuellen Chat-Mechanismus erfassen: Dialoge, Raeume, Random Chat, MultiChat.
- [x] Chat Backend-/WebSocket-Vertraege dokumentieren.
- [x] Chat Room Liste implementieren.
- [x] 1:1 Chat MVP implementieren.
- [x] MultiChat MVP implementieren oder bewusst verschieben.
- [x] RandomChat bewusst verschieben oder implementieren.
- [x] Message Input mit Keyboard-Verhalten testen.
- [x] Neue Nachrichten per Realtime anzeigen.
- [x] Push-Kandidaten fuer Chat definieren.
- [x] Melden/Blockieren im Chat implementieren oder als Release-Blocker markieren.
- [ ] Socket.IO-Paritaet fuer Chat vollstaendig nativ umsetzen: Room-Join, Room-Events, Direktchat-Events, Random-Events und User-Registrierung ohne Polling.
### 13. Galerie und Medien
Stand 2026-07-10:
- Die Galerie wird als nativer Social-Unterbereich aufgebaut.
- Folder-Struktur, Bildliste, Sichtbarkeiten und Upload sind im nativen MVP bereits angelegt.
- Adult-Galerie und Video-Unterstuetzung bleiben bewusst aus dem ersten nativen Galerie-MVP heraus.
- [x] Galerie API-Vertraege erfassen.
- [x] Folder-Struktur nativ modellieren.
- [x] Bildliste mit Coil implementieren.
- [x] Bilddetail mit Vorschau sowie nativer Metadatenpflege fuer Titel und Sichtbarkeit implementieren.
- [x] Android Photo Picker fuer Upload implementieren.
- [x] Multipart Upload gegen den Backend-Vertrag automatisiert testen.
- [x] Bildbearbeitung aus Web-App bewerten: MVP nein. Die Web-Galerie bearbeitet nur Metadaten; Pixelbearbeitung, Crop und Filter bleiben aus dem nativen MVP ausgeschlossen.
- [x] Sichtbarkeiten laden und setzen.
- [x] Adult-Galerie aus MVP ausschliessen oder Compliance-Aufwand planen.
- [x] Video-Unterstuetzung separat planen.
### 14. Forum
Stand 2026-07-10:
- Forum, Themenliste und Themenansicht sind nativ als Social-Unterbereich umgesetzt.
- Beiträge werden nativ als Klartext gerendert; die bestehende HTML-Eingabe wird nicht ausgeführt.
- `forumschanged`, `topicschanged` und `messageschanged` aktualisieren alle offenen Forum-Ansichten gezielt.
- [x] Forum-Liste API-Vertrag erfassen.
- [x] Topic-Liste API-Vertrag erfassen.
- [x] Topic-Detail API-Vertrag erfassen.
- [x] Forum-Liste native umsetzen.
- [x] Topic-Liste native umsetzen.
- [x] Topic-Detail native umsetzen.
- [x] Antwort erstellen implementieren.
- [x] Moderation Report fuer Forum implementieren.
- [x] Realtime `forumschanged` integrieren.
### 15. Falukant MVP
Stand 2026-07-10:
- Der native Falukant-MVP ist eine Read-only-Spielstandszentrale: Übersicht, Status, Filialen, Bank, Familie und Nachrichten.
- Die Datenmodelle sind auf die bestehenden, je Spielstand unterschiedlich umfangreichen Backend-Antworten ausgelegt und ignorieren zusätzliche Felder.
- Create wird bewusst verschoben: Der bestehende Flow hängt an Charakter-, Namen- und 3D-Entscheidungen, die nicht Teil des MVP sind.
- [x] Falukant API-Endpunkte aus Web-App inventarisieren.
- [x] `StatusBar` Datenmodell nativ definieren.
- [x] Overview Screen implementieren.
- [x] Character/Familien-Basisdaten implementieren.
- [x] Branch-Liste implementieren.
- [x] Branch-Detail light implementieren.
- [x] Bank light implementieren.
- [x] Messages/Notifications light implementieren.
- [x] Realtime Falukant Events integrieren.
- [x] Create Falukant Flow bewusst verschieben.
- [x] Family View light implementieren.
- [x] Church/Reputation/Health/Nobility als Falukant-Vollausbau markieren.
- [x] Production/Storage/Sale/Director als Falukant-Vollausbau markieren.
- [x] Karten-/Regionen-Features als Falukant-Vollausbau markieren.
### 16. Falukant Vollausbau
Stand 2026-07-10:
- Der Wirtschaftsblock ist begonnen: Filialdetails laden Produktion, Lager, Inventar, Director, Fahrzeuge und laufende Transporte.
- Bereits native Kernaktionen: Produktion starten, Lager kaufen, Einzel- und Komplettverkauf, Fahrzeuge gesammelt reparieren, Director-Einkommen speichern, Transport starten und Kredit aufnehmen.
- Die verbliebenen Punkte werden erst abgehakt, sobald ihre jeweiligen Detail- und Aktionsflows nativ abgeschlossen sind.
#### 16.1 Filiale und Wirtschaft
- [x] Filialdetail-Basis laden: Filiale, Produktion, Lager, Inventar, Director, Fahrzeuge und Transporte.
- [x] Produktion starten implementieren.
- [x] Lagerkapazität kaufen implementieren.
- [x] Einzelverkauf implementieren.
- [x] Gesamtes Inventar verkaufen implementieren.
- [x] Fahrzeuge gesammelt reparieren implementieren.
- [x] Director-Einkommen speichern implementieren.
- [x] Transport starten implementieren.
- [x] Branch Detail vollstaendig umsetzen: Upgrade, Steuerübersicht, Preisvergleich und Detaildarstellung vervollständigen.
- [x] Production Section vervollständigen: laufende Produktionen, Restzeit, Qualitäts-/Wetterdaten und Abbruchregeln.
- [x] Storage Section vervollständigen: Kapazität je Typ verkaufen und verfügbare Lagertypen auswählen.
- [x] Sale Section vervollständigen: Inventarpositionen auswählen, regionale Preise vergleichen und Verkauf bestätigen.
- [x] Director Info vervollständigen: Proposal, Einstellung, Wissens-/Lehrfluss und alle Einstellungen.
- [x] Transport Routes vervollständigen: Routen-Vorschau, Kapazitätsprüfung, Wachkosten und Transportstatus.
#### 16.2 Bank und Historie
- [x] Bankübersicht und aktive Kredite laden.
- [x] Kreditaufnahme implementieren.
- [x] Bank vollstaendig umsetzen: Tilgung, Gebührenvorschau, Sperren und Schuldgefängnis-Aktionen.
- [x] Money History umsetzen: Filter, Pagination und Graphdaten.
#### 16.3 Familie und Person
- [x] Family vollstaendig umsetzen: Partnerschaft, Geschenke, Erben, Kinder und Liebesbeziehungen.
- [x] Health umsetzen: Gesundheitsstatus und Aktivitäten mit Cooldown.
- [x] Reputation umsetzen: Aktionen, Partys und Fortschritt.
- [x] Church umsetzen: Taufe, Ämter, Bewerbungen und Entscheidungen.
- [x] Nobility umsetzen: Stand, Voraussetzungen und Aufstieg.
- [x] House umsetzen: Hauskauf, Renovierung, Personal und Haushaltsordnung.
- [x] Education umsetzen: Lernende, Inhalte und Schulaktionen.
#### 16.4 Gesellschaft und Konflikt
- [x] Politics umsetzen: Übersicht, Ämter, Steuern, Ernennungen, Wahlen und Kandidaturen.
- [x] Underground umsetzen: Aktivitäten, Ziele, Angriffe und Raid-Regionen.
#### 16.5 Qualität
- [x] Performance fuer grosse Falukant-Datenmengen testen.
### 17. Vokabeltrainer MVP
- [x] Vocab Languages API-Vertrag erfassen.
- [x] Course List API-Vertrag erfassen.
- [x] Course Detail API-Vertrag erfassen.
- [x] Lesson API-Vertrag erfassen.
- [x] Review API-Vertrag erfassen.
- [x] Vocab Landing native umsetzen.
- [x] Course List native umsetzen.
- [x] Course Detail native umsetzen.
- [x] Lesson Player MVP implementieren.
- [x] Lesson Review implementieren.
- [x] Dictionary light implementieren.
- [x] Progress/Completion speichern.
- [x] Keyboard-/Audio-/Touch-Verhalten testen.
- [x] Offline Cache fuer aktive Lektion planen: aktive Lektion und Antworten werden erst in Abschnitt 18 per Room synchronisiert.
### 18. Vokabeltrainer Vollausbau
- [x] Neue Sprache anlegen implementieren.
- [x] Subscribe Flow implementieren.
- [x] Chapter View implementieren.
- [x] Dictionary vollstaendig implementieren.
- [x] Practice Dialog nativ ersetzen.
- [x] SRS-/Review-Logik gegen Backend validieren.
- [x] Offline Lesson Cache implementieren.
- [x] Sync-Konflikte definieren.
Konfliktregel: Der vom Server geladene Lektionsstand ist verbindlich. Nicht bestaetigte
SRS-Reviews bleiben mit einer lokalen Request-ID in der Outbox und werden in Reihenfolge
erneut gesendet; nach einer Server-Antwort wird der Eintrag entfernt.
### 19. Kalender und Persoenliches
- [x] Calendar API-Vertraege erfassen.
- [x] Monats-/Wochen-/Listenansicht entscheiden.
- [x] Termine laden.
- [x] Termin erstellen.
- [x] Termin bearbeiten.
- [x] Termin loeschen.
- [x] Date/Time Picker nativ einsetzen.
- [x] Reminder/Push spaeter planen.
- [x] Diary API-Vertrag erfassen.
- [x] Diary light umsetzen oder verschieben.
Entscheidung: Die mobile Umsetzung verwendet eine nach Datum sortierte Listenansicht mit
Monatsbereich. Termine nutzen `/api/calendar/events` (GET mit Datumsbereich, POST, PUT,
DELETE). Das Diary nutzt `/api/socialnetwork/diary` mit paginierter Liste und CRUD. Lokale
Reminder und Push-Benachrichtigungen werden erst nach der Push-Grundlage aus Abschnitt 12
als WorkManager-Aufgabe mit Android-Notification-Kanal umgesetzt.
### 20. Public Content
- [x] Blog List API-Vertrag erfassen.
- [x] Blog Detail API-Vertrag erfassen.
- [x] Guide List API-Vertrag erfassen.
- [x] Guide Detail API-Vertrag erfassen.
- [x] Public Landing Screens nativ priorisieren oder aus App entfernen.
- [x] Rich Text Rendering nativ loesen.
- [x] Blog Editor aus MVP ausschliessen.
- [x] Guide/Marketing Content als WebView-Fallback pruefen oder nativ rendern.
- [x] News/Blog/Guide Kurzlisten bewerten.
Entscheidung: Öffentliche Blogs nutzen `/api/blog/blogs` und `/api/blog/blogs/:id/posts`.
Ratgeber haben keinen Backend-Vertrag, sondern stammen aus dem versionierten Frontend-Katalog;
die mobile App führt dafür einen kuratierten, nativ gerenderten Lesekatalog. HTML aus
Blogbeiträgen wird als sicherer Text ohne WebView gerendert. Der Blog-Editor bleibt im Web.
News verwendet einen authentifizierungspflichtigen Drittanbieter-Proxy und wird nicht als
öffentliche Kurzliste dupliziert; Blogs und Ratgeber bleiben Drawer-Bereiche.
### 21. Minigames
#### 21.1 Match3
- [x] Match3 Game als native Compose/Canvas Machbarkeit pruefen.
- [x] Spielbrett, Tile-Modell und Zuglogik definieren.
- [x] Touch-Steuerung fuer Auswahl und Tausch definieren.
- [x] Animationen und Aufloesung von Matches definieren.
- [x] Score-/Leaderboard-API-Vertraege fuer Match3 erfassen.
- [ ] Performance auf Emulator und echtem Geraet testen. In eine spaetere gemeinsame QA-Runde verschoben.
Entscheidung: Match3 wird als natives Compose-Canvas-Spiel mit einem 8x8-Board umgesetzt.
Ein Zug besteht aus zwei Tap-Eingaben auf benachbarte Steine. Matches werden gesammelt,
aufgeloest, von oben aufgefuellt und mit 10 Punkten pro Stein bewertet. Der Fortschritt nutzt
`/api/match3/campaigns`, das erste aktive Level und den vorhandenen Progress-Endpunkt samt
Hash-Format. Admin-Routen bleiben ausgeschlossen.
#### 21.2 Taxi
- [x] Taxi Game als native Canvas/OpenGL Machbarkeit pruefen.
- [x] Spielfeld, Fahrzeugzustand und Fahrphysik definieren.
- [x] Touch-Steuerung fuer Lenken, Beschleunigen und Bremsen definieren.
- [x] Auftrags-, Ziel- und Kollisionslogik definieren.
- [x] Score-/Leaderboard-API-Vertraege fuer Taxi erfassen.
- [ ] Performance auf Emulator und echtem Geraet testen. In eine spaetere gemeinsame QA-Runde verschoben.
Entscheidung: Taxi wird als natives Compose-Canvas-Spiel umgesetzt. Vier Touch-Schaltflächen
steuern Lenken, Beschleunigen und Bremsen. Ein gelber Abholpunkt und ein grünes Ziel bilden
einen Auftrag; Verkehr erzeugt Kollisionen, drei Kollisionen oder leerer Tank beenden die
Fahrt. Highscores nutzen `/api/taxi/highscores` mit Benutzer-ID, Punkten, Fahrgästen,
Spielzeit und Kartenkennung. OpenGL ist für diese 2D-Strecke nicht erforderlich.
#### 21.3 Gemeinsame Integration
- [x] WebView-Fallback fuer Minigames als Zwischenloesung bewerten.
- [x] Gemeinsame Minigame-Navigation und Lifecycle-Verhalten definieren.
- [x] Gemeinsames Persistenz- und Abbruchverhalten definieren.
- [x] Admin-Tools fuer Minigames aus nativer App ausschliessen.
Entscheidung: Es gibt keinen WebView-Fallback. Match3 und Taxi bleiben native Canvas-
Implementierungen; der vorhandene Webbereich wird nicht in die native App eingebettet. Der
Drawer zeigt bei aktiviertem `FEATURE_MINIGAMES` nur den geschuetzten Hub `minigames`; von dort
sind die beiden geschuetzten Spielrouten erreichbar. Spielschleifen sind an die Composition
gebunden und werden beim Verlassen automatisch beendet. Match3 speichert nur abgeschlossene
Level ueber den vorhandenen Progress-Endpunkt. Taxi speichert beim Verlassen einer laufenden
Fahrt einen Zwischenstand ueber `/api/taxi/game-state`; abgeschlossene Fahrten werden als
Highscore gespeichert. Admin- und Verwaltungsrouten fuer Minigames werden nicht registriert und
bleiben ausschliesslich im Web-Adminbereich.
### 22. Admin spaeter
- [x] Entscheiden, ob Admin ueberhaupt in native App gehoert. - Ja, Admin gehört in die native App
- [x] Admin Users API-Vertraege erfassen.
- [x] Admin Rights API-Vertraege erfassen.
- [x] Moderation Reports API-Vertraege erfassen.
- [x] Adult Verification API-Vertraege erfassen.
- [x] Erotic Moderation API-Vertraege erfassen.
- [x] Forum Admin API-Vertraege erfassen.
- [x] Falukant Admin API-Vertraege erfassen.
- [x] Services Status Screen fuer interne Builds planen.
- [x] Admin nur per Feature Flag und Rollencheck sichtbar machen.
Entscheidung: Die native Administration wird nur eingeblendet, wenn sowohl
`FEATURE_ADMIN` aktiviert ist als auch die authentifizierte Anfrage an
`GET /api/navigation/:userid` einen Bereich `administration` liefert. Die vom Backend
gefilterte Navigation ist die Rechtequelle; die serverseitige Berechtigungsprüfung jeder
Admin-Route bleibt verbindlich. Direkte Navigation ohne beide Bedingungen zeigt keinen Inhalt.
API-Vertraege:
- Benutzer: `GET /api/admin/users/search?q=`, `GET /api/admin/users/:id`, `PUT /api/admin/users/:id`, `GET /api/admin/users/batch?ids=`, `GET /api/admin/users/statistics`; alle erfordern die vom Service gepruefte Berechtigung `useradministration` bzw. `mainadmin`.
- Rechte: `GET /api/admin/rights/types`, `GET /api/admin/rights/:id`, `POST /api/admin/rights/:id` und `DELETE /api/admin/rights/:id` mit `{ rightTypeId }`; Berechtigung `rights` bzw. `mainadmin`.
- Moderationsmeldungen: `GET /api/admin/moderation/reports?status=&limit=` sowie `POST /api/admin/moderation/reports/:reportId/status` mit Status und Review-Notiz; Berechtigung `forum` bzw. `mainadmin`.
- Altersverifikation: `GET /api/admin/users/adult-verification?status=`, `PUT /api/admin/users/:id/adult-verification` mit `approved`, `rejected` oder `pending`, sowie der geschuetzte Dokument-Download `GET /api/admin/users/:id/adult-verification/document`.
- Erotikmoderation: `GET /api/admin/users/erotic-moderation?status=`, geschuetzte Vorschau unter `/preview/:type/:targetId` und `PUT /api/admin/users/erotic-moderation/:id` mit erlaubter Aktion und optionaler Notiz.
- Forum: `GET` und `POST /api/forum/`, `DELETE /api/forum/:forumId`; Erstellen erwartet `{ name, permissions }`, die Service-Schicht prueft `forum` bzw. `mainadmin`. Allgemeine Meldungen laufen ueber den Moderationsvertrag.
- Falukant: Die geschuetzten Werkzeuge liegen unter `/api/admin/falukant/*`: Benutzersuche/-bearbeitung, Familien- und Schwangerschaftsaktionen, Bestands-/Region-/Distanzpflege, NPC-Auftraege und Titel. Die native Umsetzung beschraenkt sich auf klar abgegrenzte Fach-Screens mit serverseitiger `falukant`-/`mainadmin`-Pruefung; keine generische Datenbankbearbeitung.
Service-Status: Nur interne Debug-Builds erhalten einen kompakten, rein lesenden Statusscreen
auf Basis der bereits vorhandenen Backend-/Daemon-Verbindungssignale. Keine Prozessdaten,
Tokens, Konfigurationen oder Diagnose-Endpunkte werden in Release-Builds angezeigt. Die
Match3-/Taxi-Adminwerkzeuge bleiben gemaess Abschnitt 21 ausserhalb der nativen App.
### 23. Adult Content und Store-Compliance
- [x] Adult Content aus MVP entfernen oder per Feature Flag deaktivieren.
- [x] Altersverifikation nativ modellieren.
- [x] UGC-Melden nativ in Chat, Galerie, Forum, Profil implementieren.
- [x] Blockieren nativ implementieren.
- [x] Moderationserreichbarkeit dokumentieren.
- [x] Datenschutzseite nativ erreichbar machen.
- [x] Impressum nativ erreichbar machen.
- [x] Kontakt nativ erreichbar machen.
- [x] Account-Loeschung oder klare Anleitung nativ erreichbar machen.
- [x] Play Store Content Rating vorbereiten.
- [x] Store-Review-Risiko fuer Adult Content separat entscheiden.
Stand 2026-07-16: Der geschuetzte Bereich ist im lokalen Debug-Build per `FEATURE_ADULT`
aktiviert; Staging und Production bleiben bis zur Store-Entscheidung deaktiviert. Die native App
laedt den Status ueber `/api/settings/account` und laedt erst nach lokaler Pruefung von
Volljaehrigkeit und `adultAccessEnabled` die serverseitig ebenfalls geschuetzten Endpunkte unter
`/api/socialnetwork/erotic/*`. Ein Verifikationsnachweis (JPEG, PNG, WebP oder PDF) wird per
Android-Dateiauswahl an `/api/settings/adult-verification/request` gesendet. Die API prueft
zusaetzlich Alter und Verifikationsstatus. Die Account-Endpunkte weisen nun ausserdem Anfragen
ab, deren Body-`userId` nicht der authentifizierten `userid` entspricht.
Blockieren verwendet den neuen serverseitigen Vertrag `POST`/`DELETE
/api/socialnetwork/blocked-users/:userId` und die Migration
`20260716000000-create-user-block.sql`; der Profil-Screen bietet die Blockaktion nativ an.
Die Store-Entscheidung und Rating-Vorbereitung sind in `android/STORE_COMPLIANCE.md`
dokumentiert: Der Bereich bleibt ausserhalb lokaler Debug-Builds deaktiviert, bis eine formelle
Store- und Altersfreigabe vorliegt.
### 24. Push Notifications
- [x] Firebase Projekt klaeren.
- [x] FCM in native App integrieren.
- [x] Device Token Backend-Modell planen.
- [x] Device Token Registration API definieren.
- [x] Opt-in UI implementieren.
- [x] Notification Settings implementieren.
- [x] Chat Push definieren.
- [x] Friend Login Push definieren.
- [x] Falukant Event Push definieren.
- [x] Vocab Reminder Push definieren.
- [x] Deep Links aus Notifications implementieren.
- [x] Token Refresh Handling implementieren.
- [ ] Firebase-Service-Account im Backend-Deployment hinterlegen (`FIREBASE_SERVICE_ACCOUNT_PATH` oder `FIREBASE_SERVICE_ACCOUNT_JSON`).
### 25. Deep Links und OAuth
- [x] App Links Domain festlegen.
- [x] `assetlinks.json` planen.
- [x] Deep-Link-Struktur fuer Auth, Home, Social, Falukant, Vocab, Settings und Public Content definieren.
- [x] OAuth Redirect URIs fuer Android planen.
- [x] Custom Tabs Flow implementieren.
- [x] OAuth Callback Handling implementieren.
- [x] Deep Links fuer Profile, Forum, Falukant, Vocab, Blog definieren.
- [x] Deep Link Auth Guard implementieren.
- [x] Nicht eingeloggte Deep Links nach Login fortsetzen.
### 26. Sicherheit
- [x] Authdaten nicht im Klartext speichern.
- [x] Release Logging sensibler Daten verhindern.
- [x] Certificate Pinning bewerten, nicht vorschnell erzwingen.
- [x] Network Security Config fuer Release restriktiv halten.
- [x] Root/Jailbreak Detection bewusst entscheiden.
- [x] Screenshot-Schutz fuer Adult/Private Bereiche bewerten.
- [x] Datei-Uploads auf MIME/Größe pruefen.
- [x] WebView-Fallbacks minimieren.
- [x] Dependency-Scanning fuer Android einrichten.
### 27. Testing
- [x] Unit Tests fuer Auth Repository.
- [x] Unit Tests fuer Settings Repository.
- [x] Unit Tests fuer Error Mapping.
- [x] MockWebServer Tests fuer Auth Header.
- [x] MockWebServer Tests fuer API-Fehler.
- [x] Room Migration Tests.
- [x] Compose Tests fuer Login.
- [x] Compose Tests fuer Navigation.
- [x] Compose Tests fuer Home.
- [x] Compose Tests fuer Vocab Lesson.
- [x] Realtime Tests mit Testserver planen.
- [x] Emulator-Testmatrix definieren: kleines Phone, grosses Phone, Tablet.
- [x] Echtes Android-Geraet in Testmatrix aufnehmen.
- [x] Offline/Online-Wechsel testen.
- [x] App Kill/Restart/Resume testen.
- [ ] Instrumentation-Suite auf einem verbundenen Geraet oder KVM-faehigen Host ausfuehren (lokal blockiert: kein ADB-Geraet, keine x86_64-Hardwarebeschleunigung).
### 28. Build, Release und Betrieb
- [ ] Debug APK Build einrichten.
- [ ] Release AAB Build einrichten.
- [ ] Signing-Konzept definieren.
- [ ] Keystore sicher ablegen.
- [ ] Internal App Sharing oder interne Testspur planen.
- [ ] Crashlytics oder alternatives Crash Reporting entscheiden.
- [ ] Analytics bewusst entscheiden: ja/nein, Datenschutz.
- [ ] App Version Check implementieren oder planen.
- [ ] Rollback-Strategie definieren.
- [ ] Hybrid-App und Native-App Parallelbetrieb dokumentieren.
### 29. Backend-Vorbereitung fuer Native
- [ ] Release-Signaturfingerprint in die ausgelieferte `/.well-known/assetlinks.json` eintragen.
- [ ] Native OAuth-Redirect-URI bei jedem aktivierten Provider hinterlegen.
- [ ] Mobile API-Inventar aus allen Web-Komponenten erstellen.
- [ ] API-Versionierung bewerten: `/api/mobile/v1` ja/nein.
- [ ] Einheitliches Fehlerformat definieren.
- [ ] Einheitliches Pagination-Format definieren.
- [ ] Auth auf Bearer Token/JWT oder bestehendes `userid`/`authcode` final entscheiden.
- [ ] Refresh Token Konzept bewerten.
- [ ] Device Token API fuer Push planen.
- [ ] Datei-Upload-Limits dokumentieren.
- [ ] Image Thumbnail Endpunkte fuer mobile Listen planen.
- [ ] Falukant Summary Endpunkte fuer mobile Screens planen.
- [ ] Vocab Lesson Endpunkte fuer mobile Offline-Caches planen.
### 30. Abnahmekriterien MVP
- [ ] App startet kalt unter 2 Sekunden auf Testgeraet oder Zielwert begruendet anpassen.
- [ ] Login funktioniert gegen production/staging.
- [ ] Session ueberlebt App-Neustart.
- [ ] Logout entfernt lokale Session und trennt Realtime.
- [ ] Home laedt ohne WebView.
- [ ] Navigation ist vollstaendig nativ.
- [ ] Mindestens ein Social-Basisflow funktioniert.
- [ ] Mindestens ein Falukant-Basisflow funktioniert.
- [ ] Mindestens ein Vocab-Lesson-Flow funktioniert.
- [ ] Fehler werden nativ und verstaendlich angezeigt.
- [ ] Offline-Zustand wird erkannt und blockiert keine App.
- [ ] Keine lokalen Dev-URLs im Release-Build.
- [ ] Keine Secrets im APK/AAB.
- [ ] Datenschutz, Impressum und Kontakt sind erreichbar.
## Empfohlene erste Umsetzungsschritte
1. `/android/native` als neues Kotlin/Compose-Projekt anlegen.
2. Core Module fuer Network, Auth, Design und Navigation erstellen.
3. Login komplett nativ implementieren.
4. Session Store und Auth Interceptor stabilisieren.
5. Native App Shell mit Home und Navigation bauen.
6. Danach Social light, Falukant light und Vocab light nacheinander umsetzen.
## Realistische Einordnung
Die native Komplettumsetzung ist erheblich groesser als die Hybrid-App. Die Hybrid-App ist sinnvoll als lauffaehige Zwischenloesung und Referenzimplementierung. Die native App sollte als paralleles Produkt mit klarem MVP gestartet werden, sonst entsteht ein langer Rewrite ohne nutzbaren Zwischenstand.

101
android/README.md Executable file
View File

@@ -0,0 +1,101 @@
# YourPart Android
Android-App-Shell fuer YourPart auf Basis der bestehenden Vue/Vite-App und Capacitor.
## Entscheidungen
- App-ID: `de.yourpart.app`
- App-Name: `YourPart`
- Technologie: Capacitor mit lokal gebuendeltem `frontend/dist`
- Backend: bestehendes Backend wird verwendet, keine Backend-Implementierung in diesem Android-Start
- Erstes Ziel: interne Debug-/Test-APK
## Vorbereitung
1. Frontend-Env-Vorlage kopieren und Werte pruefen:
```bash
cp ../frontend/.env.android.example ../frontend/.env.android
```
2. Android-Dependencies installieren:
```bash
npm install
```
3. Web-Bundle fuer Android bauen:
```bash
npm run build:web
```
4. Android-Projekt erzeugen:
```bash
npm run add:android
```
5. Danach synchronisieren:
```bash
npm run sync
```
## Debug-Build
Nach `npm run add:android`:
```bash
npm run build:debug
```
Das erzeugte APK liegt danach unter `android/app/build/outputs/apk/debug/`.
Innerhalb dieses Repositorys ist das der Pfad `/android/android/app/build/outputs/apk/debug/`.
## Android Studio
In Android Studio muss das native Gradle-Projekt geoeffnet werden:
```text
/home/torsten/Programs/YourPart3/android/android
```
Nicht `/home/torsten/Programs/YourPart3/android` oeffnen. Dieser Ordner ist nur die Capacitor-Projektwurzel mit `package.json` und `capacitor.config.ts`; die Android-Studio-App liegt eine Ebene tiefer in `/android/android`.
Nach dem Oeffnen:
1. Gradle Sync abwarten.
2. Run Configuration `YourPart Debug` auswaehlen.
3. Emulator auswaehlen.
4. Starten.
Wenn Android Studio die Konfiguration nicht sofort anzeigt, `File > Sync Project with Gradle Files` ausfuehren oder das Projektfenster neu laden.
## Emulator-Eingabe
Die App verwendet die normale Android-WebView-Eingabe. `android.captureInput` ist bewusst nicht aktiviert, weil diese Capacitor-Option die WebView-InputConnection ersetzt und im Emulator verhindern kann, dass Textfelder normal beschrieben werden.
## Backend-CORS fuer Android-Debug
Capacitor laedt die lokale Android-App standardmaessig unter:
```text
https://localhost
```
Die API-Requests gehen weiterhin an `https://www.your-part.de/api/...`. Deshalb muss das Backend `https://localhost` in `CORS_ORIGINS` erlauben:
```env
CORS_ORIGINS=https://www.your-part.de,https://localhost,http://localhost:5173,http://127.0.0.1:5173
```
`server.hostname` in `capacitor.config.ts` darf nicht auf `www.your-part.de` gesetzt werden. Sonst interpretiert Capacitor Backend- und Model-URLs wie `/api/models/...glb` als lokale App-Assets.
## Wichtige Hinweise
- `frontend/.env.android` darf echte produktive URLs enthalten, aber keine Secrets.
- `VITE_DISABLE_3D=true` ist fuer Android-Debug absichtlich gesetzt. Das verhindert WebGL/GLB-Last auf der Login-Seite, bis CORS und 3D-Performance separat freigegeben sind.
- OAuth ist im ersten Debug-APK nicht der Blocker; Username/Passwort-Login ist die Pflichtfunktion.
- Push Notifications werden erst nach stabiler Shell geplant.
- Play Store ist vorerst kein Ziel, bis Datenschutz, UGC, Moderation und Adult-Content separat geprueft sind.

37
android/SECURITY.md Normal file
View File

@@ -0,0 +1,37 @@
# Native Android Security
## Umgesetzte Schutzmaßnahmen
- Die Sitzung liegt ausschließlich in `EncryptedSharedPreferences` mit Android-Master-Key.
- Release-Builds enthalten keinen HTTP-Body-Logger. Der detaillierte OkHttp-Logger ist auf
Nicht-Release-Builds begrenzt.
- Release-Netzwerkverkehr erlaubt kein Cleartext. Nur der lokale Debug-Flavor darf
`10.0.2.2` und `localhost` per HTTP ansprechen.
- Chat, Galerie, Persönliches und der Adult-Bereich setzen `FLAG_SECURE`. Damit verhindert
Android Screenshots, Bildschirmaufnahmen und die Anzeige im App-Switcher.
- Uploads werden vor dem Service auf einen erlaubten MIME-Typ und eine Größe begrenzt:
Bilder/Verifikationsnachweise 10 MiB, Videos 100 MiB. Bilder werden zusätzlich durch
Sharp dekodiert, damit ein behaupteter MIME-Typ nicht genügt.
## Bewusste Entscheidungen
### Certificate Pinning
Certificate Pinning wird aktuell **nicht** erzwungen. Die API verwendet HTTPS und die
plattformseitige Trust-Store-Prüfung. Pinning würde bei Zertifikats- oder CDN-Wechseln ohne
App-Update zu vollständigen Ausfällen führen. Es wird erst eingeführt, wenn es mindestens zwei
parallel gültige Pins, ein dokumentiertes Rotation-Verfahren und Monitoring für Pin-Fehler gibt.
### Root- und Bootloader-Erkennung
Die App blockiert gerootete Geräte nicht. Eine lokale Erkennung ist umgehbar und würde legitime
Nutzer sowie Emulator-Tests ausschließen. Sensible Daten bleiben verschlüsselt, Screenshots in
sensiblen Bereichen sind gesperrt und Berechtigungen werden auf dem Server durchgesetzt.
Play Integrity wird bei späteren Hochrisiko-Aktionen als serverseitig prüfbares Signal bewertet,
nicht als pauschale Startblockade.
## Dependency Scanning
`.github/workflows/android-security.yml` führt bei Pull Requests und Pushes einen
OSV-Abhängigkeitsscan sowie Android-Lint für den Produktions-Release aus. Kritische Findings
werden vor einem Release bewertet.

View File

@@ -0,0 +1,17 @@
# Store-Compliance
## Adult Content
- `FEATURE_ADULT` ist nur im lokalen Debug-Build aktiv.
- Staging und Production liefern keinen nativen Adult-Bereich aus.
- Vor einer Aktivierung sind Play-Content-Rating, Altersklassifizierung, Moderationsprozess,
Meldewege und die Store-Richtlinien erneut zu pruefen und freizugeben.
- Die API bleibt auch bei aktivem Client-Feature die Autoritaet: Volljaehrigkeit und der Status
`approved` der Altersverifikation sind fuer jeden geschuetzten Endpunkt erforderlich.
## UGC und Moderation
- Native Meldungen existieren fuer Chat, Forum, Profile, Gaestebuch und Galerie.
- Meldungen werden serverseitig gespeichert und sind fuer berechtigte Moderatoren sichtbar.
- Nutzerblockaden werden serverseitig in `community.user_block` gespeichert; die SQL-Migration
`backend/migrations/20260716000000-create-user-block.sql` ist vor dem Rollout auszufuehren.

45
android/TESTING.md Normal file
View File

@@ -0,0 +1,45 @@
# Native Android Testmatrix
## Automatisiert
| Bereich | Testart | Ausführung |
| --- | --- | --- |
| Auth, Settings, HTTP-Fehler, Header, Daemon-Parser | JVM + MockWebServer | `./gradlew :app:testLocalDebugUnitTest` |
| Room-Migration und verschlüsselte Session nach Store-Neuerzeugung | Instrumentation | `./gradlew :app:connectedLocalDebugAndroidTest` |
| Login, Navigation, Home und Vokabel-Lektion | Compose Instrumentation | `./gradlew :app:connectedLocalDebugAndroidTest` |
| Realtime | JVM-Parser plus manueller Socket.IO-Testserver-Plan | siehe unten |
### Lokaler Ausfuehrungsstatus
- Die JVM-Suite (`:app:testLocalDebugUnitTest`) ist erfolgreich ausgefuehrt.
- Die Instrumentation-Suite inklusive Room- und Compose-Tests kompiliert erfolgreich.
- Die Ausfuehrung auf diesem Host ist blockiert: Es ist kein ADB-Geraet verbunden und die
x86_64-Emulatoren benoetigen KVM-Hardwarebeschleunigung, die hier nicht verfuegbar ist.
Das vorhandene ARM64-System-Image kann auf einem x86_64-Host nicht emuliert werden.
- Auf einem Host mit KVM oder einem verbundenen Geraet wird die Suite mit
`./gradlew :app:connectedLocalDebugAndroidTest` ausgefuehrt. Der CI-Workflow
`.github/workflows/android-tests.yml` fuehrt dieselbe Suite auf einem GitHub-Emulator aus.
## Emulator- und Geräte-Matrix
| Ziel | Pflichtfälle |
| --- | --- |
| Kleines Phone, API 34+ | Login, Navigation, Formular, Tastatur, Adult-Screenshotschutz |
| Großes Phone, API 34+ | Galerie, Falukant und Vokabel-Lektion |
| Tablet, API 34+ | Drawer, Landscape und Listenbreiten |
| Reales Android-Gerät, aktuelle API | Push-Berechtigung, OAuth Custom Tab, App Links, Kamera/Dateiauswahl |
Die Gradle Managed Devices `mediumPhone` und `mediumTablet` decken die CI-Basis ab. Das lokale
Team ergänzt für jeden Release-Lauf die installierten kleinen/großen Emulatoren und mindestens
ein reales Gerät.
## Netzwerk, Realtime und Lifecycle
1. Backend und Daemon starten, mit einem Testkonto anmelden und Socket.IO-Verbindung prüfen.
2. Backend stoppen: Offline-Banner, verständlicher Fehler und keine blockierte Navigation prüfen.
3. Backend wieder starten: Screen aktualisieren und Realtime-Verbindung erneut prüfen.
4. App im Hintergrund beenden und über Launcher oder Push erneut öffnen: verschlüsselte Sitzung,
Deep-Link-Fortsetzung und Realtime-Reconnect prüfen.
5. Für Socket.IO-Regressionen wird ein isolierter Node-Testserver mit den Ereignissen
`friendloginchanged`, `falukantUpdateStatus`, `familychanged` und `reloadmenu` verwendet.
Der Android-Test verbindet sich mit dessen URL statt mit Production.

View File

@@ -0,0 +1,6 @@
<?xml version="1.0" encoding="UTF-8"?>
<project version="4">
<component name="AndroidProjectSystem">
<option name="providerId" value="com.android.tools.idea.GradleProjectSystem" />
</component>
</project>

6
android/android/.idea/compiler.xml generated Executable file
View File

@@ -0,0 +1,6 @@
<?xml version="1.0" encoding="UTF-8"?>
<project version="4">
<component name="CompilerConfiguration">
<bytecodeTargetLevel target="21" />
</component>
</project>

View File

@@ -0,0 +1,15 @@
<?xml version="1.0" encoding="UTF-8"?>
<project version="4">
<component name="deploymentTargetSelector">
<selectionStates>
<SelectionState runConfigName="YourPart Debug">
<option name="selectionMode" value="DROPDOWN" />
<DialogSelection />
</SelectionState>
<SelectionState runConfigName="app">
<option name="selectionMode" value="DROPDOWN" />
<DialogSelection />
</SelectionState>
</selectionStates>
</component>
</project>

10
android/android/.idea/migrations.xml generated Executable file
View File

@@ -0,0 +1,10 @@
<?xml version="1.0" encoding="UTF-8"?>
<project version="4">
<component name="ProjectMigrations">
<option name="MigrateToGradleLocalJavaHome">
<set>
<option value="$PROJECT_DIR$" />
</set>
</option>
</component>
</project>

10
android/android/.idea/misc.xml generated Executable file
View File

@@ -0,0 +1,10 @@
<?xml version="1.0" encoding="UTF-8"?>
<project version="4">
<component name="ExternalStorageConfigurationManager" enabled="true" />
<component name="ProjectRootManager" version="2" languageLevel="JDK_21" project-jdk-name="jbr-21" project-jdk-type="JavaSDK">
<output url="file://$PROJECT_DIR$/build/classes" />
</component>
<component name="ProjectType">
<option name="id" value="Android" />
</component>
</project>

17
android/android/.idea/runConfigurations.xml generated Executable file
View File

@@ -0,0 +1,17 @@
<?xml version="1.0" encoding="UTF-8"?>
<project version="4">
<component name="RunConfigurationProducerService">
<option name="ignoredProducers">
<set>
<option value="com.intellij.execution.junit.AbstractAllInDirectoryConfigurationProducer" />
<option value="com.intellij.execution.junit.AllInPackageConfigurationProducer" />
<option value="com.intellij.execution.junit.PatternConfigurationProducer" />
<option value="com.intellij.execution.junit.TestInClassConfigurationProducer" />
<option value="com.intellij.execution.junit.UniqueIdConfigurationProducer" />
<option value="com.intellij.execution.junit.testDiscovery.JUnitTestDiscoveryConfigurationProducer" />
<option value="org.jetbrains.kotlin.idea.junit.KotlinJUnitRunConfigurationProducer" />
<option value="org.jetbrains.kotlin.idea.junit.KotlinPatternConfigurationProducer" />
</set>
</option>
</component>
</project>

View File

@@ -0,0 +1,68 @@
<component name="ProjectRunConfigurationManager">
<configuration default="false" name="YourPart Debug" type="AndroidRunConfigurationType" factoryName="Android App">
<option name="ANDROID_RUN_CONFIGURATION_SCHEMA_VERSION" value="1" />
<option name="DEPLOY" value="true" />
<option name="DEPLOY_APK_FROM_BUNDLE" value="false" />
<option name="DEPLOY_AS_INSTANT" value="false" />
<option name="ARTIFACT_NAME" value="" />
<option name="PM_INSTALL_OPTIONS" value="" />
<option name="ALL_USERS" value="false" />
<option name="ALWAYS_INSTALL_WITH_PM" value="false" />
<option name="ALLOW_ASSUME_VERIFIED" value="false" />
<option name="CLEAR_APP_STORAGE" value="false" />
<option name="DYNAMIC_FEATURES_DISABLED_LIST" value="" />
<option name="ACTIVITY_EXTRA_FLAGS" value="" />
<option name="MODE" value="default_activity" />
<option name="RESTORE_ENABLED" value="false" />
<option name="RESTORE_FILE" value="" />
<option name="RESTORE_FRESH_INSTALL_ONLY" value="false" />
<option name="CLEAR_LOGCAT" value="false" />
<option name="SHOW_LOGCAT_AUTOMATICALLY" value="false" />
<option name="TARGET_SELECTION_MODE" value="DEVICE_AND_SNAPSHOT_COMBO_BOX" />
<option name="DEBUGGER_TYPE" value="Auto" />
<module name="android.app.main" />
<Auto>
<option name="USE_JAVA_AWARE_DEBUGGER" value="false" />
<option name="SHOW_STATIC_VARS" value="true" />
<option name="WORKING_DIR" value="" />
<option name="TARGET_LOGGING_CHANNELS" value="lldb process:gdb-remote packets" />
<option name="SHOW_OPTIMIZED_WARNING" value="true" />
<option name="ATTACH_ON_WAIT_FOR_DEBUGGER" value="false" />
</Auto>
<Hybrid>
<option name="USE_JAVA_AWARE_DEBUGGER" value="false" />
<option name="SHOW_STATIC_VARS" value="true" />
<option name="WORKING_DIR" value="" />
<option name="TARGET_LOGGING_CHANNELS" value="lldb process:gdb-remote packets" />
<option name="SHOW_OPTIMIZED_WARNING" value="true" />
<option name="ATTACH_ON_WAIT_FOR_DEBUGGER" value="false" />
</Hybrid>
<Java>
<option name="ATTACH_ON_WAIT_FOR_DEBUGGER" value="false" />
</Java>
<Native>
<option name="USE_JAVA_AWARE_DEBUGGER" value="false" />
<option name="SHOW_STATIC_VARS" value="true" />
<option name="WORKING_DIR" value="" />
<option name="TARGET_LOGGING_CHANNELS" value="lldb process:gdb-remote packets" />
<option name="SHOW_OPTIMIZED_WARNING" value="true" />
<option name="ATTACH_ON_WAIT_FOR_DEBUGGER" value="false" />
</Native>
<Profilers>
<option name="ADVANCED_PROFILING_ENABLED" value="false" />
<option name="STARTUP_PROFILING_ENABLED" value="false" />
<option name="STARTUP_CPU_PROFILING_ENABLED" value="false" />
<option name="STARTUP_CPU_PROFILING_CONFIGURATION_NAME" value="Java/Kotlin Method Sample (legacy)" />
<option name="STARTUP_NATIVE_MEMORY_PROFILING_ENABLED" value="false" />
<option name="NATIVE_MEMORY_SAMPLE_RATE_BYTES" value="2048" />
</Profilers>
<option name="DEEP_LINK" value="" />
<option name="ACTIVITY" value="" />
<option name="ACTIVITY_CLASS" value="" />
<option name="SEARCH_ACTIVITY_IN_GLOBAL_SCOPE" value="false" />
<option name="SKIP_ACTIVITY_VALIDATION" value="false" />
<method v="2">
<option name="Android.Gradle.BeforeRunTask" enabled="true" />
</method>
</configuration>
</component>

View File

@@ -0,0 +1,54 @@
apply plugin: 'com.android.application'
android {
namespace = "de.yourpart.app"
compileSdk = rootProject.ext.compileSdkVersion
defaultConfig {
applicationId "de.yourpart.app"
minSdkVersion rootProject.ext.minSdkVersion
targetSdkVersion rootProject.ext.targetSdkVersion
versionCode 1
versionName "1.0"
testInstrumentationRunner "androidx.test.runner.AndroidJUnitRunner"
aaptOptions {
// Files and dirs to omit from the packaged assets dir, modified to accommodate modern web apps.
// Default: https://android.googlesource.com/platform/frameworks/base/+/282e181b58cf72b6ca770dc7ca5f91f135444502/tools/aapt/AaptAssets.cpp#61
ignoreAssetsPattern = '!.svn:!.git:!.ds_store:!*.scc:.*:!CVS:!thumbs.db:!picasa.ini:!*~'
}
}
buildTypes {
release {
minifyEnabled false
proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'
}
}
}
repositories {
flatDir{
dirs '../capacitor-cordova-android-plugins/src/main/libs', 'libs'
}
}
dependencies {
implementation fileTree(include: ['*.jar'], dir: 'libs')
implementation "androidx.appcompat:appcompat:$androidxAppCompatVersion"
implementation "androidx.coordinatorlayout:coordinatorlayout:$androidxCoordinatorLayoutVersion"
implementation "androidx.core:core-splashscreen:$coreSplashScreenVersion"
implementation project(':capacitor-android')
testImplementation "junit:junit:$junitVersion"
androidTestImplementation "androidx.test.ext:junit:$androidxJunitVersion"
androidTestImplementation "androidx.test.espresso:espresso-core:$androidxEspressoCoreVersion"
implementation project(':capacitor-cordova-android-plugins')
}
apply from: 'capacitor.build.gradle'
try {
def servicesJSON = file('google-services.json')
if (servicesJSON.text) {
apply plugin: 'com.google.gms.google-services'
}
} catch(Exception e) {
logger.info("google-services.json not found, google-services plugin not applied. Push Notifications won't work")
}

View File

@@ -0,0 +1,19 @@
// DO NOT EDIT THIS FILE! IT IS GENERATED EACH TIME "capacitor update" IS RUN
android {
compileOptions {
sourceCompatibility JavaVersion.VERSION_21
targetCompatibility JavaVersion.VERSION_21
}
}
apply from: "../capacitor-cordova-android-plugins/cordova.variables.gradle"
dependencies {
implementation project(':capacitor-app')
}
if (hasProperty('postBuildExtras')) {
postBuildExtras()
}

21
android/android/app/proguard-rules.pro vendored Executable file
View File

@@ -0,0 +1,21 @@
# Add project specific ProGuard rules here.
# You can control the set of applied configuration files using the
# proguardFiles setting in build.gradle.
#
# For more details, see
# http://developer.android.com/guide/developing/tools/proguard.html
# If your project uses WebView with JS, uncomment the following
# and specify the fully qualified class name to the JavaScript interface
# class:
#-keepclassmembers class fqcn.of.javascript.interface.for.webview {
# public *;
#}
# Uncomment this to preserve the line number information for
# debugging stack traces.
#-keepattributes SourceFile,LineNumberTable
# If you keep the line number information, uncomment this to
# hide the original source file name.
#-renamesourcefileattribute SourceFile

View File

@@ -0,0 +1,26 @@
package de.yourpart.app;
import static org.junit.Assert.*;
import android.content.Context;
import androidx.test.ext.junit.runners.AndroidJUnit4;
import androidx.test.platform.app.InstrumentationRegistry;
import org.junit.Test;
import org.junit.runner.RunWith;
/**
* Instrumented test, which will execute on an Android device.
*
* @see <a href="http://d.android.com/tools/testing">Testing documentation</a>
*/
@RunWith(AndroidJUnit4.class)
public class ExampleInstrumentedTest {
@Test
public void useAppContext() throws Exception {
// Context of the app under test.
Context appContext = InstrumentationRegistry.getInstrumentation().getTargetContext();
assertEquals("de.yourpart.app", appContext.getPackageName());
}
}

View File

@@ -0,0 +1,41 @@
<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android">
<application
android:allowBackup="true"
android:icon="@mipmap/ic_launcher"
android:label="@string/app_name"
android:roundIcon="@mipmap/ic_launcher_round"
android:supportsRtl="true"
android:theme="@style/AppTheme">
<activity
android:configChanges="orientation|keyboardHidden|keyboard|screenSize|locale|smallestScreenSize|screenLayout|uiMode|navigation|density"
android:name=".MainActivity"
android:label="@string/title_activity_main"
android:theme="@style/AppTheme.NoActionBarLaunch"
android:launchMode="singleTask"
android:exported="true">
<intent-filter>
<action android:name="android.intent.action.MAIN" />
<category android:name="android.intent.category.LAUNCHER" />
</intent-filter>
</activity>
<provider
android:name="androidx.core.content.FileProvider"
android:authorities="${applicationId}.fileprovider"
android:exported="false"
android:grantUriPermissions="true">
<meta-data
android:name="android.support.FILE_PROVIDER_PATHS"
android:resource="@xml/file_paths"></meta-data>
</provider>
</application>
<!-- Permissions -->
<uses-permission android:name="android.permission.INTERNET" />
</manifest>

View File

@@ -0,0 +1,5 @@
package de.yourpart.app;
import com.getcapacitor.BridgeActivity;
public class MainActivity extends BridgeActivity {}

Binary file not shown.

After

Width:  |  Height:  |  Size: 7.5 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 3.9 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 9.0 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 14 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 17 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 7.7 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 4.0 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 9.6 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 13 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 17 KiB

View File

@@ -0,0 +1,34 @@
<vector xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:aapt="http://schemas.android.com/aapt"
android:width="108dp"
android:height="108dp"
android:viewportHeight="108"
android:viewportWidth="108">
<path
android:fillType="evenOdd"
android:pathData="M32,64C32,64 38.39,52.99 44.13,50.95C51.37,48.37 70.14,49.57 70.14,49.57L108.26,87.69L108,109.01L75.97,107.97L32,64Z"
android:strokeColor="#00000000"
android:strokeWidth="1">
<aapt:attr name="android:fillColor">
<gradient
android:endX="78.5885"
android:endY="90.9159"
android:startX="48.7653"
android:startY="61.0927"
android:type="linear">
<item
android:color="#44000000"
android:offset="0.0" />
<item
android:color="#00000000"
android:offset="1.0" />
</gradient>
</aapt:attr>
</path>
<path
android:fillColor="#FFFFFF"
android:fillType="nonZero"
android:pathData="M66.94,46.02L66.94,46.02C72.44,50.07 76,56.61 76,64L32,64C32,56.61 35.56,50.11 40.98,46.06L36.18,41.19C35.45,40.45 35.45,39.3 36.18,38.56C36.91,37.81 38.05,37.81 38.78,38.56L44.25,44.05C47.18,42.57 50.48,41.71 54,41.71C57.48,41.71 60.78,42.57 63.68,44.05L69.11,38.56C69.84,37.81 70.98,37.81 71.71,38.56C72.44,39.3 72.44,40.45 71.71,41.19L66.94,46.02ZM62.94,56.92C64.08,56.92 65,56.01 65,54.88C65,53.76 64.08,52.85 62.94,52.85C61.8,52.85 60.88,53.76 60.88,54.88C60.88,56.01 61.8,56.92 62.94,56.92ZM45.06,56.92C46.2,56.92 47.13,56.01 47.13,54.88C47.13,53.76 46.2,52.85 45.06,52.85C43.92,52.85 43,53.76 43,54.88C43,56.01 43.92,56.92 45.06,56.92Z"
android:strokeColor="#00000000"
android:strokeWidth="1" />
</vector>

View File

@@ -0,0 +1,170 @@
<?xml version="1.0" encoding="utf-8"?>
<vector xmlns:android="http://schemas.android.com/apk/res/android"
android:width="108dp"
android:height="108dp"
android:viewportHeight="108"
android:viewportWidth="108">
<path
android:fillColor="#26A69A"
android:pathData="M0,0h108v108h-108z" />
<path
android:fillColor="#00000000"
android:pathData="M9,0L9,108"
android:strokeColor="#33FFFFFF"
android:strokeWidth="0.8" />
<path
android:fillColor="#00000000"
android:pathData="M19,0L19,108"
android:strokeColor="#33FFFFFF"
android:strokeWidth="0.8" />
<path
android:fillColor="#00000000"
android:pathData="M29,0L29,108"
android:strokeColor="#33FFFFFF"
android:strokeWidth="0.8" />
<path
android:fillColor="#00000000"
android:pathData="M39,0L39,108"
android:strokeColor="#33FFFFFF"
android:strokeWidth="0.8" />
<path
android:fillColor="#00000000"
android:pathData="M49,0L49,108"
android:strokeColor="#33FFFFFF"
android:strokeWidth="0.8" />
<path
android:fillColor="#00000000"
android:pathData="M59,0L59,108"
android:strokeColor="#33FFFFFF"
android:strokeWidth="0.8" />
<path
android:fillColor="#00000000"
android:pathData="M69,0L69,108"
android:strokeColor="#33FFFFFF"
android:strokeWidth="0.8" />
<path
android:fillColor="#00000000"
android:pathData="M79,0L79,108"
android:strokeColor="#33FFFFFF"
android:strokeWidth="0.8" />
<path
android:fillColor="#00000000"
android:pathData="M89,0L89,108"
android:strokeColor="#33FFFFFF"
android:strokeWidth="0.8" />
<path
android:fillColor="#00000000"
android:pathData="M99,0L99,108"
android:strokeColor="#33FFFFFF"
android:strokeWidth="0.8" />
<path
android:fillColor="#00000000"
android:pathData="M0,9L108,9"
android:strokeColor="#33FFFFFF"
android:strokeWidth="0.8" />
<path
android:fillColor="#00000000"
android:pathData="M0,19L108,19"
android:strokeColor="#33FFFFFF"
android:strokeWidth="0.8" />
<path
android:fillColor="#00000000"
android:pathData="M0,29L108,29"
android:strokeColor="#33FFFFFF"
android:strokeWidth="0.8" />
<path
android:fillColor="#00000000"
android:pathData="M0,39L108,39"
android:strokeColor="#33FFFFFF"
android:strokeWidth="0.8" />
<path
android:fillColor="#00000000"
android:pathData="M0,49L108,49"
android:strokeColor="#33FFFFFF"
android:strokeWidth="0.8" />
<path
android:fillColor="#00000000"
android:pathData="M0,59L108,59"
android:strokeColor="#33FFFFFF"
android:strokeWidth="0.8" />
<path
android:fillColor="#00000000"
android:pathData="M0,69L108,69"
android:strokeColor="#33FFFFFF"
android:strokeWidth="0.8" />
<path
android:fillColor="#00000000"
android:pathData="M0,79L108,79"
android:strokeColor="#33FFFFFF"
android:strokeWidth="0.8" />
<path
android:fillColor="#00000000"
android:pathData="M0,89L108,89"
android:strokeColor="#33FFFFFF"
android:strokeWidth="0.8" />
<path
android:fillColor="#00000000"
android:pathData="M0,99L108,99"
android:strokeColor="#33FFFFFF"
android:strokeWidth="0.8" />
<path
android:fillColor="#00000000"
android:pathData="M19,29L89,29"
android:strokeColor="#33FFFFFF"
android:strokeWidth="0.8" />
<path
android:fillColor="#00000000"
android:pathData="M19,39L89,39"
android:strokeColor="#33FFFFFF"
android:strokeWidth="0.8" />
<path
android:fillColor="#00000000"
android:pathData="M19,49L89,49"
android:strokeColor="#33FFFFFF"
android:strokeWidth="0.8" />
<path
android:fillColor="#00000000"
android:pathData="M19,59L89,59"
android:strokeColor="#33FFFFFF"
android:strokeWidth="0.8" />
<path
android:fillColor="#00000000"
android:pathData="M19,69L89,69"
android:strokeColor="#33FFFFFF"
android:strokeWidth="0.8" />
<path
android:fillColor="#00000000"
android:pathData="M19,79L89,79"
android:strokeColor="#33FFFFFF"
android:strokeWidth="0.8" />
<path
android:fillColor="#00000000"
android:pathData="M29,19L29,89"
android:strokeColor="#33FFFFFF"
android:strokeWidth="0.8" />
<path
android:fillColor="#00000000"
android:pathData="M39,19L39,89"
android:strokeColor="#33FFFFFF"
android:strokeWidth="0.8" />
<path
android:fillColor="#00000000"
android:pathData="M49,19L49,89"
android:strokeColor="#33FFFFFF"
android:strokeWidth="0.8" />
<path
android:fillColor="#00000000"
android:pathData="M59,19L59,89"
android:strokeColor="#33FFFFFF"
android:strokeWidth="0.8" />
<path
android:fillColor="#00000000"
android:pathData="M69,19L69,89"
android:strokeColor="#33FFFFFF"
android:strokeWidth="0.8" />
<path
android:fillColor="#00000000"
android:pathData="M79,19L79,89"
android:strokeColor="#33FFFFFF"
android:strokeWidth="0.8" />
</vector>

Binary file not shown.

After

Width:  |  Height:  |  Size: 3.9 KiB

View File

@@ -0,0 +1,12 @@
<?xml version="1.0" encoding="utf-8"?>
<androidx.coordinatorlayout.widget.CoordinatorLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
tools:context=".MainActivity">
<WebView
android:layout_width="match_parent"
android:layout_height="match_parent" />
</androidx.coordinatorlayout.widget.CoordinatorLayout>

View File

@@ -0,0 +1,5 @@
<?xml version="1.0" encoding="utf-8"?>
<adaptive-icon xmlns:android="http://schemas.android.com/apk/res/android">
<background android:drawable="@color/ic_launcher_background"/>
<foreground android:drawable="@mipmap/ic_launcher_foreground"/>
</adaptive-icon>

View File

@@ -0,0 +1,5 @@
<?xml version="1.0" encoding="utf-8"?>
<adaptive-icon xmlns:android="http://schemas.android.com/apk/res/android">
<background android:drawable="@color/ic_launcher_background"/>
<foreground android:drawable="@mipmap/ic_launcher_foreground"/>
</adaptive-icon>

Binary file not shown.

After

Width:  |  Height:  |  Size: 2.7 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 3.4 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 4.2 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.8 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 2.1 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 2.7 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 3.9 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 4.9 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 6.4 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 6.5 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 9.6 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 10 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 9.2 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 15 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 16 KiB

View File

@@ -0,0 +1,4 @@
<?xml version="1.0" encoding="utf-8"?>
<resources>
<color name="ic_launcher_background">#FFFFFF</color>
</resources>

View File

@@ -0,0 +1,7 @@
<?xml version='1.0' encoding='utf-8'?>
<resources>
<string name="app_name">YourPart</string>
<string name="title_activity_main">YourPart</string>
<string name="package_name">de.yourpart.app</string>
<string name="custom_url_scheme">de.yourpart.app</string>
</resources>

View File

@@ -0,0 +1,22 @@
<?xml version="1.0" encoding="utf-8"?>
<resources>
<!-- Base application theme. -->
<style name="AppTheme" parent="Theme.AppCompat.Light.DarkActionBar">
<!-- Customize your theme here. -->
<item name="colorPrimary">@color/colorPrimary</item>
<item name="colorPrimaryDark">@color/colorPrimaryDark</item>
<item name="colorAccent">@color/colorAccent</item>
</style>
<style name="AppTheme.NoActionBar" parent="Theme.AppCompat.DayNight.NoActionBar">
<item name="windowActionBar">false</item>
<item name="windowNoTitle">true</item>
<item name="android:background">@null</item>
</style>
<style name="AppTheme.NoActionBarLaunch" parent="Theme.SplashScreen">
<item name="android:background">@drawable/splash</item>
</style>
</resources>

View File

@@ -0,0 +1,5 @@
<?xml version="1.0" encoding="utf-8"?>
<paths xmlns:android="http://schemas.android.com/apk/res/android">
<external-path name="my_images" path="." />
<cache-path name="my_cache_images" path="." />
</paths>

View File

@@ -0,0 +1,18 @@
package de.yourpart.app;
import static org.junit.Assert.*;
import org.junit.Test;
/**
* Example local unit test, which will execute on the development machine (host).
*
* @see <a href="http://d.android.com/tools/testing">Testing documentation</a>
*/
public class ExampleUnitTest {
@Test
public void addition_isCorrect() throws Exception {
assertEquals(4, 2 + 2);
}
}

30
android/android/build.gradle Executable file
View File

@@ -0,0 +1,30 @@
// Top-level build file where you can add configuration options common to all sub-projects/modules.
// Trigger sync
buildscript {
repositories {
google()
mavenCentral()
}
dependencies {
classpath 'com.android.tools.build:gradle:8.13.0'
classpath 'com.google.gms:google-services:4.4.4'
// NOTE: Do not place your application dependencies here; they belong
// in the individual module build.gradle files
}
}
apply from: "variables.gradle"
allprojects {
repositories {
google()
mavenCentral()
}
}
task clean(type: Delete) {
delete rootProject.buildDir
}

View File

@@ -0,0 +1,6 @@
// DO NOT EDIT THIS FILE! IT IS GENERATED EACH TIME "capacitor update" IS RUN
include ':capacitor-android'
project(':capacitor-android').projectDir = new File('../node_modules/@capacitor/android/capacitor')
include ':capacitor-app'
project(':capacitor-app').projectDir = new File('../node_modules/@capacitor/app/android')

View File

@@ -0,0 +1,22 @@
# Project-wide Gradle settings.
# IDE (e.g. Android Studio) users:
# Gradle settings configured through the IDE *will override*
# any settings specified in this file.
# For more details on how to configure your build environment visit
# http://www.gradle.org/docs/current/userguide/build_environment.html
# Specifies the JVM arguments used for the daemon process.
# The setting is particularly useful for tweaking memory settings.
org.gradle.jvmargs=-Xmx1536m
# When configured, Gradle will run in incubating parallel mode.
# This option should only be used with decoupled projects. More details, visit
# http://www.gradle.org/docs/current/userguide/multi_project_builds.html#sec:decoupled_projects
# org.gradle.parallel=true
# AndroidX package structure to make it clearer which packages are bundled with the
# Android operating system, and which are packaged with your app's APK
# https://developer.android.com/topic/libraries/support-library/androidx-rn
android.useAndroidX=true

Binary file not shown.

View File

@@ -0,0 +1,7 @@
distributionBase=GRADLE_USER_HOME
distributionPath=wrapper/dists
distributionUrl=https\://services.gradle.org/distributions/gradle-8.14.3-all.zip
networkTimeout=10000
validateDistributionUrl=true
zipStoreBase=GRADLE_USER_HOME
zipStorePath=wrapper/dists

251
android/android/gradlew vendored Executable file
View File

@@ -0,0 +1,251 @@
#!/bin/sh
#
# Copyright © 2015-2021 the original authors.
#
# Licensed under the Apache License, Version 2.0 (the "License");
# you may not use this file except in compliance with the License.
# You may obtain a copy of the License at
#
# https://www.apache.org/licenses/LICENSE-2.0
#
# Unless required by applicable law or agreed to in writing, software
# distributed under the License is distributed on an "AS IS" BASIS,
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
# See the License for the specific language governing permissions and
# limitations under the License.
#
# SPDX-License-Identifier: Apache-2.0
#
##############################################################################
#
# Gradle start up script for POSIX generated by Gradle.
#
# Important for running:
#
# (1) You need a POSIX-compliant shell to run this script. If your /bin/sh is
# noncompliant, but you have some other compliant shell such as ksh or
# bash, then to run this script, type that shell name before the whole
# command line, like:
#
# ksh Gradle
#
# Busybox and similar reduced shells will NOT work, because this script
# requires all of these POSIX shell features:
# * functions;
# * expansions «$var», «${var}», «${var:-default}», «${var+SET}»,
# «${var#prefix}», «${var%suffix}», and «$( cmd )»;
# * compound commands having a testable exit status, especially «case»;
# * various built-in commands including «command», «set», and «ulimit».
#
# Important for patching:
#
# (2) This script targets any POSIX shell, so it avoids extensions provided
# by Bash, Ksh, etc; in particular arrays are avoided.
#
# The "traditional" practice of packing multiple parameters into a
# space-separated string is a well documented source of bugs and security
# problems, so this is (mostly) avoided, by progressively accumulating
# options in "$@", and eventually passing that to Java.
#
# Where the inherited environment variables (DEFAULT_JVM_OPTS, JAVA_OPTS,
# and GRADLE_OPTS) rely on word-splitting, this is performed explicitly;
# see the in-line comments for details.
#
# There are tweaks for specific operating systems such as AIX, CygWin,
# Darwin, MinGW, and NonStop.
#
# (3) This script is generated from the Groovy template
# https://github.com/gradle/gradle/blob/HEAD/platforms/jvm/plugins-application/src/main/resources/org/gradle/api/internal/plugins/unixStartScript.txt
# within the Gradle project.
#
# You can find Gradle at https://github.com/gradle/gradle/.
#
##############################################################################
# Attempt to set APP_HOME
# Resolve links: $0 may be a link
app_path=$0
# Need this for daisy-chained symlinks.
while
APP_HOME=${app_path%"${app_path##*/}"} # leaves a trailing /; empty if no leading path
[ -h "$app_path" ]
do
ls=$( ls -ld "$app_path" )
link=${ls#*' -> '}
case $link in #(
/*) app_path=$link ;; #(
*) app_path=$APP_HOME$link ;;
esac
done
# This is normally unused
# shellcheck disable=SC2034
APP_BASE_NAME=${0##*/}
# Discard cd standard output in case $CDPATH is set (https://github.com/gradle/gradle/issues/25036)
APP_HOME=$( cd -P "${APP_HOME:-./}" > /dev/null && printf '%s\n' "$PWD" ) || exit
# Use the maximum available, or set MAX_FD != -1 to use that value.
MAX_FD=maximum
warn () {
echo "$*"
} >&2
die () {
echo
echo "$*"
echo
exit 1
} >&2
# OS specific support (must be 'true' or 'false').
cygwin=false
msys=false
darwin=false
nonstop=false
case "$( uname )" in #(
CYGWIN* ) cygwin=true ;; #(
Darwin* ) darwin=true ;; #(
MSYS* | MINGW* ) msys=true ;; #(
NONSTOP* ) nonstop=true ;;
esac
CLASSPATH="\\\"\\\""
# Determine the Java command to use to start the JVM.
if [ -n "$JAVA_HOME" ] ; then
if [ -x "$JAVA_HOME/jre/sh/java" ] ; then
# IBM's JDK on AIX uses strange locations for the executables
JAVACMD=$JAVA_HOME/jre/sh/java
else
JAVACMD=$JAVA_HOME/bin/java
fi
if [ ! -x "$JAVACMD" ] ; then
die "ERROR: JAVA_HOME is set to an invalid directory: $JAVA_HOME
Please set the JAVA_HOME variable in your environment to match the
location of your Java installation."
fi
else
JAVACMD=java
if ! command -v java >/dev/null 2>&1
then
die "ERROR: JAVA_HOME is not set and no 'java' command could be found in your PATH.
Please set the JAVA_HOME variable in your environment to match the
location of your Java installation."
fi
fi
# Increase the maximum file descriptors if we can.
if ! "$cygwin" && ! "$darwin" && ! "$nonstop" ; then
case $MAX_FD in #(
max*)
# In POSIX sh, ulimit -H is undefined. That's why the result is checked to see if it worked.
# shellcheck disable=SC2039,SC3045
MAX_FD=$( ulimit -H -n ) ||
warn "Could not query maximum file descriptor limit"
esac
case $MAX_FD in #(
'' | soft) :;; #(
*)
# In POSIX sh, ulimit -n is undefined. That's why the result is checked to see if it worked.
# shellcheck disable=SC2039,SC3045
ulimit -n "$MAX_FD" ||
warn "Could not set maximum file descriptor limit to $MAX_FD"
esac
fi
# Collect all arguments for the java command, stacking in reverse order:
# * args from the command line
# * the main class name
# * -classpath
# * -D...appname settings
# * --module-path (only if needed)
# * DEFAULT_JVM_OPTS, JAVA_OPTS, and GRADLE_OPTS environment variables.
# For Cygwin or MSYS, switch paths to Windows format before running java
if "$cygwin" || "$msys" ; then
APP_HOME=$( cygpath --path --mixed "$APP_HOME" )
CLASSPATH=$( cygpath --path --mixed "$CLASSPATH" )
JAVACMD=$( cygpath --unix "$JAVACMD" )
# Now convert the arguments - kludge to limit ourselves to /bin/sh
for arg do
if
case $arg in #(
-*) false ;; # don't mess with options #(
/?*) t=${arg#/} t=/${t%%/*} # looks like a POSIX filepath
[ -e "$t" ] ;; #(
*) false ;;
esac
then
arg=$( cygpath --path --ignore --mixed "$arg" )
fi
# Roll the args list around exactly as many times as the number of
# args, so each arg winds up back in the position where it started, but
# possibly modified.
#
# NB: a `for` loop captures its iteration list before it begins, so
# changing the positional parameters here affects neither the number of
# iterations, nor the values presented in `arg`.
shift # remove old arg
set -- "$@" "$arg" # push replacement arg
done
fi
# Add default JVM options here. You can also use JAVA_OPTS and GRADLE_OPTS to pass JVM options to this script.
DEFAULT_JVM_OPTS='"-Xmx64m" "-Xms64m"'
# Collect all arguments for the java command:
# * DEFAULT_JVM_OPTS, JAVA_OPTS, and optsEnvironmentVar are not allowed to contain shell fragments,
# and any embedded shellness will be escaped.
# * For example: A user cannot expect ${Hostname} to be expanded, as it is an environment variable and will be
# treated as '${Hostname}' itself on the command line.
set -- \
"-Dorg.gradle.appname=$APP_BASE_NAME" \
-classpath "$CLASSPATH" \
-jar "$APP_HOME/gradle/wrapper/gradle-wrapper.jar" \
"$@"
# Stop when "xargs" is not available.
if ! command -v xargs >/dev/null 2>&1
then
die "xargs is not available"
fi
# Use "xargs" to parse quoted args.
#
# With -n1 it outputs one arg per line, with the quotes and backslashes removed.
#
# In Bash we could simply go:
#
# readarray ARGS < <( xargs -n1 <<<"$var" ) &&
# set -- "${ARGS[@]}" "$@"
#
# but POSIX shell has neither arrays nor command substitution, so instead we
# post-process each arg (as a line of input to sed) to backslash-escape any
# character that might be a shell metacharacter, then use eval to reverse
# that process (while maintaining the separation between arguments), and wrap
# the whole thing up as a single "set" statement.
#
# This will of course break if any of these variables contains a newline or
# an unmatched quote.
#
eval "set -- $(
printf '%s\n' "$DEFAULT_JVM_OPTS $JAVA_OPTS $GRADLE_OPTS" |
xargs -n1 |
sed ' s~[^-[:alnum:]+,./:=@_]~\\&~g; ' |
tr '\n' ' '
)" '"$@"'
exec "$JAVACMD" "$@"

94
android/android/gradlew.bat vendored Executable file
View File

@@ -0,0 +1,94 @@
@rem
@rem Copyright 2015 the original author or authors.
@rem
@rem Licensed under the Apache License, Version 2.0 (the "License");
@rem you may not use this file except in compliance with the License.
@rem You may obtain a copy of the License at
@rem
@rem https://www.apache.org/licenses/LICENSE-2.0
@rem
@rem Unless required by applicable law or agreed to in writing, software
@rem distributed under the License is distributed on an "AS IS" BASIS,
@rem WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
@rem See the License for the specific language governing permissions and
@rem limitations under the License.
@rem
@rem SPDX-License-Identifier: Apache-2.0
@rem
@if "%DEBUG%"=="" @echo off
@rem ##########################################################################
@rem
@rem Gradle startup script for Windows
@rem
@rem ##########################################################################
@rem Set local scope for the variables with windows NT shell
if "%OS%"=="Windows_NT" setlocal
set DIRNAME=%~dp0
if "%DIRNAME%"=="" set DIRNAME=.
@rem This is normally unused
set APP_BASE_NAME=%~n0
set APP_HOME=%DIRNAME%
@rem Resolve any "." and ".." in APP_HOME to make it shorter.
for %%i in ("%APP_HOME%") do set APP_HOME=%%~fi
@rem Add default JVM options here. You can also use JAVA_OPTS and GRADLE_OPTS to pass JVM options to this script.
set DEFAULT_JVM_OPTS="-Xmx64m" "-Xms64m"
@rem Find java.exe
if defined JAVA_HOME goto findJavaFromJavaHome
set JAVA_EXE=java.exe
%JAVA_EXE% -version >NUL 2>&1
if %ERRORLEVEL% equ 0 goto execute
echo. 1>&2
echo ERROR: JAVA_HOME is not set and no 'java' command could be found in your PATH. 1>&2
echo. 1>&2
echo Please set the JAVA_HOME variable in your environment to match the 1>&2
echo location of your Java installation. 1>&2
goto fail
:findJavaFromJavaHome
set JAVA_HOME=%JAVA_HOME:"=%
set JAVA_EXE=%JAVA_HOME%/bin/java.exe
if exist "%JAVA_EXE%" goto execute
echo. 1>&2
echo ERROR: JAVA_HOME is set to an invalid directory: %JAVA_HOME% 1>&2
echo. 1>&2
echo Please set the JAVA_HOME variable in your environment to match the 1>&2
echo location of your Java installation. 1>&2
goto fail
:execute
@rem Setup the command line
set CLASSPATH=
@rem Execute Gradle
"%JAVA_EXE%" %DEFAULT_JVM_OPTS% %JAVA_OPTS% %GRADLE_OPTS% "-Dorg.gradle.appname=%APP_BASE_NAME%" -classpath "%CLASSPATH%" -jar "%APP_HOME%\gradle\wrapper\gradle-wrapper.jar" %*
:end
@rem End local scope for the variables with windows NT shell
if %ERRORLEVEL% equ 0 goto mainEnd
:fail
rem Set variable GRADLE_EXIT_CONSOLE if you need the _script_ return code instead of
rem the _cmd.exe /c_ return code!
set EXIT_CODE=%ERRORLEVEL%
if %EXIT_CODE% equ 0 set EXIT_CODE=1
if not ""=="%GRADLE_EXIT_CONSOLE%" exit %EXIT_CODE%
exit /b %EXIT_CODE%
:mainEnd
if "%OS%"=="Windows_NT" endlocal
:omega

View File

@@ -0,0 +1,5 @@
include ':app'
include ':capacitor-cordova-android-plugins'
project(':capacitor-cordova-android-plugins').projectDir = new File('./capacitor-cordova-android-plugins/')
apply from: 'capacitor.settings.gradle'

View File

@@ -0,0 +1,16 @@
ext {
minSdkVersion = 24
compileSdkVersion = 36
targetSdkVersion = 36
androidxActivityVersion = '1.11.0'
androidxAppCompatVersion = '1.7.1'
androidxCoordinatorLayoutVersion = '1.3.0'
androidxCoreVersion = '1.17.0'
androidxFragmentVersion = '1.8.9'
coreSplashScreenVersion = '1.2.0'
androidxWebkitVersion = '1.14.0'
junitVersion = '4.13.2'
androidxJunitVersion = '1.3.0'
androidxEspressoCoreVersion = '3.7.0'
cordovaAndroidVersion = '14.0.1'
}

22
android/capacitor.config.ts Executable file
View File

@@ -0,0 +1,22 @@
import type { CapacitorConfig } from '@capacitor/cli';
const config: CapacitorConfig = {
appId: 'de.yourpart.app',
appName: 'YourPart',
webDir: '../frontend/dist',
bundledWebRuntime: false,
server: {
androidScheme: 'https'
},
plugins: {
SplashScreen: {
launchAutoHide: true
}
},
android: {
allowMixedContent: false,
webContentsDebuggingEnabled: true
}
};
export default config;

6
android/native/.idea/AndroidProjectSystem.xml generated Executable file
View File

@@ -0,0 +1,6 @@
<?xml version="1.0" encoding="UTF-8"?>
<project version="4">
<component name="AndroidProjectSystem">
<option name="providerId" value="com.android.tools.idea.GradleProjectSystem" />
</component>
</project>

2001
android/native/.idea/caches/deviceStreaming.xml generated Executable file

File diff suppressed because it is too large Load Diff

View File

@@ -0,0 +1,18 @@
<?xml version="1.0" encoding="UTF-8"?>
<project version="4">
<component name="deploymentTargetSelector">
<selectionStates>
<SelectionState runConfigName="YourPartNative.app">
<option name="selectionMode" value="DROPDOWN" />
<DropdownSelection timestamp="2026-07-10T13:18:31.238846181Z">
<Target type="DEFAULT_BOOT">
<handle>
<DeviceId pluginId="LocalEmulator" identifier="path=/home/torsten/.config/.android/avd/Medium_Tablet.avd" />
</handle>
</Target>
</DropdownSelection>
<DialogSelection />
</SelectionState>
</selectionStates>
</component>
</project>

13
android/native/.idea/deviceManager.xml generated Executable file
View File

@@ -0,0 +1,13 @@
<?xml version="1.0" encoding="UTF-8"?>
<project version="4">
<component name="DeviceTable">
<option name="columnSorters">
<list>
<ColumnSorterState>
<option name="column" value="Name" />
<option name="order" value="ASCENDING" />
</ColumnSorterState>
</list>
</option>
</component>
</project>

30
android/native/.idea/gradle.xml generated Executable file
View File

@@ -0,0 +1,30 @@
<?xml version="1.0" encoding="UTF-8"?>
<project version="4">
<component name="GradleMigrationSettings" migrationVersion="1" />
<component name="GradleSettings">
<option name="linkedExternalProjectsSettings">
<GradleProjectSettings>
<option name="testRunner" value="CHOOSE_PER_TEST" />
<option name="externalProjectPath" value="$PROJECT_DIR$" />
<option name="gradleJvm" value="#GRADLE_LOCAL_JAVA_HOME" />
<option name="modules">
<set>
<option value="/mnt/share/torsten/Programs/YourPart3/android/native" />
<option value="/mnt/share/torsten/Programs/YourPart3/android/native/app" />
</set>
</option>
</GradleProjectSettings>
<GradleProjectSettings>
<option name="testRunner" value="CHOOSE_PER_TEST" />
<option name="externalProjectPath" value="/mnt/share/torsten/Programs/YourPart3/android/native" />
<option name="gradleJvm" value="#GRADLE_LOCAL_JAVA_HOME" />
<option name="modules">
<set>
<option value="/mnt/share/torsten/Programs/YourPart3/android/native" />
<option value="/mnt/share/torsten/Programs/YourPart3/android/native/app" />
</set>
</option>
</GradleProjectSettings>
</option>
</component>
</project>

8
android/native/.idea/markdown.xml generated Executable file
View File

@@ -0,0 +1,8 @@
<?xml version="1.0" encoding="UTF-8"?>
<project version="4">
<component name="MarkdownSettings">
<option name="previewPanelProviderInfo">
<ProviderInfo name="Compose (experimental)" className="com.intellij.markdown.compose.preview.ComposePanelProvider" />
</option>
</component>
</project>

10
android/native/.idea/migrations.xml generated Executable file
View File

@@ -0,0 +1,10 @@
<?xml version="1.0" encoding="UTF-8"?>
<project version="4">
<component name="ProjectMigrations">
<option name="MigrateToGradleLocalJavaHome">
<set>
<option value="/mnt/share/torsten/Programs/YourPart3/android/native" />
</set>
</option>
</component>
</project>

9
android/native/.idea/misc.xml generated Executable file
View File

@@ -0,0 +1,9 @@
<project version="4">
<component name="ExternalStorageConfigurationManager" enabled="true" />
<component name="ProjectRootManager" version="2" languageLevel="JDK_21" default="true" project-jdk-name="jbr-21" project-jdk-type="JavaSDK">
<output url="file://$PROJECT_DIR$/build/classes" />
</component>
<component name="ProjectType">
<option name="id" value="Android" />
</component>
</project>

Some files were not shown because too many files have changed in this diff Show More