From 6674f11baed0f2ef75805248553549f71e70d130 Mon Sep 17 00:00:00 2001
From: Harry Linrui XU <xulr0820@hotmail.com>
Date: Sat, 1 Apr 2023 10:55:01 +0200
Subject: [PATCH] "Validate inputs for income"

---
 .../demo/controller/AddBudgetController.java  |  1 +
 .../demo/controller/AddIncomeController.java  | 27 ++++++++-
 src/main/resources/view/AddIncome.fxml        | 55 ++++++++++++++++---
 3 files changed, 73 insertions(+), 10 deletions(-)

diff --git a/src/main/java/no/ntnu/idatt1002/demo/controller/AddBudgetController.java b/src/main/java/no/ntnu/idatt1002/demo/controller/AddBudgetController.java
index c0f0a7e4..6a9891f5 100644
--- a/src/main/java/no/ntnu/idatt1002/demo/controller/AddBudgetController.java
+++ b/src/main/java/no/ntnu/idatt1002/demo/controller/AddBudgetController.java
@@ -112,6 +112,7 @@ public class AddBudgetController {
      * Closes the dialog box.
      * @param actionEvent A button click on the close button.
      */
+    @FXML
     private void closeButton(ActionEvent actionEvent) {
         final Node source = (Node) actionEvent.getSource();
         final Stage stage = (Stage) source.getScene().getWindow();
diff --git a/src/main/java/no/ntnu/idatt1002/demo/controller/AddIncomeController.java b/src/main/java/no/ntnu/idatt1002/demo/controller/AddIncomeController.java
index 9c96a53c..a1eebbbc 100644
--- a/src/main/java/no/ntnu/idatt1002/demo/controller/AddIncomeController.java
+++ b/src/main/java/no/ntnu/idatt1002/demo/controller/AddIncomeController.java
@@ -14,6 +14,7 @@ import javafx.scene.control.Button;
 import javafx.scene.control.ComboBox;
 import javafx.scene.control.DatePicker;
 import javafx.scene.control.TextField;
+import javafx.scene.text.Text;
 import javafx.stage.Stage;
 import no.ntnu.idatt1002.demo.data.Economics.Expense;
 import no.ntnu.idatt1002.demo.data.Economics.Income;
@@ -36,6 +37,8 @@ public class AddIncomeController {
   @FXML
   private Button okBtn;
 
+  @FXML
+  private Text errorMsg;
   @FXML
   private DatePicker datePicker;
 
@@ -72,6 +75,8 @@ public class AddIncomeController {
 
     //Set date to today
     datePicker.setValue(LocalDate.now());
+
+    addEventFilters();
   }
 
   public IncomeCategory getCategory() {
@@ -121,7 +126,7 @@ public class AddIncomeController {
   @FXML
   public void pressOkBtn(ActionEvent event) {
     //Instantiates a new income
-    if (chosenIncome == null) {
+    if (newIncome == null) {
       LocalDate date = datePicker.getValue();
       double amount = Double.parseDouble(amountField.getText());
       String description = descriptionField.getText();
@@ -142,6 +147,26 @@ public class AddIncomeController {
     ((Stage) source.getScene().getWindow()).close();
   }
 
+  private void addEventFilters() {
+    okBtn.addEventFilter(
+        ActionEvent.ACTION, event -> {
+          if (!validateInputs()) {
+            event.consume();
+            errorMsg.setOpacity(1);
+          }
+        });
+  }
+  private boolean validateInputs() {
+    try {
+      Income income = new Income(
+          Double.parseDouble(amountField.getText()), recurringBox.getValue(),
+          categoryBox.getValue(), datePicker.getValue());
+    } catch (IllegalArgumentException e) {
+      System.out.println("ok");
+      return false;
+    }
+    return true;
+  }
 
   /**
    * Closes the dialog box and cancels any pending changes.
diff --git a/src/main/resources/view/AddIncome.fxml b/src/main/resources/view/AddIncome.fxml
index abdfe7c2..b4167b44 100644
--- a/src/main/resources/view/AddIncome.fxml
+++ b/src/main/resources/view/AddIncome.fxml
@@ -11,6 +11,8 @@
 <?import javafx.scene.layout.GridPane?>
 <?import javafx.scene.layout.HBox?>
 <?import javafx.scene.layout.RowConstraints?>
+<?import javafx.scene.text.Font?>
+<?import javafx.scene.text.Text?>
 
 <DialogPane expanded="true" xmlns="http://javafx.com/javafx/19" xmlns:fx="http://javafx.com/fxml/1" fx:controller="no.ntnu.idatt1002.demo.controller.AddIncomeController">
    <content>
@@ -27,27 +29,62 @@
             <RowConstraints minHeight="10.0" prefHeight="30.0" vgrow="SOMETIMES" />
             <RowConstraints minHeight="10.0" prefHeight="30.0" vgrow="SOMETIMES" />
             <RowConstraints minHeight="10.0" prefHeight="30.0" vgrow="SOMETIMES" />
+            <RowConstraints minHeight="10.0" prefHeight="30.0" vgrow="SOMETIMES" />
+            <RowConstraints minHeight="10.0" prefHeight="30.0" vgrow="SOMETIMES" />
          </rowConstraints>
          <children>
-            <Label text="Date:" />
-            <Label text="Amount:" GridPane.rowIndex="1" />
-            <Label text="Description:" GridPane.rowIndex="2" />
-            <Label text="Category" GridPane.rowIndex="3" />
-            <Label text="Recurring" GridPane.rowIndex="4" />
+            <Label text="Date:">
+               <font>
+                  <Font name="Lucida Console" size="12.0" />
+               </font>
+            </Label>
+            <Label text="Amount:" GridPane.rowIndex="1">
+               <font>
+                  <Font name="Lucida Console" size="12.0" />
+               </font>
+            </Label>
+            <Label text="Description:" GridPane.rowIndex="2">
+               <font>
+                  <Font name="Lucida Console" size="12.0" />
+               </font>
+            </Label>
+            <Label text="Category: " GridPane.rowIndex="3">
+               <font>
+                  <Font name="Lucida Console" size="12.0" />
+               </font>
+            </Label>
+            <Label text="Recurring: " GridPane.rowIndex="4">
+               <font>
+                  <Font name="Lucida Console" size="12.0" />
+               </font>
+            </Label>
             <TextField fx:id="amountField" promptText="100" GridPane.columnIndex="1" GridPane.rowIndex="1" />
             <TextField fx:id="descriptionField" promptText="(optional)" GridPane.columnIndex="1" GridPane.rowIndex="2" />
-            <ComboBox fx:id="categoryBox" prefWidth="150.0" promptText="Choose" GridPane.columnIndex="1" GridPane.rowIndex="3" />
+            <ComboBox fx:id="categoryBox" prefWidth="150.0" promptText="Food" GridPane.columnIndex="1" GridPane.rowIndex="3" />
             <ComboBox fx:id="recurringBox" prefWidth="150.0" promptText="No" GridPane.columnIndex="1" GridPane.rowIndex="4" />
-            <HBox alignment="BOTTOM_RIGHT" prefHeight="100.0" prefWidth="200.0" spacing="10.0" GridPane.columnIndex="1" GridPane.columnSpan="2" GridPane.rowIndex="5">
+            <HBox alignment="BOTTOM_RIGHT" prefHeight="100.0" prefWidth="200.0" spacing="10.0" GridPane.columnIndex="1" GridPane.columnSpan="2" GridPane.rowIndex="7">
                <children>
-                  <Button fx:id="cancelBtn" mnemonicParsing="false" onAction="#pressCancelBtn" prefHeight="25.0" prefWidth="60.0" text="Cancel" />
-                  <Button fx:id="okBtn" mnemonicParsing="false" onAction="#pressOkBtn" prefHeight="25.0" prefWidth="60.0" text="OK" />
+                  <Button fx:id="cancelBtn" mnemonicParsing="false" onAction="#pressCancelBtn" prefHeight="25.0" prefWidth="60.0" text="Cancel">
+                     <font>
+                        <Font name="Lucida Console" size="12.0" />
+                     </font>
+                  </Button>
+                  <Button fx:id="okBtn" mnemonicParsing="false" onAction="#pressOkBtn" prefHeight="25.0" prefWidth="60.0" text="OK">
+                     <font>
+                        <Font name="Lucida Console" size="12.0" />
+                     </font>
+                  </Button>
                </children>
                <GridPane.margin>
                   <Insets top="20.0" />
                </GridPane.margin>
             </HBox>
             <DatePicker fx:id="datePicker" GridPane.columnIndex="1" />
+            <Text fx:id="errorMsg" fill="#d90808" opacity="0.0" strokeType="OUTSIDE" strokeWidth="0.0" text="Invalid inputs. Please make surce that amount is above 1 and that category and recurring have values" wrappingWidth="300.0" GridPane.columnSpan="3" GridPane.rowIndex="5" GridPane.rowSpan="2">
+               <font>
+                  <Font name="Lucida Console" size="11.0" />
+               </font>
+            </Text>
          </children>
       </GridPane>
    </content>
-- 
GitLab