From 8735141583894d14e620dae537192d12d06f9ba8 Mon Sep 17 00:00:00 2001
From: Andreas Weninger <e01526989@student.tuwien.ac.at>
Date: Mon, 11 Jun 2018 10:17:52 +0200
Subject: UI Rework

---
 .../controller/EmployeeListController.java         |  13 +-
 .../controller/ManageEmployeesController.java      |   3 +-
 .../controller/RegistrationWindowController.java   | 233 ++++++++++++++-------
 src/main/resources/fxml/RegistrationWindow.fxml    |  60 +++---
 src/main/resources/styles/main.css                 |  41 ++++
 5 files changed, 236 insertions(+), 114 deletions(-)

diff --git a/src/main/java/at/ac/tuwien/sepm/assignment/groupphase/einsatzverwaltung/controller/EmployeeListController.java b/src/main/java/at/ac/tuwien/sepm/assignment/groupphase/einsatzverwaltung/controller/EmployeeListController.java
index dc808a4..843145c 100644
--- a/src/main/java/at/ac/tuwien/sepm/assignment/groupphase/einsatzverwaltung/controller/EmployeeListController.java
+++ b/src/main/java/at/ac/tuwien/sepm/assignment/groupphase/einsatzverwaltung/controller/EmployeeListController.java
@@ -7,6 +7,7 @@ import java.io.IOException;
 import java.lang.invoke.MethodHandles;
 import java.util.ArrayList;
 import java.util.List;
+import java.util.Set;
 import java.util.function.Consumer;
 import javafx.fxml.FXML;
 import javafx.geometry.Insets;
@@ -30,22 +31,27 @@ public class EmployeeListController {
     private final SpringFXMLLoader fxmlLoader;
     private Node rootElement;
     private List<EmployeeListItemController> employeeListItemControllers;
+    private Insets listItemMargins = new Insets(0, 5, 10, 5);
 
     public EmployeeListController(SpringFXMLLoader fxmlLoader) {
         this.fxmlLoader = fxmlLoader;
         this.employeeListItemControllers = new ArrayList<>();
     }
 
-    public void setData(List<Employee> employeeList) {
+    public void setListItemMargins(Insets value) {
+        this.listItemMargins = value;
+    }
+
+    public void setData(Set<Employee> employeeList) {
         setData(employeeList, null, null);
     }
 
-    public void setData(List<Employee> employeeList, Consumer<Employee> onEmployeeClicked) {
+    public void setData(Set<Employee> employeeList, Consumer<Employee> onEmployeeClicked) {
         setData(employeeList, onEmployeeClicked, null);
     }
 
     public void setData(
-            List<Employee> employeeList,
+            Set<Employee> employeeList,
             Consumer<Employee> onEmployeeClicked,
             Consumer<EmployeeListItemController> onEmployeeListItemClicked) {
 
@@ -61,7 +67,6 @@ public class EmployeeListController {
             Employee employee,
             Consumer<Employee> onEmployeeClicked,
             Consumer<EmployeeListItemController> onEmployeeListItemClicked) {
-        Insets listItemMargins = new Insets(0, 5, 10, 5);
 
         try {
             EmployeeListItemController controller =
diff --git a/src/main/java/at/ac/tuwien/sepm/assignment/groupphase/einsatzverwaltung/controller/ManageEmployeesController.java b/src/main/java/at/ac/tuwien/sepm/assignment/groupphase/einsatzverwaltung/controller/ManageEmployeesController.java
index ed43c13..67cf7fa 100644
--- a/src/main/java/at/ac/tuwien/sepm/assignment/groupphase/einsatzverwaltung/controller/ManageEmployeesController.java
+++ b/src/main/java/at/ac/tuwien/sepm/assignment/groupphase/einsatzverwaltung/controller/ManageEmployeesController.java
@@ -6,6 +6,7 @@ import at.ac.tuwien.sepm.assignment.groupphase.exception.ServiceException;
 import at.ac.tuwien.sepm.assignment.groupphase.util.SpringFXMLLoader;
 import java.io.IOException;
 import java.lang.invoke.MethodHandles;
+import java.util.HashSet;
 import java.util.stream.Collectors;
 import javafx.fxml.FXML;
 import javafx.scene.layout.AnchorPane;
@@ -100,7 +101,7 @@ public class ManageEmployeesController {
                                                     || employee.name()
                                                             .toLowerCase()
                                                             .contains(searchString.toLowerCase()))
-                            .collect(Collectors.toList()),
+                            .collect(Collectors.toCollection(HashSet::new)),
                     this::openEditEmployee);
 
         } catch (ServiceException e) {
diff --git a/src/main/java/at/ac/tuwien/sepm/assignment/groupphase/einsatzverwaltung/controller/RegistrationWindowController.java b/src/main/java/at/ac/tuwien/sepm/assignment/groupphase/einsatzverwaltung/controller/RegistrationWindowController.java
index 6768162..b8abf91 100644
--- a/src/main/java/at/ac/tuwien/sepm/assignment/groupphase/einsatzverwaltung/controller/RegistrationWindowController.java
+++ b/src/main/java/at/ac/tuwien/sepm/assignment/groupphase/einsatzverwaltung/controller/RegistrationWindowController.java
@@ -10,6 +10,8 @@ import at.ac.tuwien.sepm.assignment.groupphase.einsatzverwaltung.service.Vehicle
 import at.ac.tuwien.sepm.assignment.groupphase.exception.InvalidRegistrationException;
 import at.ac.tuwien.sepm.assignment.groupphase.exception.InvalidVehicleException;
 import at.ac.tuwien.sepm.assignment.groupphase.exception.ServiceException;
+import at.ac.tuwien.sepm.assignment.groupphase.util.SpringFXMLLoader;
+import java.io.IOException;
 import java.time.LocalDate;
 import java.time.LocalDateTime;
 import java.time.LocalTime;
@@ -19,17 +21,21 @@ import java.util.HashSet;
 import java.util.LinkedList;
 import java.util.List;
 import java.util.Set;
-import javafx.beans.property.SimpleStringProperty;
+import java.util.stream.Collectors;
 import javafx.collections.FXCollections;
 import javafx.collections.ObservableList;
 import javafx.fxml.FXML;
+import javafx.geometry.Insets;
+import javafx.scene.Node;
 import javafx.scene.control.Alert;
 import javafx.scene.control.Alert.AlertType;
 import javafx.scene.control.ChoiceBox;
 import javafx.scene.control.Label;
-import javafx.scene.control.TableColumn;
-import javafx.scene.control.TableView;
+import javafx.scene.control.ScrollPane;
 import javafx.scene.control.TextField;
+import javafx.scene.input.KeyEvent;
+import javafx.scene.input.MouseButton;
+import javafx.scene.layout.GridPane;
 import javafx.scene.layout.VBox;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
@@ -41,117 +47,179 @@ public class RegistrationWindowController {
     private static final Logger LOG = LoggerFactory.getLogger(RegistrationWindowController.class);
 
     private final EmployeeService employeeService;
-
     private final VehicleService vehicleService;
-
+    private final RegistrationService registrationService;
     private final CreateOperationController createOperationController;
+    private final SpringFXMLLoader fxmlLoader;
 
-    private final RegistrationService registrationService;
-    @FXML private VBox registrationWindowVB;
+    @FXML private GridPane root;
+    @FXML private VBox vbVehicles;
+    @FXML private ScrollPane listEmployee;
+    @FXML private ChoiceBox<Integer> cbStart;
+    @FXML private ChoiceBox<Integer> cbEnd;
+    @FXML private Label lVehicles;
+    @FXML private Label lEmployees;
+    @FXML private TextField tfVehicleSearch;
+    @FXML private TextField tfEmployeeSearch;
+    private EmployeeListController employeeListController;
+
+    private Vehicle chosenVehicle;
+    private List<Employee> chosenEmployees = new LinkedList<>();
 
     public RegistrationWindowController(
             EmployeeService employeeService,
             VehicleService vehicleService,
             CreateOperationController createOperationController,
-            RegistrationService registrationService) {
+            RegistrationService registrationService,
+            SpringFXMLLoader fxmlLoader) {
         this.employeeService = employeeService;
         this.vehicleService = vehicleService;
         this.createOperationController = createOperationController;
         this.registrationService = registrationService;
+        this.fxmlLoader = fxmlLoader;
     }
 
-    @FXML private ChoiceBox<Integer> cbStart;
-    @FXML private ChoiceBox<Integer> cbEnd;
-    @FXML private Label lVehicles;
-    @FXML private Label lEmployees;
-    @FXML private TextField tfVehicleSearch;
-    @FXML private TextField tfEmployeeSearch;
-    @FXML private TableView<Vehicle> tvVehicles;
-    @FXML private TableView<Employee> tvEmployees;
-    @FXML private TableColumn<Vehicle, String> tcVehicles;
-    @FXML private TableColumn<Employee, String> tcEmployees;
+    @FXML
+    private void initialize() throws IOException {
+        employeeListController = EmployeeListController.createEmployeeListController(fxmlLoader);
+        employeeListController.setListItemMargins(new Insets(10, 6, 0, 6));
+        //        listEmployee. .getChildren().add(employeeListController.getRootElement());
+        Node emplList = employeeListController.getRootElement();
+        //        emplList.(360);
+        listEmployee.setContent(emplList);
 
-    private Vehicle chosenVehicle;
-    private List<Employee> chosenEmployees = new LinkedList<>();
+        ObservableList<Integer> hours =
+                FXCollections.observableArrayList(
+                        0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20,
+                        21, 22, 23);
+        cbStart.setItems(hours);
+        cbStart.setValue(0);
+        cbEnd.setItems(hours);
+        cbEnd.setValue(12);
+
+        reset();
+    }
+
+    private void updateEmplList() {
+        employeeListController.deselectAllEmployees();
 
-    @FXML
-    private void initialize() {
-        // will have to be replaced for FlowPane
         try {
-            Set<Vehicle> vehicles = vehicleService.list(EnumSet.of(Status.ABGEMELDET));
-            tcVehicles.setCellValueFactory(x -> new SimpleStringProperty(x.getValue().name()));
-            tvVehicles.setItems(FXCollections.observableArrayList(vehicles));
+            Set<Employee> employees =
+                    employeeService
+                            .list()
+                            .stream()
+                            .filter(
+                                    e ->
+                                            e.name()
+                                                    .toLowerCase()
+                                                    .contains(
+                                                            tfEmployeeSearch
+                                                                    .getText()
+                                                                    .toLowerCase()))
+                            .collect(Collectors.toCollection(HashSet::new));
+            employeeListController.setData(
+                    employees,
+                    selection -> {
+                        if (selection == null) {
+                            return;
+                        } else if (chosenEmployees.contains(selection)) {
+                            chosenEmployees.remove(selection);
+                        } else {
+                            chosenEmployees.add(selection);
+                        }
+
+                        StringBuilder text = new StringBuilder();
+                        boolean first = true;
+                        for (Employee employee : chosenEmployees) {
+                            if (!first) {
+                                text.append(", ");
+                            }
+                            text.append(employee.name());
+                            first = false;
+                        }
+                        lEmployees.setText(text.toString());
+                    },
+                    contr -> contr.setSelected(chosenEmployees.contains(contr.getEmployee())));
+
+            employees.forEach(
+                    e -> {
+                        if (chosenEmployees.contains(e)) employeeListController.selectEmployee(e);
+                    });
         } catch (ServiceException e) {
             LOG.warn(
-                    "Caught ServiceException while getting vehicles. Showing it to user. Error message: {}",
+                    "Caught ServiceException while getting employees. Showing it to user. Error message: {}",
                     e.getMessage());
             Alert alert = new Alert(AlertType.ERROR);
-            alert.setTitle("Fahrzeuge - Fehler!");
-            alert.setHeaderText("Beim Auflisten der Fahrzeug ist ein Fehler aufgetreten.");
+            alert.setTitle("Personal - Fehler!");
+            alert.setHeaderText("Beim Auflisten des Personals ist ein Fehler aufgetreten.");
             alert.setContentText(e.getMessage());
             alert.show();
         }
+    }
+
+    private void updateVehList() {
+        vbVehicles.getChildren().clear();
+
         try {
-            Set<Employee> employees = employeeService.list();
-            tcEmployees.setCellValueFactory(x -> new SimpleStringProperty(x.getValue().name()));
-            tvEmployees.setItems(FXCollections.observableArrayList(employees));
+            Set<Vehicle> vehicles = vehicleService.list(EnumSet.of(Status.ABGEMELDET));
+
+            for (Vehicle vehicle : vehicles) {
+                if (!vehicle.name().toLowerCase().contains(tfVehicleSearch.getText().toLowerCase()))
+                    continue;
+
+                VehiclePaneController vp = VehiclePaneController.createVehiclePane();
+                vp.setData(vehicle, false);
+                vbVehicles.getChildren().add(vp.getRootElement());
+
+                vp.getRootElement()
+                        .setOnMouseClicked(
+                                event -> {
+                                    if (event.getButton() == MouseButton.PRIMARY) {
+                                        chosenVehicle = vehicle;
+                                        lVehicles.setText(chosenVehicle.name());
+                                        updateVehList();
+                                    }
+                                });
+                if (chosenVehicle != null && chosenVehicle.id() == vehicle.id())
+                    vp.setSelected(true);
+            }
         } catch (ServiceException e) {
             LOG.warn(
-                    "Caught ServiceException while getting employees. Showing it to user. Error message: {}",
-                    e.getMessage());
+                    "Caught ServiceException while getting vehicles. Showing it to user. Error message: {}",
+                    e);
             Alert alert = new Alert(AlertType.ERROR);
-            alert.setTitle("Personal - Fehler!");
-            alert.setHeaderText("Beim Auflisten des Personals ist ein Fehler aufgetreten.");
+            alert.setTitle("Fahrzeuge - Fehler!");
+            alert.setHeaderText("Beim Auflisten der Fahrzeug ist ein Fehler aufgetreten.");
+            alert.setContentText(e.getMessage());
+            alert.show();
+        } catch (IOException e) {
+            LOG.error(
+                    "Caught IOException while updateVehList. Showing it to user.", e.getMessage());
+            Alert alert = new Alert(AlertType.ERROR);
+            alert.setTitle("Fehler");
             alert.setContentText(e.getMessage());
             alert.show();
         }
-        tvVehicles.setOnMousePressed(
-                mouseEvent -> {
-                    if (mouseEvent.isPrimaryButtonDown() && mouseEvent.getClickCount() == 2) {
-                        chosenVehicle = tvVehicles.getSelectionModel().getSelectedItem();
-                        if (chosenVehicle == null) {
-                            return;
-                        }
-                        lVehicles.setText(chosenVehicle.name());
-                    }
-                });
-        tvEmployees.setOnMousePressed(
-                mouseEvent -> {
-                    if (mouseEvent.isPrimaryButtonDown() && mouseEvent.getClickCount() == 2) {
-                        Employee selection = tvEmployees.getSelectionModel().getSelectedItem();
-                        if (selection == null) {
-                            return;
-                        } else if (chosenEmployees.contains(selection)) {
-                            chosenEmployees.remove(selection);
-                        } else {
-                            chosenEmployees.add(selection);
-                        }
-
-                        StringBuilder text = new StringBuilder();
-                        for (Employee employee : chosenEmployees) {
-                            text.append(employee.name()).append("\n");
-                        }
-                        lEmployees.setText(text.toString());
-                    }
-                });
-        ObservableList<Integer> hours =
-                FXCollections.observableArrayList(
-                        0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20,
-                        21, 22, 23);
-        cbStart.setItems(hours);
-        cbStart.setValue(0);
-        cbEnd.setItems(hours);
-        cbEnd.setValue(12);
     }
 
     public void cancel() {
         LOG.debug("Cancel Button clicked");
-        chosenEmployees.clear();
-        // ((Stage) lVehicles.getScene().getWindow()).close();
+        reset();
         this.setVisible(false);
         createOperationController.setVisible(true);
     }
 
+    private void reset() {
+        chosenEmployees.clear();
+        chosenVehicle = null;
+        tfEmployeeSearch.setText("");
+        tfVehicleSearch.setText("");
+        lEmployees.setText("-");
+        lVehicles.setText("-");
+        updateVehList();
+        updateEmplList();
+    }
+
     public void create() {
         LOG.debug("Create Button clicked");
 
@@ -183,8 +251,8 @@ public class RegistrationWindowController {
             // ((Stage) lVehicles.getScene().getWindow()).close();
             this.setVisible(false);
             createOperationController.setVisible(true);
+            reset();
         } catch (InvalidVehicleException e) {
-            // NOT THROWN ANYWHERE RIGHT NOW
             LOG.info(
                     "Caught InvalidVehicleException. Showing it to user. Error message: {}",
                     e.getClass().toString(),
@@ -194,7 +262,6 @@ public class RegistrationWindowController {
             alert.setHeaderText("Das spezifizierte Fahrzeug ist nicht gültig.");
             alert.setContentText(e.getMessage());
             alert.show();
-            chosenEmployees.clear();
         } catch (ServiceException e) {
             LOG.warn(
                     "Caught ServiceException while getting vehicles. Showing it to user. Error message: {}",
@@ -204,7 +271,6 @@ public class RegistrationWindowController {
             alert.setHeaderText("Beim Erstellen der Anmeldung ist ein Fehler aufgetreten.");
             alert.setContentText(e.getMessage());
             alert.show();
-            chosenEmployees.clear();
         } catch (InvalidRegistrationException e) {
             LOG.info(
                     "Caught InvalidRegistrationException. Showing it to user. Error message: {}",
@@ -215,11 +281,18 @@ public class RegistrationWindowController {
                     "Die gewählte Kombination von Fahrzeug und Personal ist nicht gültig!");
             alert.setContentText(e.getMessage());
             alert.show();
-            chosenEmployees.clear();
         }
     }
 
     public void setVisible(boolean b) {
-        this.registrationWindowVB.setVisible(b);
+        root.setVisible(b);
+    }
+
+    public void tfVehicleSearch_TextChanged(KeyEvent keyEvent) {
+        updateVehList();
+    }
+
+    public void tfEmployeeSearch_TextChanged(KeyEvent keyEvent) {
+        updateEmplList();
     }
 }
diff --git a/src/main/resources/fxml/RegistrationWindow.fxml b/src/main/resources/fxml/RegistrationWindow.fxml
index 1bdbe4d..7f3d391 100644
--- a/src/main/resources/fxml/RegistrationWindow.fxml
+++ b/src/main/resources/fxml/RegistrationWindow.fxml
@@ -3,27 +3,17 @@
 <?import javafx.geometry.Insets?>
 <?import javafx.scene.control.Button?>
 <?import javafx.scene.control.ChoiceBox?>
+<?import javafx.scene.control.Hyperlink?>
 <?import javafx.scene.control.Label?>
-<?import javafx.scene.control.SplitPane?>
-<?import javafx.scene.control.TableColumn?>
-<?import javafx.scene.control.TableView?>
+<?import javafx.scene.control.ScrollPane?>
 <?import javafx.scene.control.TextField?>
 <?import javafx.scene.layout.AnchorPane?>
-<?import javafx.scene.layout.HBox?>
-<?import javafx.scene.layout.VBox?>
+<?import javafx.scene.layout.ColumnConstraints?>
 <?import javafx.scene.layout.GridPane?>
-
+<?import javafx.scene.layout.HBox?>
 <?import javafx.scene.layout.RowConstraints?>
-<?import javafx.scene.layout.ColumnConstraints?>
-<?import javafx.scene.canvas.Canvas?>
-<?import javafx.scene.text.Text?>
-<?import javafx.scene.control.ComboBox?>
-<?import java.lang.String?>
-<?import javafx.scene.control.Hyperlink?>
-<?import javafx.scene.shape.Rectangle?>
-<?import javafx.scene.layout.Region?>
-<?import javafx.scene.layout.Pane?>
-<GridPane stylesheets="@/styles/main.css" styleClass="bg-gray-orange">
+<?import javafx.scene.layout.VBox?>
+<GridPane fx:id="root" stylesheets="@/styles/main.css" styleClass="bg-gray-orange" xmlns="http://javafx.com/javafx/9.0.1" xmlns:fx="http://javafx.com/fxml/1" fx:controller="at.ac.tuwien.sepm.assignment.groupphase.einsatzverwaltung.controller.RegistrationWindowController">
   <rowConstraints>
     <RowConstraints/> <!--"Neue Anmeldung", "von x bis x", Buttons-->
     <RowConstraints/> <!--"Fahrzeug", "Personen"-->
@@ -35,7 +25,7 @@
   <columnConstraints>
     <ColumnConstraints/>
     <ColumnConstraints prefWidth="20"/> <!--The gap between the colums-->
-    <ColumnConstraints/>
+    <ColumnConstraints prefWidth="360"/> <!--EmployeeListItem: 360-->
   </columnConstraints>
   <padding>
     <Insets topRightBottomLeft="12"/>
@@ -48,17 +38,16 @@
   </AnchorPane>
   <VBox spacing="3"> <!--"Neue Anmeldung", "von bis"-->
     <Label text="Neue Anmeldung" styleClass="text-big, text-white, text-bold"/>
-    <HBox spacing="6" alignment="CENTER">
+    <HBox spacing="6" alignment="CENTER_LEFT">
       <Label text="von" styleClass="text-medium, text-white"/>
-      <ComboBox value="8:00" style="-fx-background-color: transparent"
-        styleClass="text-medium, text-white, text-bold"/>
+      <ChoiceBox fx:id="cbStart" value="8:00" styleClass="text-medium, text-bold"/>
       <Label text="bis" styleClass="text-medium, text-white"/>
-      <ComboBox value="16:00"/>
+      <ChoiceBox fx:id="cbEnd" value="16:00" styleClass="text-medium, text-bold"/>
     </HBox>
   </VBox>
   <VBox GridPane.columnIndex="2" GridPane.halignment="RIGHT" alignment="TOP_RIGHT">
-    <Hyperlink text="schließen" styleClass="text-small, text-white"/>
-    <Button text="ERSTELLEN" styleClass="button-main, text-medium"/>
+    <Hyperlink text="schließen" onMouseClicked="#cancel" styleClass="text-small, text-white"/>
+    <Button text="ERSTELLEN" onMouseClicked="#create" styleClass="button-main, text-medium, shadowed"/>
   </VBox>
   <Label text="Fahrzeug" GridPane.rowIndex="1" styleClass="text-big, text-white, text-bold">
     <GridPane.margin>
@@ -71,27 +60,40 @@
       <Insets top="12"/>
     </GridPane.margin>
   </Label>
-  <Label text="ZZZ-40821" GridPane.valignment="TOP" alignment="TOP_LEFT" GridPane.rowIndex="2"
+  <Label fx:id="lVehicles" text="ZZZ-40821" GridPane.valignment="TOP" alignment="TOP_LEFT" GridPane.rowIndex="2"
     styleClass="text-medium, text-white"/>
-  <Label wrapText="true" alignment="TOP_LEFT" prefWidth="200"
+  <Label fx:id="lEmployees" wrapText="true" alignment="TOP_LEFT" prefHeight="20"
     text="Ein seeeeeee eeeeeeeeeee eeeeeeeeeeee eeeeeeeehr langer Text" GridPane.rowIndex="2"
     GridPane.columnIndex="2" styleClass="text-medium, text-white"/>
 
-  <Button GridPane.rowIndex="5" prefHeight="500" text="LISTENPLATZHALTER"/>
-  <Button GridPane.rowIndex="5" prefHeight="500" GridPane.columnIndex="2" text="LISTENPLATZHALTER"/>
+  <ScrollPane GridPane.rowIndex="5">
+    <GridPane.margin>
+      <Insets left="-6" right="-6"/>
+    </GridPane.margin>
+    <VBox fx:id="vbVehicles" spacing="6">
+      <padding>
+        <Insets top="6" left="6" right="6"/>
+      </padding>
+    </VBox>
+  </ScrollPane>
+  <ScrollPane fx:id="listEmployee" hbarPolicy="NEVER" GridPane.rowIndex="5" GridPane.columnIndex="2">
+    <GridPane.margin>
+      <Insets left="-7" right="-20"/>
+    </GridPane.margin>
+  </ScrollPane>
   <VBox GridPane.rowIndex="4" spacing="6" styleClass="bg-white, shadowed">
     <padding>
       <Insets topRightBottomLeft="6"/>
     </padding>
     <Label text="Fahrzeugsuche" styleClass="text-medium"/>
-    <TextField styleClass="text-big, text-bold"/>
+    <TextField fx:id="tfVehicleSearch" onKeyTyped="#tfVehicleSearch_TextChanged" styleClass="text-big, text-bold"/>
   </VBox>
   <VBox GridPane.rowIndex="4" spacing="6" GridPane.columnIndex="2" styleClass="bg-white, shadowed">
     <padding>
       <Insets topRightBottomLeft="6"/>
     </padding>
     <Label text="Personensuche" styleClass="text-medium"/>
-    <TextField styleClass="text-big, text-bold"/>
+    <TextField fx:id="tfEmployeeSearch" onKeyTyped="#tfEmployeeSearch_TextChanged" styleClass="text-big, text-bold"/>
   </VBox>
 </GridPane>
 
diff --git a/src/main/resources/styles/main.css b/src/main/resources/styles/main.css
index fe4a87a..b567666 100644
--- a/src/main/resources/styles/main.css
+++ b/src/main/resources/styles/main.css
@@ -102,3 +102,44 @@
   -fx-font-weight: bold;
 }
 
+/* === text field === */
+.text-field {
+    /*-fx-text-box-border: transparent black black black;*/
+    -fx-background-color: -fx-control-inner-background;
+    /*-fx-background-insets: 0;*/
+    -fx-padding: 1 3 1 3;
+    -fx-border-color: transparent transparent black transparent;
+
+}
+
+.text-field:focused {
+    -fx-focus-color: transparent;
+    -fx-faint-focus-color: transparent;
+}
+
+/* === scroll pane === */
+.scroll-pane {
+  -fx-background-color:transparent;
+}
+
+.scroll-pane .scroll-bar:vertical {
+    -fx-opacity: 0;
+}
+
+/* === choice box ===
+.choice-box {
+  -fx-background-color: transparent;
+  -fx-padding: 2 2 2 2;
+}
+
+.choice-box .label {
+  -fx-text-fill: white;
+}
+
+.choice-box .arrow, .choice-box .arrow-button{
+    -fx-background-color: transparent;
+    -fx-background-insets: 0;
+    -fx-background-radius: 0;
+    -fx-padding: 0;
+}*/
+
-- 
cgit v1.2.3-70-g09d2