Compare commits

..

93 Commits

Author SHA1 Message Date
136ead454d Refactor the create-event.css 2022-02-07 12:34:24 +01:00
0f4ad96dc0 Refactor the login.css 2022-02-07 12:13:08 +01:00
33f8c326d1 Refactor the create-user.css and fixed the option-view.css 2022-02-07 12:07:42 +01:00
de4811ee12 Refactor the option-view.css 2022-02-07 11:48:53 +01:00
f3a7ce21cc Refactor the main-view.css 2022-02-07 11:42:03 +01:00
a29f6d204f Merge branch 'merge' into CSS-Refactor
# Conflicts:
#	client/app/src/main/resources/main/main-view.css
#	client/app/src/main/resources/main/main-view.fxml
2022-02-07 11:22:31 +01:00
ede28ae4a7 Commit the new Files 2022-02-07 11:06:21 +01:00
4c94cadf11 Merge branch 'merge' into Comments
# Conflicts:
#	client/app/src/main/java/customUI/Button.java
#	client/app/src/main/java/customUI/Converter.java
#	client/app/src/main/java/customUI/Label.java
#	client/app/src/main/java/customUI/Tooltip.java
#	client/app/src/main/java/events/EditEventController.java
#	client/app/src/main/java/helper/SvgBtnCreator.java
#	client/app/src/main/java/main/MainController.java
#	client/data/src/main/java/container/Event.java
#	client/data/src/main/java/res/DataController.java
#	client/data/src/main/java/res/HttpRequest.java
2022-02-07 10:40:53 +01:00
351bcd524d Minor fixes 2022-02-01 14:05:22 +01:00
dc78d69a00 Refactor 2022-01-31 23:03:29 +01:00
30e0afb86c Fixed Time and Datepicker 2022-01-31 21:51:45 +01:00
d980edeaad Refactored DayPane; 2022-01-31 21:16:01 +01:00
31dbeec55a Updated onAddBtnClick 2022-01-31 21:00:08 +01:00
47739a3783 Fixed edit events 2022-01-31 20:58:18 +01:00
b460a77e8c Refactored svgButtons 2022-01-31 13:27:50 +01:00
8c3925ea1a Refactor 2022-01-31 12:42:31 +01:00
2fbf3895c5 Refactor 2022-01-31 08:51:53 +01:00
d41abdbad9 Save login 2022-01-29 20:15:20 +01:00
db339eeada Refactor 2022-01-29 19:27:06 +01:00
245314a887 Renamed package;
Implemented create user
2022-01-29 12:03:09 +01:00
72fdce471b Fixed encoding at http-request 2022-01-29 11:44:25 +01:00
780ecbee0f Changed encoding to utf-8 2022-01-29 10:06:28 +01:00
4e07b01b6a Get all user 2022-01-28 05:54:26 +01:00
2f70515407 Format 2022-01-28 05:53:53 +01:00
a4ce8940ab Fixed raw use of parameterized class 'JFXComboBox' 2022-01-26 15:08:44 +01:00
91daf95990 Tried adding comboBox content 2022-01-26 15:04:32 +01:00
596343fe47 Removed unused imports 2022-01-26 14:27:16 +01:00
f133257194 Map user with JSON 2022-01-26 13:55:12 +01:00
4aafae9896 Merge branch 'option-ui' into merge
# Conflicts:
#	client/data/src/main/java/res/DataController.java
2022-01-26 13:26:15 +01:00
cb5982ef2d Added user class 2022-01-26 13:18:05 +01:00
2147ca1ad8 Added user methods 2022-01-25 20:01:22 +01:00
c4e24549d5 Use edit-event-endpoint to edit events 2022-01-25 19:37:49 +01:00
5e9a09fc7d print msg when config.json is missing 2022-01-25 19:20:06 +01:00
f0e431bf6c Refactored send get-request 2022-01-25 19:19:18 +01:00
f1f07a3515 Fixed main class 2022-01-25 19:18:38 +01:00
898054bb63 Comments all Files with Creator name 2022-01-25 11:14:16 +01:00
3848baddb6 Updated ui 2022-01-24 14:11:34 +01:00
b963a53d85 Fixed gitignore 2022-01-24 13:44:48 +01:00
057c4504d4 First view draft and create user connected 2022-01-24 13:42:11 +01:00
4f6d9670d0 Added logout function 2022-01-24 13:28:19 +01:00
8260c3f732 Removed file 2022-01-24 12:46:53 +01:00
c79e9a4581 Fixed special Chars 2022-01-24 12:45:08 +01:00
4ce4445d50 Merged 2022-01-23 22:05:23 +01:00
7aa615ce54 Merge branch '2410-develop' into merge
# Conflicts:
#	client/app/src/main/java/main/MainController.java
2022-01-23 21:33:42 +01:00
2c3d646c47 Added save login 2022-01-23 21:21:16 +01:00
e021809fd7 use camelCase for static methods 2022-01-23 17:41:40 +01:00
c040e54fb8 Added Config 2022-01-23 17:40:49 +01:00
4020d59284 Added a passwordField 2022-01-23 17:33:26 +01:00
0840ee1d12 Refactored code and added tooltips to the buttons 2022-01-21 11:13:44 +01:00
ea3288a345 Fixed bg-color 2022-01-21 07:58:27 +01:00
1439a67e7c Added svgButton to calender navigation (TODO: Fix bg.color) 2022-01-20 18:27:02 +01:00
14910083f4 Added svgButtons to the left navigation 2022-01-20 15:08:58 +01:00
9345dbc868 Moved SvgBtnCreator to helper package 2022-01-20 14:40:50 +01:00
45c58ea37f Made changeable size of svg 2022-01-20 13:52:35 +01:00
83c1ae6814 Made svg size to const 2022-01-20 13:50:59 +01:00
0d626bb6dc Refactored create svg Buttons 2022-01-20 13:49:07 +01:00
2f0c4b2a4c Added edit-function 2022-01-20 13:33:49 +01:00
141d294b79 Merge branch 'Add-SVGs' into merge 2022-01-19 11:45:04 +01:00
2269f05f52 Fixed event/add endpoint 2022-01-19 00:30:13 +01:00
78505097db Fixed event/all and event/del endpoints 2022-01-19 00:16:23 +01:00
7a119a8aed Merge branch 'merge' into 2410-develop 2022-01-18 22:30:08 +01:00
22e7d30678 Fixed MainApplication the second 2022-01-18 12:56:43 +01:00
3c0ebd24d7 Fixed MainApplication 2022-01-18 12:51:53 +01:00
f649b618cf Merge remote-tracking branch 'origin/merge' into merge 2022-01-18 12:46:31 +01:00
0132077c62 Added edit and delete event svgs 2022-01-18 12:37:58 +01:00
5dafdf08b4 Fixed mainView calander nav Buttons 2022-01-18 10:00:33 +01:00
cf960ff6d6 Fixed mainView 2022-01-18 09:57:07 +01:00
521b1cb2f7 Merge remote-tracking branch 'origin/Update-components-to-JFoenix' into Update-components-to-JFoenix
# Conflicts:
#	client/app/src/main/java/main/CreateEventController.java
2022-01-18 09:48:22 +01:00
a24addf6ec Changed checkbox to toggleButton, refactored code 2022-01-18 09:46:36 +01:00
051000169e Updated login, main-wiew and the controllers 2022-01-15 09:24:30 +01:00
0893c4661e Updated event controller 2022-01-15 09:14:43 +01:00
53b631678a Create/edit event uses JFonix compnents 2022-01-14 23:52:11 +01:00
07c27e84d8 Changed create-event.fxml 2022-01-14 23:33:17 +01:00
0924625a0e Test to change component to JFoenix 2022-01-14 21:22:50 +01:00
947f31f20e Fixed login token 2022-01-14 19:37:06 +01:00
3fe16186e2 Improved layout, removed typ 2022-01-14 11:11:05 +01:00
654f34e30e TimPicker now uses 24h time format 2022-01-14 10:44:37 +01:00
baeed584ab TimPicker now uses 24h time format 2022-01-14 10:14:17 +01:00
b12de1cd2e Use Tuple as response 2022-01-13 23:14:36 +01:00
097cce14e8 Save toke on login 2022-01-13 17:35:16 +01:00
ce309581ed Added TimePicker to edit event, time is used 2022-01-13 11:02:49 +01:00
f0405b5d86 Added timePicker to mainGrid 2022-01-13 10:11:09 +01:00
0d105be15c Created TimePicker and tried to add to grid 2022-01-13 08:30:56 +01:00
646da71e8a Merge branch '2410-develop' into merge
# Conflicts:
#	client/app/src/main/java/main/MainController.java
2022-01-13 08:28:44 +01:00
46606a5afc Suppress warnings 2022-01-13 08:26:51 +01:00
b205c96f85 Fixed String encoding 2022-01-13 07:57:10 +01:00
0ef383aa7f Fixed String encoding 2022-01-11 17:14:30 +01:00
ea6420e234 Added Auth-Header 2022-01-11 17:12:37 +01:00
eb55d5c650 Implementet JFoenix 2022-01-11 12:13:24 +01:00
f933690ba0 Added UI to edit events 2022-01-11 07:46:39 +01:00
12fce27d04 Merge remote-tracking branch 'origin/merge' into merge
# Conflicts:
#	client/data/src/main/java/res/Event.java
2022-01-10 13:24:42 +01:00
d34d09aa2b Changed REST-endpoints 2022-01-10 13:22:59 +01:00
7e3bd66571 Improvement of the main-view.fxml and main-view.css 2021-12-13 12:46:01 +01:00
37 changed files with 1872 additions and 565 deletions

2
.gitignore vendored
View File

@ -72,3 +72,5 @@ crashlytics-build.properties
.gradle/ .gradle/
build/ build/
/client/config.json

View File

@ -5,24 +5,33 @@ plugins {
} }
javafx { javafx {
version = "11" version = "11.0.2"
modules( modules(
"javafx.controls", "javafx.controls",
"javafx.fxml" "javafx.fxml"
) )
} }
tasks.withType<JavaCompile> {
options.encoding = "UTF-8"
}
application { application {
mainClassName = "client.MainApplication" mainClassName = "main.MainApplication"
}
repositories {
mavenCentral()
} }
dependencies { dependencies {
implementation("com.jfoenix:jfoenix:9.0.10")
implementation(project(":data")) implementation(project(":data"))
} }
val jar by tasks.getting(Jar::class) { val jar by tasks.getting(Jar::class) {
manifest { manifest {
attributes["Main-Class"] = "client.Launcher" attributes["Main-Class"] = "main.Launcher"
} }
from({ from({
configurations.runtimeClasspath.get().map { if (it.isDirectory) it else zipTree(it) } configurations.runtimeClasspath.get().map { if (it.isDirectory) it else zipTree(it) }

View File

@ -0,0 +1,100 @@
package events;
import com.jfoenix.controls.*;
import helper.HttpRequestException;
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 container.DataController;
import container.Event;
import java.time.LocalTime;
import java.time.format.FormatStyle;
import java.util.Locale;
public class CreateEventController {
@FXML
private GridPane mainGrid;
@FXML
protected JFXDatePicker datePickerDate;
@FXML
protected JFXTextField textName;
@FXML
protected JFXComboBox<String> comboBoxPriority;
@FXML
private JFXToggleButton toggleBtnIsFullDay;
@FXML
private JFXToggleButton toggleBtnIsPrivate;
@FXML
private Label labelError;
@FXML
private JFXTimePicker timeStart;
@FXML
private JFXTimePicker timeEnd;
public CreateEventController() {
}
//Marco Kühn//
@FXML
public void initialize() {
StringConverter<LocalTime> defaultConverter = new LocalTimeStringConverter(FormatStyle.SHORT, Locale.GERMANY);
timeStart.set24HourView(true);
timeStart.setConverter(defaultConverter);
timeEnd.set24HourView(true);
timeEnd.setConverter(defaultConverter);
}
//Marc Beyer//
@FXML
protected void createBtnClick(ActionEvent actionEvent) {
try {
if (datePickerDate.getValue() == null) {
throw new IllegalArgumentException("Bitte w\u00e4hle ein Datum aus");
}
System.out.println(datePickerDate.getValue());
Event event = new Event(
textName.getText(),
comboBoxPriority.getSelectionModel().getSelectedIndex(),
toggleBtnIsFullDay.isSelected(),
toggleBtnIsPrivate.isSelected(),
timeStart.getValue(),
timeEnd.getValue(),
datePickerDate.getValue().atStartOfDay(),
(int) DataController.USER_ID
);
System.out.println(event.getAsUrlParam());
sendHttpRequest(event);
Stage stage = (Stage) ((Node) actionEvent.getSource()).getScene().getWindow();
stage.close();
} catch (Exception e) {
labelError.setText(e.getMessage());
}
}
//Marc Beyer//
protected void sendHttpRequest(Event event) throws HttpRequestException {
DataController dataController = new DataController();
dataController.createEvent(event);
}
//Marc Beyer//
@FXML
protected void abortBtnClick(ActionEvent event) {
Stage stage = (Stage) ((Node) event.getSource()).getScene().getWindow();
stage.close();
}
}

View File

@ -0,0 +1,30 @@
package events;
import helper.HttpRequestException;
import container.DataController;
import container.Event;
public class EditEventController extends CreateEventController{
private Event currentEvent;
public Event getCurrentEvent() {
return currentEvent;
}
public void setCurrentEvent(Event currentEvent) {
this.currentEvent = currentEvent;
textName.setText(currentEvent.getName());
datePickerDate.setValue(currentEvent.getDate().toLocalDate());
comboBoxPriority.getSelectionModel().select(currentEvent.getPriority());
//timeEnd.setValue(currentEvent.getEnd());
}
@Override
protected void sendHttpRequest(Event event) throws HttpRequestException {
DataController dataController = new DataController();
dataController.editEvent(currentEvent, event);
}
}

View File

@ -1,76 +0,0 @@
package main;
import javafx.event.ActionEvent;
import javafx.fxml.FXML;
import javafx.scene.Node;
import javafx.scene.control.*;
import javafx.stage.Stage;
import res.DataController;
import res.Event;
public class CreateEventController {
@FXML
public DatePicker datePickerDate;
@FXML
public TextField textName;
@FXML
public TextField textStart;
@FXML
public TextField textEnd;
@FXML
public ComboBox<String> ComboBoxTyp;
@FXML
public ComboBox<String> ComboBoxPriotity;
@FXML
public CheckBox checkBoxIsFullDay;
@FXML
public CheckBox checkBoxIsPrivate;
@FXML
public Label labelError;
public CreateEventController() {
}
@FXML
public void initialize() {
}
@FXML
protected void createBtnClick(ActionEvent actionEvent) {
try {
if (datePickerDate.getValue() == null) {
throw new IllegalArgumentException("Bitte w\u00e4hle ein Datum aus");
}
Event event = new Event(
textName.getText(),
ComboBoxPriotity.getSelectionModel().getSelectedIndex(),
checkBoxIsFullDay.isSelected(),
checkBoxIsPrivate.isSelected(),
textStart.getText(),
textEnd.getText(),
datePickerDate.getValue().atStartOfDay(),
(int) DataController.USER_ID
);
System.out.println(event.getAsUrlParam());
DataController dataController = new DataController();
dataController.createEvent(event);
Stage stage = (Stage) ((Node) actionEvent.getSource()).getScene().getWindow();
stage.close();
} catch (RuntimeException e) {
labelError.setText(e.getMessage());
}
}
@FXML
protected void abortBtnClick(ActionEvent event) {
Stage stage = (Stage) ((Node) event.getSource()).getScene().getWindow();
stage.close();
}
}

View File

@ -1,44 +1,116 @@
//Marc Beyer//
package main; package main;
import config.Config;
import config.ConfigLoader;
import container.DataController;
import container.HttpRequest;
import javafx.application.Application; import javafx.application.Application;
import javafx.fxml.FXMLLoader; import javafx.fxml.FXMLLoader;
import javafx.scene.Scene; import javafx.scene.Scene;
import javafx.stage.Modality;
import javafx.stage.Stage; import javafx.stage.Stage;
import res.DataController;
import java.io.IOException; import java.io.IOException;
import java.util.Objects; import java.util.Objects;
import java.util.function.Consumer;
public class MainApplication extends Application { public class MainApplication extends Application {
@Override @Override
public void start(Stage stage) throws IOException { public void start(Stage stage) throws IOException {
//wieder ändern zu main-view.fxml Config config = ConfigLoader.load();
FXMLLoader fxmlLoader = new FXMLLoader(MainApplication.class.getResource("../users/create-user.fxml")); if(config == null){
config = new Config(false, -1, "");
}
DataController.SERVER_URL = config.toServerUrl();
System.out.println("Ignore 'Illegal reflective access operation'-Warning. See https://github.com/sshahine/JFoenix/issues/1170");
if(
!config.isSaveLogin()
|| !new DataController().loginWithToken(config.getId(), config.getToken())
){
// Load login-scene
loadLoginScene();
}
if (DataController.USER_ID >= 0) {
if(config.isSaveLogin()){
config.setId(DataController.USER_ID);
config.setToken(HttpRequest.TOKEN);
ConfigLoader.save(config);
}
// Load main-scene
loadMainScene(stage);
System.out.println("Logged in...");
}
}
private void loadMainScene(Stage stage) throws IOException {
FXMLLoader fxmlLoader = new FXMLLoader(MainApplication.class.getResource("main-view.fxml"));
Scene scene = new Scene(fxmlLoader.load(), 1200, 700); Scene scene = new Scene(fxmlLoader.load(), 1200, 700);
scene.getStylesheets().add(Objects.requireNonNull( scene.getStylesheets().add(Objects.requireNonNull(
//wieder ändern zu main-view.css MainApplication.class.getResource("main-view.css")).toExternalForm()
MainApplication.class.getResource("../users/create-user.css")).toExternalForm()); );
stage.setTitle("SharePlaner"); stage.setTitle("SharePlaner");
stage.setScene(scene); stage.setScene(scene);
//wieder löschen
stage.show();
FXMLLoader fxmlLoaderLogin = new FXMLLoader(MainApplication.class.getResource("../users/login.fxml"));
Scene sceneLogin = new Scene(fxmlLoaderLogin.load(), 650, 500);
sceneLogin.getStylesheets().add(Objects.requireNonNull(
MainApplication.class.getResource("../users/login.css")).toExternalForm());
Stage stageLogin = new Stage();
stageLogin.setTitle("Anmelden");
stageLogin.setScene(sceneLogin);
stageLogin.showAndWait();
if (DataController.USER_ID >= 0) {
stage.show(); stage.show();
} }
private void loadLoginScene() {
loadScene(
"Anmelden",
"../users/login.fxml",
"../users/login.css",
650,
500
);
} }
public static void main(String[] args) { public static void main(String[] args) {
launch(); launch();
} }
public static void loadScene(
String title,
String fxml,
String css,
int width,
int height
) {
loadScene(title, fxml, css, width, height, null);
}
public static void loadScene(
String title,
String fxml,
String css,
int width,
int height,
Consumer<FXMLLoader> method
) {
FXMLLoader fxmlLoader = new FXMLLoader(
MainApplication.class.getResource(fxml));
try {
Scene scene = new Scene(fxmlLoader.load(), width, height);
scene.getStylesheets().add(Objects.requireNonNull(
MainApplication.class.getResource(css)).toExternalForm());
Stage stage = new Stage();
stage.setTitle(title);
stage.setScene(scene);
stage.initModality(Modality.APPLICATION_MODAL);
stage.setResizable(false);
if(method != null)method.accept(fxmlLoader);
stage.showAndWait();
} catch (IOException e) {
e.printStackTrace();
}
}
} }

View File

@ -1,36 +1,44 @@
/* Marco Kühn, Marc Beyer */
package main; package main;
import config.Config;
import config.ConfigLoader;
import container.DataController;
import container.Event;
import container.HttpRequest;
import events.EditEventController;
import helper.HttpRequestException;
import javafx.event.ActionEvent; import javafx.event.ActionEvent;
import javafx.event.EventHandler;
import javafx.fxml.FXML; import javafx.fxml.FXML;
import javafx.fxml.FXMLLoader; import javafx.scene.Node;
import javafx.geometry.Pos; import javafx.scene.control.Alert;
import javafx.scene.Scene;
import javafx.scene.control.Button; import javafx.scene.control.Button;
import javafx.scene.control.Label; import javafx.scene.control.Label;
import javafx.scene.control.ScrollPane;
import javafx.scene.layout.GridPane; import javafx.scene.layout.GridPane;
import javafx.scene.layout.HBox; import javafx.scene.layout.HBox;
import javafx.scene.layout.VBox; import javafx.scene.layout.VBox;
import javafx.stage.Modality;
import javafx.stage.Stage; import javafx.stage.Stage;
import res.DataController; import ui.DayPane;
import res.Event; import ui.EventPane;
import ui.SvgBtnCreator;
import java.io.IOException;
import java.time.Duration; import java.time.Duration;
import java.time.LocalDateTime; import java.time.LocalDateTime;
import java.time.format.DateTimeFormatter; import java.time.format.DateTimeFormatter;
import java.util.ArrayList; import java.util.ArrayList;
import java.util.Objects;
public class MainController { public class MainController {
@FXML @FXML
private GridPane calendarGrid; private VBox leftNav;
@FXML @FXML
private Label LabelMonth; private GridPane mainGridPane;
@FXML
private HBox buttonBox;
@FXML
private GridPane calendarGrid;
@FXML
private javafx.scene.control.Label LabelMonth;
private final String[] dayNames = {"Montag", "Dienstag", "Mittwoch", "Donnerstag", "Freitag", "Samstag", "Sonntag"}; private final String[] dayNames = {"Montag", "Dienstag", "Mittwoch", "Donnerstag", "Freitag", "Samstag", "Sonntag"};
private final Label[] dayLabel = new Label[7]; private final Label[] dayLabel = new Label[7];
@ -48,8 +56,9 @@ public class MainController {
public void initialize() { public void initialize() {
createWeek(); createWeek();
setDates(); setDates();
updateEvents(); updateEvents();
createBtns();
leftNav.setSpacing(40);
} }
private void updateEvents() { private void updateEvents() {
@ -58,11 +67,15 @@ public class MainController {
} }
DataController dataController = new DataController(); DataController dataController = new DataController();
ArrayList<Event> eventList = dataController.getAllVisibleEvents(); try {
ArrayList<Event> eventList = dataController.getAllVisibleEvents(weekStartDateTime, weekStartDateTime.plusDays(7));
for (Event event : eventList) { for (Event event : eventList) {
addEvent(event); addEvent(event);
} }
} catch (HttpRequestException e) {
e.printStackTrace();
}
} }
@FXML @FXML
@ -88,118 +101,80 @@ public class MainController {
@FXML @FXML
protected void onAddBtnClick() { protected void onAddBtnClick() {
try { MainApplication.loadScene(
FXMLLoader fxmlLoader = new FXMLLoader( "Termin erstellen",
MainApplication.class.getResource("create-event.fxml")); "create-event.fxml",
Scene scene = new Scene(fxmlLoader.load(), 650, 650); "create-event.css",
scene.getStylesheets().add(Objects.requireNonNull( 650,
MainApplication.class.getResource("create-event.css")).toExternalForm()); 650
Stage stage = new Stage(); );
stage.setTitle("Termin erstellen");
stage.setScene(scene);
stage.initModality(Modality.APPLICATION_MODAL);
stage.setResizable(false);
//stage.initStyle(StageStyle.UNDECORATED);
stage.showAndWait();
} catch (IOException e) {
e.printStackTrace();
}
updateEvents(); updateEvents();
} }
protected void onSettingBtnClick(){
MainApplication.loadScene(
"Einstellungen",
"option-view.fxml",
"option-view.css",
650,
600
);
}
protected void onLogoutBtnClick(ActionEvent event){
ConfigLoader.save(new Config());
DataController.USER_ID = -1;
HttpRequest.TOKEN = "";
Stage stage = (Stage) ((Node) event.getSource()).getScene().getWindow();
stage.close();
}
private void createWeek() { private void createWeek() {
for (int i = 0; i < 7; i++) { for (int i = 0; i < 7; i++) {
Label label = new Label(); DayPane dayPane = new DayPane();
label.setText(dayNames[i]); this.dayLabel[i] = dayPane.getDayLabel();
label.setMaxHeight(Double.MAX_VALUE); calendarGrid.add(dayPane.getDayLabel(), i, 0);
label.setMaxWidth(Double.MAX_VALUE); dayVBoxes[i] = dayPane.getDayVBox();
label.getStyleClass().add("labelDays"); calendarGrid.add(dayPane, i, 1);
dayLabel[i] = label;
calendarGrid.add(label, i, 0);
ScrollPane scrollPane = new ScrollPane();
VBox vBox = new VBox();
vBox.getStyleClass().add("vBoxDays");
vBox.setSpacing(10);
dayVBoxes[i] = vBox;
scrollPane.setContent(vBox);
scrollPane.setFitToWidth(true);
scrollPane.setFitToHeight(true);
scrollPane.setHbarPolicy(ScrollPane.ScrollBarPolicy.AS_NEEDED);
scrollPane.getStyleClass().add("scrollDays");
calendarGrid.add(scrollPane, i, 1);
} }
} }
private void addEvent(Event event) { private void addEvent(Event event) {
VBox vBox = new VBox(); EventPane eventPane = new EventPane(event);
vBox.getStyleClass().add("event"); eventPane.getEditBtn().setOnAction(event1 -> {
vBox.setSpacing(5); MainApplication.loadScene(
"Termin bearbeiten",
HBox btnHBox = new HBox(); "edit-event.fxml",
btnHBox.setAlignment(Pos.BOTTOM_RIGHT); "create-event.css",
Button deleteBtn = new Button(); 650,
deleteBtn.setText(" X "); 650,
deleteBtn.setOnAction(e -> { fxmlLoader -> {
DataController dataController = new DataController(); EditEventController editEventController = fxmlLoader.getController();
dataController.deleteEvent(event.getId()); editEventController.setCurrentEvent(event);
}
);
updateEvents(); updateEvents();
}); });
Button editBtn = new Button();
editBtn.setText("edit");
btnHBox.getChildren().add(editBtn);
btnHBox.getChildren().add(deleteBtn);
vBox.getChildren().add(btnHBox);
Label nameLabel = new Label(event.getName()); eventPane.getDeleteBtn().setOnAction(e -> {
vBox.getChildren().add(nameLabel); DataController dataController = new DataController();
try {
if (event.getStart() != null || event.getEnd() != null) { dataController.deleteEvent(event.getOwnerId(), event.getId(), event.getDate());
String timeStr = (event.getStart() != null ? formatTime(event.getStart()) : "") } catch (HttpRequestException ex) {
+ (event.getEnd() != null ? " - " + formatTime(event.getEnd()) : ""); new Alert(Alert.AlertType.ERROR, ex.getMessage()).showAndWait();
Label timeLabel = new Label(timeStr);
vBox.getChildren().add(timeLabel);
} }
updateEvents();
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);
if (event.isFullDay()) {
Label fullDayLabel = new Label("Dieser Termin bockiert den ganzen Tag!");
vBox.getChildren().add(fullDayLabel);
}
LocalDateTime eventDate = event.getDate(); LocalDateTime eventDate = event.getDate();
int day = (int) Duration.between( int day = (int) Duration.between(
weekStartDateTime.toLocalDate().atStartOfDay(), eventDate.toLocalDate().atStartOfDay()).toDays(); weekStartDateTime.toLocalDate().atStartOfDay(), eventDate.toLocalDate().atStartOfDay()).toDays();
if (day >= 0 && day < 7) { if (day >= 0 && day < 7) {
dayVBoxes[day].getChildren().add(vBox); dayVBoxes[day].getChildren().add(eventPane);
} }
} }
private String formatTime(String time) {
String[] timeArr = time.split(":");
if (timeArr.length > 2) {
return timeArr[0] + ":" + timeArr[1];
}
return time;
}
private void setDates() { private void setDates() {
DateTimeFormatter dateFormatter = DateTimeFormatter.ofPattern("LLLL yyyy"); DateTimeFormatter dateFormatter = DateTimeFormatter.ofPattern("LLLL yyyy");
DateTimeFormatter dayFormatter = DateTimeFormatter.ofPattern("E dd.MM"); DateTimeFormatter dayFormatter = DateTimeFormatter.ofPattern("E dd.MM");
@ -217,4 +192,39 @@ public class MainController {
LabelMonth.setText(dateFormatter.format(weekStartDateTime)); LabelMonth.setText(dateFormatter.format(weekStartDateTime));
} }
private void createBtns(){
Button addBtn = SvgBtnCreator.createAddBtn();
addBtn.setOnAction(e -> onAddBtnClick());
addBtn.getStyleClass().add("main-btn");
leftNav.getChildren().add(addBtn);
Button settingsBtn = SvgBtnCreator.createSettingBtn();
settingsBtn.setOnAction(e -> onSettingBtnClick());
settingsBtn.getStyleClass().add("main-btn");
leftNav.getChildren().add(settingsBtn);
Button logoutBtn = SvgBtnCreator.createLogoutBtn();
logoutBtn.setOnAction(this::onLogoutBtnClick);
logoutBtn.getStyleClass().add("main-btn");
leftNav.getChildren().add(logoutBtn);
Button backBtn = SvgBtnCreator.createBackBtn();
backBtn.setOnAction(e -> onBackClick());
backBtn.getStyleClass().add("navBtn");
GridPane.setColumnIndex(backBtn, 1);
buttonBox.getChildren().add(backBtn);
Button todayBtn = SvgBtnCreator.createTodayBtn();
todayBtn.setOnAction(e -> onTodayClick());
todayBtn.getStyleClass().add("navBtn");
GridPane.setColumnIndex(todayBtn, 2);
buttonBox.getChildren().add(todayBtn);
Button nextBtn = SvgBtnCreator.createNextBtn();
nextBtn.setOnAction(e -> onNextClick());
nextBtn.getStyleClass().add("navBtn");
GridPane.setColumnIndex(nextBtn, 3);
buttonBox.getChildren().add(nextBtn);
}
} }

View File

@ -0,0 +1,139 @@
/* Marco Kühn */
package main;
import com.jfoenix.controls.*;
import config.Config;
import config.ConfigLoader;
import container.HttpRequest;
import helper.HttpRequestException;
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.control.Alert;
import javafx.scene.control.ButtonType;
import javafx.scene.control.Label;
import javafx.scene.layout.GridPane;
import javafx.stage.Stage;
import container.DataController;
import container.User;
import users.EditUserController;
import java.util.ArrayList;
import java.util.List;
import java.util.Optional;
public class OptionController {
@FXML
private JFXButton updateUserBtn;
@FXML
private JFXButton deleteUserBtn;
@FXML
private JFXButton createUserBtn;
@FXML
private JFXToggleButton saveLoginTBtn;
@FXML
private Label labelError;
@FXML
private GridPane mainGrid;
private JFXComboBox<String> comboBox;
private DataController dataController;
private List<User> users;
private Config config;
@FXML
public void initialize(){
dataController = new DataController();
try{
users = dataController.getAllUser();
} catch (HttpRequestException e){
users = new ArrayList<>();
}
ObservableList<String> observableUserList = FXCollections.observableArrayList();
for (User user: users) {
observableUserList.add(user.getLogin());
}
comboBox = new JFXComboBox<>(observableUserList);
comboBox.getStyleClass().add("comboBox");
mainGrid.add(comboBox, 2,2);
config = ConfigLoader.load();
if(config == null){
config = new Config(false, -1, "");
}
saveLoginTBtn.setSelected(config.isSaveLogin());
}
public void onBackBtnClick(ActionEvent actionEvent) {
Stage stage = (Stage) ((Node) actionEvent.getSource()).getScene().getWindow();
stage.close();
}
public void onCreateBtnClick(ActionEvent actionEvent) {
MainApplication.loadScene(
"User erstellen",
"../users/create-user.fxml",
"../users/create-user.css",
800,
650
);
}
public void onUpdateBtnClick(ActionEvent actionEvent) {
int editIndex = comboBox.getSelectionModel().getSelectedIndex();
if(editIndex < 0 || editIndex >= users.size()) return;
MainApplication.loadScene(
"User bearbeiten",
"../users/edit-user.fxml",
"../users/create-user.css",
800,
650,
fxmlLoader -> {
EditUserController editUserController = fxmlLoader.getController();
editUserController.setCurrentUser(users.get(editIndex));
}
);
}
public void onDeleteBtnClick(ActionEvent actionEvent) {
Alert alert = new Alert(Alert.AlertType.CONFIRMATION, "Wirklich löschen?");
Optional<ButtonType> result = alert.showAndWait();
if(result.isPresent() && result.get() == ButtonType.OK){
int removeIndex = comboBox.getSelectionModel().getSelectedIndex();
try {
dataController.deleteUser(users.get(removeIndex));
} catch (HttpRequestException e) {
Alert alert1 = new Alert(Alert.AlertType.ERROR, e.getMessage());
alert1.showAndWait();
return;
}
comboBox.getItems().remove(removeIndex);
users.remove(removeIndex);
}
}
private void setUserAtController(FXMLLoader fxmlLoader){
int editIndex = comboBox.getSelectionModel().getSelectedIndex();
EditUserController editUserController = fxmlLoader.getController();
editUserController.setCurrentUser(users.get(editIndex));
}
public void toggledBtn(ActionEvent actionEvent) {
config.setSaveLogin(saveLoginTBtn.isSelected());
if(config.isSaveLogin()){
config.setId(DataController.USER_ID);
config.setToken(HttpRequest.TOKEN);
} else {
config.setId(-1);
config.setToken("");
}
ConfigLoader.save(config);
}
}

View File

@ -0,0 +1,38 @@
package ui;
import javafx.scene.control.Label;
import javafx.scene.control.ScrollPane;
import javafx.scene.layout.VBox;
public class DayPane extends ScrollPane {
private final Label dayLabel;
private final VBox dayVBox;
public DayPane() {
dayLabel = new Label();
dayLabel.setMaxHeight(Double.MAX_VALUE);
dayLabel.setMaxWidth(Double.MAX_VALUE);
dayLabel.getStyleClass().add("labelDays");
dayVBox = new VBox();
dayVBox.getStyleClass().add("vBoxDays");
dayVBox.setSpacing(10);
setContent(dayVBox);
setFitToWidth(true);
setFitToHeight(true);
setHbarPolicy(ScrollPane.ScrollBarPolicy.AS_NEEDED);
getStyleClass().add("scrollDays");
getStyleClass().add("scrollDays");
}
public Label getDayLabel() {
return dayLabel;
}
public VBox getDayVBox() {
return dayVBox;
}
}

View File

@ -0,0 +1,83 @@
package ui;
import container.Event;
import javafx.geometry.Pos;
import javafx.scene.Group;
import javafx.scene.control.Button;
import javafx.scene.control.Label;
import javafx.scene.layout.HBox;
import javafx.scene.layout.VBox;
public class EventPane extends VBox {
private Button deleteBtn;
private Button editBtn;
public EventPane(Event event) {
this.getStyleClass().add("event");
this.setSpacing(5);
HBox btnHBox = new HBox();
btnHBox.setAlignment(Pos.BOTTOM_RIGHT);
Group svgDel = new Group(
SvgBtnCreator.createPath("M0 0h24v24H0z", "transparent", "transparent"),
SvgBtnCreator.createPath("M6 19c0 1.1.9 2 2 2h8c1.1 0 2-.9 2-2V7H6v12zM19 4h-3.5l-1-1h-5l-1 1H5v2h14V4z",
"white", "gray")
);
deleteBtn = SvgBtnCreator.createBtn(svgDel, 24, "", "Löschen des Termins");
deleteBtn.getStyleClass().add("deleteEventBtn");
Group svgEdit = new Group(
SvgBtnCreator.createPath("M0 0h24v24H0z", "transparent", "transparent"),
SvgBtnCreator.createPath("M3 17.25V21h3.75L17.81 9.94l-3.75-3.75L3 17.25zM20.71 7.04c.39-.39.39-1.02 0-1.41l-2.34-2.34c-.39-.39-1.02-.39-1.41 0l-1.83 1.83 3.75 3.75 1.83-1.83z",
"white", "gray")
);
editBtn = SvgBtnCreator.createBtn(svgEdit, 24, "", "Bearbeiten des Termins");
editBtn.getStyleClass().add("editEventBtn");
btnHBox.getChildren().add(editBtn);
btnHBox.getChildren().add(deleteBtn);
this.getChildren().add(btnHBox);
Label nameLabel = new Label(event.getName());
nameLabel.setWrapText(true);
this.getChildren().add(nameLabel);
if (event.getStart() != null || event.getEnd() != null) {
String timeStr = (event.getStart() != null ? formatTime(event.getStart()) : "")
+ (event.getEnd() != null ? " - " + formatTime(event.getEnd()) : "");
Label timeLabel = new Label(timeStr);
this.getChildren().add(timeLabel);
}
Label typeLabel = new Label("Wer: " + event.getOwnerName());
this.getChildren().add(typeLabel);
Label prioLabel = new Label("Priorität: " + event.getPriority());
this.getChildren().add(prioLabel);
if (event.isFullDay()) {
Label fullDayLabel = new Label("Dieser Termin bockiert den ganzen Tag!");
fullDayLabel.setWrapText(true);
this.getChildren().add(fullDayLabel);
}
}
public Button getDeleteBtn() {
return deleteBtn;
}
public Button getEditBtn() {
return editBtn;
}
private String formatTime(String time) {
String[] timeArr = time.split(":");
if (timeArr.length > 2) {
return timeArr[0] + ":" + timeArr[1];
}
return time;
}
}

View File

@ -0,0 +1,91 @@
package ui;
import javafx.geometry.Bounds;
import javafx.scene.Group;
import javafx.scene.control.*;
import javafx.scene.shape.SVGPath;
public class SvgBtnCreator {
public static Button createBtn(Group group, int svgSize, String styleClass, String toolTip) {
Button btn = new Button();
Bounds boundsDel = group.getBoundsInParent();
double scaleDel = Math.min(svgSize / boundsDel.getWidth(), svgSize / boundsDel.getHeight());
group.setScaleX(scaleDel);
group.setScaleY(scaleDel);
btn.setGraphic(group);
btn.setMaxSize(svgSize, svgSize);
btn.setMinSize(svgSize, svgSize);
btn.setContentDisplay(ContentDisplay.GRAPHIC_ONLY);
btn.getStyleClass().add(styleClass);
Tooltip tooltip = new Tooltip(toolTip);
btn.setTooltip(tooltip);
return btn;
}
public static SVGPath createPath(String d, String fill, String hoverFill) {
SVGPath path = new SVGPath();
path.getStyleClass().add("svg");
path.setContent(d);
path.setStyle("-fill:" + fill + ";-hover-fill:"+hoverFill+';');
return path;
}
public static Button createAddBtn(){
Group svgAdd = new Group(
createPath("M0 0h24v24H0z", "transparent", "transparent"),
createPath("M19 13h-6v6h-2v-6H5v-2h6V5h2v6h6v2z",
"white", "gray")
);
return createBtn(svgAdd, 40, "main-btn", "Erstellt einen neuen Termin");
}
public static Button createSettingBtn(){
Group svgSettings = new Group(
createPath("M0 0h24v24H0V0z", "transparent", "transparent"),
createPath("M19.14,12.94c0.04-0.3,0.06-0.61,0.06-0.94c0-0.32-0.02-0.64-0.07-0.94l2.03-1.58c0.18-0.14,0.23-0.41,0.12-0.61 l-1.92-3.32c-0.12-0.22-0.37-0.29-0.59-0.22l-2.39,0.96c-0.5-0.38-1.03-0.7-1.62-0.94L14.4,2.81c-0.04-0.24-0.24-0.41-0.48-0.41 h-3.84c-0.24,0-0.43,0.17-0.47,0.41L9.25,5.35C8.66,5.59,8.12,5.92,7.63,6.29L5.24,5.33c-0.22-0.08-0.47,0-0.59,0.22L2.74,8.87 C2.62,9.08,2.66,9.34,2.86,9.48l2.03,1.58C4.84,11.36,4.8,11.69,4.8,12s0.02,0.64,0.07,0.94l-2.03,1.58 c-0.18,0.14-0.23,0.41-0.12,0.61l1.92,3.32c0.12,0.22,0.37,0.29,0.59,0.22l2.39-0.96c0.5,0.38,1.03,0.7,1.62,0.94l0.36,2.54 c0.05,0.24,0.24,0.41,0.48,0.41h3.84c0.24,0,0.44-0.17,0.47-0.41l0.36-2.54c0.59-0.24,1.13-0.56,1.62-0.94l2.39,0.96 c0.22,0.08,0.47,0,0.59-0.22l1.92-3.32c0.12-0.22,0.07-0.47-0.12-0.61L19.14,12.94z M12,15.6c-1.98,0-3.6-1.62-3.6-3.6 s1.62-3.6,3.6-3.6s3.6,1.62,3.6,3.6S13.98,15.6,12,15.6z",
"white", "gray")
);
return createBtn(svgSettings, 40, "main-btn", "Öffnet die Einstellungen");
}
public static Button createLogoutBtn(){
Group svgLogout = new Group(
createPath("M0 0h24v24H0z", "transparent", "transparent"),
createPath("M17 7l-1.41 1.41L18.17 11H8v2h10.17l-2.58 2.58L17 17l5-5zM4 5h8V3H4c-1.1 0-2 .9-2 2v14c0 1.1.9 2 2 2h8v-2H4V5z",
"white", "gray")
);
return createBtn(svgLogout, 40, "main-btn", "Abmelden");
}
public static Button createBackBtn(){
Group svgBack = new Group(
createPath("M0 0h24v24H0z", "transparent", "transparent"),
createPath("M20 11H7.83l5.59-5.59L12 4l-8 8 8 8 1.41-1.41L7.83 13H20v-2z",
"white", "lightgray")
);
return createBtn(svgBack, 40, "navBtn", "Zeigt die vorherige Woche");
}
public static Button createTodayBtn(){
Group svgToday = new Group(
createPath("M0 0h24v24H0z", "transparent", "transparent"),
createPath("M20 3h-1V1h-2v2H7V1H5v2H4c-1.1 0-2 .9-2 2v16c0 1.1.9 2 2 2h16c1.1 0 2-.9 2-2V5c0-1.1-.9-2-2-2zm0 18H4V8h16v13z",
"white", "lightgray")
);
return createBtn(svgToday, 40, "navBtn", "Zeigt die aktuelle Woche");
}
public static Button createNextBtn(){
Group svgNext = new Group(
createPath("M0 0h24v24H0z", "transparent", "transparent"),
createPath("M12 4l-1.41 1.41L16.17 11H4v2h12.17l-5.58 5.59L12 20l8-8z",
"white", "lightgray")
);
return createBtn(svgNext, 40, "navBtn", "Zeigt die nächste Woche");
}
}

View File

@ -1,45 +1,52 @@
//Alex Rechtin//
package users; package users;
import helper.HttpRequestException;
import javafx.event.ActionEvent; import javafx.event.ActionEvent;
import javafx.fxml.FXML; import javafx.fxml.FXML;
import javafx.scene.Node; import javafx.scene.Node;
import javafx.scene.control.Label; import javafx.scene.control.Label;
import javafx.scene.control.PasswordField;
import javafx.scene.control.TextField; import javafx.scene.control.TextField;
import javafx.scene.control.ToggleButton; import javafx.scene.control.ToggleButton;
import javafx.stage.Stage; import javafx.stage.Stage;
import container.DataController;
import container.User;
import java.util.Objects; import java.util.Objects;
public class CreateUserController { public class CreateUserController {
public TextField textName; @FXML
public TextField textPassword; protected TextField textName;
public TextField textPasswordSecond; @FXML
public ToggleButton checkButtonIsAdmin; protected PasswordField textPassword;
public TextField textLogin; @FXML
public TextField textForename; protected PasswordField textPasswordSecond;
public Label labelError; @FXML
protected ToggleButton checkButtonIsAdmin;
@FXML
protected TextField textLogin;
@FXML
protected TextField textForename;
@FXML
protected Label labelError;
@FXML @FXML
protected void createUser(ActionEvent event) { protected void createUser(ActionEvent event) {
if (textLogin.getText().trim().isEmpty()){ if (validateNameAndLogin() || validatePassword()) return;
labelError.setText("Bitte Login Namen angeben");
return; User user = new User();
} user.setLogin(textLogin.getText().trim());
if (textForename.getText().trim().isEmpty()) { user.setForename(textForename.getText().trim());
labelError.setText("Bitte Vornamen eingeben!"); user.setName(textName.getText().trim());
return; user.setPassword(textPassword.getText().trim());
} user.setAdmin(checkButtonIsAdmin.isSelected());
if (textName.getText().trim().isEmpty()) {
labelError.setText("Bitte Nachnamen eingeben!"); try {
return; sendHttpRequest(user);
} } catch (HttpRequestException e) {
if (textPassword.getText().trim().isEmpty()) { labelError.setText(e.getMessage());
labelError.setText("Bitte Passwort eingeben!");
return;
}
if (!Objects.equals(textPassword.getText(), textPasswordSecond.getText())){
labelError.setText("Passwörter stimmen nicht überein!");
return; return;
} }
@ -47,6 +54,43 @@ public class CreateUserController {
stage.close(); stage.close();
} }
protected boolean validatePassword() {
if (textPassword.getText().trim().isEmpty()) {
labelError.setText("Bitte Passwort eingeben!");
return true;
}
if (textPassword.getText().trim().length() < 8) {
labelError.setText("Das Passwort muss mindestens 8 Zeichen lang sein!");
return true;
}
if (!Objects.equals(textPassword.getText(), textPasswordSecond.getText())){
labelError.setText("Passwörter stimmen nicht überein!");
return true;
}
return false;
}
protected boolean validateNameAndLogin() {
if (textLogin.getText().trim().isEmpty()){
labelError.setText("Bitte Login Namen angeben");
return true;
}
if (textForename.getText().trim().isEmpty()) {
labelError.setText("Bitte Vornamen eingeben!");
return true;
}
if (textName.getText().trim().isEmpty()) {
labelError.setText("Bitte Nachnamen eingeben!");
return true;
}
return false;
}
protected void sendHttpRequest(User user) throws HttpRequestException {
DataController dataController = new DataController();
dataController.createUser(user);
}
@FXML @FXML
protected void abortBtnClick(ActionEvent event) { protected void abortBtnClick(ActionEvent event) {
Stage stage = (Stage) ((Node) event.getSource()).getScene().getWindow(); Stage stage = (Stage) ((Node) event.getSource()).getScene().getWindow();

View File

@ -0,0 +1,69 @@
/* Marc Beyer */
package users;
import container.DataController;
import container.User;
import helper.HttpRequestException;
import javafx.event.ActionEvent;
import javafx.scene.Node;
import javafx.scene.control.Alert;
import javafx.stage.Stage;
public class EditUserController extends CreateUserController{
private User currentUser;
public User getCurrentUser() {
return currentUser;
}
public void setCurrentUser(User currentUser) {
this.currentUser = currentUser;
textForename.setText(currentUser.getForename());
textName.setText(currentUser.getName());
textLogin.setText(currentUser.getLogin());
checkButtonIsAdmin.setSelected(currentUser.isAdmin());
}
@Override
protected void createUser(ActionEvent event){
if (validateNameAndLogin()) return;
User user = new User();
if(!textPassword.getText().trim().isEmpty() || !textPasswordSecond.getText().trim().isEmpty()){
if (validatePassword()) return;
user.setPassword(textPassword.getText().trim());
}
user.setUserId(currentUser.getUserId());
user.setLogin(textLogin.getText().trim());
user.setForename(textForename.getText().trim());
user.setName(textName.getText().trim());
user.setAdmin(checkButtonIsAdmin.isSelected());
try {
sendHttpRequest(user);
} catch (HttpRequestException e) {
labelError.setText(e.getMessage());
return;
}
if(currentUser.getUserId() == DataController.USER_ID){
Alert alert = new Alert(
Alert.AlertType.WARNING,
"Bitte starte das Programm neu um die Änderungen anzuwenden."
);
alert.showAndWait();
}
Stage stage = (Stage) ((Node) event.getSource()).getScene().getWindow();
stage.close();
}
@Override
protected void sendHttpRequest(User user) throws HttpRequestException {
DataController dataController = new DataController();
dataController.editUser(user);
}
}

View File

@ -1,22 +1,23 @@
//Alex Rechtin//
package users; package users;
import com.jfoenix.controls.*;
import javafx.event.ActionEvent; import javafx.event.ActionEvent;
import javafx.fxml.FXML; import javafx.fxml.FXML;
import javafx.scene.Node; import javafx.scene.Node;
import javafx.scene.control.Label; import javafx.scene.control.Label;
import javafx.scene.control.TextField;
import javafx.stage.Stage; import javafx.stage.Stage;
import res.DataController; import container.DataController;
public class LoginController { public class LoginController {
@FXML @FXML
public TextField userField; private JFXTextField userField;
@FXML @FXML
public TextField passField; private JFXPasswordField passField;
@FXML @FXML
public Label userErrLabel; private Label userErrLabel;
@FXML @FXML
public Label passErrLabel; private Label passErrLabel;
@FXML @FXML
protected void login(ActionEvent event) { protected void login(ActionEvent event) {

View File

@ -1,24 +1,38 @@
/*Marco Kühn*/
* {
-fx-dark-background-color: #3E415F;
-fx-darkest-background-color: #2B2D42;
-fx-bright-background-color: #8D99AE;
-fx-brighter-background-color: #ff5555;
-fx-brightest-background-color: #ffffff;
-fx-bright-border-color: #B0B0B0;
-fx-brighter-text-color: #ffffff;
}
GridPane{ GridPane{
-fx-background-color: #3E415F; -fx-background-color: -fx-dark-background-color;
-fx-padding: 20px; -fx-padding: 20px;
-fx-font-size: 20px; -fx-font-size: 20px;
-fx-font-family: Segoe UI; -fx-font-family: Segoe UI;
-fx-border-insets: 1; -fx-border-insets: 1;
-fx-border-color: #B0B0B0; -fx-border-color: -fx-bright-border-color;
-fx-border-style: solid; -fx-border-style: solid;
-fx-border-width: 2; -fx-border-width: 2;
-fx-effect: dropshadow(three-pass-box, rgba(100, 100, 100, 1), 24, 0.5, 0, 0); -fx-effect: dropshadow(three-pass-box, rgba(100, 100, 100, 1), 24, 0.5, 0, 0);
} }
Label{ Label{
-fx-text-fill: white; -fx-text-fill: -fx-brighter-text-color;
-fx-max-width: 150px; -fx-max-width: 150px;
-fx-min-width: 150px; -fx-min-width: 150px;
} }
.mainLabel{ .mainLabel{
-fx-background-color: #8D99AE; -fx-background-color: -fx-bright-background-color;
-fx-padding: 10px; -fx-padding: 10px;
-fx-max-width: 200px; -fx-max-width: 200px;
-fx-min-width: 200px; -fx-min-width: 200px;
@ -28,19 +42,52 @@ Label{
.inputField{ .inputField{
-fx-padding: 10px; -fx-padding: 10px;
-fx-background-color: -fx-brightest-background-color;
} }
.mainButton{ .mainButton{
-fx-font-weight: bold; -fx-font-weight: bold;
-fx-background-color: -fx-brightest-background-color;
}
JFXButton{
-fx-background-color: -fx-brightest-background-color;
} }
#labelError{ #labelError{
-fx-font-weight: bold; -fx-font-weight: bold;
-fx-max-width: 1000px; -fx-max-width: 1000px;
-fx-text-fill: #ff5555; -fx-text-fill: -fx-brighter-background-color;
-fx-padding: 16px; -fx-padding: 16px;
-fx-min-height: 140px; -fx-min-height: 140px;
-fx-max-height: 400px; -fx-max-height: 400px;
-fx-wrap-text: true; -fx-wrap-text: true;
-fx-font-size: 16px; -fx-font-size: 16px;
} }
.inputDate{
-fx-background-color: -fx-brightest-background-color;
}
.comboBox{
-fx-background-color: -fx-brightest-background-color;
}
.timePicker{
-fx-background-color: -fx-brightest-background-color;
}
.jfx-time-picker .date-picker-popup{
-fx-max-width: 230px;
-fx-min-width: 230px;
}
.jfx-time-picker .date-picker-popup > * > .spinner > .label {
-fx-max-width: 55px;
-fx-min-width: 55px;
}
.jfx-date-picker .date-picker-popup > * > .spinner > .label {
-fx-max-width: 300px;
-fx-min-width: 300px;
}

View File

@ -1,12 +1,16 @@
<?xml version="1.0" encoding="UTF-8"?> <?xml version="1.0" encoding="UTF-8"?>
<!-- Marco Kühn -->
<?import javafx.scene.control.*?> <?import javafx.scene.control.*?>
<?import javafx.scene.layout.*?> <?import javafx.scene.layout.*?>
<?import javafx.collections.FXCollections?> <?import javafx.collections.FXCollections?>
<?import java.lang.String?> <?import java.lang.String?>
<GridPane xmlns="http://javafx.com/javafx" xmlns:fx="http://javafx.com/fxml/1" <?import com.jfoenix.controls.*?>
fx:controller="main.CreateEventController">
<GridPane fx:id="mainGrid" xmlns="http://javafx.com/javafx" xmlns:fx="http://javafx.com/fxml/1"
fx:controller="events.CreateEventController">
<columnConstraints> <columnConstraints>
<ColumnConstraints/> <ColumnConstraints/>
@ -23,26 +27,25 @@
<RowConstraints vgrow="ALWAYS"/> <RowConstraints vgrow="ALWAYS"/>
<RowConstraints vgrow="ALWAYS"/> <RowConstraints vgrow="ALWAYS"/>
<RowConstraints vgrow="ALWAYS"/> <RowConstraints vgrow="ALWAYS"/>
<RowConstraints vgrow="ALWAYS"/>
</rowConstraints> </rowConstraints>
<Label styleClass="mainLabel">Termin anlegen</Label> <Label styleClass="mainLabel">Termin anlegen</Label>
<Label styleClass="inputLabel" GridPane.rowIndex="1">Datum:</Label> <Label styleClass="inputLabel" GridPane.rowIndex="1">Titel:</Label>
<Label styleClass="inputLabel" GridPane.rowIndex="2">Titel:</Label> <Label styleClass="inputLabel" GridPane.rowIndex="2">Datum:</Label>
<Label styleClass="inputLabel" GridPane.rowIndex="3">Von:</Label> <Label styleClass="inputLabel" GridPane.rowIndex="3">Von:</Label>
<Label styleClass="inputLabel" GridPane.rowIndex="4">Bis:</Label> <Label styleClass="inputLabel" GridPane.rowIndex="4">Bis:</Label>
<Label styleClass="inputLabel" GridPane.rowIndex="5">Typ:</Label>
<Label styleClass="inputLabel" GridPane.rowIndex="6">Priorität:</Label>
<Label styleClass="inputLabel" GridPane.rowIndex="7">Ganztägig:</Label>
<Label styleClass="inputLabel" GridPane.rowIndex="8">Privat:</Label>
<DatePicker fx:id="datePickerDate" GridPane.columnIndex="1" GridPane.rowIndex="1" maxWidth="400" minWidth="400"/> <Label styleClass="inputLabel" GridPane.rowIndex="5">Priorität:</Label>
<TextField fx:id="textName" GridPane.columnIndex="1" GridPane.rowIndex="2" maxWidth="400" minWidth="400"/> <Label styleClass="inputLabel" GridPane.rowIndex="6">Ganztägig:</Label>
<TextField fx:id="textStart" GridPane.columnIndex="1" GridPane.rowIndex="3" maxWidth="400" minWidth="400"/> <Label styleClass="inputLabel" GridPane.rowIndex="7">Privat:</Label>
<TextField fx:id="textEnd" GridPane.columnIndex="1" GridPane.rowIndex="4" maxWidth="400" minWidth="400"/>
<ComboBox fx:id="ComboBoxTyp" GridPane.columnIndex="1" GridPane.rowIndex="5" maxWidth="400" minWidth="400"/> <JFXTextField styleClass="inputField" fx:id="textName" GridPane.columnIndex="1" GridPane.rowIndex="1" maxWidth="400" minWidth="400"/>
<ComboBox fx:id="ComboBoxPriotity" GridPane.columnIndex="1" GridPane.rowIndex="6" maxWidth="200" minWidth="200"> <JFXDatePicker styleClass="inputDate" fx:id="datePickerDate" GridPane.columnIndex="1" GridPane.rowIndex="2" maxWidth="200" minWidth="200"/>
<JFXTimePicker styleClass="timePicker" fx:id="timeStart" GridPane.columnIndex="1" GridPane.rowIndex="3" maxWidth="200" minWidth="200"/>
<JFXTimePicker styleClass="timePicker" fx:id="timeEnd" GridPane.columnIndex="1" GridPane.rowIndex="4" maxWidth="200" minWidth="200"/>
<JFXComboBox fx:id="comboBoxPriority" styleClass="comboBox" GridPane.columnIndex="1" GridPane.rowIndex="5" maxWidth="200" minWidth="200">
<items> <items>
<FXCollections fx:factory="observableArrayList"> <FXCollections fx:factory="observableArrayList">
<String fx:value="gering"/> <String fx:value="gering"/>
@ -50,14 +53,14 @@
<String fx:value="hoch"/> <String fx:value="hoch"/>
</FXCollections> </FXCollections>
</items> </items>
</ComboBox> </JFXComboBox>
<CheckBox fx:id="checkBoxIsFullDay" GridPane.columnIndex="1" GridPane.rowIndex="7"/> <JFXToggleButton styleClass="checkbox" fx:id="toggleBtnIsFullDay" GridPane.columnIndex="1" GridPane.rowIndex="6"/>
<CheckBox fx:id="checkBoxIsPrivate" GridPane.columnIndex="1" GridPane.rowIndex="8"/> <JFXToggleButton styleClass="checkbox" fx:id="toggleBtnIsPrivate" GridPane.columnIndex="1" GridPane.rowIndex="7"/>
<Label fx:id="labelError" GridPane.columnIndex="1" GridPane.rowIndex="9"/> <Label fx:id="labelError" GridPane.columnIndex="1" GridPane.rowIndex="8"/>
<HBox GridPane.columnIndex="1" GridPane.rowIndex="10" GridPane.columnSpan="2" alignment="CENTER_RIGHT"> <HBox GridPane.columnIndex="1" GridPane.rowIndex="9" GridPane.columnSpan="2" alignment="CENTER_RIGHT">
<Button onAction="#abortBtnClick" maxWidth="150" minWidth="150">Abbrechen</Button> <JFXButton onAction="#abortBtnClick" maxWidth="150" minWidth="150">Abbrechen</JFXButton>
<Button styleClass="mainButton" onAction="#createBtnClick" maxWidth="150" minWidth="150">Anlegen</Button> <JFXButton styleClass="mainButton" onAction="#createBtnClick" maxWidth="150" minWidth="150">Anlegen</JFXButton>
</HBox> </HBox>
</GridPane> </GridPane>

View File

@ -0,0 +1,66 @@
<?xml version="1.0" encoding="UTF-8"?>
<!-- Marco Kühn -->
<?import javafx.scene.control.*?>
<?import javafx.scene.layout.*?>
<?import javafx.collections.FXCollections?>
<?import java.lang.String?>
<?import com.jfoenix.controls.*?>
<GridPane fx:id="mainGrid" xmlns="http://javafx.com/javafx" xmlns:fx="http://javafx.com/fxml/1"
fx:controller="events.EditEventController">
<columnConstraints>
<ColumnConstraints/>
<ColumnConstraints/>
<ColumnConstraints/>
</columnConstraints>
<rowConstraints>
<RowConstraints vgrow="ALWAYS"/>
<RowConstraints vgrow="ALWAYS"/>
<RowConstraints vgrow="ALWAYS"/>
<RowConstraints vgrow="ALWAYS"/>
<RowConstraints vgrow="ALWAYS"/>
<RowConstraints vgrow="ALWAYS"/>
<RowConstraints vgrow="ALWAYS"/>
<RowConstraints vgrow="ALWAYS"/>
<RowConstraints vgrow="ALWAYS"/>
</rowConstraints>
<Label styleClass="mainLabel">Termin bearbeiten</Label>
<Label styleClass="inputLabel" GridPane.rowIndex="1">Titel:</Label>
<Label styleClass="inputLabel" GridPane.rowIndex="2">Datum:</Label>
<Label styleClass="inputLabel" GridPane.rowIndex="3">Von:</Label>
<Label styleClass="inputLabel" GridPane.rowIndex="4">Bis:</Label>
<Label styleClass="inputLabel" GridPane.rowIndex="5">Priorität:</Label>
<Label styleClass="inputLabel" GridPane.rowIndex="6">Ganztägig:</Label>
<Label styleClass="inputLabel" GridPane.rowIndex="7">Privat:</Label>
<JFXTextField styleClass="inputField" fx:id="textName" GridPane.columnIndex="1" GridPane.rowIndex="1" maxWidth="400" minWidth="400"/>
<JFXDatePicker styleClass="inputDate" fx:id="datePickerDate" GridPane.columnIndex="1" GridPane.rowIndex="2" maxWidth="200" minWidth="200"/>
<JFXTimePicker styleClass="timePicker" fx:id="timeStart" GridPane.columnIndex="1" GridPane.rowIndex="3" maxWidth="200" minWidth="200"/>
<JFXTimePicker styleClass="timePicker" fx:id="timeEnd" GridPane.columnIndex="1" GridPane.rowIndex="4" maxWidth="200" minWidth="200"/>
<JFXComboBox fx:id="comboBoxPriority" styleClass="comboBox" GridPane.columnIndex="1" GridPane.rowIndex="5" maxWidth="200" minWidth="200">
<items>
<FXCollections fx:factory="observableArrayList">
<String fx:value="gering"/>
<String fx:value="mittel"/>
<String fx:value="hoch"/>
</FXCollections>
</items>
</JFXComboBox>
<JFXToggleButton styleClass="checkbox" fx:id="toggleBtnIsFullDay" GridPane.columnIndex="1" GridPane.rowIndex="6"/>
<JFXToggleButton styleClass="checkbox" fx:id="toggleBtnIsPrivate" GridPane.columnIndex="1" GridPane.rowIndex="7"/>
<Label fx:id="labelError" GridPane.columnIndex="1" GridPane.rowIndex="8"/>
<HBox GridPane.columnIndex="1" GridPane.rowIndex="9" GridPane.columnSpan="2" alignment="CENTER_RIGHT">
<JFXButton onAction="#abortBtnClick" maxWidth="150" minWidth="150">Abbrechen</JFXButton>
<JFXButton styleClass="mainButton" onAction="#createBtnClick" maxWidth="150" minWidth="150">Speichern</JFXButton>
</HBox>
</GridPane>

View File

@ -1,74 +1,125 @@
/*Alex Rechtin, Marco Kühn*/
* { * {
-fx-base-background-color: #2B2D42; -fx-dark-background-color: #525E74;
-fx-base1-background-color: #525E74; -fx-darkest-background-color: #2B2D42;
-fx-main-border-color: #B0B0B0; -fx-bright-background-color: #77859E;
-fx-main-text-color: #ffffff; -fx-brighter-background-color: #282C34 ;
-fx-brightest-background-color: #333333 ;
-fx-bright-border-color: #B0B0B0;
-fx-brighter-text-color: #ffffff;
} }
GridPane{ GridPane{
-fx-background-color: -fx-base-background-color; -fx-background-color: -fx-darkest-background-color;
} }
.main-panel{ .main-panel{
-fx-background-color: #282C34; -fx-background-color: -fx-brighter-background-color;
} }
.vbox-main{ .vbox-main{
-fx-background-color: #333333; -fx-background-color: -fx-brightest-background-color;
-fx-alignment: top-center; -fx-alignment: top-center;
} }
.gridCalendar Line{ .gridCalendar Line{
-fx-stroke: -fx-main-border-color; -fx-stroke: -fx-bright-border-color;
} }
.gridCalender{ .gridCalender{
-fx-background-color: -fx-base-background-color; -fx-background-color: -fx-darkest-background-color;
-fx-min-height: 80px; -fx-min-height: 80px;
-fx-max-height: 80px; -fx-max-height: 80px;
} }
.labelMonth{ .labelMonth{
-fx-padding: 0 0 0 20; -fx-padding: 0 0 0 20;
-fx-background-color: #77859E; -fx-background-color: -fx-bright-background-color;
-fx-font-size: 35px; -fx-font-size: 35px;
-fx-font-weight: bold; -fx-font-weight: bold;
} }
.scrollDays{ .scrollDays{
-fx-background-color: -fx-base-background-color; -fx-background-color: -fx-darkest-background-color;
-fx-border-color: -fx-main-border-color; -fx-border-color: -fx-bright-border-color;
} }
.vBoxDays{ .vBoxDays{
-fx-background-color: -fx-base-background-color; -fx-background-color: -fx-darkest-background-color;
} }
.labelDays{ .labelDays{
-fx-alignment: center; -fx-alignment: center;
-fx-background-color: -fx-base1-background-color; -fx-background-color: -fx-dark-background-color;
-fx-font-size: 25px; -fx-font-size: 25px;
-fx-border-color: -fx-main-border-color; -fx-border-color: -fx-bright-border-color;
} }
Label{ Label{
-fx-text-fill: -fx-main-text-color; -fx-text-fill: -fx-brighter-text-color;
} }
.event{ .event{
-fx-background-color: -fx-base1-background-color; -fx-background-color: -fx-dark-background-color;
} }
.main-btn{ .main-btn{
-fx-background-color: #ffffff; -fx-background-color: transparent;
-fx-text-fill: -fx-main-text-color; -fx-border-color: transparent;
-fx-background-radius: 5em; }
-fx-min-width: 40px;
-fx-min-height: 40px; .main-btn .svg {
-fx-max-width: 40px; -fx-fill: -fill;
-fx-max-height: 40px; }
.main-btn:hover .svg {
-fx-fill: -hover-fill;
}
.buttonBox{
-fx-background-color: -fx-bright-background-color;
}
.navBtn{
-fx-background-color: transparent;
-fx-border-color: transparent;
}
.navBtn .svg {
-fx-fill: -fill;
}
.navBtn:hover .svg {
-fx-fill: -hover-fill;
}
.editEventBtn{
-fx-background-color: transparent;
-fx-border-color: transparent;
}
.editEventBtn .svg {
-fx-fill: -fill;
}
.editEventBtn:hover .svg {
-fx-fill: -hover-fill;
}
.deleteEventBtn{
-fx-background-color: transparent;
-fx-border-color: transparent;
}
.deleteEventBtn .svg {
-fx-fill: -fill;
}
.deleteEventBtn:hover .svg {
-fx-fill: -hover-fill;
} }

View File

@ -1,5 +1,7 @@
<?xml version="1.0" encoding="UTF-8"?> <?xml version="1.0" encoding="UTF-8"?>
<!-- Alex Rechtin, Marco Kühn -->
<?import javafx.geometry.*?> <?import javafx.geometry.*?>
<?import javafx.scene.control.*?> <?import javafx.scene.control.*?>
<?import javafx.scene.image.*?> <?import javafx.scene.image.*?>
@ -14,22 +16,13 @@
<rowConstraints> <rowConstraints>
<RowConstraints vgrow="SOMETIMES"/> <RowConstraints vgrow="SOMETIMES"/>
</rowConstraints> </rowConstraints>
<VBox alignment="TOP_CENTER" prefHeight="200.0" prefWidth="100.0" spacing="5.0" <VBox fx:id="leftNav" alignment="TOP_CENTER" prefHeight="200.0" prefWidth="100.0" spacing="5.0"
style="-fx-background-color: #525E74;"> style="-fx-background-color: #525E74;">
<ImageView fitHeight="50.0" fitWidth="50.0" pickOnBounds="true" preserveRatio="true"> <ImageView fitHeight="50.0" fitWidth="50.0" pickOnBounds="true" preserveRatio="true">
</ImageView> </ImageView>
<Button onAction="#onAddBtnClick" styleClass="main-btn">
ADD
</Button>
<Button onAction="#onAddBtnClick" styleClass="main-btn">
ADD
</Button>
<Button onAction="#onAddBtnClick" styleClass="main-btn">
ADD
</Button>
</VBox> </VBox>
<GridPane prefHeight="200.0" prefWidth="222.0" GridPane.columnIndex="1" GridPane.rowIndex="0"> <GridPane fx:id="mainGridPane" prefHeight="200.0" prefWidth="222.0" GridPane.columnIndex="1" GridPane.rowIndex="0">
<columnConstraints> <columnConstraints>
<ColumnConstraints hgrow="ALWAYS"/> <ColumnConstraints hgrow="ALWAYS"/>
<ColumnConstraints/> <ColumnConstraints/>
@ -48,9 +41,8 @@
<Insets left="5"/> <Insets left="5"/>
</padding> </padding>
</Label> </Label>
<Button onAction="#onBackClick" GridPane.columnIndex="1" maxHeight="1.7976931348623157E308">zurück</Button>
<Button onAction="#onTodayClick" GridPane.columnIndex="2" maxHeight="1.7976931348623157E308">heute</Button> <HBox fx:id="buttonBox" styleClass="buttonBox" GridPane.columnIndex="1" alignment="CENTER"/>
<Button onAction="#onNextClick" GridPane.columnIndex="3" maxHeight="1.7976931348623157E308">weiter</Button>
<GridPane fx:id="calendarGrid" gridLinesVisible="true" styleClass="gridCalendar" GridPane.columnSpan="4" <GridPane fx:id="calendarGrid" gridLinesVisible="true" styleClass="gridCalendar" GridPane.columnSpan="4"
GridPane.columnIndex="0" GridPane.rowIndex="1"> GridPane.columnIndex="0" GridPane.rowIndex="1">

View File

@ -0,0 +1,69 @@
/* Marco Kühn */
* {
-fx-dark-background-color: #3E415F;
-fx-bright-background-color: #ff5555;
-fx-brighter-background-color: #8D99AE;
-fx-brightest-background-color: #ffffff;
-fx-bright-border-color: #B0B0B0;
-fx-brighter-text-color: #ffffff;
}
GridPane{
-fx-background-color: -fx-dark-background-color;
-fx-padding: 20px;
-fx-font-size: 20px;
-fx-font-family: Segoe UI;
-fx-border-insets: 1;
-fx-border-color: -fx-bright-border-color;
-fx-border-style: solid;
-fx-border-width: 2;
-fx-effect: dropshadow(three-pass-box, rgba(100, 100, 100, 1), 24, 0.5, 0, 0);
}
Label{
-fx-text-fill: -fx-brighter-text-color;
-fx-max-width: 200px;
-fx-min-width: 200px;
}
.mainLabel{
-fx-background-color: -fx-brighter-background-color;
-fx-padding: 10px;
-fx-max-width: 200px;
-fx-min-width: 200px;
-fx-font-weight: bold;
-fx-alignment: center;
}
.mainButton{
-fx-font-weight: bold;
-fx-background-color: -fx-brightest-background-color;
}
JFXButton{
-fx-background-color: -fx-brightest-background-color;
}
#labelError{
-fx-font-weight: bold;
-fx-max-width: 1000px;
-fx-text-fill: -fx-bright-background-color;
-fx-padding: 16px;
-fx-min-height: 140px;
-fx-max-height: 400px;
-fx-wrap-text: true;
-fx-font-size: 16px;
}
.comboBox{
-fx-background-color: -fx-brightest-background-color;
-fx-max-width: 200px;
-fx-min-width: 200px;
}
.userBtn{
-fx-max-width: 200px;
-fx-min-width: 200px;
}

View File

@ -0,0 +1,52 @@
<?xml version="1.0" encoding="UTF-8"?>
<!-- Marco Kühn -->
<?import javafx.scene.control.*?>
<?import javafx.scene.layout.*?>
<?import com.jfoenix.controls.*?>
<GridPane xmlns="http://javafx.com/javafx"
xmlns:fx="http://javafx.com/fxml"
fx:controller="main.OptionController"
prefHeight="400.0" prefWidth="600.0"
fx:id="mainGrid">
<columnConstraints>
<ColumnConstraints minWidth="100"/>
<ColumnConstraints minWidth="100"/>
<ColumnConstraints minWidth="200"/>
<ColumnConstraints minWidth="100"/>
<ColumnConstraints minWidth="100"/>
</columnConstraints>
<rowConstraints>
<RowConstraints vgrow="ALWAYS" />
<RowConstraints vgrow="ALWAYS" />
<RowConstraints vgrow="ALWAYS" />
<RowConstraints vgrow="ALWAYS" />
<RowConstraints vgrow="ALWAYS" />
<RowConstraints vgrow="ALWAYS" />
<RowConstraints vgrow="ALWAYS" />
<RowConstraints vgrow="ALWAYS" />
<RowConstraints vgrow="ALWAYS" />
<RowConstraints vgrow="ALWAYS" />
</rowConstraints>
<Label styleClass="mainLabel" GridPane.columnIndex="2" GridPane.halignment="CENTER" >Einstellungen</Label>
<Label GridPane.columnIndex="1" GridPane.rowIndex="2" GridPane.halignment="CENTER">User:</Label>
<JFXButton styleClass="userBtn" fx:id="updateUserBtn" GridPane.columnIndex="1" GridPane.columnSpan="3"
GridPane.rowIndex="4" GridPane.halignment="CENTER" onAction="#onUpdateBtnClick">User bearbeiten</JFXButton>
<JFXButton styleClass="userBtn" fx:id="deleteUserBtn" GridPane.columnIndex="1" GridPane.columnSpan="3"
GridPane.rowIndex="5" GridPane.halignment="CENTER" onAction="#onDeleteBtnClick">User löschen</JFXButton>
<JFXButton styleClass="userBtn" fx:id="createUserBtn" GridPane.columnIndex="1" GridPane.columnSpan="3"
GridPane.rowIndex="7" GridPane.halignment="CENTER" onAction="#onCreateBtnClick">User anlegen</JFXButton>
<Label styleClass="loginLbl" GridPane.columnIndex="1" GridPane.rowIndex="8"
GridPane.halignment="CENTER">Angemeldet bleiben:</Label>
<JFXToggleButton fx:id="saveLoginTBtn" GridPane.columnIndex="3" GridPane.rowIndex="8" onAction="#toggledBtn"/>
<Label fx:id="labelError" styleClass="errorMessage" GridPane.columnIndex="1" GridPane.rowIndex="9"/>
<JFXButton GridPane.columnIndex="4" GridPane.rowIndex="9" onAction="#onBackBtnClick">Zurück</JFXButton>
</GridPane>

View File

@ -1,20 +1,19 @@
/*Alex Rechtin*/
* { * {
-fx-base-background-color: #2B2D42; -fx-dark-background-color: #3E415F;
-fx-base1-background-color: #525E74; -fx-bright-border-color: #B0B0B0;
-fx-brighter-text-color: #ffffff;
-fx-main-border-color: #B0B0B0;
-fx-main-text-color: #ffffff;
} }
GridPane{ GridPane{
-fx-background-color: #3E415F; -fx-background-color: -fx-dark-background-color;
-fx-padding: 20px; -fx-padding: 20px;
-fx-font-size: 20px; -fx-font-size: 20px;
-fx-font-family: Segoe UI; -fx-font-family: Segoe UI;
-fx-border-insets: 1; -fx-border-insets: 1;
-fx-border-color: #B0B0B0; -fx-border-color: -fx-bright-border-color;
-fx-border-style: solid; -fx-border-style: solid;
-fx-border-width: 2; -fx-border-width: 2;
-fx-effect: dropshadow(three-pass-box, rgba(100, 100, 100, 1), 24, 0.5, 0, 0); -fx-effect: dropshadow(three-pass-box, rgba(100, 100, 100, 1), 24, 0.5, 0, 0);
@ -30,7 +29,7 @@ GridPane{
Label{ Label{
-fx-text-fill: white; -fx-text-fill: -fx-brighter-text-color;
-fx-max-width: 150px; -fx-max-width: 150px;
-fx-min-width: 150px; -fx-min-width: 150px;
} }

View File

@ -1,8 +1,11 @@
<?xml version="1.0" encoding="UTF-8"?> <?xml version="1.0" encoding="UTF-8"?>
<!-- Alex Rechtin -->
<?import javafx.scene.control.*?> <?import javafx.scene.control.*?>
<?import javafx.scene.layout.*?> <?import javafx.scene.layout.*?>
<?import javafx.geometry.Insets?> <?import javafx.geometry.Insets?>
<?import com.jfoenix.controls.JFXToggleButton?>
<GridPane xmlns="http://javafx.com/javafx" <GridPane xmlns="http://javafx.com/javafx"
xmlns:fx="http://javafx.com/fxml" xmlns:fx="http://javafx.com/fxml"
fx:controller="users.CreateUserController"> fx:controller="users.CreateUserController">
@ -37,19 +40,19 @@
<TextField fx:id="textLogin" styleClass="textField" GridPane.columnIndex="2" GridPane.rowIndex="1" /> <TextField fx:id="textLogin" styleClass="textField" GridPane.columnIndex="2" GridPane.rowIndex="1" />
<TextField fx:id="textForename" styleClass="textField" GridPane.columnIndex="2" GridPane.rowIndex="2" /> <TextField fx:id="textForename" styleClass="textField" GridPane.columnIndex="2" GridPane.rowIndex="2" />
<TextField fx:id="textName" styleClass="textField" GridPane.columnIndex="2" GridPane.rowIndex="3" /> <TextField fx:id="textName" styleClass="textField" GridPane.columnIndex="2" GridPane.rowIndex="3" />
<TextField fx:id="textPassword" styleClass="textField" GridPane.columnIndex="2" GridPane.rowIndex="4" /> <PasswordField fx:id="textPassword" styleClass="textField" GridPane.columnIndex="2" GridPane.rowIndex="4" />
<TextField fx:id="textPasswordSecond" styleClass="textField" GridPane.columnIndex="2" GridPane.rowIndex="5" /> <PasswordField fx:id="textPasswordSecond" styleClass="textField" GridPane.columnIndex="2" GridPane.rowIndex="5" />
<ToggleButton fx:id="checkButtonIsAdmin" GridPane.columnIndex="2" GridPane.rowIndex="6"/> <JFXToggleButton fx:id="checkButtonIsAdmin" GridPane.columnIndex="2" GridPane.rowIndex="6"/>
<Label fx:id="labelError" styleClass="errorMessage" GridPane.columnIndex="2" GridPane.rowIndex="7"/> <Label fx:id="labelError" wrapText="true" styleClass="errorMessage" GridPane.columnIndex="2" GridPane.rowIndex="7"/>
<HBox GridPane.columnIndex="2" GridPane.rowIndex="8" alignment="CENTER_RIGHT"> <HBox GridPane.columnIndex="2" GridPane.rowIndex="8" alignment="CENTER_RIGHT">
<HBox.margin> <HBox.margin>
<Insets right="100" left="100"/> <Insets right="100" left="100"/>
</HBox.margin> </HBox.margin>
<Button onAction="#abortBtnClick">Abbrechen</Button> <Button onAction="#abortBtnClick">Abbrechen</Button>
<Button onAction="#createUser" styleClass="btnLogin" >Anmelden</Button> <Button onAction="#createUser" styleClass="btnLogin" >Anlegen</Button>
</HBox> </HBox>
</GridPane> </GridPane>

View File

@ -0,0 +1,57 @@
<?xml version="1.0" encoding="UTF-8"?>
<?import javafx.scene.control.*?>
<?import javafx.scene.layout.*?>
<?import javafx.geometry.Insets?>
<?import com.jfoenix.controls.JFXToggleButton?>
<GridPane xmlns="http://javafx.com/javafx"
xmlns:fx="http://javafx.com/fxml"
fx:controller="users.EditUserController">
<columnConstraints>
<ColumnConstraints minWidth="100"/>
<ColumnConstraints minWidth="100"/>
<ColumnConstraints minWidth="100"/>
</columnConstraints>
<rowConstraints>
<RowConstraints vgrow="ALWAYS" />
<RowConstraints vgrow="ALWAYS" />
<RowConstraints vgrow="ALWAYS" />
<RowConstraints vgrow="ALWAYS" />
<RowConstraints vgrow="ALWAYS" />
<RowConstraints vgrow="ALWAYS" />
<RowConstraints vgrow="ALWAYS" />
<RowConstraints vgrow="ALWAYS" />
<RowConstraints vgrow="ALWAYS" />
<RowConstraints vgrow="ALWAYS" />
</rowConstraints>
<Label styleClass="mainLabel" GridPane.columnIndex="2" >User bearbeiten</Label>
<Label styleClass="inputLabel" GridPane.rowIndex="1" GridPane.columnIndex="1">Login:</Label>
<Label styleClass="inputLabel" GridPane.rowIndex="2" GridPane.columnIndex="1">Vorname:</Label>
<Label styleClass="inputLabel" GridPane.rowIndex="3" GridPane.columnIndex="1">Nachname:</Label>
<Label styleClass="inputLabel" GridPane.rowIndex="4" GridPane.columnIndex="1">Passwort:</Label>
<Label styleClass="inputLabel" GridPane.rowIndex="5" GridPane.columnIndex="1">Passwort wiederholen:</Label>
<Label styleClass="inputLabelAdmin" GridPane.rowIndex="6" GridPane.columnIndex="1">Admin:</Label>
<TextField fx:id="textLogin" styleClass="textField" GridPane.columnIndex="2" GridPane.rowIndex="1" />
<TextField fx:id="textForename" styleClass="textField" GridPane.columnIndex="2" GridPane.rowIndex="2" />
<TextField fx:id="textName" styleClass="textField" GridPane.columnIndex="2" GridPane.rowIndex="3" />
<PasswordField fx:id="textPassword" styleClass="textField" GridPane.columnIndex="2" GridPane.rowIndex="4" />
<PasswordField fx:id="textPasswordSecond" styleClass="textField" GridPane.columnIndex="2" GridPane.rowIndex="5" />
<JFXToggleButton fx:id="checkButtonIsAdmin" GridPane.columnIndex="2" GridPane.rowIndex="6"/>
<Label fx:id="labelError" wrapText="true" styleClass="errorMessage" GridPane.columnIndex="2" GridPane.rowIndex="7"/>
<HBox GridPane.columnIndex="2" GridPane.rowIndex="8" alignment="CENTER_RIGHT">
<HBox.margin>
<Insets right="100" left="100"/>
</HBox.margin>
<Button onAction="#abortBtnClick">Abbrechen</Button>
<Button onAction="#createUser" styleClass="btnLogin" >Bearbeiten</Button>
</HBox>
</GridPane>

View File

@ -1,26 +1,30 @@
/* Marco Kühn*/
* { * {
-fx-base-background-color: #2B2D42; -fx-dark-background-color: #3E415F;
-fx-base1-background-color: #525E74;
-fx-main-border-color: #B0B0B0; -fx-brightest-background-color: #ffffff;
-fx-main-text-color: #ffffff;
-fx-bright-border-color: #B0B0B0;
-fx-bright-text-color: ##ff5555;
-fx-brighter-text-color: #ffffff;
} }
GridPane{ GridPane{
-fx-background-color: #3E415F; -fx-background-color: -fx-dark-background-color;
-fx-padding: 20px; -fx-padding: 20px;
-fx-font-size: 20px; -fx-font-size: 20px;
-fx-font-family: Segoe UI; -fx-font-family: Segoe UI;
-fx-border-insets: 1; -fx-border-insets: 1;
-fx-border-color: #B0B0B0; -fx-border-color: -fx-bright-border-color;
-fx-border-style: solid; -fx-border-style: solid;
-fx-border-width: 2; -fx-border-width: 2;
-fx-effect: dropshadow(three-pass-box, rgba(100, 100, 100, 1), 24, 0.5, 0, 0); -fx-effect: dropshadow(three-pass-box, rgba(100, 100, 100, 1), 24, 0.5, 0, 0);
} }
Label{ Label{
-fx-text-fill: white; -fx-text-fill: -fx-brighter-text-color;
-fx-max-width: 150px; -fx-max-width: 150px;
-fx-min-width: 150px; -fx-min-width: 150px;
} }
@ -28,10 +32,26 @@ Label{
.errorLbl{ .errorLbl{
-fx-font-weight: bold; -fx-font-weight: bold;
-fx-max-width: 200px; -fx-max-width: 200px;
-fx-text-fill: #ff5555; -fx-text-fill: -fx-bright-text-color;
-fx-padding: 16px; -fx-padding: 16px;
-fx-min-height: 140px; -fx-min-height: 140px;
-fx-max-height: 400px; -fx-max-height: 400px;
-fx-wrap-text: true; -fx-wrap-text: true;
-fx-font-size: 16px; -fx-font-size: 16px;
} }
.userField{
-fx-background-color: -fx-brightest-background-color;
}
.passField{
-fx-background-color: -fx-brightest-background-color;
}
.quitBtn{
-fx-background-color: -fx-brightest-background-color;
}
.loginBtn{
-fx-background-color: -fx-brightest-background-color;
}

View File

@ -1,7 +1,11 @@
<?xml version="1.0" encoding="UTF-8"?> <?xml version="1.0" encoding="UTF-8"?>
<!-- Marco Kühn -->
<?import javafx.scene.control.*?> <?import javafx.scene.control.*?>
<?import javafx.scene.layout.*?> <?import javafx.scene.layout.*?>
<?import com.jfoenix.controls.*?>
<GridPane xmlns="http://javafx.com/javafx" xmlns:fx="http://javafx.com/fxml" fx:controller="users.LoginController"> <GridPane xmlns="http://javafx.com/javafx" xmlns:fx="http://javafx.com/fxml" fx:controller="users.LoginController">
<columnConstraints> <columnConstraints>
@ -19,14 +23,14 @@
<Label GridPane.columnIndex="1">Anmelden</Label> <Label GridPane.columnIndex="1">Anmelden</Label>
<Label GridPane.rowIndex="1">Username</Label> <Label GridPane.rowIndex="1">Username</Label>
<TextField GridPane.columnIndex="1" GridPane.rowIndex="1" fx:id="userField"/> <JFXTextField styleClass="userField" GridPane.columnIndex="1" GridPane.rowIndex="1" fx:id="userField"/>
<Label styleClass="errorLbl" GridPane.columnIndex="2" GridPane.rowIndex="1" fx:id="userErrLabel"/> <Label styleClass="errorLbl" GridPane.columnIndex="2" GridPane.rowIndex="1" fx:id="userErrLabel"/>
<Label GridPane.rowIndex="2">Paswort</Label> <Label GridPane.rowIndex="2">Paswort</Label>
<PasswordField GridPane.columnIndex="1" GridPane.rowIndex="2" fx:id="passField"/> <JFXPasswordField styleClass="passField" GridPane.columnIndex="1" GridPane.rowIndex="2" fx:id="passField"/>
<Label styleClass="errorLbl" GridPane.columnIndex="2" GridPane.rowIndex="2" fx:id="passErrLabel"/> <Label styleClass="errorLbl" GridPane.columnIndex="2" GridPane.rowIndex="2" fx:id="passErrLabel"/>
<Button onAction="#abortBtnClick" GridPane.columnIndex="1" GridPane.rowIndex="3">Beenden</Button> <JFXButton styleClass="quitBtn" onAction="#abortBtnClick" GridPane.columnIndex="1" GridPane.rowIndex="3">Beenden</JFXButton>
<Button onAction="#login" GridPane.columnIndex="2" GridPane.rowIndex="3">Anmelden</Button> <JFXButton styleClass="loginBtn" onAction="#login" GridPane.columnIndex="2" GridPane.rowIndex="3">Anmelden</JFXButton>
</GridPane> </GridPane>

View File

@ -2,9 +2,14 @@ plugins {
java java
} }
tasks.withType<JavaCompile> {
options.encoding = "UTF-8"
}
dependencies { dependencies {
val jacksonVersion = "2.13.0" val jacksonVersion = "2.13.0"
implementation("com.fasterxml.jackson.core:jackson-databind:$jacksonVersion") implementation("com.fasterxml.jackson.core:jackson-databind:$jacksonVersion")
implementation("com.fasterxml.jackson.core:jackson-core:$jacksonVersion") implementation("com.fasterxml.jackson.core:jackson-core:$jacksonVersion")
implementation("com.fasterxml.jackson.core:jackson-annotations:$jacksonVersion") implementation("com.fasterxml.jackson.core:jackson-annotations:$jacksonVersion")
implementation("com.fasterxml.jackson.datatype:jackson-datatype-jsr310:$jacksonVersion")
} }

View File

@ -0,0 +1,81 @@
//Marc Beyer//
package config;
public class Config {
private boolean saveLogin;
private long id;
private String token;
private String connectionMethod;
private String hostAddress;
private int port;
public Config(){
saveLogin = false;
id = -1;
token = "";
connectionMethod = "http";
hostAddress = "localhost";
port = 8080;
}
public Config(boolean saveLogin, long id, String token) {
this.saveLogin = saveLogin;
this.id = id;
this.token = token;
connectionMethod = "http";
hostAddress = "localhost";
port = 8080;
}
public boolean isSaveLogin() {
return saveLogin;
}
public void setSaveLogin(boolean saveLogin) {
this.saveLogin = saveLogin;
}
public long getId() {
return id;
}
public void setId(long id) {
this.id = id;
}
public String getToken() {
return token;
}
public void setToken(String token) {
this.token = token;
}
public String getConnectionMethod() {
return connectionMethod;
}
public void setConnectionMethod(String connectionMethod) {
this.connectionMethod = connectionMethod;
}
public String getHostAddress() {
return hostAddress;
}
public void setHostAddress(String hostAddress) {
this.hostAddress = hostAddress;
}
public int getPort() {
return port;
}
public void setPort(int port) {
this.port = port;
}
public String toServerUrl(){
return getConnectionMethod() + "://" + getHostAddress() + ":" + getPort();
}
}

View File

@ -0,0 +1,43 @@
//Marc Beyer//
package config;
import com.fasterxml.jackson.databind.ObjectMapper;
import java.io.IOException;
import java.nio.file.Files;
import java.nio.file.Paths;
public class ConfigLoader {
public static Config load(){
try {
String jsonString = Files.readString(Paths.get("config.json"));
ObjectMapper objectMapper = new ObjectMapper();
objectMapper.findAndRegisterModules();
return objectMapper.readValue(jsonString, Config.class);
} catch (IOException e) {
System.out.println("config.json missing");
Config config = new Config(false, -1, "");
save(config);
return config;
}
}
public static void save(Config config){
ObjectMapper objectMapper = new ObjectMapper();
objectMapper.findAndRegisterModules();
try {
Files.writeString(
Paths.get("config.json"),
objectMapper.writeValueAsString(config)
.replace(",", ",\n\t")
.replace("{", "{\n\t")
.replace("}", "\n}")
);
} catch (IOException e) {
e.printStackTrace();
}
}
}

View File

@ -0,0 +1,220 @@
package container;
import com.fasterxml.jackson.core.JsonProcessingException;
import com.fasterxml.jackson.core.type.TypeReference;
import com.fasterxml.jackson.databind.ObjectMapper;
import helper.HttpRequestException;
import helper.Tuple;
import java.time.LocalDateTime;
import java.util.*;
public class DataController {
public static long USER_ID = -1;
public static String SERVER_URL = "http://localhost:8080";
private static final String ALL_EVENTS_ENDPOINT = "/event/all";
private static final String ADD_EVENT_ENDPOINT = "/event/add";
private static final String DELETE_EVENT_ENDPOINT = "/event/del";
private static final String EDIT_EVENT_ENDPOINT = "/event/edit";
private static final String ALL_USER_ENDPOINT = "/user/all";
private static final String ADD_USER_ENDPOINT = "/user/add";
private static final String DELETE_USER_ENDPOINT = "/user/del";
private static final String EDIT_USER_ENDPOINT = "/user/edit";
private static final String LOGIN_ENDPOINT = "/user/login";
private static final String LOGIN_WITH_TOKEN_ENDPOINT = "/user/login-with-token";
private static final String HEADER_TEST_ENDPOINT = "/vpr/header-test";
private final HttpRequest httpRequest;
public DataController() {
httpRequest = new HttpRequest();
}
public boolean login(String username, String password) {
try {
Tuple<Integer, String> response = httpRequest.sendPostRequest(
SERVER_URL + LOGIN_ENDPOINT,
"login=" + username
+ "&password=" + password,
false
);
String[] data = response.getValue().split("\\s+");
USER_ID = Long.parseLong(data[1]);
HttpRequest.TOKEN = data[0];
} catch (Exception e) {
e.printStackTrace();
return false;
}
return USER_ID >= 0;
}
public boolean loginWithToken(long userId, String token) {
try {
HttpRequest.TOKEN = token;
Tuple<Integer, String> response = httpRequest.sendPostRequest(
SERVER_URL + LOGIN_WITH_TOKEN_ENDPOINT,
"userId=" + userId,
true
);
System.out.println(response.getKey() + " " + response.getValue());
if (response.getKey() != 200) return false;
} catch (Exception e) {
e.printStackTrace();
return false;
}
USER_ID = userId;
HttpRequest.TOKEN = token;
return USER_ID >= 0;
}
/*********
* Event *
*********/
public void createEvent(Event event) throws HttpRequestException {
sendBasicHttpRequest(
SERVER_URL + ADD_EVENT_ENDPOINT,
event.getAsUrlParam(),
true
);
}
public void deleteEvent(int userId, int eventId, LocalDateTime date) throws HttpRequestException {
sendBasicHttpRequest(
SERVER_URL + DELETE_EVENT_ENDPOINT,
"userId=" + userId + "&eventId=" + eventId + "&date=" + date.toLocalDate(),
true
);
}
public void editEvent(Event oldEvent, Event event) throws HttpRequestException {
sendBasicHttpRequest(
SERVER_URL + EDIT_EVENT_ENDPOINT,
"eventId=" + oldEvent.getId() +
"&userId=" + oldEvent.getOwnerId() +
"&date=" + oldEvent.getDate().toLocalDate() +
"&newDate=" + event.getDate().toLocalDate() +
"&newName=" + event.getName() +
"&newStart=" + event.getStart() +
"&newEnd=" + event.getEnd() +
"&newPriority=" + event.getPriority() +
"&newIsFullDay=" + event.isFullDay() +
"&newIsPrivate=" + event.isPrivate(),
true
);
}
public ArrayList<Event> getAllVisibleEvents(LocalDateTime startDate, LocalDateTime endDate) throws HttpRequestException {
try {
Tuple<Integer, String> response = httpRequest.sendPostRequest(
SERVER_URL + ALL_EVENTS_ENDPOINT,
"userId=" + USER_ID + "&startDate=" + startDate.toLocalDate() + "&endDate=" + endDate.toLocalDate(),
true
);
if (response.getKey() != 200) {
throw new HttpRequestException(response);
}
String jsonResponse = response.getValue();
System.out.println(jsonResponse);
ObjectMapper objectMapper = new ObjectMapper();
objectMapper.findAndRegisterModules();
return (ArrayList<Event>) objectMapper.readValue(jsonResponse, new TypeReference<List<Event>>() {
});
} catch (HttpRequestException e) {
throw e;
} catch (Exception e) {
throw new HttpRequestException("Es konnte keine Verbindung mit dem Server hergestellt werden.", 600);
}
}
/********
* User *
********/
public List<User> getAllUser() throws HttpRequestException {
String userJSON = sendBasicHttpRequest(
SERVER_URL + ALL_USER_ENDPOINT,
"",
true
);
ObjectMapper objectMapper = new ObjectMapper();
objectMapper.findAndRegisterModules();
try {
List<User> list = objectMapper.readValue(userJSON, new TypeReference<>() {
});
for(User u : list){
System.out.println(u);
}
return list;
} catch (JsonProcessingException e) {
e.printStackTrace();
}
return new ArrayList<>();
}
public void createUser(User user) throws HttpRequestException {
sendBasicHttpRequest(
SERVER_URL + ADD_USER_ENDPOINT,
"name=" + user.getName() +
"&forename=" + user.getForename() +
"&login=" + user.getLogin() +
"&password=" + user.getPassword() +
"&isAdmin=" + user.isAdmin(),
true
);
}
public void deleteUser(User user) throws HttpRequestException {
sendBasicHttpRequest(
SERVER_URL + DELETE_USER_ENDPOINT,
"userId=" + user.getUserId(),
true
);
}
public void editUser(User user) throws HttpRequestException {
String urlParam = "userId=" + user.getUserId() +
"&name=" + user.getName() +
"&forename=" + user.getForename() +
"&login=" + user.getLogin() +
"&isAdmin=" + user.isAdmin() +
(user.getPassword() == null ? "" : "&password=" + user.getPassword());
System.out.println(urlParam);
sendBasicHttpRequest(
SERVER_URL + EDIT_USER_ENDPOINT,
urlParam,
true
);
}
private String sendBasicHttpRequest(String urlString, String urlParameters, boolean sendAuth) throws HttpRequestException {
try {
Tuple<Integer, String> response = httpRequest.sendPostRequest(
urlString,
urlParameters,
sendAuth
);
if (response.getKey() != 200) {
throw new HttpRequestException(response);
}
return response.getValue();
} catch (HttpRequestException e) {
throw e;
} catch (Exception e) {
throw new HttpRequestException("Es konnte keine Verbindung mit dem Server hergestellt werden.", 600);
}
}
}

View File

@ -1,15 +1,11 @@
package res; package container;
import com.sun.jdi.event.StepEvent;
import java.time.Duration; import java.time.Duration;
import java.time.LocalDate;
import java.time.LocalDateTime; import java.time.LocalDateTime;
import java.time.LocalTime;
import java.time.format.DateTimeFormatter; import java.time.format.DateTimeFormatter;
import java.util.ArrayList;
import java.util.regex.Matcher; import java.util.regex.Matcher;
import java.util.regex.Pattern; import java.util.regex.Pattern;
import java.util.regex.PatternSyntaxException;
public class Event { public class Event {
@ -26,58 +22,29 @@ public class Event {
private int ownerId; private int ownerId;
private String ownerName; private String ownerName;
/* public Event() {}
Constructor for SELECT:
e.id AS eid,
e.name AS ename,
e.start,
e.end,
e.priority,
e.is_full_day,
ue.date,
u.id AS uid,
u.forename,
u.name AS uname
*/
public Event(ArrayList<Object> arr) {
id = (int) arr.get(0);
name = (String) arr.get(1);
start = (String) arr.get(2);
end = (String) arr.get(3);
priority = (int) arr.get(4);
isFullDay = (Boolean) arr.get(5); //((String)arr.get(5)).equals("true");
DateTimeFormatter formatter = DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm");
date = LocalDateTime.parse(arr.get(6) + " 00:00", formatter);
ownerId = (int) arr.get(7);
ownerName = arr.get(8) + " " + arr.get(9);
}
public Event(String name, public Event(String name,
int priority, int priority,
boolean isFullDay, boolean isFullDay,
boolean isPrivate, boolean isPrivate,
String start, LocalTime start,
String end, LocalTime end,
LocalDateTime date, LocalDateTime date,
int ownerId int ownerId
) throws IllegalArgumentException { ) throws IllegalArgumentException {
System.out.println("Create Event");
if (name.length() < 3) { if (name.length() < 3) {
throw new IllegalArgumentException("Der Name muss eine L\u00e4nge von 3 haben."); throw new IllegalArgumentException("Der Name muss eine Länge von 3 haben.");
} }
Pattern pattern = Pattern.compile("[A-Za-zÄÖÜäöü0-9 =!?+*/$%€.:,;_<>()-]*"); Pattern pattern = Pattern.compile("[A-Za-zäöüÄÖÜß0-9 =!?+*/$.:,;_<>()-]*");
Matcher matcher = pattern.matcher(name); Matcher matcher = pattern.matcher(name);
if (!matcher.matches()) { if (!matcher.matches()) {
throw new IllegalArgumentException("Der Name Darf nur aus Zahlen, Buchstaben und " + throw new IllegalArgumentException("Der Name darf nur aus Zahlen, Buchstaben und folgenden Sonderzeichen bestehen: äöü ÄÖÜ ß =!?+*/$.:,;_ <>()-");
"folgenden Sonderzeichen bestehen: =!?+*/$%€.:,;_ <>()-");
} }
if (priority < 0) { if (priority < 0) {
throw new IllegalArgumentException("Bitte eine Priorit\u00e4t w\u00e4hlen."); throw new IllegalArgumentException("Bitte eine Priorität wählen.");
} }
LocalDateTime today = LocalDateTime.now().toLocalDate().atStartOfDay(); LocalDateTime today = LocalDateTime.now().toLocalDate().atStartOfDay();
if (Duration.between(today, date).isNegative()) { if (Duration.between(today, date).isNegative()) {
@ -88,8 +55,8 @@ public class Event {
this.priority = priority; this.priority = priority;
this.isFullDay = isFullDay; this.isFullDay = isFullDay;
this.isPrivate = isPrivate; this.isPrivate = isPrivate;
this.start = start; if (start != null) this.start = start.toString();
this.end = end; if (end != null) this.end = end.toString();
this.date = date; this.date = date;
this.ownerId = ownerId; this.ownerId = ownerId;
} }
@ -154,8 +121,9 @@ public class Event {
return date; return date;
} }
public void setDate(LocalDateTime date) { public void setDate(String date) {
this.date = date; DateTimeFormatter formatter = DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm");
this.date = LocalDateTime.parse(date + " 00:00", formatter);
} }
public int getOwnerId() { public int getOwnerId() {
@ -189,7 +157,7 @@ public class Event {
"&name=" + getName() + "&name=" + getName() +
"&start=" + getStart() + "&start=" + getStart() +
"&end=" + getEnd() + "&end=" + getEnd() +
"&prority=" + getPriority() + "&priority=" + getPriority() +
"&isFullDay=" + isFullDay() + "&isFullDay=" + isFullDay() +
"&isPrivate=" + isPrivate(); "&isPrivate=" + isPrivate();
} }

View File

@ -0,0 +1,77 @@
package container;
import helper.Tuple;
import java.io.BufferedReader;
import java.io.DataOutputStream;
import java.io.IOException;
import java.io.InputStreamReader;
import java.net.HttpURLConnection;
import java.net.URL;
import java.nio.charset.StandardCharsets;
public class HttpRequest {
public static String TOKEN = "";
public Tuple<Integer, 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(urlString);
HttpURLConnection connection = (HttpURLConnection) url.openConnection();
connection.setDoOutput(true);
connection.setInstanceFollowRedirects(false);
connection.setRequestMethod("POST");
connection.setRequestProperty("Content-Type", "application/x-www-form-urlencoded");
connection.setRequestProperty("charset", "utf-8");
connection.setRequestProperty("Content-Length", Integer.toString(postDataLength));
connection.setUseCaches(false);
if(sendAuth){
connection.setRequestProperty("Accept", "application/json");
connection.setRequestProperty("Authorization", "Bearer " + TOKEN);
}
try (DataOutputStream writer = new DataOutputStream(connection.getOutputStream())) {
writer.write(postData);
}
return getHttpTuple(connection);
}
public Tuple<Integer, String> sendGetRequest(String urlString) throws Exception {
URL url = new URL(urlString);
HttpURLConnection connection = (HttpURLConnection) url.openConnection();
connection.setRequestMethod("GET");
connection.setConnectTimeout(5000);
connection.setReadTimeout(5000);
int status = connection.getResponseCode();
return getHttpTuple(connection);
}
private Tuple<Integer, String> getHttpTuple(HttpURLConnection connection) throws IOException {
int status = connection.getResponseCode();
String inputLine;
StringBuilder content = new StringBuilder();
BufferedReader in;
if (status == 200) {
in = new BufferedReader(new InputStreamReader(connection.getInputStream(), StandardCharsets.UTF_8));
} else {
in = new BufferedReader(new InputStreamReader(connection.getErrorStream(), StandardCharsets.UTF_8));
}
while ((inputLine = in.readLine()) != null) {
content.append(inputLine);
}
in.close();
connection.disconnect();
return new Tuple<>(status, content.toString());
}
}

View File

@ -0,0 +1,75 @@
package container;
public class User {
private int userId;
private String login;
private String forename;
private String name;
private String password;
private boolean isAdmin;
public User(){}
public int getUserId() {
return userId;
}
public void setUserId(int userId) {
this.userId = userId;
}
public String getLogin() {
return login;
}
public void setLogin(String login) {
this.login = login;
}
public String getForename() {
return forename;
}
public void setForename(String forename) {
this.forename = forename;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public boolean isAdmin() {
return isAdmin;
}
public void setAdmin(boolean admin) {
isAdmin = admin;
}
public String getPassword() {
return password;
}
public void setPassword(String password) {
this.password = password;
}
@Override
public String toString() {
return "User{" +
"userId=" + userId +
", login='" + login + '\'' +
", forename='" + forename + '\'' +
", name='" + name + '\'' +
", password='" + password + '\'' +
", isAdmin=" + isAdmin +
'}';
}
}

View File

@ -0,0 +1,24 @@
//Marc Beyer//
package helper;
public class HttpRequestException extends Exception{
private int status;
public HttpRequestException(String message, int status) {
super(message);
this.status = status;
}
public HttpRequestException(Tuple<Integer, String> response) {
super(response.getValue());
this.status = response.getKey();
}
public int getStatus() {
return status;
}
public void setStatus(int status) {
this.status = status;
}
}

View File

@ -0,0 +1,28 @@
//Marc Beyer//
package helper;
public class Tuple<X, Y> {
public final X key;
public final Y value;
public Tuple(X key, Y value) {
this.key = key;
this.value = value;
}
public X getKey() {
return key;
}
public Y getValue() {
return value;
}
@Override
public String toString() {
return "Tuple{" +
"key=" + key +
", value=" + value +
'}';
}
}

View File

@ -1,113 +0,0 @@
package res;
import com.fasterxml.jackson.core.JsonProcessingException;
import com.fasterxml.jackson.databind.ObjectMapper;
import java.io.BufferedReader;
import java.io.DataOutputStream;
import java.io.InputStreamReader;
import java.io.OutputStream;
import java.net.HttpURLConnection;
import java.net.URL;
import java.nio.charset.StandardCharsets;
import java.util.*;
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 final HttpRequest httpRequest;
public DataController() {
httpRequest = new HttpRequest();
}
public boolean login(String username, String password) {
try {
USER_ID = Long.parseLong(httpRequest.sendPostRequest(
LOGIN_ENDPOINT,
"login=" + username
+ "&password=" + password
));
} catch (Exception e) {
e.printStackTrace();
return false;
}
return USER_ID >= 0;
}
public void createEvent(Event event) {
try {
System.out.println(httpRequest.sendPostRequest(ADD_EVENT_ENDPOINT, event.getAsUrlParam()));
} catch (Exception e) {
throw new RuntimeException("Es konnte keine Verbindung mit dem Server hergestellt werden.");
}
}
public void deleteEvent(int eventId) {
try {
System.out.println(httpRequest.sendPostRequest(DELETE_EVENT_ENDPOINT, "eventId=" + eventId));
} catch (Exception e) {
e.printStackTrace();
}
}
public ArrayList<Event> getAllVisibleEvents() {
ArrayList<Event> eventList = new ArrayList<>();
try {
String jsonResponse = httpRequest.sendPostRequest(ALL_EVENTS_ENDPOINT, "userId=" + USER_ID);
System.out.println(jsonResponse);
ObjectMapper objectMapper = new ObjectMapper();
//String json = "{ \"color\" : \"Black\", \"type\" : \"BMW\" }";
for (Object obj : objectMapper.readValue(jsonResponse, Object[].class)) {
ArrayList<Object> list = new ArrayList<>();
if (obj.getClass().isArray()) {
list = (ArrayList<Object>) Arrays.asList((Object[]) obj);
} else if (obj instanceof Collection) {
list = new ArrayList<>((Collection<?>) obj);
}
eventList.add(new Event(list));
}
} catch (Exception e) {
e.printStackTrace();
}
return eventList;
}
public Event[] getAllEvents() {
Event[] eventList = null;
try {
String jsonResponse = httpRequest.sendGetRequest("http://localhost:8080/vpr/all-events-test");
eventList = parseJsonToEventList(jsonResponse);
for (Event e : eventList) {
System.out.println(e);
}
} catch (Exception e) {
e.printStackTrace();
}
return eventList;
}
private Event[] parseJsonToEventList(String jsonString) throws JsonProcessingException {
ArrayList<Event> eventList;
// Parse JSON
ObjectMapper objectMapper = new ObjectMapper();
//String json = "{ \"color\" : \"Black\", \"type\" : \"BMW\" }";
return objectMapper.readValue(jsonString, Event[].class);
}
}

View File

@ -1,76 +0,0 @@
package res;
import java.io.BufferedReader;
import java.io.DataOutputStream;
import java.io.InputStreamReader;
import java.net.HttpURLConnection;
import java.net.URL;
import java.nio.charset.StandardCharsets;
import java.util.Arrays;
public class HttpRequest {
public String sendPostRequest(String urlString, String urlParameters) throws Exception {
byte[] postData = urlParameters.getBytes(StandardCharsets.UTF_8);
int postDataLength = postData.length;
URL url = new URL(urlString);
HttpURLConnection con = (HttpURLConnection) url.openConnection();
con.setDoOutput(true);
con.setInstanceFollowRedirects(false);
con.setRequestMethod("POST");
con.setRequestProperty("Content-Type", "application/x-www-form-urlencoded");
con.setRequestProperty("charset", "utf-8");
con.setRequestProperty("Content-Length", Integer.toString(postDataLength));
con.setUseCaches(false);
try (DataOutputStream wr = new DataOutputStream(con.getOutputStream())) {
wr.write(postData);
}
int status = con.getResponseCode();
if (status == 200) {
BufferedReader in = new BufferedReader(
new InputStreamReader(con.getInputStream()));
String inputLine;
StringBuilder content = new StringBuilder();
while ((inputLine = in.readLine()) != null) {
content.append(inputLine);
}
in.close();
con.disconnect();
return content.toString();
} else {
con.disconnect();
throw new Exception("Status: " + status);
}
}
public String sendGetRequest(String urlString) throws Exception {
URL url = new URL(urlString);
HttpURLConnection con = (HttpURLConnection) url.openConnection();
con.setRequestMethod("GET");
con.setConnectTimeout(5000);
con.setReadTimeout(5000);
int status = con.getResponseCode();
if (status == 200) {
BufferedReader in = new BufferedReader(
new InputStreamReader(con.getInputStream()));
String inputLine;
StringBuilder content = new StringBuilder();
while ((inputLine = in.readLine()) != null) {
content.append(inputLine);
}
in.close();
con.disconnect();
return content.toString();
} else {
con.disconnect();
throw new Exception("Status: " + status);
}
}
}