Skip to content
Snippets Groups Projects
Controller.java 31 KiB
Newer Older
eyan_'s avatar
eyan_ committed
package com.example.schedulerapp;

eyan_'s avatar
eyan_ committed

import javafx.collections.FXCollections;
import javafx.collections.ObservableList;
import javafx.event.ActionEvent;
import javafx.event.Event;
import javafx.event.EventHandler;
eyan_'s avatar
eyan_ committed
import javafx.fxml.FXML;
import javafx.fxml.FXMLLoader;
import javafx.geometry.Insets;
import javafx.scene.Node;
import javafx.scene.Parent;
eyan_'s avatar
eyan_ committed
import javafx.scene.Scene;
import javafx.scene.control.*;
eyan_'s avatar
eyan_ committed
import javafx.scene.input.MouseEvent;
eyan_'s avatar
eyan_ committed
import javafx.scene.layout.*;
eyan_'s avatar
eyan_ committed
import javafx.scene.paint.Color;
eyan_'s avatar
eyan_ committed
import javafx.stage.Stage;
eyan_'s avatar
eyan_ committed

import java.io.IOException;
eyan_'s avatar
eyan_ committed
import java.text.DecimalFormat;
eyan_'s avatar
eyan_ committed
import java.time.LocalDate;
eyan_'s avatar
eyan_ committed
import java.time.LocalDateTime;
import java.time.LocalTime;
import java.util.*;
eyan_'s avatar
eyan_ committed

eyan_'s avatar
eyan_ committed
public class Controller {
eyan_'s avatar
eyan_ committed
    @FXML
    BorderPane myBorderPane;
    @FXML
    VBox leftSideButtons;
eyan_'s avatar
eyan_ committed
    @FXML
    public BorderPane rootBorderPane;
eyan_'s avatar
eyan_ committed
    @FXML
    TextArea employees;
    @FXML
    private TextField addFirstName;
    @FXML
    private TextField addLastName;
    @FXML
    private TextField removeID;
    @FXML
    Button addShiftSubmitButton;
    @FXML
    DatePicker addShiftDatePicker;
    @FXML
    TextField addShiftStartTime;
    @FXML
    TextField addShiftEndTime;
    @FXML
    ComboBox addShiftEmployeeBox;
    @FXML
    HBox addShiftEmployeeHBox;
eyan_'s avatar
eyan_ committed
    @FXML
    ComboBox removeEmployeeBox;
    @FXML
    ComboBox addShiftStartTimeBox;
    @FXML
    ComboBox addShiftEndTimeBox;
eyan_'s avatar
eyan_ committed
    @FXML
    Label currentDateText;
ArktikHunter's avatar
ArktikHunter committed
    @FXML
    TextField loginField;
    Label loggedIn;
    @FXML
    Label viewing;
    @FXML
    Label loginWarning;
    TextField editEmployeeFirstName;
    @FXML
    TextField editEmployeeLastName;
    @FXML
    TextField editEmployeeEmail;
    @FXML
    TextField editEmployeePhoneNumber;
    @FXML
    TextField editEmployeeAddress;
    @FXML
    ComboBox editEmployeeBox;
    @FXML
    CheckBox editEmployeeManager;
    ChoiceBox<Employee> selectedEmployee;
    @FXML
    Label currentDateTextAvail;
    @FXML
    ComboBox<String> availabilityDayBox;
    @FXML
    ComboBox<String> editAvailabilityStartBox;
    @FXML
    ComboBox<String> editAvailabilityEndBox;
    @FXML
    Label availabilityResult;
    @FXML
    ComboBox editEmployeePositions;
    ComboBox<String> addShiftPositionBox;
    DatePicker timeOffStartDatePicker;
    @FXML
    DatePicker timeOffEndDatePicker;
    @FXML
    TextField timeOffReason;
    @FXML
    Label timeOffResponse;
eyan_'s avatar
eyan_ committed
    @FXML
    TextField addEmployeeEmail;
    @FXML
    TextField addEmployeePhoneNumber;
    @FXML
    CheckBox addEmployeeManager;
eyan_'s avatar
eyan_ committed

eyan_'s avatar
eyan_ committed
    Stage popupStage;
    Scene popupScene;
    Stage popupAvailStage;
    Scene popupAvail;
    Stage popupTimeOffStage;
    Scene popupTimeOff;
    EmployeeView employeeView;
ArktikHunter's avatar
ArktikHunter committed
    AvailabilityView availabilityView;
    PickupView pickupView;
    RequestsView requestView;
    Parent sideSchedulePanel;
    Parent paystubView;
    Parent editEmployeeView;
    Parent addEmployeeView;
    Parent staffPanel;
    Parent removeEmployeeView;
    DatePicker jumpDatePicker;

eyan_'s avatar
eyan_ committed

    // login methods, initializes views too
    public void attemptLogin(Event e) throws Exception {
        if (!model.hasEmployee(Integer.parseInt(loginField.getText()))) {
            loginWarning.setText("Invalid id");
    public void login(Event e) throws Exception {
        //set this employee and manager privileges as appropriate
        int thisEmployee = Integer.parseInt(loginField.getText());
        model.setThisEmployee(thisEmployee);
        model.setSelectedEmployee(thisEmployee);
        model.setIsManager(model.getEmployee(thisEmployee).isManager());
eyan_'s avatar
eyan_ committed

        //load everything
        loadEverything();
        //set up for initial daily schedule view
        Stage stage = (Stage) ((Node) e.getSource()).getScene().getWindow();
        Scene scene = new Scene(root, 800, 600);
        stage.setTitle("Scheduler App");
        stage.setScene(scene);
        stage.show();
        loggedIn.setText("Logged In: " + model.getEmployee(model.getThisEmployee()).toString());
        //set manager specific text
            selectedEmployee.setItems(FXCollections.observableArrayList(model.getAllEmployees()));
            selectedEmployee.getSelectionModel().selectedItemProperty().addListener((observableValue, o, t1) ->
                    model.setSelectedEmployee(selectedEmployee.getSelectionModel().getSelectedItem().getEmployeeID()));
            selectedEmployee.getSelectionModel().select(model.getEmployee(model.getSelectedEmployee()));
    // add components here to be loaded once
    public void loadEverything() throws IOException {
        root = new BorderPane();
        dailyView = new DailyView();
        dailyView.setModel(model);
        model.addSubscriber(dailyView);
        weeklyView = new WeeklyView();
        weeklyView.setModel(model);
        model.addSubscriber(weeklyView);
        employeeView = new EmployeeView();
        employeeView.setModel(model);
        model.addSubscriber(employeeView);
ArktikHunter's avatar
ArktikHunter committed
        availabilityView = new AvailabilityView();
        availabilityView.setModel(model);
        pickupView = new PickupView();
        pickupView.setModel(model);
        requestView = new RequestsView();
        requestView.setModel(model);
ArktikHunter's avatar
ArktikHunter committed
        model.addSubscriber(availabilityView);

        //fxml views
        loadHeader();
        loadScheduleSide();
        loadScheduleBottom();
        loadPaystubView();
        loadEditEmployee();
        loadStaffPanel();
        loadAddEmployee();
        loadRemoveEmployee();
    /* load functions for individual views / panels
        all need to be called in loadEverything
        emp vs manager distinction made here, later can just load
     */
    public void loadHeader() throws IOException {
        if (model.getIsManager()) {      //load manager header
            FXMLLoader headerLoader = new FXMLLoader(this.getClass().getResource("headerManager.fxml"));
            headerLoader.setController(this);
            header = headerLoader.load();
        } else {                          //load employee header
            FXMLLoader headerLoader = new FXMLLoader(this.getClass().getResource("employeeHeader.fxml"));
            //FXMLLoader headerLoader = new FXMLLoader(this.getClass().getResource("headerManager.fxml"));    //for now
            headerLoader.setController(this);
eyan_'s avatar
eyan_ committed

    public void loadScheduleSide() throws IOException {
        //same for both
eyan_'s avatar
eyan_ committed
        FXMLLoader sideLoader = new FXMLLoader(this.getClass().getResource("schedSidePanel.fxml"));
        sideLoader.setController(this);
        sideSchedulePanel = sideLoader.load();
eyan_'s avatar
eyan_ committed
    }
    public void loadScheduleBottom() throws IOException {
            FXMLLoader bottomLoader = new FXMLLoader(this.getClass().getResource("schedBottomPanelManager.fxml"));
            bottomLoader.setController(this);
            bottomPanel = bottomLoader.load();
        } else {
            FXMLLoader bottomLoader = new FXMLLoader(this.getClass().getResource("employeeSchedBottomPanel.fxml"));
            bottomLoader.setController(this);
            bottomPanel = bottomLoader.load();
    public void loadAvailabilityBottomPanel() throws IOException {
        FXMLLoader sideLoader = new FXMLLoader(this.getClass().getResource("availabilityBottomPanel.fxml"));
        sideLoader.setController(this);
        availabilityPanel = sideLoader.load();
eyan_'s avatar
eyan_ committed
    }
    public void loadPaystubView() throws IOException {
        FXMLLoader fxmlLoader = new FXMLLoader(ScheduleApp.class.getResource("paystubView.fxml"));
        fxmlLoader.setController(this);
        paystubView = fxmlLoader.load();
eyan_'s avatar
eyan_ committed
    }
eyan_'s avatar
eyan_ committed

    public void loadEditEmployee() throws IOException {
        FXMLLoader gridLoader = new FXMLLoader(this.getClass().getResource("editEmployee.fxml"));
        gridLoader.setController(this);
        editEmployeeView = gridLoader.load();
eyan_'s avatar
eyan_ committed
    }
    public void loadStaffPanel() throws IOException {
        FXMLLoader sideLoader = new FXMLLoader(this.getClass().getResource("staffManagerSidePanel.fxml"));
        sideLoader.setController(this);
        staffPanel = sideLoader.load();
    public void loadAddEmployee() throws IOException {
        FXMLLoader gridLoader = new FXMLLoader(this.getClass().getResource("addEmployee.fxml"));
        gridLoader.setController(this);
        addEmployeeView = gridLoader.load();
    public void loadRemoveEmployee() throws IOException {
        FXMLLoader gridLoader = new FXMLLoader(this.getClass().getResource("removeEmployee.fxml"));
        gridLoader.setController(this);
        removeEmployeeView = gridLoader.load();
eyan_'s avatar
eyan_ committed
    }
eyan_'s avatar
eyan_ committed

    /* switch to the appropriate view
        same code for emp vs manager, distinction made in load functions
     */
    // schedule tab (default daily view)
        root.setLeft(sideSchedulePanel);
eyan_'s avatar
eyan_ committed
        root.setBottom(bottomPanel);
        root.setCenter(dailyView);
        isDaily = true;
eyan_'s avatar
eyan_ committed
    }
    public void viewScheduleWeekly() {
eyan_'s avatar
eyan_ committed
        root.setCenter(weeklyView);
        root.setBottom(bottomPanel);
        isDaily = false;
    public void viewScheduleDaily() {
        root.setCenter(dailyView);
        root.setBottom(bottomPanel);
        isDaily = true;
    // schedule -> availability
    public void viewAvailability() {
        root.setCenter(availabilityView);
        root.setBottom(availabilityPanel);
        isDaily = false;
    // schedule -> pickups todo
        root.setCenter(pickupView);
eyan_'s avatar
eyan_ committed
        root.setBottom(bottomPanel);
        pickupView.modelChanged();
eyan_'s avatar
eyan_ committed
    }

    public void editAvailability() throws IOException {
        FXMLLoader popupLoader = new FXMLLoader(this.getClass().getResource("availabilityPopup.fxml"));
        popupLoader.setController(this);
        popupAvail = new Scene(popupLoader.load(), 500, 500);
        popupAvailStage = new Stage();
        popupAvailStage.setScene(popupAvail);
        popupAvailStage.show();
    }
    public void requestTimeOff() throws IOException {
        FXMLLoader popupLoader = new FXMLLoader(this.getClass().getResource("timeOffPopup.fxml"));
        popupLoader.setController(this);
        popupTimeOff = new Scene(popupLoader.load(), 500, 500);
        popupTimeOffStage = new Stage();
        popupTimeOffStage.setScene(popupTimeOff);
        popupTimeOffStage.show();
eyan_'s avatar
eyan_ committed
    }
    //add shift popup (manager only)
    public void addShiftClicked() throws IOException {
        FXMLLoader popupLoader = new FXMLLoader(this.getClass().getResource("addShiftPopup.fxml"));
        popupLoader.setController(this);
        popupScene = new Scene(popupLoader.load(), 500, 500);
        popupStage = new Stage();
        popupStage.setScene(popupScene);
        popupStage.show();
eyan_'s avatar
eyan_ committed
    }

    // Paystub tab (employee only)
eyan_'s avatar
eyan_ committed
    public void viewPaystub(LocalDate start, LocalDate end) throws IOException {
eyan_'s avatar
eyan_ committed
        VBox paystubVBox = new VBox();
eyan_'s avatar
eyan_ committed
        root.setLeft(null);
ArktikHunter's avatar
ArktikHunter committed
        root.setBottom(null);
        String[][] payrollInfo = getPayrollInfo(model.getSelectedEmployee(), start, end);
eyan_'s avatar
eyan_ committed
        double grossPay = 0;
        double totalHours = 0;
        for (int i = 0; i < payrollInfo.length; i++) {
eyan_'s avatar
eyan_ committed
            HBox tempHBox = new HBox();
            tempHBox.setSpacing(50);
            tempHBox.setBorder(new Border(new BorderStroke(Color.BLACK,
                    BorderStrokeStyle.SOLID, CornerRadii.EMPTY, BorderWidths.DEFAULT)));
            Label position = new Label("Position: " + payrollInfo[i][0]);
            Label hours = new Label("Hours Worked: " + payrollInfo[i][1]);
            Label wage = new Label("Wage: " + payrollInfo[i][2]);
            Label totalPay = new Label("Total Pay: " + payrollInfo[i][3]);
            tempHBox.getChildren().addAll(position, hours, wage, totalPay);
eyan_'s avatar
eyan_ committed
            paystubVBox.getChildren().add(tempHBox);
            grossPay += Double.parseDouble(payrollInfo[i][3]);
            totalHours += Double.parseDouble(payrollInfo[i][1]);
        }
        HBox totalHBox = new HBox();
        totalHBox.setSpacing(50);
        totalHBox.getChildren().add(new Label("Total Hours Worked: " + totalHours));
        totalHBox.getChildren().add(new Label("Gross Pay: " + grossPay));

        paystubVBox.getChildren().add(totalHBox);


        root.setCenter(paystubVBox);
eyan_'s avatar
eyan_ committed
    }
eyan_'s avatar
eyan_ committed

    public void showPaystubDatePicker() {
eyan_'s avatar
eyan_ committed
        DatePicker startDatePicker = new DatePicker();
        DatePicker endDatePicker = new DatePicker();
        Button confirmButton = new Button("Confirm");
        VBox tempVBox = new VBox(new Label("Choose Start Date Of Pay Period"), startDatePicker,
                new Label("Choose End Date of Pay Period"), endDatePicker, confirmButton);
        Scene tempScene = new Scene(tempVBox, 400, 400);
eyan_'s avatar
eyan_ committed
        Stage tempStage = new Stage();
        tempStage.setScene(tempScene);
        tempStage.show();
        confirmButton.setOnMouseClicked(new EventHandler<MouseEvent>() {
            @Override
            public void handle(MouseEvent mouseEvent) {
                try {
                    if(startDatePicker.getValue().isAfter(endDatePicker.getValue())){
                        showErrorMessage("Start date is after end date. Please try again.");
                    }
                    else {
                        viewPaystub(startDatePicker.getValue(), endDatePicker.getValue());
                        tempStage.close();
                    }
eyan_'s avatar
eyan_ committed
                } catch (IOException e) {
                    e.printStackTrace();
                }
            }
        });
    }

    private void showErrorMessage(String s) {
        Button confirmButton = new Button("Ok");
        Label label = new Label(s);
        VBox tempBox = new VBox(label,confirmButton);
        tempBox.setAlignment(Pos.CENTER);
        Stage tempStage = new Stage();
        Scene tempScene = new Scene(tempBox);
        tempStage.setScene(tempScene);
        tempStage.show();
        confirmButton.setOnMouseClicked(new EventHandler<MouseEvent>() {
            @Override
            public void handle(MouseEvent mouseEvent) {
eyan_'s avatar
eyan_ committed
                tempStage.close();
            }
        });
    }

    private String[][] getPayrollInfo(int selectedEmployee, LocalDate start, LocalDate end) {
eyan_'s avatar
eyan_ committed
        LocalDateTime startDate = LocalDateTime.of(start, LocalTime.MIN);
        LocalDateTime endDate = LocalDateTime.of(end, LocalTime.MAX);
        ArrayList<Shift> shiftsThisWeek = model.getEmployeeShiftsByWeek(selectedEmployee, startDate, endDate);
        HashMap<String, Double> hoursWorked = new HashMap<String, Double>();
eyan_'s avatar
eyan_ committed
        DecimalFormat df = new DecimalFormat("0.00");
        for (int i = 0; i < shiftsThisWeek.size(); i++) {
eyan_'s avatar
eyan_ committed
            Shift tempShift = shiftsThisWeek.get(i);
            LocalDateTime startTime = tempShift.getStart();
            LocalDateTime endTime = tempShift.getEnd();
            String position = tempShift.getPosition();
            int startHour = startTime.getHour();
            int startMin = startTime.getMinute();
            int endHour = endTime.getHour();
            int endMin = endTime.getMinute();
            ;
eyan_'s avatar
eyan_ committed
            double newHours = endHour - startHour;
            double minRemainder;

            if (!hoursWorked.containsKey(position)) {
                hoursWorked.put(position, newHours);
            } else {
eyan_'s avatar
eyan_ committed
                double oldHours = hoursWorked.get(position);
eyan_'s avatar
eyan_ committed
                    minRemainder = 0;
eyan_'s avatar
eyan_ committed
                    minRemainder = 0.5;
                }
                hoursWorked.replace(position, oldHours + newHours + minRemainder);
eyan_'s avatar
eyan_ committed
            }
        }
        String[][] result = new String[hoursWorked.size()][4];
eyan_'s avatar
eyan_ committed
        int index = 0;
        for (Map.Entry<String, Double> entry : hoursWorked.entrySet()) {
            String position = entry.getKey();
            double hours = entry.getValue();
            Float wage = model.getCurrentEmployeeWage();
eyan_'s avatar
eyan_ committed
            result[index][0] = position;
            result[index][1] = String.valueOf(hours);
            result[index][2] = String.valueOf(wage);
            result[index][3] = String.valueOf(df.format(wage * hours));
            index++;
        }
        return result;
eyan_'s avatar
eyan_ committed
    }

    // Payroll tab (manager only)
eyan_'s avatar
eyan_ committed
    public void viewPayroll() throws IOException {
eyan_'s avatar
eyan_ committed
        //viewPaystub();
eyan_'s avatar
eyan_ committed
        //showPayroll(model.getSelectedEmployee());
eyan_'s avatar
eyan_ committed
    }

    // Staff tab (default view staff, manager only)
        root.setLeft(staffPanel);
        root.setCenter(employeeView);
        root.setBottom(null);
eyan_'s avatar
eyan_ committed
    }
    // Staff -> edit employee
    public void viewEditEmployee() {
        root.setCenter(editEmployeeView);
eyan_'s avatar
eyan_ committed
    }
    public void viewAddEmployee() {
        root.setCenter(addEmployeeView);
eyan_'s avatar
eyan_ committed
    }
    // Staff -> remove employee
    public void viewRemoveEmployee() {
        root.setCenter(removeEmployeeView);
    //Staff -> view employees
    public void viewViewEmployees() {
        root.setCenter(employeeView);
        model.notifySubscribers();
    // Requests tab (manager only)
    public void viewRequests() {
        root.setCenter(requestView);
ArktikHunter's avatar
ArktikHunter committed
        root.setLeft(null);
        root.setBottom(null);
        model.notifySubscribers();
        requestView.modelChanged();
    //methods for submitting data
    public void submitTimeOff(MouseEvent event) {
        timeOffResponse.setText(model.addTimeOff(model.getThisEmployee(), timeOffStartDatePicker.getValue().toString(), timeOffEndDatePicker.getValue().toString(), timeOffReason.getText()));
        model.notifySubscribers();
        requestView.modelChanged();
    public void addShiftSubmitClicked(MouseEvent event) {
        String employee = (String) addShiftEmployeeBox.getValue();
        int index = addShiftEmployeeBox.getSelectionModel().getSelectedIndex();
        String startTime = (String) addShiftStartTimeBox.getValue();
        String endTime = (String) addShiftEndTimeBox.getValue();
        LocalDate date = addShiftDatePicker.getValue();
        if(index < 0){
            showErrorMessage("No employee selected. Please try again.");
        }
        else if(addShiftPositionBox.getSelectionModel().getSelectedIndex() < 0){
            showErrorMessage("No position selected. Please try again.");
        }
        else if(startTime == null){
            showErrorMessage("No start time selected. Please try again.");
        }
        else if(endTime == null){
            showErrorMessage("No end time selected. Please try again.");
        }
        else if(date == null){
            showErrorMessage("No date selected. Please try again.");
        }
        else if(Integer.parseInt(endTime) - Integer.parseInt(startTime) < 0){
            showErrorMessage("Start time is after end time. Please try again.");
        }
        else {
            addShiftError.setText(model.addShift(model.getIDbyIndex(index), date.toString(), Integer.parseInt(startTime), Integer.parseInt(endTime)));
        }
        //todo: show result to user?

    public void submitNewAvailability(MouseEvent e) {
        availabilityResult.setText(model.editAvailability(model.getSelectedEmployee(),
                availabilityDayBox.getSelectionModel().getSelectedIndex(),
                Integer.parseInt(editAvailabilityStartBox.getValue()),
                Integer.parseInt(editAvailabilityEndBox.getValue())));
    }
    public void addEmployeeClicked(MouseEvent mouseEvent) {
        String firstName = addFirstName.getText();
        String lastName = addLastName.getText();
eyan_'s avatar
eyan_ committed
        String addEmail = addEmployeeEmail.getText();
        String addPhoneNumber = addEmployeePhoneNumber.getText();
        boolean addManager = addEmployeeManager.isSelected();

        if(firstName.isBlank() || firstName.isEmpty()){
            showErrorMessage("First name is blank. Please try again.");
        }
        else if(lastName.isEmpty() || lastName.isBlank()){
            showErrorMessage("Last name is blank. Please try again.");
        }
        else if(addEmail.isBlank() || addEmail.isBlank()){
            showErrorMessage("Email is blank. Please try again.");
        }
        else if(addPhoneNumber.isBlank() || addPhoneNumber.isEmpty()){
            showErrorMessage("Phone number is blank. Please try again");
        }
        else if(addPhoneNumber.contains(".") || addPhoneNumber.contains("-") || addPhoneNumber.contains(",") || addPhoneNumber.contains("/")){
            showErrorMessage("Phone number has illegal character. Please try again");
        }
        else{
            model.addEmployee(firstName, lastName);
            //int id = model.addEmployee(firstName, lastName);
            //model.editEmployee(id,firstName,lastName,addManager,addEmail,addPhoneNumber,0.0f);

            model.notifySubscribers();
        }
    public void editEmployeeClicked(MouseEvent mouseEvent) {
        int boxId = editEmployeeBox.getSelectionModel().getSelectedIndex();
        String newFirstName = editEmployeeFirstName.getText();
        String newLastName = editEmployeeLastName.getText();
        String newEmail = editEmployeeEmail.getText();
        String newPhoneNumber = editEmployeePhoneNumber.getText();
        boolean newIsManager = editEmployeeManager.isSelected();
        if(boxId < 0){
            showErrorMessage("No employee selected, Please try again.");
        }
        else if(newFirstName.isEmpty() || newFirstName.isBlank()){
            showErrorMessage("First Name is blank. Please try again.");
        }
        else if(newLastName.isEmpty() || newLastName.isBlank()){
            showErrorMessage("Last name is blank. Please try again.");
        }
        else if(newEmail.isBlank() || newEmail.isEmpty()){
            showErrorMessage("Email is blank. Please try again.");
        }
        else if(newPhoneNumber.isEmpty() || newPhoneNumber.isBlank()){
            showErrorMessage("Phone number is blank. Please try again.");
        }
        else if(newPhoneNumber.contains("/") || newPhoneNumber.contains("-") || newPhoneNumber.contains(".") || newPhoneNumber.contains(",")){
            showErrorMessage("Phone number has illegal chatacters. Please try again.");
        }
        else {
            int id = model.getIDbyIndex(boxId);
            Float newWage = Float.parseFloat("0.00");
            System.out.println(model.editEmployee(id, newFirstName, newLastName, newIsManager, newEmail, newPhoneNumber, newWage));

        }
    public void removeEmployeeClicked(MouseEvent mouseEvent) {
eyan_'s avatar
eyan_ committed
        int index = removeEmployeeBox.getSelectionModel().getSelectedIndex();
        String id = String.valueOf(model.getIDbyIndex(index));
        model.removeEmployee(id);
eyan_'s avatar
eyan_ committed

        removeEmployeeBox.getSelectionModel().clearSelection();
    public void prevButtonClicked(MouseEvent event) throws Exception {
        if (isDaily) model.datePrev();
        else model.weekPrev();
eyan_'s avatar
eyan_ committed
        updateCurrentDate(event);
        pickupView.modelChanged();

    public void jumpButtonClicked(MouseEvent event) throws Exception {
        jumpDatePicker = new DatePicker();
        Scene tempScene = new Scene(jumpDatePicker);
        Stage tempStage = new Stage();
        tempStage.setScene(tempScene);
        tempStage.show();
        jumpDatePicker.setOnAction(new EventHandler<ActionEvent>() {
            @Override
            public void handle(ActionEvent actionEvent) {
                model.dateJump(jumpDatePicker.getValue());
                try {
                    updateCurrentDate(actionEvent);
                } catch (Exception e) {
                    e.printStackTrace();
                }
            }
        });
eyan_'s avatar
eyan_ committed
        updateCurrentDate(event);
        model.dateJump(jumpDatePicker.getValue());
        pickupView.modelChanged();

    public void nextButtonClicked(MouseEvent event) throws Exception {
        if (isDaily) model.dateNext();
        else model.weekNext();
eyan_'s avatar
eyan_ committed
        updateCurrentDate(event);
        pickupView.modelChanged();
    public void cancelClicked(MouseEvent e) {
        ((Node) e.getSource()).getScene().getWindow().hide();
    public void logoutClicked(MouseEvent mouseEvent) throws IOException {
        FXMLLoader loginLoader = new FXMLLoader(this.getClass().getResource("login.fxml"));
        loginLoader.setController(this);
        Parent root = loginLoader.load();
        Stage stage = (Stage) ((Node) mouseEvent.getSource()).getScene().getWindow();
        Scene scene = new Scene(root, 800, 600);
        stage.setTitle("Scheduler App");
        stage.setScene(scene);
        stage.show();

    // helper methods for comboboxes
    public void populateEmployeeBox(MouseEvent event) {

eyan_'s avatar
eyan_ committed
        ArrayList<String> aList = model.returnFormattedEmployeeNames();
        ObservableList<String> list = FXCollections.observableArrayList();
        list.addAll(aList);
eyan_'s avatar
eyan_ committed

        ComboBox temp = (ComboBox) event.getSource();
        temp.setItems(list);

    public void populatePositionBox(MouseEvent event) {
        ComboBox test = (ComboBox) event.getSource();
        test.setItems(FXCollections.observableArrayList(model.returnPositions()));

    public void removeEmployeeBoxClicked(MouseEvent event) {
eyan_'s avatar
eyan_ committed
        populateEmployeeBox(event);
    }

    public void populateDaysOfWeek(MouseEvent event) {
        List<String> times = Arrays.asList("Sunday", "Monday", "Tuesday", "Wednesday", "Thursday", "Friday", "Saturday");
        ComboBox box = (ComboBox) event.getSource();
        ObservableList<String> list = FXCollections.observableArrayList(times);
        box.setItems(list);
    }

    public void addShiftTimeBoxClicked(MouseEvent event) {
eyan_'s avatar
eyan_ committed
        ArrayList<String> times = new ArrayList<>();
        for (int i = 8; i < 24; i++) {
eyan_'s avatar
eyan_ committed
            String j = i + "00";
            String k = i + "30";
            if (i < 10) {
                j = "0" + j;
                k = "0" + k;
            }
            times.add(j);
            times.add(k);
        }
        ComboBox box = (ComboBox) event.getSource();
        ObservableList<String> list = FXCollections.observableArrayList(times);
        box.setItems(list);
eyan_'s avatar
eyan_ committed
    }

    public void availabilityTimeBoxClicked(MouseEvent event) {
        ArrayList<String> times = new ArrayList<>();
        for (int i = 0; i < 24; i++) {
            String j = i + "00";
            String k = i + "30";
            if (i < 10) {
                j = "0" + j;
                k = "0" + k;
            }
            times.add(j);
            times.add(k);
eyan_'s avatar
eyan_ committed
        }
        ComboBox box = (ComboBox) event.getSource();
        ObservableList<String> list = FXCollections.observableArrayList(times);
        box.setItems(list);
    public void updateCurrentDate(Event event) throws Exception {
        currentDateText.setText("Current Date: " + model.date.toString());
        currentDateTextAvail.setText("Current Date: " + model.date.toString());
    public void setModel(Model model) {
        this.model = model;
    }
        int boxIndex = editEmployeeBox.getSelectionModel().getSelectedIndex();
            int index = model.getIDbyIndex(boxIndex);
            Employee currentEmployee = model.getEmployee(index);
            editEmployeeFirstName.setText(currentEmployee.getFirstName());
            editEmployeeLastName.setText(currentEmployee.getLastName());
            editEmployeeManager.setSelected(currentEmployee.isManager());
            editEmployeeEmail.setText(currentEmployee.getEmail());
            editEmployeePhoneNumber.setText(currentEmployee.getPhoneNumber());
        }
    }
        VBox tempBox = new VBox();
        tempBox.setPadding(new Insets(20));
        tempBox.setSpacing(20);
        ComboBox tempCombo = new ComboBox();
        Button addPosition = new Button("Add Position");
        Button removePosition = new Button("Remove Position");
        Label result = new Label("");
        tempBox.getChildren().addAll(tempCombo, addPosition, removePosition, result);
        tempCombo.setOnMouseClicked(this::populatePositionBox);

        addPosition.setOnMouseClicked(new EventHandler<MouseEvent>() {
            @Override
            public void handle(MouseEvent mouseEvent) {
                VBox tempVBox = new VBox();
                tempVBox.setSpacing(20);
                tempVBox.setPadding(new Insets(30));
eyan_'s avatar
eyan_ committed
                Label positionLabel = new Label("Enter Position: ");
                TextField tempPositionText = new TextField();
                Label wageLabel = new Label("Enter Wage: ");
                TextField tempWageText = new TextField();
                Button addPositionSubmit = new Button("Submit");
eyan_'s avatar
eyan_ committed
                tempVBox.getChildren().addAll(positionLabel, tempPositionText, wageLabel, tempWageText, addPositionSubmit);
                Scene tempScene = new Scene(tempVBox);
                Stage tempStage = new Stage();
                tempStage.setScene(tempScene);
                tempStage.show();
                addPositionSubmit.setOnMouseClicked(new EventHandler<MouseEvent>() {
                    @Override
                    public void handle(MouseEvent mouseEvent) {
eyan_'s avatar
eyan_ committed
                        String position = tempPositionText.getText();
                        String wage = tempWageText.getText();
                        if(position.isEmpty() || position.isBlank()){
                            showErrorMessage("Position is blank. Please try again.");
                        }
                        else if(wage.isBlank() || wage.isEmpty()){
                            showErrorMessage("Wage is blank. Please try again.");
                        }
                        else{
                            try{
                                Float.parseFloat(wage);
                                System.out.println(model.addPosition(position, Float.parseFloat(wage)));
                                tempStage.close();
                            }catch(NumberFormatException e){
                                showErrorMessage("Wage is not a valid. Please try again.");
                            }
                        }
        removePosition.setOnMouseClicked(e -> {
            if (tempCombo.getValue() == null) result.setText("No position selected.");
            else result.setText(model.removePosition(tempCombo.getSelectionModel().getSelectedItem().toString()));

    public void editEmployeePositionBoxClicked() {
        editEmployeePositions.setOnMouseClicked(this::populatePositionBox);
    }