Add multi-row selection and deletion to all tables

This commit is contained in:
2026-02-25 10:08:47 -07:00
parent 13684f97de
commit 96b50a21be
8 changed files with 427 additions and 278 deletions

View File

@@ -62,6 +62,8 @@ public class AdoptionController {
void initialize() {
btnEdit.setDisable(true);
btnDelete.setDisable(true);
//Enable multiple selection
tvAdoptions.getSelectionModel().setSelectionMode(javafx.scene.control.SelectionMode.MULTIPLE);
colAdoptionId.setCellValueFactory(new PropertyValueFactory<>("adoptionId"));
colPetId.setCellValueFactory(new PropertyValueFactory<>("petId"));
@@ -100,54 +102,71 @@ public class AdoptionController {
@FXML
void btnDeleteClicked(ActionEvent event) {
int numRows = 0;
Adoption selectedAdoption = tvAdoptions.getSelectionModel().getSelectedItem();
//get selected adoptions
var selectedAdoptions = tvAdoptions.getSelectionModel().getSelectedItems();
if (selectedAdoptions.isEmpty()) return;
//ask user to confirm
Alert question = new Alert(Alert.AlertType.CONFIRMATION);
question.setHeaderText("Please confirm delete");
question.setContentText("Are you sure you want to delete this adoption record?");
String message = selectedAdoptions.size() == 1
? "Are you sure you want to delete this adoption record?"
: "Are you sure you want to delete " + selectedAdoptions.size() + " adoption records?";
question.setContentText(message);
question.getDialogPane().lookupButton(ButtonType.OK).requestFocus();
Optional<ButtonType> result = question.showAndWait();
//if confirmed, start deletion
if (result.isPresent() && result.get() == ButtonType.OK) {
int adoptionId = selectedAdoption.getAdoptionId();
int successCount = 0;
int failCount = 0;
StringBuilder errors = new StringBuilder();
try {
numRows = AdoptionDB.deleteAdoption(adoptionId);
}
catch (SQLIntegrityConstraintViolationException e) {
ActivityLogger.getInstance().logException(
"AdoptionController.btnDeleteClicked",
e,
"Deleting adoption (integrity constraint violation) with ID: " + adoptionId);
Alert alert = new Alert(Alert.AlertType.ERROR);
alert.setHeaderText("Database Operation Error");
alert.setContentText("Delete failed\nThe selected adoption is being referred in another table");
alert.showAndWait();
return;
} catch (SQLException e) {
ActivityLogger.getInstance().logException(
"AdoptionController.btnDeleteClicked",
e,
"Deleting adoption with ID: " + adoptionId);
throw new RuntimeException(e);
for (Adoption adoption : selectedAdoptions) {
try {
int numRows = AdoptionDB.deleteAdoption(adoption.getAdoptionId());
if (numRows > 0) {
successCount++;
} else {
failCount++;
}
}
catch (SQLIntegrityConstraintViolationException e) {
ActivityLogger.getInstance().logException(
"AdoptionController.btnDeleteClicked",
e,
String.format("Attempting to delete adoption ID %d - foreign key constraint", adoption.getAdoptionId()));
failCount++;
errors.append("Adoption ID ").append(adoption.getAdoptionId()).append(" is referenced in another table\n");
} catch (SQLException e) {
ActivityLogger.getInstance().logException(
"AdoptionController.btnDeleteClicked",
e,
String.format("Attempting to delete adoption ID %d", adoption.getAdoptionId()));
failCount++;
errors.append("Failed to delete adoption ID ").append(adoption.getAdoptionId()).append("\n");
}
}
if (numRows == 0) {
Alert alert = new Alert(Alert.AlertType.ERROR);
alert.setHeaderText("Database Operation Error");
alert.setContentText("Delete failed");
//show results
if (failCount > 0) {
Alert alert = new Alert(Alert.AlertType.WARNING);
alert.setHeaderText("Delete Operation Completed with Errors");
alert.setContentText(String.format("Deleted: %d\nFailed: %d\n\n%s",
successCount, failCount, errors.toString()));
alert.showAndWait();
} else {
Alert alert = new Alert(Alert.AlertType.CONFIRMATION);
} else if (successCount > 0) {
Alert alert = new Alert(Alert.AlertType.INFORMATION);
alert.setHeaderText("Database Operation Confirmed");
alert.setContentText("Delete successful");
alert.setContentText("Successfully deleted " + successCount + " adoption record(s)");
alert.showAndWait();
displayAdoptions();
btnDelete.setDisable(true);
btnEdit.setDisable(true);
txtSearch.setText("");
}
//refresh display and reset inputs
displayAdoptions();
btnDelete.setDisable(true);
btnEdit.setDisable(true);
txtSearch.setText("");
}
}

View File

@@ -40,6 +40,8 @@ public class AppointmentController {
@FXML
public void initialize(){
//Enable multiple selection
tvAppointments.getSelectionModel().setSelectionMode(javafx.scene.control.SelectionMode.MULTIPLE);
colAppointmentId.setCellValueFactory(new PropertyValueFactory<>("appointmentId"));
colPetName.setCellValueFactory(new PropertyValueFactory<>("petName"));
@@ -127,21 +129,56 @@ public class AppointmentController {
@FXML
void btnDeleteClicked(ActionEvent event){
//get selected appointments
var selectedAppointments = tvAppointments.getSelectionModel().getSelectedItems();
if (selectedAppointments.isEmpty()) return;
AppointmentDTO selected =
tvAppointments.getSelectionModel().getSelectedItem();
//ask user to confirm
Alert question = new Alert(Alert.AlertType.CONFIRMATION);
question.setHeaderText("Please confirm delete");
String message = selectedAppointments.size() == 1
? "Are you sure you want to delete this appointment?"
: "Are you sure you want to delete " + selectedAppointments.size() + " appointments?";
question.setContentText(message);
question.getDialogPane().lookupButton(ButtonType.OK).requestFocus();
java.util.Optional<ButtonType> result = question.showAndWait();
if(selected == null) return;
//if confirmed, start deletion
if (result.isPresent() && result.get() == ButtonType.OK) {
int successCount = 0;
int failCount = 0;
StringBuilder errors = new StringBuilder();
try{
AppointmentDB.deleteAppointment(selected.getAppointmentId());
for (AppointmentDTO appointment : selectedAppointments) {
try{
AppointmentDB.deleteAppointment(appointment.getAppointmentId());
successCount++;
}catch(Exception e){
ActivityLogger.getInstance().logException(
"AppointmentController.btnDeleteClicked",
e,
String.format("Attempting to delete appointment ID %d", appointment.getAppointmentId()));
failCount++;
errors.append("Failed to delete appointment ID ").append(appointment.getAppointmentId()).append("\n");
}
}
//show results
if (failCount > 0) {
Alert alert = new Alert(Alert.AlertType.WARNING);
alert.setHeaderText("Delete Operation Completed with Errors");
alert.setContentText(String.format("Deleted: %d\nFailed: %d\n\n%s",
successCount, failCount, errors.toString()));
alert.showAndWait();
} else if (successCount > 0) {
Alert alert = new Alert(Alert.AlertType.INFORMATION);
alert.setHeaderText("Database Operation Confirmed");
alert.setContentText("Successfully deleted " + successCount + " appointment(s)");
alert.showAndWait();
}
//refresh display
loadAppointments();
}catch(Exception e){
ActivityLogger.getInstance().logException(
"AppointmentController.btnDeleteClicked",
e,
"Deleting appointment with ID: " + selected.getAppointmentId());
e.printStackTrace();
}
}

View File

@@ -61,6 +61,8 @@ public class InventoryController {
//Buttons disabled until row is selected
btnEdit.setDisable(true);
btnDelete.setDisable(true);
//Enable multiple selection
tvInventory.getSelectionModel().setSelectionMode(javafx.scene.control.SelectionMode.MULTIPLE);
colInventoryId.setCellValueFactory(new PropertyValueFactory<>("inventoryId"));
colProductId.setCellValueFactory(new PropertyValueFactory<>("prodId"));
@@ -101,64 +103,72 @@ public class InventoryController {
//Prompts user for confirmation prior to deletion
@FXML
void btnDeleteClicked(ActionEvent event) {
int numRows = 0;
Inventory selectedInventory = tvInventory.getSelectionModel().getSelectedItem();
//get selected inventory records
var selectedInventory = tvInventory.getSelectionModel().getSelectedItems();
if (selectedInventory.isEmpty()) return;
//Confirmation popup
//ask user to confirm
Alert question = new Alert(Alert.AlertType.CONFIRMATION);
question.setHeaderText("Please confirm delete");
question.setContentText("Are you sure you want to delete this inventory record?");
String message = selectedInventory.size() == 1
? "Are you sure you want to delete this inventory record?"
: "Are you sure you want to delete " + selectedInventory.size() + " inventory records?";
question.setContentText(message);
question.getDialogPane().lookupButton(ButtonType.OK).requestFocus();
Optional<ButtonType> result = question.showAndWait();
//If user confirms, proceed with trying to delete...
//if confirmed, start deletion
if (result.isPresent() && result.get() == ButtonType.OK) {
int inventoryId = selectedInventory.getInventoryId();
int successCount = 0;
int failCount = 0;
StringBuilder errors = new StringBuilder();
try {
numRows = InventoryDB.deleteInventory(inventoryId);
for (Inventory inventory : selectedInventory) {
try {
int numRows = InventoryDB.deleteInventory(inventory.getInventoryId());
if (numRows > 0) {
successCount++;
} else {
failCount++;
}
}
catch (SQLIntegrityConstraintViolationException e) {
ActivityLogger.getInstance().logException(
"InventoryController.btnDeleteClicked",
e,
String.format("Attempting to delete inventory ID %d - foreign key constraint", inventory.getInventoryId()));
failCount++;
errors.append("Inventory record '").append(inventory.getProdName()).append("' is referenced in another table\n");
}
catch (SQLException e) {
ActivityLogger.getInstance().logException(
"InventoryController.btnDeleteClicked",
e,
String.format("Attempting to delete inventory ID %d", inventory.getInventoryId()));
failCount++;
errors.append("Failed to delete '").append(inventory.getProdName()).append("'\n");
}
}
catch (SQLIntegrityConstraintViolationException e) {
ActivityLogger.getInstance().logException(
"InventoryController.btnDeleteClicked",
e,
"Deleting inventory (integrity constraint violation) with ID: " + inventoryId);
Alert alert = new Alert(Alert.AlertType.ERROR);
alert.setHeaderText("Database Operation Error");
alert.setContentText("Delete failed\nThe selected inventory record is being referred in another table");
//show results
if (failCount > 0) {
Alert alert = new Alert(Alert.AlertType.WARNING);
alert.setHeaderText("Delete Operation Completed with Errors");
alert.setContentText(String.format("Deleted: %d\nFailed: %d\n\n%s",
successCount, failCount, errors.toString()));
alert.showAndWait();
return;
}
catch (SQLException e) {
ActivityLogger.getInstance().logException(
"InventoryController.btnDeleteClicked",
e,
"Deleting inventory with ID: " + inventoryId);
throw new RuntimeException(e);
}
//Checks if deletion succeeded
if (numRows == 0) {
Alert alert = new Alert(Alert.AlertType.ERROR);
alert.setHeaderText("Database Operation Error");
alert.setContentText("Delete failed");
alert.showAndWait();
}
else {
Alert alert = new Alert(Alert.AlertType.CONFIRMATION);
} else if (successCount > 0) {
Alert alert = new Alert(Alert.AlertType.INFORMATION);
alert.setHeaderText("Database Operation Confirmed");
alert.setContentText("Delete successful");
alert.setContentText("Successfully deleted " + successCount + " inventory record(s)");
alert.showAndWait();
//Refresh UI
displayInventory();
btnDelete.setDisable(true);
btnEdit.setDisable(true);
txtSearch.setText("");
}
//refresh display and reset inputs
displayInventory();
btnDelete.setDisable(true);
btnEdit.setDisable(true);
txtSearch.setText("");
}
}

View File

@@ -67,63 +67,72 @@ public class PetController {
@FXML
void btnDeleteClicked(ActionEvent event) {
int numRows = 0;
Pet selectedPet = tvPets.getSelectionModel().getSelectedItem();
//get selected pets
var selectedPets = tvPets.getSelectionModel().getSelectedItems();
if (selectedPets.isEmpty()) return;
//ask user to confirm
Alert question = new Alert(Alert.AlertType.CONFIRMATION);
question.setHeaderText("Please confirm delete");
question.setContentText("Are you sure you want to delete this pet?");
String message = selectedPets.size() == 1
? "Are you sure you want to delete this pet?"
: "Are you sure you want to delete " + selectedPets.size() + " pets?";
question.setContentText(message);
question.getDialogPane().lookupButton(ButtonType.OK).requestFocus();
Optional<ButtonType> result = question.showAndWait(); //show alert and wait for response
Optional<ButtonType> result = question.showAndWait();
//if confirmed,start deletion
//if confirmed, start deletion
if (result.isPresent() && result.get() == ButtonType.OK) {
int petId = selectedPet.getPetId();
int successCount = 0;
int failCount = 0;
StringBuilder errors = new StringBuilder();
//try deleting
try{
numRows = PetDB.deletePet(petId);
}
catch (SQLIntegrityConstraintViolationException e){
ActivityLogger.getInstance().logException(
"PetController.btnDeleteClicked",
e,
"Deleting pet (integrity constraint violation) with ID: " + petId);
Alert alert = new Alert(Alert.AlertType.ERROR);
alert.setHeaderText("Database Operation Error");
alert.setContentText("Delete failed\n" +
"the selected pet is being referred in another table");
alert.showAndWait();
return;
}
catch (SQLException e) {
ActivityLogger.getInstance().logException(
"PetController.btnDeleteClicked",
e,
"Deleting pet with ID: " + petId);
throw new RuntimeException(e);
for (Pet pet : selectedPets) {
try{
int numRows = PetDB.deletePet(pet.getPetId());
if (numRows > 0) {
successCount++;
} else {
failCount++;
}
}
catch (SQLIntegrityConstraintViolationException e){
ActivityLogger.getInstance().logException(
"PetController.btnDeleteClicked",
e,
String.format("Attempting to delete pet ID %d - foreign key constraint", pet.getPetId()));
failCount++;
errors.append("Pet '").append(pet.getPetName()).append("' is referenced in another table\n");
}
catch (SQLException e) {
ActivityLogger.getInstance().logException(
"PetController.btnDeleteClicked",
e,
String.format("Attempting to delete pet ID %d", pet.getPetId()));
failCount++;
errors.append("Failed to delete '").append(pet.getPetName()).append("'\n");
}
}
//prompt user of any errors
if (numRows == 0){
Alert alert = new Alert(Alert.AlertType.ERROR);
alert.setHeaderText("Database Operation Error");
alert.setContentText("Delete failed");
//show results
if (failCount > 0) {
Alert alert = new Alert(Alert.AlertType.WARNING);
alert.setHeaderText("Delete Operation Completed with Errors");
alert.setContentText(String.format("Deleted: %d\nFailed: %d\n\n%s",
successCount, failCount, errors.toString()));
alert.showAndWait();
}
else{
//prompt user of delete conformation
Alert alert = new Alert(Alert.AlertType.CONFIRMATION);
} else if (successCount > 0) {
Alert alert = new Alert(Alert.AlertType.INFORMATION);
alert.setHeaderText("Database Operation Confirmed");
alert.setContentText("Delete successful");
alert.setContentText("Successfully deleted " + successCount + " pet(s)");
alert.showAndWait();
//refresh display and reset inputs
displayPets();
btnDelete.setDisable(true);
btnEdit.setDisable(true);
txtSearch.setText("");
}
//refresh display and reset inputs
displayPets();
btnDelete.setDisable(true);
btnEdit.setDisable(true);
txtSearch.setText("");
}
}
@@ -144,6 +153,8 @@ public class PetController {
void initialize() {
btnEdit.setDisable(true);
btnDelete.setDisable(true);
//Enable multiple selection
tvPets.getSelectionModel().setSelectionMode(javafx.scene.control.SelectionMode.MULTIPLE);
colPetId.setCellValueFactory(new PropertyValueFactory<Pet,Integer>("petId"));
colPetName.setCellValueFactory(new PropertyValueFactory<Pet,String>("petName"));

View File

@@ -71,6 +71,8 @@ public class ProductController {
//Disable buttons until a row is selected
btnEdit.setDisable(true);
btnDelete.setDisable(true);
//Enable multiple selection
tvProducts.getSelectionModel().setSelectionMode(javafx.scene.control.SelectionMode.MULTIPLE);
//set up table columns
colProductId.setCellValueFactory(new PropertyValueFactory<ProductDTO,Integer>("prodId"));
colProductName.setCellValueFactory(new PropertyValueFactory<ProductDTO,String>("prodName"));
@@ -137,69 +139,77 @@ public class ProductController {
}
/**
* Delete a selected product when delete is clicked
* Delete selected product(s) when delete is clicked
* @param event click event for button
*/
@FXML
void btnDeleteClicked(ActionEvent event) {
int numRows = 0;
//set selected product
ProductDTO selectedProduct = tvProducts.getSelectionModel().getSelectedItem();
//get selected products
var selectedProducts = tvProducts.getSelectionModel().getSelectedItems();
if (selectedProducts.isEmpty()) return;
//ask user to confirm
Alert question = new Alert(Alert.AlertType.CONFIRMATION);
question.setHeaderText("Please confirm delete");
question.setContentText("Are you sure you want to delete this product?");
String message = selectedProducts.size() == 1
? "Are you sure you want to delete this product?"
: "Are you sure you want to delete " + selectedProducts.size() + " products?";
question.setContentText(message);
question.getDialogPane().lookupButton(ButtonType.OK).requestFocus();
Optional<ButtonType> result = question.showAndWait(); //show alert and wait for response
Optional<ButtonType> result = question.showAndWait();
//if confirmed,start deletion
//if confirmed, start deletion
if (result.isPresent() && result.get() == ButtonType.OK) {
int prodId = selectedProduct.getProdId();
int successCount = 0;
int failCount = 0;
StringBuilder errors = new StringBuilder();
//try deleting
try{
numRows = ProductDB.deleteProduct(prodId);
}
catch (SQLIntegrityConstraintViolationException e){
ActivityLogger.getInstance().logException(
"ProductController.btnDeleteClicked",
e,
String.format("Attempting to delete product ID %d - foreign key constraint", prodId));
Alert alert = new Alert(Alert.AlertType.ERROR);
alert.setHeaderText("Database Operation Error");
alert.setContentText("Delete failed\n" +
"the selected product is being referred in another table");
alert.showAndWait();
return;
}
catch (SQLException e) {
ActivityLogger.getInstance().logException(
"ProductController.btnDeleteClicked",
e,
String.format("Attempting to delete product ID %d", prodId));
throw new RuntimeException(e);
for (ProductDTO product : selectedProducts) {
try{
int numRows = ProductDB.deleteProduct(product.getProdId());
if (numRows > 0) {
successCount++;
} else {
failCount++;
}
}
catch (SQLIntegrityConstraintViolationException e){
ActivityLogger.getInstance().logException(
"ProductController.btnDeleteClicked",
e,
String.format("Attempting to delete product ID %d - foreign key constraint", product.getProdId()));
failCount++;
errors.append("Product '").append(product.getProdName()).append("' is referenced in another table\n");
}
catch (SQLException e) {
ActivityLogger.getInstance().logException(
"ProductController.btnDeleteClicked",
e,
String.format("Attempting to delete product ID %d", product.getProdId()));
failCount++;
errors.append("Failed to delete '").append(product.getProdName()).append("'\n");
}
}
//prompt user of any errors
if (numRows == 0){
Alert alert = new Alert(Alert.AlertType.ERROR);
alert.setHeaderText("Database Operation Error");
alert.setContentText("Delete failed");
//show results
if (failCount > 0) {
Alert alert = new Alert(Alert.AlertType.WARNING);
alert.setHeaderText("Delete Operation Completed with Errors");
alert.setContentText(String.format("Deleted: %d\nFailed: %d\n\n%s",
successCount, failCount, errors.toString()));
alert.showAndWait();
}
else{
//prompt user of delete conformation
Alert alert = new Alert(Alert.AlertType.CONFIRMATION);
} else if (successCount > 0) {
Alert alert = new Alert(Alert.AlertType.INFORMATION);
alert.setHeaderText("Database Operation Confirmed");
alert.setContentText("Delete successful");
alert.setContentText("Successfully deleted " + successCount + " product(s)");
alert.showAndWait();
//refresh display and reset inputs
displayProduct();
btnDelete.setDisable(true);
btnEdit.setDisable(true);
txtSearch.setText("");
}
//refresh display and reset inputs
displayProduct();
btnDelete.setDisable(true);
btnEdit.setDisable(true);
txtSearch.setText("");
}
}

View File

@@ -68,6 +68,8 @@ public class ProductSupplierController {
//Disable buttons until a row is selected
btnEdit.setDisable(true);
btnDelete.setDisable(true);
//Enable multiple selection
tvProductSuppliers.getSelectionModel().setSelectionMode(javafx.scene.control.SelectionMode.MULTIPLE);
//set up table columns
colProductId.setCellValueFactory(new PropertyValueFactory<ProductSupplierDTO,Integer>("prodId"));
colProductName.setCellValueFactory(new PropertyValueFactory<ProductSupplierDTO,String>("prodName"));
@@ -158,70 +160,81 @@ public class ProductSupplierController {
}
/**
* Delete a selected productSupplier when delete is clicked
* Delete selected product-supplier(s) when delete is clicked
* @param event click event for button
*/
@FXML
void btnDeleteClicked(ActionEvent event) {
int numRows = 0;
//set selected item
ProductSupplierDTO selectedProductSupplier = tvProductSuppliers.getSelectionModel().getSelectedItem();
//get selected product-suppliers
var selectedProductSuppliers = tvProductSuppliers.getSelectionModel().getSelectedItems();
if (selectedProductSuppliers.isEmpty()) return;
//ask user to confirm
Alert question = new Alert(Alert.AlertType.CONFIRMATION);
question.setHeaderText("Please confirm delete");
question.setContentText("Are you sure you want to delete this product-supplier?");
String message = selectedProductSuppliers.size() == 1
? "Are you sure you want to delete this product-supplier?"
: "Are you sure you want to delete " + selectedProductSuppliers.size() + " product-suppliers?";
question.setContentText(message);
question.getDialogPane().lookupButton(ButtonType.OK).requestFocus();
Optional<ButtonType> result = question.showAndWait(); //show alert and wait for response
Optional<ButtonType> result = question.showAndWait();
//if confirmed,start deletion
//if confirmed, start deletion
if (result.isPresent() && result.get() == ButtonType.OK) {
int supId = selectedProductSupplier.getSupId();
int prodId = selectedProductSupplier.getProdId();
int successCount = 0;
int failCount = 0;
StringBuilder errors = new StringBuilder();
//try deleting
try{
numRows = ProductSupplierDB.deleteProductSupplier(supId, prodId);
}
catch (SQLIntegrityConstraintViolationException e){
ActivityLogger.getInstance().logException(
"ProductSupplierController.btnDeleteClicked",
e,
"Deleting product-supplier (integrity constraint violation) - SupID: " + supId + ", ProdID: " + prodId);
Alert alert = new Alert(Alert.AlertType.ERROR);
alert.setHeaderText("Database Operation Error");
alert.setContentText("Delete failed\n" +
"the selected product-supplier is being referred in another table");
alert.showAndWait();
return;
}
catch (SQLException e) {
ActivityLogger.getInstance().logException(
"ProductSupplierController.btnDeleteClicked",
e,
"Deleting product-supplier - SupID: " + supId + ", ProdID: " + prodId);
throw new RuntimeException(e);
for (ProductSupplierDTO productSupplier : selectedProductSuppliers) {
try{
int numRows = ProductSupplierDB.deleteProductSupplier(productSupplier.getSupId(), productSupplier.getProdId());
if (numRows > 0) {
successCount++;
} else {
failCount++;
}
}
catch (SQLIntegrityConstraintViolationException e){
ActivityLogger.getInstance().logException(
"ProductSupplierController.btnDeleteClicked",
e,
String.format("Attempting to delete product-supplier - SupID: %d, ProdID: %d - foreign key constraint",
productSupplier.getSupId(), productSupplier.getProdId()));
failCount++;
errors.append(String.format("Product-Supplier '%s - %s' is referenced in another table\n",
productSupplier.getProdName(), productSupplier.getSupCompany()));
}
catch (SQLException e) {
ActivityLogger.getInstance().logException(
"ProductSupplierController.btnDeleteClicked",
e,
String.format("Attempting to delete product-supplier - SupID: %d, ProdID: %d",
productSupplier.getSupId(), productSupplier.getProdId()));
failCount++;
errors.append(String.format("Failed to delete '%s - %s'\n",
productSupplier.getProdName(), productSupplier.getSupCompany()));
}
}
//prompt user of any errors
if (numRows == 0){
Alert alert = new Alert(Alert.AlertType.ERROR);
alert.setHeaderText("Database Operation Error");
alert.setContentText("Delete failed");
//show results
if (failCount > 0) {
Alert alert = new Alert(Alert.AlertType.WARNING);
alert.setHeaderText("Delete Operation Completed with Errors");
alert.setContentText(String.format("Deleted: %d\nFailed: %d\n\n%s",
successCount, failCount, errors.toString()));
alert.showAndWait();
}
else{
//prompt user of delete conformation
Alert alert = new Alert(Alert.AlertType.CONFIRMATION);
} else if (successCount > 0) {
Alert alert = new Alert(Alert.AlertType.INFORMATION);
alert.setHeaderText("Database Operation Confirmed");
alert.setContentText("Delete successful");
alert.setContentText("Successfully deleted " + successCount + " product-supplier(s)");
alert.showAndWait();
//refresh display and reset inputs
displayProductSupplier();
btnDelete.setDisable(true);
btnEdit.setDisable(true);
txtSearch.setText("");
}
//refresh display and reset inputs
displayProductSupplier();
btnDelete.setDisable(true);
btnEdit.setDisable(true);
txtSearch.setText("");
}
}

View File

@@ -38,6 +38,8 @@ public class ServiceController {
@FXML
public void initialize() {
//Enable multiple selection
tvServices.getSelectionModel().setSelectionMode(javafx.scene.control.SelectionMode.MULTIPLE);
colServiceId.setCellValueFactory(new PropertyValueFactory<>("serviceId"));
colServiceName.setCellValueFactory(new PropertyValueFactory<>("serviceName"));
@@ -124,19 +126,56 @@ public class ServiceController {
@FXML
void btnDeleteClicked(ActionEvent e) {
//get selected services
var selectedServices = tvServices.getSelectionModel().getSelectedItems();
if (selectedServices.isEmpty()) return;
Service service = tvServices.getSelectionModel().getSelectedItem();
if (service == null) return;
//ask user to confirm
Alert question = new Alert(Alert.AlertType.CONFIRMATION);
question.setHeaderText("Please confirm delete");
String message = selectedServices.size() == 1
? "Are you sure you want to delete this service?"
: "Are you sure you want to delete " + selectedServices.size() + " services?";
question.setContentText(message);
question.getDialogPane().lookupButton(ButtonType.OK).requestFocus();
java.util.Optional<ButtonType> result = question.showAndWait();
try {
ServiceDB.deleteService(service.getServiceId());
//if confirmed, start deletion
if (result.isPresent() && result.get() == ButtonType.OK) {
int successCount = 0;
int failCount = 0;
StringBuilder errors = new StringBuilder();
for (Service service : selectedServices) {
try {
ServiceDB.deleteService(service.getServiceId());
successCount++;
} catch (Exception ex) {
ActivityLogger.getInstance().logException(
"ServiceController.btnDeleteClicked",
ex,
String.format("Attempting to delete service ID %d", service.getServiceId()));
failCount++;
errors.append("Failed to delete '").append(service.getServiceName()).append("'\n");
}
}
//show results
if (failCount > 0) {
Alert alert = new Alert(Alert.AlertType.WARNING);
alert.setHeaderText("Delete Operation Completed with Errors");
alert.setContentText(String.format("Deleted: %d\nFailed: %d\n\n%s",
successCount, failCount, errors.toString()));
alert.showAndWait();
} else if (successCount > 0) {
Alert alert = new Alert(Alert.AlertType.INFORMATION);
alert.setHeaderText("Database Operation Confirmed");
alert.setContentText("Successfully deleted " + successCount + " service(s)");
alert.showAndWait();
}
//refresh display
loadServices();
} catch (Exception ex) {
ActivityLogger.getInstance().logException(
"ServiceController.btnDeleteClicked",
ex,
"Deleting service with ID: " + service.getServiceId());
ex.printStackTrace();
}
}

View File

@@ -66,6 +66,8 @@ public class SupplierController {
//Disable buttons until a row is selected
btnEdit.setDisable(true);
btnDelete.setDisable(true);
//Enable multiple selection
tvSuppliers.getSelectionModel().setSelectionMode(javafx.scene.control.SelectionMode.MULTIPLE);
//set columns for table view
colSupplierId.setCellValueFactory(new PropertyValueFactory<Supplier, Integer>("supId"));
colSupplierName.setCellValueFactory(new PropertyValueFactory<Supplier, String>("supCompany"));
@@ -154,69 +156,77 @@ public class SupplierController {
}
/**
* Delete a selected supplier when delete is clicked
* Delete selected supplier(s) when delete is clicked
* @param event click event for button
*/
@FXML
void btnDeleteClicked(ActionEvent event) {
int numRows = 0;
//set selected supplier
Supplier selectedSupplier = tvSuppliers.getSelectionModel().getSelectedItem();
//get selected suppliers
var selectedSuppliers = tvSuppliers.getSelectionModel().getSelectedItems();
if (selectedSuppliers.isEmpty()) return;
//ask user to confirm
Alert question = new Alert(Alert.AlertType.CONFIRMATION);
question.setHeaderText("Please confirm delete");
question.setContentText("Are you sure you want to delete this supplier?");
String message = selectedSuppliers.size() == 1
? "Are you sure you want to delete this supplier?"
: "Are you sure you want to delete " + selectedSuppliers.size() + " suppliers?";
question.setContentText(message);
question.getDialogPane().lookupButton(ButtonType.OK).requestFocus();
Optional<ButtonType> result = question.showAndWait(); //show alert and wait for response
Optional<ButtonType> result = question.showAndWait();
//if confirmed, start deletion
if (result.isPresent() && result.get() == ButtonType.OK){
int supId = selectedSupplier.getSupId();
if (result.isPresent() && result.get() == ButtonType.OK) {
int successCount = 0;
int failCount = 0;
StringBuilder errors = new StringBuilder();
//Try deleting supplier
try{
numRows = SupplierDB.deleteSupplier(supId);
}
catch (SQLIntegrityConstraintViolationException e){
ActivityLogger.getInstance().logException(
"SupplierController.btnDeleteClicked",
e,
"Deleting supplier (integrity constraint violation) with ID: " + supId);
Alert alert = new Alert(Alert.AlertType.ERROR);
alert.setHeaderText("Database Operation Error");
alert.setContentText("Delete failed\n" +
"the selected supplier is being referred in another table");
alert.showAndWait();
return;
}
catch (SQLException e) {
ActivityLogger.getInstance().logException(
"SupplierController.btnDeleteClicked",
e,
"Deleting supplier with ID: " + supId);
throw new RuntimeException(e);
for (Supplier supplier : selectedSuppliers) {
try{
int numRows = SupplierDB.deleteSupplier(supplier.getSupId());
if (numRows > 0) {
successCount++;
} else {
failCount++;
}
}
catch (SQLIntegrityConstraintViolationException e){
ActivityLogger.getInstance().logException(
"SupplierController.btnDeleteClicked",
e,
String.format("Attempting to delete supplier ID %d - foreign key constraint", supplier.getSupId()));
failCount++;
errors.append("Supplier '").append(supplier.getSupCompany()).append("' is referenced in another table\n");
}
catch (SQLException e) {
ActivityLogger.getInstance().logException(
"SupplierController.btnDeleteClicked",
e,
String.format("Attempting to delete supplier ID %d", supplier.getSupId()));
failCount++;
errors.append("Failed to delete '").append(supplier.getSupCompany()).append("'\n");
}
}
//prompt user of any errors
if (numRows == 0){
Alert alert = new Alert(Alert.AlertType.ERROR);
alert.setHeaderText("Database Operation Error");
alert.setContentText("Delete failed");
//show results
if (failCount > 0) {
Alert alert = new Alert(Alert.AlertType.WARNING);
alert.setHeaderText("Delete Operation Completed with Errors");
alert.setContentText(String.format("Deleted: %d\nFailed: %d\n\n%s",
successCount, failCount, errors.toString()));
alert.showAndWait();
}
else{
//prompt user of delete conformation
Alert alert = new Alert(Alert.AlertType.CONFIRMATION);
} else if (successCount > 0) {
Alert alert = new Alert(Alert.AlertType.INFORMATION);
alert.setHeaderText("Database Operation Confirmed");
alert.setContentText("Delete successful");
alert.setContentText("Successfully deleted " + successCount + " supplier(s)");
alert.showAndWait();
//refresh display
displaySupplier();
btnDelete.setDisable(true);
btnEdit.setDisable(true);
txtSearch.setText("");
}
//refresh display and reset inputs
displaySupplier();
btnDelete.setDisable(true);
btnEdit.setDisable(true);
txtSearch.setText("");
}
}