Compare commits

..

35 Commits

Author SHA1 Message Date
ftraue
0277dafc5e commit 27/05 2025-05-27 12:11:01 +02:00
ftraue
31ee074b02 commit 2025-05-06 13:44:59 +02:00
sar
4d2d048b11 -commit 2025-05-06 12:38:39 +02:00
sar
4942312e8a -commit 2025-05-06 12:37:34 +02:00
sar
d8d6b1c7db Merge remote-tracking branch 'origin/main'
# Conflicts:
#	documentation/userstorys/saad_erweiterung_im_pfleger_3_4.md
2025-05-06 12:33:02 +02:00
sar
37022f4fa6 -commit 2025-05-06 12:32:13 +02:00
ftraue
7a20fc6ab3 Merge remote-tracking branch 'origin/main' 2025-05-06 12:27:06 +02:00
ftraue
75eb4734eb wlf 2025-05-06 12:26:51 +02:00
597452001c Rename to fit 2025-05-06 12:16:35 +02:00
2aabb09d8e Refactor layout 2025-05-06 12:15:09 +02:00
6edeac9139 Refactor layout 2025-05-06 12:14:40 +02:00
ftraue
372e00e551 Merge remote-tracking branch 'origin/main' 2025-05-06 12:09:29 +02:00
ftraue
21169563a1 wlf 2025-05-06 12:08:49 +02:00
sar
2190bf2cc6 Merge remote-tracking branch 'origin/main' 2025-05-06 12:05:09 +02:00
sar
a242079438 -commit 2025-05-06 12:01:16 +02:00
ftraue
c11cf91fd4 Merge remote-tracking branch 'origin/main' 2025-04-29 14:48:54 +02:00
ftraue
bf834a9897 wlf 2025-04-29 14:48:40 +02:00
yat
5b70fdcc3d Merge remote-tracking branch 'origin/main' 2025-04-29 14:45:37 +02:00
yat
990058c082 Merge remote-tracking branch 'origin/main' 2025-04-29 14:45:30 +02:00
1dee17c23d Update acceptance criteria and task descriptions for caregiver navigation and details 2025-04-29 14:45:29 +02:00
yat
0050532afc brunhilde <3 2025-04-29 14:45:19 +02:00
cc183eba6a Merge remote-tracking branch 'origin/main' 2025-04-29 14:43:18 +02:00
504de1bd7b Update caregiver data alignment and navigation instructions in documentation 2025-04-29 14:43:07 +02:00
niklas.lehmann
f621ff6f41 Merge remote-tracking branch 'origin/main' 2025-04-29 14:42:18 +02:00
niklas.lehmann
e4d10570a1 added niklas_löschung_des_vermögensstandes.md 2025-04-29 14:42:02 +02:00
ftraue
94dfd1f29b wlf 2025-04-29 14:32:27 +02:00
6dbf5f2946 Enhance user story and acceptance criteria for caregiver overview feature 2025-04-29 14:13:27 +02:00
4806c01a8f Add userstory_template.md 2025-04-29 14:13:20 +02:00
9a0593dcae Fix formatting of phone number examples 2025-04-29 14:08:48 +02:00
5d582bc4e5 Add caregiver overview feature with navigation and treatment details 2025-04-29 14:07:26 +02:00
6dc58b3560 Merge remote-tracking branch 'origin/main' 2025-04-29 12:21:02 +02:00
f43a29d6c1 Add userstorys dir 2025-04-29 12:20:57 +02:00
ftraue
6f6420d1e5 wlf 2025-04-29 12:20:01 +02:00
ftraue
602e39e8d2 Merge remote-tracking branch 'origin/main' 2025-04-29 12:12:30 +02:00
ftraue
a653b9bd3c wlf 2025-04-29 12:12:14 +02:00
24 changed files with 912 additions and 17 deletions

1
.idea/sqldialects.xml generated
View File

@@ -2,6 +2,7 @@
<project version="4">
<component name="SqlDialectMappings">
<file url="file://$PROJECT_DIR$/src/main/java/de/hitec/nhplus/datastorage/TreatmentDao.java" dialect="GenericSQL" />
<file url="file://$PROJECT_DIR$/src/main/java/de/hitec/nhplus/utils/SetUpDB.java" dialect="SQLite" />
<file url="PROJECT" dialect="SQLite" />
</component>
</project>

Binary file not shown.

View File

@@ -60,7 +60,13 @@ Zu den Rechten, die Patientinnen und Patienten haben, gehören:
### 5. Recherchiere nun die Besonderheiten für die Aufbewahrung von Patientendaten. Wo finden sich diese Regelungen wieder?
- **Die Aufbewahrung von Patientendaten** unterliegt besonderen gesetzlichen Regelungen, da es sich um besonders schützenswerte personenbezogene Gesundheitsdaten handelt.
- In Artikel 5 Absatz 1e der DSGVO wird ausgesagt, dass Patientendaten nur solange aufbewahrt werden dürfen, wie Sie gebraucht werden.
- **Die Regelungen** befinden sich im DSGVO unter Art. 9 und Art. 5 Abs. 1 Buchstabe e.
- **Art. 5 Abs. 1 Buchstabe e**: Sagt aus, dass Personenbezogene-/Patientendaten nicht länger aufbewahrt werden dürfen, als sie gebraucht werden.
- **Art. 9**: Laut diesem Artikel sind Patienten-/Gesundheitsdaten eine besondere Kategorie. Besondere Kategorien unterliegen bestimmten "Sonder"-Regelungen.
- [Informationen des Virchowbundes](https://www.virchowbund.de/praxis-knowhow/praxis-gruenden-und-ausbauen/patientenakten-aufbewahren)
- [DSGVO](https://dsgvo-gesetz.de/)
---

0
documentation/userstorys/.gitignore vendored Normal file
View File

View File

@@ -0,0 +1,53 @@
# **User Story**
Ich bin Wohnbereichsleiter der Curanum Schwachhausen
und würde mir wünschen, dass die Sperrfrist für Kundenbezogene Daten 10 Jahre beträgt.
Diese Daten sollen bis zum Ablauf dieser Frist nicht gelöscht werden.
Nach Ablauf der Frist können die Daten dann gelöscht werden.
Der Grund für mein Anliegen ist, dass es einige Patienten gab die sich
erkundigt haben was mit ihren Daten passiert, nachdem der Zweck für den die Daten angefordert wurden erfüllt wurde.
Des Weiteren gibt es gesetzliche Regelungen, die es einzuhalten gilt.
---
# **Akzeptanzkriterien:**
- **A_1**: Sperrung statt Löschung der Daten
- **A_2**: Gesicherter Zugang zu den Daten
- **A_3**: Endgültige Löschung der Daten nach Ablauf der Sperrfrist (10 Jahre)
- **A_4**: Benachrichtigen der Patienten zur Löschung der Daten
---
# **Tasks**
- **T_1**: Sperrung der Patientendaten durch Button
- **T_2**: Geischerter Login zur sicheren Aufbewahrung der Daten
- **T_3**: Automatisiertes Löschen der Daten nach Ablauf der Sperrfrist (10 Jahre)
- **T_4**: Überprüfen durch Mitarbeiter, ob Daten gesperrt/ gelöscht gehören
- **T_5**: Automatisieren der Löschung der Daten durch Anpassung des Programmes
- **T_6**: Automatisiertes benachrichtigen der betroffenen Patienten per Mail kurz vor der Löschung der Daten
- **T_7**: Entsperren der Daten durch Button mit Zustimmung des Patienten oder im Falle eines Notfalls
---
# **Testfälle**
**TF_1**: Sperren der Daten
- Vorbedingung: Einloggen als autorisierter Benutzer über gesicherten Login
- Auszuführende Testschritte: Suchen und Sperren der Daten, die 10 Jahre oder älter sind
- Erwartetes Ergebnis: Daten sind weiterhin vorhanden, aber nicht zugänglich solange die Sperre nicht aufgehoben wurde
**TF_2**: Löschen der Daten
- Vorbedingung: Sperrfrist ist abgelaufen
- Auszuführende Testschritte: Löschen der Daten mit abgelaufener Sperrfrist
- Erwartetes Ergebnis: Endgültige Löschung und Vernichtung der Daten
**TF_3**: Entsperren der Daten
- Vorbedingung: Daten sind gesperrt
- Auszuführende Testschritte: Daten werden durch Mitarbeiter mit autorisiertem Zugang im Falle eines Notfalls
oder durch die Zustimmung des Patienten über einen Button entsperrt
- Erwartetes Ergebnis: Daten werden wieder freigegeben und können verwendet werden

View File

@@ -0,0 +1,52 @@
# **User Story**
Moin, mein Name ist Udo und ich habe früher das Pflegeheim Curanum Schwachhausen von meinem Vater übernommen und inzwischen leite ich vier Pflegeeinrichtungen in Bremen.
Nach einem verlorenen Gerichtsprozess wegen unzureichender Pflegedokumentation ist mir bewusst geworden,
wie wichtig rechtssichere und datenschutzkonforme Prozesse sind.
Deshalb möchte ich den Vermögensstand vollständig aus unserer Anwendung entfernen lassen,
damit keine unnötigen sensiblen Daten gespeichert werden und wir künftige rechtliche Risiken vermeiden.
---
# **Akzeptanzkriterien:**
- **A_1:**
In der UI darf kein Eingabefeld oder Anzeigeelement für den Vermögensstand mehr vorhanden sein
- **A_2:**
In der Datenbank darf das Feld für Vermögensstand nicht mehr verwendet werden
- **A_3:**
Alte Daten müssen vollständig entfernt wird
---
# **Tasks**
- **T_1:**
Entferne das Eingabefeld „Vermögensstand“ aus den Formularen in der GUI (z.B. AllPatientView.fxml)
- **T_2:**
Entferne die Datenbankspalte oder setze sie auf inaktiv in AllPatientController, PatientDAO und auch aus dem Patient model
- **T_3:**
Führe ein einmaliges Migrationsskript aus, das vorhandene Vermögensdaten aus der Datenbank entfernt
- **T_4:**
Prüfe, ob Schnittstellen (z.B. zu Rechnungsmodulen) vom Entfernen betroffen sind und passe ggf. an
---
# **Testfälle**
- **TF_1:**
Vorbedingung: Applikation gestartet
auszuführende Testschritte: - Eingabemaske für Patienten öffnen
erwartetes Ergebnis: Kein Feld für Vermögensstand sichtbar
- **TF_2:**
Vorbedingung: Zugriff auf Patientendatenbank
auszuführende Testschritte: - Abfrage auf Spalte „Vermögensstand“ starten
erwartetes Ergebnis: Spalte existiert nicht mehr oder enthält nur NULL-Werte
- **TF3_:**
Vorbedingung: Alte Patientendaten mit Vermögensstand waren gespeichert
auszuführende Testschritte: - Migration ausführen und Daten prüfen
erwartetes Ergebnis: Vermögensstand ist aus allen Datensätzen entfernt

View File

@@ -0,0 +1,67 @@
# **User Story**
Ich bin Mario, 43 Jahre alt, und arbeite seit 11 Jahren als Pflegekraft in einem Seniorenheim.
In meinem Alltag dokumentiere ich viele Behandlungen oft unter Zeitdruck, zwischen Tür und Angel. Da kommt es leicht zu Fehlern, vor allem wenn ich schnell herausfinden muss, wer welche Behandlung durchgeführt hat oder wenn ich selbst eine neue Behandlung dokumentiere.
Was mich besonders stört: Die Pflegekraft muss immer manuell eingetragen werden manchmal vertippt man sich oder sucht ewig nach dem richtigen Namen.
Ich möchte daher, dass ich beim Anlegen einer neuen Behandlung einfach per ComboBox aus einer Liste aktiver Pflegekräfte die zuständige Person auswählen kann. So kann ich sie eindeutig zuordnen, ohne dass es zu Fehlern kommt auch wenn zwei Kolleg*innen denselben Nachnamen haben.
Die Auswahl soll automatisch mit der Behandlung gespeichert werden, sodass ich (oder jemand anderes) später noch weiß, wer was gemacht hat etwa für Rückfragen, Nachverfolgung oder in der Übergabe.
---
# **Akzeptanzkriterien:**
- **A_1:** Ich sehe beim Erstellen einer neuen Behandlung eine ComboBox mit allen aktiven Pflegekräften.
- **A_2:** Die Pflegekräfte müssen aus der Datenbank über ein Repository abgefragt werden (z.B. findAktivePflegekraefte()).
- **A_3:** Die gewählte Pflegekraft-ID wird beim Speichern zusammen mit der Behandlung abgespeichert.
- **A_4**: Die Datenbankstruktur wird angepasst, falls die Pflegekraft-Zuordnung noch nicht vorgesehen ist.
- **A_5**: Beim Öffnen einer bestehenden Behandlung wird die zugehörige Pflegekraft in der ComboBox vorausgewählt angezeigt.
- **A_6**: Inaktive Pflegekräfte dürfen nicht in der Liste erscheinen, selbst wenn sie früher mal Behandlungen durchgeführt haben.
- **A_7**: Es gibt eine Fehlerprüfung: Wenn keine Pflegekraft ausgewählt wurde, erscheint eine Warnung.
---
# **Tasks**
- **T_1:** Auswahl der Pflegekräfte durch ComboBox
- **T_2:** Nur aktive Pflegekräfte in der ComboBox anzeigen
- **T_3:** Pflegekraft nach 10 Jahren Inaktivität aus dem System löschen
- **T_4:** Benachrichtigung der Pflegekräfte über das Löschen aus dem System
---
# **Testfälle**
TF_1: Auswahl einer Pflegekraft bei neuer Behandlung
- **Vorbedingung:** Mario ist eingeloggt. Mehrere aktive Pflegekräfte sind im System vorhanden.
- **Ablauf:**
1. Mario öffnet die Maske zum Anlegen einer neuen Behandlung.
- **Erwartet:** Eine ComboBox mit allen aktiven Pflegekräften wird angezeigt.
TF_2: Speicherung der Auswahl
- **Vorbedingung:** Mario hat eine Pflegekraft aus der Liste gewählt.
- **Ablauf:**
1. Er speichert die Behandlung.
- **Erwartet:** Die gewählte Pflegekraft ist korrekt mit der Behandlung verknüpft.
TF3: Keine Auswahl Fehlermeldung
- **Vorbedingung:** Mario öffnet die Maske, trifft aber keine Auswahl.
- **Ablauf:** Er klickt auf „Speichern“.
- **Erwartet:** Eine Meldung erscheint: „Bitte eine Pflegekraft auswählen.“
TF4: Inaktive Pflegekräfte sind nicht sichtbar
- **Vorbedingung:** Eine Pflegekraft wurde kürzlich deaktiviert.
- **Ablauf:** Mario öffnet die Maske.
- **Erwartet:** Die deaktivierte Pflegekraft erscheint nicht in der Liste.
TF 5: Anzeige der zugeordneten Pflegekraft in bestehender Behandlung
- **Vorbedingung:** Eine bestehende Behandlung ist mit Pflegekraft „Anna Müller“ verknüpft.
- **Ablauf:** Mario öffnet die Behandlung zur Bearbeitung.
- **Erwartet:** In der ComboBox ist „Müller, Anna“ vorausgewählt.

View File

@@ -0,0 +1,38 @@
### User-Story
- Ich bin eine Bewohnerin des Pflegeheimes.
- Ich bin 69
- Mir ist wichtig, dass nicht jeder an meine Daten kommt
Moin ich bin die Brunhilde und mir ist wichtig, dass nicht jeder meine Daten sieht. Maria pflegt mich und nicht Markus. Daher muss Markus auch nicht wissen, dass ich Probleme mit dem Toilettengang habe. Konkret möchte ich, dass ich im System Maria zugeordnet werde und Maria sich anmeldet und meine Daten sieht.
### Akzeptanzkriterien
- Ich kann Maria zugeordnet werden
- Maria kann meine Daten sehen
- Andere Leute als Maria können meine Daten nicht sehen
### Tasks
- Es soll eine verschlüsselte Datenbank der Logindaten der Pfleger geben
- Dafür soll es eine DAO als einzige Verbindung geben
- Die Klasse Pfleger soll Zuordnungen der Klasse Patient speichern können
- Die Hauptanwendung muss in einen Login-Bildschirm starten
- Dieser Bildschirm soll
- Diese Zuordnungen sollen auch in einer Datenbank gespeichert werden
- Dafür soll es eine DAO als einzige Verbindung geben
- Nur zugeordnete Pfleger sollen die Daten eines Patienten ansehen können
- Die Klasse Admin muss implementiert werden und muss mindestens Patienten Pflegern zuordnen können
### Testfälle
- TF1
- Der Pfleger hat ein Endgerät und das Programm
- Der Pfleger öffnet das Programm
- Ein Anmeldebildschirm wird gezeigt
- TF2
- Der Pfleger hat den Anmeldebildschirm offen
- Der Pfleger gibt seine korrekten Daten ein und loggt sich ein
- Der Pfleger sieht nur ihm zugeordneten Patienten
- TF3
- Der Admin hat sich angemeldet und Patient A ist niemandem zugeordnet
- Er ordnet Patient A Pfleger B zu
- Wenn Pfleger B sich einloggt, sieht er die Daten von Patient A
- Wenn sich Pfleger A einloggt, sieht er nicht die Daten von Patient A

View File

@@ -0,0 +1,21 @@
# **User Story**
---
# **Akzeptanzkriterien:**
- **A_1:**
---
# **Tasks**
- **T_1:**
---
# **Testfälle**
TF_1:

View File

@@ -0,0 +1,109 @@
# **User Story**
**Mein Name ist Maria,**
**als** überlastete Pflegerin mit wenig IT-Affinität,
**möchte ich** in der Navigationsleiste der Anwendung eine Übersicht aller Pflegerinnen und Pfleger aufrufen können sowie bei jeder Behandlung sehen, wer diese durchgeführt hat,
**damit** ich trotz Zeitdruck schnell die zuständige Person identifizieren und direkt telefonisch kontaktieren kann, um Rückfragen zu klären oder Übergaben abzustimmen, ohne lange suchen oder tippen zu müssen.
---
# **Akzeptanzkriterien:**
- **A_1:** In der Navigationsleiste gibt es einen neuen Button „Pflegekräfte“, der zu einer Ansicht aller Pfleger/innen führt
- **A_2:** Die Ansicht zeigt alle Pflegekräfte mit:
- ID
- Nachname
- Vorname
- Telefonnummer
- **A_3:** Bei der Anzeige einer einzelnen Behandlung (Behandlungsdetailansicht) wird zusätzlich angezeigt:
- Der Name der Pflegekraft (Format: **Nachname, Vorname**)
- Die zugehörige Telefonnummer
- **A_4:** Die Daten stimmen mit dem bestehenden Pflegedatensatz überein.
---
# **Tasks**
- **T_1:** Navigationsleiste um Button **„Pflegekräfte“** erweitern
- **T_2:** Button der zur **AllCaregiverView.fxml**-Ansicht führt.
- **T_3:** Behandlung Einzelansicht um Labels für Pflegekraft Name und -telefonnummer ergänzen
- **T_4:** Im `TreatmentController` Pflegekraft Daten aus Datenbank laden
- **T_5:** Sicherstellen, dass `Treatment`-Objekte die Pflegekraft-ID enthalten
- **T_6:** SQL-`JOIN` oder DTO einführen, um Pflegekraft Daten direkt mitzuladen
- **T_7:** Fehlerbehandlung für ungültige oder fehlende Pflegekraft Zuweisungen
- **T_8:** Darstellung & Formatierung der Pflegekraft Daten in der UI
- **T_9:** Bestehende Tests erweitern / neue Tests für neue UI-Komponenten schreiben
---
# **Testfälle**
TF_1: Navigation zur Pflegekräfte-Übersicht
- **Vorbedingung:** Anwendung ist gestartet, Benutzer ist eingeloggt.
- **Testschritte:**
1. Klicke auf „Pflegekräfte“ in der linken Navigationsleiste.
- **Erwartet:** `AllCaregiverView.fxml` wird geladen, eine Tabelle mit Pflegekräften wird angezeigt.
TF_2: Pflegekraft Daten in Übersicht
- **Vorbedingung:** Die Pflegekräfte Ansicht (`AllCaregiverView.fxml`) ist geöffnet.
- **Auszuführende Testschritte:**
1. Überprüfe die Tabelle visuell oder per Testautomatisierung.
- **Erwartetes Ergebnis:** Jede Zeile zeigt:
- Eine ID
- Nachname
- Vorname
- Telefonnummer
Die Daten sind deckungsgleich mit den Daten in der Datenbank.
TF_3: Pflegekraft in Behandlungsdetails sichtbar
- **Vorbedingung:** Eine Behandlung ist vorhanden, der eine Pflegekraft zugewiesen wurde.
- **Auszuführende Testschritte:**
1. Öffne die Detailansicht der Behandlung.
- **Erwartetes Ergebnis:** Es werden zwei Labels angezeigt:
- Pflegekraft Name im Format: „Nachname, Vorname“
- Telefonnummer der Pflegekraft
TF_4: Behandlung ohne Pflegekraft zeigt Hinweis
- **Vorbedingung:** Eine Behandlung ohne zugeordnete Pflegekraft ist vorhanden.
- **Auszuführende Testschritte:**
1. Öffne die Detailansicht dieser Behandlung.
- **Erwartetes Ergebnis:**
- Im Label für den Pflegernamen steht: „Keine Pflegekraft zugeordnet“
- Im Telefonnummer-Label steht: „–“ oder ist ausgeblendet
TF_5: Format des Namens korrekt
- **Vorbedingung:** Eine Pflegekraft mit Nachname „Müller“ und Vorname „Anna“ ist zugewiesen.
- **Auszuführende Testschritte:**
1. Öffne die Behandlungsdetailansicht.
- **Erwartetes Ergebnis:** Im Label steht exakt: `Müller, Anna`
TF_6: Telefonnummer formatiert
- **Vorbedingung:** Pflegekraft ist zugewiesen und besitzt eine Telefonnummer.
- **Auszuführende Testschritte:**
1. Öffne Behandlungsdetailansicht
- **Erwartetes Ergebnis:** Telefonnummer ist korrekt formatiert (z.B. `+49 123 4567890`)
TF_7: Fehlerhafte Zuordnung wird abgefangen
- **Vorbedingung:** Es existiert eine Behandlung mit einer verwaisten Pflegekraft-ID (z.B. gelöscht).
- **Auszuführende Testschritte:**
1. Öffne die Behandlung Detailansicht
- **Erwartetes Ergebnis:**
- Die Pflegekraft-Labels zeigen „Keine Pflegekraft zugeordnet“

View File

@@ -1,12 +1,17 @@
package de.hitec.nhplus.controller;
import de.hitec.nhplus.datastorage.DaoFactory;
import de.hitec.nhplus.datastorage.LockedPatientDao;
import de.hitec.nhplus.datastorage.PatientDao;
import de.hitec.nhplus.model.LockedPatient;
import javafx.beans.value.ChangeListener;
import javafx.beans.value.ObservableValue;
import javafx.collections.FXCollections;
import javafx.collections.ObservableList;
import javafx.fxml.FXML;
import javafx.fxml.FXMLLoader;
import javafx.scene.Parent;
import javafx.scene.Scene;
import javafx.scene.control.Button;
import javafx.scene.control.TableColumn;
import javafx.scene.control.TableView;
@@ -15,9 +20,20 @@ import javafx.scene.control.cell.PropertyValueFactory;
import javafx.scene.control.cell.TextFieldTableCell;
import de.hitec.nhplus.model.Patient;
import de.hitec.nhplus.utils.DateConverter;
import javafx.scene.control.*;
import javafx.beans.property.SimpleStringProperty;
import javafx.beans.property.ReadOnlyStringWrapper;
import javafx.beans.property.BooleanProperty;
import javafx.beans.binding.Bindings;
import javafx.stage.Stage;
import java.io.IOException;
import java.sql.Connection;
import java.sql.SQLException;
import java.time.LocalDate;
import java.util.ArrayList;
import java.util.List;
import java.util.stream.Collectors;
/**
@@ -28,6 +44,8 @@ public class AllPatientController {
@FXML
private TableView<Patient> tableView;
@FXML
private TableColumn<Patient, Integer> columnId;
@@ -55,6 +73,9 @@ public class AllPatientController {
@FXML
private Button buttonAdd;
@FXML
private Button buttonLock;
@FXML
private TextField textFieldSurname;
@@ -81,8 +102,11 @@ public class AllPatientController {
* after loading an FXML-File. At this point of the lifecycle of the Controller, the fields can be accessed and
* configured.
*/
@FXML
public void initialize() {
this.readAllAndShowInTableView();
this.dao = DaoFactory.getDaoFactory().createPatientDAO();
this.columnId.setCellValueFactory(new PropertyValueFactory<>("pid"));
@@ -106,14 +130,15 @@ public class AllPatientController {
this.columnAssets.setCellValueFactory(new PropertyValueFactory<>("assets"));
this.columnAssets.setCellFactory(TextFieldTableCell.forTableColumn());
//Anzeigen der Daten
this.tableView.setItems(this.patients);
this.buttonDelete.setDisable(true);
this.tableView.getSelectionModel().selectedItemProperty().addListener(new ChangeListener<Patient>() {
@Override
public void changed(ObservableValue<? extends Patient> observableValue, Patient oldPatient, Patient newPatient) {;
public void changed(ObservableValue<? extends Patient> observableValue, Patient oldPatient, Patient newPatient) {
AllPatientController.this.buttonDelete.setDisable(newPatient == null);
}
});
@@ -126,6 +151,7 @@ public class AllPatientController {
this.textFieldCareLevel.textProperty().addListener(inputNewPatientListener);
this.textFieldRoomNumber.textProperty().addListener(inputNewPatientListener);
this.textFieldAssets.textProperty().addListener(inputNewPatientListener);
}
/**
@@ -231,8 +257,11 @@ public class AllPatientController {
Patient selectedItem = this.tableView.getSelectionModel().getSelectedItem();
if (selectedItem != null) {
try {
LockedPatientDao lockedPatientDao = DaoFactory.getDaoFactory().createLockedPatientDAO();
lockedPatientDao.insertIntoLockedPatient(selectedItem);
DaoFactory.getDaoFactory().createPatientDAO().deleteById(selectedItem.getPid());
this.tableView.getItems().remove(selectedItem);
} catch (SQLException exception) {
exception.printStackTrace();
}
@@ -253,8 +282,10 @@ public class AllPatientController {
String careLevel = this.textFieldCareLevel.getText();
String roomNumber = this.textFieldRoomNumber.getText();
String assets = this.textFieldAssets.getText();
Patient newPatient = new Patient(firstName, surname, date, careLevel, roomNumber, assets);
try {
this.dao.create(new Patient(firstName, surname, date, careLevel, roomNumber, assets));
this.dao.create(newPatient);
} catch (SQLException exception) {
exception.printStackTrace();
}

View File

@@ -0,0 +1,117 @@
package de.hitec.nhplus.controller;
import de.hitec.nhplus.Main;
import de.hitec.nhplus.datastorage.LockedPatientDao;
import de.hitec.nhplus.model.LockedPatient;
import javafx.collections.FXCollections;
import javafx.collections.ObservableList;
import javafx.fxml.FXML;
import javafx.fxml.FXMLLoader;
import javafx.scene.Parent;
import javafx.scene.Scene;
import javafx.scene.control.TableView;
import de.hitec.nhplus.datastorage.DaoFactory;
import de.hitec.nhplus.datastorage.PatientDao;
import de.hitec.nhplus.model.Patient;
import javafx.scene.control.*;
import javafx.scene.control.cell.PropertyValueFactory;
import javafx.scene.control.cell.TextFieldTableCell;
import javafx.scene.layout.BorderPane;
import javafx.stage.Stage;
import java.io.IOException;
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.util.List;
public class LockedPatientController {
@FXML
private TableView<Patient> lockedTableView;
@FXML
private TableColumn<Patient, Integer> lockedColumnId;
@FXML
private TableColumn<Patient, String> lockedColumnFirstName;
@FXML
private TableColumn<Patient, String> lockedColumnSurname;
@FXML
private TableColumn<Patient, String> lockedColumnDateOfBirth;
@FXML
private TableColumn<Patient, String> lockedColumnCareLevel;
@FXML
private TableColumn<Patient, String> lockedColumnRoomNumber;
@FXML
private TableColumn<Patient, String> lockedColumnAssets;
@FXML
private Button buttonUnlock;
private final ObservableList<Patient> lockedPatients = FXCollections.observableArrayList();
private PatientDao dao;
public void initialize() {
this.dao = DaoFactory.getDaoFactory().createPatientDAO();
this.lockedColumnId.setCellValueFactory(new PropertyValueFactory<>("pid"));
this.lockedColumnFirstName.setCellValueFactory(new PropertyValueFactory<>("firstName"));
this.lockedColumnFirstName.setCellFactory(TextFieldTableCell.forTableColumn());
this.lockedColumnSurname.setCellValueFactory(new PropertyValueFactory<>("surname"));
this.lockedColumnSurname.setCellFactory(TextFieldTableCell.forTableColumn());
this.lockedColumnDateOfBirth.setCellValueFactory(new PropertyValueFactory<>("dateOfBirth"));
this.lockedColumnDateOfBirth.setCellFactory(TextFieldTableCell.forTableColumn());
this.lockedColumnCareLevel.setCellValueFactory(new PropertyValueFactory<>("careLevel"));
this.lockedColumnCareLevel.setCellFactory(TextFieldTableCell.forTableColumn());
this.lockedColumnRoomNumber.setCellValueFactory(new PropertyValueFactory<>("roomNumber"));
this.lockedColumnRoomNumber.setCellFactory(TextFieldTableCell.forTableColumn());
this.lockedColumnAssets.setCellValueFactory(new PropertyValueFactory<>("assets"));
this.lockedColumnAssets.setCellFactory(TextFieldTableCell.forTableColumn());
lockedTableView.setItems(this.lockedPatients);
lockedTableView.getSelectionModel().selectedItemProperty().addListener((obs, oldSelection, newSelection) -> {
if (newSelection != null) {
buttonUnlock.setDisable(false);
} else {
buttonUnlock.setDisable(true);
}
});
}
@FXML
public void handleUnlock() {
Patient selectedPatient = lockedTableView.getSelectionModel().getSelectedItem();
PatientDao patientDao = DaoFactory.getDaoFactory().createPatientDAO();
LockedPatientDao lockedPatientDao = DaoFactory.getDaoFactory().createLockedPatientDAO();
if (selectedPatient != null) {
try {
patientDao.create(selectedPatient);
lockedPatientDao.deleteById(selectedPatient.getPid());
lockedPatients.remove(selectedPatient);
} catch (SQLException e) {
e.printStackTrace();
}
}
}
}

View File

@@ -32,4 +32,13 @@ public class MainWindowController {
exception.printStackTrace();
}
}
@FXML
private void handleShowLockedPatient(ActionEvent event) {
FXMLLoader loader = new FXMLLoader(Main.class.getResource("/de/hitec/nhplus/LockedPatientView.fxml"));
try {
mainBorderPane.setCenter(loader.load());
} catch (IOException exception) {
exception.printStackTrace();
}
}
}

View File

@@ -1,7 +1,13 @@
package de.hitec.nhplus.datastorage;
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.SQLException;
public class DaoFactory {
private static final String DB_URL = "jdbc:sqlite:nhplus.db";
private static DaoFactory instance;
private DaoFactory() {
@@ -14,6 +20,10 @@ public class DaoFactory {
return DaoFactory.instance;
}
public Connection getConnection() throws SQLException {
return DriverManager.getConnection(DB_URL);
}
public TreatmentDao createTreatmentDao() {
return new TreatmentDao(ConnectionBuilder.getConnection());
}
@@ -21,4 +31,7 @@ public class DaoFactory {
public PatientDao createPatientDAO() {
return new PatientDao(ConnectionBuilder.getConnection());
}
public LockedPatientDao createLockedPatientDAO() {
return new LockedPatientDao(ConnectionBuilder.getConnection());
}
}

View File

@@ -1,5 +1,7 @@
package de.hitec.nhplus.datastorage;
import de.hitec.nhplus.model.Patient;
import java.sql.*;
import java.util.ArrayList;
import java.util.List;
@@ -14,6 +16,7 @@ public abstract class DaoImp<T> implements Dao<T> {
@Override
public void create(T t) throws SQLException {
getCreateStatement(t).executeUpdate();
}
@Override
@@ -54,4 +57,5 @@ public abstract class DaoImp<T> implements Dao<T> {
protected abstract PreparedStatement getUpdateStatement(T t);
protected abstract PreparedStatement getDeleteStatement(long key);
}

View File

@@ -0,0 +1,110 @@
package de.hitec.nhplus.datastorage;
import de.hitec.nhplus.model.LockedPatient;
import de.hitec.nhplus.model.Patient;
import de.hitec.nhplus.utils.DateConverter;
import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.util.ArrayList;
public class LockedPatientDao extends DaoImp<Patient>{
public LockedPatientDao(Connection connection) {
super(connection);
}
@Override
protected Patient getInstanceFromResultSet(ResultSet resultSet) throws SQLException {
long pid = resultSet.getLong("pid");
String firstname = resultSet.getString("firstname");
String surname = resultSet.getString("surname");
String dob = resultSet.getString("dateOfBirth");
String carelevel = resultSet.getString("carelevel");
String roomnumber = resultSet.getString("roomnumber");
String assets = resultSet.getString("assets");
boolean locked = resultSet.getBoolean("locked");
Patient patient = new Patient(
pid,
firstname,
surname,
DateConverter.convertStringToLocalDate(dob),
carelevel,
roomnumber,
assets
);
patient.setLocked(locked);
return patient;
}
@Override
protected ArrayList<Patient> getListFromResultSet(ResultSet set) throws SQLException {
ArrayList<Patient> list = new ArrayList<>();
while (set.next()) {
list.add(getInstanceFromResultSet(set));
}
return list;
}
public void insertIntoLockedPatient(Patient lockedPatient) {
final String SQL = "INSERT INTO locked_patient (firstname, surname, dateOfBirth, carelevel, roomnumber, assets, locked) VALUES (?, ?, ?, ?, ?, ?, ?)";
try {
PreparedStatement stmt = this.connection.prepareStatement(SQL);
stmt.setString(1, lockedPatient.getFirstName());
stmt.setString(2, lockedPatient.getSurname());
stmt.setString(3, lockedPatient.getDateOfBirth());
stmt.setString(4, lockedPatient.getCareLevel());
stmt.setString(5, lockedPatient.getRoomNumber());
stmt.setString(6, lockedPatient.getAssets());
stmt.setBoolean(7, true);
stmt.executeUpdate();
} catch (SQLException e) {
e.printStackTrace();
}
}
@Override
protected PreparedStatement getCreateStatement(Patient lockedPatient) {
PreparedStatement stmt = null;
return stmt;
}
@Override
protected PreparedStatement getReadByIDStatement(long key) {
return null;
}
@Override
protected PreparedStatement getReadAllStatement() {
try {
final String SQL = "SELECT * FROM locked_patient";
return this.connection.prepareStatement(SQL);
} catch (SQLException e) {
e.printStackTrace();
return null;
}
}
@Override
protected PreparedStatement getUpdateStatement(Patient patient) {
return null;
}
@Override
protected PreparedStatement getDeleteStatement(long key) {
PreparedStatement preparedStatement = null;
try {
final String SQL = "DELETE FROM patient WHERE pid = ?";
preparedStatement = this.connection.prepareStatement(SQL);
preparedStatement.setLong(1, key);
} catch (SQLException exception) {
exception.printStackTrace();
}
return preparedStatement;
}
}

View File

@@ -6,6 +6,7 @@ import de.hitec.nhplus.utils.DateConverter;
import java.sql.*;
import java.time.LocalDate;
import java.util.ArrayList;
import java.util.List;
/**
* Implements the Interface <code>DaoImp</code>. Overrides methods to generate specific <code>PreparedStatements</code>,
@@ -13,6 +14,8 @@ import java.util.ArrayList;
*/
public class PatientDao extends DaoImp<Patient> {
private static PatientDao instance;
/**
* The constructor initiates an object of <code>PatientDao</code> and passes the connection to its super class.
*
@@ -32,8 +35,7 @@ public class PatientDao extends DaoImp<Patient> {
protected PreparedStatement getCreateStatement(Patient patient) {
PreparedStatement preparedStatement = null;
try {
final String SQL = "INSERT INTO patient (firstname, surname, dateOfBirth, carelevel, roomnumber, assets) " +
"VALUES (?, ?, ?, ?, ?, ?)";
final String SQL = "INSERT INTO patient (firstname, surname, dateOfBirth, carelevel, roomnumber, assets, locked) VALUES (?, ?, ?, ?, ?, ?, ?)";
preparedStatement = this.connection.prepareStatement(SQL);
preparedStatement.setString(1, patient.getFirstName());
preparedStatement.setString(2, patient.getSurname());
@@ -41,6 +43,7 @@ public class PatientDao extends DaoImp<Patient> {
preparedStatement.setString(4, patient.getCareLevel());
preparedStatement.setString(5, patient.getRoomNumber());
preparedStatement.setString(6, patient.getAssets());
preparedStatement.setBoolean(7, patient.isLocked());
} catch (SQLException exception) {
exception.printStackTrace();
}
@@ -66,6 +69,13 @@ public class PatientDao extends DaoImp<Patient> {
return preparedStatement;
}
public static PatientDao getInstance(Connection connection) {
if (instance == null) {
instance = new PatientDao(connection);
}
return instance;
}
/**
* Maps a <code>ResultSet</code> of one patient to an object of <code>Patient</code>.
*
@@ -73,8 +83,8 @@ public class PatientDao extends DaoImp<Patient> {
* @return Object of class <code>Patient</code> with the data from the resultSet.
*/
@Override
protected Patient getInstanceFromResultSet(ResultSet result) throws SQLException {
return new Patient(
public Patient getInstanceFromResultSet(ResultSet result) throws SQLException {
Patient patient = new Patient(
result.getInt(1),
result.getString(2),
result.getString(3),
@@ -82,6 +92,8 @@ public class PatientDao extends DaoImp<Patient> {
result.getString(5),
result.getString(6),
result.getString(7));
patient.setLocked(result.getBoolean("buttonLock"));
return patient;
}
/**
@@ -139,7 +151,8 @@ public class PatientDao extends DaoImp<Patient> {
"dateOfBirth = ?, " +
"carelevel = ?, " +
"roomnumber = ?, " +
"assets = ? " +
"assets = ?, " +
"locked = ? " +
"WHERE pid = ?";
preparedStatement = this.connection.prepareStatement(SQL);
preparedStatement.setString(1, patient.getFirstName());
@@ -148,7 +161,8 @@ public class PatientDao extends DaoImp<Patient> {
preparedStatement.setString(4, patient.getCareLevel());
preparedStatement.setString(5, patient.getRoomNumber());
preparedStatement.setString(6, patient.getAssets());
preparedStatement.setLong(7, patient.getPid());
preparedStatement.setBoolean(7, patient.isLocked());
preparedStatement.setLong(8, patient.getPid());
} catch (SQLException exception) {
exception.printStackTrace();
}
@@ -173,4 +187,21 @@ public class PatientDao extends DaoImp<Patient> {
}
return preparedStatement;
}
public void lockPatient(long pid, boolean locked) throws SQLException {
final String SQL = "UPDATE patient SET locked = ? WHERE pid = ?";
PreparedStatement stmt = this.connection.prepareStatement(SQL);
stmt.setBoolean(1, locked);
stmt.setLong(2, pid);
stmt.executeUpdate();
}
public List<Patient> readAllLocked() throws SQLException {
String sql = "SELECT * FROM locked_patient WHERE locked = 1";
PreparedStatement statement = this.connection.prepareStatement(sql);
ResultSet resultSet = statement.executeQuery();
return getListFromResultSet(resultSet);
}
}

View File

@@ -0,0 +1,123 @@
package de.hitec.nhplus.model;
import de.hitec.nhplus.utils.DateConverter;
import javafx.beans.property.BooleanProperty;
import javafx.beans.property.SimpleBooleanProperty;
import javafx.beans.property.SimpleLongProperty;
import javafx.beans.property.SimpleStringProperty;
import java.time.LocalDate;
import java.util.ArrayList;
import java.util.List;
public class LockedPatient extends Person {
private SimpleLongProperty pid;
private final SimpleStringProperty dateOfBirth;
private final SimpleStringProperty careLevel;
private final SimpleStringProperty roomNumber;
private final SimpleStringProperty assets;
/**
* Constructor to initiate an object of class <code>Patient</code> with the given parameter. Use this constructor
* to initiate objects, which are not persisted yet, because it will not have a patient id (pid).
*
* @param firstName First name of the patient.
* @param surname Last name of the patient.
* @param dateOfBirth Date of birth of the patient.
* @param careLevel Care level of the patient.
* @param roomNumber Room number of the patient.
* @param assets Assets of the patient.
*/
public LockedPatient(String firstName, String surname, LocalDate dateOfBirth, String careLevel, String roomNumber, String assets) {
super(firstName, surname);
this.dateOfBirth = new SimpleStringProperty(DateConverter.convertLocalDateToString(dateOfBirth));
this.careLevel = new SimpleStringProperty(careLevel);
this.roomNumber = new SimpleStringProperty(roomNumber);
this.assets = new SimpleStringProperty(assets);
this.locked = new SimpleBooleanProperty();
}
public LockedPatient(long pid, String firstName, String surname, LocalDate dateOfBirth, String careLevel, String roomNumber, String assets) {
super(firstName, surname);
this.pid = new SimpleLongProperty(pid);
this.dateOfBirth = new SimpleStringProperty(DateConverter.convertLocalDateToString(dateOfBirth));
this.careLevel = new SimpleStringProperty(careLevel);
this.roomNumber = new SimpleStringProperty(roomNumber);
this.assets = new SimpleStringProperty(assets);
this.locked.set(false);
}
public long getPid() {
return pid.get();
}
public SimpleLongProperty pidProperty() {
return pid;
}
public String getDateOfBirth() {
return dateOfBirth.get();
}
public SimpleStringProperty dateOfBirthProperty() {
return dateOfBirth;
}
public void setDateOfBirth(String dateOfBirth) {
this.dateOfBirth.set(dateOfBirth);
}
public String getCareLevel() {
return careLevel.get();
}
public SimpleStringProperty careLevelProperty() {
return careLevel;
}
public void setCareLevel(String careLevel) {
this.careLevel.set(careLevel);
}
public String getRoomNumber() {
return roomNumber.get();
}
public SimpleStringProperty roomNumberProperty() {
return roomNumber;
}
private SimpleBooleanProperty locked = new SimpleBooleanProperty(false);
public boolean isLocked() {
return locked.get();
}
public void setLocked(boolean value) {
this.locked.set(value);
}
public BooleanProperty lockedProperty() {
return locked;
}
public void setRoomNumber(String roomNumber) {
this.roomNumber.set(roomNumber);
}
public String getAssets() {
return assets.get();
}
public SimpleStringProperty assetsProperty() {
return assets;
}
public void setAssets(String assets) {
this.assets.set(assets);
}
}

View File

@@ -3,6 +3,8 @@ package de.hitec.nhplus.model;
import de.hitec.nhplus.utils.DateConverter;
import javafx.beans.property.SimpleLongProperty;
import javafx.beans.property.SimpleStringProperty;
import javafx.beans.property.SimpleBooleanProperty;
import javafx.beans.property.BooleanProperty;
import java.time.LocalDate;
import java.util.ArrayList;
@@ -36,6 +38,7 @@ public class Patient extends Person {
this.careLevel = new SimpleStringProperty(careLevel);
this.roomNumber = new SimpleStringProperty(roomNumber);
this.assets = new SimpleStringProperty(assets);
this.locked = new SimpleBooleanProperty();
}
/**
@@ -57,6 +60,7 @@ public class Patient extends Person {
this.careLevel = new SimpleStringProperty(careLevel);
this.roomNumber = new SimpleStringProperty(roomNumber);
this.assets = new SimpleStringProperty(assets);
this.locked.set(false);
}
public long getPid() {
@@ -104,6 +108,20 @@ public class Patient extends Person {
return roomNumber;
}
private SimpleBooleanProperty locked = new SimpleBooleanProperty(false);
public boolean isLocked() {
return locked.get();
}
public void setLocked(boolean value) {
this.locked.set(value);
}
public BooleanProperty lockedProperty() {
return locked;
}
public void setRoomNumber(String roomNumber) {
this.roomNumber.set(roomNumber);

View File

@@ -0,0 +1,8 @@
package de.hitec.nhplus.utils;
public class CheckBeforeStart {
public void checkExpiredPatient () {
}
}

View File

@@ -1,9 +1,6 @@
package de.hitec.nhplus.utils;
import de.hitec.nhplus.datastorage.ConnectionBuilder;
import de.hitec.nhplus.datastorage.DaoFactory;
import de.hitec.nhplus.datastorage.PatientDao;
import de.hitec.nhplus.datastorage.TreatmentDao;
import de.hitec.nhplus.datastorage.*;
import de.hitec.nhplus.model.Patient;
import de.hitec.nhplus.model.Treatment;
@@ -33,6 +30,7 @@ public class SetUpDB {
SetUpDB.setUpTableTreatment(connection);
SetUpDB.setUpPatients();
SetUpDB.setUpTreatments();
SetUpDB.setUpLockedPatient();
}
/**
@@ -55,7 +53,8 @@ public class SetUpDB {
" dateOfBirth TEXT NOT NULL, " +
" carelevel TEXT NOT NULL, " +
" roomnumber TEXT NOT NULL, " +
" assets TEXt NOT NULL" +
" assets TEXt NOT NULL," +
" locked BOOLEAN DEFAULT FALSE" +
");";
try (Statement statement = connection.createStatement()) {
statement.execute(SQL);
@@ -98,6 +97,15 @@ public class SetUpDB {
}
}
private static void setUpLockedPatient() {
try {
LockedPatientDao dao = DaoFactory.getDaoFactory().createLockedPatientDAO();
dao.readAll();
} catch (SQLException exception){
exception.printStackTrace();
}
}
private static void setUpTreatments() {
try {
TreatmentDao dao = DaoFactory.getDaoFactory().createTreatmentDao();

View File

@@ -77,4 +77,4 @@
<padding>
<Insets top="10.0" />
</padding>
</AnchorPane>
</AnchorPane>

View File

@@ -0,0 +1,73 @@
<?xml version="1.0" encoding="UTF-8"?>
<?import java.lang.*?>
<?import java.util.*?>
<?import javafx.scene.*?>
<?import javafx.scene.control.*?>
<?import javafx.scene.layout.*?>
<?import javafx.geometry.Insets?>
<?import javafx.scene.control.Button?>
<?import javafx.scene.control.Label?>
<?import javafx.scene.control.TableColumn?>
<?import javafx.scene.control.TableView?>
<?import javafx.scene.control.TextField?>
<?import javafx.scene.layout.AnchorPane?>
<?import javafx.scene.layout.ColumnConstraints?>
<?import javafx.scene.layout.GridPane?>
<?import javafx.scene.layout.HBox?>
<?import javafx.scene.layout.RowConstraints?>
<?import javafx.scene.text.Font?>
<AnchorPane xmlns="http://javafx.com/javafx" xmlns:fx="http://javafx.com/fxml" fx:controller="de.hitec.nhplus.controller.LockedPatientController" prefHeight="500.0" prefWidth="855.0">
<children>
<TableView fx:id="lockedTableView" layoutX="31.0" layoutY="120.0" prefHeight="287.0" prefWidth="825.0" AnchorPane.bottomAnchor="100.0" AnchorPane.leftAnchor="15.0" AnchorPane.rightAnchor="15.0" AnchorPane.topAnchor="80.0">
<columns>
<TableColumn fx:id="lockedColumnId" maxWidth="1200.0" minWidth="5.0" prefWidth="5.0" text="ID" />
<TableColumn fx:id="lockedColumnSurname" maxWidth="7500.0" minWidth="20.0" prefWidth="100.0" text="Nachname" />
<TableColumn fx:id="lockedColumnFirstName" maxWidth="7500.0" prefWidth="75.0" text="Vorname" />
<TableColumn fx:id="lockedColumnDateOfBirth" maxWidth="7500.0" prefWidth="75.0" text="Geburtstag" />
<TableColumn fx:id="lockedColumnCareLevel" prefWidth="75.0" text="Pflegegrad" />
<TableColumn fx:id="lockedColumnRoomNumber" prefWidth="75.0" text="Raum" />
<TableColumn fx:id="lockedColumnAssets" prefWidth="75.0" text="Vermögensstand" />
</columns>
<columnResizePolicy>
<TableView fx:constant="CONSTRAINED_RESIZE_POLICY" />
</columnResizePolicy>
</TableView>
<HBox layoutX="623.0" layoutY="419.3999938964844" spacing="10.0" AnchorPane.bottomAnchor="15.0" AnchorPane.leftAnchor="15.0" AnchorPane.rightAnchor="15.0">
<children>
<GridPane hgap="10.0" vgap="10.0">
<columnConstraints>
<ColumnConstraints halignment="LEFT" hgrow="SOMETIMES" prefWidth="200.0" />
<ColumnConstraints halignment="LEFT" hgrow="SOMETIMES" minWidth="200.0" prefWidth="200.0" />
<ColumnConstraints halignment="LEFT" hgrow="SOMETIMES" minWidth="10.0" prefWidth="160.0" />
</columnConstraints>
<rowConstraints>
<RowConstraints minHeight="10.0" prefHeight="30.0" vgrow="SOMETIMES" />
<RowConstraints minHeight="10.0" prefHeight="30.0" vgrow="SOMETIMES" />
</rowConstraints>
<padding>
<Insets right="10.0" />
</padding>
<HBox.margin>
<Insets />
</HBox.margin>
</GridPane>
</children>
</HBox>
<HBox alignment="TOP_CENTER" layoutX="10.0" layoutY="10.0" prefWidth="200.0" spacing="25.0" AnchorPane.leftAnchor="15.0" AnchorPane.rightAnchor="15.0" AnchorPane.topAnchor="5.0">
<children>
<Label alignment="CENTER" contentDisplay="CENTER" minWidth="400.0" text="Gesperrte Patienten/innen" textAlignment="CENTER">
<font>
<Font size="36.0" />
</font>
</Label>
</children>
</HBox>
<Button fx:id="buttonUnlock" text="Entsperren" onAction="#handleUnlock" AnchorPane.rightAnchor="10" AnchorPane.bottomAnchor="15" prefWidth="90"/>
</children>
<padding>
<Insets top="10.0" />
</padding>
</AnchorPane>

View File

@@ -19,6 +19,9 @@
<VBox.margin>
<Insets bottom="50.0" left="10.0" right="10.0" top="50.0" />
</VBox.margin></Button>
<Button alignment="CENTER" contentDisplay="CENTER" mnemonicParsing="false" onAction="#handleShowLockedPatient" prefWidth="105.0" text="Gesperrte Patienten/innen">
<Insets bottom="50" left="10" right="10" top="100"/>
</Button>
</children>
</VBox>
</left>