From 1f784f72d166153b1ca5a69c0765058641ab29c3 Mon Sep 17 00:00:00 2001 From: Nikitha Date: Sun, 22 Feb 2026 18:21:22 -0700 Subject: [PATCH] appionmeent,service --- .../petshopdesktop/DTOs/ServiceDTO.java | 110 ++++++++++++++ .../controllers/AppointmentController.java | 77 +++++++++- .../controllers/ServiceController.java | 135 +++++++++++++----- .../AppointmentDialogController.java | 111 ++++++++++++++ .../ServiceDialogController.java | 98 +++++++++++++ .../database/AppointmentDB.java | 73 ++++++++++ .../petshopdesktop/database/ServiceDB.java | 120 ++++++++++++++++ .../petshopdesktop/models/Appointment.java | 40 ++++++ .../petshopdesktop/models/Service.java | 98 +++++++++++++ .../dialogviews/appointment-dialog-view.fxml | 11 +- 10 files changed, 835 insertions(+), 38 deletions(-) create mode 100644 src/main/java/org/example/petshopdesktop/DTOs/ServiceDTO.java create mode 100644 src/main/java/org/example/petshopdesktop/controllers/dialogcontrollers/AppointmentDialogController.java create mode 100644 src/main/java/org/example/petshopdesktop/controllers/dialogcontrollers/ServiceDialogController.java create mode 100644 src/main/java/org/example/petshopdesktop/database/AppointmentDB.java create mode 100644 src/main/java/org/example/petshopdesktop/database/ServiceDB.java create mode 100644 src/main/java/org/example/petshopdesktop/models/Appointment.java create mode 100644 src/main/java/org/example/petshopdesktop/models/Service.java diff --git a/src/main/java/org/example/petshopdesktop/DTOs/ServiceDTO.java b/src/main/java/org/example/petshopdesktop/DTOs/ServiceDTO.java new file mode 100644 index 00000000..c876cd3f --- /dev/null +++ b/src/main/java/org/example/petshopdesktop/DTOs/ServiceDTO.java @@ -0,0 +1,110 @@ +package org.example.petshopdesktop.DTOs; + +import javafx.beans.property.SimpleDoubleProperty; +import javafx.beans.property.SimpleIntegerProperty; +import javafx.beans.property.SimpleStringProperty; +import org.example.petshopdesktop.models.Service; + +/** + * The class for ServiceDTO, all service data stored here + */ +public class ServiceDTO { + + private SimpleIntegerProperty serviceId; + private SimpleStringProperty serviceName; + private SimpleStringProperty serviceDesc; + private SimpleIntegerProperty serviceDuration; + private SimpleDoubleProperty servicePrice; + + // constructor + public ServiceDTO(int serviceId, + String serviceName, + String serviceDesc, + int serviceDuration, + double servicePrice) { + + this.serviceId = new SimpleIntegerProperty(serviceId); + this.serviceName = new SimpleStringProperty(serviceName); + this.serviceDesc = new SimpleStringProperty(serviceDesc); + this.serviceDuration = new SimpleIntegerProperty(serviceDuration); + this.servicePrice = new SimpleDoubleProperty(servicePrice); + } + + // getters & setters + + public int getServiceId() { + return serviceId.get(); + } + + public SimpleIntegerProperty serviceIdProperty() { + return serviceId; + } + + public void setServiceId(int serviceId) { + this.serviceId.set(serviceId); + } + + public String getServiceName() { + return serviceName.get(); + } + + public SimpleStringProperty serviceNameProperty() { + return serviceName; + } + + public void setServiceName(String serviceName) { + this.serviceName.set(serviceName); + } + + public String getServiceDesc() { + return serviceDesc.get(); + } + + public SimpleStringProperty serviceDescProperty() { + return serviceDesc; + } + + public void setServiceDesc(String serviceDesc) { + this.serviceDesc.set(serviceDesc); + } + + public int getServiceDuration() { + return serviceDuration.get(); + } + + public SimpleIntegerProperty serviceDurationProperty() { + return serviceDuration; + } + + public void setServiceDuration(int serviceDuration) { + this.serviceDuration.set(serviceDuration); + } + + public double getServicePrice() { + return servicePrice.get(); + } + + public SimpleDoubleProperty servicePriceProperty() { + return servicePrice; + } + + public void setServicePrice(double servicePrice) { + this.servicePrice.set(servicePrice); + } + + /** + * Converts DTO into Service model (for edit/delete) + */ + public Service toService() { + + Service service = new Service( + getServiceId(), + getServiceName(), + getServiceDesc(), + getServiceDuration(), + getServicePrice() + ); + + return service; + } +} \ No newline at end of file diff --git a/src/main/java/org/example/petshopdesktop/controllers/AppointmentController.java b/src/main/java/org/example/petshopdesktop/controllers/AppointmentController.java index 9eb6dfce..3d5f6d13 100644 --- a/src/main/java/org/example/petshopdesktop/controllers/AppointmentController.java +++ b/src/main/java/org/example/petshopdesktop/controllers/AppointmentController.java @@ -6,9 +6,39 @@ import javafx.scene.control.Button; import javafx.scene.control.TableColumn; import javafx.scene.control.TableView; import javafx.scene.control.TextField; +import javafx.collections.FXCollections; +import javafx.collections.ObservableList; + +import javafx.fxml.FXMLLoader; +import javafx.scene.Parent; +import javafx.scene.Scene; +import javafx.stage.Stage; + +import java.io.IOException; +import org.example.petshopdesktop.database.AppointmentDB; +import org.example.petshopdesktop.models.Appointment; + public class AppointmentController { + + private ObservableList appointments = + FXCollections.observableArrayList(); + + @FXML + + + public void initialize() { + loadAppointments(); + } + + + + private void loadAppointments() { + appointments.setAll(AppointmentDB.getAllAppointments()); + tvAppointments.setItems(appointments); + } + @FXML private Button btnAdd; @@ -40,7 +70,7 @@ public class AppointmentController { private TableColumn colServiceName; @FXML - private TableView tvAppointments; + private TableView tvAppointments; @FXML private TextField txtSearch; @@ -48,16 +78,61 @@ public class AppointmentController { @FXML void btnAddClicked(ActionEvent event) { + try { + FXMLLoader loader = new FXMLLoader( + getClass().getResource("/appointment-dialog-view.fxml") + ); + + Stage stage = new Stage(); + stage.setScene(new Scene(loader.load())); + stage.showAndWait(); + + loadAppointments(); + + } catch (Exception e) { + e.printStackTrace(); + } } @FXML void btnDeleteClicked(ActionEvent event) { + Appointment selected = tvAppointments.getSelectionModel().getSelectedItem(); + + if (selected == null) return; + + try { + AppointmentDB.deleteAppointment( + selected.getAppointmentId() + ); + loadAppointments(); + } catch (Exception e) { + e.printStackTrace(); + } } @FXML void btnEditClicked(ActionEvent event) { + Appointment selected = tvAppointments.getSelectionModel().getSelectedItem(); + + if (selected == null) return; + + try { + FXMLLoader loader = new FXMLLoader( + getClass().getResource("/appointment-dialog-view.fxml") + ); + + Stage stage = new Stage(); + stage.setScene(new Scene(loader.load())); + stage.showAndWait(); + + loadAppointments(); + + } catch (Exception e) { + e.printStackTrace(); + } } } + diff --git a/src/main/java/org/example/petshopdesktop/controllers/ServiceController.java b/src/main/java/org/example/petshopdesktop/controllers/ServiceController.java index 65f73c7d..d0c361f7 100644 --- a/src/main/java/org/example/petshopdesktop/controllers/ServiceController.java +++ b/src/main/java/org/example/petshopdesktop/controllers/ServiceController.java @@ -2,56 +2,123 @@ package org.example.petshopdesktop.controllers; import javafx.event.ActionEvent; import javafx.fxml.FXML; -import javafx.scene.control.Button; -import javafx.scene.control.TableColumn; -import javafx.scene.control.TableView; -import javafx.scene.control.TextField; +import javafx.fxml.FXMLLoader; +import javafx.scene.Parent; +import javafx.scene.Scene; +import javafx.scene.control.*; +import javafx.scene.control.cell.PropertyValueFactory; +import javafx.stage.Stage; +import org.example.petshopdesktop.database.ServiceDB; +import org.example.petshopdesktop.models.Service; +import org.example.petshopdesktop.controllers.dialogcontrollers.ServiceDialogController; public class ServiceController { - @FXML - private Button btnAdd; + @FXML private Button btnAdd; + @FXML private Button btnDelete; + @FXML private Button btnEdit; + + @FXML private TableColumn colServiceId; + @FXML private TableColumn colServiceName; + @FXML private TableColumn colServiceDesc; + @FXML private TableColumn colServiceDuration; + @FXML private TableColumn colServicePrice; + + @FXML private TableView tvServices; + + @FXML private TextField txtSearch; @FXML - private Button btnDelete; + public void initialize() { - @FXML - private Button btnEdit; + colServiceId.setCellValueFactory(new PropertyValueFactory<>("serviceId")); + colServiceName.setCellValueFactory(new PropertyValueFactory<>("serviceName")); + colServiceDesc.setCellValueFactory(new PropertyValueFactory<>("serviceDesc")); + colServiceDuration.setCellValueFactory(new PropertyValueFactory<>("serviceDuration")); + colServicePrice.setCellValueFactory(new PropertyValueFactory<>("servicePrice")); - @FXML - private TableColumn colServiceDesc; + loadServices(); + } - @FXML - private TableColumn colServiceDuration; + private void loadServices() { + try { + tvServices.setItems(ServiceDB.getServices()); + } catch (Exception e) { + showAlert("Database Error", "Unable to load services."); + e.printStackTrace(); + } + } - @FXML - private TableColumn colServiceId; - - @FXML - private TableColumn colServiceName; - - @FXML - private TableColumn colServicePrice; - - @FXML - private TableView tvServices; - - @FXML - private TextField txtSearch; @FXML void btnAddClicked(ActionEvent event) { - - } - - @FXML - void btnDeleteClicked(ActionEvent event) { - + openDialog(null); + loadServices(); } @FXML void btnEditClicked(ActionEvent event) { + Service selected = tvServices.getSelectionModel().getSelectedItem(); + + if (selected == null) { + showAlert("Select Service", "Please select a service to edit."); + return; + } + + openDialog(selected); + loadServices(); } -} + @FXML + void btnDeleteClicked(ActionEvent event) { + + Service selected = tvServices.getSelectionModel().getSelectedItem(); + + if (selected == null) { + showAlert("Select Service", "Please select a service to delete."); + return; + } + + try { + ServiceDB.deleteService(selected.getServiceId()); + loadServices(); + } catch (Exception e) { + showAlert("Database Error", "Unable to delete service."); + e.printStackTrace(); + } + } + + private void openDialog(Service service) { + + try { + FXMLLoader loader = new FXMLLoader( + getClass().getResource( + "/org.example.petshopdesktop/dialogviews/ServiceDialogView.fxml" + ) + ); + + Parent root = loader.load(); + + // IMPORTANT: specify controller type + ServiceDialogController controller = + loader.getController(); + + controller.setService(service); + + Stage stage = new Stage(); + stage.setScene(new Scene(root)); + stage.showAndWait(); + + } catch (Exception e) { + e.printStackTrace(); + } + } + private void showAlert(String title, String msg) { + Alert alert = new Alert(Alert.AlertType.INFORMATION); + alert.setTitle(title); + alert.setHeaderText(null); + alert.setContentText(msg); + alert.showAndWait(); + } +} \ No newline at end of file diff --git a/src/main/java/org/example/petshopdesktop/controllers/dialogcontrollers/AppointmentDialogController.java b/src/main/java/org/example/petshopdesktop/controllers/dialogcontrollers/AppointmentDialogController.java new file mode 100644 index 00000000..af607180 --- /dev/null +++ b/src/main/java/org/example/petshopdesktop/controllers/dialogcontrollers/AppointmentDialogController.java @@ -0,0 +1,111 @@ +package org.example.petshopdesktop.controllers.dialogcontrollers; + +import javafx.collections.FXCollections; +import javafx.collections.ObservableList; +import javafx.event.EventHandler; +import javafx.fxml.FXML; +import javafx.scene.Node; +import javafx.scene.control.Button; +import javafx.scene.control.ComboBox; +import javafx.scene.control.DatePicker; +import javafx.scene.control.Label; +import javafx.scene.input.MouseEvent; +import javafx.stage.Stage; + +import org.example.petshopdesktop.database.AppointmentDB; +import org.example.petshopdesktop.models.Appointment; + +import java.sql.Time; + +public class AppointmentDialogController { + + @FXML + private Button btnCancel; + + @FXML + private Button btnSave; + + @FXML + private ComboBox cbAppointmentStatus; + + @FXML + private ComboBox