diff options
Diffstat (limited to 'src')
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; +}*/ + |