From 4d1c887d4eb9233346fd5482f4e50d61103d8398 Mon Sep 17 00:00:00 2001 From: michaelseyo Date: Sat, 19 Feb 2022 22:24:22 +0800 Subject: [PATCH 001/214] Update user guide --- docs/UserGuide.md | 175 +++++++++++++++++++++------------------------- 1 file changed, 78 insertions(+), 97 deletions(-) diff --git a/docs/UserGuide.md b/docs/UserGuide.md index 3716f3ca8a4..d31c41bdc94 100644 --- a/docs/UserGuide.md +++ b/docs/UserGuide.md @@ -1,12 +1,5 @@ ---- -layout: page -title: User Guide ---- - -AddressBook Level 3 (AB3) is a **desktop app for managing contacts, optimized for use via a Command Line Interface** (CLI) while still having the benefits of a Graphical User Interface (GUI). If you can type fast, AB3 can get your contact management tasks done faster than traditional GUI apps. - -* Table of Contents -{:toc} +# User Guide +ClientConnect is a **desktop app for managing clients’ contact details, optimized for use via a Command Line Interface** (CLI) while still having the benefits of a Graphical User Interface (GUI). Are you a fast typer? ClientConnect can get your client management tasks done faster than traditional GUI apps with the ability to `find` specific clients based on keywords provided. -------------------------------------------------------------------------------------------------------------------- @@ -14,133 +7,144 @@ AddressBook Level 3 (AB3) is a **desktop app for managing contacts, optimized fo 1. Ensure you have Java `11` or above installed in your Computer. -1. Download the latest `addressbook.jar` from [here](https://github.com/se-edu/addressbook-level3/releases). -1. Copy the file to the folder you want to use as the _home folder_ for your AddressBook. +2. Download the latest `ClientConnect.jar` + + +3. Copy the file to the folder you want to use as the _home folder_ for your ClientConnect. + -1. Double-click the file to start the app. The GUI similar to the below should appear in a few seconds. Note how the app contains some sample data.
- ![Ui](images/Ui.png) +4. Double-click the file to start the app. The GUI similar to the below should appear in a few seconds. Note how the app contains some sample data. + + +5. Type the command in the command box and press Enter to execute it. e.g. typing **`help`** and pressing Enter will open the help window.
-1. Type the command in the command box and press Enter to execute it. e.g. typing **`help`** and pressing Enter will open the help window.
Some example commands you can try: * **`list`** : Lists all contacts. - * **`add`**`n/John Doe p/98765432 e/johnd@example.com a/John street, block 123, #01-01` : Adds a contact named `John Doe` to the Address Book. + * **`add`**`n/John Doe p/98765432 e/johnd@example.com a/John street, block 123, #01-01, i/package1`: Adds a client named John Doe who is under the insurance package1 to the Address Book. - * **`delete`**`3` : Deletes the 3rd contact shown in the current list. + * **`delete`**`3` : Deletes the 3rd client shown in the current list. - * **`clear`** : Deletes all contacts. + * **`clear`** : Deletes all clients. * **`exit`** : Exits the app. -1. Refer to the [Features](#features) below for details of each command. + +6. Refer to the Features below for details of each command. -------------------------------------------------------------------------------------------------------------------- ## Features -
- -**:information_source: Notes about the command format:**
+**Notes about the command format:**
-* Words in `UPPER_CASE` are the parameters to be supplied by the user.
+* Words in `UPPER_CASE` are the parameters **to be supplied** by the user.
e.g. in `add n/NAME`, `NAME` is a parameter which can be used as `add n/John Doe`. -* Items in square brackets are optional.
- e.g `n/NAME [t/TAG]` can be used as `n/John Doe t/friend` or as `n/John Doe`. + +* Items in square brackets are **optional**.
+ e.g `n/NAME [t/TAG]` can be used as `n/John Doe t/important` or as `n/John Doe`. + * Items with `…`​ after them can be used multiple times including zero times.
- e.g. `[t/TAG]…​` can be used as ` ` (i.e. 0 times), `t/friend`, `t/friend t/family` etc. + e.g. `[t/TAG]…​` can be used as ` ` (i.e. 0 times), `t/important`, `t/important t/discounted` etc. + * Parameters can be in any order.
e.g. if the command specifies `n/NAME p/PHONE_NUMBER`, `p/PHONE_NUMBER n/NAME` is also acceptable. + * If a parameter is expected only once in the command but you specified it multiple times, only the last occurrence of the parameter will be taken.
e.g. if you specify `p/12341234 p/56785678`, only `p/56785678` will be taken. + * Extraneous parameters for commands that do not take in parameters (such as `help`, `list`, `exit` and `clear`) will be ignored.
e.g. if the command specifies `help 123`, it will be interpreted as `help`. -
### Viewing help : `help` -Shows a message explaning how to access the help page. - -![help message](images/helpMessage.png) +Shows a message explaining how to access the ClientConnect help page. Format: `help` - ### Adding a person: `add` -Adds a person to the address book. - -Format: `add n/NAME p/PHONE_NUMBER e/EMAIL a/ADDRESS [t/TAG]…​` +Adds a person, as well as any details, to ClientConnect. -
:bulb: **Tip:** -A person can have any number of tags (including 0) -
+Format: `add n/NAME p/PHONE_NUMBER e/EMAIL a/ADDRESS i/INSURANCE_PACKAGE [t/TAG]…​` Examples: -* `add n/John Doe p/98765432 e/johnd@example.com a/John street, block 123, #01-01` -* `add n/Betsy Crowe t/friend e/betsycrowe@example.com a/Newgate Prison p/1234567 t/criminal` +* `add n/Damith p/99998888 e/damith@damith.com` +* `add n/Jackson p/92341888 e/jackson5@example.com a/laney street, block 123, #01-01, i/package1 t/important` + +Note: Any tags are **optional**, and anyone can have any number of tags, even 0 ### Listing all persons : `list` -Shows a list of all persons in the address book. +Displays all your clients in ClientConnect. Format: `list` ### Editing a person : `edit` -Edits an existing person in the address book. +Edits an existing client in ClientConnect, similar to adding a new client. + +Format: `edit INDEX [n/NAME] [p/PHONE] [e/EMAIL] [a/ADDRESS] [i/INSURANCE_PACKAGE] [t/TAG]…​` -Format: `edit INDEX [n/NAME] [p/PHONE] [e/EMAIL] [a/ADDRESS] [t/TAG]…​` +Examples: +* `edit 1 p/123456 will edit the phone number of the client listed as #1 to 123456` -* Edits the person at the specified `INDEX`. The index refers to the index number shown in the displayed person list. The index **must be a positive integer** 1, 2, 3, …​ -* At least one of the optional fields must be provided. +Notes: +* Edits the person at the specified `INDEX`. +* You can look for a client’s index by using the `list` command. +* At least one of the fields must be provided. * Existing values will be updated to the input values. -* When editing tags, the existing tags of the person will be removed i.e adding of tags is not cumulative. -* You can remove all the person’s tags by typing `t/` without - specifying any tags after it. -Examples: -* `edit 1 p/91234567 e/johndoe@example.com` Edits the phone number and email address of the 1st person to be `91234567` and `johndoe@example.com` respectively. -* `edit 2 n/Betsy Crower t/` Edits the name of the 2nd person to be `Betsy Crower` and clears all existing tags. +### Locating persons by field: `find` -### Locating persons by name: `find` +Finds clients whose field contains any of the given keywords. -Finds persons whose names contain any of the given keywords. +Format: `find FIELD KEYWORD [MORE_KEYWORDS]` -Format: `find KEYWORD [MORE_KEYWORDS]` +Fields: +* `n/`: name +* `p/`: phone number +* `e/`: email +* `a/`: address +* `i/`: insurance package +* `t/`: tags +Notes: * The search is case-insensitive. e.g `hans` will match `Hans` * The order of the keywords does not matter. e.g. `Hans Bo` will match `Bo Hans` -* Only the name is searched. -* Only full words will be matched e.g. `Han` will not match `Hans` -* Persons matching at least one keyword will be returned (i.e. `OR` search). - e.g. `Hans Bo` will return `Hans Gruber`, `Bo Yang` +* The fields described above can be searched Examples: -* `find John` returns `john` and `John Doe` -* `find alex david` returns `Alex Yeoh`, `David Li`
- ![result for 'find alex david'](images/findAlexDavidResult.png) +* `find n/John` returns `john` and `John Doe` +* `find p/91234567` returns the client that is associated to the number +* `find a/street` returns the client associated with the address + +![result for 'find alex david'](images/findAlexDavidResult.png) +* `find n/alex david` returns `Alex Yeoh`, `David Li` + +![result for 'find alex david'](images/findAlexDavidResult.png) ### Deleting a person : `delete` -Deletes the specified person from the address book. +Deletes an existing client from ClientConnect. Format: `delete INDEX` -* Deletes the person at the specified `INDEX`. -* The index refers to the index number shown in the displayed person list. -* The index **must be a positive integer** 1, 2, 3, …​ +* Deletes the person at the specified INDEX. +* You can look for a client’s index by using the `list` command. +* You can also delete a client after doing a search and using the index in the search (refer to example 2) Examples: -* `list` followed by `delete 2` deletes the 2nd person in the address book. -* `find Betsy` followed by `delete 1` deletes the 1st person in the results of the `find` command. +1. `delete 1` +2. `find n/John` followed by `delete 1` deletes the 1st person in the results provided by ClientConnect after finding by the `John` keyword ### Clearing all entries : `clear` @@ -154,39 +158,16 @@ Exits the program. Format: `exit` -### Saving the data - -AddressBook data are saved in the hard disk automatically after any command that changes the data. There is no need to save manually. - -### Editing the data file - -AddressBook data are saved as a JSON file `[JAR file location]/data/addressbook.json`. Advanced users are welcome to update data directly by editing that data file. - -
:exclamation: **Caution:** -If your changes to the data file makes its format invalid, AddressBook will discard all data and start with an empty data file at the next run. -
- -### Archiving data files `[coming in v2.0]` - -_Details coming soon ..._ - --------------------------------------------------------------------------------------------------------------------- - -## FAQ - -**Q**: How do I transfer my data to another Computer?
-**A**: Install the app in the other computer and overwrite the empty data file it creates with the file that contains the data of your previous AddressBook home folder. - -------------------------------------------------------------------------------------------------------------------- ## Command summary -Action | Format, Examples ---------|------------------ -**Add** | `add n/NAME p/PHONE_NUMBER e/EMAIL a/ADDRESS [t/TAG]…​`
e.g., `add n/James Ho p/22224444 e/jamesho@example.com a/123, Clementi Rd, 1234665 t/friend t/colleague` -**Clear** | `clear` -**Delete** | `delete INDEX`
e.g., `delete 3` -**Edit** | `edit INDEX [n/NAME] [p/PHONE_NUMBER] [e/EMAIL] [a/ADDRESS] [t/TAG]…​`
e.g.,`edit 2 n/James Lee e/jameslee@example.com` -**Find** | `find KEYWORD [MORE_KEYWORDS]`
e.g., `find James Jake` -**List** | `list` -**Help** | `help` +| Action | Format, Examples| +|------------|------------------| +| **Add** | `add n/NAME p/PHONE_NUMBER e/EMAIL a/ADDRESS i/INSURANCE_PACKAGE [t/TAG]…​`
e.g., `add n/James Ho p/22224444 e/jamesho@example.com a/123, Clementi Rd, 1234665 i/package1 t/friend t/colleague`| + | **Delete** | `delete INDEX`
e.g., `delete 3`| +| **Edit** | `edit INDEX [n/NAME] [p/PHONE_NUMBER] [e/EMAIL] [a/ADDRESS] [i/INSURANCE_PACKAGE] [t/TAG]…​`
e.g.,`edit 2 n/James Lee e/jameslee@example.com`| + | **Find** | `find FIELD KEYWORD [MORE_KEYWORDS]`
e.g., `find n/James Jake`| +| **List** | `list`| + | **Help** | `help`| + | **Exit** | `exit`| From 84baee41c96d67d74d4c487cc5c4208d2afb4480 Mon Sep 17 00:00:00 2001 From: leeyiheng12 Date: Mon, 28 Feb 2022 15:56:01 +0800 Subject: [PATCH 002/214] Update README to make it specific to ClientConnect --- README.md | 34 +++++++++++++++++++++++----------- 1 file changed, 23 insertions(+), 11 deletions(-) diff --git a/README.md b/README.md index 13f5c77403f..e0e52dae60d 100644 --- a/README.md +++ b/README.md @@ -1,14 +1,26 @@ -[![CI Status](https://github.com/se-edu/addressbook-level3/workflows/Java%20CI/badge.svg)](https://github.com/se-edu/addressbook-level3/actions) +# ClientConnect [![CI Status](https://github.com/se-edu/addressbook-level3/workflows/Java%20CI/badge.svg)](https://github.com/se-edu/addressbook-level3/actions) + +--- ![Ui](docs/images/Ui.png) -* This is **a sample project for Software Engineering (SE) students**.
- Example usages: - * as a starting point of a course project (as opposed to writing everything from scratch) - * as a case study -* The project simulates an ongoing software project for a desktop application (called _AddressBook_) used for managing contact details. - * It is **written in OOP fashion**. It provides a **reasonably well-written** code base **bigger** (around 6 KLoC) than what students usually write in beginner-level SE modules, without being overwhelmingly big. - * It comes with a **reasonable level of user and developer documentation**. -* It is named `AddressBook Level 3` (`AB3` for short) because it was initially created as a part of a series of `AddressBook` projects (`Level 1`, `Level 2`, `Level 3` ...). -* For the detailed documentation of this project, see the **[Address Book Product Website](https://se-education.org/addressbook-level3)**. -* This project is a **part of the se-education.org** initiative. If you would like to contribute code to this project, see [se-education.org](https://se-education.org#https://se-education.org/#contributing) for more info. +### Are you an insurance agent? + +### Having trouble with all your clients' details? + +### Do you want a clean, simple app that stores and manages all of that for you? + +### If so, look no further! + + +## Quick Overview + +--- +ClientConnect is a simple desktop application that stores all your clients' information for you! + +Manage your clients with ease! + +Just using the keyboard, you can add clients by including details such as their name, address, etc. + +Other functionalities, such as editing or deleting existing contacts, or finding contacts by keyworsds, are also available. + From 7fc15b181f9f8bfd6a1f8f0adf4ef09c47ed5453 Mon Sep 17 00:00:00 2001 From: Joshua Teo <77264646+jetrz@users.noreply.github.com> Date: Mon, 28 Feb 2022 17:41:41 +0800 Subject: [PATCH 003/214] Update DeveloperGuide.md --- docs/DeveloperGuide.md | 76 ++++++++++++++++++++++++++++++++---------- 1 file changed, 58 insertions(+), 18 deletions(-) diff --git a/docs/DeveloperGuide.md b/docs/DeveloperGuide.md index 46eae8ee565..c2edda327bd 100644 --- a/docs/DeveloperGuide.md +++ b/docs/DeveloperGuide.md @@ -1,9 +1,29 @@ --- -layout: page -title: Developer Guide +# Developer Guide --- -* Table of Contents -{:toc} + +Table of Contents + * Acknowledgements + * Setting up, getting started + * Design + * Architecture + * UI Component + * Logic Component + * Model Component + * Storage Component + * Common classes + * Implementation + * Documentation, logging, testing, configuration, dev-ops + * Appendix: Requirements + * Product Scope + * User Stories + * Use Cases + * Non-Functional Requirements + * Glossary + * Appendix: Instructions for manual testing + * Launch and shutdown + * Deleting a person + * Saving data -------------------------------------------------------------------------------------------------------------------- @@ -257,13 +277,16 @@ _{Explain here how the data archiving feature will be implemented}_ **Target user profile**: -* has a need to manage a significant number of contacts -* prefer desktop apps over other types -* can type fast -* prefers typing to mouse interactions -* is reasonably comfortable using CLI apps +A tech savvy insurance agent who: +* has to manage a significant number of clients and their different profiles +* prefers quick commands to locate his clients in his address book +* has to meet up with clients to introduce new packages at different locations +* is on the move often, prefers an app that can be used efficiently and relabily on the go -**Value proposition**: manage contacts faster than a typical mouse/GUI driven app +**Value proposition**: +* Allow clients to be saved, ordered and filtered by different categories +* Allow different pieces of data to be saved for different clients +* Has short commands for address book to be used efficiently and reliably on the go ### User stories @@ -272,12 +295,25 @@ Priorities: High (must have) - `* * *`, Medium (nice to have) - `* *`, Low (unli | Priority | As a …​ | I want to …​ | So that I can…​ | | -------- | ------------------------------------------ | ------------------------------ | ---------------------------------------------------------------------- | -| `* * *` | new user | see usage instructions | refer to instructions when I forget how to use the App | -| `* * *` | user | add a new person | | -| `* * *` | user | delete a person | remove entries that I no longer need | -| `* * *` | user | find a person by name | locate details of persons without having to go through the entire list | -| `* *` | user | hide private contact details | minimize chance of someone else seeing them by accident | -| `*` | user with many persons in the address book | sort persons by name | locate a person easily | +| `* * *` | new user | have a quick guide | learn how to use the address book efficiently and effectively | +| `* * *` | user | add a new client | have a list of my clients | +| `* * *` | user | delete an old client | remove clients who have stopped working with me | +| `* * *` | user | update a client's details | keep information of my clients accurate and up-to-date | +| `* * *` | user | list all clients | have an overview of my clientele | +| `* * *` | user | have an 'information' field in each client's details | store miscellaneous infomation pertaining to each client | +| `* *` | user | sort my clients | see contacts in ascending/descending order w.r.t a certain priority (i.e. next meeting) | +| `* *` | user on-the-move | have keyboard shortcuts | use the app efficiently and reliably | +| `* *` | clumsy user | undo my last command | revert if I made a mistake in my previous command | +| `* *` | clumsy user | have autocorrect for commands | make minor mistyping errors without having to rewrite entire commands | +| `* *` | user with many clients in the address book | search for clients | obtain information about a client easily | +| `* *` | user with many clients in the address book | filter clients | obtain information about a group of clients easily | +| `* *` | user with many clients in the address book | pin certain clients | easily access them | +| `* *` | anxious user | set reminders | be alerted for upcoming meetings, deadlines etc. +| `* *` | user | see relationships between my clients | manage entire families/groups of friends at the same time and tailor pacakages specifically for them | +| `*` | user | export my data into other formats such as Excel | visualise and share information with others | +| `*` | user | import and view the data of others' using this app | help out my colleagues when needed | +| `*` | night-owl user | turn on dark mode | strain my eyes less when working at night | +| `*` | artsy user | artsy mode | enjoy different visuals on the app *{More to be added}* @@ -315,13 +351,17 @@ Priorities: High (must have) - `* * *`, Medium (nice to have) - `* *`, Low (unli 1. Should work on any _mainstream OS_ as long as it has Java `11` or above installed. 2. Should be able to hold up to 1000 persons without a noticeable sluggishness in performance for typical usage. 3. A user with above average typing speed for regular English text (i.e. not code, not system admin commands) should be able to accomplish most of the tasks faster using commands than using the mouse. +4. A new user should be able to learn how to use all functions of the address book within 10 minutes. +5. Product should come with storage system, should not depend on external servers/Database Management Systems (DBMS) +6. Product should work without an installer. +7. Source code is open source. +8. Features should be easy to test, for both manual and automated testing. -*{More to be added}* +*{More to be added (?)}* ### Glossary * **Mainstream OS**: Windows, Linux, Unix, OS-X -* **Private contact detail**: A contact detail that is not meant to be shared with others -------------------------------------------------------------------------------------------------------------------- From 84475436bc61cf9f000f9d4be858256e630d296a Mon Sep 17 00:00:00 2001 From: Joshua Teo <77264646+jetrz@users.noreply.github.com> Date: Mon, 28 Feb 2022 17:48:10 +0800 Subject: [PATCH 004/214] Update DeveloperGuide.md Included the full requirements of our product into the modified sections. Sections added/updated: * Table of Contents * Appendix: Requirements -> Product Scope * Appendix: Requirements -> User Stories * Appendix: Requirements -> Non-Functional Requirements These updates were done through this and the previous commit, which I had accidentally committed without a subject and body. Hope this can be overlooked! --- docs/DeveloperGuide.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docs/DeveloperGuide.md b/docs/DeveloperGuide.md index c2edda327bd..51470ead591 100644 --- a/docs/DeveloperGuide.md +++ b/docs/DeveloperGuide.md @@ -352,7 +352,7 @@ Priorities: High (must have) - `* * *`, Medium (nice to have) - `* *`, Low (unli 2. Should be able to hold up to 1000 persons without a noticeable sluggishness in performance for typical usage. 3. A user with above average typing speed for regular English text (i.e. not code, not system admin commands) should be able to accomplish most of the tasks faster using commands than using the mouse. 4. A new user should be able to learn how to use all functions of the address book within 10 minutes. -5. Product should come with storage system, should not depend on external servers/Database Management Systems (DBMS) +5. Product should come with a storage system, and should not depend on external servers/Database Management Systems (DBMS) 6. Product should work without an installer. 7. Source code is open source. 8. Features should be easy to test, for both manual and automated testing. From f3c00c726583e0c08708a1aca6947e12dc571e4b Mon Sep 17 00:00:00 2001 From: Joshua Teo <77264646+jetrz@users.noreply.github.com> Date: Mon, 28 Feb 2022 18:06:56 +0800 Subject: [PATCH 005/214] Update DeveloperGuide.md Added table at the top of the page specifying the layout and title of this file. --- docs/DeveloperGuide.md | 3 +++ 1 file changed, 3 insertions(+) diff --git a/docs/DeveloperGuide.md b/docs/DeveloperGuide.md index 51470ead591..1532a34aec4 100644 --- a/docs/DeveloperGuide.md +++ b/docs/DeveloperGuide.md @@ -1,4 +1,7 @@ --- +layout: page +title: Developer Guide +--- # Developer Guide --- From 1b913afb5a43780453f0df25cc6e0411efc1952a Mon Sep 17 00:00:00 2001 From: jetrz Date: Mon, 28 Feb 2022 21:54:56 +0800 Subject: [PATCH 006/214] Add PPP for jetrz Added PPP for jetrz for documentation of contribution to tP. --- docs/team/jetrz.md | 36 ++++++++++++++++++++++++++++++++++ docs/team/johndoe.md | 46 -------------------------------------------- 2 files changed, 36 insertions(+), 46 deletions(-) create mode 100644 docs/team/jetrz.md delete mode 100644 docs/team/johndoe.md diff --git a/docs/team/jetrz.md b/docs/team/jetrz.md new file mode 100644 index 00000000000..c7413436a22 --- /dev/null +++ b/docs/team/jetrz.md @@ -0,0 +1,36 @@ +--- +layout: page +title: Joshua Teo's Project Portfolio Page +--- + +### Project: ClientConnect + +ClientConnect is a desktop client address book application for insurance agents to manage and keep track of their clietntele seamlesssly and efficiently. Custom tailored to suit the needs of insurance agents, ClientConnect surpasses other similar applications by offering features such as grouping of clients by packages, keyboard shortcuts, a gorgeous GUI, and more. + +Given below are my contributions to the project. + +* **New Feature**: + * To be added soon + +* **Code contributed**: [RepoSense link]() + +* **Project management**: + * To be added soon + +* **Enhancements to existing features**: + * To be added soon + +* **Documentation**: + * User Guide: + * To be added soon + * Developer Guide: + * Added section on product scope. + * Added section on user stories. + * Added section on non-functional requirements. + * Improved overall styling. + +* **Community**: + * To be added soon + +* **Tools**: + * To be added soon diff --git a/docs/team/johndoe.md b/docs/team/johndoe.md deleted file mode 100644 index 773a07794e2..00000000000 --- a/docs/team/johndoe.md +++ /dev/null @@ -1,46 +0,0 @@ ---- -layout: page -title: John Doe's Project Portfolio Page ---- - -### Project: AddressBook Level 3 - -AddressBook - Level 3 is a desktop address book application used for teaching Software Engineering principles. The user interacts with it using a CLI, and it has a GUI created with JavaFX. It is written in Java, and has about 10 kLoC. - -Given below are my contributions to the project. - -* **New Feature**: Added the ability to undo/redo previous commands. - * What it does: allows the user to undo all previous commands one at a time. Preceding undo commands can be reversed by using the redo command. - * Justification: This feature improves the product significantly because a user can make mistakes in commands and the app should provide a convenient way to rectify them. - * Highlights: This enhancement affects existing commands and commands to be added in future. It required an in-depth analysis of design alternatives. The implementation too was challenging as it required changes to existing commands. - * Credits: *{mention here if you reused any code/ideas from elsewhere or if a third-party library is heavily used in the feature so that a reader can make a more accurate judgement of how much effort went into the feature}* - -* **New Feature**: Added a history command that allows the user to navigate to previous commands using up/down keys. - -* **Code contributed**: [RepoSense link]() - -* **Project management**: - * Managed releases `v1.3` - `v1.5rc` (3 releases) on GitHub - -* **Enhancements to existing features**: - * Updated the GUI color scheme (Pull requests [\#33](), [\#34]()) - * Wrote additional tests for existing features to increase coverage from 88% to 92% (Pull requests [\#36](), [\#38]()) - -* **Documentation**: - * User Guide: - * Added documentation for the features `delete` and `find` [\#72]() - * Did cosmetic tweaks to existing documentation of features `clear`, `exit`: [\#74]() - * Developer Guide: - * Added implementation details of the `delete` feature. - -* **Community**: - * PRs reviewed (with non-trivial review comments): [\#12](), [\#32](), [\#19](), [\#42]() - * Contributed to forum discussions (examples: [1](), [2](), [3](), [4]()) - * Reported bugs and suggestions for other teams in the class (examples: [1](), [2](), [3]()) - * Some parts of the history feature I added was adopted by several other class mates ([1](), [2]()) - -* **Tools**: - * Integrated a third party library (Natty) to the project ([\#42]()) - * Integrated a new Github plugin (CircleCI) to the team repo - -* _{you can add/remove categories in the list above}_ From f8c64037aad3ce4457ae2797e6ed0499ac141214 Mon Sep 17 00:00:00 2001 From: Jie Wei Date: Wed, 2 Mar 2022 04:51:08 +0800 Subject: [PATCH 007/214] Update DeveloperGuide Add Use Cases for v1.1 --- docs/DeveloperGuide.md | 73 +++++++++++++++++++++++++++++++++++++++--- 1 file changed, 69 insertions(+), 4 deletions(-) diff --git a/docs/DeveloperGuide.md b/docs/DeveloperGuide.md index 1532a34aec4..d24a95247e0 100644 --- a/docs/DeveloperGuide.md +++ b/docs/DeveloperGuide.md @@ -324,14 +324,24 @@ Priorities: High (must have) - `* * *`, Medium (nice to have) - `* *`, Low (unli (For all use cases below, the **System** is the `AddressBook` and the **Actor** is the `user`, unless specified otherwise) +**Use case: Add a person** + +**MSS** + +1. User requests to add a person +2. User keys in person's details +3. AddressBook adds the person + + Use case ends. + **Use case: Delete a person** **MSS** -1. User requests to list persons -2. AddressBook shows a list of persons -3. User requests to delete a specific person in the list -4. AddressBook deletes the person +1. User requests to list persons +2. AddressBook shows a list of persons +3. User requests to delete a specific person in the list +4. AddressBook deletes the person Use case ends. @@ -347,6 +357,61 @@ Priorities: High (must have) - `* * *`, Medium (nice to have) - `* *`, Low (unli Use case resumes at step 2. +**Use case: Edit a person** + +**MSS** + +1. User requests to list persons +2. AddressBook shows a list of persons +3. User requests to edit a specific person in the list +4. User keys in edited person's details +5. AddressBook edits the person + + Use case ends. + +**Extensions** + +* 2a. The list is empty. + + Use case ends. + +* 3a. The given index is invalid. + + * 3a1. AddressBook shows an error message. + + Use case resumes at step 2. + +**Use case: Find a person** + +**MSS** + +1. User requests to list specific persons +2. User keys in keywords to search for +3. AddressBook shows a list of persons matching the keyword + + Use case ends. + +**Extensions** + +* 2a. The given keywords are invalid. + + * 2a1. AddressBook shows an error message. + + Use case resumes at step 2. + +* 3a. The list is empty. + + Use case ends. + +**Use case: Clear address book** + +**MSS** + +1. User requests to clear all persons +2. AddressBook shows an empty list + + Use case ends. + *{More to be added}* ### Non-Functional Requirements From e6be3db0823d4ba744e7dc958e08ece055daa5ba Mon Sep 17 00:00:00 2001 From: MontyPython28 Date: Wed, 2 Mar 2022 15:50:25 +0800 Subject: [PATCH 008/214] Add PPP for MontyPython28 --- docs/AboutUs.md | 2 +- docs/team/johndoe.md | 46 -------------------------------------------- 2 files changed, 1 insertion(+), 47 deletions(-) delete mode 100644 docs/team/johndoe.md diff --git a/docs/AboutUs.md b/docs/AboutUs.md index 1c9514e966a..f3a2f25acb5 100644 --- a/docs/AboutUs.md +++ b/docs/AboutUs.md @@ -26,7 +26,7 @@ You can reach us at the email `seer[at]comp.nus.edu.sg` [[github](http://github.com/johndoe)] [[portfolio](team/johndoe.md)] -* Role: Team Lead +* Role: Developer * Responsibilities: UI ### Johnny Doe diff --git a/docs/team/johndoe.md b/docs/team/johndoe.md deleted file mode 100644 index 773a07794e2..00000000000 --- a/docs/team/johndoe.md +++ /dev/null @@ -1,46 +0,0 @@ ---- -layout: page -title: John Doe's Project Portfolio Page ---- - -### Project: AddressBook Level 3 - -AddressBook - Level 3 is a desktop address book application used for teaching Software Engineering principles. The user interacts with it using a CLI, and it has a GUI created with JavaFX. It is written in Java, and has about 10 kLoC. - -Given below are my contributions to the project. - -* **New Feature**: Added the ability to undo/redo previous commands. - * What it does: allows the user to undo all previous commands one at a time. Preceding undo commands can be reversed by using the redo command. - * Justification: This feature improves the product significantly because a user can make mistakes in commands and the app should provide a convenient way to rectify them. - * Highlights: This enhancement affects existing commands and commands to be added in future. It required an in-depth analysis of design alternatives. The implementation too was challenging as it required changes to existing commands. - * Credits: *{mention here if you reused any code/ideas from elsewhere or if a third-party library is heavily used in the feature so that a reader can make a more accurate judgement of how much effort went into the feature}* - -* **New Feature**: Added a history command that allows the user to navigate to previous commands using up/down keys. - -* **Code contributed**: [RepoSense link]() - -* **Project management**: - * Managed releases `v1.3` - `v1.5rc` (3 releases) on GitHub - -* **Enhancements to existing features**: - * Updated the GUI color scheme (Pull requests [\#33](), [\#34]()) - * Wrote additional tests for existing features to increase coverage from 88% to 92% (Pull requests [\#36](), [\#38]()) - -* **Documentation**: - * User Guide: - * Added documentation for the features `delete` and `find` [\#72]() - * Did cosmetic tweaks to existing documentation of features `clear`, `exit`: [\#74]() - * Developer Guide: - * Added implementation details of the `delete` feature. - -* **Community**: - * PRs reviewed (with non-trivial review comments): [\#12](), [\#32](), [\#19](), [\#42]() - * Contributed to forum discussions (examples: [1](), [2](), [3](), [4]()) - * Reported bugs and suggestions for other teams in the class (examples: [1](), [2](), [3]()) - * Some parts of the history feature I added was adopted by several other class mates ([1](), [2]()) - -* **Tools**: - * Integrated a third party library (Natty) to the project ([\#42]()) - * Integrated a new Github plugin (CircleCI) to the team repo - -* _{you can add/remove categories in the list above}_ From 932c18e842786e1360d5ddb4c6dec632bb339645 Mon Sep 17 00:00:00 2001 From: MontyPython28 Date: Wed, 2 Mar 2022 16:46:00 +0800 Subject: [PATCH 009/214] Update AboutUs.md --- docs/AboutUs.md | 51 +++++++++++++++++----------------- docs/images/jetrz.png | Bin 0 -> 27012 bytes docs/images/jiewei98.jpg | Bin 0 -> 13258 bytes docs/images/leeyiheng12.png | Bin 0 -> 23601 bytes docs/images/michaelseyo.png | Bin 0 -> 27962 bytes docs/images/montypython28.png | Bin 0 -> 35248 bytes docs/team/montypython28.md | 33 ++++++++++++++++++++++ 7 files changed, 59 insertions(+), 25 deletions(-) create mode 100644 docs/images/jetrz.png create mode 100644 docs/images/jiewei98.jpg create mode 100644 docs/images/leeyiheng12.png create mode 100644 docs/images/michaelseyo.png create mode 100644 docs/images/montypython28.png create mode 100644 docs/team/montypython28.md diff --git a/docs/AboutUs.md b/docs/AboutUs.md index f3a2f25acb5..74dc62f21e3 100644 --- a/docs/AboutUs.md +++ b/docs/AboutUs.md @@ -9,51 +9,52 @@ You can reach us at the email `seer[at]comp.nus.edu.sg` ## Project team -### John Doe +### Tan Jie Wei - + -[[homepage](http://www.comp.nus.edu.sg/~damithch)] -[[github](https://github.com/johndoe)] -[[portfolio](team/johndoe.md)] +[[github](http://github.com/jiewei98)] +[[portfolio](team/jiewei98.md)] -* Role: Project Advisor +* Role: Developer +* Responsibilities: UI and Documentation -### Jane Doe +### Joshua Emmanuel Teo Rui Zhong - + -[[github](http://github.com/johndoe)] -[[portfolio](team/johndoe.md)] +[[github](http://github.com/jetrz)] +[[portfolio](team/jetrz.md)] * Role: Developer -* Responsibilities: UI +* Responsibilities: UI and Documentation -### Johnny Doe +### Lee Yi Heng - + -[[github](http://github.com/johndoe)] [[portfolio](team/johndoe.md)] +[[github](http://github.com/leeyiheng12)] +[[portfolio](team/leeyiheng12.md)] * Role: Developer -* Responsibilities: Data +* Responsibilities: UI and Documentation -### Jean Doe +### Low Chuan Wei, Michael - + -[[github](http://github.com/johndoe)] -[[portfolio](team/johndoe.md)] +[[github](http://github.com/michaelseyo)] +[[portfolio](team/michaelseyo.md)] * Role: Developer -* Responsibilities: Dev Ops + Threading +* Responsibilities: UI and Documentation -### James Doe +### Samyukta Sounderraman - + -[[github](http://github.com/johndoe)] -[[portfolio](team/johndoe.md)] +[[github](http://github.com/MontyPython28)] +[[portfolio](team/montypython28.md)] * Role: Developer -* Responsibilities: UI +* Responsibilities: UI and Documentation diff --git a/docs/images/jetrz.png b/docs/images/jetrz.png new file mode 100644 index 0000000000000000000000000000000000000000..c2956c7f32f2a67dbb76cf9ca6e5fe58b5e0686d GIT binary patch literal 27012 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 literal 0 HcmV?d00001 diff --git a/docs/images/jiewei98.jpg b/docs/images/jiewei98.jpg new file mode 100644 index 0000000000000000000000000000000000000000..021be54f53754c89f94c0ccdc408583fbeb6ce22 GIT binary patch literal 13258 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 IM6N<$f=V^(3jhEB literal 0 HcmV?d00001 diff --git a/docs/images/michaelseyo.png b/docs/images/michaelseyo.png new file mode 100644 index 0000000000000000000000000000000000000000..1df3a4c5c79c687d51d71904641032ee4f732f0d GIT binary patch literal 27962 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 Y+s1wvFfaU6nkP^B_!Ln^W?j$!*`u9Q&Hw-a literal 0 HcmV?d00001 diff --git a/docs/team/montypython28.md b/docs/team/montypython28.md new file mode 100644 index 00000000000..959d15cb3fc --- /dev/null +++ b/docs/team/montypython28.md @@ -0,0 +1,33 @@ +--- +layout: page +title: Samyukta Sounderraman's Project Portfolio Page +--- + +### Project: AddressBook Level 3 + +ClientConnect is a desktop client address book application for insurance agents to manage and keep track of their clietntele seamlesssly and efficiently. Custom tailored to suit the needs of insurance agents, ClientConnect surpasses other similar applications by offering features such as grouping of clients by packages, keyboard shortcuts, a gorgeous GUI, and more. + +Given below are my contributions to the project. + +* **New Feature**: + * To be added soon + +* **Code contributed**: [RepoSense link]() + +* **Project management**: + * Set up team organisation and repository + +* **Enhancements to existing features**: + * To be added soon + +* **Documentation**: + * User Guide: + * To be added soon + * Developer Guide: + * Updated information about current team members and their responsibilities. + +* **Community**: + * To be added soon + +* **Tools**: + * To be added soon From 55ec100f821790b07bbfd0e3613d20fe06c51069 Mon Sep 17 00:00:00 2001 From: MontyPython28 Date: Thu, 3 Mar 2022 15:00:38 +0800 Subject: [PATCH 010/214] Add InsurancePackage field and edit add + edit commands accordingly --- .../address/logic/commands/AddCommand.java | 3 ++ .../address/logic/commands/EditCommand.java | 21 ++++++++++-- .../logic/parser/AddCommandParser.java | 9 +++-- .../seedu/address/logic/parser/CliSyntax.java | 1 + .../logic/parser/EditCommandParser.java | 7 +++- .../address/logic/parser/ParserUtil.java | 11 +++++++ .../model/person/InsurancePackage.java | 33 +++++++++++++++++++ .../seedu/address/model/person/Person.java | 12 ++++++- .../address/model/util/SampleDataUtil.java | 13 ++++---- .../address/storage/JsonAdaptedPerson.java | 15 +++++++-- .../java/seedu/address/ui/PersonCard.java | 3 ++ src/main/resources/view/PersonListCard.fxml | 1 + 12 files changed, 113 insertions(+), 16 deletions(-) create mode 100644 src/main/java/seedu/address/model/person/InsurancePackage.java diff --git a/src/main/java/seedu/address/logic/commands/AddCommand.java b/src/main/java/seedu/address/logic/commands/AddCommand.java index 71656d7c5c8..4e5b06a876d 100644 --- a/src/main/java/seedu/address/logic/commands/AddCommand.java +++ b/src/main/java/seedu/address/logic/commands/AddCommand.java @@ -3,6 +3,7 @@ import static java.util.Objects.requireNonNull; import static seedu.address.logic.parser.CliSyntax.PREFIX_ADDRESS; import static seedu.address.logic.parser.CliSyntax.PREFIX_EMAIL; +import static seedu.address.logic.parser.CliSyntax.PREFIX_INSURANCE_PACKAGE; import static seedu.address.logic.parser.CliSyntax.PREFIX_NAME; import static seedu.address.logic.parser.CliSyntax.PREFIX_PHONE; import static seedu.address.logic.parser.CliSyntax.PREFIX_TAG; @@ -23,12 +24,14 @@ public class AddCommand extends Command { + PREFIX_NAME + "NAME " + PREFIX_PHONE + "PHONE " + PREFIX_EMAIL + "EMAIL " + + PREFIX_INSURANCE_PACKAGE + "INSURANCE PACKAGE " + PREFIX_ADDRESS + "ADDRESS " + "[" + PREFIX_TAG + "TAG]...\n" + "Example: " + COMMAND_WORD + " " + PREFIX_NAME + "John Doe " + PREFIX_PHONE + "98765432 " + PREFIX_EMAIL + "johnd@example.com " + + PREFIX_INSURANCE_PACKAGE + "Golden Package " + PREFIX_ADDRESS + "311, Clementi Ave 2, #02-25 " + PREFIX_TAG + "friends " + PREFIX_TAG + "owesMoney"; diff --git a/src/main/java/seedu/address/logic/commands/EditCommand.java b/src/main/java/seedu/address/logic/commands/EditCommand.java index 7e36114902f..75aea4ccdff 100644 --- a/src/main/java/seedu/address/logic/commands/EditCommand.java +++ b/src/main/java/seedu/address/logic/commands/EditCommand.java @@ -3,6 +3,7 @@ import static java.util.Objects.requireNonNull; import static seedu.address.logic.parser.CliSyntax.PREFIX_ADDRESS; import static seedu.address.logic.parser.CliSyntax.PREFIX_EMAIL; +import static seedu.address.logic.parser.CliSyntax.PREFIX_INSURANCE_PACKAGE; import static seedu.address.logic.parser.CliSyntax.PREFIX_NAME; import static seedu.address.logic.parser.CliSyntax.PREFIX_PHONE; import static seedu.address.logic.parser.CliSyntax.PREFIX_TAG; @@ -21,6 +22,7 @@ import seedu.address.model.Model; import seedu.address.model.person.Address; import seedu.address.model.person.Email; +import seedu.address.model.person.InsurancePackage; import seedu.address.model.person.Name; import seedu.address.model.person.Person; import seedu.address.model.person.Phone; @@ -40,6 +42,7 @@ public class EditCommand extends Command { + "[" + PREFIX_NAME + "NAME] " + "[" + PREFIX_PHONE + "PHONE] " + "[" + PREFIX_EMAIL + "EMAIL] " + + "[" + PREFIX_INSURANCE_PACKAGE + "INSURANCE PACKAGE] " + "[" + PREFIX_ADDRESS + "ADDRESS] " + "[" + PREFIX_TAG + "TAG]...\n" + "Example: " + COMMAND_WORD + " 1 " @@ -96,10 +99,13 @@ private static Person createEditedPerson(Person personToEdit, EditPersonDescript Name updatedName = editPersonDescriptor.getName().orElse(personToEdit.getName()); Phone updatedPhone = editPersonDescriptor.getPhone().orElse(personToEdit.getPhone()); Email updatedEmail = editPersonDescriptor.getEmail().orElse(personToEdit.getEmail()); + InsurancePackage updatedInsurancePackage = editPersonDescriptor.getInsurancePackage() + .orElse(personToEdit.getInsurancePackage()); Address updatedAddress = editPersonDescriptor.getAddress().orElse(personToEdit.getAddress()); Set updatedTags = editPersonDescriptor.getTags().orElse(personToEdit.getTags()); - return new Person(updatedName, updatedPhone, updatedEmail, updatedAddress, updatedTags); + return new Person(updatedName, updatedPhone, updatedEmail, updatedInsurancePackage, + updatedAddress, updatedTags); } @Override @@ -128,6 +134,7 @@ public static class EditPersonDescriptor { private Name name; private Phone phone; private Email email; + private InsurancePackage insurancePackage; private Address address; private Set tags; @@ -141,6 +148,7 @@ public EditPersonDescriptor(EditPersonDescriptor toCopy) { setName(toCopy.name); setPhone(toCopy.phone); setEmail(toCopy.email); + setInsurancePackage(toCopy.insurancePackage); setAddress(toCopy.address); setTags(toCopy.tags); } @@ -149,7 +157,7 @@ public EditPersonDescriptor(EditPersonDescriptor toCopy) { * Returns true if at least one field is edited. */ public boolean isAnyFieldEdited() { - return CollectionUtil.isAnyNonNull(name, phone, email, address, tags); + return CollectionUtil.isAnyNonNull(name, phone, email, insurancePackage, address, tags); } public void setName(Name name) { @@ -176,6 +184,14 @@ public Optional getEmail() { return Optional.ofNullable(email); } + public void setInsurancePackage(InsurancePackage insurancePackage) { + this.insurancePackage = insurancePackage; + } + + public Optional getInsurancePackage() { + return Optional.ofNullable(insurancePackage); + } + public void setAddress(Address address) { this.address = address; } @@ -219,6 +235,7 @@ public boolean equals(Object other) { return getName().equals(e.getName()) && getPhone().equals(e.getPhone()) && getEmail().equals(e.getEmail()) + && getInsurancePackage().equals(e.getInsurancePackage()) && getAddress().equals(e.getAddress()) && getTags().equals(e.getTags()); } diff --git a/src/main/java/seedu/address/logic/parser/AddCommandParser.java b/src/main/java/seedu/address/logic/parser/AddCommandParser.java index 3b8bfa035e8..32ed7acadb5 100644 --- a/src/main/java/seedu/address/logic/parser/AddCommandParser.java +++ b/src/main/java/seedu/address/logic/parser/AddCommandParser.java @@ -3,6 +3,7 @@ import static seedu.address.commons.core.Messages.MESSAGE_INVALID_COMMAND_FORMAT; import static seedu.address.logic.parser.CliSyntax.PREFIX_ADDRESS; import static seedu.address.logic.parser.CliSyntax.PREFIX_EMAIL; +import static seedu.address.logic.parser.CliSyntax.PREFIX_INSURANCE_PACKAGE; import static seedu.address.logic.parser.CliSyntax.PREFIX_NAME; import static seedu.address.logic.parser.CliSyntax.PREFIX_PHONE; import static seedu.address.logic.parser.CliSyntax.PREFIX_TAG; @@ -14,6 +15,7 @@ import seedu.address.logic.parser.exceptions.ParseException; import seedu.address.model.person.Address; import seedu.address.model.person.Email; +import seedu.address.model.person.InsurancePackage; import seedu.address.model.person.Name; import seedu.address.model.person.Person; import seedu.address.model.person.Phone; @@ -31,9 +33,9 @@ public class AddCommandParser implements Parser { */ public AddCommand parse(String args) throws ParseException { ArgumentMultimap argMultimap = - ArgumentTokenizer.tokenize(args, PREFIX_NAME, PREFIX_PHONE, PREFIX_EMAIL, PREFIX_ADDRESS, PREFIX_TAG); + ArgumentTokenizer.tokenize(args, PREFIX_NAME, PREFIX_PHONE, PREFIX_EMAIL, PREFIX_INSURANCE_PACKAGE, PREFIX_ADDRESS, PREFIX_TAG); - if (!arePrefixesPresent(argMultimap, PREFIX_NAME, PREFIX_ADDRESS, PREFIX_PHONE, PREFIX_EMAIL) + if (!arePrefixesPresent(argMultimap, PREFIX_NAME, PREFIX_ADDRESS, PREFIX_PHONE, PREFIX_EMAIL, PREFIX_INSURANCE_PACKAGE) || !argMultimap.getPreamble().isEmpty()) { throw new ParseException(String.format(MESSAGE_INVALID_COMMAND_FORMAT, AddCommand.MESSAGE_USAGE)); } @@ -42,9 +44,10 @@ public AddCommand parse(String args) throws ParseException { Phone phone = ParserUtil.parsePhone(argMultimap.getValue(PREFIX_PHONE).get()); Email email = ParserUtil.parseEmail(argMultimap.getValue(PREFIX_EMAIL).get()); Address address = ParserUtil.parseAddress(argMultimap.getValue(PREFIX_ADDRESS).get()); + InsurancePackage insurancePackage = ParserUtil.parseInsurancePackage(argMultimap.getValue(PREFIX_INSURANCE_PACKAGE).get()); Set tagList = ParserUtil.parseTags(argMultimap.getAllValues(PREFIX_TAG)); - Person person = new Person(name, phone, email, address, tagList); + Person person = new Person(name, phone, email, insurancePackage, address, tagList); return new AddCommand(person); } diff --git a/src/main/java/seedu/address/logic/parser/CliSyntax.java b/src/main/java/seedu/address/logic/parser/CliSyntax.java index 75b1a9bf119..390d367dd0b 100644 --- a/src/main/java/seedu/address/logic/parser/CliSyntax.java +++ b/src/main/java/seedu/address/logic/parser/CliSyntax.java @@ -10,6 +10,7 @@ public class CliSyntax { public static final Prefix PREFIX_PHONE = new Prefix("p/"); public static final Prefix PREFIX_EMAIL = new Prefix("e/"); public static final Prefix PREFIX_ADDRESS = new Prefix("a/"); + public static final Prefix PREFIX_INSURANCE_PACKAGE = new Prefix("i/"); public static final Prefix PREFIX_TAG = new Prefix("t/"); } diff --git a/src/main/java/seedu/address/logic/parser/EditCommandParser.java b/src/main/java/seedu/address/logic/parser/EditCommandParser.java index 845644b7dea..226bd51d7cd 100644 --- a/src/main/java/seedu/address/logic/parser/EditCommandParser.java +++ b/src/main/java/seedu/address/logic/parser/EditCommandParser.java @@ -4,6 +4,7 @@ import static seedu.address.commons.core.Messages.MESSAGE_INVALID_COMMAND_FORMAT; import static seedu.address.logic.parser.CliSyntax.PREFIX_ADDRESS; import static seedu.address.logic.parser.CliSyntax.PREFIX_EMAIL; +import static seedu.address.logic.parser.CliSyntax.PREFIX_INSURANCE_PACKAGE; import static seedu.address.logic.parser.CliSyntax.PREFIX_NAME; import static seedu.address.logic.parser.CliSyntax.PREFIX_PHONE; import static seedu.address.logic.parser.CliSyntax.PREFIX_TAG; @@ -32,7 +33,7 @@ public class EditCommandParser implements Parser { public EditCommand parse(String args) throws ParseException { requireNonNull(args); ArgumentMultimap argMultimap = - ArgumentTokenizer.tokenize(args, PREFIX_NAME, PREFIX_PHONE, PREFIX_EMAIL, PREFIX_ADDRESS, PREFIX_TAG); + ArgumentTokenizer.tokenize(args, PREFIX_NAME, PREFIX_PHONE, PREFIX_EMAIL, PREFIX_INSURANCE_PACKAGE, PREFIX_ADDRESS, PREFIX_TAG); Index index; @@ -52,6 +53,10 @@ public EditCommand parse(String args) throws ParseException { if (argMultimap.getValue(PREFIX_EMAIL).isPresent()) { editPersonDescriptor.setEmail(ParserUtil.parseEmail(argMultimap.getValue(PREFIX_EMAIL).get())); } + if (argMultimap.getValue(PREFIX_INSURANCE_PACKAGE).isPresent()) { + editPersonDescriptor.setInsurancePackage(ParserUtil + .parseInsurancePackage(argMultimap.getValue(PREFIX_INSURANCE_PACKAGE).get())); + } if (argMultimap.getValue(PREFIX_ADDRESS).isPresent()) { editPersonDescriptor.setAddress(ParserUtil.parseAddress(argMultimap.getValue(PREFIX_ADDRESS).get())); } diff --git a/src/main/java/seedu/address/logic/parser/ParserUtil.java b/src/main/java/seedu/address/logic/parser/ParserUtil.java index b117acb9c55..3450dbae63c 100644 --- a/src/main/java/seedu/address/logic/parser/ParserUtil.java +++ b/src/main/java/seedu/address/logic/parser/ParserUtil.java @@ -11,6 +11,7 @@ import seedu.address.logic.parser.exceptions.ParseException; import seedu.address.model.person.Address; import seedu.address.model.person.Email; +import seedu.address.model.person.InsurancePackage; import seedu.address.model.person.Name; import seedu.address.model.person.Phone; import seedu.address.model.tag.Tag; @@ -65,6 +66,16 @@ public static Phone parsePhone(String phone) throws ParseException { return new Phone(trimmedPhone); } + /** + * Parses a {@code String insurance package} into an {@code InsurancePackage}. + * Leading and trailing whitespaces will be trimmed. + */ + public static InsurancePackage parseInsurancePackage(String insurancePackage) { + requireNonNull(insurancePackage); + String trimmedInsurancePackage = insurancePackage.trim(); + return new InsurancePackage(trimmedInsurancePackage ); + } + /** * Parses a {@code String address} into an {@code Address}. * Leading and trailing whitespaces will be trimmed. diff --git a/src/main/java/seedu/address/model/person/InsurancePackage.java b/src/main/java/seedu/address/model/person/InsurancePackage.java new file mode 100644 index 00000000000..0aad42bf3d9 --- /dev/null +++ b/src/main/java/seedu/address/model/person/InsurancePackage.java @@ -0,0 +1,33 @@ +package seedu.address.model.person; + +import static java.util.Objects.requireNonNull; + +/** + * Represents a Person's insurance package in the address book. + * Guarantees: mutable; is always valid + */ +public class InsurancePackage { + public final String packageName; + + public InsurancePackage(String packageName) { + requireNonNull(packageName); + this.packageName = packageName; + } + + @Override + public String toString() { + return packageName; + } + + @Override + public boolean equals(Object other) { + return other == this // short circuit if same object + || (other instanceof InsurancePackage // instanceof handles nulls + && packageName.equals(((InsurancePackage) other).packageName)); // state check + } + + @Override + public int hashCode() { + return packageName.hashCode(); + } +} diff --git a/src/main/java/seedu/address/model/person/Person.java b/src/main/java/seedu/address/model/person/Person.java index 8ff1d83fe89..f631a0e0358 100644 --- a/src/main/java/seedu/address/model/person/Person.java +++ b/src/main/java/seedu/address/model/person/Person.java @@ -21,17 +21,20 @@ public class Person { private final Email email; // Data fields + private final InsurancePackage insurancePackage; private final Address address; private final Set tags = new HashSet<>(); /** * Every field must be present and not null. */ - public Person(Name name, Phone phone, Email email, Address address, Set tags) { + public Person(Name name, Phone phone, Email email, + InsurancePackage insurancePackage, Address address, Set tags) { requireAllNonNull(name, phone, email, address, tags); this.name = name; this.phone = phone; this.email = email; + this.insurancePackage = insurancePackage; this.address = address; this.tags.addAll(tags); } @@ -48,6 +51,10 @@ public Email getEmail() { return email; } + public InsurancePackage getInsurancePackage() { + return insurancePackage; + } + public Address getAddress() { return address; } @@ -91,6 +98,7 @@ public boolean equals(Object other) { return otherPerson.getName().equals(getName()) && otherPerson.getPhone().equals(getPhone()) && otherPerson.getEmail().equals(getEmail()) + && otherPerson.getInsurancePackage().equals(getInsurancePackage()) && otherPerson.getAddress().equals(getAddress()) && otherPerson.getTags().equals(getTags()); } @@ -109,6 +117,8 @@ public String toString() { .append(getPhone()) .append("; Email: ") .append(getEmail()) + .append("; Insurance Package: ") + .append(getInsurancePackage()) .append("; Address: ") .append(getAddress()); diff --git a/src/main/java/seedu/address/model/util/SampleDataUtil.java b/src/main/java/seedu/address/model/util/SampleDataUtil.java index 1806da4facf..f3ee8598ef4 100644 --- a/src/main/java/seedu/address/model/util/SampleDataUtil.java +++ b/src/main/java/seedu/address/model/util/SampleDataUtil.java @@ -8,6 +8,7 @@ import seedu.address.model.ReadOnlyAddressBook; import seedu.address.model.person.Address; import seedu.address.model.person.Email; +import seedu.address.model.person.InsurancePackage; import seedu.address.model.person.Name; import seedu.address.model.person.Person; import seedu.address.model.person.Phone; @@ -20,22 +21,22 @@ public class SampleDataUtil { public static Person[] getSamplePersons() { return new Person[] { new Person(new Name("Alex Yeoh"), new Phone("87438807"), new Email("alexyeoh@example.com"), - new Address("Blk 30 Geylang Street 29, #06-40"), + new InsurancePackage("Golden Package"), new Address("Blk 30 Geylang Street 29, #06-40"), getTagSet("friends")), new Person(new Name("Bernice Yu"), new Phone("99272758"), new Email("berniceyu@example.com"), - new Address("Blk 30 Lorong 3 Serangoon Gardens, #07-18"), + new InsurancePackage("Silver Package"), new Address("Blk 30 Lorong 3 Serangoon Gardens, #07-18"), getTagSet("colleagues", "friends")), new Person(new Name("Charlotte Oliveiro"), new Phone("93210283"), new Email("charlotte@example.com"), - new Address("Blk 11 Ang Mo Kio Street 74, #11-04"), + new InsurancePackage("Undecided"), new Address("Blk 11 Ang Mo Kio Street 74, #11-04"), getTagSet("neighbours")), new Person(new Name("David Li"), new Phone("91031282"), new Email("lidavid@example.com"), - new Address("Blk 436 Serangoon Gardens Street 26, #16-43"), + new InsurancePackage("Undecided"), new Address("Blk 436 Serangoon Gardens Street 26, #16-43"), getTagSet("family")), new Person(new Name("Irfan Ibrahim"), new Phone("92492021"), new Email("irfan@example.com"), - new Address("Blk 47 Tampines Street 20, #17-35"), + new InsurancePackage("Basic Family Package"), new Address("Blk 47 Tampines Street 20, #17-35"), getTagSet("classmates")), new Person(new Name("Roy Balakrishnan"), new Phone("92624417"), new Email("royb@example.com"), - new Address("Blk 45 Aljunied Street 85, #11-31"), + new InsurancePackage("Car Theft Insurance"), new Address("Blk 45 Aljunied Street 85, #11-31"), getTagSet("colleagues")) }; } diff --git a/src/main/java/seedu/address/storage/JsonAdaptedPerson.java b/src/main/java/seedu/address/storage/JsonAdaptedPerson.java index a6321cec2ea..dd326a23963 100644 --- a/src/main/java/seedu/address/storage/JsonAdaptedPerson.java +++ b/src/main/java/seedu/address/storage/JsonAdaptedPerson.java @@ -12,6 +12,7 @@ import seedu.address.commons.exceptions.IllegalValueException; import seedu.address.model.person.Address; import seedu.address.model.person.Email; +import seedu.address.model.person.InsurancePackage; import seedu.address.model.person.Name; import seedu.address.model.person.Person; import seedu.address.model.person.Phone; @@ -27,6 +28,7 @@ class JsonAdaptedPerson { private final String name; private final String phone; private final String email; + private final String insurancePackage; private final String address; private final List tagged = new ArrayList<>(); @@ -35,11 +37,12 @@ class JsonAdaptedPerson { */ @JsonCreator public JsonAdaptedPerson(@JsonProperty("name") String name, @JsonProperty("phone") String phone, - @JsonProperty("email") String email, @JsonProperty("address") String address, - @JsonProperty("tagged") List tagged) { + @JsonProperty("email") String email, @JsonProperty("insurance package") String insurancePackage, + @JsonProperty("address") String address, @JsonProperty("tagged") List tagged) { this.name = name; this.phone = phone; this.email = email; + this.insurancePackage = insurancePackage; this.address = address; if (tagged != null) { this.tagged.addAll(tagged); @@ -53,6 +56,7 @@ public JsonAdaptedPerson(Person source) { name = source.getName().fullName; phone = source.getPhone().value; email = source.getEmail().value; + insurancePackage = source.getInsurancePackage().packageName; address = source.getAddress().value; tagged.addAll(source.getTags().stream() .map(JsonAdaptedTag::new) @@ -94,6 +98,11 @@ public Person toModelType() throws IllegalValueException { } final Email modelEmail = new Email(email); + if (insurancePackage == null) { + throw new IllegalValueException(String.format(MISSING_FIELD_MESSAGE_FORMAT, InsurancePackage.class.getSimpleName())); + } + final InsurancePackage modelInsurancePackage = new InsurancePackage(insurancePackage); + if (address == null) { throw new IllegalValueException(String.format(MISSING_FIELD_MESSAGE_FORMAT, Address.class.getSimpleName())); } @@ -103,7 +112,7 @@ public Person toModelType() throws IllegalValueException { final Address modelAddress = new Address(address); final Set modelTags = new HashSet<>(personTags); - return new Person(modelName, modelPhone, modelEmail, modelAddress, modelTags); + return new Person(modelName, modelPhone, modelEmail, modelInsurancePackage, modelAddress, modelTags); } } diff --git a/src/main/java/seedu/address/ui/PersonCard.java b/src/main/java/seedu/address/ui/PersonCard.java index 7fc927bc5d9..d16a181ddf0 100644 --- a/src/main/java/seedu/address/ui/PersonCard.java +++ b/src/main/java/seedu/address/ui/PersonCard.java @@ -37,6 +37,8 @@ public class PersonCard extends UiPart { @FXML private Label address; @FXML + private Label insurancePackage; + @FXML private Label email; @FXML private FlowPane tags; @@ -50,6 +52,7 @@ public PersonCard(Person person, int displayedIndex) { id.setText(displayedIndex + ". "); name.setText(person.getName().fullName); phone.setText(person.getPhone().value); + insurancePackage.setText(person.getInsurancePackage().packageName); address.setText(person.getAddress().value); email.setText(person.getEmail().value); person.getTags().stream() diff --git a/src/main/resources/view/PersonListCard.fxml b/src/main/resources/view/PersonListCard.fxml index f08ea32ad55..a70f7f1709c 100644 --- a/src/main/resources/view/PersonListCard.fxml +++ b/src/main/resources/view/PersonListCard.fxml @@ -29,6 +29,7 @@