package at.ac.tuwien.sepm.assignment.groupphase.missioncontrol.controller; import static at.ac.tuwien.sepm.assignment.groupphase.missioncontrol.controller.Helper.showServiceExceptionAlertAndWait; import static at.ac.tuwien.sepm.assignment.groupphase.missioncontrol.controller.Helper.showSuccessAlertAndWait; import static at.ac.tuwien.sepm.assignment.groupphase.missioncontrol.controller.Helper.showValidationErrorAlertAndWait; import at.ac.tuwien.sepm.assignment.groupphase.exception.InvalidEmployeeException; import at.ac.tuwien.sepm.assignment.groupphase.exception.ServiceException; import at.ac.tuwien.sepm.assignment.groupphase.missioncontrol.dto.Employee; import at.ac.tuwien.sepm.assignment.groupphase.missioncontrol.dto.Employee.EducationLevel; import at.ac.tuwien.sepm.assignment.groupphase.missioncontrol.service.EmployeeService; import at.ac.tuwien.sepm.assignment.groupphase.util.SpringFXMLLoader; import at.ac.tuwien.sepm.assignment.groupphase.util.SpringFXMLLoader.FXMLWrapper; import java.io.IOException; import java.time.LocalDate; import java.util.stream.Collectors; import java.util.stream.Stream; import javafx.collections.FXCollections; import javafx.fxml.FXML; import javafx.scene.Node; import javafx.scene.control.Button; import javafx.scene.control.CheckBox; import javafx.scene.control.ChoiceBox; import javafx.scene.control.Label; import javafx.scene.control.TextField; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import org.springframework.context.annotation.Scope; import org.springframework.stereotype.Controller; @Controller @Scope("prototype") public class CreateNewEmployeeController { private static final Logger LOG = LoggerFactory.getLogger(CreateNewEmployeeController.class); private final EmployeeService employeeService; @FXML private Label lblHeader; @FXML private CheckBox inputIsDriver; @FXML private CheckBox inputIsPilot; @FXML private TextField inputName; @FXML private ChoiceBox inputQualification; @FXML private Button btnCreate; private Node rootElement; private Employee employee; private boolean isEdit; private Runnable consumerCancelClicked; private Runnable consumerCreateClicked; public CreateNewEmployeeController(EmployeeService employeeService) { this.employeeService = employeeService; } @FXML private void initialize() { inputQualification.setItems( FXCollections.observableArrayList( Stream.of( EducationLevel.RS, EducationLevel.NFS, EducationLevel.NKV, EducationLevel.NKA, EducationLevel.NKI, EducationLevel.NA) .map(Enum::toString) .collect(Collectors.toList()))); inputQualification.setValue(EducationLevel.RS.toString()); employee = Employee.builder() .name("") .educationLevel(EducationLevel.RS) .isDriver(false) .isPilot(false) .birthday(LocalDate.MIN) .build(); } @FXML private void onCancelClicked() { LOG.debug("Hyperlink \"abbrechen\" clicked."); if (consumerCancelClicked != null) { consumerCancelClicked.run(); } } @FXML private void onCreateClicked() { LOG.debug("Button {} clicked.", btnCreate.getText()); employee = employee.toBuilder() .name(inputName.getText()) .educationLevel(parseEducationLevel()) .birthday(LocalDate.MIN) // TODO: change UI to include birthday field .isDriver(inputIsDriver.isSelected()) .isPilot(inputIsPilot.isSelected()) .build(); try { if (isEdit) { employeeService.update(employee); } else { employeeService.add(employee); } } catch (InvalidEmployeeException e) { LOG.debug("Validation for Employee failed"); showValidationErrorAlertAndWait(e.getMessage()); return; } catch (ServiceException e) { LOG.error("ServiceException in onCreateClicked(). ", e); showServiceExceptionAlertAndWait( "Der Eintrag konnte nicht gespeichert werden. Bitte versuchen Sie es erneut."); return; } showSuccessAlertAndWait( "Der/die MitarbeiterIn wurde erfolgreich angelegt und gespeichert!"); if (consumerCreateClicked != null) { consumerCreateClicked.run(); } } private EducationLevel parseEducationLevel() { if (inputQualification.getSelectionModel().getSelectedItem() == null) { return EducationLevel.RS; } return EducationLevel.valueOf(inputQualification.getSelectionModel().getSelectedItem()); } private void setData(Employee employee) { isEdit = true; this.employee = employee; inputName.setText(employee.name()); inputQualification.setValue(employee.educationLevel().name()); inputIsDriver.setSelected(employee.isDriver()); inputIsPilot.setSelected(employee.isPilot()); lblHeader.setText("Person bearbeiten"); btnCreate.setText("Speichern"); } public static CreateNewEmployeeController createCreateNewEmployeeController( SpringFXMLLoader fxmlLoader, Employee employee) throws IOException { CreateNewEmployeeController controller = createCreateNewEmployeeController(fxmlLoader); controller.setData(employee); return controller; } public static CreateNewEmployeeController createCreateNewEmployeeController( SpringFXMLLoader fxmlLoader) throws IOException { FXMLWrapper wrapper = fxmlLoader.loadAndWrap( "/fxml/createNewEmployee.fxml", CreateNewEmployeeController.class); Node root = (Node) wrapper.getLoadedObject(); CreateNewEmployeeController controller = wrapper.getController(); controller.rootElement = root; return controller; } public Node getRootElement() { return rootElement; } public void setConsumerCancelClicked(Runnable consumerCancelClicked) { this.consumerCancelClicked = consumerCancelClicked; } public void setConsumerCreateClicked(Runnable consumerCreateClicked) { this.consumerCreateClicked = consumerCreateClicked; } }