This project is evolved from AddressBook-Level3.
Refer to the guide Setting up and getting started.
The Architecture Diagram given above explains the high-level design of the App.
Given below is a quick overview of main components and how they interact with each other.
Main components of the architecture
Main (consisting of classes Main and MainApp) is in charge of the app launch and shut down.
The bulk of the app's work is done by the following four components:
UI: The UI of the App.Logic: The command executor.Model: Holds the data of the App in memory.Storage: Reads data from, and writes data to, the hard disk.Commons represents a collection of classes used by multiple other components.
How the architecture components interact with each other
The Sequence Diagram below shows how the components interact with each other for the scenario where the user issues the command delete_guest 1.
Each of the four main components (also shown in the diagram above),
interface with the same name as the Component.{Component Name}Manager class (which follows the corresponding API interface mentioned in the previous point).For example, the Logic component defines its API in the Logic.java interface and implements its functionality using the LogicManager.java class which follows the Logic interface. Other components interact with a given component through its interface rather than the concrete class (reason: to prevent outside component's being coupled to the implementation of a component), as illustrated in the (partial) class diagram below.
The sections below give more details of each component.
The API of this component is specified in Ui.java
The UI consists of a MainWindow that is made up of three smaller parts:CommandBox, ResultDisplay and PersonListPanel. All these parts, along with the MainWindow, inherit from the abstract UiPart class which captures the commonalities between classes that represent parts of the visible GUI.
The UI component uses the JavaFx UI framework. The layout of these UI parts are defined in matching .fxml files that are in the src/main/resources/view folder. For example, the layout of the MainWindow is specified in MainWindow.fxml
The UI component,
Logic component.Model data so that the UI can be updated with the modified data.Logic component, because the UI relies on the Logic to execute commands.Model component, as it displays Guest, Vendor objects residing in the Model.API : Logic.java
Here's a (partial) class diagram of the Logic component:
The sequence diagram below illustrates the interactions within the Logic component, taking execute("delete_guest 1") API call as an example.
Note: The lifeline for DeleteGuestCommandParser should end at the destroy marker (X) but due to a limitation of PlantUML, the lifeline continues till the end of diagram.
How the Logic component works:
When Logic is called upon to execute a command, it is passed to an AddressBookParser object which in turn creates a parser that matches the command (e.g., DeleteGuestCommandParser) and uses it to parse the command.
EditVendorCommandParser and EditGuestCommandParser parser classes require the Model, to check if the guest or vendor index provided by the user is valid or not.This results in a Command object (more precisely, an object of one of its subclasses e.g., DeleteGuestCommand) which is executed by the LogicManager.
When the Command object is executed, it communicates with the Model (e.g., to delete a guest).
In the sequence diagram example above, the Command object first calls the getFilteredGuestList method, followed by the deletePerson method on the Model during its execution, illustrating one possible sequence of communication.
The result of the command execution is encapsulated as a CommandResult object which is returned back from Logic.
Here are the other classes in Logic (omitted from the class diagram above) that are used for parsing a user command:
How the parsing works:
AddressBookParser class creates an XYZCommandParser (XYZ is a placeholder for the specific command name e.g., AddGuestCommandParser) which uses the other classes shown above to parse the user command and create a XYZCommand object (e.g., AddGuestCommand) which the AddressBookParser returns back as a Command object.
XYZCommandParser classes require the Model for parsing.clear, list, exit, help and stats user commands, the AddressBookParser directly returns the Command object, and no corresponding XYZCommandParser class is created (as there is no extra info to parse). XYZCommandParser classes (e.g., AddGuestCommandParser, DeleteGuestCommandParser, ...) inherit from the Parser interface so that they can be treated similarly where possible e.g, during testing.API : Model.java
Note: Vendor and Guest both extend from the abstract Person class, which defines common attributes and behaviors shared by both types of entities.
The Model component,
Guest and Vendor objects (which are contained in a UniquePersonList object).Guest / Vendor objects (e.g., results of a search query) as a separate filtered list which is exposed to outsiders as an unmodifiable ObservableList<Person> that can be 'observed' e.g. the UI can be bound to this list so that the UI automatically updates when the data in the list change.UserPref object that represents the user’s preferences. This is exposed to the outside as a ReadOnlyUserPref objects.Model represents data entities of the domain, they should make sense on their own without depending on other components).API : Storage.java
The Storage component,
Can save both address book data and user preference data in JSON format, and read them back into corresponding objects.
Storage saves Guest into JSON format and reads back into Guest object, using the JsonAdapatedGuest class.Storage saves Vendor into JSON format and reads back into Vendor object, using the JsonAdaptedVendor class. Inherits from both AddressBookStorage and UserPrefStorage, which means it can be treated as either one (if only the functionality of only one is needed).
Depends on some classes in the Model component (because the Storage component's job is to save/retrieve objects that belong to the Model).
Classes used by multiple components are in the seedu.address.commons package.
This section describes some noteworthy details on how certain features are implemented.
The add_guest command creates and adds a new Guest object into the address book. The attributes of the Guest are specified through prefixes (n/, p/, e/, a/, rsvp/, r/ and t/) and their corresponding values.
The sequence diagrams below provide an overview for the execution flow of an add_guest command.
Note: In the diagrams below,
Note: The lifeline for AddGuestCommandParser should end at the destroy marker (X) but due to a limitation of PlantUML, the lifeline continues till the end of diagram.
Explanation:
execute method of LogicManager is called with the user input as the argument to begin the command execution.AddressBookParser parses the user input initially. If the user input is identified to be an add_guest command, it creates and returns an AddGuestCommandParser for further parsing.AddGuestCommandParser parses the arguments provided in the user input to extract the prefixes and their values, which are used to create a Guest object with the corresponding attributes.
Guest object with name, phone number, email and address attributes will be created. AddGuestCommand is then created with the new Guest object and returned.LogicManager executes the AddGuestCommand, which calls the addPerson method of Model to add the guest into the address book.CommandResult containing the success message is then returned to the LogicManager (and then back to the UI component).The edit_guest command updates the details of an existing guest in the address book. Users can specify the guest to be edited by providing the index number (positive, starting from 1) of that guest. New guest details are specified through prefixes (n/, p/, e/, a/, rsvp/, r/ and t/) and their corresponding values.
The sequence diagrams below provide an overview for the execution flow of an edit_guest command:
Note: In the diagrams below,
Note: The lifeline for EditGuestCommandParser should end at the destroy marker (X) but due to a limitation of PlantUML, the lifeline continues till the end of diagram.
Explanation:
execute method of LogicManager is called with the user input as the argument to begin the command execution.AddressBookParser parses the user input initially. If the user input is identified to be an edit_guest command, it creates and returns an EditGuestCommandParser for further parsing.EditGuestCommandParser parses the arguments provided by the user input to extract the prefixes and their values, which are used to create an EditGuestDescriptor object that captures the updated information EditGuestCommand is then created with the guest index provided, as well as the new EditGuestDescriptor object.LogicManager executes the EditGuestCommand, which retrieves the guest list from Model. The guest index is used to access the target guest to edit. An edited guest with the updated name (from the example above) is then created using the existing target guest and the EditGuestDescriptor. The setPerson method is then called to replace the existing target guest with the edited guest. Subsequently, the updateFilteredPersonList method from Model is called to update the filtered list.CommandResult containing the success message is then returned to the LogicManager (and then back to the UI component).The find command searches for all guests and vendors that match any of the given keyword(s) and displays them. The prefix specified in the command indicates the attribute to be searched. Do note that exactly one type of prefix should be used for each find command.
The sequence diagrams below provide an overview for the execution flow of a find command:
Note: In the diagrams below,
Note: The lifeline for FindCommandParser should end at the destroy marker (X) but due to a limitation of PlantUML, the lifeline continues till the end of diagram.
Explanation:
execute method of LogicManager is called with the user input as the argument to begin the command executionAddressBookParser parses the user input initially. If the user input is identified to be a find command, it creates and returns a FindCommandParser for further parsing.FindCommandParser parses the arguments provided in the user input to extract the prefix and its corresponding value. Then, it calls the corresponding parse predicate method to create the corresponding predicate to be used. In the above example, since the name prefix is specified, the parseNamePredicate method is called to create a NameContainsKeywordsPredicate object.FindCommand is then created with the predicate and returned.LogicManager executes the FindCommand, which calls the updateFilteredPersonList method of the Model with the predicate as the argument. This method filters the list of guests and vendors based on the predicate. In this example, guests and vendors whose name matches the given keyword John will be kept in the filtered list. Subsequently, the FindCommand calls getFilteredGuestListCount and getFilteredVendorListCount methods from Model to respectively obtain the number of remaining guests and vendors.CommandResult containing the success message is then returned to the LogicManager (and then back to the UI component).Target user profile:
A wedding planner who:
Value proposition:
Priorities: High (must have) - * * *, Medium (nice to have) - * *, Low (unlikely to have) - *
| Priority | As a … | I want to … | So that I can… |
|---|---|---|---|
* * * | forgetful wedding planner | add a new guest/vendor into the contact list | easily track and manage guests/vendors for the wedding |
* * * | organized wedding planner | view a list of guests/vendors | easily access and reference their details |
* * * | organized wedding planner | delete a guest/vendor contact that I no longer need | keep my contact list organised and clutter-free |
* * * | meticulous wedding planner | edit the details of an existing guest/vendor in the contact list | correct mistakes and ensure that all information remains accurate and up-to-date |
* * | organized wedding planner | find guests/vendors based on a specific attribute | efficiently retrieve guest/vendor details when required |
* * | data-driven wedding planner | view wedding statistics (number of guests/vendors/total people) | quickly assess the current status of wedding planning |
* * | organized wedding planner | clear all guest/vendor data in the contact list | start fresh with a clean slate and easily reset the contact list if needed |
* * | organized wedding planner | track and update the RSVP status of each guest | know exactly who is attending and make necessary arrangements accordingly |
* | cost-conscious wedding planner | track the budget allocated for each vendor | ensure the wedding remains within budget and avoid overspending |
(For all use cases below, the System is BridalBuddy and the Actor is the user, unless specified otherwise)
Use case: UC01 - Add a Guest
MSS
User requests to add a new Guest with the required details (e.g. name, email, etc.).
System adds the entry.
Use case ends.
Extensions
1a. The provided details are incomplete or invalid.
1a1. System shows an error message and requests the user to re-enter the details.
Use case resumes at step 1.
1b. The input command was invalid (i.e. spelling error, etc.).
1b1. System tells the user the command is unrecognised.
Use case ends.
1c. A Guest with the same name and phone number already exists
1c1. System tells the user the Guest already exists
Use case ends.
Use case: UC02 - Add a Vendor
MSS
User requests to add a new Vendor with the required details (e.g. name, email, etc.).
System adds the entry.
Use case ends.
Extensions
1a. The provided details are incomplete or invalid.
1a1. System shows an error message and requests the user to re-enter the details.
Use case resumes at step 1.
1b. The input command was invalid (i.e. spelling error, etc.).
1b1. System tells the user the command is unrecognised.
Use case ends.
1c. A Vendor with the same name and phone number already exists
1c1. System tells the user the Vendor already exists
Use case ends.
Use Case: UC03 - Update details of Guest
MSS
User selects Guest to update along with the fields to be updated.
System saves the changes and notifies user of success.
Use case ends.
Extensions
1a. The input command was invalid (i.e. spelling error, etc.).
1a1. System tells the user the command is unrecognised.
Use case ends.
1b. The new details are incomplete or invalid.
1b1. System shows an error message and requests the user to re-enter the details.
Use case resumes at step 1.
1c. The new details result in a duplicate Guest (i.e. same name, phone number and type)
1c1. System tells the user the Guest already exists
Use case ends.
Use Case: UC04 - Update details of Vendor
MSS
User selects a Vendor to update along with the fields to be updated.
System saves the changes and notifies user of success.
Use case ends.
Extensions
1a. The input command was invalid (i.e. spelling error, etc.).
1a1. System tells the user the command is unrecognised.
Use case ends.
1b. The new details are incomplete or invalid.
1b1. System shows an error message and requests the user to re-enter the details.
Use case resumes at step 1.
1c. The new details result in a duplicate Vendor (i.e. same name, phone number and type)
1c1. System tells the user the Vendor already exists
Use case ends.
Use Case: UC05 - Delete a Guest
MSS
User requests to delete a Guest entry.
System deletes the Guest entry.
Use case ends.
Extensions
1a. The provided Guest entry does not exist.
1a1. System shows an error message.
Use case resumes at step 1.
1b. The input command was invalid (i.e. spelling error, etc.).
1b1. System tells the user the command is unrecognised.
Use case ends.
Use Case: UC06 - Delete a Vendor
MSS
User requests to delete a Vendor entry.
System deletes the Vendor entry.
Use case ends.
Extensions
1a. The provided Vendor entry does not exist.
1a1. System shows an error message.
Use case resumes at step 1.
1b. The input command was invalid (i.e. spelling error, etc.).
1b1. System tells the user the command is unrecognised.
Use case ends.
Use Case: UC07 - Find Guests and Vendor with a particular field
MSS
User requests to find Guest and Vendor entries with a specified field (e.g., by name).
System displays the matching Guest and Vendor entries.
Use case ends.
Extensions
1a. The input command was invalid (i.e. spelling error, etc.).
1a1. System tells the user the command is unrecognised.
Use case ends.
1b. No matching entries are found.
1b1. System shows a message indicating no results.
Use case ends.
Use Case: UC08 - Get statistics
MSS
User requests to get statistics of all entries.
System displays the statistics.
Use case ends.
Extensions
1a. The input command was invalid (i.e. spelling error, etc.).
1a1. System tells the user the command is unrecognised.
Use case ends.
Use Case: UC09 - Clear all entries
MSS
User requests to clear all entries.
System clears all entries.
Use case ends.
Extensions
1a. The input command was invalid (i.e. spelling error, etc.).
1a1. System tells the user the command is unrecognised.
Use case ends.
Data Requirements
Environment Requirements
Accessibility
Fault Tolerance
Performance Requirements
Technical terms
Non-technical terms
In developing BridalBuddy, we've identified areas that can benefit from enhancement. We believe in transparency and keeping our users informed, so we want to acknowledge these feature limitations.
Feature Flaw in Current Implementation
Currently, BridalBuddy is designed to manage only a single wedding at a time. This limits its functionality for users who may be planning multiple weddings simultaneously or managing various events, such as wedding planners working with several clients. Without support for multiple weddings, users may face challenges in organizing and accessing information for each event separately.
Proposed Enhancement
Introduce functionality to manage multiple weddings within the application. This would include separate profiles or dashboards for each wedding, with individual guest and vendor lists. Users could easily switch between weddings, ensuring all information remains organized and accessible. This enhancement would broaden BridalBuddy's usability for professional planners or users involved in multiple wedding events.
Feature Flaw in Current Implementation
Currently, names do not accept . and / and other special characters that might appear in a person's legal name.
Proposed Enhancement
We should remove strict alphanumeric checks for names to support special characters, allowing for more accurate entries.
Feature Flaw in Current Implementation
The current design of BridalBuddy's command parser does not accept certain characters, such as /, within input fields (e.g., addresses or company names).
When users include these characters as part of standard text entries—such as a/123 Main St/Suite 5—the parser interprets St/ as an unrecognized prefix,
resulting in unnecessary parsing errors and frustrating interruptions.
Proposed Enhancement
To address this design limitation, enhance the command parsing logic to allow / within fields without mistaking them for new prefixes.
By improving how BridalBuddy distinguishes between field content and actual command prefixes, users will experience fewer parsing errors and a smoother, more accurate input process.
Feature Flaw in Current Implementation
Currently, the phone number field only accepts integers as valid input.
However, planners might encounter scenarios, such as keeping track of overseas guests, where symbols like (), +, - and . are needed.
The current restriction limits users from including such details, potentially causing confusion about the origin of the number.
Proposed Enhancement
We can relax validation on the phone number field to allow symbols such as (), +, - and ..
find command to allow for partial and substring searchFeature Flaw in Current Implementation
Currently, the find command requires an exact match or a specific keyword for searching guests or vendors.
This limits the flexibility of the search functionality, as users cannot retrieve entries that partially match the search term.
Proposed Enhancement
Enhance the find command to allow partial and substring searches.
With this enhancement, a search query would return all results containing the specified character(s) or substring, regardless of its position in the name or other fields.
find command to allow multiple types of prefixes to be used for each find commandFeature Flaw in Current Implementation
Currently, users can only use one type of prefix for each find command. As such, users are unable to use multiple types of prefixes within the same find command.
For example, find n/John p/98765432 is an invalid command.
Proposed Enhancement
Enhance find command to allow multiple types of prefixes to be used for each find command so that users can search for multiple fields with a single find command.
For example, with this enhancement, find n/John p/98765432 will return all guest(s) and vendor(s) that have the name John and the phone number 98765432
Feature Flaw in Current Implementation
Currently, the address field accepts any character, including symbols like $, % or emojis, which are generally uncommon in typical addresses.
This may result in inconsistent data entries and impact the professionalism and readability of the contact list.
Proposed Enhancement
Introduce validation for the address field to allow only common address characters (letters, numbers, spaces, commas, etc.) while restricting uncommon symbols and emojis. This will maintain consistent and realistic address entries.
stats command to include additional metricsFeature Flaw in Current Implementation
The existing stats command in BridalBuddy only provides statistics on guest attendance, such as counts of those attending, declining, or yet to respond.
While this information is helpful, the feature could be improved by providing additional insights, such as the current budget—a crucial aspect of wedding planning.
Without budget metrics, planners may find it challenging to get a comprehensive view of the wedding's overall progress.
Proposed Enhancement
Enhance the stats command to display both attendance and budget metrics, providing a more comprehensive overview.
By combining attendance statistics with budget metrics, the enhanced stats command will give planners a fuller picture of the wedding’s status, making it easier to manage both attendance and finances in one place.
Feature Flaw in Current Implementation
Currently, BridalBuddy's budget tracking feature only supports the dollar symbol ($),
which may not be suitable for users in countries where other currency symbols (such as £, €, ¥, etc.) are standard.
This limitation can lead to confusion and reduce usability for international users who need their local currency symbol represented.
Proposed Enhancement
Update the budget tracking feature to allow users to input their preferred currency symbol. This enhancement would enable planners to use a symbol that reflects their local currency, making the budget tracking experience more intuitive and globally accessible. This change would improve clarity and provide a more personalized experience for users in various regions.
clear command to clear Guests and Vendors SeparatelyFeature Flaw in Current Implementation
The existing clear command in BridalBuddy deletes all Guests and Vendors.
In some situations, users might want to clear only either the Guest or Vendor list.
This command may cause some inconvenience as users would have to manually delete all Guests or all Vendors.
Proposed Enhancement
Extend the clear function with two more functions clear_guest and clear_vendor to delete all Guests or all Vendors respectively.
This would help to resolve the aforementioned scenario, allowing users more functionality.
Given below are instructions to test the app manually.
Note: These instructions only provide a starting point for testers to work on; testers are expected to do more exploratory testing.
Initial launch
i. Download the jar file and copy into an empty folder
ii. Double-click the jar file
Expected: Shows the GUI with a set of sample contacts. The window size may not be optimum.
Saving window preferences
i. Resize the window to an optimum size. Move the window to a different location. Close the window.
ii. Re-launch the app by double-clicking the jar file.
Expected: The most recent window size and location is retained.
listTest case: add_guest n/Nick Fury p/96753452 e/nickfury@avengers.com a/219 West 47th Street, New York City, New York rsvp/P r/H t/boss t/avenger
Expected: A new guest is added to the end of the Guest list. Details of the Guest are displayed in the outcome box.
Test case: add_guest n/Peter Parker p/92458634 e/peter@school.com a/20 Ingram Street, New York City, New York
Expected: A new guest is added to the end of the Guest list. Details of the Guest are displayed in the outcome box.
Test case: add_guest n/Nick Fury p/96753452 e/nickfury@duplicate.com a/Duplicate City
Expected: No Guest is added. Error details shown in the outcome box. Command line remains the same.
Test case: add_vendor n/Henry Pym p/84568869 e/pym@quantum.com a/31 Albert Street, San Francisco c/Pym Technologies b/1000 t/AUX t/visuals
Expected: A new vendor is added to the end of the Vendor list. Details of the Vendor are displayed in the outcome box.
Test case: add_vendor n/Stephen Strange p/86759432 e/stephen@mystic.com a/177A Bleecker Street, Manhattan, New York City c/The Sanctum Sanctorum
Expected: A new vendor is added to the end of the Vendor list. Details of the Vendor are displayed in the outcome box.
Test case: add_vendor n/Henry Pym p/84568869 e/pym@duplicate.com a/Duplicate City c/Duplicate Technologies
Expected: No Vendor is added. Error details shown in the outcome box. Command line remains the same.
Test case: edit_guest 1 rsvp/A
Expected: First Guest's RSVP status is updated in the list. Details of the edited Guest is displayed in the outcome box.
Test case: edit_guest 2 p/99313358 a/21 Jump Street, Brooklyn, New York t/shield
Expected: Second Guest's RSVP status is updated in the list. Details of the edited Guest is displayed in the outcome box.
Test case: Try editing a Guest such that it has the same name and phone number as another Guest on the list.
Expected: No Guest is edited. Error details shown in the outcome box. Command line remains the same.
Test case: edit_vendor 1 c/Coca Cola
Expected: First Vendor's company is updated in the list. Details of the edited Vendor is displayed in the outcome box.
Try editing other vendors with different parameters. Multiple parameters can be specified for each command as well, same as the second test case of edit guest.
Expected: The Vendor at the specified index will be edited with the specified fields. Details of the edited Vendor is displayed in the outcome box.
Test case: Try editing a Vendor such that it has the same name and phone number as another Vendor on the list.
Expected: No Vendor is edited. Error details shown in the outcome box. Command line remains the same.
Prerequisites: List all Guests and Vendors using the list command. Multiple Guests and Vendors in each list.
Test case: delete_guest 1
Expected: First Guest is deleted from the Guest list. Details of the deleted Guest is displayed in the outcome box.
Test case: delete_guest 0
Expected: No Guest is deleted. Error details shown in the outcome box. Command line remains the same.
Other incorrect delete commands to try: delete_guest, delete_guest x, ... (where x is larger than the guest list size)
Expected: Similar to previous.
Prerequisites: List all Guests and Vendors using the list command. Multiple Guests and Vendors in each list.
Test case: delete_vendor 1
Expected: First Vendor is deleted from the Vendor list. Details of the deleted Vendor shown in the outcome box.
Test case: delete_vendor 0
Expected: No Vendor is deleted. Error details shown in the outcome box. Command line remains the same.
Other incorrect delete commands to try: delete_vendor, delete_vendor x, ... (where x is larger than the guest list size)
Expected: Similar to previous.
Test case: find n/Thor
Expected: All Guests and Vendors with the word Thorin the name are displayed in their respective lists. Total number of Guests (pending, coming, not coming) and Vendors found will be displayed in the outcome box.
Test case: find t/agent
Expected: All Guests and Vendors with the tag agent are displayed in their respective lists. Total number of Guests (pending, coming, not coming) and Vendors found will be displayed in the outcome box.
Test case: Try using the find command with more than one field specified.
Expected: No change in the Guests and Vendors displayed. Error details shown in the outcome box. Command line remains the same.
statsclearexitDealing with missing data file
i. Delete the file named bridalbuddy.json located in the data folder.
ii. Relaunch BridalBuddy
iii. Run the command clear
Expected: A new empty bridalbuddy.json file is created in the data folder. Sample Guests and Vendors are deleted.
Dealing with corrupted data file
i. Open the bridalbuddy.json file located in the data folder with a text editor.
ii. Corrupt the file by deleting a few characters. Save the file.
iii. Relaunch BridalBuddy.
Expected: No Guests and Vendors will be displayed in the display panel of BridalBuddy.
Difficulty Level: Very high
Challenges Faced: AB3 was designed to manage a single entity type—contacts. Our project, however, required managing two distinct entities, guests and vendors, each with unique fields and functionalities (e.g., RSVP status for guests, company name for vendors).
Effort Required: Modifying the data model to accommodate multiple entities required extensive refactoring of the underlying structure. This included updates to storage, command parsing, and validation logic, to support both entity types consistently while maintaining functionality for existing commands. We also spent significant time adjusting current commands to recognize and process both guests and vendors without errors.
Achievements: We successfully integrated both entity types while maintaining a clean architecture, enabling BridalBuddy to manage multiple types of contacts with specific fields and functionalities, all without compromising compatibility with existing commands.
Difficulty Level: Medium
Challenges Faced: We added new optional fields, such as budget for vendors, and relationship type for guests. This required additional validations and command adjustments to handle partial data inputs, ensuring user flexibility.
Effort Required: Implementing and validating optional fields involved command parsing, updates to storage, and ensuring proper input validation (e.g. budgets specified to two decimal places).
Achievements: The added flexibility in fields has made BridalBuddy adaptable to a wider variety of planning needs, while the validation ensures high data reliability.
Difficulty Level: High
Challenges Faced: Customising the UI to clearly distinguish between guests and vendors required significant modifications to AB3's existing UI structure, which proved more complex than backend coding. Editing the UI relied heavily on visual adjustments, involving considerable trial and error to achieve the right layout and style.
Effort Required: We restructured the layout to visually separate guest and vendor lists, allowing users to easily differentiate and manage each contact type.
Achievements: The customized UI offers a more intuitive experience, allowing users to quickly access and manage information specific to guests and vendors.
Difficulty Level: Medium
Challenges Faced: Implementing the statistics command required adapting AB3’s structure to dynamically calculate and display counts of guests and vendors.
Effort Required: We developed a new stats command that calculates and returns the total counts of guests and vendors.
Achievements: The stats command offers users a quick overview of the total number of guests and vendors, providing planners with valuable insights at a glance.