This project is based on the AddressBook-Level3 project created by the SE-EDU initiative.
Libraries Used: JavaFX, Jackson, JUnit5
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 del n/Alex.
Another Sequence Diagram below shows how the components interact with each other for the scenario where the user issues the command add-wed w/John & Gina v/CHIJMES d/11/12/25.
The four main components (also shown in the diagram above, staticContext is not a main component),
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 parts e.g.CommandBox, ResultDisplay, PersonListPanel etc. All these, including 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 Person object 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("view-wed Alex & Mary") API call as an example.
Note: The lifeline for ViewWeddingCommandParser 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:
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., ViewWeddingCommandParser) and uses it to parse the command.Command object (more precisely, an object of one of its subclasses e.g., ViewWeddingCommand) which is executed by the LogicManager.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., AddCommandParser) which uses the other classes shown above to parse the user command and create an XYZCommand object (e.g., AddCommand) which the AddressBookParser returns back as a Command object.XYZCommandParser classes (e.g., AddCommandParser, DeleteCommandParser, ...) inherit from the Parser interface so that they can be treated similarly where possible e.g, during testing.API : Model.java
The Model component,
Person objects (which are contained in a UniquePersonList object).Wedding objects (which are contained in a UniqueWeddingList object).Person 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.Wedding objects (e.g., results of a search query) as a separate filtered list which is exposed to outsiders as an unmodifiable ObservableList<Wedding> 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,
AddressBookStorage, WeddingBookStorage and UserPrefStorage, which means it can be treated as either one (if only the functionality of only one is needed).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 feature implementation details of KnottyPlanners.
The Wedding class represents a wedding event in KnottyPlanners. It includes details such as the wedding name, venue,
date and participants. The Wedding class supports the following functions:
Add Wedding: Creates a new Wedding in KnottyPlanners.Delete Wedding: Deletes an existing Wedding from KnottyPlanners and the associated tags.List Weddings: Lists all Weddings in KnottyPlanners.View Wedding: Displays participants of a specific Wedding.Refer to our User Guide for more information on how to use these functions associated with the Wedding Class.
StaticContext is a utility class used to manage the state of pending operations in KnottyPlanners. It helps in handling deletion and clear commands by maintaining boolean flags and references to the entities to be deleted or cleared.
The StaticContext class supports the following functions:
| Function | Associated Command |
|---|---|
setClearAddressBookPending | clear-ab / cab |
setClearWeddingBookPending | clear-wb / cwb |
setPersonToDelete | del n/NAME |
setWeddingToDelete | del-wed w/NAME & NAME / dw w/NAME & NAME |
Here is an example usage scenario and how StaticContext is used in KnottyPlanners.
The user requests to delete a Wedding. StaticContext.setWeddingToDelete(wedding) is called to set the Wedding to be deleted.
The user confirms the deletion. The DeleteYCommand checks StaticContext.getWeddingToDelete() and proceeds with the deletion.
The user requests to clear the wedding book. StaticContext.setClearWeddingBookPending(true) is called to set the clear operation as pending.
The user confirms the clear operation. The DeleteYCommand checks StaticContext.isClearWeddingBookPending() and proceeds with clearing the wedding book.
Strict Command Guidelines:
y or n to proceed or cancel the operation respectively.y or n that modify the intended deletion or clear operation may lead to unexpected results. (We have implemented checks to prevent this)tag-del does not require confirmation:
tag-del command does not require a confirmation prompt.
1. Prefix Enhancements
Currently: The view wedding command in KnottyPlanners does not require a need for a prefix to represent the wedding. Thus, when associating a wedding to a Person, it is done by tagging them to it, making the prefix 't/'.
Plan: To make the association of Wedding and Person more intuitive, we will change the prefix from 't/' to 'w/', representing the Wedding that a Person is associated with.
2. Forced Deletion and Clearing
Currently: To prevent accidental deletions and clearing of data in KnottyPlanners, a user confirmation is currently required to ensure that the action is intentional.
Plan: To include a force deletion or clearing command that enables the user to remove the data without KnottyPlanners requiring a confirmation from them, to increase efficiency.
3. Improved Filtering
Currently: The filter command in KnottyPlanners supports filtering by the name or job fields only.
Plan: To allow users to filter with other fields such as phone number, address and email.
4. Allow Copying of Information
Currently: KnottyPlanners is optimised for keyboard usage, and direct copying of information from the GUI is not supported.
Plan: To allow the users of KnottyPlanners to copy information directly from the contact or wedding cards, in order to facilitate mouse usage. We will also include a feature to export the information to a text file or csv file for easy sharing.
5. Support for Long Inputs
Currently: KnottyPlanners only support inputs up till a reasonable amount of characters. As such, extreme inputs that exceed our limit can potentially hinder the viewing of information when the user does not resize the window.
Plan: To handle extreme inputs of all fields with a long character count, ensuring that the information can still remain visible.
6. Index Referencing
Currently: KnottyPlanners requires users to select the Person from their names in order to reduce ambiguity. However, this can result in inefficiency when handling extremely long names.
Plan: To allow users to reference the contact or wedding based on their index in the list, in addition to our current implementation. This ensures that the efficiency of KnottyPlanners is maintained.
7. Further CLI Support
Currently: Opening the help window creates an external popup that requires the user to close with a mouse or trackpad.
Plan: Enhance CLI optimisation by allowing the user to close the popup without using a mouse or trackpad.
8. Contacts and Weddings Visibility
Currently: The address and wedding lists are in two separate views to help the wedding planner to be more focused and reduce cluttering of information. This can lead to an additional need to toggle between the wedding book and address book to recall the names of the wedding.
Plan: To have an integrated view that contains both the persons and weddings side by side, allowing the association of persons to weddings to be done with less memory work.
9. Comprehensive Language Support
Currently: KnottyPlanners supports names in English language without special characters such as "^" or non-English names.
Plan: To have a more comprehensive language allowance for names with special characters and non-English names, making KnottyPlanners more inclusive. To maintain checks for incorrect entry of data, KnottyPlanners will then prompt the user if special characters have been used.
Target user profile:
Value proposition: Manage contacts of all stakeholders of multiple weddings with ease and convenience.
Priorities: High (must have) - * * *, Medium (nice to have) - * *, Low (unlikely to have) - *
| Priority | As a … | I want to … | So that I can… |
|---|---|---|---|
* * * | Wedding Planner | Add contact details | I can store contacts in my address book |
* * * | Wedding Planner | Delete contacts | I can remove contacts I no longer need |
* * * | Wedding Planner | List all contacts | I can view all my clients and wedding vendors |
* * | Wedding Planner | Edit contact details | I can keep information as up-to-date and accurate as possible |
* * | Wedding Planner | Filter contacts by name and/or job | I can quickly find the contact(s) I need |
* * | Wedding Planner | Create weddings | I can manage all details specific to that wedding |
* * | Wedding Planner | Delete weddings | I can remove weddings once they are over |
* * | Wedding Planner | List all weddings | I can view all weddings that I am planning |
* * | Wedding Planner | View all contacts associated with a wedding | I can easily view which stakeholders are involved in that wedding |
* * | Wedding Planner | Tag my contacts to a wedding | I can group relevant stakeholders and attendees of a wedding together |
* * | Wedding Planner | Un-tag my contacts from a wedding | I can remove relevant stakeholders and attendees who are no longer associated with that wedding |
* | Wedding Planner | Create and manage guest lists for each wedding | I can track RSVPs and dietary preferences |
* | Wedding Planner | Track vendor bookings for each wedding | I can ensure all necessary services are confirmed |
* | Wedding Planner | Rate or review vendors after each event | I can assess their performance for future recommendations |
* | Wedding Planner | Set reminders to contact specific vendors/clients | I can correspond with them on time without missing any important deadlines |
(For all use cases below, the System is the KnottyPlanners and the Actor is the User, unless specified otherwise)
Use case: UC01 - Delete a contact
MSS
User requests to list contacts
KnottyPlanners shows a list of contacts
User requests to delete a specific contact in the list
KnottyPlanners shows a confirmation prompt
User confirms the deletion
KnottyPlanners deletes the contact
Use case ends.
Extensions
2a. The list is empty.
Use case ends.
3a. The given contact name is invalid.
3a1. KnottyPlanners shows an error message.
Use case ends.
5a. The user cancels the deletion.
Use case ends.
Use case: UC02 - Add a contact
MSS
User requests to list contacts
KnottyPlanners shows a list of contacts
User requests to add a new contact
KnottyPlanners adds the new contact
Use case ends.
Extensions
3a. The given contact details are invalid.
3a1. KnottyPlanners shows an error message.
Use case resumes at step 2.
3b. The contact already exists.
3b1. KnottyPlanners shows an error message.
Use case resumes at step 2.
Use case: UC03 - Add a tag to a contact
MSS
User requests to tag a wedding to a person
KnottyPlanners tags the person to the wedding
Use case ends.
Extensions
1a. The wedding is not yet created.
1a1. KnottyPlanners shows an error message.
Use case resumes at step 1.
1b. The given wedding name is in an invalid format.
1b1. KnottyPlanners shows an error message.
Use case resumes at step 1.
1c. The given contact name is invalid.
1c1. KnottyPlanners shows an error message.
Use case resumes at step 1.
1d. The tag already exists for that contact.
1d1. KnottyPlanners shows an error message.
Use case ends.
Use case: UC04 - Delete a tag from a contact
MSS
User requests to list contacts
KnottyPlanners shows a list of contacts
User requests to delete a tag from a specific contact in the list
KnottyPlanners deletes the tag from that contact
Use case ends.
Extensions
2a. The list is empty.
Use case ends.
3a. The given name is invalid.
3a1. KnottyPlanners shows an error message.
Use case resumes at step 2.
3b. The tag does not exist for that contact.
3b1. KnottyPlanners shows an error message.
Use case resumes at step 2.
3c. The tag is not associated with any wedding.
3c1. KnottyPlanners shows an error message.
Use case resumes at step 2.
Use case: UC05 - View all Contacts associated with a Wedding
MSS
User requests to list weddings
KnottyPlanners shows a list of weddings
User requests to view all contacts for a specific wedding in the list
KnottyPlanners shows a list of contacts associated with that wedding (if any)
Use case ends.
Extensions
2a. The list is empty.
Use case ends.
3a. The given wedding name is invalid or does not exist.
3a1. KnottyPlanners shows an error message.
Use case resumes at step 2.
Use case: UC06 - Search for a specific contact by name
MSS
User requests to search for contacts by name criteria
KnottyPlanners shows a list of contacts that matches the name criteria
Use case ends.
Extensions
1a. The given criterion is invalid.
1a1. KnottyPlanners shows an error message.
Use case resumes at step 1.
2a. There are no contacts that matches the name.
2a1. KnottyPlanners shows an empty list.
Use case ends.
Use case: UC07 - Search for a specific contact by job
MSS
User requests to search for contacts by job criteria
KnottyPlanners shows a list of contacts that match the job criteria
Use case ends.
Extensions
1a. The given criterion is invalid.
1a1. KnottyPlanners shows an error message.
Use case resumes at step 1.
2a. There are no contacts that matches the job.
2a1. KnottyPlanners shows an empty list.
Use case ends.
Use case: UC08 - Edit a contact's details
MSS
User requests to list contacts
KnottyPlanners shows a list of contacts
User requests to edit details of a specific contact
KnottyPlanners updates the details for that contact
Use case ends.
Extensions
2a. The list is empty.
Use case ends.
3a. The given contact name is invalid.
3a1. KnottyPlanners shows an error message.
Use case resumes at step 2.
3b. The new contact details given are invalid.
3b1. KnottyPlanners shows an error message.
Use case resumes at step 2.
Use case: UC09 - Adding a new wedding
MSS
User requests to list weddings
KnottyPlanners shows a list of weddings
User requests to add a new wedding
KnottyPlanners adds the new wedding
Use case ends.
Extensions
3a. The given wedding name is invalid or fields are missing/invalid.
3a1. KnottyPlanners shows an error message.
Use case resumes at step 2.
3b. The wedding already exists.
3b1. KnottyPlanners shows an error message.
Use case resumes at step 2.
Use case: UC10 - Deleting a wedding
MSS
User requests to list weddings
KnottyPlanners shows a list of weddings
User requests to delete a specific wedding in the list
KnottyPlanners shows a confirmation prompt
User confirms the deletion
KnottyPlanners deletes the wedding
Use case ends.
Extensions
2a. The list is empty.
Use case ends.
3a. The given wedding name is invalid.
3a1. KnottyPlanners shows an error message.
Use case resumes at step 2.
3b. The wedding does not exist.
3b1. KnottyPlanners shows an error message.
Use case resumes at step 2.
5a. The user cancels the deletion.
Use case ends.
Use case: UC11 - Clearing Address or Wedding Book
MSS
User requests to clear the address book or wedding book
KnottyPlanners shows a confirmation prompt
User confirms the deletion
KnottyPlanners clears the address book or wedding book
Use case ends.
Extensions
2a. The address book or wedding book is already empty.
Use case ends.
3a. The user cancels the deletion.
Use case ends.
17 or above installed.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 using the User Guide.
Initial launch
Download the jar file and copy it into an empty folder.
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
Resize the window to an optimum size. Move the window to a different location. Close the window.
Re-launch the app by double-clicking the jar file.
Expected: The most recent window size and location is retained.
Adding a person
add n/John Doe p/98765432 e/johnd@example.com a/John street, Blk 123, #01-04 j/Photographer
Expected: Success message with John Doe's details shown. UI displays person list.add n/John Doe p/98765432 e/johnd@example.comdel n/Alex followed by ydel n/Jonus followed by ndel, del 123123Editing a person that exists in AddressBook
edit n/Alex new/John Doe edit n/Alex t/Alex & John DoeFiltering a person based on name and job
filter n/John j/Photographer John or job Photographer or both name John and job Photographer.filter JohnAdding a wedding
add-wed w/James Hauw & Rachel Loh v/Pan Pacific Hotel d/11/03/2025 add-wed v/Pan Pacific Hotel d/11/03/2025add-wed w/James Hauw and Rachel Loh v/Pan Pacific Hotel d/11/03/2025Deleting a wedding that exists in WeddingBook
del-wed w/Jonus Ho & Izzat Syazani followed by ydel-wed w/Jonus Ho & Izzat Syazani followed by ndel-wed, del-wed Jonus & IzzatAdding a tag of an existing wedding in WeddingBook to a person
tag-add n/Jonus t/James Hauw & Rachel Loh tag-add n/Jonus w/James Hauw & Rachel LohDeleting a tag of an existing wedding in WeddingBook of a person
tag-del n/Jonus t/James Hauw & Rachel Loh tag-del n/Jonus w/James Hauw & Rachel LohShowing person list
list Showing wedding list
list-wed Showing help window
help Dealing with corrupted data files
Using the relevant add or add-wed commands, create dummy data that is to be stored in the storage.
To simulate a corrupted file, locate the addressbook.json or weddingbook.json file in the data folder.
Delete a random line in the .json file, and relaunch KnottyPlanners. Expected: KnottyPlanners will launch with all previous data wiped and cleared.