From 83e2bed43268d4cade43f8d80f7cef28ebe02ccf Mon Sep 17 00:00:00 2001 From: Joel Thomas Date: Wed, 27 May 2026 12:19:34 +0530 Subject: [PATCH] Fix: improve notification display formatting and add global exception handling - add truncateString utility for long notification titles - improve notification table alignment - remove unnecessary heading spacing in notification preferences - add application-level exception handling in UserInterface::run() Fixes #1777 --- .../utilities/OutputHelper.h | 24 +++++++++ .../views/MenuHelper.h | 10 ++-- .../views/UserInterface.cpp | 51 ++++++++++++------- 3 files changed, 63 insertions(+), 22 deletions(-) diff --git a/Trenser.VehicleServiceSystem/Trenser.VehicleServiceSystem/utilities/OutputHelper.h b/Trenser.VehicleServiceSystem/Trenser.VehicleServiceSystem/utilities/OutputHelper.h index 12b61a3..e763ffd 100644 --- a/Trenser.VehicleServiceSystem/Trenser.VehicleServiceSystem/utilities/OutputHelper.h +++ b/Trenser.VehicleServiceSystem/Trenser.VehicleServiceSystem/utilities/OutputHelper.h @@ -21,4 +21,28 @@ namespace util { std::cout << "\x1B[2J\x1B[H" << std::flush; } + + /* + Function: truncateString + Description: + Truncates a string if its length exceeds the given maximum length. + The truncated string ends with "..." to indicate omitted characters. + Parameters: + - text: const std::string&, input string to truncate + - maxLength: size_t, maximum allowed length of the returned string + Returns: + - std::string: Original string if within limit, otherwise truncated string with "..." + */ + inline std::string truncateString(const std::string& text, size_t maxLength) + { + if (text.length() <= maxLength) + { + return text; + } + if (maxLength <= 3) + { + return std::string(maxLength, '.'); + } + return text.substr(0, maxLength - 3) + "..."; + } } \ No newline at end of file diff --git a/Trenser.VehicleServiceSystem/Trenser.VehicleServiceSystem/views/MenuHelper.h b/Trenser.VehicleServiceSystem/Trenser.VehicleServiceSystem/views/MenuHelper.h index 186c730..3d8e591 100644 --- a/Trenser.VehicleServiceSystem/Trenser.VehicleServiceSystem/views/MenuHelper.h +++ b/Trenser.VehicleServiceSystem/Trenser.VehicleServiceSystem/views/MenuHelper.h @@ -553,9 +553,9 @@ inline const Notification* selectNotification(const util::Vector indexedNotifications; std::cout << std::left - << std::setw(6) << "Index" + << std::setw(10) << "Index" << std::setw(15) << "ID" - << std::setw(30) << "Title" + << std::setw(35) << "Title" << std::setw(25) << "Timestamp" << std::endl; int currentIndex = 1; @@ -565,9 +565,9 @@ inline const Notification* selectNotification(const util::VectorgetId() - << std::setw(35) << currentNotification->getTitle() + << std::setw(35) << util::truncateString(currentNotification->getTitle(), 30) << std::setw(25) << currentNotification->getCreatedAt().toString() << std::endl; indexedNotifications.insert(currentIndex, currentNotification); @@ -886,7 +886,7 @@ inline bool getNotificationPreference(const std::string& serviceName) while (true) { util::clear(); - std::cout << " Configure Notification Preferences\n"; + std::cout << "Configure Notification Preferences\n"; std::cout << "\n" << serviceName << " Notifications\n"; std::cout << "1. Enable Notifications\n"; std::cout << "2. Disable Notifications\n"; diff --git a/Trenser.VehicleServiceSystem/Trenser.VehicleServiceSystem/views/UserInterface.cpp b/Trenser.VehicleServiceSystem/Trenser.VehicleServiceSystem/views/UserInterface.cpp index 3cb85ef..841e2ea 100644 --- a/Trenser.VehicleServiceSystem/Trenser.VehicleServiceSystem/views/UserInterface.cpp +++ b/Trenser.VehicleServiceSystem/Trenser.VehicleServiceSystem/views/UserInterface.cpp @@ -7,6 +7,8 @@ Author: Trenser Date:19-May-2026 */ +#include +#include #include "Enums.h" #include "InputHelper.h" #include "OutputHelper.h" @@ -23,29 +25,44 @@ Return type: void */ void UserInterface::run() { - m_controller.loadSystemData(); - m_controller.runSystemChecks(); - bool isMenuActive = true; - while (isMenuActive) + try { - try + m_controller.loadSystemData(); + m_controller.runSystemChecks(); + bool isMenuActive = true; + while (isMenuActive) { - int choice; - util::clear(); - std::cout << "Vehicle Service System\n1. Login\n2. Register Customer\n3. Exit\nEnter your Choice: "; - util::read(choice); - if (!handleOperation(choice)) + try { - isMenuActive = false; + int choice; + util::clear(); + std::cout << "Vehicle Service System\n1. Login\n2. Register Customer\n3. Exit\nEnter your Choice: "; + util::read(choice); + if (!handleOperation(choice)) + { + isMenuActive = false; + } + } + catch (const std::exception& e) + { + std::cout << "Exception: " << e.what() << std::endl; + util::pressEnter(); } } - catch (const std::exception& e) - { - std::cout << "Exception: " << e.what() << std::endl; - util::pressEnter(); - } + m_controller.saveSystemData(); + } + catch (const std::invalid_argument& exception) + { + std::cout << "Exception: Invalid Argument: " << exception.what() << std::endl; + } + catch (const std::exception& exception) + { + std::cout << "Exception: " << exception.what() << std::endl; + } + catch (...) + { + std::cout << "Unknown error occurred." << std::endl; } - m_controller.saveSystemData(); } /*