Newer
Older
ArktikHunter
committed
import javafx.beans.value.ChangeListener;
import javafx.beans.value.ObservableValue;
import javafx.collections.FXCollections;
import javafx.collections.ObservableList;
import javafx.scene.Node;
import javafx.scene.Parent;
import javafx.scene.control.*;
ArktikHunter
committed
import java.util.Arrays;
import java.util.List;
@FXML
BorderPane myBorderPane;
@FXML
VBox leftSideButtons;
@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;
@FXML
ComboBox addShiftStartTimeBox;
@FXML
ComboBox addShiftEndTimeBox;
@FXML
Label loggedIn;
@FXML
Label viewing;
@FXML
Label loginWarning;
TextField editEmployeeFirstName;
@FXML
TextField editEmployeeLastName;
@FXML
TextField editEmployeeEmail;
@FXML
TextField editEmployeeWage;
@FXML
TextField editEmployeePhoneNumber;
@FXML
TextField editEmployeeAddress;
@FXML
ComboBox editEmployeeBox;
@FXML
CheckBox editEmployeeManager;
ArktikHunter
committed
@FXML
DatePicker timeOffDatePicker;
@FXML
ChoiceBox selectedEmployee;
@FXML
Label currentDateTextAvail;
@FXML
ComboBox<String> availabilityDayBox;
@FXML
ComboBox<String> editAvailabilityStartBox;
@FXML
ComboBox<String> editAvailabilityEndBox;
@FXML
Label availabilityResult;
boolean isDaily;
ArktikHunter
committed
Stage popupAvailStage;
Scene popupAvail;
Stage popupTimeOffStage;
Scene popupTimeOff;
ArktikHunter
committed
DailyView dailyView;
WeeklyView weeklyView;
EmployeeView employeeView;
ArktikHunter
committed
BorderPane root;
Parent header;
Parent sideSchedulePanel;
ArktikHunter
committed
Parent bottomPanel;
Parent paystubView;
Parent editEmployeeView;
Parent addEmployeeView;
Parent staffPanel;
ArktikHunter
committed
Parent availabilityPanel;
Parent removeEmployeeView;
// login methods, initializes views too
public void attemptLogin(Event e) throws Exception {
if (!model.hasEmployee(Integer.parseInt(loginField.getText()))) {
loginWarning.setText("Invalid id");
}
else {
login(e);
}
}
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());
//load everything
loadEverything();
//set up for initial daily schedule view
root.setTop(header);
viewSchedule();
Stage stage = (Stage)((Node)e.getSource()).getScene().getWindow();
Scene scene = new Scene(root, 800, 600);
stage.setTitle("Scheduler App");
stage.setScene(scene);
stage.show();
//set variable text
updateCurrentDate(e);
loggedIn.setText("Logged In: " + model.getEmployeeByID(model.getThisEmployee()));
//set manager specific text
if (model.getIsManager()){
ArktikHunter
committed
selectedEmployee.setItems(FXCollections.observableArrayList(model.getAllEmployees()));
selectedEmployee.getSelectionModel().selectedItemProperty().addListener((observableValue, o, t1) ->
model.setSelectedEmployee(((Employee)selectedEmployee.getSelectionModel().getSelectedItem()).getEmployeeID()));
selectedEmployee.getSelectionModel().select(model.getEmployeeByID(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);
availabilityView = new AvailabilityView();
availabilityView.setModel(model);
model.addSubscriber(availabilityView);
//fxml views
loadHeader();
loadScheduleSide();
loadScheduleBottom();
loadPaystubView();
loadEditEmployee();
loadStaffPanel();
ArktikHunter
committed
loadAvailabilityBottomPanel();
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);
header = headerLoader.load();
}
}
public void loadScheduleSide() throws IOException {
//same for both
FXMLLoader sideLoader = new FXMLLoader(this.getClass().getResource("schedSidePanel.fxml"));
sideLoader.setController(this);
sideSchedulePanel = sideLoader.load();
}
public void loadScheduleBottom() throws IOException {
if (model.getIsManager()){
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();
}
public void loadPaystubView() throws IOException {
FXMLLoader fxmlLoader = new FXMLLoader(ScheduleApp.class.getResource("paystubView.fxml"));
fxmlLoader.setController(this);
paystubView = fxmlLoader.load();
}
public void loadEditEmployee() throws IOException{
FXMLLoader gridLoader = new FXMLLoader(this.getClass().getResource("editEmployee.fxml"));
gridLoader.setController(this);
editEmployeeView = gridLoader.load();
}
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();
/* switch to the appropriate view
same code for emp vs manager, distinction made in load functions
*/
// schedule tab (default daily view)
public void viewSchedule(){
root.setLeft(sideSchedulePanel);
root.setBottom(bottomPanel);
root.setCenter(dailyView);
isDaily = true;
// schedule -> weekly
public void viewScheduleWeekly(){
root.setCenter(weeklyView);
root.setBottom(bottomPanel);
isDaily = false;
// schedule -> daily
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
public void viewPickups(){
root.setCenter(null);
root.setBottom(bottomPanel);
ArktikHunter
committed
}
//schedule popups
ArktikHunter
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();
}
//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();
}
// Paystub tab (employee only)
public void viewPaystub() throws IOException {
root.setCenter(paystubView);
System.out.println("todo: display paystub");
root.setLeft(null);
root.setBottom(null);
}
// Payroll tab (manager only)
public void viewPayroll() {
root.setCenter(null); //todo
System.out.println("todo: display payroll");
}
// Staff tab (default view staff, manager only)
public void viewStaff(){
root.setLeft(staffPanel);
root.setCenter(employeeView);
root.setBottom(null);
}
// Staff -> edit employee
public void viewEditEmployee(){
root.setCenter(editEmployeeView);
}
// Staff -> add employee
public void viewAddEmployee(){
root.setCenter(addEmployeeView);
}
// Staff -> remove employee
public void viewRemoveEmployee(){
root.setCenter(removeEmployeeView);
}
//Staff -> view employees
public void viewViewEmployees(){
root.setCenter(employeeView);
}
ArktikHunter
committed
// Requests tab (manager only)
public void viewRequests() {
System.out.println("todo: display requests");
}
//methods for submitting data
ArktikHunter
committed
public void submitTimeOff(MouseEvent event){
System.out.println("todo");
}
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();
ArktikHunter
committed
String result = model.addShift(model.getIDbyIndex(index),date.toString(),Integer.parseInt(startTime),Integer.parseInt(endTime));
//todo: show result to user?
ArktikHunter
committed
389
390
391
392
393
394
395
396
397
398
399
400
401
402
403
404
405
406
407
408
409
410
411
412
413
414
415
416
417
418
419
420
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();
model.addEmployee(firstName, lastName);
System.out.println("Employee " + firstName + " " + lastName + " added to Staff. Welcome "
+ firstName + "!");
}
public void editEmployeeClicked(MouseEvent mouseEvent) {
int id = model.getIDbyIndex(editEmployeeBox.getSelectionModel().getSelectedIndex());
String newFirstName = editEmployeeFirstName.getText();
String newLastName = editEmployeeLastName.getText();
String newEmail = editEmployeeEmail.getText();
Float newWage = Float.parseFloat(editEmployeeWage.getText());
String newPhoneNumber = editEmployeePhoneNumber.getText();
boolean newIsManager = editEmployeeManager.isSelected();
model.editEmployee(id,newFirstName,newLastName,newIsManager,newEmail,newPhoneNumber,newWage);
System.out.println("edit employee submit clicked");
}
public void removeEmployeeClicked(MouseEvent mouseEvent) {
int index = removeEmployeeBox.getSelectionModel().getSelectedIndex();
String id = String.valueOf(model.getIDbyIndex(index));
model.removeEmployee(id);
removeEmployeeBox.getSelectionModel().clearSelection();
}
public void prevButtonClicked (MouseEvent event) throws Exception {
if (isDaily) model.datePrev();
else model.weekPrev();
public void jumpButtonClicked (MouseEvent event) throws Exception {
System.out.println("jump button clicked");
ArktikHunter
committed
//model.dateJump();
public void nextButtonClicked (MouseEvent event) throws Exception {
if (isDaily) model.dateNext();
else model.weekNext();
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) {
ObservableList<String> list = FXCollections.observableArrayList();
ComboBox test = (ComboBox) event.getSource();
test.setItems(list);
public void populatePositionBox(MouseEvent event) {
ArrayList<String> aList = model.returnPositions();
ObservableList<String> list = FXCollections.observableArrayList();
list.addAll(aList);
ComboBox test = (ComboBox) event.getSource();
test.setItems(list);
}
ArktikHunter
committed
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){
ArrayList<String> times = new ArrayList<>();
for (int i = 8; 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);
}
ComboBox box = (ComboBox) event.getSource();
ObservableList<String> list = FXCollections.observableArrayList(times);
box.setItems(list);
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);
ComboBox box = (ComboBox) event.getSource();
ObservableList<String> list = FXCollections.observableArrayList(times);
box.setItems(list);
// other helper methods
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;
}