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.
list
Test 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 Thor
in 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.
stats
clear
exit
Dealing 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.