beta 1.2 release #14

Merged
niklas.ortmann merged 5 commits from dev into main 2026-10-08 00:22:57 +02:00
2 changed files with 58 additions and 77 deletions
+37 -77
View File
@@ -7,7 +7,7 @@ Die App ermöglicht die Verwaltung von Patienten und Wunddokumentationen,
unterstützt Fotos und digitale Unterschriften und erzeugt aus unterstützt Fotos und digitale Unterschriften und erzeugt aus
abgeschlossenen Dokumentationen PDF-Dateien. abgeschlossenen Dokumentationen PDF-Dateien.
> **Projektstatus:** In Entwicklung > **Projektstatus:** beta1.1
------------------------------------------------------------------------ ------------------------------------------------------------------------
@@ -344,32 +344,6 @@ werden kann.
- JDK über Android Studio - JDK über Android Studio
- Android-Gerät oder Android Emulator - Android-Gerät oder Android Emulator
### Projekt öffnen
Repository klonen:
``` bash
git clone <repository-url>
cd VulneraDoc
```
Anschließend den Projektordner in Android Studio öffnen.
Android Studio führt beim ersten Öffnen einen Gradle-Sync durch und lädt
die benötigten Dependencies.
Danach:
``` text
Gradle Sync
↓
Build / Make Project
↓
Android-Gerät oder Emulator auswählen
↓
Run
```
------------------------------------------------------------------------ ------------------------------------------------------------------------
## Projektphasen ## Projektphasen
@@ -387,40 +361,40 @@ Run
### Phase 2 -- Projektgrundgerüst ### Phase 2 -- Projektgrundgerüst
- [x] Android-Projekt - [x] Android-Projekt
- [ ] Room-Datenbank - [x] Room-Datenbank
- [ ] Entities - [x] Entities
- [ ] DAOs - [x] DAOs
- [ ] Repositories - [x] Repositories
- [ ] Navigation - [x] Navigation
- [ ] ViewModels - [x] ViewModels
### Phase 3 -- Kernfunktionalität ### Phase 3 -- Kernfunktionalität
- [ ] Patientenverwaltung - [x] Patientenverwaltung
- [ ] Patientenliste - [x] Patientenliste
- [ ] Wunddokumentationsliste - [x] Wunddokumentationsliste
- [ ] Dokumentation erstellen - [x] Dokumentation erstellen
- [ ] Dokumentationsblöcke - [x] Dokumentationsblöcke
- [ ] Blocknavigation - [x] Blocknavigation
- [ ] Autosave - [x] Autosave
- [ ] Dokumentation bearbeiten - [x] Dokumentation bearbeiten
- [ ] Dokumentation fortsetzen - [x] Dokumentation fortsetzen
### Phase 4 -- Medien ### Phase 4 -- Medien
- [ ] Fotoimport - [x] Fotoimport
- [ ] Bildverwaltung - [x] Bildverwaltung
- [ ] Digitale Signatur - [x] Digitale Signatur
- [ ] Mehrere Signaturen - [x] Mehrere Signaturen
### Phase 5 -- PDF ### Phase 5 -- PDF
- [ ] PDF-Exporter - [x] PDF-Exporter
- [ ] Dokumentationsblöcke - [x] Dokumentationsblöcke
- [ ] Signaturen - [x] Signaturen
- [ ] Fotoanhang - [x] Fotoanhang
- [ ] PDF anzeigen - [x] PDF anzeigen
- [ ] PDF teilen - [x] PDF teilen
### Phase 6 -- Qualität und Stabilität ### Phase 6 -- Qualität und Stabilität
@@ -431,29 +405,15 @@ Run
- [ ] Tablet-Optimierung - [ ] Tablet-Optimierung
- [ ] Datenschutz-Review - [ ] Datenschutz-Review
------------------------------------------------------------------------ ### Phase 7 -- Multi-Device-Synchronisation
## Dokumentation - [ ] Geräteidentität und Pairing
- [ ] Automatische Geräteerkennung im WLAN
Die ausführliche technische Architektur befindet sich in der - [ ] Differenzabgleich / Sync-Protokoll
Projektdokumentation: - [ ] Patienten synchronisieren
- [ ] Wunddokumentationen synchronisieren
``` text - [ ] Fotos synchronisieren
docs/ - [ ] Konflikterkennung und Konfliktauflösung
└── Architekturplanung.md - [ ] Automatische Synchronisation
``` - [ ] Sync-Status und manueller Fallback
- [ ] Multi-Device- und Recovery-Tests
Dort werden unter anderem Datenmodell, Datenbankschema,
Navigationskonzept, Autosave, PDF-Erzeugung und Medienverwaltung
detailliert beschrieben.
------------------------------------------------------------------------
## Status
**VulneraDoc befindet sich aktuell in Entwicklung und ist nicht für den
produktiven Einsatz freigegeben.**
Insbesondere bei der Verarbeitung realer Patientendaten müssen vor einem
Produktiveinsatz die rechtlichen, datenschutzrechtlichen und
sicherheitstechnischen Anforderungen abschließend geprüft werden.
@@ -22,6 +22,7 @@ import androidx.compose.foundation.layout.padding
import androidx.compose.foundation.layout.size import androidx.compose.foundation.layout.size
import androidx.compose.foundation.layout.width import androidx.compose.foundation.layout.width
import androidx.compose.foundation.lazy.LazyColumn import androidx.compose.foundation.lazy.LazyColumn
import androidx.compose.foundation.lazy.rememberLazyListState
import androidx.compose.foundation.lazy.items import androidx.compose.foundation.lazy.items
import androidx.compose.foundation.shape.RoundedCornerShape import androidx.compose.foundation.shape.RoundedCornerShape
import androidx.compose.material.icons.Icons import androidx.compose.material.icons.Icons
@@ -446,8 +447,28 @@ private fun DocumentationEditContent(
onDeleteSignatureRequested: (signatureId: String) -> Unit, onDeleteSignatureRequested: (signatureId: String) -> Unit,
loadSignatureBitmap: suspend (documentationId: String, fileName: String) -> Bitmap?, loadSignatureBitmap: suspend (documentationId: String, fileName: String) -> Bitmap?,
) { ) {
val listState = rememberLazyListState()
// Änderungswunsch: Beim Aufklappen eines Blocks dorthin scrollen, damit sein erster Eintrag
// sichtbar wird - wichtig bei langen Formularen, wenn ein weiter unten liegender Block
// aufgeklappt wird und sein Inhalt sonst unterhalb des sichtbaren Bereichs läge. Reagiert
// NUR auf tatsächliches Aufklappen (expandedBlockId wechselt zu einer konkreten Block-ID),
// nicht auf das Zuklappen (expandedBlockId wird null) - dort gibt es nichts, wohin gescrollt
// werden müsste. Da jeder Block GENAU EIN LazyColumn-Element ist (Kopfzeile + bei Bedarf
// aufgeklappter Inhalt gemeinsam, s. [BlockAccordionItem]) und die Block-Liste die ERSTEN
// Elemente der LazyColumn sind, landet der Block-Index 1:1 auf dem passenden
// LazyColumn-Index - der Block erscheint dadurch ganz oben im sichtbaren Bereich, sein
// erster Eintrag direkt darunter.
LaunchedEffect(expandedBlockId) {
val targetIndex = blocks.indexOfFirst { it.blockStateId == expandedBlockId }
if (targetIndex >= 0) {
listState.animateScrollToItem(targetIndex)
}
}
LazyColumn( LazyColumn(
modifier = modifier, modifier = modifier,
state = listState,
contentPadding = PaddingValues(16.dp), contentPadding = PaddingValues(16.dp),
verticalArrangement = Arrangement.spacedBy(12.dp), verticalArrangement = Arrangement.spacedBy(12.dp),
) { ) {