From 8eb43a5e66b3db7aa080ef26f36f4ba939126ae7 Mon Sep 17 00:00:00 2001
From: Harry Linrui XU <xulr0820@hotmail.com>
Date: Wed, 22 Mar 2023 13:30:48 +0100
Subject: [PATCH] Implemented delete functionality using an alert box

---
 .../demo/controller/ExpensesController.java   | 35 ++++++++++++++-----
 src/main/resources/view/Expenses.fxml         |  6 ++--
 2 files changed, 30 insertions(+), 11 deletions(-)

diff --git a/src/main/java/no/ntnu/idatt1002/demo/controller/ExpensesController.java b/src/main/java/no/ntnu/idatt1002/demo/controller/ExpensesController.java
index d7dbaf99..2acd76a3 100644
--- a/src/main/java/no/ntnu/idatt1002/demo/controller/ExpensesController.java
+++ b/src/main/java/no/ntnu/idatt1002/demo/controller/ExpensesController.java
@@ -3,6 +3,7 @@ package no.ntnu.idatt1002.demo.controller;
 import java.io.File;
 import java.io.IOException;
 
+import java.util.Optional;
 import javafx.collections.FXCollections;
 import javafx.collections.ObservableList;
 import javafx.event.ActionEvent;
@@ -11,7 +12,10 @@ import javafx.fxml.FXMLLoader;
 import javafx.scene.Node;
 import javafx.scene.Parent;
 import javafx.scene.Scene;
+import javafx.scene.control.Alert;
+import javafx.scene.control.Alert.AlertType;
 import javafx.scene.control.Button;
+import javafx.scene.control.ButtonType;
 import javafx.scene.control.ComboBox;
 import javafx.scene.control.Dialog;
 import javafx.scene.control.TableColumn;
@@ -37,15 +41,15 @@ public class ExpensesController {
   private DialogMode mode;
 
   @FXML
-  private Button add;
+  private Button addBtn;
 
   @FXML
   private TextField descriptionField;
   @FXML
-  private Button edit;
+  private Button editBtn;
 
   @FXML
-  private Button delete;
+  private Button deleteBtn;
 
   @FXML
   private ComboBox<String> show;
@@ -77,10 +81,10 @@ public class ExpensesController {
     show.setItems(filter);
     show.setValue("All");
 
-
+    Expense newExpense = new Expense(99, true, ExpenseCategory.FOOD, "1/1/23");
+    expenseRegister.addItem(newExpense);
     expenses = FXCollections.observableArrayList(expenseRegister.getItems());
 
-
     dateColumn.setCellValueFactory(new PropertyValueFactory<Expense, String>("date"));
     amountColumn.setCellValueFactory(new PropertyValueFactory<Expense, Double>("amount"));
     categoryColumn.setCellValueFactory(new PropertyValueFactory<Expense, ExpenseCategory>("category"));
@@ -116,11 +120,11 @@ public class ExpensesController {
     // Get the controller for the loaded FXML file
     AddExpenseController dialogController = loader.getController();
 
-    if (event.getSource().equals(add)) {
+    if (event.getSource().equals(addBtn)) {
       mode = DialogMode.ADD;
       dialogTitle = "Add expense";
 
-    } else if (event.getSource().equals(edit) && expenseTableView.getSelectionModel().getSelectedItem() != null) {
+    } else if (event.getSource().equals(editBtn) && expenseTableView.getSelectionModel().getSelectedItem() != null) {
       mode = DialogMode.EDIT;
       dialogTitle = "Edit expense";
       newExpense = expenseTableView.getSelectionModel().getSelectedItem();
@@ -151,8 +155,23 @@ public class ExpensesController {
 
   }
 
-  public void handleDeleteButton(ActionEvent event) throws  IOException {
+  @FXML
+  public void handleDeleteBtn(ActionEvent event) {
+    Optional<ButtonType> isConfirmed = showConfirmationDialog("Confirm Delete", "Delete Confirmation",
+        "Are you sure you would like to delete the selected expense?");
+    if (isConfirmed.isPresent() && isConfirmed.get() == ButtonType.OK) {
+      int selectedIdx = expenseTableView.getSelectionModel().getSelectedIndex();
+      expenses.remove(selectedIdx);
+    }
+  }
+
+  private Optional<ButtonType> showConfirmationDialog(String title, String headerText, String contentText) {
+    Alert alert = new Alert(AlertType.CONFIRMATION);
+    alert.setTitle(title);
+    alert.setHeaderText(headerText);
+    alert.setContentText(contentText);
 
+    return alert.showAndWait();
   }
 
   public void loadDataFromFile(String fileName) {
diff --git a/src/main/resources/view/Expenses.fxml b/src/main/resources/view/Expenses.fxml
index 107ddd16..7985d641 100644
--- a/src/main/resources/view/Expenses.fxml
+++ b/src/main/resources/view/Expenses.fxml
@@ -73,7 +73,7 @@
                <children>
                   <HBox alignment="BOTTOM_LEFT" prefWidth="410.0" spacing="5.0">
                      <children>
-                        <Button fx:id="add" alignment="TOP_CENTER" mnemonicParsing="false" onAction="#handleAddButton" text="Add" textAlignment="CENTER">
+                        <Button fx:id="addBtn" alignment="TOP_CENTER" mnemonicParsing="false" onAction="#handleAddButton" text="Add" textAlignment="CENTER">
                            <graphic>
                               <ImageView fitHeight="19.0" fitWidth="16.0" pickOnBounds="true" preserveRatio="true">
                                  <image>
@@ -81,7 +81,7 @@
                                  </image>
                               </ImageView>
                            </graphic></Button>
-                        <Button fx:id="edit" alignment="TOP_CENTER" mnemonicParsing="false" onAction="#handleEditButton" text="Edit" textAlignment="CENTER">
+                        <Button fx:id="editBtn" alignment="TOP_CENTER" mnemonicParsing="false" onAction="#handleEditButton" text="Edit" textAlignment="CENTER">
                            <graphic>
                               <ImageView fitHeight="19.0" fitWidth="16.0" pickOnBounds="true" preserveRatio="true">
                                  <image>
@@ -89,7 +89,7 @@
                                  </image>
                               </ImageView>
                            </graphic></Button>
-                        <Button alignment="TOP_CENTER" mnemonicParsing="false" text="Delete" textAlignment="CENTER">
+                        <Button fx:id="deleteBtn" alignment="TOP_CENTER" mnemonicParsing="false" onAction="#handleDeleteBtn" text="Delete" textAlignment="CENTER">
                            <graphic>
                               <ImageView fitHeight="19.0" fitWidth="16.0" pickOnBounds="true" preserveRatio="true">
                                  <image>
-- 
GitLab