diff --git a/client/app/build.gradle.kts b/client/app/build.gradle.kts index 6a5a8cf..9661289 100644 --- a/client/app/build.gradle.kts +++ b/client/app/build.gradle.kts @@ -16,7 +16,12 @@ application { mainClassName = "client.MainApplication" } +repositories { + mavenCentral() +} + dependencies { + implementation("com.jfoenix:jfoenix:9.0.10") implementation(project(":data")) } diff --git a/client/app/src/main/java/customUI/Button.java b/client/app/src/main/java/customUI/Button.java new file mode 100644 index 0000000..3d4d4bf --- /dev/null +++ b/client/app/src/main/java/customUI/Button.java @@ -0,0 +1,8 @@ +package customUI; + +public class Button extends javafx.scene.control.Button { + + public void setTextValue(String text){ + super.setText(Converter.CONVERT_STR(text)); + } +} diff --git a/client/app/src/main/java/customUI/Converter.java b/client/app/src/main/java/customUI/Converter.java new file mode 100644 index 0000000..bf0c895 --- /dev/null +++ b/client/app/src/main/java/customUI/Converter.java @@ -0,0 +1,21 @@ +package customUI; + +public class Converter { + /* + Ä, ä \u00c4, \u00e4 + Ö, ö \u00d6, \u00f6 + Ü, ü \u00dc, \u00fc + ß \u00df + */ + @SuppressWarnings("all") + public static String CONVERT_STR(String str){ + return str + .replace("ä", "\u00e4") + .replace("Ä", "\u00c4") + .replace("ö", "\u00f6") + .replace("Ö", "\u00d6") + .replace("ü", "\u00fc") + .replace("Ü", "\u00dc") + .replace("ß", "\u00df"); + } +} diff --git a/client/app/src/main/java/customUI/Label.java b/client/app/src/main/java/customUI/Label.java new file mode 100644 index 0000000..8ba0ce2 --- /dev/null +++ b/client/app/src/main/java/customUI/Label.java @@ -0,0 +1,15 @@ +package customUI; + +public class Label extends javafx.scene.control.Label { + public Label(String content){ + super(Converter.CONVERT_STR(content)); + } + + public Label(){ + super(); + } + + public void setTextValue(String text){ + super.setText(Converter.CONVERT_STR(text)); + } +} diff --git a/client/app/src/main/java/main/CreateEventController.java b/client/app/src/main/java/main/CreateEventController.java index d77c407..1c61cbf 100644 --- a/client/app/src/main/java/main/CreateEventController.java +++ b/client/app/src/main/java/main/CreateEventController.java @@ -1,33 +1,41 @@ package main; +import com.jfoenix.controls.*; import javafx.event.ActionEvent; import javafx.fxml.FXML; import javafx.scene.Node; import javafx.scene.control.*; +import javafx.scene.layout.GridPane; import javafx.stage.Stage; +import javafx.util.StringConverter; +import javafx.util.converter.LocalTimeStringConverter; import res.DataController; import res.Event; +import java.time.LocalTime; +import java.time.format.FormatStyle; +import java.util.Locale; + public class CreateEventController { @FXML - public DatePicker datePickerDate; + public GridPane mainGrid; @FXML - public TextField textName; + public JFXDatePicker datePickerDate; @FXML - public TextField textStart; + public JFXTextField textName; @FXML - public TextField textEnd; + public JFXComboBox ComboBoxPriotity; @FXML - public ComboBox ComboBoxTyp; + public JFXToggleButton toggleBtnIsFullDay; @FXML - public ComboBox ComboBoxPriotity; - @FXML - public CheckBox checkBoxIsFullDay; - @FXML - public CheckBox checkBoxIsPrivate; + public JFXToggleButton toggleBtnIsPrivate; @FXML public Label labelError; + @FXML + public JFXTimePicker timeStart; + @FXML + public JFXTimePicker timeEnd; public CreateEventController() { @@ -35,6 +43,13 @@ public class CreateEventController { @FXML public void initialize() { + + StringConverter defaultConverter = new LocalTimeStringConverter(FormatStyle.SHORT, Locale.GERMANY); + timeStart.set24HourView(true); + timeStart.setConverter(defaultConverter); + + timeEnd.set24HourView(true); + timeEnd.setConverter(defaultConverter); } @@ -48,10 +63,10 @@ public class CreateEventController { Event event = new Event( textName.getText(), ComboBoxPriotity.getSelectionModel().getSelectedIndex(), - checkBoxIsFullDay.isSelected(), - checkBoxIsPrivate.isSelected(), - textStart.getText(), - textEnd.getText(), + toggleBtnIsFullDay.isSelected(), + toggleBtnIsPrivate.isSelected(), + timeStart.getValue().toString(), + timeEnd.getValue().toString(), datePickerDate.getValue().atStartOfDay(), (int) DataController.USER_ID ); diff --git a/client/app/src/main/java/main/MainController.java b/client/app/src/main/java/main/MainController.java index c7092a7..983b955 100644 --- a/client/app/src/main/java/main/MainController.java +++ b/client/app/src/main/java/main/MainController.java @@ -1,13 +1,11 @@ package main; -import javafx.event.ActionEvent; -import javafx.event.EventHandler; import javafx.fxml.FXML; import javafx.fxml.FXMLLoader; import javafx.geometry.Pos; import javafx.scene.Scene; -import javafx.scene.control.Button; -import javafx.scene.control.Label; +import customUI.Button; +import customUI.Label; import javafx.scene.control.ScrollPane; import javafx.scene.layout.GridPane; import javafx.scene.layout.HBox; @@ -30,7 +28,7 @@ public class MainController { private GridPane calendarGrid; @FXML - private Label LabelMonth; + private javafx.scene.control.Label LabelMonth; private final String[] dayNames = {"Montag", "Dienstag", "Mittwoch", "Donnerstag", "Freitag", "Samstag", "Sonntag"}; private final Label[] dayLabel = new Label[7]; @@ -110,7 +108,7 @@ public class MainController { private void createWeek() { for (int i = 0; i < 7; i++) { Label label = new Label(); - label.setText(dayNames[i]); + label.setTextValue(dayNames[i]); label.setMaxHeight(Double.MAX_VALUE); label.setMaxWidth(Double.MAX_VALUE); label.getStyleClass().add("labelDays"); @@ -142,14 +140,31 @@ public class MainController { HBox btnHBox = new HBox(); btnHBox.setAlignment(Pos.BOTTOM_RIGHT); Button deleteBtn = new Button(); - deleteBtn.setText(" X "); + deleteBtn.setTextValue(" X "); deleteBtn.setOnAction(e -> { DataController dataController = new DataController(); dataController.deleteEvent(event.getId()); updateEvents(); }); Button editBtn = new Button(); - editBtn.setText("edit"); + editBtn.setTextValue("edit"); + editBtn.setOnAction(event1 -> { + try { + FXMLLoader fxmlLoader = new FXMLLoader( + MainApplication.class.getResource("edit-event.fxml")); + Scene scene = new Scene(fxmlLoader.load(), 650, 650); + scene.getStylesheets().add(Objects.requireNonNull( + MainApplication.class.getResource("create-event.css")).toExternalForm()); + Stage stage = new Stage(); + stage.setTitle("Termin bearbeiten"); + stage.setScene(scene); + stage.initModality(Modality.APPLICATION_MODAL); + stage.setResizable(false); + stage.showAndWait(); + } catch (IOException e) { + e.printStackTrace(); + } + }); btnHBox.getChildren().add(editBtn); btnHBox.getChildren().add(deleteBtn); vBox.getChildren().add(btnHBox); @@ -167,12 +182,6 @@ public class MainController { Label typeLabel = new Label("Wer: " + event.getOwnerName()); vBox.getChildren().add(typeLabel); - /* - Ä, ä \u00c4, \u00e4 - Ö, ö \u00d6, \u00f6 - Ü, ü \u00dc, \u00fc - ß \u00df - */ Label prioLabel = new Label("Priorit\u00e4t: " + event.getPriority()); vBox.getChildren().add(prioLabel); @@ -211,7 +220,7 @@ public class MainController { weekStartDateTime = now.plusDays(weekOffset * 7L - dayOfWeek + 1); for (int i = 0; i < 7; i++) { - dayLabel[i].setText(dayFormatter.format(weekStartDateTime.plusDays(i))); + dayLabel[i].setTextValue(dayFormatter.format(weekStartDateTime.plusDays(i))); } LabelMonth.setText(dateFormatter.format(weekStartDateTime)); diff --git a/client/app/src/main/java/users/LoginController.java b/client/app/src/main/java/users/LoginController.java index 0350460..3bce950 100644 --- a/client/app/src/main/java/users/LoginController.java +++ b/client/app/src/main/java/users/LoginController.java @@ -1,18 +1,18 @@ package users; +import com.jfoenix.controls.*; import javafx.event.ActionEvent; import javafx.fxml.FXML; import javafx.scene.Node; import javafx.scene.control.Label; -import javafx.scene.control.TextField; import javafx.stage.Stage; import res.DataController; public class LoginController { @FXML - public TextField userField; + public JFXTextField userField; @FXML - public TextField passField; + public JFXPasswordField passField; @FXML public Label userErrLabel; @FXML diff --git a/client/app/src/main/resources/main/create-event.css b/client/app/src/main/resources/main/create-event.css index 442c669..be03557 100644 --- a/client/app/src/main/resources/main/create-event.css +++ b/client/app/src/main/resources/main/create-event.css @@ -28,10 +28,16 @@ Label{ .inputField{ -fx-padding: 10px; + -fx-background-color: white; } .mainButton{ -fx-font-weight: bold; + -fx-background-color: white; +} + +JFXButton{ + -fx-background-color: white; } #labelError{ @@ -43,4 +49,16 @@ Label{ -fx-max-height: 400px; -fx-wrap-text: true; -fx-font-size: 16px; +} + +.inputDate{ + -fx-background-color: white; +} + +.comboBox{ + -fx-background-color: white; +} + +.timePicker{ + -fx-background-color: white; } \ No newline at end of file diff --git a/client/app/src/main/resources/main/create-event.fxml b/client/app/src/main/resources/main/create-event.fxml index c56066c..e2798db 100644 --- a/client/app/src/main/resources/main/create-event.fxml +++ b/client/app/src/main/resources/main/create-event.fxml @@ -5,7 +5,9 @@ - + + @@ -23,26 +25,25 @@ - - - + + - - - - - - - - - - + + + + + + + + + + @@ -50,14 +51,14 @@ - - - - diff --git a/client/app/src/main/resources/main/edit-event.fxml b/client/app/src/main/resources/main/edit-event.fxml new file mode 100644 index 0000000..9180344 --- /dev/null +++ b/client/app/src/main/resources/main/edit-event.fxml @@ -0,0 +1,64 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/client/app/src/main/resources/main/main-view.css b/client/app/src/main/resources/main/main-view.css index af0f292..684f7b7 100644 --- a/client/app/src/main/resources/main/main-view.css +++ b/client/app/src/main/resources/main/main-view.css @@ -72,3 +72,7 @@ Label{ -fx-max-height: 40px; } +.navBtn{ + -fx-background-color: white; +} + diff --git a/client/app/src/main/resources/main/main-view.fxml b/client/app/src/main/resources/main/main-view.fxml index aa1402c..758226a 100644 --- a/client/app/src/main/resources/main/main-view.fxml +++ b/client/app/src/main/resources/main/main-view.fxml @@ -4,6 +4,7 @@ + @@ -19,15 +20,15 @@ - - - + @@ -48,9 +49,9 @@ - - - + zurück + heute + weiter diff --git a/client/app/src/main/resources/users/login.css b/client/app/src/main/resources/users/login.css index 2efd649..687435b 100644 --- a/client/app/src/main/resources/users/login.css +++ b/client/app/src/main/resources/users/login.css @@ -34,4 +34,20 @@ Label{ -fx-max-height: 400px; -fx-wrap-text: true; -fx-font-size: 16px; +} + +.userField{ + -fx-background-color: white; +} + +.passField{ + -fx-background-color: white; +} + +.quitBtn{ + -fx-background-color: white; +} + +.loginBtn{ + -fx-background-color: white; } \ No newline at end of file diff --git a/client/app/src/main/resources/users/login.fxml b/client/app/src/main/resources/users/login.fxml index 1eddceb..9356f08 100644 --- a/client/app/src/main/resources/users/login.fxml +++ b/client/app/src/main/resources/users/login.fxml @@ -2,6 +2,8 @@ + + @@ -19,14 +21,14 @@ - + diff --git a/client/data/src/main/java/res/DataController.java b/client/data/src/main/java/res/DataController.java index 3492acd..1ac15b5 100644 --- a/client/data/src/main/java/res/DataController.java +++ b/client/data/src/main/java/res/DataController.java @@ -16,11 +16,12 @@ public class DataController { public static long USER_ID = -1; - private static final String ALL_EVENTS_ENDPOINT = "http://localhost:8080/vpr/all-events"; - private static final String ALL_USERS_ENDPOINT = "http://localhost:8080/vpr/all-users"; - private static final String ADD_EVENT_ENDPOINT = "http://localhost:8080/vpr/add-event"; - private static final String DELETE_EVENT_ENDPOINT = "http://localhost:8080/vpr/del-event"; - private static final String LOGIN_ENDPOINT = "http://localhost:8080/vpr/login"; + private static final String ALL_EVENTS_ENDPOINT = "http://localhost:8080/event/all"; + private static final String ADD_EVENT_ENDPOINT = "http://localhost:8080/event/add"; + private static final String DELETE_EVENT_ENDPOINT = "http://localhost:8080/event/del"; + + private static final String LOGIN_ENDPOINT = "http://localhost:8080/user/login"; + private static final String ALL_USERS_ENDPOINT = "http://localhost:8080/user/all"; private final HttpRequest httpRequest; @@ -33,7 +34,8 @@ public class DataController { USER_ID = Long.parseLong(httpRequest.sendPostRequest( LOGIN_ENDPOINT, "login=" + username - + "&password=" + password + + "&password=" + password, + false )); } catch (Exception e) { e.printStackTrace(); @@ -44,7 +46,7 @@ public class DataController { public void createEvent(Event event) { try { - System.out.println(httpRequest.sendPostRequest(ADD_EVENT_ENDPOINT, event.getAsUrlParam())); + System.out.println(httpRequest.sendPostRequest(ADD_EVENT_ENDPOINT, event.getAsUrlParam(), true)); } catch (Exception e) { throw new RuntimeException("Es konnte keine Verbindung mit dem Server hergestellt werden."); } @@ -52,7 +54,7 @@ public class DataController { public void deleteEvent(int eventId) { try { - System.out.println(httpRequest.sendPostRequest(DELETE_EVENT_ENDPOINT, "eventId=" + eventId)); + System.out.println(httpRequest.sendPostRequest(DELETE_EVENT_ENDPOINT, "eventId=" + eventId, true)); } catch (Exception e) { e.printStackTrace(); } @@ -62,7 +64,7 @@ public class DataController { ArrayList eventList = new ArrayList<>(); try { - String jsonResponse = httpRequest.sendPostRequest(ALL_EVENTS_ENDPOINT, "userId=" + USER_ID); + String jsonResponse = httpRequest.sendPostRequest(ALL_EVENTS_ENDPOINT, "userId=" + USER_ID, true); System.out.println(jsonResponse); ObjectMapper objectMapper = new ObjectMapper(); @@ -110,4 +112,4 @@ public class DataController { return objectMapper.readValue(jsonString, Event[].class); } -} +} \ No newline at end of file diff --git a/client/data/src/main/java/res/Event.java b/client/data/src/main/java/res/Event.java index 54ac5e5..90e9d41 100644 --- a/client/data/src/main/java/res/Event.java +++ b/client/data/src/main/java/res/Event.java @@ -2,6 +2,7 @@ package res; import com.sun.jdi.event.StepEvent; +import java.nio.charset.StandardCharsets; import java.time.Duration; import java.time.LocalDate; import java.time.LocalDateTime; @@ -66,21 +67,40 @@ public class Event { String end, LocalDateTime date, int ownerId - ) throws IllegalArgumentException { - if (name.length() < 3) { + ) throws IllegalArgumentException{ + if(name.length() < 3){ throw new IllegalArgumentException("Der Name muss eine L\u00e4nge von 3 haben."); } - Pattern pattern = Pattern.compile("[A-Za-zÄÖÜäöü0-9 =!?+*/$%€.:,;_<>()-]*"); + Pattern pattern = Pattern.compile("[A-Za-z\u00e4\u00f6\u00fc\u00c4\u00d6\u00dc\u00df0-9 =!?+*/$.:,;_<>()-]*"); Matcher matcher = pattern.matcher(name); - if (!matcher.matches()) { - throw new IllegalArgumentException("Der Name Darf nur aus Zahlen, Buchstaben und " + - "folgenden Sonderzeichen bestehen: =!?+*/$%€.:,;_ <>()-"); + if(!matcher.matches()){ + System.out.println(name); + + byte[] bytes = name.getBytes(StandardCharsets.UTF_16); + + String utf8EncodedString = new String(bytes, StandardCharsets.UTF_16); + System.out.println(utf8EncodedString); + + for (char c : (name).toCharArray()) { + System.out.print(c + " " + (int)c + ", "); + } + System.out.println(); + for (char c : (name).toCharArray()) { + System.out.print(c + " " + (int)c + ", "); + } + System.out.println(); + for (char c : ("TäöüÄÖÜ").toCharArray()) { + System.out.print(c + " " + (int)c + ", "); + } + System.out.println(); + + throw new IllegalArgumentException("Der Name darf nur aus Zahlen, Buchstaben und folgenden Sonderzeichen bestehen: \u00e4\u00f6\u00fc \u00c4\u00d6\u00dc \u00df =!?+*/$.:,;_ <>()-"); } - if (priority < 0) { + if(priority < 0){ throw new IllegalArgumentException("Bitte eine Priorit\u00e4t w\u00e4hlen."); } LocalDateTime today = LocalDateTime.now().toLocalDate().atStartOfDay(); - if (Duration.between(today, date).isNegative()) { + if(Duration.between(today, date).isNegative()){ throw new IllegalArgumentException("Das Datum muss in der Zukunft liegen."); } @@ -107,7 +127,7 @@ public class Event { } public void setName(String name) { - this.name = name; + this.name = convertToASCII(name); } public int getPriority() { @@ -193,4 +213,9 @@ public class Event { "&isFullDay=" + isFullDay() + "&isPrivate=" + isPrivate(); } + + private String convertToASCII(String s){ + byte[] germanBytes = s.getBytes(); + return new String(germanBytes, StandardCharsets.US_ASCII); + } } diff --git a/client/data/src/main/java/res/HttpRequest.java b/client/data/src/main/java/res/HttpRequest.java index c565e31..398f157 100644 --- a/client/data/src/main/java/res/HttpRequest.java +++ b/client/data/src/main/java/res/HttpRequest.java @@ -9,10 +9,23 @@ import java.nio.charset.StandardCharsets; import java.util.Arrays; public class HttpRequest { - public String sendPostRequest(String urlString, String urlParameters) throws Exception { + public String sendPostRequest(String urlString, String urlParameters, boolean sendAuth) throws Exception { byte[] postData = urlParameters.getBytes(StandardCharsets.UTF_8); int postDataLength = postData.length; + /* + URL url = new URL("http://test.de:8080/event/add"); + HttpURLConnection http = (HttpURLConnection)url.openConnection(); + http.setRequestMethod("POST"); + http.setDoOutput(true); + http.setRequestProperty("Accept", "application/json"); + http.setRequestProperty("Authorization", "Bearer {token}"); + http.setRequestProperty("Content-Type", ""); + http.setRequestProperty("Content-Length", "0"); + + System.out.println(http.getResponseCode() + " " + http.getResponseMessage()); + http.disconnect(); + */ URL url = new URL(urlString); HttpURLConnection con = (HttpURLConnection) url.openConnection(); @@ -23,6 +36,12 @@ public class HttpRequest { con.setRequestProperty("charset", "utf-8"); con.setRequestProperty("Content-Length", Integer.toString(postDataLength)); con.setUseCaches(false); + + if(sendAuth){ + con.setRequestProperty("Accept", "application/json"); + con.setRequestProperty("Authorization", "Bearer {token}"); + } + try (DataOutputStream wr = new DataOutputStream(con.getOutputStream())) { wr.write(postData); }