diff --git a/pom.xml b/pom.xml index 7144961..d9c3e41 100644 --- a/pom.xml +++ b/pom.xml @@ -61,7 +61,7 @@ default-cli - jira.JiraApp + jira.client.JiraApp app app app diff --git a/src/main/java/jira/controller/ControllerResult.java b/src/main/java/jira/ControllerResult.java similarity index 64% rename from src/main/java/jira/controller/ControllerResult.java rename to src/main/java/jira/ControllerResult.java index 268b29b..473813c 100644 --- a/src/main/java/jira/controller/ControllerResult.java +++ b/src/main/java/jira/ControllerResult.java @@ -1,6 +1,8 @@ -package jira.controller; +package jira; -public class ControllerResult { +import java.io.Serializable; + +public class ControllerResult implements Serializable { public final String message; public final boolean success; diff --git a/src/main/java/jira/RPCMessage.java b/src/main/java/jira/RPCMessage.java new file mode 100644 index 0000000..3194935 --- /dev/null +++ b/src/main/java/jira/RPCMessage.java @@ -0,0 +1,33 @@ +package jira; + +import java.io.Serializable; + +public class RPCMessage implements Serializable { + private final String token; + private final String className; + private final String methodName; + private final Object[] args; + + public RPCMessage(String token, String className, String methodName, Object[] args) { + this.token = token; + this.className = className; + this.methodName = methodName; + this.args = args; + } + + public String getToken() { + return token; + } + + public String getClassName() { + return className; + } + + public String getMethodName() { + return methodName; + } + + public Object[] getArgs() { + return args; + } +} diff --git a/src/main/java/jira/model/Role.java b/src/main/java/jira/Role.java similarity index 92% rename from src/main/java/jira/model/Role.java rename to src/main/java/jira/Role.java index 4b8bee9..02364be 100644 --- a/src/main/java/jira/model/Role.java +++ b/src/main/java/jira/Role.java @@ -1,4 +1,4 @@ -package jira.model; +package jira; public enum Role { ADMIN { diff --git a/src/main/java/jira/JiraApp.java b/src/main/java/jira/client/JiraApp.java similarity index 68% rename from src/main/java/jira/JiraApp.java rename to src/main/java/jira/client/JiraApp.java index bfdd257..f49d6ac 100644 --- a/src/main/java/jira/JiraApp.java +++ b/src/main/java/jira/client/JiraApp.java @@ -1,24 +1,13 @@ -package jira; +package jira.client; import javafx.application.Application; import javafx.fxml.FXMLLoader; import javafx.scene.Scene; import javafx.stage.Stage; -import jira.model.Role; -import jira.model.User; -import jira.model.UserSave; import java.io.IOException; public class JiraApp extends Application { - private static void setup() { - new User("admin", "Password123", "admin@gmail.com", Role.ADMIN); - } - - static { - UserSave.init(); - } - @Override public void start(Stage stage) throws IOException { FXMLLoader fxmlLoader = new FXMLLoader(JiraApp.class.getResource("login.fxml")); @@ -30,7 +19,6 @@ public void start(Stage stage) throws IOException { } public static void main(String[] args) { - setup(); launch(); } } diff --git a/src/main/java/jira/client/view/AdminPanelPageController.java b/src/main/java/jira/client/view/AdminPanelPageController.java new file mode 100644 index 0000000..ee6db97 --- /dev/null +++ b/src/main/java/jira/client/view/AdminPanelPageController.java @@ -0,0 +1,177 @@ +package jira.client.view; + +import javafx.beans.property.ReadOnlyStringWrapper; +import javafx.collections.FXCollections; +import javafx.collections.ObservableList; +import javafx.event.ActionEvent; +import javafx.fxml.FXML; +import javafx.fxml.FXMLLoader; +import javafx.scene.Node; +import javafx.scene.Scene; +import javafx.scene.control.*; +import javafx.scene.layout.BorderPane; +import javafx.stage.Stage; +import javafx.util.Callback; +import jira.client.JiraApp; + +import java.io.IOException; +import java.util.ArrayList; + +public class AdminPanelPageController extends PageController { + private String currentUsername; + + @FXML private BorderPane pane; + @FXML private Label adminUsernameLabel; + @FXML private TableView pendingTeamsTableView; + @FXML private TableView usersTableView; + + protected void setCurrentUsername(String currentUsername) { + this.currentUsername = currentUsername; + } + + public void setup() { + clearTable(); + setAdminUsernameLabel(); + populatePendingTeamsTableView(); + populateUsersTableView(); + } + + private void setAdminUsernameLabel() { + adminUsernameLabel.setText(currentUsername); + } + + private void clearTable() { + pendingTeamsTableView.getItems().clear(); + pendingTeamsTableView.getColumns().clear(); + usersTableView.getItems().clear(); + usersTableView.getColumns().clear(); + } + + private void populateUsersTableView() { +// ArrayList userNames = UserController.getController().getAllUsernames(); + ArrayList userNames = (ArrayList) new RPCExecutor() + .execute("UserController", "getAllUsernames"); + TableColumn username = new TableColumn<>("Username"); + username.setCellValueFactory(param -> new ReadOnlyStringWrapper(param.getValue())); + + usersTableView.getColumns().add(username); + ObservableList rows = FXCollections.observableArrayList(userNames); + usersTableView.setItems(rows); + } + + private void populatePendingTeamsTableView() { +// ArrayList pendingTeamNames = TeamController.getController().getPendingTeams(); + ArrayList pendingTeamNames = (ArrayList) new RPCExecutor() + .execute("TeamController", "getPendingTeams"); + pendingTeamsTableView.setEditable(true); + + TableColumn pendingTeamName = new TableColumn<>("Team Name"); + pendingTeamName.setCellValueFactory(param -> new ReadOnlyStringWrapper(param.getValue())); + + pendingTeamsTableView.getColumns().add(pendingTeamName); + addAcceptButtonToTable(); + addRejectButtonToTable(); + + ObservableList rows = FXCollections.observableArrayList(pendingTeamNames); + pendingTeamsTableView.setItems(rows); + } + + private void addRejectButtonToTable() { + TableColumn columnButtonReject = new TableColumn<>(""); + Callback, TableCell> cellFactoryReject = + param -> new TableCell<>() { + + private final Button btn = new Button(); + + { + btn.setOnAction((ActionEvent event) -> { + String teamName = getTableView().getItems().get(getIndex()); + doReject(teamName); + }); + btn.setText("REJECT"); + btn.setStyle("-fx-background-color: #ff0000"); + } + + @Override + public void updateItem(Void item, boolean empty) { + super.updateItem(item, empty); + if (empty) + setGraphic(null); + else + setGraphic(btn); + } + }; + + columnButtonReject.setCellFactory(cellFactoryReject); + pendingTeamsTableView.getColumns().add(columnButtonReject); + } + + private void addAcceptButtonToTable() { + TableColumn columnButtonAccept = new TableColumn<>(""); + Callback, TableCell> cellFactoryAccept = + param -> new TableCell<>() { + + private final Button btn = new Button(); + + { + btn.setOnAction((ActionEvent event) -> { + String teamName = getTableView().getItems().get(getIndex()); + doAccept(teamName); + }); + btn.setText("ACCEPT"); + btn.setStyle("-fx-background-color: #00ff00"); + } + + @Override + public void updateItem(Void item, boolean empty) { + super.updateItem(item, empty); + if (empty) + setGraphic(null); + else + setGraphic(btn); + } + }; + + columnButtonAccept.setCellFactory(cellFactoryAccept); + pendingTeamsTableView.getColumns().add(columnButtonAccept); + } + + private void doReject(String teamName) { +// TeamController.getController().rejectPendingTeam(currentUsername, teamName); + new RPCExecutor().execute("TeamController", "rejectPendingTeam", currentUsername, teamName); + setup(); + } + + private void doAccept(String teamName) { +// TeamController.getController().acceptPendingTeam(currentUsername, teamName); + new RPCExecutor().execute("TeamController", "acceptPendingTeam", currentUsername, teamName); + setup(); + } + + @FXML + private void openJiraStatistics(ActionEvent event) { + System.out.println("CALLED STATS"); + } + + @FXML + private void back(ActionEvent event) { +// UserController.getController().logout(currentUsername); + new RPCExecutor().execute("UserController", "logout", currentUsername); + currentUsername = null; + gotoLoginPage(event); + } + + private void gotoLoginPage(ActionEvent event) { + try { + FXMLLoader loader = new FXMLLoader(JiraApp.class.getResource("login.fxml")); + Scene scene = new Scene(loader.load()); + Stage stage = (Stage) ((Node) event.getSource()).getScene().getWindow(); + + stage.setScene(scene); + stage.show(); + } + catch (IOException e) { + e.printStackTrace(); + } + } +} diff --git a/src/main/java/jira/client/view/ChangePasswordPopupController.java b/src/main/java/jira/client/view/ChangePasswordPopupController.java new file mode 100644 index 0000000..2f119af --- /dev/null +++ b/src/main/java/jira/client/view/ChangePasswordPopupController.java @@ -0,0 +1,67 @@ +package jira.client.view; + +import javafx.event.ActionEvent; +import javafx.fxml.FXML; +import javafx.scene.Node; +import javafx.scene.control.PasswordField; +import javafx.scene.control.TextArea; +import javafx.scene.image.ImageView; +import javafx.scene.input.KeyEvent; +import javafx.stage.Stage; +import jira.ControllerResult; + +public class ChangePasswordPopupController extends PageController { + private String currentUsername; + private ProfilePageController profilePageController; + + @FXML private PasswordField previousPasswordField; + @FXML private PasswordField newPasswordField; + @FXML private PasswordField confirmNewPasswordField; + @FXML private TextArea errorArea; + @FXML private ImageView passCheckView; + + protected void setCurrentUsername(String currentUsername) { + this.currentUsername = currentUsername; + } + + protected void setProfilePageController(ProfilePageController profilePageController) { + this.profilePageController = profilePageController; + } + + @FXML + private void submitNewPassword(ActionEvent event) { + String previousPassword = getTextFromField(previousPasswordField); + String newPassword = getTextFromField(newPasswordField); +// ControllerResult result = UserController.getController().changeUserPassword( +// currentUsername, previousPassword, newPassword +// ); + ControllerResult result = (ControllerResult) new RPCExecutor() + .execute("UserController", "changeUserPassword", currentUsername, + previousPassword, newPassword); + showResult(errorArea, result); + + if (result.success) + close(event); + } + + @FXML + private void updatePassCheckView(KeyEvent event) { + String newPassword = getTextFromField(newPasswordField); + String confirmNewPassword = getTextFromField(confirmNewPasswordField); + + if (newPassword.isEmpty()) + clearIcon(passCheckView); + else { + if (newPassword.equals(confirmNewPassword)) + setIcon(passCheckView, "password-check-mark.png"); + else + setIcon(passCheckView, "password-cross-mark.png"); + } + } + + private void close(ActionEvent event) { + profilePageController.changePasswordPopupReturn(event); + Stage stage = (Stage) ((Node) event.getSource()).getScene().getWindow(); + stage.close(); + } +} diff --git a/src/main/java/jira/client/view/ChangeUsernamePopupController.java b/src/main/java/jira/client/view/ChangeUsernamePopupController.java new file mode 100644 index 0000000..b22dea0 --- /dev/null +++ b/src/main/java/jira/client/view/ChangeUsernamePopupController.java @@ -0,0 +1,45 @@ +package jira.client.view; + +import javafx.event.ActionEvent; +import javafx.fxml.FXML; +import javafx.scene.Node; +import javafx.scene.control.TextArea; +import javafx.scene.control.TextField; +import javafx.stage.Stage; +import jira.ControllerResult; + +public class ChangeUsernamePopupController extends PageController { + private String currentUsername; + private ProfilePageController profilePageController; + + @FXML private TextField usernameField; + @FXML private TextArea errorArea; + + protected void setCurrentUsername(String currentUsername) { + this.currentUsername = currentUsername; + } + + protected void setProfilePageController(ProfilePageController profilePageController) { + this.profilePageController = profilePageController; + } + + @FXML + private void submitNewUsername(ActionEvent event) { + String newUsername = getTextFromField(usernameField); +// ControllerResult result = UserController.getController().changeUsername(newUsername, currentUsername); + ControllerResult result = (ControllerResult) new RPCExecutor() + .execute("UserController", "changeUsername", newUsername, currentUsername); + showResult(errorArea, result); + + if (result.success) + close(event); + } + + private void close(ActionEvent event) { + profilePageController.setCurrentUsername(getTextFromField(usernameField)); + profilePageController.setup(); + profilePageController.changeUsernamePopupReturn(); + Stage stage = (Stage) ((Node) event.getSource()).getScene().getWindow(); + stage.close(); + } +} diff --git a/src/main/java/jira/client/view/LoginPageController.java b/src/main/java/jira/client/view/LoginPageController.java new file mode 100644 index 0000000..4d37842 --- /dev/null +++ b/src/main/java/jira/client/view/LoginPageController.java @@ -0,0 +1,107 @@ +package jira.client.view; + +import javafx.scene.Node; +import jira.client.JiraApp; +import jira.ControllerResult; +import javafx.fxml.FXML; +import javafx.fxml.FXMLLoader; +import javafx.scene.Scene; +import javafx.scene.control.Label; +import javafx.scene.control.PasswordField; +import javafx.scene.control.TextField; +import javafx.event.ActionEvent; +import javafx.scene.layout.BorderPane; +import javafx.stage.Stage; +import jira.Role; + +import java.io.IOException; + +public class LoginPageController extends PageController { + @FXML private BorderPane pane; + @FXML private Label errorField; + @FXML private TextField usernameField; + @FXML private PasswordField passwordField; + + @FXML + private void login(ActionEvent event) { + String username = getTextFromField(usernameField); + String password = getTextFromField(passwordField); + +// ControllerResult result = UserController.getController().login(username, password); + ControllerResult result = (ControllerResult) new RPCExecutor() + .execute("UserController", "login", username, password); + + showResult(errorField, result); +// String role = UserController.getController().getUserRole(username).message; + String role = ((ControllerResult) new RPCExecutor() + .execute("UserController", "getUserRole", username)).message; + + if (result.success) { + if (role.equals(Role.ADMIN.toString())) + gotoAdminMenu(event, username); + else + gotoMainMenu(event, username, role); + } + } + + @FXML + private void register(ActionEvent event) { + pane.setDisable(true); + + FXMLLoader fxmlLoader = new FXMLLoader(JiraApp.class.getResource("registerAccountPopup.fxml")); + try { + Scene scene = new Scene(fxmlLoader.load()); + Stage newStage = new Stage(); + newStage.setScene(scene); + + RegisterPopupController registerPopupController = fxmlLoader.getController(); + registerPopupController.setLoginPageController(this); + newStage.setOnHidden(e -> {pane.setDisable(false);}); + + newStage.show(); + } + catch (IOException e) { + e.printStackTrace(); + } + } + + private void gotoMainMenu(ActionEvent event, String username, String role) { + try { + FXMLLoader loader = new FXMLLoader(JiraApp.class.getResource("mainMenu.fxml")); + Scene scene = new Scene(loader.load()); + Stage stage = (Stage) ((Node) event.getSource()).getScene().getWindow(); + + MainMenuPageController mainMenuPageController = loader.getController(); + mainMenuPageController.setCurrentUsername(username); + mainMenuPageController.setRole(role); + mainMenuPageController.setup(); + + stage.setScene(scene); + stage.show(); + } + catch (IOException e) { + e.printStackTrace(); + } + } + + private void gotoAdminMenu(ActionEvent event, String username) { + try { + FXMLLoader loader = new FXMLLoader(JiraApp.class.getResource("adminPannel.fxml")); + Scene scene = new Scene(loader.load()); + Stage stage = (Stage) ((Node) event.getSource()).getScene().getWindow(); + + AdminPanelPageController adminPanelPageController = loader.getController(); + adminPanelPageController.setCurrentUsername(username); + adminPanelPageController.setup(); + stage.setScene(scene); + stage.show(); + } + catch (IOException e) { + e.printStackTrace(); + } + } + + protected void registerReturn() { + pane.setDisable(false); + } +} diff --git a/src/main/java/jira/view/MainMenuPageController.java b/src/main/java/jira/client/view/MainMenuPageController.java similarity index 60% rename from src/main/java/jira/view/MainMenuPageController.java rename to src/main/java/jira/client/view/MainMenuPageController.java index 06308d0..945b853 100644 --- a/src/main/java/jira/view/MainMenuPageController.java +++ b/src/main/java/jira/client/view/MainMenuPageController.java @@ -1,12 +1,16 @@ -package jira.view; +package jira.client.view; import javafx.application.Platform; +import javafx.beans.property.ReadOnlyStringWrapper; +import javafx.collections.FXCollections; +import javafx.collections.ObservableList; import javafx.event.ActionEvent; import javafx.fxml.FXML; import javafx.fxml.FXMLLoader; import javafx.scene.Node; import javafx.scene.Scene; import javafx.scene.control.Label; +import javafx.scene.control.TableColumn; import javafx.scene.control.TableView; import javafx.scene.image.Image; import javafx.scene.image.ImageView; @@ -16,14 +20,12 @@ import javafx.scene.input.TransferMode; import javafx.scene.layout.BorderPane; import javafx.stage.Stage; -import jira.JiraApp; -import jira.controller.TeamController; -import jira.controller.UserController; - +import jira.client.JiraApp; import java.io.File; import java.io.FileInputStream; import java.io.IOException; import java.util.ArrayList; +import java.util.Objects; public class MainMenuPageController extends PageController { private String currentUsername; @@ -36,7 +38,7 @@ public class MainMenuPageController extends PageController { @FXML private TableView currentUserTeams; @FXML private Label leaderOrMemberLabel; - protected void initialize() { + protected void setup() { setCurrentUsernameLabel(); setLeaderOrMemberLabel(); setCurrentUserProfilePic(); @@ -46,12 +48,43 @@ protected void initialize() { @FXML private void gotoProfileMenu(ActionEvent event) { - System.out.println("to profile"); + try { + FXMLLoader loader = new FXMLLoader(JiraApp.class.getResource("profileMenu.fxml")); + Scene scene = new Scene(loader.load()); + Stage stage = (Stage) ((Node) event.getSource()).getScene().getWindow(); + + ProfilePageController profilePageController = loader.getController(); + profilePageController.setCurrentRole(role); + profilePageController.setCurrentUsername(currentUsername); + profilePageController.setCurrentUserProfilePic(profilePicView.getImage()); + profilePageController.setup(); + + stage.setScene(scene); + stage.show(); + } + catch (IOException e) { + e.printStackTrace(); + } } @FXML private void gotoTeamMenu(ActionEvent event) { - System.out.println("to team"); + try { + FXMLLoader loader = new FXMLLoader(JiraApp.class.getResource("teamMenu.fxml")); + Scene scene = new Scene(loader.load()); + Stage stage = (Stage) ((Node) event.getSource()).getScene().getWindow(); + + TeamMenuPageController teamMenuPageController = loader.getController(); + teamMenuPageController.setCurrentRole(role); + teamMenuPageController.setCurrentUsername(currentUsername); + teamMenuPageController.setup(); + + stage.setScene(scene); + stage.show(); + } + catch (IOException e) { + e.printStackTrace(); + } } @FXML @@ -74,7 +107,12 @@ private void setCurrentUsernameLabel() { } private void setCurrentUserProfilePic() { - profilePicView.setImage(UserController.getController().getProfilePic(currentUsername)); +// profilePicView.setImage(UserController.getController().getProfilePic(currentUsername)); + Image image = (Image) new RPCExecutor() + .execute("UserController", "getProfilePic", currentUsername); + profilePicView.setImage(Objects.requireNonNullElseGet( + image, () -> new Image(String.valueOf(JiraApp.class.getResource("profile-pics/default-prof-pic.png")))) + ); } private void setLeaderOrMemberLabel() { @@ -82,9 +120,15 @@ private void setLeaderOrMemberLabel() { } private void setCurrentUserTeams() { - ArrayList teamNames = TeamController.getController().showTeamsAffiliated(currentUsername); - for (String teamName: teamNames) - currentUserTeams.getItems().add(teamName); + TableColumn teamNamesColumn = new TableColumn<>("Team Name"); + teamNamesColumn.setCellValueFactory(param -> new ReadOnlyStringWrapper(param.getValue())); + + currentUserTeams.getColumns().add(teamNamesColumn); +// ArrayList teamNames = TeamController.getController().showTeamsAffiliated(currentUsername); + ArrayList teamNames = (ArrayList) new RPCExecutor() + .execute("TeamController", "showTeamsAffiliated", currentUsername); + ObservableList rows = FXCollections.observableArrayList(teamNames); + currentUserTeams.setItems(rows); } protected void setCurrentUsername(String currentUsername) { @@ -150,13 +194,15 @@ private void sendAndSetProfilePic(File fileToSend) throws IOException { new FileInputStream(fileToSend.getAbsolutePath()) ); - UserController.getController().setProfilePic(currentUsername, newImage); +// UserController.getController().setProfilePic(currentUsername, newImage); + new RPCExecutor().execute("UserController", "setProfilePic", currentUsername, newImage); setCurrentUserProfilePic(); } @FXML private void back(ActionEvent event) { - UserController.getController().logout(currentUsername); +// UserController.getController().logout(currentUsername); + new RPCExecutor().execute("UserController", "logout", currentUsername); currentUsername = null; role = null; cachedProfilePicImage = null; diff --git a/src/main/java/jira/view/PageController.java b/src/main/java/jira/client/view/PageController.java similarity index 78% rename from src/main/java/jira/view/PageController.java rename to src/main/java/jira/client/view/PageController.java index ce2e4c9..47856d3 100644 --- a/src/main/java/jira/view/PageController.java +++ b/src/main/java/jira/client/view/PageController.java @@ -1,9 +1,10 @@ -package jira.view; +package jira.client.view; import javafx.fxml.FXML; +import javafx.scene.control.TextArea; import javafx.scene.shape.Circle; -import jira.JiraApp; -import jira.controller.ControllerResult; +import jira.client.JiraApp; +import jira.ControllerResult; import javafx.scene.control.Label; import javafx.scene.control.PasswordField; import javafx.scene.image.Image; @@ -28,6 +29,18 @@ private void setInfoLabel(Label label, String info) { label.setTextFill(Paint.valueOf("#000000")); } + @FXML + private void setInfoLabel(TextArea area, String info) { + area.setText(info); + area.setStyle("-fx-text-fill: #000000"); + } + + @FXML + private void setErrorLabel(TextArea area, String info) { + area.setText(info); + area.setStyle("-fx-text-fill: #E74C3C"); + } + protected void showResult(Label label, ControllerResult result) { if (result.success) setInfoLabel(label, result.message); @@ -35,6 +48,13 @@ protected void showResult(Label label, ControllerResult result) { setErrorLabel(label, result.message); } + protected void showResult(TextArea area, ControllerResult result) { + if (result.success) + setInfoLabel(area, result.message); + else + setErrorLabel(area, result.message); + } + protected String getTextFromField(TextField field) { return field.getText().trim(); } diff --git a/src/main/java/jira/client/view/ProfilePageController.java b/src/main/java/jira/client/view/ProfilePageController.java new file mode 100644 index 0000000..c0c55b4 --- /dev/null +++ b/src/main/java/jira/client/view/ProfilePageController.java @@ -0,0 +1,222 @@ +package jira.client.view; + +import javafx.application.Platform; +import javafx.event.ActionEvent; +import javafx.fxml.FXML; +import javafx.fxml.FXMLLoader; +import javafx.scene.Node; +import javafx.scene.Scene; +import javafx.scene.control.Label; +import javafx.scene.image.Image; +import javafx.scene.image.ImageView; +import javafx.scene.input.DragEvent; +import javafx.scene.input.Dragboard; +import javafx.scene.input.MouseEvent; +import javafx.scene.input.TransferMode; +import javafx.scene.layout.BorderPane; +import javafx.stage.Stage; +import jira.client.JiraApp; +import java.io.File; +import java.io.FileInputStream; +import java.io.IOException; + +public class ProfilePageController extends PageController { + private String currentUsername; + private String currentRole; + private Image cachedProfilePicImage; + + @FXML private BorderPane pane; + @FXML private Label usernameLabel; + @FXML private Label emailLabel; + @FXML private ImageView profilePicImageView; + @FXML private Label scoreLabel; + + protected void setCurrentUsername(String currentUsername) { + this.currentUsername = currentUsername; + } + + protected void setCurrentRole(String currentRole) { + this.currentRole = currentRole; + } + + protected void setCurrentUserProfilePic(Image profilePic) { + profilePicImageView.setImage(profilePic); + } + + protected void setup() { + setUsernameLabel(); + setEmailLabel(); + setScoreLabel(); + } + + private void setUsernameLabel() { + usernameLabel.setText(currentUsername); + } + + private void setEmailLabel() { +// emailLabel.setText(UserController.getController().getEmail(currentUsername)); + emailLabel.setText((String) new RPCExecutor() + .execute("UserController", "getEmail", currentUsername) + ); + } + + private void setScoreLabel() { +// scoreLabel.setText(Integer.toString(UserController.getController().getScore(currentUsername))); + scoreLabel.setText(Integer.toString((int) new RPCExecutor() + .execute("UserController", "getScore", currentUsername)) + ); + } + + @FXML + private void changeUsername(ActionEvent event) { + pane.setDisable(true); + + FXMLLoader fxmlLoader = new FXMLLoader(JiraApp.class.getResource("changeUsernamePopup.fxml")); + try { + Scene scene = new Scene(fxmlLoader.load()); + Stage newStage = new Stage(); + newStage.setScene(scene); + + ChangeUsernamePopupController changeUsernamePopupController = fxmlLoader.getController(); + changeUsernamePopupController.setCurrentUsername(currentUsername); + changeUsernamePopupController.setProfilePageController(this); + newStage.setOnHidden(e -> {pane.setDisable(false);}); + + newStage.show(); + } + catch (IOException e) { + e.printStackTrace(); + } + } + + protected void changePasswordPopupReturn(ActionEvent event) { + pane.setDisable(false); + gotoLoginPage(event); + } + + protected void changeUsernamePopupReturn() { + pane.setDisable(false); + } + + @FXML + private void changePassword(ActionEvent event) { + pane.setDisable(true); + + FXMLLoader fxmlLoader = new FXMLLoader(JiraApp.class.getResource("changePasswordPopup.fxml")); + try { + Scene scene = new Scene(fxmlLoader.load()); + Stage newStage = new Stage(); + newStage.setScene(scene); + + ChangePasswordPopupController changePasswordPopupController = fxmlLoader.getController(); + changePasswordPopupController.setCurrentUsername(currentUsername); + changePasswordPopupController.setProfilePageController(this); + newStage.setOnHidden(e -> {pane.setDisable(false);}); + + newStage.show(); + } + catch (IOException e) { + e.printStackTrace(); + } + } + + @FXML + private void askToUploadPic(MouseEvent event) { + cachedProfilePicImage = profilePicImageView.getImage(); + setGif(profilePicImageView, "ask-to-upload.gif"); + } + + @FXML + private void stopAskingForUploadPic(MouseEvent event) { + setProfPic(profilePicImageView, cachedProfilePicImage); + } + + @FXML + private void askToUploadPicDnD(DragEvent event) { + cachedProfilePicImage = profilePicImageView.getImage(); + setGif(profilePicImageView, "ask-to-upload.gif"); + + if (event.getDragboard().hasFiles()) + event.acceptTransferModes(TransferMode.ANY); + } + + @FXML + private void stopAskingForUploadPicDnD(DragEvent event) { + setProfPic(profilePicImageView, cachedProfilePicImage); + event.consume(); + } + + @FXML + private void uploadPicDnD(DragEvent event) { + final Dragboard db = event.getDragboard(); + + if (db.hasFiles()) { + File file = db.getFiles().get(0); + final boolean isAccepted = file.getName().toLowerCase().endsWith(".png") + || file.getName().toLowerCase().endsWith(".jpeg") + || file.getName().toLowerCase().endsWith(".jpg"); + + if (db.hasFiles() && isAccepted) { + Platform.runLater(() -> { + try { + sendAndSetProfilePic(file); + } catch (IOException e) { + e.printStackTrace(); + } + }); + } + } + + stopAskingForUploadPicDnD(event); + } + + private void sendAndSetProfilePic(File fileToSend) throws IOException { + Image newImage = new Image( + new FileInputStream(fileToSend.getAbsolutePath()) + ); + +// UserController.getController().setProfilePic(currentUsername, newImage); + new RPCExecutor().execute("UserController", "setProfilePic", currentUsername, newImage); + setCurrentUserProfilePic(newImage); + } + + @FXML + private void back(ActionEvent event) { + gotoMainMenu(event); + currentUsername = null; + currentRole = null; + } + + private void gotoMainMenu(ActionEvent event) { + try { + FXMLLoader loader = new FXMLLoader(JiraApp.class.getResource("mainMenu.fxml")); + Scene scene = new Scene(loader.load()); + Stage stage = (Stage) ((Node) event.getSource()).getScene().getWindow(); + + MainMenuPageController mainMenuPageController = loader.getController(); + mainMenuPageController.setCurrentUsername(currentUsername); + mainMenuPageController.setRole(currentRole); + mainMenuPageController.setup(); + + stage.setScene(scene); + stage.show(); + } + catch (IOException e) { + e.printStackTrace(); + } + } + + protected void gotoLoginPage(ActionEvent event) { + try { + FXMLLoader loader = new FXMLLoader(JiraApp.class.getResource("login.fxml")); + Scene scene = new Scene(loader.load()); + Stage stage = (Stage) pane.getScene().getWindow(); + + stage.setScene(scene); + stage.show(); + } + catch (IOException e) { + e.printStackTrace(); + } + } +} \ No newline at end of file diff --git a/src/main/java/jira/client/view/RPCExecutor.java b/src/main/java/jira/client/view/RPCExecutor.java new file mode 100644 index 0000000..67edfc2 --- /dev/null +++ b/src/main/java/jira/client/view/RPCExecutor.java @@ -0,0 +1,79 @@ +package jira.client.view; + +import jira.RPCMessage; + +import java.io.*; +import java.net.Socket; + +public class RPCExecutor { + private static String token; + private static final String serverIp = "127.0.0.1"; + private static final int serverPort = 5000; + + private Socket socket; + private ObjectOutputStream objectOutputStream; + private ObjectInputStream objectInputStream; + + public RPCExecutor() { + try { + setToken(); + closeAll(); + this.socket = new Socket(serverIp, serverPort); + this.objectOutputStream = new ObjectOutputStream(socket.getOutputStream()); + this.objectInputStream = new ObjectInputStream(socket.getInputStream()); + } + catch (IOException e) { + throw new RuntimeException("ERROR"); + } + } + + private void closeAll() { + try { + if (this.socket != null) { + this.socket.close(); + this.objectInputStream.close(); + this.objectOutputStream.close(); + } + } + catch (IOException e) { + e.printStackTrace(); + } + } + + private void setToken() { + if (token != null) + return; + + try { + this.socket = new Socket(serverIp, serverPort); + this.objectOutputStream = new ObjectOutputStream(socket.getOutputStream()); + this.objectInputStream = new ObjectInputStream(socket.getInputStream()); + + RPCMessage rpcMessage = new RPCMessage("", "UserController", "genToken", null); + token = (String) exec(rpcMessage); + } + catch (IOException e) { + e.printStackTrace(); + } + } + + private Object exec(RPCMessage rpcMessage) { + try { + objectOutputStream.writeObject(rpcMessage); + objectOutputStream.flush(); + Object output = objectInputStream.readObject(); + closeAll(); + return output; + } + catch (IOException | ClassNotFoundException e) { + e.printStackTrace(); + } + + return null; + } + + public Object execute(String className, String methodName, Object... args) { + RPCMessage rpcMessage = new RPCMessage(token, className, methodName, args); + return exec(rpcMessage); + } +} diff --git a/src/main/java/jira/view/RegisterPopupController.java b/src/main/java/jira/client/view/RegisterPopupController.java similarity index 86% rename from src/main/java/jira/view/RegisterPopupController.java rename to src/main/java/jira/client/view/RegisterPopupController.java index fffb39f..fcedb0c 100644 --- a/src/main/java/jira/view/RegisterPopupController.java +++ b/src/main/java/jira/client/view/RegisterPopupController.java @@ -1,9 +1,7 @@ -package jira.view; +package jira.client.view; -import javafx.scene.Scene; import javafx.scene.input.KeyEvent; -import jira.controller.ControllerResult; -import jira.controller.UserController; +import jira.ControllerResult; import javafx.event.ActionEvent; import javafx.fxml.FXML; import javafx.scene.Node; @@ -16,7 +14,6 @@ import javafx.stage.WindowEvent; public class RegisterPopupController extends PageController { - private final UserController userController = UserController.getController(); private LoginPageController loginPageController; @FXML private BorderPane pane; @@ -38,7 +35,10 @@ private void register(ActionEvent event) { String pass2 = getTextFromField(pass2Field); String email = getTextFromField(emailField); - ControllerResult result = userController.createUser(username, pass1, pass2, email); +// ControllerResult result = userController.createUser(username, pass1, pass2, email); + ControllerResult result = (ControllerResult) new RPCExecutor() + .execute("UserController", "createUser", username + , pass1, pass2, email); showResult(errors, result); if (result.success) diff --git a/src/main/java/jira/client/view/TeamMenuPageController.java b/src/main/java/jira/client/view/TeamMenuPageController.java new file mode 100644 index 0000000..6b467d3 --- /dev/null +++ b/src/main/java/jira/client/view/TeamMenuPageController.java @@ -0,0 +1,217 @@ +package jira.client.view; + +import javafx.collections.FXCollections; +import javafx.collections.ObservableList; +import javafx.event.ActionEvent; +import javafx.event.EventHandler; +import javafx.fxml.FXML; +import javafx.fxml.FXMLLoader; +import javafx.scene.Node; +import javafx.scene.Scene; +import javafx.scene.control.*; +import javafx.scene.control.cell.PropertyValueFactory; +import javafx.scene.input.MouseButton; +import javafx.scene.input.MouseEvent; +import javafx.scene.layout.BorderPane; +import javafx.stage.Stage; +import javafx.util.Callback; +import jira.Role; +import jira.client.JiraApp; +import jira.ControllerResult; + +import java.io.IOException; +import java.util.ArrayList; + +public class TeamMenuPageController extends PageController { + private String currentUsername; + private String currentRole; + + @FXML private BorderPane pane; + @FXML private TableView listOfTeams; + @FXML private Label leaderOrMemberLabel; + @FXML private TextField teamNameField; + @FXML private TextArea errorField; + + protected void setCurrentUsername(String currentUsername) { + this.currentUsername = currentUsername; + } + + protected void setCurrentRole(String currentRole) { + this.currentRole = currentRole; + } + + private void setLeaderOrMemberLabel() { + leaderOrMemberLabel.setText(currentRole + " of:"); + } + + public void setup() { + setLeaderOrMemberLabel(); + clearTeamListView(); + prepareTeamListView(); + } + + private void clearTeamListView() { + listOfTeams.getItems().clear(); + listOfTeams.getColumns().clear(); + } + + private void prepareTeamListView() { + TableColumn teamNameColumn = new TableColumn<>("Team Name"); + teamNameColumn.setCellValueFactory(new PropertyValueFactory("teamName")); + + TableColumn memberCountColumn = new TableColumn<>("Member Count"); + memberCountColumn.setCellValueFactory(new PropertyValueFactory("memberCount")); + + listOfTeams.setRowFactory(param -> { + TableRow row = new TableRow<>(); + row.setOnMouseClicked(event -> { + if (!row.isEmpty() && event.getButton() == MouseButton.PRIMARY && + event.getClickCount() == 2) { + TeamStats teamStats = row.getItem(); + System.out.println(teamStats.getTeamName()); + if(currentRole.equals(Role.MEMBER.toString())) { + openTeamViewPopup(teamStats); + } + else if (currentRole.equals(Role.LEADER.toString())) { +// System.out.println("HERE"); + openTeamViewPopupLeader(teamStats); + } + } + }); + return row; + }); + + listOfTeams.getColumns().addAll(teamNameColumn, memberCountColumn); + ObservableList teamStats = getTeamListViewItems(); + System.out.println(teamStats.size()); + listOfTeams.setItems(teamStats); + } + + private ObservableList getTeamListViewItems() { + final ObservableList teamStats = FXCollections.observableArrayList(); +// ArrayList teamNames = TeamController.getController().showTeamsAffiliated(currentUsername); + ArrayList teamNames = (ArrayList) new RPCExecutor() + .execute("TeamController", "showTeamsAffiliated", currentUsername); +// ArrayList teamCounts = TeamController.getController().getAffiliatedTeamsMemberCount(currentUsername); + ArrayList teamCounts = (ArrayList) new RPCExecutor() + .execute("TeamController", "getAffiliatedTeamsMemberCount", currentUsername); + for (int i = 0; i < teamNames.size(); i++) { + teamStats.add(new TeamStats(teamNames.get(i), teamCounts.get(i))); + } + + return teamStats; + } + + private void openTeamViewPopup(TeamStats teamStats) { + pane.setDisable(true); + + FXMLLoader fxmlLoader = new FXMLLoader(JiraApp.class.getResource("enterTeamMenu.fxml")); + try { + Scene scene = new Scene(fxmlLoader.load()); + Stage newStage = new Stage(); + newStage.setScene(scene); + + TeamViewPopupController teamViewPopupController = fxmlLoader.getController(); + teamViewPopupController.setTeamMenuPageController(this); + teamViewPopupController.setCurrentUsername(currentUsername); + teamViewPopupController.setSelectedTemName(teamStats.getTeamName()); + newStage.setOnHidden(e -> {pane.setDisable(false);}); + + newStage.show(); + } + catch (IOException e) { + e.printStackTrace(); + } + } + + private void openTeamViewPopupLeader(TeamStats teamStats) { + pane.setDisable(true); + + FXMLLoader fxmlLoader = new FXMLLoader(JiraApp.class.getResource("enterTeamMenuLeader.fxml")); + try { + Scene scene = new Scene(fxmlLoader.load()); + Stage newStage = new Stage(); + newStage.setScene(scene); + + TeamViewPopupControllerLeader teamViewPopupControllerLeader = fxmlLoader.getController(); + teamViewPopupControllerLeader.setTeamMenuPageController(this); + teamViewPopupControllerLeader.setCurrentUsername(currentUsername); + teamViewPopupControllerLeader.setSelectedTemName(teamStats.getTeamName()); + newStage.setOnHidden(e -> {pane.setDisable(false);}); + + newStage.show(); + } + catch (IOException e) { + e.printStackTrace(); + } + } + + protected void teamViewReturn() { + pane.setDisable(false); + } + + @FXML + private void createTeam(ActionEvent event) { + String teamName = getTextFromField(teamNameField); +// ControllerResult result = TeamController.getController().creatTeam(currentUsername, teamName); + ControllerResult result = (ControllerResult) new RPCExecutor() + .execute("TeamController", "creatTeam", currentUsername, teamName); + showResult(errorField, result); + } + + @FXML + private void back(ActionEvent event) { + gotoMainMenu(event); + currentUsername = null; + currentRole = null; + } + + private void gotoMainMenu(ActionEvent event) { + try { + FXMLLoader loader = new FXMLLoader(JiraApp.class.getResource("mainMenu.fxml")); + Scene scene = new Scene(loader.load()); + Stage stage = (Stage) ((Node) event.getSource()).getScene().getWindow(); + + MainMenuPageController mainMenuPageController = loader.getController(); + mainMenuPageController.setCurrentUsername(currentUsername); + mainMenuPageController.setRole(currentRole); + mainMenuPageController.setup(); + + stage.setScene(scene); + stage.show(); + } + catch (IOException e) { + e.printStackTrace(); + } + } + + protected void memberTeamViewPopupReturn() { + pane.setDisable(false); + } + + public class TeamStats { + private String teamName; + private int memberCount; + + public TeamStats(String teamName, int memberCount) { + this.teamName = teamName; + this.memberCount = memberCount; + } + + public int getMemberCount() { + return memberCount; + } + + public String getTeamName() { + return teamName; + } + + public void setTeamName(String teamName) { + this.teamName = teamName; + } + + public void setMemberCount(int memberCount) { + this.memberCount = memberCount; + } + } +} diff --git a/src/main/java/jira/view/TeamViewPopupController.java b/src/main/java/jira/client/view/TeamViewPopupController.java similarity index 58% rename from src/main/java/jira/view/TeamViewPopupController.java rename to src/main/java/jira/client/view/TeamViewPopupController.java index 5cfb726..1f95756 100644 --- a/src/main/java/jira/view/TeamViewPopupController.java +++ b/src/main/java/jira/client/view/TeamViewPopupController.java @@ -1,18 +1,18 @@ -package jira.view; +package jira.client.view; import javafx.collections.FXCollections; import javafx.collections.ObservableList; -import javafx.event.EventHandler; +import javafx.event.ActionEvent; import javafx.fxml.FXML; +import javafx.scene.Node; import javafx.scene.control.*; import javafx.scene.control.cell.PropertyValueFactory; +import javafx.scene.image.Image; import javafx.scene.image.ImageView; -import javafx.scene.input.MouseEvent; import javafx.scene.paint.Paint; -import javafx.util.Callback; -import jira.controller.ControllerResult; -import jira.controller.TeamController; -import jira.controller.UserController; +import javafx.stage.Stage; +import jira.ControllerResult; +import jira.Role; import java.util.ArrayList; @@ -25,7 +25,6 @@ public class TeamViewPopupController extends PageController { @FXML private TableView teamMembersTableView; @FXML private Label teamNameLabel; @FXML private Label teamScoreLabel; - @FXML private Label resultLabel; protected void setTeamMenuPageController(TeamMenuPageController teamMenuPageController) { this.teamMenuPageController = teamMenuPageController; @@ -39,17 +38,27 @@ protected void setCurrentUsername(String currentUsername) { this.currentUsername = currentUsername; } - protected void setCurrentRole(String role) { - this.currentRole = role; + protected void setCurrentRole(String currentRole) { + this.currentRole = currentRole; } - public void initialize() { + protected void setTeamNameLabel(String selectedTemName) { + this.teamNameLabel.setText(selectedTemName); + } + + protected void setTeamScoreLabel(int selectedTeamScore) { + this.teamScoreLabel.setText(Integer.toString(selectedTeamScore)); + } + + public void setup() { prepareTeamMemberTableView(); } private ObservableList getMemberTableViewItems() { final ObservableList memberData = FXCollections.observableArrayList(); - ArrayList memberUsernames = TeamController.getController().getMemberData(selectedTemName); +// ArrayList memberUsernames = TeamController.getController().getMemberData(selectedTemName); + ArrayList memberUsernames = (ArrayList) new RPCExecutor() + .execute("TeamController", "getMemberData", selectedTemName); for (String memberUsername: memberUsernames) memberData.add(new MemberData(memberUsername)); @@ -70,61 +79,49 @@ private void prepareTeamMemberTableView() { TableColumn memberOnlineColumn = new TableColumn<>("Online"); memberOnlineColumn.setCellValueFactory(new PropertyValueFactory<>("online")); - TableColumn buttonColumn = new TableColumn<>("Delete"); - buttonColumn.setCellValueFactory(new PropertyValueFactory<>("deleteButton")); - teamMembersTableView.setItems(getMemberTableViewItems()); teamMembersTableView.getColumns().addAll( - profilePicColumn, memberNameColumn, scoreColumn, memberOnlineColumn, buttonColumn + profilePicColumn, memberNameColumn, scoreColumn, memberOnlineColumn ); } - private void deleteUser(String username) { - ControllerResult result = TeamController.getController().deleteTeamMember(currentUsername, username, selectedTemName); - showResult(resultLabel, result); - } - -// private void openProfileViewPopup(MemberData memberData) { -// -// } -// -// private Callback, TableCell> getMemberListProfilePicCellFactory() { -// return param -> { -// TableCell cell = new TableCell<>(); -// cell.addEventFilter(MouseEvent.MOUSE_ENTERED, new CreateProfileDataPopupHandler()); -// return cell; -// }; -// } -// -// class CreateProfileDataPopupHandler implements EventHandler { -// @Override -// public void handle(MouseEvent event) { -// TableCell cell = (TableCell) event.getSource(); -// int index = cell.getIndex(); -// MemberData memberData = (MemberData) teamMembersTableView.getItems().get(index); -// openProfileViewPopup(memberData); -// } +// private void deleteUser(String username) { +//// ControllerResult result = TeamController.getController().deleteTeamMember(currentUsername, username, selectedTemName); +// ControllerResult result = (ControllerResult) new RPCExecutor() +// .execute("TeamController", "deleteTeamMember", currentUsername +// , username, selectedTemName); +// showResult(resultLabel, result); // } + @FXML + private void close(ActionEvent event) { + teamMenuPageController.setCurrentUsername(currentUsername); + teamMenuPageController.setCurrentRole(currentRole); + teamMenuPageController.setup(); + teamMenuPageController.memberTeamViewPopupReturn(); + Stage stage = (Stage) ((Node) event.getSource()).getScene().getWindow(); + stage.close(); + } + class MemberData { private final ImageView profilePic; private final String memberName; private final int score; private final Label online; - private final Button deleteButton; public MemberData(String username) { - UserController userController = UserController.getController(); - this.memberName = username; this.profilePic = new ImageView(); - setProfPic(profilePic, userController.getProfilePic(username)); + setProfPic(profilePic, (Image) new RPCExecutor() + .execute("UserController", "getProfilePic", username) + ); - this.score = userController.getScore(username); + this.score = (int) new RPCExecutor() + .execute("UserController", "getScore", username); this.online = new Label(); - if (userController.isOnline(username)) { + if ((Boolean) new RPCExecutor().execute("UserController", "isOnline", username)) { this.online.setText("ONLINE"); this.online.setTextFill(Paint.valueOf("#E74C3C")); } @@ -132,22 +129,12 @@ public MemberData(String username) { this.online.setText("OFFLINE"); this.online.setTextFill(Paint.valueOf("#3CE748")); } - - this.deleteButton = new Button(); - this.deleteButton.setOnAction(event -> deleteUser(username)); - - if (!currentRole.equals("Team Leader")) - deleteButton.setDisable(true); } public String getMemberName() { return memberName; } - public Button getDeleteButton() { - return deleteButton; - } - public int getScore() { return score; } diff --git a/src/main/java/jira/client/view/TeamViewPopupControllerLeader.java b/src/main/java/jira/client/view/TeamViewPopupControllerLeader.java new file mode 100644 index 0000000..71896a8 --- /dev/null +++ b/src/main/java/jira/client/view/TeamViewPopupControllerLeader.java @@ -0,0 +1,196 @@ +package jira.client.view; + +import javafx.collections.FXCollections; +import javafx.collections.ObservableList; +import javafx.event.ActionEvent; +import javafx.fxml.FXML; +import javafx.scene.Node; +import javafx.scene.control.Label; +import javafx.scene.control.TableColumn; +import javafx.scene.control.TableView; +import javafx.scene.control.TextField; +import javafx.scene.control.cell.CheckBoxTableCell; +import javafx.scene.control.cell.PropertyValueFactory; +import javafx.scene.image.Image; +import javafx.scene.image.ImageView; +import javafx.scene.paint.Paint; +import javafx.stage.Stage; +import jira.ControllerResult; + +import java.util.ArrayList; +import java.util.HashSet; + +public class TeamViewPopupControllerLeader extends PageController { + private String currentUsername; + private String currentRole; + private String selectedTemName; + private TeamMenuPageController teamMenuPageController; + + @FXML private TableView teamMembersTableView; + @FXML private Label teamNameLabel; + @FXML private Label teamScoreLabel; + @FXML private Label resultLabel; + @FXML private TextField newMemberNameField; + + protected void setTeamMenuPageController(TeamMenuPageController teamMenuPageController) { + this.teamMenuPageController = teamMenuPageController; + } + + protected void setSelectedTemName(String selectedTemName) { + this.selectedTemName = selectedTemName; + } + + protected void setCurrentUsername(String currentUsername) { + this.currentUsername = currentUsername; + } + + protected void setCurrentRole(String currentRole) { + this.currentRole = currentRole; + } + + protected void setTeamNameLabel(String selectedTemName) { + this.teamNameLabel.setText(selectedTemName); + } + + protected void setTeamScoreLabel(int selectedTeamScore) { + this.teamScoreLabel.setText(Integer.toString(selectedTeamScore)); + } + + public void setup() { + prepareTeamMemberTableView(); + } + + private ObservableList getMemberTableViewItems() { + final ObservableList memberData = FXCollections.observableArrayList(); +// ArrayList memberUsernames = TeamController.getController().getMemberData(selectedTemName); + ArrayList memberUsernames = (ArrayList) new RPCExecutor() + .execute("TeamController", "getMemberData", selectedTemName); + + for (String memberUsername: memberUsernames) + memberData.add(new MemberData(memberUsername)); + + return memberData; + } + + private void prepareTeamMemberTableView() { + TableColumn deleteColumn = new TableColumn<>(""); + deleteColumn.setCellValueFactory(new PropertyValueFactory<>("delete")); + deleteColumn.setCellFactory(param -> new CheckBoxTableCell<>()); + + TableColumn profilePicColumn = new TableColumn<>("Profile Picture"); + profilePicColumn.setCellValueFactory(new PropertyValueFactory<>("profilePic")); + + TableColumn memberNameColumn = new TableColumn<>("Member Name"); + memberNameColumn.setCellValueFactory(new PropertyValueFactory<>("memberName")); + + TableColumn scoreColumn = new TableColumn<>("Score"); + scoreColumn.setCellValueFactory(new PropertyValueFactory<>("score")); + + TableColumn memberOnlineColumn = new TableColumn<>("Online"); + memberOnlineColumn.setCellValueFactory(new PropertyValueFactory<>("online")); + + teamMembersTableView.setItems(getMemberTableViewItems()); + teamMembersTableView.getColumns().addAll( + deleteColumn, profilePicColumn, memberNameColumn, scoreColumn, memberOnlineColumn + ); + } + + @FXML + private void deleteSelected(ActionEvent event) { + final HashSet chosenMembers = new HashSet<>(); + for (MemberData memberData: teamMembersTableView.getItems()) + if (memberData.getDelete()) + chosenMembers.add(memberData); + + for (MemberData chosenMember: chosenMembers) + new RPCExecutor().execute("TeamController", "deleteTeamMember", + chosenMember.getMemberName(), currentUsername, selectedTemName); + teamMembersTableView.getItems().removeAll(chosenMembers); + + setup(); + } + + @FXML + private void addMember(ActionEvent event) { + String newMemberName = getTextFromField(newMemberNameField); + ControllerResult result = (ControllerResult) new RPCExecutor() + .execute("TeamController", "addMemberToTeam", currentUsername, + selectedTemName, newMemberName); + showResult(resultLabel, result); + if (result.success) + setup(); + } + + private void deleteUser(String username) { + ControllerResult result = (ControllerResult) new RPCExecutor() + .execute("TeamController", "deleteTeamMember", currentUsername + , username, selectedTemName); + showResult(resultLabel, result); + } + + @FXML + private void close(ActionEvent event) { + teamMenuPageController.setCurrentUsername(currentUsername); + teamMenuPageController.setCurrentRole(currentRole); + teamMenuPageController.setup(); + teamMenuPageController.memberTeamViewPopupReturn(); + Stage stage = (Stage) ((Node) event.getSource()).getScene().getWindow(); + stage.close(); + } + + class MemberData { + private final ImageView profilePic; + private final String memberName; + private final int score; + private final Label online; + private Boolean delete; + + public MemberData(String username) { + this.memberName = username; + + this.profilePic = new ImageView(); + setProfPic(profilePic, (Image) new RPCExecutor() + .execute("UserController", "getProfilePic", username) + ); + + this.score = (int) new RPCExecutor() + .execute("UserController", "getScore", username); + this.online = new Label(); + + if ((Boolean) new RPCExecutor().execute("UserController", "isOnline", username)) { + this.online.setText("ONLINE"); + this.online.setTextFill(Paint.valueOf("#E74C3C")); + } + else { + this.online.setText("OFFLINE"); + this.online.setTextFill(Paint.valueOf("#3CE748")); + } + + this.delete = false; + } + + public String getMemberName() { + return memberName; + } + + public int getScore() { + return score; + } + + public Label getOnline() { + return online; + } + + public ImageView getProfilePic() { + return profilePic; + } + + public Boolean getDelete() { + return delete; + } + + public void setDelete(Boolean delete) { + this.delete = delete; + } + } +} diff --git a/src/main/java/jira/server/JiraServer.java b/src/main/java/jira/server/JiraServer.java new file mode 100644 index 0000000..9ee1665 --- /dev/null +++ b/src/main/java/jira/server/JiraServer.java @@ -0,0 +1,23 @@ +package jira.server; + +import jira.server.controller.RPCServer; +import jira.Role; +import jira.server.model.User; +import jira.server.model.UserSave; + +public class JiraServer { + private static void setup() { + new User("admin", "Password123", "admin@gmail.com", Role.ADMIN); + new User("test", "Password123", "test@gmail.com", Role.MEMBER); + } + + static { + UserSave.init(); + } + + public static void main(String[] args) { + setup(); + RPCServer server = new RPCServer(); + server.serveForever(); + } +} diff --git a/src/main/java/jira/controller/BoardController.java b/src/main/java/jira/server/controller/BoardController.java similarity index 99% rename from src/main/java/jira/controller/BoardController.java rename to src/main/java/jira/server/controller/BoardController.java index fae32a8..14b7489 100644 --- a/src/main/java/jira/controller/BoardController.java +++ b/src/main/java/jira/server/controller/BoardController.java @@ -1,6 +1,8 @@ -package jira.controller; +package jira.server.controller; -import jira.model.*; +import jira.ControllerResult; +import jira.server.model.*; +import jira.Role; public class BoardController { private static final BoardController controller = new BoardController(); diff --git a/src/main/java/jira/controller/Controller.java b/src/main/java/jira/server/controller/Controller.java similarity index 83% rename from src/main/java/jira/controller/Controller.java rename to src/main/java/jira/server/controller/Controller.java index fa3f570..86c9b9c 100644 --- a/src/main/java/jira/controller/Controller.java +++ b/src/main/java/jira/server/controller/Controller.java @@ -1,4 +1,4 @@ -package jira.controller; +package jira.server.controller; public class Controller { private static Controller controller = new Controller(); diff --git a/src/main/java/jira/controller/Privileged.java b/src/main/java/jira/server/controller/Privileged.java similarity index 86% rename from src/main/java/jira/controller/Privileged.java rename to src/main/java/jira/server/controller/Privileged.java index ed06310..845f099 100644 --- a/src/main/java/jira/controller/Privileged.java +++ b/src/main/java/jira/server/controller/Privileged.java @@ -1,4 +1,4 @@ -package jira.controller; +package jira.server.controller; /** * This is just a helper annotation. diff --git a/src/main/java/jira/server/controller/RPCServer.java b/src/main/java/jira/server/controller/RPCServer.java new file mode 100644 index 0000000..342d8ef --- /dev/null +++ b/src/main/java/jira/server/controller/RPCServer.java @@ -0,0 +1,103 @@ +package jira.server.controller; + +import jira.server.model.User; + +import java.io.*; +import java.lang.reflect.InvocationTargetException; +import java.lang.reflect.Method; +import java.net.ServerSocket; +import java.net.Socket; +import java.util.HashMap; +import jira.RPCMessage; + +public class RPCServer { + private static final int PORT = 5000; + private static HashMap tokenMap; + + private ServerSocket serverSocket; + + public static void addToken(String token, User user) { + tokenMap.put(token, user); + } + + public static User getUser(String token) { + return tokenMap.get(token); + } + + public static void deleteToken(String token) { + tokenMap.remove(token); + } + + public RPCServer () { + tokenMap = new HashMap<>(); + + try { + this.serverSocket = new ServerSocket(PORT); + } + catch (IOException e) { + e.printStackTrace(); + } + } + + public void serveForever() { + Runtime.getRuntime().addShutdownHook(new Thread(() -> System.out.println("Server shutting down"))); + + while (true) { + try { + Socket switchedSocket = serverSocket.accept(); + new Thread(() -> handleClient(switchedSocket)).start(); + } + catch (IOException e) { + e.printStackTrace(); + break; + } + } + } + + private void handleClient(Socket switchedSocket) { + try { + ObjectOutputStream objectOutputStream = new ObjectOutputStream(switchedSocket.getOutputStream()); + ObjectInputStream objectInputStream = new ObjectInputStream(switchedSocket.getInputStream()); + + RPCMessage rpcMessage = (RPCMessage) objectInputStream.readObject(); + Object rpcReturn = executeRpc(rpcMessage); + + objectOutputStream.writeObject(rpcReturn); + objectOutputStream.flush(); + + switchedSocket.close(); + objectInputStream.close(); + objectOutputStream.close(); + } + catch (IOException | ClassNotFoundException e) { + e.printStackTrace(); + } + } + + private Object executeRpc(RPCMessage rpcMessage) { + String className = rpcMessage.getClassName(); + String methodName = rpcMessage.getMethodName(); + + try { + Class controllerClass = Class.forName(this.getClass().getPackageName() + "." + className); + Object controllerObject = controllerClass.getMethod("getController").invoke(null); + Method[] methods = controllerObject.getClass().getMethods(); +// System.out.printf("%s.%s\n%n", className, methodName); + for (Method method: methods) + if (getTailName(method.getName()).equals(methodName)) + return method.invoke(controllerObject, rpcMessage.getArgs()); + return null; + } + catch (ClassNotFoundException | IllegalAccessException | + NoSuchMethodException | InvocationTargetException e) { + e.printStackTrace(); + } + + return null; + } + + private String getTailName(String name) { + String[] nameSplit = name.split("\\."); + return nameSplit[nameSplit.length-1]; + } +} diff --git a/src/main/java/jira/controller/TasksController.java b/src/main/java/jira/server/controller/TasksController.java similarity index 96% rename from src/main/java/jira/controller/TasksController.java rename to src/main/java/jira/server/controller/TasksController.java index 1057eeb..009b193 100644 --- a/src/main/java/jira/controller/TasksController.java +++ b/src/main/java/jira/server/controller/TasksController.java @@ -1,9 +1,10 @@ -package jira.controller; +package jira.server.controller; -import jira.model.Priority; -import jira.model.Role; -import jira.model.Task; -import jira.model.User; +import jira.ControllerResult; +import jira.server.model.Priority; +import jira.Role; +import jira.server.model.Task; +import jira.server.model.User; import java.time.LocalDate; import java.time.LocalDateTime; diff --git a/src/main/java/jira/controller/TeamController.java b/src/main/java/jira/server/controller/TeamController.java similarity index 96% rename from src/main/java/jira/controller/TeamController.java rename to src/main/java/jira/server/controller/TeamController.java index 4988a7d..83ad27c 100644 --- a/src/main/java/jira/controller/TeamController.java +++ b/src/main/java/jira/server/controller/TeamController.java @@ -1,15 +1,16 @@ -package jira.controller; +package jira.server.controller; import java.time.LocalDate; import java.time.LocalDateTime; import java.time.format.DateTimeParseException; import java.util.ArrayList; -import jira.model.Board; -import jira.model.Role; -import jira.model.Task; -import jira.model.Team; -import jira.model.User; +import jira.ControllerResult; +import jira.server.model.Board; +import jira.Role; +import jira.server.model.Task; +import jira.server.model.Team; +import jira.server.model.User; public class TeamController { private static final TeamController controller = new TeamController(); @@ -161,6 +162,12 @@ public ControllerResult showTeams(String username){ return new ControllerResult(Team.showTeams(username), true); } + /** + * Lists the name of teams that the user is either the leader + * or a member. + * @param username Username of the one to check + * @return List of team names + */ public ArrayList showTeamsAffiliated(String username) { User user = User.getUserByUsername(username); if (user != null) { diff --git a/src/main/java/jira/controller/UserController.java b/src/main/java/jira/server/controller/UserController.java similarity index 87% rename from src/main/java/jira/controller/UserController.java rename to src/main/java/jira/server/controller/UserController.java index 3241d76..bf65c7b 100644 --- a/src/main/java/jira/controller/UserController.java +++ b/src/main/java/jira/server/controller/UserController.java @@ -1,15 +1,19 @@ -package jira.controller; +package jira.server.controller; import java.time.LocalDate; +import java.util.ArrayList; +import java.util.Random; import javafx.scene.image.Image; -import jira.model.Role; -import jira.model.Task; -import jira.model.Team; -import jira.model.User; -import jira.view.LoginAndRegisterMenu; +import jira.ControllerResult; +import jira.Role; +import jira.server.model.Task; +import jira.server.model.Team; +import jira.server.model.User; public class UserController { + private static final int TOKEN_LEN = 64; + private static UserController controller = new UserController(); public boolean checkLeaderPrivilege(String username) { @@ -24,10 +28,7 @@ public static UserController getController() { } public boolean duplicateUsernames(String username){ - if(User.userExists(username)){ - return true; - } - return false; + return User.userExists(username); } public boolean duplicateEmails(String email){ @@ -140,6 +141,8 @@ else if (!User.isStrongPassword(newPassword)) public ControllerResult changeUsername(String username, String assignedUser){ User user = User.getUserByUsername(assignedUser); + assert user != null; + if (username.length() < 4) return new ControllerResult("Your username must include at least 4 characters!", false); else if (username.equals(assignedUser)) @@ -247,10 +250,6 @@ public void saveUsers(){ User.saveUser(); } - public void updateAssignedUser(String username) { - LoginAndRegisterMenu.assignedUser = username; - } - public ControllerResult sendMessage(String username,String message, String teamName){ if(!User.userExists(username)){ return new ControllerResult("no user exists with username!",false); @@ -269,29 +268,56 @@ public ControllerResult getUserRole(String username) { } public Image getProfilePic(String username) { + System.out.println(username); User user = User.getUserByUsername(username); - if (user != null) - return user.getProfiePic(); - return null; + assert user != null; + return user.getProfiePic(); } public void setProfilePic(String username, Image newImage) { User user = User.getUserByUsername(username); - if (user != null) - user.setProfilePic(newImage); + assert user != null; + user.setProfilePic(newImage); } public int getScore(String username) { User user = User.getUserByUsername(username); - if (user != null) - return user.getScore(); - throw new RuntimeException("WHAT?"); + assert user != null; + return user.getScore(); } public boolean isOnline(String username) { User user = User.getUserByUsername(username); - if (user != null) - return user.loggedIn(); - throw new RuntimeException("WHAT?"); + assert user != null; + return user.loggedIn(); + } + + public ArrayList getAllUsernames() { + return User.getAllUsernames(); + } + + public String getEmail(String currentUsername) { + User user = User.getUserByUsername(currentUsername); + assert user != null; + return user.getEmail(); + } + + public String genToken() { +// User user = User.getUserByUsername(username); +// if (user != null) { + int leftLimit = 97; + int rightLimit = 122; + Random random = new Random(); + + // RPCServer.addToken(token, user); + + return random.ints(leftLimit, rightLimit + 1) + .limit(TOKEN_LEN) + .collect(StringBuilder::new, StringBuilder::appendCodePoint, StringBuilder::append) + .toString(); +// } +// else { +// return null; +// } } } diff --git a/src/main/java/jira/model/Board.java b/src/main/java/jira/server/model/Board.java similarity index 99% rename from src/main/java/jira/model/Board.java rename to src/main/java/jira/server/model/Board.java index 0fac811..d26e55f 100644 --- a/src/main/java/jira/model/Board.java +++ b/src/main/java/jira/server/model/Board.java @@ -1,4 +1,4 @@ -package jira.model; +package jira.server.model; import java.time.LocalDate; import java.time.LocalDateTime; diff --git a/src/main/java/jira/model/Notification.java b/src/main/java/jira/server/model/Notification.java similarity index 95% rename from src/main/java/jira/model/Notification.java rename to src/main/java/jira/server/model/Notification.java index 74f5ebf..f9c7005 100644 --- a/src/main/java/jira/model/Notification.java +++ b/src/main/java/jira/server/model/Notification.java @@ -1,4 +1,4 @@ -package jira.model; +package jira.server.model; import java.time.LocalDateTime; diff --git a/src/main/java/jira/model/Priority.java b/src/main/java/jira/server/model/Priority.java similarity index 93% rename from src/main/java/jira/model/Priority.java rename to src/main/java/jira/server/model/Priority.java index b4aaffc..cc39913 100644 --- a/src/main/java/jira/model/Priority.java +++ b/src/main/java/jira/server/model/Priority.java @@ -1,4 +1,4 @@ -package jira.model; +package jira.server.model; public enum Priority { LOWEST(0) { diff --git a/src/main/java/jira/model/Task.java b/src/main/java/jira/server/model/Task.java similarity index 99% rename from src/main/java/jira/model/Task.java rename to src/main/java/jira/server/model/Task.java index b33e0e1..1cbf982 100644 --- a/src/main/java/jira/model/Task.java +++ b/src/main/java/jira/server/model/Task.java @@ -1,9 +1,10 @@ -package jira.model; +package jira.server.model; import java.time.LocalDateTime; import java.time.format.DateTimeFormatter; import java.util.ArrayList; import java.util.HashMap; +import jira.Role; /** * @author Arvin diff --git a/src/main/java/jira/model/TaskState.java b/src/main/java/jira/server/model/TaskState.java similarity index 91% rename from src/main/java/jira/model/TaskState.java rename to src/main/java/jira/server/model/TaskState.java index 07c61b5..00e2690 100644 --- a/src/main/java/jira/model/TaskState.java +++ b/src/main/java/jira/server/model/TaskState.java @@ -1,4 +1,4 @@ -package jira.model; +package jira.server.model; public enum TaskState { FAILED { diff --git a/src/main/java/jira/model/Team.java b/src/main/java/jira/server/model/Team.java similarity index 85% rename from src/main/java/jira/model/Team.java rename to src/main/java/jira/server/model/Team.java index 054d138..bf94658 100644 --- a/src/main/java/jira/model/Team.java +++ b/src/main/java/jira/server/model/Team.java @@ -1,28 +1,35 @@ -package jira.model; +package jira.server.model; import java.util.ArrayList; import java.util.Comparator; import java.util.HashMap; import java.util.regex.Pattern; - +import jira.Role; public class Team { - private static ArrayList teams = new ArrayList<>(); - private static ArrayList pendingTeams = new ArrayList<>(); + private static final ArrayList teams = new ArrayList<>(); + private static final ArrayList pendingTeams = new ArrayList<>(); private static int idCounter = 0; private final int id; private String name; private User leader; - private ArrayList members; - private ArrayList chat; + private final ArrayList members; + private final ArrayList chat; public Team(String name, User leader) { this.id = assignId(); this.name = name; this.leader = leader; - this.members = new ArrayList(); - this.chat = new ArrayList(); + this.members = new ArrayList<>(); + this.chat = new ArrayList<>(); Board.initTeamBoard(name); + removeNewLeaderMemberTeams(leader); + } + + private void removeNewLeaderMemberTeams(User user) { + for (Team team: teams) + if (team.isMember(user)) + team.deleteMember(user); } private static int assignId() { @@ -241,22 +248,22 @@ public String showTasks() { if(Board.getTeamBoards(name).size()<1){ return "no task yet"; } - String output = ""; + StringBuilder output = new StringBuilder(); int i=1; ArrayList allTasks; for(Board board : Board.getTeamBoards(name)){ allTasks = board.getTasks(); for(Task task : allTasks){ - output += i+"."+task.getTitle()+": id "+task.getId()+",creation date : "+task.getCreationDate(); - output += ",deadline :"+task.getDeadline()+",assign to :"; + output.append(i).append(".").append(task.getTitle()).append(": id ").append(task.getId()).append(",creation date : ").append(task.getCreationDate()); + output.append(",deadline :").append(task.getDeadline()).append(",assign to :"); i++; for(User user : task.getAssignedUsers().keySet()){ - output += user.getUsername()+" "; + output.append(user.getUsername()).append(" "); } - output += ",priority :"+task.getPriority().toString()+"\n"; + output.append(",priority :").append(task.getPriority().toString()).append("\n"); } } - return output; + return output.toString(); } public void addBoard(String boardName) { @@ -294,13 +301,13 @@ public void changeTaskCategoryInBoard(String category, String taskTitle, String public String showBoardTaskByCategory(String boardName, String category) { Task task = Task.getTaskByTitle(name, category); - String output = task.getTitle()+": id"+task.getId()+",creation date : "; - output += task.getCreationDate()+",deadline :"+task.getDeadline()+",assign to :"; + StringBuilder output = new StringBuilder(task.getTitle() + ": id" + task.getId() + ",creation date : "); + output.append(task.getCreationDate()).append(",deadline :").append(task.getDeadline()).append(",assign to :"); for(User user : task.getAssignedUsers().keySet()){ - output += user.getUsername()+" "; + output.append(user.getUsername()).append(" "); } - output += ",priority :"+task.getPriority().toString(); - return output; + output.append(",priority :").append(task.getPriority().toString()); + return output.toString(); } public String showBoard(String boardName) { @@ -310,13 +317,13 @@ public String showBoard(String boardName) { public String showTask(int id) { Task task = Task.getTaskById(id); - String output = task.getTitle()+": id"+task.getId()+",creation date : "; - output += task.getCreationDate()+",deadline :"+task.getDeadline()+",assign to :"; + StringBuilder output = new StringBuilder(task.getTitle() + ": id" + task.getId() + ",creation date : "); + output.append(task.getCreationDate()).append(",deadline :").append(task.getDeadline()).append(",assign to :"); for(User user : task.getAssignedUsers().keySet()){ - output += user.getUsername()+" "; + output.append(user.getUsername()).append(" "); } - output += ",priority :"+task.getPriority().toString(); - return output; + output.append(",priority :").append(task.getPriority().toString()); + return output.toString(); } public ArrayList getMember() { @@ -354,6 +361,10 @@ public void deleteMember(String username) { members.remove(User.getUserByUsername(username)); } + public void deleteMember(User user) { + members.remove(user); + } + public void promoteMember(String username) { leader = User.getUserByUsername(username); } diff --git a/src/main/java/jira/model/User.java b/src/main/java/jira/server/model/User.java similarity index 94% rename from src/main/java/jira/model/User.java rename to src/main/java/jira/server/model/User.java index 70d587c..1d44bc3 100644 --- a/src/main/java/jira/model/User.java +++ b/src/main/java/jira/server/model/User.java @@ -1,9 +1,8 @@ -package jira.model; +package jira.server.model; import javafx.scene.image.Image; -import jira.JiraApp; -import jira.controller.UserController; -import jira.view.PageController; +import jira.Role; +import jira.server.JiraServer; import java.io.Serializable; import java.time.LocalDateTime; @@ -30,6 +29,14 @@ public class User implements Serializable { private boolean loggedIn; private Image profiePic; + public static ArrayList getAllUsernames() { + ArrayList usernames = new ArrayList<>(); + for (User user: UserSave.getUsers()) + if (user.getRole() != Role.ADMIN) + usernames.add(user.getUsername()); + return usernames; + } + public User(String username, String password, String email, Role role) { this.username = username; this.password = password; @@ -45,9 +52,9 @@ public User(String username, String password, String email, Role role) { this.score = 0; this.banned = false; this.loggedIn = false; - this.profiePic = new Image( - String.valueOf(JiraApp.class.getResource(PATH_TO_PROFILE_PICS + "default-prof-pic.png")) - ); +// this.profiePic = new Image( +// String.valueOf(JiraServer.class.getResource(PATH_TO_PROFILE_PICS + "default-prof-pic.png")) +// ); UserSave.addUser(this); usedPassword.add(password); } @@ -98,7 +105,6 @@ public static boolean usernameHasSpecialChars(String username) { public void changeUsername(String username){ this.username = username; - UserController.getController().updateAssignedUser(username); } public static User getUserByUsername(String username) { @@ -180,6 +186,10 @@ public String getUsername() { return username; } + public String getEmail() { + return email; + } + public ArrayList getTeams() { return teams; } public void addToTeams(Team team) { diff --git a/src/main/java/jira/model/UserSave.java b/src/main/java/jira/server/model/UserSave.java similarity index 95% rename from src/main/java/jira/model/UserSave.java rename to src/main/java/jira/server/model/UserSave.java index 3b6753c..11161e1 100644 --- a/src/main/java/jira/model/UserSave.java +++ b/src/main/java/jira/server/model/UserSave.java @@ -1,5 +1,5 @@ -package jira.model; -import jira.controller.UserController; +package jira.server.model; +import jira.server.controller.UserController; import java.io.*; import java.util.ArrayList; diff --git a/src/main/java/jira/view/AdminPanelPageController.java b/src/main/java/jira/view/AdminPanelPageController.java deleted file mode 100644 index ed1f168..0000000 --- a/src/main/java/jira/view/AdminPanelPageController.java +++ /dev/null @@ -1,106 +0,0 @@ -package jira.view; - -import javafx.collections.FXCollections; -import javafx.collections.ObservableList; -import javafx.event.ActionEvent; -import javafx.fxml.FXML; -import javafx.scene.control.*; -import javafx.scene.control.cell.PropertyValueFactory; -import javafx.scene.layout.BorderPane; -import jira.controller.TeamController; - -import java.util.ArrayList; - -public class AdminPanelPageController extends PageController { - private String currentUsername; - - @FXML private BorderPane pane; - @FXML private Label adminUsernameLabel; - @FXML private TableView pendingTeamsTableView; - @FXML private TableView usersTableView; - - protected void setCurrentUsername(String currentUsername) { - this.currentUsername = currentUsername; - } - - public void initialize() { - clearTable(); - setAdminUsernameLabel(); - populatePendingTeamsTableView(); - } - - private void setAdminUsernameLabel() { - adminUsernameLabel.setText(currentUsername); - } - - private void clearTable() { - pendingTeamsTableView.getItems().clear(); - pendingTeamsTableView.getColumns().clear(); - } - - private void populatePendingTeamsTableView() { - ArrayList pendingTeamNames = TeamController.getController().getPendingTeams(); - - pendingTeamsTableView.setEditable(true); - TableColumn pendingTeamName = pendingTeamsTableView.getColumns().get(0); - pendingTeamName.setCellFactory(new PropertyValueFactory("pendingTeamName")); - TableColumn rejectButton = pendingTeamsTableView.getColumns().get(1); - rejectButton.setCellFactory(new PropertyValueFactory("rejectTeamButton")); - TableColumn acceptButton = pendingTeamsTableView.getColumns().get(2); - acceptButton.setCellFactory(new PropertyValueFactory("acceptTeamButton")); - - ObservableList rows = FXCollections.observableArrayList(); - for (int i = 0; i < pendingTeamNames.size(); i++) - rows.add(new PendingTeamRow(pendingTeamNames.get(i), i)); - - pendingTeamsTableView.setItems(rows); - } - - class PendingTeamRow { - private final String pendingTeamName; - private final Button rejectTeamButton; - private final Button acceptTeamButton; - private final int rowIndex; - - public PendingTeamRow(String pendingTeamName, int rowIndex) { - this.rowIndex = rowIndex; - this.pendingTeamName = pendingTeamName; - - this.rejectTeamButton = new Button(); - rejectTeamButton.setText("REJECT"); - rejectTeamButton.setStyle("-fx-background-color: #ff0000"); - rejectTeamButton.setOnAction(this::doReject); - - this.acceptTeamButton = new Button(); - acceptTeamButton.setText("ACCEPT"); - acceptTeamButton.setStyle("-fx-background-color: #00ff00"); - acceptTeamButton.setOnAction(this::doAccept); - } - - private void doReject(ActionEvent event) { - TeamController.getController().rejectPendingTeam(currentUsername, pendingTeamName); - initialize(); - } - - private void doAccept(ActionEvent event) { - TeamController.getController().acceptPendingTeam(currentUsername, pendingTeamName); - initialize(); - } - - public String getPendingTeamName() { - return pendingTeamName; - } - - public Button getRejectTeamButton() { - return rejectTeamButton; - } - - public Button getAcceptTeamButton() { - return acceptTeamButton; - } - - public int getRowIndex() { - return rowIndex; - } - } -} diff --git a/src/main/java/jira/view/BoardMenu.java b/src/main/java/jira/view/BoardMenu.java deleted file mode 100644 index 5837141..0000000 --- a/src/main/java/jira/view/BoardMenu.java +++ /dev/null @@ -1,140 +0,0 @@ -package jira.view; - -import jira.controller.BoardController; -import jira.controller.ControllerResult; - -import java.util.regex.Matcher; - -public class BoardMenu extends Menu { - String Command; - String selectedBoard; - - public BoardMenu(String name, Menu parent) { - super(name, parent); - } - - public void execute() { - System.out.println("Board Menu"); - ControllerResult result; - selectedBoard = null; - - while (true) { - Matcher commandMatcher; - result = null; - Command = getInput(); - BoardController boardController = BoardController.getController(); - String assignedUser = LoginAndRegisterMenu.assignedUser; - String assignedTeam = TeamMenu.assignedTeam; - - if (isValidCommand(Command, Commands.COMMAND_PATTERNS[23])) { - commandMatcher = parse(Command, 23); - - String boardName = commandMatcher.group(1); - result = boardController.createStageOneBoard(assignedUser, assignedTeam, boardName); - } - else if (isValidCommand(Command, Commands.COMMAND_PATTERNS[24])) { - commandMatcher = parse(Command, 24); - - String boardName = commandMatcher.group(1); - result = boardController.removeBoard(assignedUser, assignedTeam, boardName); - } - else if (isValidCommand(Command, Commands.COMMAND_PATTERNS[25])) { - commandMatcher = parse(Command, 25); - - selectedBoard = commandMatcher.group(1); - } - else if (isValidCommand(Command, Commands.COMMAND_PATTERNS[26])) { - selectedBoard = null; - } - else if (isValidCommand(Command, Commands.COMMAND_PATTERNS[27])) { - commandMatcher = parse(Command, 27); - - String categoryName = commandMatcher.group(1); - String boardName = commandMatcher.group(2); - result = boardController.addCategoryToBoard(assignedUser, assignedTeam, boardName, categoryName); - } - else if (isValidCommand(Command, Commands.COMMAND_PATTERNS[28])) { - commandMatcher = parse(Command, 28); - - String categoryName = commandMatcher.group(1); - int column = Integer.parseInt(commandMatcher.group(2)); - String boardName = commandMatcher.group(3); - result = boardController.moveOrCreateCategoryInColumn(assignedUser, assignedTeam, boardName, categoryName, column); - } - else if (isValidCommand(Command, Commands.COMMAND_PATTERNS[29])) { - commandMatcher = parse(Command, 29); - - String boardName = commandMatcher.group(1); - result = boardController.finalizeBoard(assignedUser, assignedTeam, boardName); - } - else if (isValidCommand(Command, Commands.COMMAND_PATTERNS[30])) { - commandMatcher = parse(Command, 30); - - int taskId = Integer.parseInt(commandMatcher.group(1)); - String boardName = commandMatcher.group(2); - result = boardController.addTaskToBoard(assignedUser, assignedTeam, boardName, taskId); - } - else if (isValidCommand(Command, Commands.COMMAND_PATTERNS[31])) { - commandMatcher = parse(Command, 31); - - String teamMember = commandMatcher.group(1); - int taskId = Integer.parseInt(commandMatcher.group(2)); - String boardName = commandMatcher.group(3); - result = boardController.assignTaskToTeamMember(assignedUser, assignedTeam, boardName, taskId, teamMember); - } - else if (isValidCommand(Command, Commands.COMMAND_PATTERNS[32])) { - commandMatcher = parse(Command, 32); - - String newCategory = commandMatcher.group(1); - String taskTitle = commandMatcher.group(2); - String boardName = commandMatcher.group(3); - result = boardController.forceChangeTaskCategory(assignedUser, assignedTeam, boardName, taskTitle, newCategory); - } - else if (isValidCommand(Command, Commands.COMMAND_PATTERNS[33])) { - commandMatcher = parse(Command, 33); - - String task = commandMatcher.group(1); - String boardName = commandMatcher.group(2); - result = boardController.doNextOnTask(assignedUser, assignedTeam, boardName, task); - } - else if (isValidCommand(Command, Commands.COMMAND_PATTERNS[34])) { - //Show Task By Category -- ToDo - } - else if (isValidCommand(Command, Commands.COMMAND_PATTERNS[35])) { - commandMatcher = parse(Command, 35); - - boolean showDone = commandMatcher.group(1).equals("done"); - String boardName = commandMatcher.group(2); - result = boardController.showDoneOrFailedTasks(assignedTeam, boardName, showDone); - } - else if (isValidCommand(Command, Commands.COMMAND_PATTERNS[36])) { - commandMatcher = parse(Command, 36); - - String taskTitle = commandMatcher.group(1); - String assigneeName = commandMatcher.group(2); - String deadline = commandMatcher.group(2); - String category = commandMatcher.group(2); - String boardName = commandMatcher.group(2); - result = boardController.restartTask(assignedUser, assignedTeam, boardName, deadline, taskTitle, assigneeName, category); - } - else if (isValidCommand(Command, Commands.COMMAND_PATTERNS[37])) { - commandMatcher = parse(Command, 37); - - String boardName = commandMatcher.group(1); - result = boardController.showBoardToMember(assignedTeam, boardName); - - } - else if (isValidCommand(Command, Commands.COMMAND_PATTERNS[59])) { - ViewController.setNext(parent); - break; - } - else { - show(INVALID_COMMAND); - } - - if (result != null) - show(result.message); - } - } -} - diff --git a/src/main/java/jira/view/CalendarMenu.java b/src/main/java/jira/view/CalendarMenu.java deleted file mode 100644 index 067b912..0000000 --- a/src/main/java/jira/view/CalendarMenu.java +++ /dev/null @@ -1,35 +0,0 @@ -package jira.view; - -import jira.controller.ControllerResult; -import jira.controller.UserController; - -public class CalendarMenu extends Menu { - String Command; - - public CalendarMenu(String name, Menu parent) { - super(name, parent); - } - - public void execute() { - System.out.println("Calendar Menu"); - while (true) { - ControllerResult result = null; - Command = getInput(); - UserController userController = UserController.getController(); - String assignedUser = LoginAndRegisterMenu.assignedUser; - if (isValidCommand(Command, Commands.COMMAND_PATTERNS[38])) { - result = userController.showCalendar(assignedUser); - } - else if (isValidCommand(Command, Commands.COMMAND_PATTERNS[59])) { - ViewController.setNext(parent); - break; - } - else - show(INVALID_COMMAND); - - if (result != null) - show(result.message); - } - } -} - diff --git a/src/main/java/jira/view/Commands.java b/src/main/java/jira/view/Commands.java deleted file mode 100644 index 221a305..0000000 --- a/src/main/java/jira/view/Commands.java +++ /dev/null @@ -1,88 +0,0 @@ -package jira.view; - -import java.util.regex.Pattern; - -public class Commands { - public static Pattern[] COMMAND_PATTERNS = new Pattern[]{ -// first page(LoginAndRegisterMenu) commands: 0-1 - Pattern.compile("user create --username ([^\\s]+) --password1 ([^\\s]+) --password2 ([^\\s]+) --email Address ([^\\s]+)"), //Creating Users - Pattern.compile("user login --username ([^\\s]+) --password ([^\\s]+)"), //Login -// second page(profileMenu) commands: 2-9 - Pattern.compile("enter menu (.*)"), // To Enter A Menu - Pattern.compile("profile --change --oldPassword ([^\\s]+) --newPassword ([^\\s]+)"), //Change Password - Pattern.compile("profile --change --username ([^\\s]+)"), //Change Username - Pattern.compile("profile --showTeams"), //Show Teams - Pattern.compile("profile --showTeam ([^\\s]+)"), //Show Own Teams - Pattern.compile("profile --show --myProfile"), //Show Profile - Pattern.compile("profile --show logs"), // Show Logs - Pattern.compile("profile --show notifications"), //Show Notifications -// Task Page(TaskMenu) commands: 10-15 -// Team Leader Commands - Pattern.compile("edit --task --id (\\d+) --title (.*)"), //change title - Pattern.compile("edit --task --id (\\d+) --description (.*)"), //Change Description - Pattern.compile("edit --task --id (\\d+) --priority ([^\\s]+)"), //Change Priority - Pattern.compile("edit --task --id (\\d+) --Deadline ([^\\s]+)"), //Change Deadline - Pattern.compile("edit --task --id (\\d+) --assignedUsers ([^\\s]+) --remove"), //Remove Assigned User - Pattern.compile("edit --task --id (\\d+) --assignedUsers ([^\\s]+) --add"), //Add To Assigned Users -// Team Menu(TeamMenu) commands: 16-22 - Pattern.compile("Enter team ([^\\s]+)"), //Enter Team Page - Pattern.compile("Scoreboard --show"), //Show Scoreboard - Pattern.compile("Roadmap --show"), //Show Roadmap - Pattern.compile("Chatroom --show"), //Show Chatroom - Pattern.compile("send --message \"(.*)\"") , //Send Message ? - Pattern.compile("show tasks"), //Show Tasks - Pattern.compile("show task --id (\\d+)"), //Show Task -// Team :: Board Menu(BoardMenu) commands: -// Leader commands 23-26 - Pattern.compile("board --new --name ([^\\s]+)"), //Create Stage 1 Board - Pattern.compile("board --remove --name ([^\\s]+)"), //Remove Board From Team - Pattern.compile("board --select --name ([^\\s]+)"), //Select Command - Pattern.compile("board --deselect"), -// Stage One Board Command 27-29 - Pattern.compile("board --new --category ([^\\s]+) --name ([^\\s]+)"), //create category - Pattern.compile("board --category ([^\\s]+) --column (\\d+) --name ([^\\s]+)"), //Move / Create Category In Column - Pattern.compile("board --done --name ([^\\s]+)"), //Finish Stage One -// Stage Two Board Commands 30-34 - Pattern.compile("board --add (\\d+) --name ([^\\s]+)"), //Add Task To Board - Pattern.compile("board --assign ([^\\s]+) --task (\\d+) --name ([^\\s]+)"), //Assign Task To Team Member - Pattern.compile("board --force --category ([^\\s]+) --task ([^\\s]+) --name ([^\\s]+)"), //Change Task State - Pattern.compile("board --category next --task ([^\\s]+) --name ([^\\s]+)"), //Move Task To Next State - Pattern.compile("board --show --category ([^\\s]+) --board ([^\\s]+)"), //Show Task By Category -// Task Progression 35-36 - Pattern.compile("board --show ([^\\s]+) --name --board ([^\\s]+)"), //Show Done/Failed Tasks - Pattern.compile("board --open --task ([^\\s]+) (--assign ([^\\s]+))? --deadline ([^\\s]+) (--category ([^\\s]+))? --name ([^\\s]+)"), //Restart Task -// Normal Board Member Commands (Team Member Commands) 37-37 - Pattern.compile("Board --show --name ([^\\s]+)"), -// Calendar Menu 38-38 - Pattern.compile("calendar --show deadlines"), -// Team Leader Tasks: 39-41 - Pattern.compile("show --teams"), //Show Teams - Pattern.compile("show --team ([^\\s]+)"), //Team Select - Pattern.compile("create --team ([^\\s]+)"), //Create Team -// Team Leader Commands After Selecting Team 42-51 - Pattern.compile("sudo show --all --tasks"), //Show All Team Tasks - Pattern.compile("create task --title ([^\\s]+) --startTime ([^\\s]+) --deadline ([^\\s]+)"), //Create Task For Team - Pattern.compile("show --members"), //List Team Members - Pattern.compile("Add member --username ([^\\s]+)"), //Add Member To Team - Pattern.compile("delete member --username ([^\\s]+)"), //Remove Member From Team - Pattern.compile("suspend member --username ([^\\s]+)"), //Suspend Team Member - Pattern.compile("promote --username ([^\\s]+) --rate (\\d+)"), //Promote To Team Leader - Pattern.compile("assign member --task (\\d+) --username ([^\\s]+)"), //Assign Member To Task - Pattern.compile("show --scoreboard"), //Show Scoreboard - Pattern.compile("send --notification ([^\\s]+) --username ([^\\s]+)"), //Send Notifications -// Admin Commands 52-58 - Pattern.compile("show profile --username ([^\\s]+)"), //Query User Profile - Pattern.compile("ban user --user ([^\\s]+)"), //Ban User - Pattern.compile("change role --user ([^\\s]+) --role ([^\\s]+)"), //Change Role - Pattern.compile("send --notificaion --all\n" + - "send --notificaion --user \n" + - "send --notificaion --team "), //Send Notification - Pattern.compile("show --pendingTeams"), //Accept New Teams - Pattern.compile("accept --teams (.+)"), //Accept New Teams - Pattern.compile("reject --teams (.+)"), //Reject Team -// BACK and EXIT 59-60 - Pattern.compile("back"), - Pattern.compile("exit") - }; -} - diff --git a/src/main/java/jira/view/LoginAndRegisterMenu.java b/src/main/java/jira/view/LoginAndRegisterMenu.java deleted file mode 100644 index d62cd22..0000000 --- a/src/main/java/jira/view/LoginAndRegisterMenu.java +++ /dev/null @@ -1,56 +0,0 @@ -package jira.view; - -import jira.controller.ControllerResult; -import jira.controller.UserController; - -import java.util.regex.Matcher; - -public class LoginAndRegisterMenu extends Menu { - String Command; - public static String assignedUser; - - public LoginAndRegisterMenu(String name, Menu parent) {super(name, parent);} - - public void execute() { - System.out.println("Login and Register Menu"); - assignedUser = null; - ControllerResult result; - UserController userController = UserController.getController(); - - while (true) { - Matcher commandMatcher; - Command = getInput(); - if (isValidCommand(Command, Commands.COMMAND_PATTERNS[0])) { - commandMatcher = parse(Command, 0); - - String userName = commandMatcher.group(1); - String passWord1 = commandMatcher.group(2); - String passWord2 = commandMatcher.group(3); - String email = commandMatcher.group(4); - result = userController.createUser(userName, passWord1, passWord2, email); - - show(result.message); - } - else if (isValidCommand(Command, Commands.COMMAND_PATTERNS[1])){ - commandMatcher = parse(Command, 1); - - String userName = commandMatcher.group(1); - String password = commandMatcher.group(2); - result = userController.login(userName, password); - - show(result.message); - if (result.success) { - ViewController.setNext(new MainMenu(null, this)); - assignedUser = userName; - break; - } - } - else if (isValidCommand(Command, Commands.COMMAND_PATTERNS[60])){ - ViewController.setNext(null); - break; - } - else - show(INVALID_COMMAND); - } - } -} diff --git a/src/main/java/jira/view/LoginPageController.java b/src/main/java/jira/view/LoginPageController.java deleted file mode 100644 index be49590..0000000 --- a/src/main/java/jira/view/LoginPageController.java +++ /dev/null @@ -1,125 +0,0 @@ -package jira.view; - -import javafx.scene.Node; -import jira.JiraApp; -import jira.controller.ControllerResult; -import jira.controller.UserController; -import javafx.fxml.FXML; -import javafx.fxml.FXMLLoader; -import javafx.scene.Scene; -import javafx.scene.control.Label; -import javafx.scene.control.PasswordField; -import javafx.scene.control.TextField; -import javafx.event.ActionEvent; -import javafx.scene.layout.BorderPane; -import javafx.stage.Stage; - -import java.io.IOException; - -public class LoginPageController extends PageController { - private static final UserController userController = UserController.getController(); - - @FXML private BorderPane pane; - @FXML private Label errorField; - @FXML private TextField usernameField; - @FXML private PasswordField passwordField; - - @FXML - private void login(ActionEvent event) { - String username = getTextFromField(usernameField); - String password = getTextFromField(passwordField); - ControllerResult result = userController.login(username, password); - - showResult(errorField, result); - - if (result.success) - gotoMainMenu(event, username); - } - - @FXML - private void register(ActionEvent event) { - pane.setDisable(true); - - FXMLLoader fxmlLoader = new FXMLLoader(JiraApp.class.getResource("registerAccountPopup.fxml")); - try { - Scene scene = new Scene(fxmlLoader.load()); - Stage newStage = new Stage(); - newStage.setScene(scene); - - RegisterPopupController registerPopupController = fxmlLoader.getController(); - registerPopupController.setLoginPageController(this); - newStage.setOnHidden(e -> {pane.setDisable(false);}); - - newStage.show(); - } - catch (IOException e) { - e.printStackTrace(); - } - } - - private void gotoMainMenu(ActionEvent event, String username) { - try { - FXMLLoader loader = new FXMLLoader(JiraApp.class.getResource("mainMenu.fxml")); - Scene scene = new Scene(loader.load()); - Stage stage = (Stage) ((Node) event.getSource()).getScene().getWindow(); - - MainMenuPageController mainMenuPageController = loader.getController(); - mainMenuPageController.setCurrentUsername(username); - mainMenuPageController.setRole(userController.getUserRole(username).message); - mainMenuPageController.initialize(); - - stage.setScene(scene); - stage.show(); - } - catch (IOException e) { - e.printStackTrace(); - } - } - - protected void registerReturn() { - pane.setDisable(false); - } - -// public void execute() { -// System.out.println("Login and Register Menu"); -// assignedUser = null; -// ControllerResult result; -// UserController userController = UserController.getController(); -// -// while (true) { -// Matcher commandMatcher; -// Command = getInput(); -// if (isValidCommand(Command, Commands.COMMAND_PATTERNS[0])) { -// commandMatcher = parse(Command, 0); -// -// String userName = commandMatcher.group(1); -// String passWord1 = commandMatcher.group(2); -// String passWord2 = commandMatcher.group(3); -// String email = commandMatcher.group(4); -// result = userController.createUser(userName, passWord1, passWord2, email); -// -// show(result.message); -// } -// else if (isValidCommand(Command, Commands.COMMAND_PATTERNS[1])){ -// commandMatcher = parse(Command, 1); -// -// String userName = commandMatcher.group(1); -// String password = commandMatcher.group(2); -// result = userController.login(userName, password); -// -// show(result.message); -// if (result.success) { -// ViewController.setNext(new MainMenu(null, this)); -// assignedUser = userName; -// break; -// } -// } -// else if (isValidCommand(Command, Commands.COMMAND_PATTERNS[60])){ -// ViewController.setNext(null); -// break; -// } -// else -// show(INVALID_COMMAND); -// } -// } -} diff --git a/src/main/java/jira/view/MainMenu.java b/src/main/java/jira/view/MainMenu.java deleted file mode 100644 index 483f674..0000000 --- a/src/main/java/jira/view/MainMenu.java +++ /dev/null @@ -1,64 +0,0 @@ -package jira.view; - -import jira.controller.UserController; - -import java.util.regex.Matcher; - -public class MainMenu extends Menu { - - String Command; - - public MainMenu(String name, Menu parent) { - super(name, parent); - } - - public void execute() { - welcome(); - - loop: while (true) { - Matcher commandMatcher; - Command = getInput(); - show("select a menu"); - - if (isValidCommand(Command, Commands.COMMAND_PATTERNS[2])) { - commandMatcher = parse(Command, 2); - String menuName = commandMatcher.group(1); - - switch (menuName){ - case "Profile Menu": - ViewController.setNext(new ProfileMenu(null, this)); - break loop; - case "Board Menu": - ViewController.setNext(new BoardMenu(null, this)); - break loop; - case "Team Menu": - ViewController.setNext(new TeamMenu(null, this)); - break loop; - case "Task Page": - ViewController.setNext(new TaskPage(null, this)); - break loop; - case "Calendar Menu": - ViewController.setNext(new CalendarMenu(null, this)); - break loop; - default: - show("the menu doesn't exist"); - } - } - else if (isValidCommand(Command, Commands.COMMAND_PATTERNS[59])) { - ViewController.setNext(parent); - UserController.getController().logout(LoginAndRegisterMenu.assignedUser); - break; - } - else - show(INVALID_COMMAND); - } - } - - private void welcome() { - show("1. Profile Menu"); - show("2. Board Menu"); - show("3. Team Menu"); - show("4. Task Page"); - show("5. Calendar Menu"); - } -} diff --git a/src/main/java/jira/view/Menu.java b/src/main/java/jira/view/Menu.java deleted file mode 100644 index 35b0845..0000000 --- a/src/main/java/jira/view/Menu.java +++ /dev/null @@ -1,42 +0,0 @@ -package jira.view; - -import java.util.Scanner; -import java.util.regex.Pattern; -import java.util.regex.Matcher; - -public abstract class Menu { - public static final String INVALID_COMMAND = "Invalid command"; - protected static Scanner scanner = new Scanner(System.in); - protected Menu parent; - protected String name; - - public Menu(String name, Menu parent) { - this.name = name; - this.parent = parent; - } - - public void execute() { - System.out.println("Child menu of " + parent.name + " executed"); - } - - public String getInput() { - return scanner.nextLine().trim(); - } - - public void show(String message) { - if (message != null) - System.out.println(message); - } - - public boolean isValidCommand(String command, Pattern pattern) { - Matcher matcher = pattern.matcher(command); - return matcher.find(); - } - - public Matcher parse(String command, int patternNum) { - Matcher commandMatcher = Commands.COMMAND_PATTERNS[patternNum].matcher(command); - if (commandMatcher.matches()) - return commandMatcher; - return null; - } -} diff --git a/src/main/java/jira/view/ProfileMenu.java b/src/main/java/jira/view/ProfileMenu.java deleted file mode 100644 index 764a193..0000000 --- a/src/main/java/jira/view/ProfileMenu.java +++ /dev/null @@ -1,69 +0,0 @@ -package jira.view; - -import jira.controller.ControllerResult; -import jira.controller.UserController; -import jira.controller.TeamController; - -import java.util.regex.Matcher; - -public class ProfileMenu extends Menu { - String Command; - - public ProfileMenu(String name, Menu parent) { - super(name, parent); - } - - public void execute() { - System.out.println("Profile Menu"); - while (true) { - Matcher commandMatcher; - ControllerResult result = null; - Command = getInput(); - UserController userController = UserController.getController(); - TeamController teamController = TeamController.getController(); - String assignedUser = LoginAndRegisterMenu.assignedUser; - - if (isValidCommand(Command, Commands.COMMAND_PATTERNS[3])) { - commandMatcher = parse(Command, 3); - - String oldPassword = commandMatcher.group(1); - String newPassword = commandMatcher.group(2); - result = userController.changeUserPassword(assignedUser, oldPassword, newPassword); - } - else if (isValidCommand(Command, Commands.COMMAND_PATTERNS[4])) { - commandMatcher = parse(Command, 4); - - String userName = commandMatcher.group(1); - result = userController.changeUsername(userName, assignedUser); - } - else if (isValidCommand(Command, Commands.COMMAND_PATTERNS[5])) { - result = userController.listTeams(assignedUser); - } - else if (isValidCommand(Command, Commands.COMMAND_PATTERNS[6])) { - commandMatcher = parse(Command, 6); - - String teamName = commandMatcher.group(1); - result = teamController.showTeamMembers(teamName); - } - else if (isValidCommand(Command, Commands.COMMAND_PATTERNS[7])) { - result = userController.showProfile(assignedUser); - } - else if (isValidCommand(Command, Commands.COMMAND_PATTERNS[8])) { - result = userController.showLogs(assignedUser); - } -// else if (isValidCommand(Command, Commands.COMMAND_PATTERNS[9])) { -// userController.showNotifications(); -// // showNotifications method should be added to UserController. -// } - else if (isValidCommand(Command, Commands.COMMAND_PATTERNS[59])) { - ViewController.setNext(parent); - break; - } - else - show(INVALID_COMMAND); - - if (result != null) - show(result.message); - } - } -} \ No newline at end of file diff --git a/src/main/java/jira/view/TaskPage.java b/src/main/java/jira/view/TaskPage.java deleted file mode 100644 index add7b5d..0000000 --- a/src/main/java/jira/view/TaskPage.java +++ /dev/null @@ -1,78 +0,0 @@ -package jira.view; - -import jira.controller.ControllerResult; -import jira.controller.TasksController; - -import java.util.regex.Matcher; - -public class TaskPage extends Menu { - String Command; - - public TaskPage(String name, Menu parent) { - super(name, parent); - } - - public void execute() { - System.out.println("Task Page"); - ControllerResult result; - - while (true) { - Matcher commandMatcher; - result = null; - Command = getInput(); - TasksController tasksController = TasksController.getController(); - String assignedUser = LoginAndRegisterMenu.assignedUser; - if (isValidCommand(Command, Commands.COMMAND_PATTERNS[10])) { - commandMatcher = parse(Command, 10); - - int taskId = Integer.parseInt(commandMatcher.group(1)); - String newTitle = commandMatcher.group(2); - result = tasksController.changeTaskTitle(assignedUser, taskId, newTitle); - } - else if (isValidCommand(Command, Commands.COMMAND_PATTERNS[11])) { - commandMatcher = parse(Command, 11); - - int taskId = Integer.parseInt(commandMatcher.group(1)); - String newDescription = commandMatcher.group(2); - result = tasksController.changeDescription(assignedUser, taskId, newDescription); - } - else if (isValidCommand(Command, Commands.COMMAND_PATTERNS[12])) { - commandMatcher = parse(Command, 12); - - int taskId = Integer.parseInt(commandMatcher.group(1)); - String newPriority = commandMatcher.group(2); - result = tasksController.changePriority(assignedUser, taskId, newPriority); - } - else if (isValidCommand(Command, Commands.COMMAND_PATTERNS[13])) { - commandMatcher = parse(Command, 13); - - int taskId = Integer.parseInt(commandMatcher.group(1)); - String newDeadline = commandMatcher.group(2); - result = tasksController.changeDeadline(assignedUser, taskId, newDeadline); - } - else if (isValidCommand(Command, Commands.COMMAND_PATTERNS[14])) { - commandMatcher = parse(Command, 14); - - int taskId = Integer.parseInt(commandMatcher.group(1)); - String usernameToRemove = commandMatcher.group(2); - result = tasksController.removeAssignedUser(assignedUser, taskId, usernameToRemove); - } - else if (isValidCommand(Command, Commands.COMMAND_PATTERNS[15])) { - commandMatcher = parse(Command, 15); - - int taskId = Integer.parseInt(commandMatcher.group(1)); - String usernameToAdd = commandMatcher.group(2); - result = tasksController.assignUser(assignedUser, taskId, usernameToAdd); - } - else if (isValidCommand(Command, Commands.COMMAND_PATTERNS[59])) { - ViewController.setNext(parent); - break; - } - else - show(INVALID_COMMAND); - - if (result != null) - show(result.message); - } - } -} diff --git a/src/main/java/jira/view/TeamMenu.java b/src/main/java/jira/view/TeamMenu.java deleted file mode 100644 index f48f225..0000000 --- a/src/main/java/jira/view/TeamMenu.java +++ /dev/null @@ -1,169 +0,0 @@ -package jira.view; - -import jira.controller.UserController; -import jira.controller.ControllerResult; -import jira.controller.TasksController; -import jira.controller.TeamController; - -import java.util.regex.Matcher; - -public class TeamMenu extends Menu { - String Command; - - public TeamMenu(String name, Menu parent) { - super(name, parent); - } - - public static String assignedTeam; - - public void execute() { - assignedTeam = null; - System.out.println("Team Menu"); - welcome(); - - while (true) { - Matcher commandMatcher; - ControllerResult result = null; - Command = getInput(); - UserController userController = UserController.getController(); - TeamController teamController = TeamController.getController(); - TasksController tasksController = TasksController.getController(); - - String assignedUser = LoginAndRegisterMenu.assignedUser; - userController.listTeams(assignedUser); - - if (isValidCommand(Command, Commands.COMMAND_PATTERNS[16])) { - commandMatcher = parse(Command, 16); - - if (teamController.teamIsSelectable(commandMatcher.group(1))) - assignedTeam = commandMatcher.group(1); - else - result = new ControllerResult("Chosen team does not exist!", false); - } - else if (isValidCommand(Command, Commands.COMMAND_PATTERNS[17]) && assignedTeam != null) { - result = teamController.showTeamScoreboard(assignedTeam); - } - else if (isValidCommand(Command, Commands.COMMAND_PATTERNS[18]) && assignedTeam != null) { - result = teamController.showTeamRoadmap(assignedTeam); - } - else if (isValidCommand(Command, Commands.COMMAND_PATTERNS[19]) && assignedTeam != null) { - result = teamController.showChatroom(assignedTeam); - } - else if (isValidCommand(Command, Commands.COMMAND_PATTERNS[20]) && assignedTeam != null) { - commandMatcher = parse(Command, 20); - - String message = commandMatcher.group(1); - result = userController.sendMessage(assignedUser, message, assignedTeam); - } - else if (isValidCommand(Command, Commands.COMMAND_PATTERNS[21]) && assignedTeam != null) { - result = teamController.showTeamTasks(assignedTeam); - } - else if (isValidCommand(Command, Commands.COMMAND_PATTERNS[22]) && assignedTeam != null) { - commandMatcher = parse(Command, 22); - - result = userController.showTask(assignedTeam, Integer.parseInt(commandMatcher.group(1))); - } - else if (isValidCommand(Command, Commands.COMMAND_PATTERNS[39])) { - result = teamController.showTeams(assignedUser); - } - else if (isValidCommand(Command, Commands.COMMAND_PATTERNS[40])) { - commandMatcher = parse(Command, 40); - result = teamController.checkTeamToken(assignedUser, commandMatcher.group(1)); - - if (result.success) - assignedTeam = result.message; - } - else if (isValidCommand(Command, Commands.COMMAND_PATTERNS[41])) { - commandMatcher = parse(Command, 41); - - String teamName = commandMatcher.group(1); - result = teamController.creatTeam(assignedUser, teamName); - } - else if (isValidCommand(Command, Commands.COMMAND_PATTERNS[42]) && assignedTeam != null) { - result = teamController.showTeamTasks(assignedTeam); - } - else if (isValidCommand(Command, Commands.COMMAND_PATTERNS[43]) && assignedTeam != null) { - commandMatcher = parse(Command, 43); - - String taskTitle = commandMatcher.group(1); - String startTime = commandMatcher.group(2); - String deadline = commandMatcher.group(3); - result = teamController.createTaskForTeam(assignedUser,assignedTeam,taskTitle, startTime, deadline); - } - else if (isValidCommand(Command, Commands.COMMAND_PATTERNS[44]) && assignedTeam != null) { - result = teamController.showTeamMembers(assignedTeam); - } - else if (isValidCommand(Command, Commands.COMMAND_PATTERNS[45]) && assignedTeam != null) { - commandMatcher = parse(Command, 45); - - String username = commandMatcher.group(1); - result = teamController.addMemberToTeam(assignedUser, assignedTeam, username); - } - else if (isValidCommand(Command, Commands.COMMAND_PATTERNS[46]) && assignedTeam != null) { - commandMatcher = parse(Command, 46); - - String username = commandMatcher.group(1); - result = teamController.deleteTeamMember(username, assignedUser, assignedTeam); - } - else if (isValidCommand(Command, Commands.COMMAND_PATTERNS[47]) && assignedTeam != null) { - commandMatcher = parse(Command, 47); - - String username = commandMatcher.group(1); - result = teamController.suspendTeamMember(assignedUser,assignedTeam,username); - } - else if (isValidCommand(Command, Commands.COMMAND_PATTERNS[48]) && assignedTeam != null) { - commandMatcher = parse(Command, 48); - - String username = commandMatcher.group(1); - result = teamController.promoteTeamLeader(assignedTeam,assignedUser,username); - } - else if (isValidCommand(Command, Commands.COMMAND_PATTERNS[49])) { - commandMatcher = parse(Command, 49); - - int taskId = Integer.parseInt(commandMatcher.group(1)); - String username = commandMatcher.group(2); - result = tasksController.assignUser(assignedUser, taskId, username); - } - else if (isValidCommand(Command, Commands.COMMAND_PATTERNS[50]) && assignedTeam != null) { - result = teamController.showTeamScoreboard(assignedTeam); - } - else if (isValidCommand(Command, Commands.COMMAND_PATTERNS[51])) { - commandMatcher = parse(Command, 51); - - String notification = commandMatcher.group(1); - String teamName = commandMatcher.group(2); - result = teamController.sendNotifications(notification, assignedUser); - } - else if (isValidCommand(Command, Commands.COMMAND_PATTERNS[56])) { - result = teamController.showPendingTeams(assignedUser); - } - else if (isValidCommand(Command, Commands.COMMAND_PATTERNS[57])) { - commandMatcher = parse(Command, 57); - - String teams = commandMatcher.group(1); - result = teamController.acceptPendingTeam(assignedUser, teams); - } - else if (isValidCommand(Command, Commands.COMMAND_PATTERNS[58])) { - commandMatcher = parse(Command, 58); - - String teams = commandMatcher.group(1); - result = teamController.rejectPendingTeam(assignedUser, teams); - } - else if (isValidCommand(Command, Commands.COMMAND_PATTERNS[59])) { - ViewController.setNext(parent); - break; - } - else - show(INVALID_COMMAND); - - if (result != null) - show(result.message); - } - } - - private void welcome() { - show(TeamController.getController().showAllTeams().message); - } -} - - diff --git a/src/main/java/jira/view/TeamMenuPageController.java b/src/main/java/jira/view/TeamMenuPageController.java deleted file mode 100644 index 19fb134..0000000 --- a/src/main/java/jira/view/TeamMenuPageController.java +++ /dev/null @@ -1,155 +0,0 @@ -package jira.view; - -import javafx.collections.FXCollections; -import javafx.collections.ObservableList; -import javafx.event.EventHandler; -import javafx.fxml.FXML; -import javafx.fxml.FXMLLoader; -import javafx.scene.Scene; -import javafx.scene.control.Label; -import javafx.scene.control.TableCell; -import javafx.scene.control.TableColumn; -import javafx.scene.control.TableView; -import javafx.scene.control.cell.PropertyValueFactory; -import javafx.scene.input.MouseEvent; -import javafx.scene.layout.BorderPane; -import javafx.stage.Stage; -import javafx.util.Callback; -import jira.JiraApp; -import jira.controller.TeamController; - -import java.io.IOException; -import java.util.ArrayList; - -public class TeamMenuPageController extends PageController { - private String currentUsername; - private String currentRole; - - @FXML private BorderPane pane; - @FXML private TableView listOfTeams; - @FXML private Label leaderOrMemberLabel; - - protected void setCurrentUsername(String currentUsername) { - this.currentUsername = currentUsername; - } - - protected void setCurrentRole(String currentRole) { - this.currentRole = currentRole; - } - - private void setLeaderOrMemberLabel() { - leaderOrMemberLabel.setText(currentRole + " of:"); - } - - public void initialize() { - setLeaderOrMemberLabel(); - clearTeamListView(); - prepareTeamListView(); - } - - private void clearTeamListView() { - listOfTeams.getItems().clear(); - listOfTeams.getColumns().clear(); - } - - private void prepareTeamListView() { - TableColumn teamNameColumn = new TableColumn<>("Team Name"); - teamNameColumn.setCellValueFactory(new PropertyValueFactory("teamName")); - teamNameColumn.setCellFactory(getTeamListStringCellFactory()); - - TableColumn memberCountColumn = new TableColumn<>("Member Count"); - memberCountColumn.setCellValueFactory(new PropertyValueFactory("memberCount")); - memberCountColumn.setCellFactory(getTeamListIntegerCellFatory()); - - listOfTeams.setItems(getTeamListViewItems()); - listOfTeams.getColumns().addAll(teamNameColumn, memberCountColumn); - } - - private ObservableList getTeamListViewItems() { - final ObservableList teamStats = FXCollections.observableArrayList(); - - ArrayList teamNames = TeamController.getController().showTeamsAffiliated(currentUsername); - ArrayList teamCounts = TeamController.getController().getAffiliatedTeamsMemberCount(currentUsername); - for (int i = 0; i < teamNames.size(); i++) { - teamStats.add(new TeamStats(teamNames.get(i), teamCounts.get(i))); - } - - return teamStats; - } - - private Callback, TableCell> getTeamListStringCellFactory() { - return param -> { - TableCell cell = new TableCell<>(); - cell.addEventFilter(MouseEvent.MOUSE_CLICKED, new GotoTeamHandler()); - return cell; - }; - } - - private Callback, TableCell> getTeamListIntegerCellFatory() { - return param -> { - TableCell cell = new TableCell<>(); - cell.addEventFilter(MouseEvent.MOUSE_CLICKED, new GotoTeamHandler()); - return cell; - }; - } - - private void openTeamViewPopup() { - pane.setDisable(true); - - FXMLLoader fxmlLoader = new FXMLLoader(JiraApp.class.getResource("registerAccountPopup.fxml")); - try { - Scene scene = new Scene(fxmlLoader.load()); - Stage newStage = new Stage(); - newStage.setScene(scene); - - TeamViewPopupController teamViewPopupController = fxmlLoader.getController(); - teamViewPopupController.setTeamMenuPageController(this); - newStage.setOnHidden(e -> {pane.setDisable(false);}); - - newStage.show(); - } - catch (IOException e) { - e.printStackTrace(); - } - } - - protected void teamViewReturn() { - pane.setDisable(false); - } - - class GotoTeamHandler implements EventHandler { - @Override - public void handle(MouseEvent event) { - TableCell cell = (TableCell) event.getSource(); - int index = cell.getIndex(); - TeamStats teamStats = (TeamStats) listOfTeams.getItems().get(index); - openTeamViewPopup(); - } - } -} - -class TeamStats { - private String teamName; - private int memberCount; - - public TeamStats(String teamName, int memberCount) { - this.teamName = teamName; - this.memberCount = memberCount; - } - - public int getMemberCount() { - return memberCount; - } - - public String getTeamName() { - return teamName; - } - - public void setTeamName(String teamName) { - this.teamName = teamName; - } - - public void setMemberCount(int memberCount) { - this.memberCount = memberCount; - } -} diff --git a/src/main/java/jira/view/ViewController.java b/src/main/java/jira/view/ViewController.java deleted file mode 100644 index 41286f4..0000000 --- a/src/main/java/jira/view/ViewController.java +++ /dev/null @@ -1,30 +0,0 @@ -package jira.view; - -import jira.controller.UserController; - -public class ViewController { - private static Menu next; - - static { - next = new LoginAndRegisterMenu("Jira", null); - } - - public static void gotoNext() { - next.execute(); - } - - public static void setNext(Menu nextMenu) { - next = nextMenu; - } - - public static void run() { - while (true) { - if (next != null) - gotoNext(); - else{ - UserController.getController().saveUsers(); - break; - } - } - } -} diff --git a/src/main/java/module-info.java b/src/main/java/module-info.java index bd2d784..db8642f 100644 --- a/src/main/java/module-info.java +++ b/src/main/java/module-info.java @@ -3,9 +3,11 @@ requires javafx.fxml; requires javafx.media; - opens jira to javafx.fxml, javafx.graphics; - opens jira.view to javafx.fxml, javafx.media; - exports jira.view; - exports jira.controller; - exports jira.model; + opens jira.client.view to javafx.fxml, javafx.media; + exports jira.client.view; + exports jira.server.controller; + exports jira.server.model; + opens jira.client to javafx.fxml, javafx.graphics; + exports jira; + opens jira to javafx.fxml, javafx.media; } \ No newline at end of file diff --git a/src/main/resources/jira/adminPannel.fxml b/src/main/resources/jira/client/adminPannel.fxml similarity index 93% rename from src/main/resources/jira/adminPannel.fxml rename to src/main/resources/jira/client/adminPannel.fxml index 5823753..80cadf2 100644 --- a/src/main/resources/jira/adminPannel.fxml +++ b/src/main/resources/jira/client/adminPannel.fxml @@ -8,7 +8,7 @@ - +
diff --git a/src/main/resources/jira/client/changePasswordPopup.fxml b/src/main/resources/jira/client/changePasswordPopup.fxml new file mode 100644 index 0000000..a4e0cf4 --- /dev/null +++ b/src/main/resources/jira/client/changePasswordPopup.fxml @@ -0,0 +1,33 @@ + + + + + + + + + + + + +
+ + +