From 3d502ca2987bf1f6a3536402f9e9b67b2f86e123 Mon Sep 17 00:00:00 2001 From: C5hives Date: Wed, 6 Nov 2024 20:18:58 +0800 Subject: [PATCH 01/69] Update user guide for list command --- docs/UserGuide.md | 16 +++++++++++++--- 1 file changed, 13 insertions(+), 3 deletions(-) diff --git a/docs/UserGuide.md b/docs/UserGuide.md index bceb5e3c26e..392d76eaa37 100644 --- a/docs/UserGuide.md +++ b/docs/UserGuide.md @@ -90,11 +90,21 @@ 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` -### Listing all persons : `list` +### Listing Items : `list` -Shows a list of all persons in the address book. +Displays the list of vendors and/or events in EventTory. -Format: `list` +#### Format: `list [v/] [e/]` + +* The list(s) displayed depends on whether the `v/` and/or `e/` prefix is specified. +* If no prefixes are specified, both the vendor and event lists will be displayed. +* The prefixes can be specified in any order. +* If values are specified after the prefixes (e.g. `v/2`, `e/Party`), the value is ignored. + +#### Examples +* `list v/` will display the list of vendors. +* `list e/` will display the list of events. +* `list v/ e/` and `list` will display both lists. ### Editing a person : `edit` From f675736ff6f3195f9bf00a170c9f8e46280ae554 Mon Sep 17 00:00:00 2001 From: C5hives Date: Wed, 6 Nov 2024 20:20:45 +0800 Subject: [PATCH 02/69] Fix tense error in user guide --- docs/UserGuide.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docs/UserGuide.md b/docs/UserGuide.md index 392d76eaa37..3aa5179af6b 100644 --- a/docs/UserGuide.md +++ b/docs/UserGuide.md @@ -96,7 +96,7 @@ Displays the list of vendors and/or events in EventTory. #### Format: `list [v/] [e/]` -* The list(s) displayed depends on whether the `v/` and/or `e/` prefix is specified. +* The list(s) displayed depends on whether the `v/` and/or `e/` prefix(es) is specified. * If no prefixes are specified, both the vendor and event lists will be displayed. * The prefixes can be specified in any order. * If values are specified after the prefixes (e.g. `v/2`, `e/Party`), the value is ignored. From f5577a2232c187fc9e9a336c78b02281e1c1b50c Mon Sep 17 00:00:00 2001 From: C5hives Date: Wed, 6 Nov 2024 20:43:56 +0800 Subject: [PATCH 03/69] Update user guide for delete command --- docs/UserGuide.md | 21 ++++++++++++--------- 1 file changed, 12 insertions(+), 9 deletions(-) diff --git a/docs/UserGuide.md b/docs/UserGuide.md index bceb5e3c26e..3b0f6d19552 100644 --- a/docs/UserGuide.md +++ b/docs/UserGuide.md @@ -131,19 +131,22 @@ Examples: * `find alex david` returns `Alex Yeoh`, `David Li`
![result for 'find alex david'](images/findAlexDavidResult.png) -### Deleting a person : `delete` +### Deleting Items : `delete` -Deletes the specified person from the address book. +Deletes a vendor or an event from EventTory. -Format: `delete INDEX` +#### Format: `delete [v/INDEX]` or `delete [e/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 event or vendor at the specified `INDEX`. + * The index refers to the index number shown in the displayed event/vendor list respectively. + * The index **must be a positive integer** 1, 2, 3, ... + * The index for each vendor/event is relative and can change depending on previous operations. +* If the specified vendor/event is currently assigned to another event/vendor respectively, the operation will fail. +* If the current viewed vendor/event is deleted, the application will return you to the main list screen. -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. +#### Examples: +* `list` followed by `delete v/2` deletes the 2nd vendor in EventTory. +* `find e/Wedding` followed by `delete e/1` deletes the 1st event shown in the results of the `find` command. ### Clearing all entries : `clear` From f24fa4241723732ab0edca6fc1bf22857079fb0f Mon Sep 17 00:00:00 2001 From: C5hives Date: Wed, 6 Nov 2024 22:07:46 +0800 Subject: [PATCH 04/69] Update introduction and quick start --- docs/UserGuide.md | 33 ++++++++++++++++++++------------- 1 file changed, 20 insertions(+), 13 deletions(-) diff --git a/docs/UserGuide.md b/docs/UserGuide.md index bceb5e3c26e..19e8c4d9e79 100644 --- a/docs/UserGuide.md +++ b/docs/UserGuide.md @@ -4,9 +4,12 @@ pageNav: 3 --- -# AB-3 User Guide +# EventTory - User Guide -AddressBook Level 3 (AB3) is a **desktop app for managing contacts, optimized for use via a 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. +EventTory is a **desktop app for managing vendors and events**. + +It is **optimized for use** via a Command-Line Interface (CLI) while still retaining the benefits of a Graphical User Interface (GUI).
+If you can type fast, EventTory can get your **event management tasks** done faster than traditional GUI apps. @@ -17,26 +20,30 @@ AddressBook Level 3 (AB3) is a **desktop app for managing contacts, optimized fo 1. Ensure you have Java `17` or above installed in your Computer. -1. Download the latest `.jar` file from [here](https://github.com/se-edu/addressbook-level3/releases). +2. Download the latest `.jar` file 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. +3. Copy the file to the folder you want to use as the _home folder_ for the EventTory application. -1. Open a command terminal, `cd` into the folder you put the jar file in, and use the `java -jar addressbook.jar` command to run the application.
- A GUI similar to the below should appear in a few seconds. Note how the app contains some sample data.
+4. Open a command terminal, `cd` into the folder you put the jar file in, and use the `java -jar EventTory.jar` command to run the application.
+ A GUI similar to the below should appear in a few seconds. Note that the application contains some sample data on initial boot.
![Ui](images/Ui.png) -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: +5. Type a command in the command box and press Enter to execute it. e.g. typing **`help`** and pressing Enter will open a help window.
+ Example commands to try: + + * `list` : Lists all events and vendors. - * `list` : Lists all contacts. + * `create v/ n/Hong Lim Trading Pte. Ltd. p/67412943 d/Specialises in lighting effects. t/stage-crew` : Creates a vendor named `Hong Lim Trading Pte. Ltd.` and saves it to EventTory. - * `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. + * `assign v/1 e/2` : Assigns the 1st vendor in the vendor list to the 2nd event in the event list. + + * `view e/4` : View more information about the 4th event in the event list. - * `delete 3` : Deletes the 3rd contact shown in the current list. + * `delete v/1` : Deletes the 1st vendor shown in the vendor list. - * `clear` : Deletes all contacts. + * `clear` : Deletes all vendors and events stored in EventTory. - * `exit` : Exits the app. + * `exit` : Exits the application. 1. Refer to the [Features](#features) below for details of each command. From cebbceecc4b4cacf201a5c0b89aa34f962819611 Mon Sep 17 00:00:00 2001 From: C5hives Date: Wed, 6 Nov 2024 22:23:27 +0800 Subject: [PATCH 05/69] Update feature section --- docs/UserGuide.md | 41 +++++++++++++++++++++++++++++++---------- 1 file changed, 31 insertions(+), 10 deletions(-) diff --git a/docs/UserGuide.md b/docs/UserGuide.md index 19e8c4d9e79..459f25eec49 100644 --- a/docs/UserGuide.md +++ b/docs/UserGuide.md @@ -33,7 +33,7 @@ If you can type fast, EventTory can get your **event management tasks** done fas * `list` : Lists all events and vendors. - * `create v/ n/Hong Lim Trading Pte. Ltd. p/67412943 d/Specialises in lighting effects. t/stage-crew` : Creates a vendor named `Hong Lim Trading Pte. Ltd.` and saves it to EventTory. + * `create v/ n/Hong Lim Trading Pte. Ltd. p/67412943 d/Specialises in lighting effects. t/stage-crew` : Creates a vendor named `Hong Lim Trading Pte. Ltd.` and saves in the application. * `assign v/1 e/2` : Assigns the 1st vendor in the vendor list to the 2nd event in the event list. @@ -45,7 +45,7 @@ If you can type fast, EventTory can get your **event management tasks** done fas * `exit` : Exits the application. -1. Refer to the [Features](#features) below for details of each command. +6. Refer to the [Features](#features) below for details of each command. -------------------------------------------------------------------------------------------------------------------- @@ -53,22 +53,43 @@ If you can type fast, EventTory can get your **event management tasks** done fas -**Notes about the command format:**
+**Notes about the command formats:**
* 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`. + e.g. `create v/ n/VENDOR_NAME`, `VENDOR_NAME` is a parameter which is specified by the user: + * `create v/ n/Kimberly's Flowers`. -* 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 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. +* Items in square brackets are **optional**.
+ e.g. `e/ n/EVENT_NAME [t/TAG]` can be used as: + * `e/ n/Stagecraft Solutions t/backstage-crew` or as; + * `n/Stagecraft Solutions`. + +

+ +* 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/big-event`; + * `t/big-event t/coastal`, 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. -* 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`. +

+ +* Extraneous parameters for commands that do not take in parameters (such as `help`, `exit` and `clear`) will be ignored.
+ * e.g. if the command specifies `help 123`, it will be interpreted as `help`. + +

+ +* If additional parameters are supplied for commands that do not use said parameters, they will be ignored as well. + * e.g. if the command specifies `list v/ e/ n/NAME`, where the `NAME` parameter is not used for the `list` command, it will be interpreted as `list v/ e/`. + +

* If you are using a PDF version of this document, be careful when copying and pasting commands that span multiple lines as space characters surrounding line-breaks may be omitted when copied over to the application. From e8ca273cc4ac8730374663a52d11a65fd25838fa Mon Sep 17 00:00:00 2001 From: C5hives Date: Wed, 6 Nov 2024 22:29:28 +0800 Subject: [PATCH 06/69] Update guide for help message --- docs/UserGuide.md | 7 +++---- docs/images/helpMessage.png | Bin 8435 -> 7154 bytes 2 files changed, 3 insertions(+), 4 deletions(-) diff --git a/docs/UserGuide.md b/docs/UserGuide.md index 459f25eec49..626ddd22871 100644 --- a/docs/UserGuide.md +++ b/docs/UserGuide.md @@ -94,14 +94,13 @@ If you can type fast, EventTory can get your **event management tasks** done fas * If you are using a PDF version of this document, be careful when copying and pasting commands that span multiple lines as space characters surrounding line-breaks may be omitted when copied over to the application. -### Viewing help : `help` +### Viewing Help : `help` -Shows a message explaning how to access the help page. +Shows a message explaining how to access the help page. ![help message](images/helpMessage.png) -Format: `help` - +#### Format: `help` ### Adding a person: `add` diff --git a/docs/images/helpMessage.png b/docs/images/helpMessage.png index b1f70470137ec75b2bfe4d29458114d1aa75dbcd..7453b81af4165c21cd39499c77b7039b8ef6e23c 100644 GIT binary patch literal 7154 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ÐxTGMs?~ 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 Date: Wed, 6 Nov 2024 22:37:02 +0800 Subject: [PATCH 07/69] Change add command to create --- docs/UserGuide.md | 22 ++++++++++++---------- 1 file changed, 12 insertions(+), 10 deletions(-) diff --git a/docs/UserGuide.md b/docs/UserGuide.md index 626ddd22871..f3c04359962 100644 --- a/docs/UserGuide.md +++ b/docs/UserGuide.md @@ -16,7 +16,7 @@ If you can type fast, EventTory can get your **event management tasks** done fas -------------------------------------------------------------------------------------------------------------------- -## Quick start +## Quick Start 1. Ensure you have Java `17` or above installed in your Computer. @@ -102,20 +102,22 @@ Shows a message explaining how to access the help page. #### Format: `help` -### Adding a person: `add` +### Creating a Vendor or Event: `create` -Adds a person to the address book. +Creates a person or event in EventTory. -Format: `add n/NAME p/PHONE_NUMBER e/EMAIL a/ADDRESS [t/TAG]…​` +#### Format: +* To create a vendor: `create v/ n/VENDOR_NAME d/DESCRIPTION p/PHONE_NUMBER [t/TAG]…​` +* To create en event: `create e/ n/EVENT_NAME on/DATE [t/TAG]…​` - - -**Tip:** A person can have any number of tags (including 0) +**Note:** If parameters are provided for the `v/` and `e/` flags, they will be ignored. +
+**Tip:** A vendor or event can have any number of tags (including 0).
-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` +#### Examples: +* `create v/ n/Hong Lim Trading Pte. Ltd. p/67412943 d/Specialises in lighting effects. t/stage-crew` +* `create e/ n/Jubilee Concert on/24 Jan 2025 t/annual` ### Listing all persons : `list` From d917f25982f54b102f4d8b647b42efef3cc33aac Mon Sep 17 00:00:00 2001 From: C5hives Date: Wed, 6 Nov 2024 22:47:49 +0800 Subject: [PATCH 08/69] Update user guide for edit command --- docs/UserGuide.md | 29 ++++++++++++++++++----------- 1 file changed, 18 insertions(+), 11 deletions(-) diff --git a/docs/UserGuide.md b/docs/UserGuide.md index f3c04359962..e813f7788a2 100644 --- a/docs/UserGuide.md +++ b/docs/UserGuide.md @@ -110,7 +110,8 @@ Creates a person or event in EventTory. * To create a vendor: `create v/ n/VENDOR_NAME d/DESCRIPTION p/PHONE_NUMBER [t/TAG]…​` * To create en event: `create e/ n/EVENT_NAME on/DATE [t/TAG]…​` -**Note:** If parameters are provided for the `v/` and `e/` flags, they will be ignored. +#### Notes +If parameters are provided for the `v/` and `e/` flags, they will be ignored.
**Tip:** A vendor or event can have any number of tags (including 0).
@@ -127,20 +128,26 @@ Format: `list` ### Editing a person : `edit` -Edits an existing person in the address book. +Edits an existing vendor or event in EventTory. -Format: `edit INDEX [n/NAME] [p/PHONE] [e/EMAIL] [a/ADDRESS] [t/TAG]…​` +#### Format: +* To edit a vendor: `edit v/INDEX [n/NAME] [p/PHONE] [d/DESCRIPTION] [t/TAG]…​` +* To edit an event: `edit e/INDEX [n/NAME] [on/DATE] [t/TAG]…​` -* 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, …​ +#### Notes: +* Edits the vendor/event at the specified `INDEX`. + * The index refers to the index number shown in the vendor or event list. + * The index **must be a positive integer** 1, 2, 3, …​ * At least one of the optional 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. + * Editing an item but providing no new values is invalid. +* The existing values will be updated to the input values. +* When editing tags, the existing tags of the vendor/event will be **overridden**. + * Tags cannot be added cumulatively. + * You can remove all tags from a vendor/event 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. +#### Examples: +* `edit v/1 p/58623042 ` : Edits the phone number of the 1st vendor to be `58623042`. +* `edit e/2 n/Baby Shower t/` : Edits the name of the 2nd event to be `Baby Shower`, and clears all existing tags. ### Locating persons by name: `find` From 3f604862061ab5b2732b3a0db36c0cce92c7defb Mon Sep 17 00:00:00 2001 From: C5hives Date: Wed, 6 Nov 2024 22:48:32 +0800 Subject: [PATCH 09/69] Update user guide for clear command --- docs/UserGuide.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docs/UserGuide.md b/docs/UserGuide.md index e813f7788a2..f26dea4cbaa 100644 --- a/docs/UserGuide.md +++ b/docs/UserGuide.md @@ -183,7 +183,7 @@ Examples: ### Clearing all entries : `clear` -Clears all entries from the address book. +Clears all entries from EventTory. Format: `clear` From a276bf32cc95a388c3e736e1f777711959208fe2 Mon Sep 17 00:00:00 2001 From: C5hives Date: Wed, 6 Nov 2024 22:53:28 +0800 Subject: [PATCH 10/69] Update section on saving and editing of the data --- docs/UserGuide.md | 26 +++++++++++++++----------- 1 file changed, 15 insertions(+), 11 deletions(-) diff --git a/docs/UserGuide.md b/docs/UserGuide.md index f26dea4cbaa..61de8d612be 100644 --- a/docs/UserGuide.md +++ b/docs/UserGuide.md @@ -185,32 +185,36 @@ Examples: Clears all entries from EventTory. -Format: `clear` +#### Format: `clear` ### Exiting the program : `exit` Exits the program. -Format: `exit` +#### Format: `exit` -### Saving the data +### Saving Data -AddressBook data are saved in the hard disk automatically after any command that changes the data. There is no need to save manually. +EventTory data is saved in the hard disk automatically after any command that changes the data. +There is no need to save manually. -### Editing the data file +### Editing the Data File -AddressBook data are saved automatically as a JSON file `[JAR file location]/data/addressbook.json`. Advanced users are welcome to update data directly by editing that data file. +EventTory data is saved automatically as a JSON file `[JAR file location]/data/eventTory.json`. +
Advanced users are welcome to update data directly by editing that data file. **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. Hence, it is recommended to take a backup of the file before editing it.
-Furthermore, certain edits can cause the AddressBook to behave in unexpected ways (e.g., if a value entered is outside the acceptable range). Therefore, edit the data file only if you are confident that you can update it correctly. -
+If changes to the data file causes its format to become invalid, EventTory will discard **all data** and start with an **empty** data file at the next run. -### Archiving data files `[coming in v2.0]` +

+Hence, it is recommended to make a backup of the file before attempting to edit it. +Furthermore, certain edits can cause the EventTory to behave in unexpected ways (e.g., if a value entered is outside the acceptable range).
+Therefore, edit the data file only if you are confident that you can update it correctly. +

-_Details coming soon ..._ +
-------------------------------------------------------------------------------------------------------------------- From ab23640560edc7c6117f3a7b1218a2d4c9725fbb Mon Sep 17 00:00:00 2001 From: C5hives Date: Wed, 6 Nov 2024 23:11:41 +0800 Subject: [PATCH 11/69] Update command summary --- docs/UserGuide.md | 32 ++++++++++++++++++-------------- 1 file changed, 18 insertions(+), 14 deletions(-) diff --git a/docs/UserGuide.md b/docs/UserGuide.md index 61de8d612be..cc2e7ccd70b 100644 --- a/docs/UserGuide.md +++ b/docs/UserGuide.md @@ -68,7 +68,7 @@ If you can type fast, EventTory can get your **event management tasks** done fas

-* Items with `...` after them can be used multiple times, including zero times.
+* 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/big-event`; @@ -221,25 +221,29 @@ Therefore, edit the data file only if you are confident that you can update it c ## 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. +**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 EventTory home folder. -------------------------------------------------------------------------------------------------------------------- -## Known issues +## Known Issues 1. **When using multiple screens**, if you move the application to a secondary screen, and later switch to using only the primary screen, the GUI will open off-screen. The remedy is to delete the `preferences.json` file created by the application before running the application again. 2. **If you minimize the Help Window** and then run the `help` command (or use the `Help` menu, or the keyboard shortcut `F1`) again, the original Help Window will remain minimized, and no new Help Window will appear. The remedy is to manually restore the minimized Help Window. -------------------------------------------------------------------------------------------------------------------- -## 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` +## Command Summary + +| Action | Format, Examples | +|--------------|---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------| +| **Create** | -`create v/ n/VENDOR_NAME p/PHONE_NUMBER d/DESCRIPTION [t/TAG]…​` or,
-`create e/ n/EVENT_NAME on/DATE [t/TAG]…​`

e.g., `create e/ n/Graduation Party on/2025-12-10 t/smu` | +| **Assign** | `assign INDEX`
e.g. `assign 1` | +| **Unassign** | `unassign INDEX`
e.g. `unassign 1` | +| **List** | `list [v/] [e/]`
e.g. `list v/`, `list v/ e/` | +| **View** | `view v/INDEX` or `view e/INDEX`
e.g. `view v/1` | +| **Delete** | `delete v/INDEX` or `delete e/INDEX`
e.g., `delete v/3`, `delete e/2` | +| **Edit** | -`edit v/INDEX [n/VENDOR_NAME] [p/PHONE_NUMBER] [d/DESCRIPTION] [t/TAG]…​` or,
-`edit e/INDEX [n/EVENT_NAME] [on/DATE] [t/TAG]…​`

e.g., `edit v/2 n/PC Parts Trading d/Sells PC Parts` or,
`edit e/3 n/Hackathon on/2024-10-12` | +| **Find** | -`find v/ KEYWORD [MORE_KEYWORDS]…` or,
-`find e/ KEYWORD [MORE_KEYWORDS]…`

e.g., `find e/ wedding banquet` | +| **Clear** | `clear` | +| **Help** | `help` | +| **Exit** | `exit` | From 289c94fdf17a328757037e641a204df9bc999373 Mon Sep 17 00:00:00 2001 From: Jabez Tho Date: Thu, 7 Nov 2024 04:33:54 +0800 Subject: [PATCH 12/69] Add view in UG --- docs/UserGuide.md | 17 +++++++++++++++++ 1 file changed, 17 insertions(+) diff --git a/docs/UserGuide.md b/docs/UserGuide.md index b1647ef8fd5..ee5d5ed45e9 100644 --- a/docs/UserGuide.md +++ b/docs/UserGuide.md @@ -129,6 +129,23 @@ Assigns vendors to events. * `view v/2` then `assign 1` will assign the 1st event to the current viewed vendor, which is the 2nd vendor. * `view e/1` then `assign 3` will assign the 3rd vendor to the current viewed event, which is the 1st event. +### Viewing Vendors & Events: `view` + +Views the details of a vendor or event. + +#### Format: `view v/INDEX` or `view e/INDEX` + +* Views the details of the vendor/event at the specified `INDEX`. + * The index refers to the index number shown in the displayed vendor/event list. + * The index **must be a positive integer** 1, 2, 3, ... +* The details page include assigned events/vendors as well as a list of assignable events/vendors. + * The vendor details also include name, phone number, description, and tags. + * The event details also include name, date, and tags. + +#### Examples: +* `view v/2` will show the details of the 2nd vendor. +* `view e/1` will show the details of the 1st event. + ### Locating persons by name: `find` Finds persons whose names contain any of the given keywords. From 1a0c457483d2c615532534a1a139016294049e3a Mon Sep 17 00:00:00 2001 From: kahsuann Date: Thu, 7 Nov 2024 09:28:28 +0800 Subject: [PATCH 13/69] Update user guide to unassign command --- docs/UserGuide.md | 18 +++++++++++++++++- 1 file changed, 17 insertions(+), 1 deletion(-) diff --git a/docs/UserGuide.md b/docs/UserGuide.md index b1647ef8fd5..c5a0a99fb5f 100644 --- a/docs/UserGuide.md +++ b/docs/UserGuide.md @@ -120,7 +120,7 @@ Assigns vendors to events. #### Format: `assign INDEX` * Assigns the vendor/event specified at `INDEX` to the current viewed event/vendor. - * The index refers to the index number shown in the vendor/event list. + * The index refers to the index number shown in the assignable vendor/event list. * The index **must be a positive integer** 1, 2, 3, ... * The command only works when the user is viewing a vendor/event using the `view` command. Otherwise, the operation will fail. * If the specified vendor-event pair are already associated (assigned to each other), the operation will fail. @@ -129,6 +129,22 @@ Assigns vendors to events. * `view v/2` then `assign 1` will assign the 1st event to the current viewed vendor, which is the 2nd vendor. * `view e/1` then `assign 3` will assign the 3rd vendor to the current viewed event, which is the 1st event. +### Unassigning Vendors & Events: `unassign` + +Unassigns vendors to events. + +#### Format: `unassign INDEX` + +* Unassigns the vendor/event specified at `INDEX` to the current viewed event/vendor. + * The index refers to the index number shown in the assigned vendor/event list. + * The index **must be a positive integer** 1, 2, 3, ... +* The command only works when the user is viewing a vendor/event using the `view` command. Otherwise, the operation will fail. +* If the specified vendor-event pair are not already associated (not assigned to each other), the operation will fail. + +#### Examples: +* `view v/2` then `unassign 1` will unassign the 1st event from the current viewed vendor, which is the 2nd vendor. +* `view e/1` then `unassign 3` will unassign the 3rd vendor from the current viewed event, which is the 1st event. + ### Locating persons by name: `find` Finds persons whose names contain any of the given keywords. From 77e1ca9f60c017917f3afa708e28f6abe0dd986c Mon Sep 17 00:00:00 2001 From: kahsuann Date: Thu, 7 Nov 2024 10:03:12 +0800 Subject: [PATCH 14/69] Update logic component for DG --- docs/DeveloperGuide.md | 14 +++---- docs/diagrams/DeleteSequenceDiagram.puml | 50 ++++++++++++------------ docs/diagrams/ParserClasses.puml | 8 ++-- 3 files changed, 36 insertions(+), 36 deletions(-) diff --git a/docs/DeveloperGuide.md b/docs/DeveloperGuide.md index 23b8a34ac3f..6fe581b74a1 100644 --- a/docs/DeveloperGuide.md +++ b/docs/DeveloperGuide.md @@ -90,9 +90,9 @@ Here's a (partial) class diagram of the `Logic` component: -The sequence diagram below illustrates the interactions within the `Logic` component, taking `execute("delete 1")` API call as an example. +The sequence diagram below illustrates the interactions within the `Logic` component, taking `execute("delete e/1")` API call as an example. - + @@ -101,9 +101,9 @@ The sequence diagram below illustrates the interactions within the `Logic` compo How the `Logic` component works: -1. 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., `DeleteCommandParser`) and uses it to parse the command. -1. This results in a `Command` object (more precisely, an object of one of its subclasses e.g., `DeleteCommand`) which is executed by the `LogicManager`. -1. The command can communicate with the `Model` when it is executed (e.g. to delete a person).
+1. When `Logic` is called upon to execute a command, it is passed to an `EventToryParser` object which in turn creates a parser that matches the command (e.g., `DeleteCommandParser`) and uses it to parse the command. +1. This results in a `Command` object (more precisely, an object of one of its subclasses e.g., `DeleteEventCommand`) which is executed by the `LogicManager`. +1. The command can communicate with the `Model` when it is executed (e.g. to delete an event).
Note that although this is shown as a single step in the diagram above (for simplicity), in the code it can take several interactions (between the command object and the `Model`) to achieve. 1. The result of the command execution is encapsulated as a `CommandResult` object which is returned back from `Logic`. @@ -112,8 +112,8 @@ Here are the other classes in `Logic` (omitted from the class diagram above) tha How the parsing works: -* When called upon to parse a user command, the `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 a `XYZCommand` object (e.g., `AddCommand`) which the `AddressBookParser` returns back as a `Command` object. -* All `XYZCommandParser` classes (e.g., `AddCommandParser`, `DeleteCommandParser`, ...) inherit from the `Parser` interface so that they can be treated similarly where possible e.g, during testing. +* When called upon to parse a user command, the `EventToryParser` class creates an `XYZCommandParser` (`XYZ` is a placeholder for the specific command name e.g., `CreateCommandParser`) which uses the other classes shown above to parse the user command and create a `XYZCommand` object (e.g., `CreateVendorCommand`) which the `EventToryParser` returns back as a `Command` object. +* All `XYZCommandParser` classes (e.g., `CreateCommandParser`, `DeleteCommandParser`, ...) inherit from the `Parser` interface so that they can be treated similarly where possible e.g, during testing. ### Model component **API** : [`Model.java`](https://github.com/se-edu/addressbook-level3/tree/master/src/main/java/seedu/address/model/Model.java) diff --git a/docs/diagrams/DeleteSequenceDiagram.puml b/docs/diagrams/DeleteSequenceDiagram.puml index 5241e79d7da..97b834dbb9d 100644 --- a/docs/diagrams/DeleteSequenceDiagram.puml +++ b/docs/diagrams/DeleteSequenceDiagram.puml @@ -4,9 +4,9 @@ skinparam ArrowFontStyle plain box Logic LOGIC_COLOR_T1 participant ":LogicManager" as LogicManager LOGIC_COLOR -participant ":AddressBookParser" as AddressBookParser LOGIC_COLOR +participant ":EventToryParser" as EventToryParser LOGIC_COLOR participant ":DeleteCommandParser" as DeleteCommandParser LOGIC_COLOR -participant "d:DeleteCommand" as DeleteCommand LOGIC_COLOR +participant "d:DeleteEventCommand" as DeleteEventCommand LOGIC_COLOR participant "r:CommandResult" as CommandResult LOGIC_COLOR end box @@ -14,56 +14,56 @@ box Model MODEL_COLOR_T1 participant "m:Model" as Model MODEL_COLOR end box -[-> LogicManager : execute("delete 1") +[-> LogicManager : execute("delete e/1") activate LogicManager -LogicManager -> AddressBookParser : parseCommand("delete 1") -activate AddressBookParser +LogicManager -> EventToryParser : parseCommand("delete e/1") +activate EventToryParser create DeleteCommandParser -AddressBookParser -> DeleteCommandParser +EventToryParser -> DeleteCommandParser activate DeleteCommandParser -DeleteCommandParser --> AddressBookParser +DeleteCommandParser --> EventToryParser deactivate DeleteCommandParser -AddressBookParser -> DeleteCommandParser : parse("1") +EventToryParser -> DeleteCommandParser : parse("e/1") activate DeleteCommandParser -create DeleteCommand -DeleteCommandParser -> DeleteCommand -activate DeleteCommand +create DeleteEventCommand +DeleteCommandParser -> DeleteEventCommand +activate DeleteEventCommand -DeleteCommand --> DeleteCommandParser : -deactivate DeleteCommand +DeleteEventCommand --> DeleteCommandParser : +deactivate DeleteEventCommand -DeleteCommandParser --> AddressBookParser : d +DeleteCommandParser --> EventToryParser : c deactivate DeleteCommandParser 'Hidden arrow to position the destroy marker below the end of the activation bar. -DeleteCommandParser -[hidden]-> AddressBookParser +DeleteCommandParser -[hidden]-> EventToryParser destroy DeleteCommandParser -AddressBookParser --> LogicManager : d -deactivate AddressBookParser +EventToryParser --> LogicManager : c +deactivate EventToryParser -LogicManager -> DeleteCommand : execute(m) -activate DeleteCommand +LogicManager -> DeleteEventCommand : execute(m) +activate DeleteEventCommand -DeleteCommand -> Model : deletePerson(1) +DeleteEventCommand -> Model : deleteEvent(1) activate Model -Model --> DeleteCommand +Model --> DeleteEventCommand deactivate Model create CommandResult -DeleteCommand -> CommandResult +DeleteEventCommand -> CommandResult activate CommandResult -CommandResult --> DeleteCommand +CommandResult --> DeleteEventCommand deactivate CommandResult -DeleteCommand --> LogicManager : r -deactivate DeleteCommand +DeleteEventCommand --> LogicManager : r +deactivate DeleteEventCommand [<--LogicManager deactivate LogicManager diff --git a/docs/diagrams/ParserClasses.puml b/docs/diagrams/ParserClasses.puml index ce4c5ce8c8d..b6e515731d1 100644 --- a/docs/diagrams/ParserClasses.puml +++ b/docs/diagrams/ParserClasses.puml @@ -9,7 +9,7 @@ Class XYZCommand package "Parser classes"{ Class "<>\nParser" as Parser -Class AddressBookParser +Class EventToryParser Class XYZCommandParser Class CliSyntax Class ParserUtil @@ -19,12 +19,12 @@ Class Prefix } Class HiddenOutside #FFFFFF -HiddenOutside ..> AddressBookParser +HiddenOutside ..> EventToryParser -AddressBookParser .down.> XYZCommandParser: <> +EventToryParser .down.> XYZCommandParser: <> XYZCommandParser ..> XYZCommand : <> -AddressBookParser ..> Command : <> +EventToryParser ..> Command : <> XYZCommandParser .up.|> Parser XYZCommandParser ..> ArgumentMultimap XYZCommandParser ..> ArgumentTokenizer From 6855b9586caa25bb5c17578f79ab8f160bb8d2e5 Mon Sep 17 00:00:00 2001 From: kahsuann Date: Thu, 7 Nov 2024 10:05:33 +0800 Subject: [PATCH 15/69] Update DG for logic component --- docs/diagrams/DeleteSequenceDiagram.puml | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/docs/diagrams/DeleteSequenceDiagram.puml b/docs/diagrams/DeleteSequenceDiagram.puml index 97b834dbb9d..86cac637319 100644 --- a/docs/diagrams/DeleteSequenceDiagram.puml +++ b/docs/diagrams/DeleteSequenceDiagram.puml @@ -37,13 +37,13 @@ activate DeleteEventCommand DeleteEventCommand --> DeleteCommandParser : deactivate DeleteEventCommand -DeleteCommandParser --> EventToryParser : c +DeleteCommandParser --> EventToryParser : d deactivate DeleteCommandParser 'Hidden arrow to position the destroy marker below the end of the activation bar. DeleteCommandParser -[hidden]-> EventToryParser destroy DeleteCommandParser -EventToryParser --> LogicManager : c +EventToryParser --> LogicManager : d deactivate EventToryParser LogicManager -> DeleteEventCommand : execute(m) From 5173ea0cd155075e25c113e76530357c95b018d7 Mon Sep 17 00:00:00 2001 From: Kevin Pek Date: Thu, 7 Nov 2024 10:11:16 +0800 Subject: [PATCH 16/69] Update user guide for find command --- docs/UserGuide.md | 20 ++++++++++---------- docs/images/findAlexDavidResult.png | Bin 19640 -> 0 bytes 2 files changed, 10 insertions(+), 10 deletions(-) delete mode 100644 docs/images/findAlexDavidResult.png diff --git a/docs/UserGuide.md b/docs/UserGuide.md index b1647ef8fd5..30d1c3650fc 100644 --- a/docs/UserGuide.md +++ b/docs/UserGuide.md @@ -129,23 +129,23 @@ Assigns vendors to events. * `view v/2` then `assign 1` will assign the 1st event to the current viewed vendor, which is the 2nd vendor. * `view e/1` then `assign 3` will assign the 3rd vendor to the current viewed event, which is the 1st event. -### Locating persons by name: `find` +### Find items by keywords: `find` -Finds persons whose names contain any of the given keywords. +Finds vendors or events whose attributes contain any of the space separated keywords given. -Format: `find KEYWORD [MORE_KEYWORDS]` +Format: `find v/KEYWORD [MORE_KEYWORDS]` or `find e/KEYWORD [MORE_KEYWORDS]` * The search is case-insensitive. e.g `hans` will match `Hans` +* Any partial matches will still be matched e.g. `han` 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). +* All attributes of the `Vendor` or `Event` are searched, ie. name, phone number, date, descriptions and tags. +* Vendors and Events matching at least one keyword will be returned (i.e. `OR` search). e.g. `Hans Bo` will return `Hans Gruber`, `Bo Yang` +* If no matches are found, no changes will be made to the current view, and a message will be shown to the user indicating that no vendors/events were found. 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 v/John` returns `john` and `John Doe` +* `find e/alex david` returns `Alex Yeoh`, `David Li`
### Deleting a person : `delete` @@ -216,6 +216,6 @@ Action | Format, Examples **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` +**Find** | `find v/ KEYWORD [MORE_KEYWORDS] or e/ KEYWORD [MORE_KEYWORDS]`
e.g., `find v/James Jake`, `find e/Party at Alice's` **List** | `list` **Help** | `help` diff --git a/docs/images/findAlexDavidResult.png b/docs/images/findAlexDavidResult.png deleted file mode 100644 index 235da1c273ebc2117b862aee21de72a412008be7..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 19640 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 From b755d924329e441f533f71642345910266576026 Mon Sep 17 00:00:00 2001 From: Kevin Pek Date: Thu, 7 Nov 2024 10:33:38 +0800 Subject: [PATCH 17/69] Update developer guide for storage component --- docs/DeveloperGuide.md | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/docs/DeveloperGuide.md b/docs/DeveloperGuide.md index 23b8a34ac3f..3a51dc59ca1 100644 --- a/docs/DeveloperGuide.md +++ b/docs/DeveloperGuide.md @@ -145,8 +145,8 @@ The `Model` component, The `Storage` component, * can save both address book data and user preference data in JSON format, and read them back into corresponding objects. -* 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`) +* inherits from both `EventToryStorage` 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`, for examples, see the JsonAdapted classes eg. `JsonAdaptedVendor`, `JsonAdapterEvent`) ### Common classes From 0ed06c13dc8b66de0cab3381c5b14a3424e6dbae Mon Sep 17 00:00:00 2001 From: Kevin Pek Date: Thu, 7 Nov 2024 10:49:22 +0800 Subject: [PATCH 18/69] Update github link for Storage component in developer guide --- docs/DeveloperGuide.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docs/DeveloperGuide.md b/docs/DeveloperGuide.md index 3a51dc59ca1..95c3b5b2352 100644 --- a/docs/DeveloperGuide.md +++ b/docs/DeveloperGuide.md @@ -139,7 +139,7 @@ The `Model` component, ### Storage component -**API** : [`Storage.java`](https://github.com/se-edu/addressbook-level3/tree/master/src/main/java/seedu/address/storage/Storage.java) +**API** : [`Storage.java`](https://github.com/AY2425S1-CS2103-F13-2/tp/blob/master/src/main/java/seedu/eventtory/storage/Storage.java) From 0110dea68f1e5a4f1c0105609fcd66fac7abef06 Mon Sep 17 00:00:00 2001 From: kahsuann Date: Thu, 7 Nov 2024 11:15:41 +0800 Subject: [PATCH 19/69] Update logic url link in dg --- docs/DeveloperGuide.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docs/DeveloperGuide.md b/docs/DeveloperGuide.md index 6fe581b74a1..818fe5a7214 100644 --- a/docs/DeveloperGuide.md +++ b/docs/DeveloperGuide.md @@ -84,7 +84,7 @@ The `UI` component, ### Logic component -**API** : [`Logic.java`](https://github.com/se-edu/addressbook-level3/tree/master/src/main/java/seedu/address/logic/Logic.java) +**API** : [`Logic.java`](https://github.com/AY2425S1-CS2103-F13-2/tp/blob/master/src/main/java/seedu/everntTory/logic/Logic.java) Here's a (partial) class diagram of the `Logic` component: From 7c649a53afb487c6624f5e80aeace996d720708c Mon Sep 17 00:00:00 2001 From: kahsuann Date: Thu, 7 Nov 2024 14:15:27 +0800 Subject: [PATCH 20/69] Add note that DeleteEventCommand inherits from DeleteCommand --- docs/DeveloperGuide.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docs/DeveloperGuide.md b/docs/DeveloperGuide.md index 818fe5a7214..2f18ff71498 100644 --- a/docs/DeveloperGuide.md +++ b/docs/DeveloperGuide.md @@ -102,7 +102,7 @@ The sequence diagram below illustrates the interactions within the `Logic` compo How the `Logic` component works: 1. When `Logic` is called upon to execute a command, it is passed to an `EventToryParser` object which in turn creates a parser that matches the command (e.g., `DeleteCommandParser`) and uses it to parse the command. -1. This results in a `Command` object (more precisely, an object of one of its subclasses e.g., `DeleteEventCommand`) which is executed by the `LogicManager`. +1. This results in a `Command` object (more precisely, an object of one of its subclasses e.g., `DeleteEventCommand` which inherits from `DeleteCommand`) which is executed by the `LogicManager`. 1. The command can communicate with the `Model` when it is executed (e.g. to delete an event).
Note that although this is shown as a single step in the diagram above (for simplicity), in the code it can take several interactions (between the command object and the `Model`) to achieve. 1. The result of the command execution is encapsulated as a `CommandResult` object which is returned back from `Logic`. From 421e13cc4ea262def526d5eff30ec324d1b9d5e3 Mon Sep 17 00:00:00 2001 From: Hans Delano Date: Thu, 7 Nov 2024 18:06:27 +0800 Subject: [PATCH 21/69] Update UG edit command --- docs/UserGuide.md | 28 +++++++++++++++++----------- 1 file changed, 17 insertions(+), 11 deletions(-) diff --git a/docs/UserGuide.md b/docs/UserGuide.md index 051183fb8a8..d93bb8ed1d1 100644 --- a/docs/UserGuide.md +++ b/docs/UserGuide.md @@ -106,22 +106,28 @@ Displays the list of vendors and/or events in EventTory. * `list e/` will display the list of events. * `list v/ e/` and `list` will display both lists. -### Editing a person : `edit` +### Editing a Vendor or Event : `edit` -Edits an existing person in the address book. +Edits an existing vendor or event in EventTory. -Format: `edit INDEX [n/NAME] [p/PHONE] [e/EMAIL] [a/ADDRESS] [t/TAG]…​` +#### Format: +* To edit a vendor: `edit v/INDEX [n/NAME] [p/PHONE] [d/DESCRIPTION] [t/TAG]…​` +* To edit an event: `edit e/INDEX [n/NAME] [on/DATE] [t/TAG]…​` -* 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, …​ +#### Notes: +* Edits the vendor/event at the specified `INDEX`. + * The index refers to the index number shown in the vendor or event list. + * The index **must be a positive integer** 1, 2, 3, …​ * At least one of the optional 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. + * Editing an item but providing no new values is invalid. +* The existing values will be updated to the input values. +* When editing tags, the existing tags of the vendor/event will be **overridden**. + * Tags cannot be added cumulatively. + * You can remove all tags from a vendor/event 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. +#### Examples: +* `edit v/1 p/58623042 ` : Edits the phone number of the 1st vendor to be `58623042`. +* `edit e/2 n/Baby Shower t/` : Edits the name of the 2nd event to be `Baby Shower`, and clears all existing tags. ### Assigning Vendors & Events: `assign` From c281ab2ff62fc6c8ec67e0ce6387d0e6fd5bf6c6 Mon Sep 17 00:00:00 2001 From: kahsuann Date: Thu, 7 Nov 2024 18:29:38 +0800 Subject: [PATCH 22/69] Fix numbering and add separate note for commands --- docs/DeveloperGuide.md | 13 +++++++++---- 1 file changed, 9 insertions(+), 4 deletions(-) diff --git a/docs/DeveloperGuide.md b/docs/DeveloperGuide.md index 2f18ff71498..6dccc664cc4 100644 --- a/docs/DeveloperGuide.md +++ b/docs/DeveloperGuide.md @@ -102,10 +102,10 @@ The sequence diagram below illustrates the interactions within the `Logic` compo How the `Logic` component works: 1. When `Logic` is called upon to execute a command, it is passed to an `EventToryParser` object which in turn creates a parser that matches the command (e.g., `DeleteCommandParser`) and uses it to parse the command. -1. This results in a `Command` object (more precisely, an object of one of its subclasses e.g., `DeleteEventCommand` which inherits from `DeleteCommand`) which is executed by the `LogicManager`. -1. The command can communicate with the `Model` when it is executed (e.g. to delete an event).
- Note that although this is shown as a single step in the diagram above (for simplicity), in the code it can take several interactions (between the command object and the `Model`) to achieve. -1. The result of the command execution is encapsulated as a `CommandResult` object which is returned back from `Logic`. +2. This results in a `Command` object (more precisely, an object of one of its subclasses e.g., `DeleteEventCommand`) which is executed by the `LogicManager`. +3. The command can communicate with the `Model` when it is executed (e.g. to delete an event).
+ Note that although this is shown as a single step in the diagram above (for simplicity), in the code it can take several interactions (between the command object and the `Model`) to achieve. +4. 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: @@ -115,6 +115,11 @@ How the parsing works: * When called upon to parse a user command, the `EventToryParser` class creates an `XYZCommandParser` (`XYZ` is a placeholder for the specific command name e.g., `CreateCommandParser`) which uses the other classes shown above to parse the user command and create a `XYZCommand` object (e.g., `CreateVendorCommand`) which the `EventToryParser` returns back as a `Command` object. * All `XYZCommandParser` classes (e.g., `CreateCommandParser`, `DeleteCommandParser`, ...) inherit from the `Parser` interface so that they can be treated similarly where possible e.g, during testing. +How commands work: +* `XYZEventCommand` and `XYZVendorCommand` classes (e.g., `CreateEventCommand`, `CreateVendorCommand`, ...) inherit from their respective abstract classes (e.g., `CreateCommand`). +* `ClearCommand`, `HelpCommand` and `ExitCommand` do not have corresponding `XYZEventCommand` and `XYZVendorCommand` classes. +* `ListCommand` is not an abstract class. + ### Model component **API** : [`Model.java`](https://github.com/se-edu/addressbook-level3/tree/master/src/main/java/seedu/address/model/Model.java) From 3a67a3e036e4d199f3ae1e89c70a7d79fd44f01c Mon Sep 17 00:00:00 2001 From: Hans Delano Date: Thu, 7 Nov 2024 18:30:34 +0800 Subject: [PATCH 23/69] Add sample data --- .../eventtory/model/util/SampleDataUtil.java | 108 +++++++++++++++--- 1 file changed, 89 insertions(+), 19 deletions(-) diff --git a/src/main/java/seedu/eventtory/model/util/SampleDataUtil.java b/src/main/java/seedu/eventtory/model/util/SampleDataUtil.java index b40a638bd81..afc8c91f61c 100644 --- a/src/main/java/seedu/eventtory/model/util/SampleDataUtil.java +++ b/src/main/java/seedu/eventtory/model/util/SampleDataUtil.java @@ -8,6 +8,8 @@ import seedu.eventtory.model.ReadOnlyEventTory; import seedu.eventtory.model.commons.name.Name; import seedu.eventtory.model.commons.tag.Tag; +import seedu.eventtory.model.event.Date; +import seedu.eventtory.model.event.Event; import seedu.eventtory.model.vendor.Description; import seedu.eventtory.model.vendor.Phone; import seedu.eventtory.model.vendor.Vendor; @@ -18,32 +20,100 @@ public class SampleDataUtil { public static Vendor[] getSampleVendors() { return new Vendor[] { - new Vendor(new Name("Alex Yeoh"), new Phone("87438807"), - new Description("Blk 30 Geylang Street 29, #06-40"), - getTagSet("friends")), - new Vendor(new Name("Bernice Yu"), new Phone("99272758"), - new Description("Blk 30 Lorong 3 Serangoon Gardens, #07-18"), - getTagSet("colleagues", "friends")), - new Vendor(new Name("Charlotte Oliveiro"), new Phone("93210283"), - new Description("Blk 11 Ang Mo Kio Street 74, #11-04"), - getTagSet("neighbours")), - new Vendor(new Name("David Li"), new Phone("91031282"), - new Description("Blk 436 Serangoon Gardens Street 26, #16-43"), - getTagSet("family")), - new Vendor(new Name("Irfan Ibrahim"), new Phone("92492021"), - new Description("Blk 47 Tampines Street 20, #17-35"), - getTagSet("classmates")), - new Vendor(new Name("Roy Balakrishnan"), new Phone("92624417"), - new Description("Blk 45 Aljunied Street 85, #11-31"), - getTagSet("colleagues")) + new Vendor(new Name("Headless Bakers"), new Phone("87438807"), + new Description("Awesome pastries and cakes!"), + getTagSet("pastry", "bakeshop")), + new Vendor(new Name("The Green Grocer"), new Phone("98889900"), + new Description("Fresh organic produce delivered weekly."), + getTagSet("groceries", "organic")), + new Vendor(new Name("Techie Gadget Store"), new Phone("93939393"), + new Description("Latest tech gadgets and accessories."), + getTagSet("electronics", "gadgets")), + new Vendor(new Name("Sunshine Florist"), new Phone("91321234"), + new Description("Beautiful flowers for every occasion."), + getTagSet("florist", "gifts")), + new Vendor(new Name("Urban Threads Boutique"), new Phone("91234567"), + new Description("Fashion-forward clothing and accessories."), + getTagSet("fashion", "clothing")), + new Vendor(new Name("Noodle Master"), new Phone("92223344"), + new Description("Traditional noodles and Asian street food."), + getTagSet("food", "noodles")), + new Vendor(new Name("The Book Nook"), new Phone("98765432"), + new Description("A cozy bookstore with rare finds."), + getTagSet("books", "store")), + new Vendor(new Name("Crispy Corner"), new Phone("92451234"), + new Description("Delicious crispy snacks and fried food."), + getTagSet("snacks", "food")), + new Vendor(new Name("The Sound Wave"), new Phone("95321234"), + new Description("Audio equipment and accessories for music lovers."), + getTagSet("electronics", "audio")), + new Vendor(new Name("Fluff & Stuff Pet Shop"), new Phone("92451298"), + new Description("Everything for your furry friends."), + getTagSet("pets", "store")), + new Vendor(new Name("Glamour Nails"), new Phone("93332211"), + new Description("Nail care and beauty services."), + getTagSet("beauty", "nails")), + new Vendor(new Name("Sushi Express"), new Phone("96112233"), + new Description("Fresh sushi rolls and Japanese delicacies."), + getTagSet("food", "sushi")), + new Vendor(new Name("Artisan Spice Market"), new Phone("97778899"), + new Description("Exotic spices and seasonings from around the world."), + getTagSet("spices", "market")), + new Vendor(new Name("Cycle City"), new Phone("94321123"), + new Description("Bicycles and accessories for cycling enthusiasts."), + getTagSet("sports", "bicycles")) + }; + } + + public static Event[] getSampleEvents() { + return new Event[] { + new Event(new Name("Pastry Party 2024"), new Date("2024-11-11"), getTagSet("pastry", "dessert", "friends")), + new Event(new Name("Farmers' Market Fiesta"), new Date("2024-11-05"), getTagSet("groceries", "organic")), + new Event(new Name("Tech Expo 2024"), new Date("2024-11-20"), getTagSet("technology", "gadgets", "expo")), + new Event(new Name("Flower Power Workshop"), new Date("2024-11-15"), getTagSet("florist", "gifts")), + new Event(new Name("Fashion Showcase 2024"), new Date("2024-12-01"), getTagSet("fashion", "clothing")), + new Event(new Name("Noodle Night Out"), new Date("2024-11-12"), getTagSet("food", "noodles", "dinner")) + }; + } + + public static int[][] getSampleAssociations() { + return new int[][] { + {0, 0}, + {3, 0}, + {7, 0}, + {12, 1}, + {1, 1}, + {2, 2}, + {3, 2}, + {3, 3}, + {9, 3}, + {0, 4}, + {3, 4}, + {4, 4}, + {10, 4}, + {5, 5}, + {13, 5} }; } public static ReadOnlyEventTory getSampleEventTory() { EventTory sampleEt = new EventTory(); - for (Vendor sampleVendor : getSampleVendors()) { + + Vendor[] sampleVendors = getSampleVendors(); + for (Vendor sampleVendor: sampleVendors) { sampleEt.addVendor(sampleVendor); } + + Event[] sampleEvents = getSampleEvents(); + for (Event sampleEvent : sampleEvents) { + sampleEt.addEvent(sampleEvent); + } + + int[][] associations = getSampleAssociations(); + for (int[] association : associations) { + sampleEt.assignVendorToEvent(sampleVendors[association[0]], sampleEvents[association[1]]); + } + return sampleEt; } From 2c15302f52c8062e5bcce941c8a17e332344c089 Mon Sep 17 00:00:00 2001 From: C5hives Date: Thu, 7 Nov 2024 18:40:12 +0800 Subject: [PATCH 24/69] Add disclaimer for offscreen deletion --- docs/UserGuide.md | 2 ++ 1 file changed, 2 insertions(+) diff --git a/docs/UserGuide.md b/docs/UserGuide.md index 3b0f6d19552..6faaed27e13 100644 --- a/docs/UserGuide.md +++ b/docs/UserGuide.md @@ -141,6 +141,8 @@ Deletes a vendor or an event from EventTory. * The index refers to the index number shown in the displayed event/vendor list respectively. * The index **must be a positive integer** 1, 2, 3, ... * The index for each vendor/event is relative and can change depending on previous operations. +* The operation will succeed even if the specified vendor/event is not visible onscreen. + * e.g. `delete v/1` is run after `view v/2`. Even though the 1st vendor will not be visible, it can still be specified for deletion. * If the specified vendor/event is currently assigned to another event/vendor respectively, the operation will fail. * If the current viewed vendor/event is deleted, the application will return you to the main list screen. From 488b09be55b04c2c3daace27fa7250a5e68e13c1 Mon Sep 17 00:00:00 2001 From: C5hives Date: Thu, 7 Nov 2024 19:07:29 +0800 Subject: [PATCH 25/69] Add information about stored items --- docs/UserGuide.md | 28 +++++++++++++++++++++++++++- 1 file changed, 27 insertions(+), 1 deletion(-) diff --git a/docs/UserGuide.md b/docs/UserGuide.md index cc2e7ccd70b..d647d589a5b 100644 --- a/docs/UserGuide.md +++ b/docs/UserGuide.md @@ -49,11 +49,37 @@ If you can type fast, EventTory can get your **event management tasks** done fas -------------------------------------------------------------------------------------------------------------------- +## Storing Information + + + +EventTory provides users a way to keep track of events and vendors. +The details of what information can be stored for a vendor/event are as shown below. + +### Vendor + +* Represents a vendor contracted to provide services for an event e.g. catering, decorating, performing, etc. +* Information about a vendor can be stored with the following fields: + * **Name** : The name of the vendor (usually a company name) + * **Phone Number** : The contact number of the vendor + * **Description** : Text containing any additional information about the vendor + * **Tags** (if applicable) : Metadata used to classify the vendor +* Multiple vendors can be stored in EventTory. + +### Event + +* Represents an event that needs to be organised and usually enlists the help of vendors to plan/run it. +* Information about an event can be stored with the following fields: + * **Name** : The name of the event + * **Date** : The date the event falls on + * **Tags** (if applicable) : Metadata used to classify the event +* Multiple events can be stored in EventTory. + ## Features -**Notes about the command formats:**
+### Command Formats * Words in `UPPER_CASE` are the parameters to be supplied by the user.
e.g. `create v/ n/VENDOR_NAME`, `VENDOR_NAME` is a parameter which is specified by the user: From 67ab9016625d8dda343fd2153119353aded33d14 Mon Sep 17 00:00:00 2001 From: C5hives Date: Thu, 7 Nov 2024 19:08:40 +0800 Subject: [PATCH 26/69] Fix minor formatting error --- docs/UserGuide.md | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/docs/UserGuide.md b/docs/UserGuide.md index d647d589a5b..eb55aee1157 100644 --- a/docs/UserGuide.md +++ b/docs/UserGuide.md @@ -130,13 +130,13 @@ Shows a message explaining how to access the help page. ### Creating a Vendor or Event: `create` -Creates a person or event in EventTory. +Creates a vendor or event in EventTory. #### Format: * To create a vendor: `create v/ n/VENDOR_NAME d/DESCRIPTION p/PHONE_NUMBER [t/TAG]…​` * To create en event: `create e/ n/EVENT_NAME on/DATE [t/TAG]…​` -#### Notes +#### Note: If parameters are provided for the `v/` and `e/` flags, they will be ignored.
**Tip:** A vendor or event can have any number of tags (including 0). From 7cd7cfbb9d40b0e32bd973bc1cfa68dad015744f Mon Sep 17 00:00:00 2001 From: C5hives Date: Thu, 7 Nov 2024 19:22:37 +0800 Subject: [PATCH 27/69] Change formatting to be consistent --- docs/UserGuide.md | 25 ++++++++++++++----------- 1 file changed, 14 insertions(+), 11 deletions(-) diff --git a/docs/UserGuide.md b/docs/UserGuide.md index 268a5345cfe..3b27c01ec7e 100644 --- a/docs/UserGuide.md +++ b/docs/UserGuide.md @@ -4,7 +4,7 @@ pageNav: 3 --- -# EventTory - User Guide +# EventTory User Guide EventTory is a **desktop app for managing vendors and events**. @@ -152,6 +152,7 @@ Displays the list of vendors and/or events in EventTory. #### Format: `list [v/] [e/]` +#### Notes: * The list(s) displayed depends on whether the `v/` and/or `e/` prefix(es) is specified. * If no prefixes are specified, both the vendor and event lists will be displayed. * The prefixes can be specified in any order. @@ -160,7 +161,7 @@ Displays the list of vendors and/or events in EventTory. #### Examples: * `list v/` will display the list of vendors. * `list e/` will display the list of events. -* `list v/ e/` and `list` will display both lists. +* `list v/ e/` and `list` will display both vendor and event lists. ### Editing a Vendor or Event : `edit` @@ -187,12 +188,13 @@ Edits an existing vendor or event in EventTory. ### Assigning Vendors & Events: `assign` -Assigns vendors to events. +Assigns vendors to events and vice versa. #### Format: `assign INDEX` +#### Notes: * Assigns the vendor/event specified at `INDEX` to the current viewed event/vendor. - * The index refers to the index number shown in the assignable vendor/event list. + * The index refers to the index number shown in the **assignable** vendor/event list. * The index **must be a positive integer** 1, 2, 3, ... * The command only works when the user is viewing a vendor/event using the `view` command. Otherwise, the operation will fail. * If the specified vendor-event pair are already associated (assigned to each other), the operation will fail. @@ -203,12 +205,13 @@ Assigns vendors to events. ### Unassigning Vendors & Events: `unassign` -Unassigns vendors from events. +Unassigns vendors from events and vice versa. #### Format: `unassign INDEX` +#### Notes: * Unassigns the vendor/event specified at `INDEX` to the current viewed event/vendor. - * The index refers to the index number shown in the assigned vendor/event list. + * The index refers to the index number shown in the **assigned** vendor/event list. * The index **must be a positive integer** 1, 2, 3, ... * The command only works when the user is viewing a vendor/event using the `view` command. Otherwise, the operation will fail. * If the specified vendor-event pair are not already associated (not assigned to each other), the operation will fail. @@ -249,9 +252,9 @@ 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. -### Clearing all entries : `clear` +### Clearing All Entries : `clear` -Clears all entries from EventTory. +Clears all vendor and event entries from EventTory. #### Format: `clear` @@ -263,13 +266,13 @@ Exits the program. ### Saving Data -EventTory data is saved in the hard disk automatically after any command that changes the data. +EventTory data is saved in the hard disk automatically after any command that changes the data.
There is no need to save manually. ### Editing the Data File -EventTory data is saved automatically as a JSON file `[JAR file location]/data/eventTory.json`. -
Advanced users are welcome to update data directly by editing that data file. +EventTory data is saved automatically as a JSON file `[JAR file location]/data/eventTory.json`.
+Advanced users are welcome to update data directly by editing that data file. From 2f9a8c930fb1955b0e7fc11705d8d6ce93cdfdc0 Mon Sep 17 00:00:00 2001 From: Jabez Tho Date: Thu, 7 Nov 2024 19:25:56 +0800 Subject: [PATCH 28/69] Fix NITs --- docs/UserGuide.md | 4 +--- 1 file changed, 1 insertion(+), 3 deletions(-) diff --git a/docs/UserGuide.md b/docs/UserGuide.md index ee5d5ed45e9..e03630976e6 100644 --- a/docs/UserGuide.md +++ b/docs/UserGuide.md @@ -138,9 +138,7 @@ Views the details of a vendor or event. * Views the details of the vendor/event at the specified `INDEX`. * The index refers to the index number shown in the displayed vendor/event list. * The index **must be a positive integer** 1, 2, 3, ... -* The details page include assigned events/vendors as well as a list of assignable events/vendors. - * The vendor details also include name, phone number, description, and tags. - * The event details also include name, date, and tags. +* The details page includes assigned events/vendors as well as a list of assignable events/vendors. #### Examples: * `view v/2` will show the details of the 2nd vendor. From 6c310cce5298cb927bc85facab3a4ab576fb4540 Mon Sep 17 00:00:00 2001 From: C5hives Date: Thu, 7 Nov 2024 19:33:24 +0800 Subject: [PATCH 29/69] Fix minor errors --- docs/UserGuide.md | 43 ++++++++++++++++++++++--------------------- 1 file changed, 22 insertions(+), 21 deletions(-) diff --git a/docs/UserGuide.md b/docs/UserGuide.md index 30d1c3650fc..209caf7a7e0 100644 --- a/docs/UserGuide.md +++ b/docs/UserGuide.md @@ -129,23 +129,24 @@ Assigns vendors to events. * `view v/2` then `assign 1` will assign the 1st event to the current viewed vendor, which is the 2nd vendor. * `view e/1` then `assign 3` will assign the 3rd vendor to the current viewed event, which is the 1st event. -### Find items by keywords: `find` +### Searching for Vendors & Events: `find` -Finds vendors or events whose attributes contain any of the space separated keywords given. +Finds vendors or events whose attributes contain any of the space-separated keywords provided. -Format: `find v/KEYWORD [MORE_KEYWORDS]` or `find e/KEYWORD [MORE_KEYWORDS]` +#### Format: `find v/KEYWORD [MORE_KEYWORDS]` or `find e/KEYWORD [MORE_KEYWORDS]` -* The search is case-insensitive. e.g `hans` will match `Hans` -* Any partial matches will still be matched e.g. `han` will match `Hans` -* The order of the keywords does not matter. e.g. `Hans Bo` will match `Bo Hans` -* All attributes of the `Vendor` or `Event` are searched, ie. name, phone number, date, descriptions and tags. +#### Notes: +* The search is case-insensitive. e.g. `party` will match `Party` +* Any partial matches will still be matched e.g. `par` will match `party` +* The order of the keywords does not matter. e.g. `party birthday` will match `birthday party` +* All attributes of the `Vendor` or `Event` are searched, i.e. name, phone number, date, descriptions and tags. * Vendors and Events matching at least one keyword will be returned (i.e. `OR` search). - e.g. `Hans Bo` will return `Hans Gruber`, `Bo Yang` -* If no matches are found, no changes will be made to the current view, and a message will be shown to the user indicating that no vendors/events were found. + * e.g. `party wedding` will return `Birthday Party`, `John's Wedding` +* If no matches are found, the user will be informed and the current view will remain unchanged. -Examples: -* `find v/John` returns `john` and `John Doe` -* `find e/alex david` returns `Alex Yeoh`, `David Li`
+#### Examples: +* `find v/catering` returns `catering` and `Catering Solutions` +* `find e/party wedding` returns `Birthday Party` and `John's Wedding`
### Deleting a person : `delete` @@ -210,12 +211,12 @@ _Details coming soon ..._ ## 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 v/ KEYWORD [MORE_KEYWORDS] or e/ KEYWORD [MORE_KEYWORDS]`
e.g., `find v/James Jake`, `find e/Party at Alice's` -**List** | `list` -**Help** | `help` +| 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 v/KEYWORD [MORE_KEYWORDS] or e/KEYWORD [MORE_KEYWORDS]`
e.g., `find v/Catering Band`, `find e/Party Wedding` | +| **List** | `list` | +| **Help** | `help` | From 315eb9361a39f0a5475f86c899bbbec18906f535 Mon Sep 17 00:00:00 2001 From: Jabez Tho Date: Thu, 7 Nov 2024 19:35:58 +0800 Subject: [PATCH 30/69] Add in missing unassign and assign in view --- docs/DeveloperGuide.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docs/DeveloperGuide.md b/docs/DeveloperGuide.md index 6dccc664cc4..f6d7556b1d8 100644 --- a/docs/DeveloperGuide.md +++ b/docs/DeveloperGuide.md @@ -117,7 +117,7 @@ How the parsing works: How commands work: * `XYZEventCommand` and `XYZVendorCommand` classes (e.g., `CreateEventCommand`, `CreateVendorCommand`, ...) inherit from their respective abstract classes (e.g., `CreateCommand`). -* `ClearCommand`, `HelpCommand` and `ExitCommand` do not have corresponding `XYZEventCommand` and `XYZVendorCommand` classes. +* `ClearCommand`, `HelpCommand`, `ExitCommand`, `AssignCommand`, and `UnassignCommand` do not have corresponding `XYZEventCommand` and `XYZVendorCommand` classes. * `ListCommand` is not an abstract class. ### Model component From 85020c5174fec4fc6f3266a7267e0574546ef8df Mon Sep 17 00:00:00 2001 From: Kevin Pek Date: Thu, 7 Nov 2024 19:37:33 +0800 Subject: [PATCH 31/69] Rename address book to eventtory in developer docs for storage --- docs/DeveloperGuide.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docs/DeveloperGuide.md b/docs/DeveloperGuide.md index 95c3b5b2352..2df4f2c0cd3 100644 --- a/docs/DeveloperGuide.md +++ b/docs/DeveloperGuide.md @@ -144,7 +144,7 @@ The `Model` component, The `Storage` component, -* can save both address book data and user preference data in JSON format, and read them back into corresponding objects. +* can save both EventTory data and user preference data in JSON format, and read them back into corresponding objects. * inherits from both `EventToryStorage` 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`, for examples, see the JsonAdapted classes eg. `JsonAdaptedVendor`, `JsonAdapterEvent`) From b6b092185c63e59f2d1bb2e3d2f1cdc1a275e804 Mon Sep 17 00:00:00 2001 From: C5hives Date: Thu, 7 Nov 2024 19:59:36 +0800 Subject: [PATCH 32/69] Reorganise items for consistency --- docs/UserGuide.md | 112 +++++++++++++++++++++++----------------------- 1 file changed, 57 insertions(+), 55 deletions(-) diff --git a/docs/UserGuide.md b/docs/UserGuide.md index 1b7a1c7f499..a962cfc9a28 100644 --- a/docs/UserGuide.md +++ b/docs/UserGuide.md @@ -120,15 +120,7 @@ The details of what information can be stored for a vendor/event are as shown be * If you are using a PDF version of this document, be careful when copying and pasting commands that span multiple lines as space characters surrounding line-breaks may be omitted when copied over to the application.
-### Viewing Help : `help` - -Shows a message explaining how to access the help page. - -![help message](images/helpMessage.png) - -#### Format: `help` - -### Creating a Vendor or Event: `create` +### Creating Vendors & Events: `create` Creates a vendor or event in EventTory. @@ -146,46 +138,67 @@ If parameters are provided for the `v/` and `e/` flags, they will be ignored. * `create v/ n/Hong Lim Trading Pte. Ltd. p/67412943 d/Specialises in lighting effects. t/stage-crew` * `create e/ n/Jubilee Concert on/24 Jan 2025 t/annual` -### Listing Items : `list` - -Displays the list of vendors and/or events in EventTory. - -#### Format: `list [v/] [e/]` - -#### Notes: -* The list(s) displayed depends on whether the `v/` and/or `e/` prefix(es) is specified. -* If no prefixes are specified, both the vendor and event lists will be displayed. -* The prefixes can be specified in any order. -* If values are specified after the prefixes (e.g. `v/2`, `e/Party`), the value is ignored. - -#### Examples: -* `list v/` will display the list of vendors. -* `list e/` will display the list of events. -* `list v/ e/` and `list` will display both vendor and event lists. - -### Editing a Vendor or Event : `edit` +### Editing Vendors & Events : `edit` Edits an existing vendor or event in EventTory. -#### Format: +#### Format: * To edit a vendor: `edit v/INDEX [n/NAME] [p/PHONE] [d/DESCRIPTION] [t/TAG]…​` * To edit an event: `edit e/INDEX [n/NAME] [on/DATE] [t/TAG]…​` #### Notes: * Edits the vendor/event at the specified `INDEX`. - * The index refers to the index number shown in the vendor or event list. - * The index **must be a positive integer** 1, 2, 3, …​ + * The index refers to the index number shown in the vendor or event list. + * The index **must be a positive integer** 1, 2, 3, …​ * At least one of the optional fields must be provided. - * Editing an item but providing no new values is invalid. + * Editing an item but providing no new values is invalid. * The existing values will be updated to the input values. +* The operation will succeed even if the specified vendor/event is not visible onscreen. + * e.g. `edit v/1` is run after `view v/2`. Even though the 1st vendor will not be visible, it can still be edited. * When editing tags, the existing tags of the vendor/event will be **overridden**. - * Tags cannot be added cumulatively. - * You can remove all tags from a vendor/event by typing `t/` without specifying any tags after it. + * Tags cannot be added cumulatively. + * You can remove all tags from a vendor/event by typing `t/` without specifying any tags after it. #### Examples: * `edit v/1 p/58623042 ` : Edits the phone number of the 1st vendor to be `58623042`. * `edit e/2 n/Baby Shower t/` : Edits the name of the 2nd event to be `Baby Shower`, and clears all existing tags. +### Deleting Vendors & Events : `delete` + +Deletes a vendor or an event from EventTory. + +#### Format: `delete [v/INDEX]` or `delete [e/INDEX]` + +* Deletes the event or vendor at the specified `INDEX`. + * The index refers to the index number shown in the displayed event/vendor list respectively. + * The index **must be a positive integer** 1, 2, 3, ... + * The index for each vendor/event is relative and can change depending on previous operations. +* The operation will succeed even if the specified vendor/event is not visible onscreen. + * e.g. `delete v/1` is run after `view v/2`. Even though the 1st vendor will not be visible, it can still be specified for deletion. +* If the specified vendor/event is currently assigned to another event/vendor respectively, the operation will fail. +* If the current viewed vendor/event is deleted, the application will return you to the main list screen. + +#### Examples: +* `list` followed by `delete v/2` deletes the 2nd vendor in EventTory. +* `find e/Wedding` followed by `delete e/1` deletes the 1st event shown in the results of the `find` command. + +### Listing Vendors & Events : `list` + +Displays the list of vendors and/or events in EventTory. + +#### Format: `list [v/] [e/]` + +#### Notes: +* The list(s) displayed depends on whether the `v/` and/or `e/` prefix(es) is specified. +* If no prefixes are specified, both the vendor and event lists will be displayed. +* The prefixes can be specified in any order. +* If values are specified after the prefixes (e.g. `v/2`, `e/Party`), the value is ignored. + +#### Examples: +* `list v/` will display the list of vendors. +* `list e/` will display the list of events. +* `list v/ e/` and `list` will display both vendor and event lists. + ### Viewing Vendors & Events: `view` Views the details of a vendor or event. @@ -254,30 +267,19 @@ Finds vendors or events whose attributes contain any of the space-separated keyw * `find v/ catering` returns `catering` and `Catering Solutions` * `find e/ party wedding` returns `Birthday Party` and `John's Wedding`
-### Deleting Items : `delete` - -Deletes a vendor or an event from EventTory. +### Clearing All Entries : `clear` -#### Format: `delete [v/INDEX]` or `delete [e/INDEX]` +Clears all vendor and event entries from EventTory. -* Deletes the event or vendor at the specified `INDEX`. - * The index refers to the index number shown in the displayed event/vendor list respectively. - * The index **must be a positive integer** 1, 2, 3, ... - * The index for each vendor/event is relative and can change depending on previous operations. -* The operation will succeed even if the specified vendor/event is not visible onscreen. - * e.g. `delete v/1` is run after `view v/2`. Even though the 1st vendor will not be visible, it can still be specified for deletion. -* If the specified vendor/event is currently assigned to another event/vendor respectively, the operation will fail. -* If the current viewed vendor/event is deleted, the application will return you to the main list screen. +#### Format: `clear` -#### Examples: -* `list` followed by `delete v/2` deletes the 2nd vendor in EventTory. -* `find e/Wedding` followed by `delete e/1` deletes the 1st event shown in the results of the `find` command. +### Accessing Help : `help` -### Clearing All Entries : `clear` +Opens a window with instructions on how to access the help page. -Clears all vendor and event entries from EventTory. +![help message](images/helpMessage.png) -#### Format: `clear` +#### Format: `help` ### Exiting the program : `exit` @@ -329,12 +331,12 @@ Therefore, edit the data file only if you are confident that you can update it c | Action | Format, Examples | |--------------|---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------| | **Create** | -`create v/ n/VENDOR_NAME p/PHONE_NUMBER d/DESCRIPTION [t/TAG]…​` or,
-`create e/ n/EVENT_NAME on/DATE [t/TAG]…​`

e.g., `create e/ n/Graduation Party on/2025-12-10 t/smu` | -| **Assign** | `assign INDEX`
e.g. `assign 1` | -| **Unassign** | `unassign INDEX`
e.g. `unassign 1` | +| **Edit** | -`edit v/INDEX [n/VENDOR_NAME] [p/PHONE_NUMBER] [d/DESCRIPTION] [t/TAG]…​` or,
-`edit e/INDEX [n/EVENT_NAME] [on/DATE] [t/TAG]…​`

e.g., `edit v/2 n/PC Parts Trading d/Sells PC Parts` or,
`edit e/3 n/Hackathon on/2024-10-12` | +| **Delete** | `delete v/INDEX` or `delete e/INDEX`
e.g., `delete v/3`, `delete e/2` | | **List** | `list [v/] [e/]`
e.g. `list v/`, `list v/ e/` | | **View** | `view v/INDEX` or `view e/INDEX`
e.g. `view v/1` | -| **Delete** | `delete v/INDEX` or `delete e/INDEX`
e.g., `delete v/3`, `delete e/2` | -| **Edit** | -`edit v/INDEX [n/VENDOR_NAME] [p/PHONE_NUMBER] [d/DESCRIPTION] [t/TAG]…​` or,
-`edit e/INDEX [n/EVENT_NAME] [on/DATE] [t/TAG]…​`

e.g., `edit v/2 n/PC Parts Trading d/Sells PC Parts` or,
`edit e/3 n/Hackathon on/2024-10-12` | +| **Assign** | `assign INDEX`
e.g. `assign 1` | +| **Unassign** | `unassign INDEX`
e.g. `unassign 1` | | **Find** | -`find v/ KEYWORD [MORE_KEYWORDS]…` or,
-`find e/ KEYWORD [MORE_KEYWORDS]…`

e.g., `find v/ Catering Band`, `find e/ wedding banquet` | | **Clear** | `clear` | | **Help** | `help` | From 8e5e9771935ead2fd55f772052d387489436d8f8 Mon Sep 17 00:00:00 2001 From: C5hives Date: Thu, 7 Nov 2024 20:21:56 +0800 Subject: [PATCH 33/69] Update tags to accept a max of length 30 --- src/main/java/seedu/eventtory/model/commons/tag/Tag.java | 6 +++++- .../java/seedu/eventtory/model/commons/tag/TagTest.java | 3 +++ 2 files changed, 8 insertions(+), 1 deletion(-) diff --git a/src/main/java/seedu/eventtory/model/commons/tag/Tag.java b/src/main/java/seedu/eventtory/model/commons/tag/Tag.java index 1a5d512c9a1..1231780080a 100644 --- a/src/main/java/seedu/eventtory/model/commons/tag/Tag.java +++ b/src/main/java/seedu/eventtory/model/commons/tag/Tag.java @@ -11,8 +11,9 @@ public class Tag { public static final String MESSAGE_CONSTRAINTS = """ Tags can contain alphanumeric characters, hyphens '-', and underscores '_' only. - Tags cannot be made up of only hyphens '-' and underscores '_'."""; + Tags cannot be made up of only hyphens '-' and underscores '_' and can only be 30 characters max"""; public static final String VALIDATION_REGEX = "^(?=.*\\p{Alnum})[\\p{Alnum}_-]+$"; + public static final int MAXIMUM_LENGTH = 30; public final String tagName; @@ -31,6 +32,9 @@ public Tag(String tagName) { * Returns true if a given string is a valid tag name. */ public static boolean isValidTagName(String test) { + if (test.length() > MAXIMUM_LENGTH) { + return false; + } return test.matches(VALIDATION_REGEX); } diff --git a/src/test/java/seedu/eventtory/model/commons/tag/TagTest.java b/src/test/java/seedu/eventtory/model/commons/tag/TagTest.java index d10745542bb..5405ba1273d 100644 --- a/src/test/java/seedu/eventtory/model/commons/tag/TagTest.java +++ b/src/test/java/seedu/eventtory/model/commons/tag/TagTest.java @@ -28,6 +28,8 @@ public void isValidTagName() { assertFalse(() -> Tag.isValidTagName("-")); assertFalse(() -> Tag.isValidTagName("_")); assertFalse(() -> Tag.isValidTagName("-_")); + assertFalse(() -> Tag.isValidTagName("abcdefghijklmnopqrstuvwxyz12345")); // length 31, too long + assertFalse(() -> Tag.isValidTagName("abcdefghijklmnopqrstuvwxyz1234567890")); // length 36, too long // valid tags assertTrue(() -> Tag.isValidTagName("-tag")); @@ -37,6 +39,7 @@ public void isValidTagName() { assertTrue(() -> Tag.isValidTagName("tagname")); assertTrue(() -> Tag.isValidTagName("TAGNAME")); assertTrue(() -> Tag.isValidTagName("tagname")); + assertTrue(() -> Tag.isValidTagName("abcdefghijklmnopqrstuvwxyz1234")); // length 30, acceptable } @Test From 4d0e56002f2d30840e3f2140f0a40b82a627e94d Mon Sep 17 00:00:00 2001 From: C5hives Date: Thu, 7 Nov 2024 20:27:02 +0800 Subject: [PATCH 34/69] Make find example more explicit --- docs/UserGuide.md | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/docs/UserGuide.md b/docs/UserGuide.md index a962cfc9a28..ae828652071 100644 --- a/docs/UserGuide.md +++ b/docs/UserGuide.md @@ -257,7 +257,8 @@ Finds vendors or events whose attributes contain any of the space-separated keyw #### Notes: * The search is case-insensitive. e.g. `party` will match `Party` * Any partial matches will still be matched e.g. `par` will match `party` -* The order of the keywords does not matter. e.g. `party birthday` will match `birthday party` +* The order of the keywords does not matter. + * e.g. searching with keywords `party birthday` will match result `birthday party` * All attributes of the `Vendor` or `Event` are searched, i.e. name, phone number, date, descriptions and tags. * Vendors and Events matching at least one keyword will be returned (i.e. `OR` search). * e.g. `party wedding` will return `Birthday Party`, `John's Wedding` From 0003a34197beb8c3fc985673fd1c2d049a58f6ab Mon Sep 17 00:00:00 2001 From: C5hives Date: Thu, 7 Nov 2024 20:43:38 +0800 Subject: [PATCH 35/69] Update user guide with more information --- docs/UserGuide.md | 43 ++++++++++++++++++++++++++++++++++++++++--- 1 file changed, 40 insertions(+), 3 deletions(-) diff --git a/docs/UserGuide.md b/docs/UserGuide.md index ae828652071..3ead0f6c4ad 100644 --- a/docs/UserGuide.md +++ b/docs/UserGuide.md @@ -75,6 +75,37 @@ The details of what information can be stored for a vendor/event are as shown be * **Tags** (if applicable) : Metadata used to classify the event * Multiple events can be stored in EventTory. +## Vendor & Event Fields + +The input fields of vendors and events have varying constraints and are as listed below. Note that leading and trailing whitespaces in inputs will be removed. + +### Name + +Names must start with an alphanumeric character and must not contain `/`. + +### Phone Number + +Phone numbers should only contain numbers, and it should be at least 3 digits long. + +### Description + +Descriptions can take in any characters but cannot be blank. + +### Date + +Date inputs can be in any of the following formats: +1. `dd-MM-uuuu` +2. `uuuu-MM-dd` +3. `dd MMM uuuu` +4. `dd MMMM uuuu` + +`uuuu` is equivalent to `yyyy` denoting the year in a date. + +### Tags + +Tags can contain alphanumeric characters, hyphens `-`, and underscores `_` only, but cannot be made up of only hyphens `-` and underscores `_`.
+Tags also only accepts a **maximum** of 30 characters. + ## Features @@ -117,6 +148,10 @@ The details of what information can be stored for a vendor/event are as shown be

+* The `view`, `edit` and `delete` commands support off-screen operations. Even when vendors/events are not currently displayed, they can still be selected by `view`, `edit` and `delete` commands. + * This is a feature, not a bug. +

+ * If you are using a PDF version of this document, be careful when copying and pasting commands that span multiple lines as space characters surrounding line-breaks may be omitted when copied over to the application. @@ -153,7 +188,7 @@ Edits an existing vendor or event in EventTory. * At least one of the optional fields must be provided. * Editing an item but providing no new values is invalid. * The existing values will be updated to the input values. -* The operation will succeed even if the specified vendor/event is not visible onscreen. +* The operation will succeed even if the specified vendor/event is not visible on screen. * e.g. `edit v/1` is run after `view v/2`. Even though the 1st vendor will not be visible, it can still be edited. * When editing tags, the existing tags of the vendor/event will be **overridden**. * Tags cannot be added cumulatively. @@ -173,7 +208,7 @@ Deletes a vendor or an event from EventTory. * The index refers to the index number shown in the displayed event/vendor list respectively. * The index **must be a positive integer** 1, 2, 3, ... * The index for each vendor/event is relative and can change depending on previous operations. -* The operation will succeed even if the specified vendor/event is not visible onscreen. +* The operation will succeed even if the specified vendor/event is not visible on screen. * e.g. `delete v/1` is run after `view v/2`. Even though the 1st vendor will not be visible, it can still be specified for deletion. * If the specified vendor/event is currently assigned to another event/vendor respectively, the operation will fail. * If the current viewed vendor/event is deleted, the application will return you to the main list screen. @@ -209,6 +244,8 @@ Views the details of a vendor or event. * The index refers to the index number shown in the displayed vendor/event list. * The index **must be a positive integer** 1, 2, 3, ... * The details page includes assigned events/vendors as well as a list of assignable events/vendors. +* The operation will succeed even if the specified vendor/event is not visible on screen. + * e.g. `view v/2` can be run after `view v/1`. Even though the 1st vendor will not be visible when viewing the 2nd vendor, it can still be accessed and viewed. #### Examples: * `view v/2` will show the details of the 2nd vendor. @@ -341,4 +378,4 @@ Therefore, edit the data file only if you are confident that you can update it c | **Find** | -`find v/ KEYWORD [MORE_KEYWORDS]…` or,
-`find e/ KEYWORD [MORE_KEYWORDS]…`

e.g., `find v/ Catering Band`, `find e/ wedding banquet` | | **Clear** | `clear` | | **Help** | `help` | -| **Exit** | `exit` | +| **Exit** | `exit` | \ No newline at end of file From 9be415f78bfe1342fb4154ade5ece68195c62c32 Mon Sep 17 00:00:00 2001 From: C5hives Date: Thu, 7 Nov 2024 20:48:01 +0800 Subject: [PATCH 36/69] Fix checkstyle issues --- docs/DeveloperGuide.md | 10 +++++----- docs/UserGuide.md | 6 +++--- 2 files changed, 8 insertions(+), 8 deletions(-) diff --git a/docs/DeveloperGuide.md b/docs/DeveloperGuide.md index f6d7556b1d8..7b4ff86356e 100644 --- a/docs/DeveloperGuide.md +++ b/docs/DeveloperGuide.md @@ -102,9 +102,9 @@ The sequence diagram below illustrates the interactions within the `Logic` compo How the `Logic` component works: 1. When `Logic` is called upon to execute a command, it is passed to an `EventToryParser` object which in turn creates a parser that matches the command (e.g., `DeleteCommandParser`) and uses it to parse the command. -2. This results in a `Command` object (more precisely, an object of one of its subclasses e.g., `DeleteEventCommand`) which is executed by the `LogicManager`. +2. This results in a `Command` object (more precisely, an object of one of its subclasses e.g., `DeleteEventCommand`) which is executed by the `LogicManager`. 3. The command can communicate with the `Model` when it is executed (e.g. to delete an event).
- Note that although this is shown as a single step in the diagram above (for simplicity), in the code it can take several interactions (between the command object and the `Model`) to achieve. + Note that although this is shown as a single step in the diagram above (for simplicity), in the code it can take several interactions (between the command object and the `Model`) to achieve. 4. 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: @@ -357,9 +357,9 @@ Priorities: High (must have) - `* * *`, Medium (nice to have) - `* *`, Low (unli --- -**Use case: UC02 - Assign a vendor to an event** +**Use case: UC02 - Assign a vendor to an event** -**MSS** +**MSS** 1. User enters command to assign a vendor to an event. 2. System assigns the vendor to the event. @@ -399,7 +399,7 @@ Priorities: High (must have) - `* * *`, Medium (nice to have) - `* *`, Low (unli 1. Should work on any _mainstream OS_ as long as it has Java `17` or above installed. 2. Should be able to hold up to 100 events and 1000 vendors without a noticeable sluggishness in performance for typical usage. -3. Should be able to assign up to 100 vendors to an event without any issue. +3. Should be able to assign up to 100 vendors to an event without any issue. 4. A user with an 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. 5. Persistent data stored by the system should be in a human-readable format. diff --git a/docs/UserGuide.md b/docs/UserGuide.md index 3ead0f6c4ad..3677b45f79b 100644 --- a/docs/UserGuide.md +++ b/docs/UserGuide.md @@ -36,7 +36,7 @@ If you can type fast, EventTory can get your **event management tasks** done fas * `create v/ n/Hong Lim Trading Pte. Ltd. p/67412943 d/Specialises in lighting effects. t/stage-crew` : Creates a vendor named `Hong Lim Trading Pte. Ltd.` and saves in the application. * `assign v/1 e/2` : Assigns the 1st vendor in the vendor list to the 2nd event in the event list. - + * `view e/4` : View more information about the 4th event in the event list. * `delete v/1` : Deletes the 1st vendor shown in the vendor list. @@ -143,7 +143,7 @@ Tags also only accepts a **maximum** of 30 characters.

-* If additional parameters are supplied for commands that do not use said parameters, they will be ignored as well. +* If additional parameters are supplied for commands that do not use said parameters, they will be ignored as well. * e.g. if the command specifies `list v/ e/ n/NAME`, where the `NAME` parameter is not used for the `list` command, it will be interpreted as `list v/ e/`.

@@ -378,4 +378,4 @@ Therefore, edit the data file only if you are confident that you can update it c | **Find** | -`find v/ KEYWORD [MORE_KEYWORDS]…` or,
-`find e/ KEYWORD [MORE_KEYWORDS]…`

e.g., `find v/ Catering Band`, `find e/ wedding banquet` | | **Clear** | `clear` | | **Help** | `help` | -| **Exit** | `exit` | \ No newline at end of file +| **Exit** | `exit` | From fe4c5515b5f9c1263a20412a104ba3afeeb44bc8 Mon Sep 17 00:00:00 2001 From: C5hives Date: Thu, 7 Nov 2024 21:00:35 +0800 Subject: [PATCH 37/69] Replace ui markup with actual ui --- docs/images/Ui.png | Bin 165112 -> 87585 bytes 1 file changed, 0 insertions(+), 0 deletions(-) diff --git a/docs/images/Ui.png b/docs/images/Ui.png index fb5c99e74ea16cfd0731eb9b2e5f44a66852aac0..3be732a776bacebd118846a35fd2051aafc48b7c 100644 GIT binary patch literal 87585 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

  • fo<&UDJ^kCNZA-MhvV$DHg$bR z1lNy@{PjqMm`5^cBVlKb!ddb^nKM|DC2}=S7S@v&j2vP#GqNoP1e#`67f1VS^l0XI z;PS|17X5VLknls%A$rcix?_g@g_`6jb2B+w`KFZz$77@_Jsu@!gkVzaVbfjEQWY*1IR#k_g=`-twRt&7p?VPrc^d ztvK)?IA<^%bP@NJJsF@E?8mAOp;%UZ#yI5C)H8ElC)Tf>ns(O6AIsF;RdqDP=yMS7VeZ?T7$)O@Yx^(% z{wr^Nvj_EdC!PPDwzb3tFt+=I<(!>mTgnVv?hZZq#*rU<9@Y^+*W;gFxX;igwZRh- z;h0B4@bVskA@;G!*ce;h!#Cf~<6sg``zvl_uHBFi`zKN35sq5~IU1e$eNz03=Ufl7 z_i7cHbDi*{h&UO{b~@~QIP$$uPMDt@+fN$S$tJki+SL3Itoc`d_Jowb#M(eqIIH#T z?i>win9}Zm`fC~I4t<3*zfZ)ABSWKbg9XJp-0ORe`&7J9S@=SZ>zD`59A9RiI{sS^;d37;W$;HVakX10$Lr)QoKLI)P- zIY^||=R)clR#sFcwnrO-;$dnUIy4o(N!r~EAi)yMFMq^tY89p-R;0BLDd|#(;uE%) zOyD=Z#prd3V4=v$IWzv9i?}>6`ShbNlfR%*e+p4w|MqqL%pcFn4}J62&sdaSpA(%g zDa>2D0x2jex>%$f*8WOEa62*h#5%pXM=sFgKy7MR%Fx=aeGl;Rfw6A6Z@K+roE^=; zbE7ql>Uvmz<15eZRpqrdXU4 zy3sr0^E)>1L{Il(E#OP~z2vlL<|M|yMZIm~@#+lPhG7rrAd(8yc3?uQOEPlM(2sZzRPx9g!+v}})d?&Lc6V0s?#I9q!f?i>% zC9mahQd>>}I_b)0o)>?p?tdH;(d{~arzIs}Lrt=Ad!;@8o9WhLIOo_-6rOFep#;iiI<|)p{Ki{_q6_0s!sjek`)@v@R!@zjsiRN;~?m|`Q zP({_qLSD=W>_lJwlZE@G`vSp{fy8T5DT?3iV$b@-(L4l+_=6Wk$s|YQXtCq36^< z1IfPGJ~E-ER2Y$JbOAHC9A_?T#vUNS6_$f~rRKT;Nkoj~*2HtuQ5(y^pPNHfj`*4^ zIBBPxiy9!QeCIg|I!pW{Hea*w^Xk?b`-V0J*Yk6bl~0a=Le7&N?ICKJF}#W(p<%-0 ziUzvAFQ<7C&h`B<8lC!q<^LL2 zeDMLumtu#h#}9a`souoAjX3?~#1K`Yl>V<&LuPypmZWjPN9BO>scJmLRmFK$#g@8zq>I*Bv?fj@14jUf#!188*hXS;_NKFNPsY}7)t9m#^ik-O3S1nE)VQ9 z0}V>-!zI_`DFlpF^@D_aXX@dH1>1_71EzmU%qOWbGn&sUnL*Z9L(j)s! z5K&WAHY*pNnK<-140A`oBvpi+E2=Sj>a;q3t*LW&E>0U6FmkB(6ABxH1IfSUts!h~`<^V@#;$n?L(=%@kD@7L?`h z=*H9~<=M%Z%@i&iN(>_X!4rQHbj%CD^Mj|`NojY>0NY1i;$Wxg)#}b~FSAJ=KN@QsG z&XnefKoU@|IQm}!C$BmjL2tl+Jifbk6CT=&2C+nI78??)G+&7xzLY(ZV9=c32+}Th zb_T1r1|XO~sldh&M#N@j8PR zL<=W(ys$qxksNb&*%}SaEiRGx-&7H8;SG{^rhn-+)S@m9^7UJqQM0E2YXf?kDw&TX zUWY3Kea3C$+e-@zy?KFG!id0q30G=9yOn58E?4(S{hZuIV3cF>`QP3qR|=n3E#Hz&U|vh$N9%5{O9g4d98ZYN+3YD&6r!j2LIsM+cL*(cT4qyMK8qh39I-w@hhL; z6Wi)|7Vg7}U#=JkJ_Sl73SR^Gg_BT*SZ2&@4%Q@zl4mNpRCV?!2(*Y7tXewt|N8wqDY=$p z_X!BARR827p)TR!{vC?=w=gj~^wUJ8J@(5G)Y*;<#^H2{t*ff$ul2w~D$;x9bhgZhTVQ|2{Hwo|fomG-T$_y5evtgy1c0At z-Hr=yY=oGfuW!xSRAmk75-a|zClGCrS~DzP&o_laAi6KeoQZd~7q&MC<2$%n80qDt zD2l-HlN-B+@!^CV0lyp3U>KghfWh?0&GK~DN4ulBVR)L4QkA_?+v!%{6E-j z$%GS>vnyyBj@1i|wx%XWF4nuYL@%hZF*G96g!aLkgc&{Ci^Lw_$Oxtb>R`Hb8ZGJ& zG^4Es0nYY4>YBb~Zpm2r=Nni^ByxoIVVD{a{LP^Njx-4GwDld@-XFmT& z4*J-JX%xUJ5AbnH$UIuCP9Bi<=1I~}N~ zt@95j$Lphm-F9;cVwRGaXaOpWlm;y($~TC`0tS!YG)Dta3SHn+C^ zX&+Dt^JrJhL`_zDtlcBas%`nPvfX)U({eajS+Jn16!^x;*sQy?`JF9LyKVG@SJ_tr zwXr zf2_iXbI+1??G{(qX-X|Gf@>I#wx<(n+&uO+9Rq_nQU^jR|D#aB%WK+eH$sCU@sSOBcvD3Uziar${rQo{HBwvKT+4iTe(SX1Ck;J;ZT-RDzhf$GNw8Sq_ABn3f04R7QgC~!n4ghRn%&nX{uGt1IK}mkv3gTm1INi%{xg)sU&Heu zf}4WNtVR03>45+pI??EH15tJLSbAsFW#@oGA2XdH-=M|m<2ZyA5d~w00E+}mJRi)j zzXX3M@qFL*0nd2t_NRmd!$a-gJ+7mmJp+m3#t11HndtQI%y-J~IuDTLI~JC}v47?4 z6m)*D#Rxmd)HE?s0m;*}2kHhvya14Q<{w%}ncNOH)m)3fF*a*t^tlcH*$i~mfz5@= zX^NR55Z!y?Qr=>CGO``u43b#~GBPJjgNtO-45NV~QoUmQ%^-(%cBp6Wc!`amDXjo` zU@WtqhkQ3FaXyOc-dODX>^$BERh`Ig`4iMh4^Kh9fk(s!{D(ViUp5R&cJn|GN@r+Q z#2Ot&it@chFYtwsx)joF)fMeY(Ps zoJC16SEaP@CtC~Bx8%L5bZ03LfGaDu8}DsK*QBYb#-&|{4eL~`;NjP~BcH&+)4R&$ zD3uBlQAP?2j&|+!?d=`z7j!WlRen>94GVH`?~2g@Z!@@qB)|R8OziCF2d6w*XL+f4 z$h|Y2P(0`9I3X!xi|&vM$N&QF?#q4QRC*K=eGXcpfK30_NiEL7uYb9zN1Lt_bj_l8 z_Pfh*b1Bi=)2lrjPSQe=X{&V5!C=-O!NBFRJbARBLL?JB1s5C}E+_a|0OgZ>rQE3gzl4=M5H7_VHy=E!gtABKf~NQ;c2 z&!YjiFXKx=vcHdKQFcGxl?>iKifDTb`;N9um&NY^cfNk6Tck6_Z!N_pzhrrd_}#|M zMb7PJA{WrQzb^>&4n%o0glm0}Mc?tKrH{HH?3X27B(H$6xdm&vVw%WwYY(qz&WzMG z%a;PC583dkV&A@fi#)cc@?LRub9O$7Vjtcm*%E@CI=L3JF%`w_#3lg|5fSk{>08<$ zC6ZxR{9JPwNku~9!{CaIO>7GpnNf7!peXkJU$wn;RFq%e_H7|5CDN@TEnU(g-3>Al zDvXqbgp@EMN{7JE-JK3yA|;(84bt5m1MeRA-Pd*9Yu(SY-gmvvv;WcsYdFt6``qVu z?|poZ!{2}2MGp3K@HK!U^i=e)dvF#5a<&b_s4?a0Zy2QAfClJAtf6mUjB;(sLPkvq z3Z35{^7mC=8#yzS3ep)oR3yK+@ba$)pk9#7Fxck=zE}QO+#Z-jRUcQmKK%OHmnwbY zc)(9?;keli5KtIE3DuPnMcwMpb~>hDVuGrNYk2@}9FUH% z2?qqSp++y^mP$9|ON>A`xV%8OJdrwmEdExf^usw#SV`k1;^ z>!~_V7hK$p$#lEO#1i+EootOvtD5B&fbOl+j1}(K13KYkft`Nqd&59kI$e56*T#gH z!^)tX80#(G@2y77!{(S=XJ6OaHE){rV2wI%J*g?>bzRJmPA{#a+JC!@z5Ibb*8Nh_fTHFIbWV@Z3@l-Zg}D)KB08 z35aKgEgKVaS5u;v+<`s2{u|e9Dt}!|82{DS-|>TT8N?n@c$zg>89w)3mqnO(p%J$I1h$`P1_R9 z!xjwhy{@e*!gMJNo94~snj#_K%|Dq(&$<6iaHGp%bo>AA3IA`DsqP_EoPu`Wn^H9H`M%NPO%R}Rau<#QgA9WE!Jlm zGp5VDz|9>JPKM-J{&{tUdq9%%%&qE?^IDh2yVjOqa$c($_WA|WRlVLq>rQ>g?tWs3 zC$P9hghsn5h1sxqOI|`nNnN(wWT~3WKvx|-cns(WvtmTv87R6~3k5TCR$@X+N|*?& z$-{XxbIlu`jh>@iRtrbf=I(Cm5K#)`0CWD!-U$(Ed-?i#Ik2Rb38L&8aeba^p3*b) zNp91Qx<*FqrCPA{;mn862Rh&9mc(5~0-WHfn9KWrQLsUCs=m#XZTwKO=rO=RWUNRt zD`w>2IXC&07+u`m(VW>CAKVB$%{H1#s%;C#{z(`Z(v z&jOeYGn!2Yd?SbjH@3U=`;^*681w{+uFytQx(%C7U^%vY+lxx*W6~4(^?u^b8AFQt z)OUkK$fuu{bxoqDBP@ju*L%{>!YF!$!X2TgvyMX7%IjFTxG7FqjcT*>>ZfQ4qHA&s zA$2?(nGIA632Z+TfDtz0E)}^}UCovf^T73f`th6jRA@V645j~WXH0Z?Q;2t<&VD2E z0z8ANWm`Z~8~3{REp1zX1dTf)fQ#7MlgOkyN>5*-7N{Q$<|5Eu>z}OGO6B0cSe+M* zsHx?m?=m=Os`wkVJ_(11x8aEC7iZ*Dd3EqPk>qN_#GxyGC0rxEwe9UWz~lI-tC~@g z(PC*oKp#B0)B8(y0NMfMt7yAth5}$itDGRLl$+(zxE*J2YX2Gj_X8f!ZOPCo`sbSNJXUDyd^Fpfop-!p+vzEi?!@pr97fmL(&J+^>MDKL6>3H2VbI1YY;0 z4$7*d(q_~u;LHlnq*m9IyEk_vNBvEfabOJSs_Cqkr}BP~sbxprhY>YP9J5+02bvLB z#{1zBT=pp&1?bZQx$b{q6&4)@$xnj{EhavkV&|_sNcn0Ge7cKQK1;iQuv)&qs0sh2 z6l;q`r#$8eRrAZr*HHUX4jx{Fd=U2_NXY`T z;}}{DHa8-}6PBn+84GtMrM$-Uifr-m#N&jgrJW!72;tpXV`h)+GcYxTpQ}AEP2AsC z$K0V3gj?4?!pod1p)P;Fl3t^tlb1XR7z)iG>%m!tSGF9FWa!iu_?%nf;hBB9F`N!5 z+PM;$LE3F&{g=1+w`5V7tL0Eq?WAeIIzWBVdGR#<=!P2Y?DqSu*HWl>{c!<0zThs` z&laZah(eg<8QZ3+C?3hDzvn{02-@$X2y{kC*!24)XkaCKz0-M%x_x|5G;fQ|G(4_5 z#Kjf3^*ZHq3%KG@sx6jGRc|K!z|w}p`-S#DO6-Y)GL z@)=5%=^+-Tm)F-j3Ucm-L9jzw-PXOH&hw2}EXI%uz#No1C^dN!m0}P%xC0AajW4bI zs_3o}o_`1x*T}di&fB{+wb5LiAUvzwUTDf%s(Z4`T(`>%%%cH6kkP3G9@N&J+1uHi z``TLTe>b>9l&7;^i#cE>o>EBj3DD+vyH3)k))lbYCN*amf&UXunU82;U@^ccyS!-A9(#5gyibuRBays&v_t$rQXqjXm4zN zIK$P_8iK>am7<+Aax01k9;BoXIs%2Q=8)!U>&qRH$?~2!zwDfANrC_Dh|J%XcrXLZ z)MI`ee%3}x3QL8>1rHe@1dEF(Lrv`DWW*pn@30>k-k2HkJiJiLb&#z0Z)v6Eqh<|8 z!pTDFUiq=E&z8S0aKymGY`bm$P*08*fO`A;%SRirxCOz1wS02QzIj^NW$!1%D`$o| zwI$c4iJ};_c5dlZ0H2u1D>-xq{7hoP_Jn8<}pU6T@Hs?sGX5+50c#f(M+nCD=#ugJeJn)#sl_(^)4m z()kAis#0RUv5Ty73_T8%$(3Q4PCYbCz2RN{7FqQ*w{T9YKR?X6YBxau5iyf?E8s^( z-zZk zzYauB>@P1#_%=CCne<1xw$qpvhZwgc19GX%8dlIa4f_v<%(epvsMXsWhJ4Tfnj!5B zL$xXnasb^=bWo^mBYJwEyqeSpDQdG=+S`p8aCsl(8vxZX{Jd?e?(|Vu*^E|b&CllP zZHN4pHU@JLQYmtIAq!~$yZfQNr9snpX}LeGRlvx~0s{v9*&K@vu7ZvmP2pd;3cx!O zOk$T#?y4Oi76QJh_CPipi;m;OM3!2eAQs&DI=`?>-ghoGw$%>`?J-Brv3pfO-fkIB z(4A8HhJae88|r(r?(?2E_O;&ISAOwLqHO|ku%@9*BUu|q%Msq4sy|faJ-s<>$yYol zX)dnmoX#xwV?HAUIt?Y$5lH7j=R)h@H#O>HbQ6KWRqw&&5iQ@`l~Z~Z=I!Jp0XG4Q6`%_e0gr5@Y+rC>q$6Q2!t$%;1R+$7gTW( zy#<+yHNFqhHr;=x;goN-hf=6t19g+PEm0{ROAQu;jzKnUG68mQ*I?|-1Fq;=c1B%^Ymlb4wo7d%4F6 zsx@>dLAUU>_Ez65{oS0N5a&ds-fMo6gS=6ji?}i5QzFh1wc5;VpgP8Ltrffwh?Y-Bo2X03j{F92P>5X6IPYvh#aTDzMUBIb5@9D0 zr|)Qks&AfcZ=0aqd@YmAo(^IF$6uk%9A45t_*+CrSA3!&Lq-Ty;&V0T!?c=GtX~bB zI^$q;PdXZJJHV$||-ID}t&L?mZ4D=omkSf@|Wy>0g?6g6+ zsL}1xID}Uv@u`lX19<;2Mi;8^)$RF!3-CeweNp*c)dDK-|Sd{msBcC9lI zn$GC|<;X-w4rAZjk`Bd<90CGu&_`Xh#@Kq|OsW^|wflG$V6#rAA|aqsKvB*3tw_qH z*LkVNpn|eFD~dZ3qnay|S@X}mrkp@$4|l)E>CWqdhdY<<=XB%`Bbf*H|rwF>f# z%+0tZVyfG(De8?25bvcB^0_#3*-0thjzSlvn?G~O@qo2e5{6${>|bz@!1jzkj1!3U zf|Wh!LwuLQ@a=Tp@j}Gk=}HnKT-AKq&XKfSwwQzRrQ%l#cuDX!Ou|TAQ-E!fO;wb>MGAV;@&Q2Yiw$s9KXT-? zzl&&>ko-kUvVZJbnFrP8Y7l|$n&@#Si|l@zU;Z#A-~ zgr@28U+prl(#Nzgj~xr*pl@WJl-HI~tUAB|EKtxXRDnHFz@=&tEDJh;-jecu7CmKz z=97;t61p7;9S}aFFS4%(U09JHK7CNEiMC4~9@`k-mxPtd?w|0{dwQ1x-TQHXw;{>C zD5sp&?>P1qTaI;xkT(`z7Qp7kkc|2xn~hbK8oqYhXJ?+#B!h_&Rv0;4PA&pi=xh1* z`-;6g{#(*O8@j$Y4R%tnI`ZH6)wx&2HO2Y*_!~8}`FbpG3R8$#G`r+SM2(p`2W`wm zm3@K5_@5w@f;e~>6R4`pp%%9lI9%RJV4_Ul6G!V)U`{}OtVb*}cZmR%yjg_tWjSRk zbm^^bRn*X^pd`pRcAuSh`A$5L)s7wCQw7ebGWDw>?7X}lB;3}qhx&Y_JUC89%}+kW z%cIQPb1TX&5Tva z43cKkdRXbd8LiZ+ULhv2oSS!kO1lgswCAl^$lb*>mSXNr`PeMc3***Ea|Fm+ zKPns%F+KikS8g?&)T}u88yVL<2u$5uW${2);{8CMDk|88m}u-J$&vALT7C&V zXgd3vy^81E)*-`3(mIIfF@Ks8)G*LL92XYd%sh4}$I7lY+Ki)4VFVn-Bzfr@xwAZz z*{Knd54(fTA@Cpi<>x9M03=`&owvS}&~wpuCynnciTnuf`e9PTvs79ltIR&%V8FT3 zY=PUEQ1$T5N~_r${#rhWZ|(ZRh)lhF#XeFp#5X&yCxE;*?C<5`J}KXph3rR?WMiCl zZ>*K(8{4<98@feC-cCmz)-eW>Qf5lF1mUtyAf#$Z!=n?lNjY4cRP~&a)SdpWPML*N40!&Wi$X9$A^a`MWgT@S*WU zhHzsdOY}JumDBm9*S#%7-abmbNQ5Ewq^)Pt7&X2yJni=Qg?Dj~j2= z1;Lp-t;hGjy0=T}7ioK3UidZBarqYV6(r38Nh@i1m%lQ_v$Q{B){o5<{j!51-$y?q zrOL;g9DipBEaG@dlFb*rzGm+dG&L7vghhli#{OX#Kj}dfQ8>DvPX+6V=Ry@G=)1pQ zqR0E^vUc!HYr1N)m`VP56IM+rm?8P3rP+7pr>phdr^6wsb2L3VH)MjB*jA*2;;0~H zW(sl#A?kF99;cATTY)qwlRoJov_#99qcBT4_Aw4JDUPbzv0Eu&u(P5E_UpZ`L-OeY zD@73Y1Ak`LrkFkhH5&X^G`*sdALDpAr(s*_U+*kHrv#S8VD`b?(iG*^Tz}9R83QB# z8lLr+-pl+xL59brJ^^arZGi`|$wys*=dqT?2E?scgou#P}Yj zSmn1w%`$dgC|#)z{JQm19R_ly@yO&o0s<%FTU~DJ1t4NUqjP~w=C{XS_Ui6C6sKj1 zOZiw(;e*9ZomJ$|u1qN$(VmwP=@DQie<7H7R~Y+zLKsy=Cis!d$q@wXuFzO|3eHTP zVd|aJ4ZV98ijiA-dxGYZf;fffuS6wtHz3b1%b9*J<>sK~R=WT2NE+m;NXAi}iPQ*X z@jqHULEv@rG27L?Y{oLDxR+5-HLWP6ucRiS74}6m^GDq0?e`0o4ctPz`=4s|!kJ_}>DPH>(-bzdMrir~wN%X&**u9X(f)q@zOE)q=`*I+3bh9VnFd3hck3F}-p=lQcgV_o+nqN)dfSH`pQ+kV*! zsfbFwjS5Y!bIKD>n2rRApTcM78pi?xVl`1=ypLUXEAWn;4RhV~RbG3znJ13Gi0@&ww zs^Kf5_4{P^G9tJHMiWnH2&Jwqe1GcUD*|~t8%dsgpqy;0py0Zzy+GavpF{%TzP}Q= zIn&W-n0I%?S{^Hk3>^^QKQld~MPZtmj=959mwsOeHJ#^tQ|e8Nr*2|*)K6rYfLDT& z-;4KLn3%4~Fly?_1S+b``w3jimJ|x!#oW~GkORFxC1eCm%1D>p;+N#Qo3dUcKvr6v zuvAE#Z7|hhY(xE@Wg|q{Un$)^4CMKs<{daKwEvC|B|2Hc=WUKKx!JSCSSRjjLbvv8 ziG{EIOgG^nFAb%N)dGSo@CxmH!Q*fv_+u@mi~W{{|4H`4P7TQ{Uf@KJZ@0yEqNU$F zby4{cV%y*j!L_0%MjSvC*q)iQ-=m-PjY*x#;ng19uTyU_v&xHQrnSFB9?b}Dj5WXG zmx_R}%bUBQQ%HW5(RWVeYUgx;JO-%X>XRtZ6*&Tt`|Gl$T#i;qJd!(+P;u?{he$^a z$K6lOAZp;kXmI7&uHVw-ery&NE`Xt9u=wNhfsj8Ca`Rem=TdN}V=M0D}_U`?njO9De$ySb!nzpMl%2S z?eD+a4ba&<4JyCnxgVVPuJTv^X{isj^dbFW<^KG<+nu&~K=&Y1+3*x&|6}u#!>)HW zo~poiL5GRk>8Ei+7eXsb4I!ScCN;&TZ1bcwLY0QhJZORc{Z}t{{V1N!AS8bas4R_R z;F$*pGASnRFFDpOrf1M^yMIpn7EcFpj^a4 zy9Ef}6*o7bI?Ys^nB5jw*M@ipW@5EN<89V=DbfY>M)V9O53VIO+uEV&&d-0^xyX_z zUonPa5BTVISgA*xgN?N@ZR!nirf6J#1=YIvW4%x9F#%sgb{`9{FK3<|%_J?er*Eve zE_Oa|zR%;RoT#MIsS?EpJE;0O*lL92gP&2#f?~9C8N%FHt&xqfJ;jFXYB;t|3W!L$wJ+tP74D`lD|jvgebn{ze;R3T00}K=vTe;BT*`@uUGI{B}*fGXZeSsBdVrb(x54Gt}Z{AInlRaknEd(LPCr*=W4#LHW61nizXGxTe z9ag$KdzT_Sz|wVjVmxw9gY}tT6K*MCAQFes$qw%}od9Ri>&1lk#akV&hHz=@AdSaN zUj0h12L08dm(9LiPxZ!Z{)Wl?4YTe%kWb)z|G>7`PiWv}`w2vdZ&9hN>-gi3qYqmz zhkKYOk26@>Jei<8ZG(K-G%SN;Y6s{LFptQV(rGR%E%D^u0qBQMR(JpSuClvV5`eItA1-ujNAM(t!5>n4zg==<%J6HoCVqg&-ZNh`4;L_6g@B++J7Y~YvG z`0+7J%oZa*g4H4R8CW|fVO;Gv`?NV}DI_-qgU470 zxRG-#ZiN(dyEkR-dP?hP=%f?nMVo`ThQQ&bj8utMxKC5XGc`)5O;!&KAzS#_?6Lgc zCHx7giQgeVBs%yknc76vbG{ysvD-!^ZA&0l9he2wL)>#vL)tqfID%#~@g%ompWE*Q z(`bJwpdx>&tl1wmCZWJ@$=ZD$e`6_;QqH7@=Z(3#F*D&}Md|J3>ZeDyGX5xrBaX#a( zYc`O25BbI~Fl59>l(o%y&Nn{ z#Lh{xLIiWFsBT2e{xUqIT3h9%S{mtr@R@OjZHGv;j&SX%hdY_Vr2ePjG~+zEiMCk= z21zQGS$*b~QZ`dqy=dQ2PMwjJRv2F^`Y>EMl{EX=_Pd0Ti(MH< zH}})ERKx7uB#sU%rlJ#W;Tr_kl6bE&-~D(U_@pEj+16cJ7!wQ@j3wjyRiBVO?kP%G z*UvBN9Bnl`N8VoeGU{6=?M6Z{mAfXW2J4MI88GHR4kfTojHp7x{O?d^TFuCectY*m zYU!>Ol=~@_sogBfU1XY7+IKKfV2pZP+V6LVUKp~y^?<48SzgSt_XX#wXcyQ5eAe0I zLv9ky#+Q!?@<{ldJrod{9gv3Yn@Lh~2WD;`@|17QKD;chXF_9AMWee?+WYGh3e;QP zcTm>MZ?Se_t*GQ*k8itS{PtQe`Tv}7ArlV7?E2hJcZisCSq385SXhZ*73|Vk#P_vi0@0NvawX*^Brg7jb6XW=X{U$o$K*N!(79de?DBm3e#yxvQQOZj zG*a0Fe>ONBVZPL-3`1r4uiz;p&UEEG#VYAvSner#IO*Jwq3+fvW=F?KwvxN7cs}|& z8nAxROSGN;)^F>H-|ZPR)2O>R@b1wr$jL4s6MZ}EfxIUN1LFxE3PRHu&hLM>D}Xo<+7xz9*ucL&!@OPLugO>L2N zM&9&pU+?1V%WH+tyx~A>zUIiHm2BdN9it}WG?&Z~H!cQ;UXok*uc+v<6L)SxJb-1x z%8K&*P{g|BlVkj6%AO6q9y4>TsUO5n?g%jJ_988`AiDYwpa#iEjUc0(TrqvsS7klv zuZ4x5GAK>Noz6@ShUUTdcjB`!tV|7>DSk`s2TqnsGZ$wSObhM?4fgpuWa8zTJOHIA zLUa#*L7D4Mp>;hjmEhT;*i8QbP}`p#th&ueHUkS*5u3jc`IGR1>fBD(K-fA0(b?SY z7sjxQmmB<0jnJCiy8V!Glk3l)QJtN)KymY4?*g1PYinz_*L1w01FKLpc_S-PyKMih z?PcoVkpJcZHML)Z1j^64Kadka`0TFgP|oHk1xmvZqM*?5@SYyMxknWTlDRb8LF-#7 zQRP0vu3n7a1Z8G&!KCDMbvDU9h!kTx@Rlm=FZ&6&@0l9})>b*(NRX*Pj8x+w@`iiS z-!c+4vzHz1!i}(Mu3J)?NQLxv=Rk-zZ}4hQ9jEg~fK__K-89F(NS8Z=a_h@g?Y~CD zFp=ELbK79Agq6bWYbCeh2h~rXfVegS;7%kO>KU6;j;|fHiP;~--tOF&KgIQ}>jz^0 z_CYz|XO9-2X&bcAKA_UR0m59m0xtt9SUqA1oPZh~01?29Kc;<;nwpKe!09PPPNhLmPpRAGFUAZC!VT8D*+~A99werrvv=1k`@y z`))W;Zu#Yt$};v8`O4@303WrpsG;dEvtY^!Mz?)r{nA8p`xjaa5SKH*I4k21=$ANqj2t|i zAK9Aaz33w~)7eWNfW_fDTB&u7hxY2z`edSn(6b`C{S%uE{?&{9A9)udZRos<$%%jR zF7AaR!_5>Tmos-uLqfSkp71yU?LPt<-YC!XuMD58GmtwF8r+qZ|2CyrLTDamxEsP{ zZhf%?3|&mq|J$4a{@NAuu}>SYQ}AKP5Lnfx#b+)ih>U1TRO%XQ4tmqL!xIvwuhMZa z4`?|4{IPZQZgRkfib>M4sY*MST!@smLVKS=Yygg-L9a_K;%v`%#w7 zDVxd=4*vsu&`guDG*yjm?mzPh>|JkOS#Ue-#yFE(B*9|kc2@=@;@YD+;5BWJqP=yz4!Eo zgNwlE0S3m~7`Z=xey-f5c3)V|Tmk_o2^1BKKx=F*i;*v1Tg7YE-*oonQ~O?({qoHE zdVantTq9G3%%aB}>kq40$bVxyykY{7yjx&AJYTiFF7^vN9u(XQqX4(!;O7q}X2OR6 z)Me4o$=867z$|V6L?>)}*?ze%zq?U)Sg=`t;lZ$ym6gRo9$4dd5ovoaGm8U)AWPHvw`L>>skL>dyPvEJ|@V3h;M8jwoKEm!XDJ-cmme;pHtL?ky^}$ZBdnspSvViQ^_) z9jf01govMikVVHIL5CgxWvcknQxnVMxA$44x2<71qDgXqXP?9328q z>TS@GP~~4EG2CvahslE>xDn>Y9OJ&{GYP^*JCfVey8`g*9r7E=b56_1ZJoXmA-jW4 zz>{p?oL+wapCfvZ#+~%KDYuN4dLPxFRmo%!!}UJw^!_k;X(q=+#|PKPuA`s+>7i$y z+B1Kn$|3!*WQSl+c?7>!BgZHae|fVqWzgq97K$>Jj*cBEPs3&UJA95(P*4yE4z*nS zA$qE>!JwmuPiIY?YRRIaqb_DoI4#n6lqEpaIl50!9@5~muC?mY1-(%Xi{X(vfI&U0(Ala9r@;bOP-E?I%#3okIogrH(*$QA)yT4NMM7Y$Q zvvYo`%CIL0=os_LX$U&xLE*Q>(?K{T&})Iw@z;2yU>viu!QnoQo_#3+`= zRhl*)eyD)?Vsq!~<+Jt^nsFBdAC(Z^zyA{|uS~f>9iU$7OJJQ5Nx5v|X&WFmZX?25 zu~EfICFtW3^i?no?$rVR1!6F~g_4J8tVn4n$0s_*a_5}n4j+bSe24(R1!TB$co^Pjfzqmf2 zW)rRU9=@cWTvDSaQsk;q2tF{#*iQ?i;&27L&mHG`hm7BJaA7t z)j2J$nfdi*ZfEo$fur)Le~}R)cT*%AdYzZZ`oh$?oTWO*1R3g4 zA1fRaNl!m7Kj{@W!@9hXUOt{jWV8&*aeqCWTNUJ84uc}dIzD@RSQm1#6JTWg{39|e z>-YEXuM5D4P@WWCSX}HVhx9EJqfYJU!iHkNy_H)mwhg!zC5SXuyz+Y_oWcNQ7j`KM ziRiWm`gj(B7Zb$PEb@wq-{YGY^pxaCHoIG<8;?0TYn9fJTsS-e9!A0o_ z*j%F`WWUn(QB05Yv8%F-CJVn=b4XoXSz%#Dbcg~lJXz!gb2~_y6V}qw=l#@FG(7B% zI@wQ;YZ@5XJ=zWhFlamq<&7jex24K7SnQG3IAXsBa21^CFYw>dd^C#c_jOHl^CcRjOMT-5MdgNW2Az@0r_1Fz&k zuX5YrQ1v=6zePlt^Ou!cZ%(i#QLOuv`2}ES0^4%~LXLd!@aU@^{_GD`9~I(Xm{lSd zh!c9s#=LOMcf<2WPn-blp+bPP5yOSD3`|TO12UM%X{E@(%*FNgXe)UTFaCbQeM1@> zNn=UvKPu*4?-!R=uLs)>KY`)Y>vo z!-AGHfOzBA6mBNmjX9+t%|ymtW=u6&zB$0qGJQuvzF*LOOLQ^N`0`hK-|-%|lNNd0 zoJ~n}ou8))RlzpW1D#P1cu76ttM{hKzZCYK^myp)VbDJBdZW=s(2~f|RVccd-u^dD zjD`R~`+uEv@b@9v?w+LA>Fe-ix$IN4j)EiGqT3r3y$VAYFP5QEAe9 zheSG|mrz5JI|J_XeP{f}`Hg%3Iroe^_8McmleMzun)9vC^S*NtsG=l8K~6_bMn*;< z`|PnA8QHlWGP1K-XZ{3d%Hx-}!2ixVJbUg$M#jTT`tJ{SxP&Vi*$pz;$5I;ZpO+^L z9Q5bCnF!3`r=-W;EoinBUuIV|RHOSU`#>$G|1s?OJ9_S%SXt_OEH551-YGZxlb>PV zh2;+dZD91yElCmPePTuWUmv*k&3f7Xvf>Dm;r-q#$Wh`bTL71HeP8sm?9L^}=f%3J zU)V3$4F{_ihP!p~>@1&i{li~!MqFD*aE|Nbb+$0zjn=MN$66n}rd{m;+;k<5RK5#%;Kv5jn-7508rDvvAg zC}v?{5%%6D+2P8q|6P;)#-Yx3B{MTqSnM3Q@3mWLu!z_nq#YA5%`gC*O%LFMdB9egBK6UC82W41zxCLL_ zFlHNNT|dyaFNanZ2DFP1aDT2G4k;zFEh!9~fI8sX!of-ht`W=9VpeI&ba zEsp-^1Ni6J)45ZBe~$QAbu>%x{k7?T@$iuYW^mXEtPlNHbVuKG0NwdkLp*3(;o&7#CGU9ssvg^udbk{s* zIC7(jK3gLv?jsNr5OnK>Otow(R;7M^$4^0@z;N}~%HV3*Jv}{>lam=vowJT7PMk11 z%~^<0VN(EyvU2R^wW3~(^Mg>RIMmqK*v5vd$HpWyJUl!sOmL@$^J|}D)i@T5EtaR1 zgRA-Z`K70)W1Optx^ik0%!sU7Tr{jKEa1T$^Xjg1-@ZxSpVoB5F7zm{^nJt1@gT6h zt;$`dd@|vTw&pq{X(?i3Nb%cPO@lg`An0d92(vIP@N(@9o)7Z{ECt#_(J@l~1~xk56qr zztEz+cgaf}X+2Z`ZideBKX`D}vzAXb=2_XEYN9GPc>IgmmZL~}FX!Eh`1Wy)b2J)l z_oA+lzcZ+D4Gj$)i0ge%9w`JKL~&@Br}mh+$NpVxw<({A<~jSvWy1Hifn=>-%$h`R zD(`#wym*m9U{fwDmR0l-Fdn+iwcgkM6+A-{cWjgQa>SOqW*s}O&;@qf0Tw%|82lqd zKJtk%kQ%V&#gK{q1*0oZ@6#o<|NQxEtISs`{ZZ=OyLY?2^fRMUtXlGd8jbNaX}8OF z6m&weCgbj_6G_=);r(x4N|C3yaG}Zk46rj985#PkUv;>ePMx!I>pIKNQQe<^uc<0uF4>T~&CSf1iX|H|_Y4eATxVnqqoAC1tZLGg63{=M*Nr2e zx?w1opqSMcJsIuKFEp@N)Bm3RZKEp3^qFi8D`)3Y-Pq)fjSYPsAwIs#BKts1{`}J5 zFf#$>3oI4Pw!^%>hozHC%OPAC&Q0 zH1=QMFe@1WcMdzqR)$bfQ57K**j%Y{o5XUs^V&7`YmA&T-?ZK@>eDGFPyy+6Kc_XQ zbV%(3;DL;6(Xr+{6YU%mQ86jetY zc)6mKJ4nkFEw_S3!ba|$d-nsVy3C=SBucm$N1>&wtE-Joo{jN{jjMyhU4?{qGC5|J zz(9;~dcYTjJ}gvYd*wNuo`h1I1QX8to z`Q@R&DdnubB1!`NIhuwr2)BzW+Z7J^<+rl2j}e|MtgM_Tgw@s6Lr)6G^*wks^;oPU zK`pxc33?nC%L=tl!BZ_$w>tlR*?}8f}IB7hPZHh@vEIzT8$dydBx1 z!5PrkeqHOG)yq$K+%793Tq=4`qdVxY0RkSkB&!mgUG5o)8XVpl8@hV|3~ot%WWXsg z-@kvK^IXtqThNf_z7pKn8lohaV4F9lWJ8~FYSbk9seF9b7uPshC;43YRF(GzGa$&G z`jbcMA}|VI+rvx(UP691t}-#%+lUY3+`kjw-ruibW|FPJp~)OZN;S@Bj~?{mT2VNW z>f|}&6T(HRpXmIAA|HJ@zXV*hDJWfoQ&(M@BRWX&T>eVC;<93)mg^TK5HE}NKLNLj zQ^+jCagbuA4(t|pc~R6iQZCFRKSGY*_>8H@0)0;wSq!r2s(bhdC)(xxRAeh>l(iW* z8hK?rM$gSD$lj|Uld-D3k}1@!$&oW^XT$Za-?SR8YnRuVuel=M->!9(f{yX$*AQo6 z2KsB+{5luMbaHedNhxwZX`?MJK@_d`FM7OmryHoI%^w(6EVDE2$db(o?UwY-X|mkT z)jF9|Y@z`l{-($h`7&>a8qD$QkAG!)ME7T?_#HtV6^q1#jLe2@nIauQ|u@ye(MqVgHCB z$IIQ%!&l`@7!s{=vo6c#mYNVIxOP~|bG+npFKcw1e(k$RonV}9u1Y5lGV3=h)+1}; z;*FLQ&{||k?$U1JJ$3rDwW*46Fl>3WY$A zn>HL6mDfCFEhmxV^dYRfIY0~ee9>68Zg#>jm(s460Ql)^sQ&mdJ;{AKjLYPE3i5@R zu&}O&&ukp9yaBos1A-zVW8drtV&veu;w)=A;B2&PJO+aSR$rV*L$ZxEK`>H^^|4aU znwE?R^9uoCG#VEzzo?HE?az2_pq8yMJ5i`b$({`y+*35NrPTDW={zN6cxY&}fy>oG zc5AwU+3jS~jD#`Vq^NiMuBfQ~bH*e6uya`Zyft%-!M`7NS1kKPE6p0NmCzbha>?XAZ}(-x+IYZNZyDEQv`J`|~8 zu1H5k|83FcV}i=^1(2|N9_!keus=CMqyon}iU{mD9o2Xy9+Q;b*+F+P;q}V_#gL9w zXX!bXM5X3c)WXoso!r!)M_%~!*bMl9lk%Yf&`k>rYSm}}Axt>2z~XSY&p49YIo}Ea zk4J_Bu~_p9NihVLwzf3;q>`4rdTf%nY4l>!uW(rwdn%O)3-z25bFQ)x9LwBMixz8> zOCFy2$$byV#A9;btFHgL;&EK&KembnE849u3e+GN9r&FDL8pAVxuM~4#KT^rA~!E9 ztDKf)4VyWZ$d>-+PhOtvf0pr*izH*~z$2>pL5Cwc=R7$GLU)x^pSRt9nR8?3aBiB; zS|Qt6&MhaV*os9&0OXpQ)72d1mqp^%eDf1q&mUvT8V-z`vaK&)r)9D4~w0 zA&qBsEJYP z^0)@O=+2-HGEEu`F!rONzCw=;lOpFl4FI7PIT6k4>kefc>;QonptQ1QfzoEbXJ=>g zKmtG#7``ReX#9$V@`e>dw@OBAw5hAk0?ehgiUL5PnAzX~2}Pv%98c3Prz|$8P7$sa zdh*=w92X8ijN8hnfPlcjx35+D1w~Cy6R8ub0F;fs7iI_Y^tCY-u8^LFogfZCxB#-J zrmxH{k`*pUvMoF|rehI&t)@7CUcaAwJA zhjA7r!Js>uKX|l(s`CC&H`~o!6?*XClN{VwL>4@tl@l&LaUw5(P&$r;_sZ>mU7V5J04@0ULEUd!?I_4VOloiZDMV{Gdp zWOUjxT&dsyys}+cr0kp7+8?%4oUj4-5+@?7N%geQ$|m}&sB)s)-6Q0M)LltlRb_Tk zR}N((X{_xyuH1(|bxzUD_67MHa4Qkq;m-i@^+6 z?M$T>Q$CQ)oQ1_6J{%dvYSuJ1W$5Atz+}jTpByhyjwLdX+pu?2L+Z%H#a>M{?CrUq zm{t3cQa>{@6G+7hrlu!S5&cmPZf;?rcUg2X<&@pjuV23aoKgP#phz%{Ltqh28Z!6i z6Tl-Eu-8dnE^}TX2RczN|2Oa z3rHs(adS)fF_mkb1|$-Ie@+P|aAOKX|54U_9m7r&4BR%lIUpe5R+JQ#=( zXlnZN}HsW&cSk5UyW1&J<)V=Pz6s+`}v^d^tve9{)ygUTc~I z#vBc|I}S)IkB>ZB@XK)-ClDY4|9}8sJ2xFjGFrQM6v@aw07vIWT<8;wjEn>&20wLD z9@UCKkpLH2_j?d46j=C0MY*hwZjwB{iFEBl$nkHEKmSv^{J&DwZEs9Wl3X7s^x4jZ z;H|PONcK%Sz6Bi&H;eBSg?s1ql~}6G^9xDfG0O9EbH_Ehqu*%tpO)DBuB4p$3Q7XV zN5_9ENGr^H%0HnvKknF^==pE=jZOtNQ?_@C_hFuwO1hcZ6;y7vdJ zudJ+Yy8mM2e@fl|vzh>;tiP`G>V^5-uW^0MN-Po!zo2yLMMur9dNK#1t_lh3LLnGF zpFcK|Jh8=p>tHO7-{*nN{7i=sq4NHt)w4kobol9*^CX-}IwWhdj{^|t3t08nkbRS_ z)8^&`d@{a9N!gU5xLmRLHR&QaoP$tmp`L3JmJ?4!WXQNfl!NkI!7-Ou@iLYKyRhAPqvo6hd~EULqYYJ9e; z#XNV*VQTrnkoI zZm1G_$ld`;*_&fWn>Cscm66W+F0%WCbbS?RJW|0Lf?d+ zZur9;2!Ti-?oaau6sFUbRaSoToQs=gC7)EJ=C=BnS>r!4Mr zI2&8fG%=1wTCAby{J54zs;VLj>!6$4$q0`fn+NszdIe{EU$o7}!U-6EGbC+?efSA} z{?qewKZcl4HM^MvLhn!FtO#0s|DfwfO}R@OwH^;LZ>=X$b6874>%n>s*wbCH zcvbS~n0sz_cWd0nRi~97*Hn1VssI;}i``$bhs~qMU&-`dB%y3@e27A+8JNC$wIQK& z7~tpR6sC% zMMD!cMZ2GJg>{>9VkVtTu>Ig&36-wbfu)Czk07fP5rViTSp#IR=8EZ<3!|ubPeP|{Lt%BpeLSlm5C2?IIfqQ3t ze^n=n6jsf}ub;(Y`Ya5g7UBqA>s(aBS{o!`tb0ApPn_5=8nCNzw(e7nkVX>eT{ zwwDeIDX8aUh2U~e6F0-35-Xc5As!2<^AN9l&@@-+8MhSvHkwIz9MvC7z`^gq_3{qw19@+IAiEN8~yIxQ2Ky% z-FAN@y^!6Pd0xrLvAPUL`T(5i)*LrD^}zc;VFQ-ff?WRrBHxz0JbJH5C?@ghu?o7+ z$0gVm5sRATl+}i|v0j^zxK?4maVXBV=kykEMW2I~tX9Uj*zIS+&U@6Z;@c> zJ$28JD&H3Y!8qOv;546T#-F`&=Amk(>GLYTsvBnp!DurDHEGNiu4||gA$Ks4<7p?j zM;&k}V9*2c3cy?gGbsdZhxY5bj9U9`$tf#cIwjQlk1N_jAN3o#B|4 zfeBu>_-0#Fuf`G-S}bId&Z@mb881O_1d+Zt`XvzmtA{<~U6~a0ZfhvSt7-omX9)Xd z_u@X$0lR*DLI~VtS3Bvy%w3@|s61LCr1PLk<>4c}3K{mi5)dAd#Gde{0o?TKBWvDk z@K{4~}#r!NbC-nLgD7;Vn$iC=(_vJ=_gC~$Gvwa7%&{ve|-l!1S#2TvJPjQ z%!3AcVyapySokR2B}O~uVm3MR2>bE?$Up+O-_r0Yo#z+J zcIcLReo$PaZaPVl{X5($XK)F2XUAt|wI)6Nq}2L2%$vvZouGkI_Eb*?9uM1mCxHMi zz*pl2R9TS7%wAGixkp+mlwQdmK$C&;!8z`PwkG@Coipk5-eZM?^d1QwdRK6%hgzg& zPfMqA7C86XNJZiD?FgYtLkx#ix@ z^Z_Tdc;p|o{u?BBEP2h%bqJxCu~&rG#?S;M%yy{IxJvqF0~km?^+QRp zy%@d6Amif73PPk;a28|~;FNOq={F-1a5(zh*S#F1KuQ-E4IbGe(*uIEW0$D9$7ml? z_r?s>?zp;1d%^)O-GpSPhaZ`HsH&Z|bv;A3EhqiCN(!b^JjCPY@BRTpZ#@B{&1zh2o(bVtT>XVqY+k4mf03p1iHCzBfuptb4>7?E~;|t7!3wP)vWPF?jbhFOpD!&wY{< zCY}O~4=bpocmUh3vQdr!-tag%o477R)N%a*Qk>;v0KGk%{pphBPtkYoRNHQkz6vcX z^OAmQR)8pX&ActFd+{%dzx-QEw;h3h-(KOR0cb{tBZlfPDUfXK4+bJw+jQerK346F z>TXn87lzg$FejM4-0LqSjw0C*JQK02hYNJ&S!f8tKgT4 ziV7Qr<5eyw36D z9DOvT@6=H|56pOV0XOUWS=gyM525kg?-L0TW|%a^L@neDSoaAGc85_scbq6N^VRC< z@xAfDZFRhu>Pvopth&gh;ymdtA70&=Ie((XeuAF4S-H$gP0T?SeVRQi-CR4p7)O6< zw0bLj>2O@AE6D&Z>6Ih3Ba0gO0@P7>aN zF--w1{lub1?%iVEg$Pu+*uf4K!{1Y3pDY1^dhgH14(#`snKWssVUh-{(E?h1nG_@J zwusLx{6hA%s$7UVo4(9bPj&WJHo}TQocKZM<1mNCfGmX;hY>nTES6-4OQrAi))y1# zNkx2clt#BJ21E0wxMfAL8ijo_&I4iu8hZ%1BsSw07OR*c!XbwKkA47KV_h)Q7*3^~9sO%o?wKd5G133LrUsxLs|= zWC_A1AS58=R4n?9T9G3BO0-_ZQ*^-^Vg^LF$t9tn#+Z<6i%04hOn*mTOz%84d*9V5 zfhkpU%p^2ULXe4K+-CIa#?F{M=d6uz?tcF7=ar6wZ98w=s;v(W((K!k-U&_Xg-aM( zh4)tA7XfdI^}%BKiC-%#hjS>ca(@I)_f)LmSrOo0JtQI4f-sZi61LwP%sY6MzyHW+ zLk8+7MlKonJPe%}pOdk4_sp{;rJbH{9TpPADxS0Be<7ji5E$Nq;q&j^c`CP@`iu|= z1jx>EM>F7p%{(jR?M&ASBK)JPg1e@h6x2l@q)HLl`xxaFPG;8B_7p}nNa9Gs9Fb91)xPF zz8r<(3A$wqC~fZ&z?ef$={4L&zxO6thqo)vue^_%a>u}9>; zj)V%Ex`(}&FaQzkGt0yi^ZXfbJ(Noixrsl{!G}Z+S|k4u@mU#4w|C5{W3Q=Fme@9pWX}7xqm$dZsZ+)|{#nGWprenyVz!kt z-JTLgtTKba|5JQHl?@r{LGfT6z_P6!zX8$gjWkyL7+Uh=Z9zH8??FM<1)tdycK`}u zUHsTTnsYWF$i6gy4CjO!^KDM4qUOefH3nmi+Z__Y(9i|&h#vd>DkvHmfs5I z8`=sCmNN|L=(P#Wkbfz9J>m7xTjU@uVG)2A1z|)qn$db-Y~II^*n%b!VAf~_fLOzt^rd7?Ew8xlSp{mdFr7io$G$5OKGe4J zj3XD@Jz6IU5^)eHT-L#MKri8xV$UW&_cL6&SU*2m%HRy_XEU39#r`lp$b$ z0CS|XmO5-($(NSrBbuOdgFh%nShjgz#6mjrD-M?y#!h8c{1`LIhwgf!=)Lur53$%t z+hMUp93S;QDY`b03b-MSq)0+-W_!frpw zt$GYc!v?mHUv4-8mzAhl1K`6uHdAdL?SmWN-`ZUs8yem=x9?=!(R}rEmBy& zn)GY0?Exmngz&Jcf~@(~nl+x9#h5}v+rYtc%^{sEE!&^vIj}!!4jl=g1VEg^Q%2d@ zy@ZM!90=N@iUB=vuxli`u#BG&+TC3nsSy(XL2e%|@DeyU0I)pNe+Yw0L-K?hWNy^D z5VHgru?>Zg?eJ9ugwx!?a$z!ni35*+2z~=9ZwHae;$>oZg3FrE?tTS2%+7Cp%}PdY z^Vp=miM(xBtf&M48ihmc9s=4Bm6VkP(Irur(n|_)psYjZtv5)EX`;7#uXr9H7$BsW z&C^EV8R6sJZijhxHDYx49wJMzUYx=Tw&RtP0HkjH@}u;p{AwKn*3Rnbv;(L^uGp_+ zuSsR(X18?DD=V%EfG$r5__sb1T>+)2hyvTKp-(nYMf;zw@}(q~1~E4oe>hK~u{|ws zW2ro!G%H`>pe$J5(TQyRp$xnc)FiIsOD>KAXhMqKNa#ARws>c6MfzG~@;Ghi#9vYu z{b}1eYwhMc0iG4P%U@DVMQXnQB;-Z|n9WZ`JRVZHRtHpkUXPdCdZGqx05uq-ec9(9 zY8HJr%?^Ptx9s{zCl(=SKXTZjyqfDI9%zFq_E;t|1iKDomjYInj2oYir5Jy^I#RJ# z@45RFN1>@Z)aT>`Ba+tI)_clU7qCN}G4q0=KRRrFQh#v%qh{X`>glGm?fjO_g-kXogau9CF;3D%G?U&`aaLo5GhDHKB5vZPzj8ts04Y!esL`v z-?#(9HbtIo{m}3yf1#PyXVtGk7M|=#ln{h1%Sed&q&W}{_rLncI@^(wleHJG7D&!w zzzAUX51PS{hVGN^h9Jb}m4wMZ?a(ouAeCUOeK2sO&6qPliquInh~#}N07LWPj1NgQ z#g}grGHfD@Op3ed8>i%yNNqK6pw9ACJ4`;Zuvq^NaG#wWj~71BbH{sjGP|?$chQIJ zwP4kJWPP~TZ0foT3`TTA;wHkBvi_?!$Un`B|5?q7|HDQbskd<$wC08TC6;`B70Y#O zCZJax49>kEHK`_|tM*%z$tCvXQu|8&zWiGEcn>q_`+wRV9@n`WQ@xmzJ2wX^-6u{| zjK7*s`ghavnA$i|QquLdun_zztP{>|@Ue;=Q8(4fxrVP`PD~)})H*tBv4@nK@S$8` zr}X1aGU@F9|EB+S*l z&In;a(2Z85n2|oC1b&mj0v47MU8EYeBx-$)~?mh>_y9`m=H#v9m##$c? zF7%wp_YkPyKc1gtW6QY4w^F^#4BBu;5pm18IpwuF^>sOD@0T|jk;3R?Pwf_J)0w@^ z&Dq<@_YQ4+_8XzvMwRqfU!~fYUK{2L7Iv#iZe8`1+&L;oyNJNBY)#{8)OUZ2%C$6^ zvyRZBZV{2S+~RL*TO-m1VXHF|&W>ymj8WG1)&$hvvCe z#$)(b63Bz35&-)M29S<%S5oJ z)xD~x0OuX6GTn>HwnGb6SKkOKLg>Sc7%%_0E-L` zuj9Y6h9G{o_rc-jWEd4Mj2`|>CtXZH6F?8g;E58)pa7FgRb_fi$$8Fi0*$BW0-uMFksN9l63+3&xp9T{Xg|*dU7?X{j zVCNDYIL|^iMUnjZey&#{&4tL##htxI^x@8~*=JpLZPNBgaHL#-F4}G{4#=7@dM!*s zwX?iHF-K16b~5B{x0PPGoxB!qW(Jd#lw{VXeY+}Uip4lARk!tS9Yj?w_ zp7i*KCIo$cRBZ>xhVoWdpAs|PFz|NV#7@oKX{<0PDWC1@+-kHguCY}vCdA~AO;y7S zpKZAAm2P=`wBpjMn+h%{kkU)H__+dkyul(T;;`<3^!%csPD?xb?x1YCBN3C>U>`Xp zz9O28GHp%}!R710Q4F%ov}lWuN$Q7>GANv-a1)y2`|=ted3q|I*DWk^4BM*Z`nHvt z+qR`dbNQI{!8q^@$3FV{0J@$U5XtJDt6f;&=F)2MIUz_kTuj}xA)cx^yz!j^i^xXi zhUyiw;?Ncdui-N6_2&``Pu3VY3+Kx~zCg>>d(D)${T8rGSrQ&3wVq;d&%DCKAYA-{ z;O)nFk1pkh>J=}) zVp+or@v|kb_CdfXG4JG33!NV-)Z6@--bkOnv%-|&t7ved#G>OF?<#()PD*Is!G29R zPNDn-B{fpmqAQ8hEE$gd49zx-)dBaMSaDtc)Ps4@xdd~!?MA>0ZThq9k5x_9-&3|- z@a^ZZ|40XfcgBg8tXZ}6Ev$7RIC(b

    5`7D& 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

    dmna+7yP41?G|D+ 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 Ol9N%smUZ>E&;J5_YJ*e& From 17f3f19853ebbefff224fa49d7ed961e78b8df78 Mon Sep 17 00:00:00 2001 From: Kevin Pek Date: Thu, 7 Nov 2024 21:00:38 +0800 Subject: [PATCH 38/69] Add implementation details of the assign and unassign command to DG --- docs/DeveloperGuide.md | 68 ++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 68 insertions(+) diff --git a/docs/DeveloperGuide.md b/docs/DeveloperGuide.md index f6d7556b1d8..1014be38e9b 100644 --- a/docs/DeveloperGuide.md +++ b/docs/DeveloperGuide.md @@ -163,6 +163,74 @@ Classes used by multiple components are in the `seedu.address.commons` package. This section describes some noteworthy details on how certain features are implemented. +### Assign and Unassign Commands + +The assign command adds the ability for the user to assign a vendor to an event and vice versa when inside the detailed view for either an `Event` or `Vendor`. + +Given below is a usage scenario for the `assign` and `unassign` commands: + +Step 1. Enter the details view for either an `Event` or a `Vendor`. For example `view v/1` to view the first vendor. + +Step 2. Assign the first `Event` from the list of assignable events to the currently viewed `Vendor`, using the command `assign 1`. The `Event` should now be shifted from the list of assignable events to the list of assigned events. + +Step 3. To unassign the `Event` from the vendor, use the command `unassign 1`. The `Event` should now be shifted from the list of assigned events to the list of assignable events. + +The `AssignCommand` and `UnassignCommand` classes were introduced to represent these operations. To support parsing the arguments to both commands, the `AssignCommandParser` and `UnassignCommandParser` classes were added. + +#### Changes to Model + +Implementing these commands required significant changes to the `Model` of the application, details of which are covered in this section: + +A unique id for both the `Event` and `Vendor` classes was introduced, since otherwise there is no unique identifier for either of the items. This is represented by the new `UniqueId` class, which was represented using Java's built-in UUID class. To represent pairs of assigned `Event` and `Vendor`, we introduced a new class `Association`, which stores a pair of `UniqueId` classes, taken from an `Event` and `Vendor` instance. A `UniqueAssociationList` class was also implemented to allow the user to keep the list of associations in memory. + +The following methods to support the `assign` and `unassign` commands were implemented in `EventTory`: + +* `EventTory#getAssociatedVendors(Event)` — Get the list of vendors associated to the provided event. +* `EventTory#getAssociatedEvents(Vendor)` — Get the list of events associated to the provided vendor. +* `EventTory#assignVendorToEvent(Vendor, Event)` — Create an association between the given `Vendor` and `Event`, and updates the list of associations. +* `EventTory#unassignVendorFromEvent(Vendor, Event)` — Remove the association between the given `Vendor` and `Event`, and updates the list of associations. +* `EventTory#getAssociationList()` — Get the full list of associations. +* `EventTory#isVendorAssignedToEvent(Vendor, Event)` — Returns a boolean indicating whether an association exists between a given `Vendor` and `Event`. +* `EventTory#setAssociations(List)` — Sets the state of the association list to the provided list. + +We also expose the following methods in the `Model` interface, exposing the same operations as the `EventTory` class: + +* `Model#getAssociatedVendors(Event)` +* `Model#getAssociatedEvents(Vendor)` +* `Model#assignVendorToEvent(Vendor, Event)` +* `Model#unassignVendorFromEvent(Vendor, Event)` +* `Model#getAssociationList()` +* `Model#isVendorAssignedToEvent(Vendor, Event)` + +#### Changes to Storage + +To support data persistence, `JsonAdaptedAssociation` was also implemented to allow storing the list of associations alongside `Vendor` and `Event` information. In storage data, the list of associations are represented in the following form: + +``` +"associations": [ + { + "vendorId": "a1e2c3d4-5f67-4890-8a1b-123456789abc", + "eventId": "a1e2c3d4-5f67-4890-8a1b-123456789abd" + }, + { + "vendorId": "b2f3d4e5-6a78-491a-9b2c-23456789abcd", + "eventId": "b2e3c4d5-6f78-49a1-9b2c-23456789abcd" + } +] +``` + +In the case where the UUID strings are not valid UUID strings, or do not correspond to real vendors or events, the whole JSON document representing the data will be treated as invalid. + +#### Exception Handling + +Adding this command into EventTory introduced new edge cases that had to be handled as well. Their details are covered in this section: + +When deleting a `Vendor` or `Event` using the `delete` command, we have to make sure that it is not currently being assigned to any other item, otherwise this would lead to the application storing associations between items that no longer exist. To handle this, the `AssociationDeleteException` was added, and would inform the user if they are trying to delete an item that is currently assigned to another item. + +Since associations are meant to be unique, the `DuplicateAssociationException` was also added to inform the user, when attempting to assign a pair of events and vendors that have already been assigned to each other. + +To handle the event where the user attempts to unassign a vendor from an event, when there is no existing association between the 2 items, the `AssociationNotFoundException` was added. + ### \[Proposed\] Undo/redo feature #### Proposed Implementation From a45b9fe600e063e2ba487e1380d6c043a1306a42 Mon Sep 17 00:00:00 2001 From: Jabez Tho Date: Thu, 7 Nov 2024 21:04:45 +0800 Subject: [PATCH 39/69] Add use case for delete and view --- docs/DeveloperGuide.md | 71 +++++++++++++++++++++++++++++++++++++++--- 1 file changed, 66 insertions(+), 5 deletions(-) diff --git a/docs/DeveloperGuide.md b/docs/DeveloperGuide.md index d4f5aede328..86926d0098b 100644 --- a/docs/DeveloperGuide.md +++ b/docs/DeveloperGuide.md @@ -102,9 +102,9 @@ The sequence diagram below illustrates the interactions within the `Logic` compo How the `Logic` component works: 1. When `Logic` is called upon to execute a command, it is passed to an `EventToryParser` object which in turn creates a parser that matches the command (e.g., `DeleteCommandParser`) and uses it to parse the command. -2. This results in a `Command` object (more precisely, an object of one of its subclasses e.g., `DeleteEventCommand`) which is executed by the `LogicManager`. +2. This results in a `Command` object (more precisely, an object of one of its subclasses e.g., `DeleteEventCommand`) which is executed by the `LogicManager`. 3. The command can communicate with the `Model` when it is executed (e.g. to delete an event).
    - Note that although this is shown as a single step in the diagram above (for simplicity), in the code it can take several interactions (between the command object and the `Model`) to achieve. + Note that although this is shown as a single step in the diagram above (for simplicity), in the code it can take several interactions (between the command object and the `Model`) to achieve. 4. 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: @@ -357,9 +357,9 @@ Priorities: High (must have) - `* * *`, Medium (nice to have) - `* *`, Low (unli --- -**Use case: UC02 - Assign a vendor to an event** +**Use case: UC02 - Assign a vendor to an event** -**MSS** +**MSS** 1. User enters command to assign a vendor to an event. 2. System assigns the vendor to the event. @@ -393,13 +393,70 @@ Priorities: High (must have) - `* * *`, Medium (nice to have) - `* *`, Low (unli Use case ends. +--- + +**Use case: UC03 - View an item** + +**MSS** +1. User enters command to view an item. +2. System displays success message and switches page to the details of the item. + + Use case ends. + +**Extensions** +* 1a. The command format entered by the user is invalid. + + * 1a1. System shows an error message and displays the correct command format. + + Use case ends. +* 2a. The item does not exist. + + * 2a1. System shows an error message. + + Use case ends. + +--- + +** Use case: UC04 - Delete an item** + +**MSS** +1. User enters command to delete an item. +2. System deletes the item. +3. System displays a success message. + + Use case ends. + +**Extensions** +* 1a. The command format entered by the user is invalid. + + * 1a1. System shows an error message and displays the correct command format. + + Use case ends. +* 2a. The item does not exist. + + * 2a1. System shows an error message. + + Use case ends. +* 2b. The event has associated entities assigned to it. + + * 2b1. System shows an error message. + + Use case ends. +* 3a. The item is currently being viewed. + + * 3a1. Return to the main page with both list of events and vendors. + + Use case ends. + +--- + *{More to be added}* ### Non-Functional Requirements 1. Should work on any _mainstream OS_ as long as it has Java `17` or above installed. 2. Should be able to hold up to 100 events and 1000 vendors without a noticeable sluggishness in performance for typical usage. -3. Should be able to assign up to 100 vendors to an event without any issue. +3. Should be able to assign up to 100 vendors to an event without any issue. 4. A user with an 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. 5. Persistent data stored by the system should be in a human-readable format. @@ -427,6 +484,10 @@ Priorities: High (must have) - `* * *`, Medium (nice to have) - `* *`, Low (unli 11. **Vendor Rating:** A qualitative score assigned to a vendor to track their past performance in events. +12. **Item**: Refers to any entity or object that can be viewed or deleted within the system, such as an event, vendor. + +13. **Associated Entities**: Refers to any related items or dependencies connected to the main item. For example, for an event, associated entities include assigned vendors; for a vendor, associated entities include assigned events. + -------------------------------------------------------------------------------------------------------------------- ## **Appendix: Instructions for manual testing** From 6421dd13cb15af296eafdfcc0af442cb192713b3 Mon Sep 17 00:00:00 2001 From: Kevin Pek Date: Thu, 7 Nov 2024 21:04:52 +0800 Subject: [PATCH 40/69] Reformat long paragraph for the changes to model --- docs/DeveloperGuide.md | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/docs/DeveloperGuide.md b/docs/DeveloperGuide.md index 1014be38e9b..f166fcfe51a 100644 --- a/docs/DeveloperGuide.md +++ b/docs/DeveloperGuide.md @@ -181,7 +181,9 @@ The `AssignCommand` and `UnassignCommand` classes were introduced to represent t Implementing these commands required significant changes to the `Model` of the application, details of which are covered in this section: -A unique id for both the `Event` and `Vendor` classes was introduced, since otherwise there is no unique identifier for either of the items. This is represented by the new `UniqueId` class, which was represented using Java's built-in UUID class. To represent pairs of assigned `Event` and `Vendor`, we introduced a new class `Association`, which stores a pair of `UniqueId` classes, taken from an `Event` and `Vendor` instance. A `UniqueAssociationList` class was also implemented to allow the user to keep the list of associations in memory. +* A unique id for both the `Event` and `Vendor` classes was introduced, since otherwise there is no unique identifier for either of the items. This is represented by the new `UniqueId` class, which was represented using Java's built-in UUID class. +* To represent pairs of assigned `Event` and `Vendor`, we introduced a new class `Association`, which stores a pair of `UniqueId` classes, taken from an `Event` and `Vendor` instance. +* A `UniqueAssociationList` class was also implemented to allow the user to keep the list of associations in memory. The following methods to support the `assign` and `unassign` commands were implemented in `EventTory`: From 28b6d752e0ebd98623820239ba6efa4885eb5aa9 Mon Sep 17 00:00:00 2001 From: Hans Delano Date: Thu, 7 Nov 2024 21:22:30 +0800 Subject: [PATCH 41/69] Fix wrong index when viewing assigned items --- .../java/seedu/eventtory/logic/Logic.java | 11 ++++---- .../seedu/eventtory/logic/LogicManager.java | 10 ++++--- .../logic/commands/ViewEventCommand.java | 1 - .../logic/commands/ViewVendorCommand.java | 2 -- .../java/seedu/eventtory/model/Model.java | 9 +++++-- .../seedu/eventtory/model/ModelManager.java | 27 ++++++++++++++----- .../seedu/eventtory/ui/EventDetailsPanel.java | 18 ++++++++++--- .../eventtory/ui/VendorDetailsPanel.java | 18 ++++++++++--- .../resources/view/EventDetailsPanel.fxml | 7 ++++- .../resources/view/VendorDetailsPanel.fxml | 19 +++++++++---- 10 files changed, 88 insertions(+), 34 deletions(-) diff --git a/src/main/java/seedu/eventtory/logic/Logic.java b/src/main/java/seedu/eventtory/logic/Logic.java index fbd9a071903..ce2df96bc7b 100644 --- a/src/main/java/seedu/eventtory/logic/Logic.java +++ b/src/main/java/seedu/eventtory/logic/Logic.java @@ -6,7 +6,6 @@ import javafx.beans.value.ObservableObjectValue; import javafx.collections.ObservableList; import seedu.eventtory.commons.core.GuiSettings; -import seedu.eventtory.commons.core.index.Index; import seedu.eventtory.logic.commands.CommandResult; import seedu.eventtory.logic.commands.exceptions.CommandException; import seedu.eventtory.logic.parser.exceptions.ParseException; @@ -25,13 +24,12 @@ public interface Logic { * @param commandText The command as entered by the user. * @return the result of the command execution. * @throws CommandException If an error occurs during command execution. - * @throws ParseException If an error occurs during parsing. + * @throws ParseException If an error occurs during parsing. */ CommandResult execute(String commandText) throws CommandException, ParseException; /** * Returns the EventTory. - * * @see seedu.eventtory.model.Model#getEventTory() */ ReadOnlyEventTory getEventTory(); @@ -67,10 +65,13 @@ public interface Logic { ObservableIntegerValue getStartingIndexOfAssignedEvents(); /** Return the display index of the given vendor in the filtered list */ - Index getRelativeIndexOfVendor(Vendor vendor); + int getRelativeIndexOfVendor(Vendor vendor); /** Return the display index of the given event in the filtered list */ - Index getRelativeIndexOfEvent(Event event); + int getRelativeIndexOfEvent(Event event); + + /** Return the display index of the selected object */ + ObservableIntegerValue getIndexOfSelectedObject(); /** * Returns the user prefs' EventTory file path. diff --git a/src/main/java/seedu/eventtory/logic/LogicManager.java b/src/main/java/seedu/eventtory/logic/LogicManager.java index 642c72fecd5..2cd899366c0 100644 --- a/src/main/java/seedu/eventtory/logic/LogicManager.java +++ b/src/main/java/seedu/eventtory/logic/LogicManager.java @@ -10,7 +10,6 @@ import javafx.collections.ObservableList; import seedu.eventtory.commons.core.GuiSettings; import seedu.eventtory.commons.core.LogsCenter; -import seedu.eventtory.commons.core.index.Index; import seedu.eventtory.logic.commands.Command; import seedu.eventtory.logic.commands.CommandResult; import seedu.eventtory.logic.commands.exceptions.CommandException; @@ -123,15 +122,20 @@ public ObservableList getAssociationList() { } @Override - public Index getRelativeIndexOfVendor(Vendor vendor) { + public int getRelativeIndexOfVendor(Vendor vendor) { return model.getRelativeIndexOfVendor(vendor); } @Override - public Index getRelativeIndexOfEvent(Event event) { + public int getRelativeIndexOfEvent(Event event) { return model.getRelativeIndexOfEvent(event); } + @Override + public ObservableIntegerValue getIndexOfSelectedObject() { + return model.getIndexOfSelectedObject(); + } + @Override public Path getEventToryFilePath() { return model.getEventToryFilePath(); diff --git a/src/main/java/seedu/eventtory/logic/commands/ViewEventCommand.java b/src/main/java/seedu/eventtory/logic/commands/ViewEventCommand.java index 2aa7a24a1f1..1bc631974ad 100644 --- a/src/main/java/seedu/eventtory/logic/commands/ViewEventCommand.java +++ b/src/main/java/seedu/eventtory/logic/commands/ViewEventCommand.java @@ -32,7 +32,6 @@ public CommandResult execute(Model model) throws CommandException { Event eventToView = IndexResolverUtil.resolveEvent(model, targetIndex); model.viewEvent(eventToView); - model.updateFilteredVendorList(Model.PREDICATE_SHOW_ALL_VENDORS); return new CommandResult(String.format(MESSAGE_SUCCESS, Messages.format(eventToView))); } diff --git a/src/main/java/seedu/eventtory/logic/commands/ViewVendorCommand.java b/src/main/java/seedu/eventtory/logic/commands/ViewVendorCommand.java index 3b706667bdc..fe1991c58fd 100644 --- a/src/main/java/seedu/eventtory/logic/commands/ViewVendorCommand.java +++ b/src/main/java/seedu/eventtory/logic/commands/ViewVendorCommand.java @@ -2,7 +2,6 @@ import static java.util.Objects.requireNonNull; import static seedu.eventtory.logic.parser.CliSyntax.PREFIX_VENDOR; -import static seedu.eventtory.model.Model.PREDICATE_SHOW_ALL_EVENTS; import seedu.eventtory.commons.core.index.Index; import seedu.eventtory.logic.Messages; @@ -33,7 +32,6 @@ public CommandResult execute(Model model) throws CommandException { Vendor vendorToView = IndexResolverUtil.resolveVendor(model, targetIndex); model.viewVendor(vendorToView); - model.updateFilteredEventList(PREDICATE_SHOW_ALL_EVENTS); return new CommandResult(String.format(MESSAGE_SUCCESS, Messages.format(vendorToView))); } diff --git a/src/main/java/seedu/eventtory/model/Model.java b/src/main/java/seedu/eventtory/model/Model.java index d95beafe3d2..91fecc50462 100644 --- a/src/main/java/seedu/eventtory/model/Model.java +++ b/src/main/java/seedu/eventtory/model/Model.java @@ -136,12 +136,17 @@ public interface Model { /** * Returns the relative index of the vendor in the filtered list. */ - Index getRelativeIndexOfVendor(Vendor vendor); + int getRelativeIndexOfVendor(Vendor vendor); /** * Returns the relative index of the event in the filtered list. */ - Index getRelativeIndexOfEvent(Event event); + int getRelativeIndexOfEvent(Event event); + + /** + * Returns the relative index of the selected object in the filtered list. + */ + ObservableIntegerValue getIndexOfSelectedObject(); /** * Sets the selected vendor. diff --git a/src/main/java/seedu/eventtory/model/ModelManager.java b/src/main/java/seedu/eventtory/model/ModelManager.java index 130e507e22d..73849779a88 100644 --- a/src/main/java/seedu/eventtory/model/ModelManager.java +++ b/src/main/java/seedu/eventtory/model/ModelManager.java @@ -10,6 +10,7 @@ import javafx.beans.binding.Bindings; import javafx.beans.property.ObjectProperty; +import javafx.beans.property.SimpleIntegerProperty; import javafx.beans.property.SimpleObjectProperty; import javafx.beans.value.ObservableIntegerValue; import javafx.beans.value.ObservableObjectValue; @@ -18,7 +19,6 @@ import javafx.collections.transformation.FilteredList; import seedu.eventtory.commons.core.GuiSettings; import seedu.eventtory.commons.core.LogsCenter; -import seedu.eventtory.commons.core.index.Index; import seedu.eventtory.model.association.Association; import seedu.eventtory.model.commons.exceptions.AssociationDeleteException; import seedu.eventtory.model.event.Event; @@ -37,6 +37,7 @@ public class ModelManager implements Model { private final ObjectProperty selectedVendor; private final FilteredList filteredEvents; private final ObjectProperty selectedEvent; + private final SimpleIntegerProperty indexOfSelectedObject; private final ObjectProperty currentUiState; private final ObjectProperty> suppliedVendorFilterPredicate; private final ObjectProperty> suppliedEventFilterPredicate; @@ -57,6 +58,7 @@ public ModelManager(ReadOnlyEventTory eventTory, ReadOnlyUserPrefs userPrefs) { filteredEvents = new FilteredList<>(this.eventTory.getEventList()); selectedVendor = new SimpleObjectProperty<>(null); selectedEvent = new SimpleObjectProperty<>(null); + indexOfSelectedObject = new SimpleIntegerProperty(-1); currentUiState = new SimpleObjectProperty<>(UiState.DEFAULT); suppliedVendorFilterPredicate = new SimpleObjectProperty<>(PREDICATE_SHOW_ALL_VENDORS); suppliedEventFilterPredicate = new SimpleObjectProperty<>(PREDICATE_SHOW_ALL_EVENTS); @@ -72,13 +74,17 @@ public ModelManager(ReadOnlyEventTory eventTory, ReadOnlyUserPrefs userPrefs) { filteredVendors.addListener((ListChangeListener) change -> { if (selectedVendor.get() != null) { change.getList().stream().filter(vendor -> vendor.isSameId(selectedVendor.get())).findFirst() - .ifPresent(vendor -> selectedVendor.set(vendor)); + .ifPresent(vendor -> { + selectedVendor.set(vendor); + }); } }); filteredEvents.addListener((ListChangeListener) change -> { if (selectedEvent.get() != null) { change.getList().stream().filter(event -> event.isSameId(selectedEvent.get())).findFirst() - .ifPresent(event -> selectedEvent.set(event)); + .ifPresent(event -> { + selectedEvent.set(event); + }); } }); } @@ -341,12 +347,13 @@ public void viewVendor(Vendor vendor) { selectedVendor.setValue(vendor); currentUiState.setValue(UiState.VENDOR_DETAILS); applyFiltersBasedOnUiState(); + indexOfSelectedObject.setValue(getRelativeIndexOfVendor(vendor)); } @Override - public Index getRelativeIndexOfVendor(Vendor vendor) { + public int getRelativeIndexOfVendor(Vendor vendor) { requireNonNull(vendor); - return Index.fromZeroBased(filteredVendors.indexOf(vendor)); + return filteredVendors.indexOf(vendor); } // =========== Viewed Events Accessors ============================================================= @@ -362,12 +369,18 @@ public void viewEvent(Event event) { selectedEvent.setValue(event); currentUiState.setValue(UiState.EVENT_DETAILS); applyFiltersBasedOnUiState(); + indexOfSelectedObject.setValue(getRelativeIndexOfEvent(event)); } @Override - public Index getRelativeIndexOfEvent(Event event) { + public int getRelativeIndexOfEvent(Event event) { requireNonNull(event); - return Index.fromZeroBased(filteredEvents.indexOf(event)); + return filteredEvents.indexOf(event); + } + + @Override + public ObservableIntegerValue getIndexOfSelectedObject() { + return indexOfSelectedObject; } // =========== UI State Accessors ============================================================= diff --git a/src/main/java/seedu/eventtory/ui/EventDetailsPanel.java b/src/main/java/seedu/eventtory/ui/EventDetailsPanel.java index e9d782fef17..ec087307f1d 100644 --- a/src/main/java/seedu/eventtory/ui/EventDetailsPanel.java +++ b/src/main/java/seedu/eventtory/ui/EventDetailsPanel.java @@ -15,7 +15,6 @@ import javafx.scene.layout.Region; import javafx.scene.layout.StackPane; import seedu.eventtory.commons.core.LogsCenter; -import seedu.eventtory.commons.core.index.Index; import seedu.eventtory.logic.Logic; import seedu.eventtory.model.association.Association; import seedu.eventtory.model.event.Event; @@ -30,6 +29,8 @@ public class EventDetailsPanel extends UiPart { private final Logic logic; private final Logger logger = LogsCenter.getLogger(VendorDetailsPanel.class); + @FXML + private Label index; @FXML private Label name; @FXML @@ -57,9 +58,14 @@ public EventDetailsPanel(Logic logic) { startIndexOfAssignedVendors = logic.getStartingIndexOfAssignedVendors(); ObservableObjectValue observableEvent = logic.getViewedEvent(); + ObservableIntegerValue relativeIndexOfEvent = logic.getIndexOfSelectedObject(); + + relativeIndexOfEvent.addListener((observable, oldValue, newValue) -> { + setIndex(newValue.intValue()); + }); observableEvent.addListener((observable, oldValue, newValue) -> { - setEvent(newValue, this.logic.getRelativeIndexOfEvent(newValue)); + setEvent(newValue); showEventDetails(); updateAssignedVendors(); }); @@ -78,10 +84,10 @@ public EventDetailsPanel(Logic logic) { detailsChildrenPlaceholder.getChildren().add(vendorListPanel.getRoot()); } - private void setEvent(Event event, Index index) { + private void setEvent(Event event) { this.event = event; if (event != null) { - String nameWithIndex = String.format("%d. %s", index.getZeroBased() + 1, event.getName().fullName); + String nameWithIndex = event.getName().fullName; name.setText(nameWithIndex); date.setText(event.getDate().toString()); // Empty tags will leave behind the last set of tags, @@ -95,6 +101,10 @@ private void setEvent(Event event, Index index) { } } + private void setIndex(int index) { + this.index.setText(String.format("%d. ", index + 1)); + } + private void showEventDetails() { if (event == null) { detailsHolder.setVisible(false); diff --git a/src/main/java/seedu/eventtory/ui/VendorDetailsPanel.java b/src/main/java/seedu/eventtory/ui/VendorDetailsPanel.java index 7498ec1cf89..c2e66ace367 100644 --- a/src/main/java/seedu/eventtory/ui/VendorDetailsPanel.java +++ b/src/main/java/seedu/eventtory/ui/VendorDetailsPanel.java @@ -16,7 +16,6 @@ import javafx.scene.layout.StackPane; import javafx.scene.text.Text; import seedu.eventtory.commons.core.LogsCenter; -import seedu.eventtory.commons.core.index.Index; import seedu.eventtory.logic.Logic; import seedu.eventtory.model.association.Association; import seedu.eventtory.model.event.Event; @@ -31,6 +30,8 @@ public class VendorDetailsPanel extends UiPart { private final Logic logic; private final Logger logger = LogsCenter.getLogger(VendorDetailsPanel.class); + @FXML + private Label index; @FXML private Label name; @FXML @@ -60,9 +61,14 @@ public VendorDetailsPanel(Logic logic) { startIndexOfAssignedEvents = logic.getStartingIndexOfAssignedEvents(); ObservableObjectValue observableVendor = logic.getViewedVendor(); + ObservableIntegerValue relativeIndexOfVendor = logic.getIndexOfSelectedObject(); + + relativeIndexOfVendor.addListener((observable, oldValue, newValue) -> { + setIndex(newValue.intValue()); + }); observableVendor.addListener((observable, oldValue, newValue) -> { - setVendor(newValue, logic.getRelativeIndexOfVendor(newValue)); + setVendor(newValue); showVendorDetails(); updateAssignedEvents(); }); @@ -81,10 +87,10 @@ public VendorDetailsPanel(Logic logic) { detailsChildrenPlaceholder.getChildren().add(eventListPanel.getRoot()); } - private void setVendor(Vendor vendor, Index index) { + private void setVendor(Vendor vendor) { this.vendor = vendor; if (vendor != null) { - String nameWithIndex = String.format("%d. %s", index.getZeroBased() + 1, vendor.getName().fullName); + String nameWithIndex = vendor.getName().fullName; name.setText(nameWithIndex); phone.setText(vendor.getPhone().value); description.setText(vendor.getDescription().value); @@ -100,6 +106,10 @@ private void setVendor(Vendor vendor, Index index) { } } + private void setIndex(int index) { + this.index.setText(String.format("%d. ", index + 1)); + } + private void showVendorDetails() { if (vendor == null) { detailsHolder.setVisible(false); diff --git a/src/main/resources/view/EventDetailsPanel.fxml b/src/main/resources/view/EventDetailsPanel.fxml index e7631752e6c..8baedb5b137 100644 --- a/src/main/resources/view/EventDetailsPanel.fxml +++ b/src/main/resources/view/EventDetailsPanel.fxml @@ -18,7 +18,12 @@ - - + + + + + + From e7087649030506bd756da4acfc2d0e47eaf872ea Mon Sep 17 00:00:00 2001 From: C5hives Date: Thu, 7 Nov 2024 21:25:20 +0800 Subject: [PATCH 42/69] Format user guide differently --- docs/UserGuide.md | 75 ++++++++++++++++++++--------------------------- 1 file changed, 32 insertions(+), 43 deletions(-) diff --git a/docs/UserGuide.md b/docs/UserGuide.md index 3677b45f79b..f5e85596d3e 100644 --- a/docs/UserGuide.md +++ b/docs/UserGuide.md @@ -51,8 +51,6 @@ If you can type fast, EventTory can get your **event management tasks** done fas ## Storing Information - - EventTory provides users a way to keep track of events and vendors. The details of what information can be stored for a vendor/event are as shown below. @@ -79,21 +77,13 @@ The details of what information can be stored for a vendor/event are as shown be The input fields of vendors and events have varying constraints and are as listed below. Note that leading and trailing whitespaces in inputs will be removed. -### Name - -Names must start with an alphanumeric character and must not contain `/`. - -### Phone Number +**Name** : Names must start with an alphanumeric character and must not contain `/`. -Phone numbers should only contain numbers, and it should be at least 3 digits long. +**Phone Number** : Phone numbers should only contain numbers, and it should be at least 3 digits long. -### Description +**Description** : Descriptions can take in any characters but cannot be blank. -Descriptions can take in any characters but cannot be blank. - -### Date - -Date inputs can be in any of the following formats: +**Date** : Date inputs can be in any of the following formats: 1. `dd-MM-uuuu` 2. `uuuu-MM-dd` 3. `dd MMM uuuu` @@ -101,16 +91,14 @@ Date inputs can be in any of the following formats: `uuuu` is equivalent to `yyyy` denoting the year in a date. -### Tags - -Tags can contain alphanumeric characters, hyphens `-`, and underscores `_` only, but cannot be made up of only hyphens `-` and underscores `_`.
    +**Tags** : Tags can contain alphanumeric characters, hyphens `-`, and underscores `_` only, but cannot be made up of only hyphens `-` and underscores `_`.
    Tags also only accepts a **maximum** of 30 characters. ## Features -### Command Formats +Notes on Command Formats: * Words in `UPPER_CASE` are the parameters to be supplied by the user.
    e.g. `create v/ n/VENDOR_NAME`, `VENDOR_NAME` is a parameter which is specified by the user: @@ -153,23 +141,24 @@ Tags also only accepts a **maximum** of 30 characters.

    * If you are using a PDF version of this document, be careful when copying and pasting commands that span multiple lines as space characters surrounding line-breaks may be omitted when copied over to the application. + ### Creating Vendors & Events: `create` Creates a vendor or event in EventTory. -#### Format: +Format: * To create a vendor: `create v/ n/VENDOR_NAME d/DESCRIPTION p/PHONE_NUMBER [t/TAG]…​` * To create en event: `create e/ n/EVENT_NAME on/DATE [t/TAG]…​` -#### Notes: +Notes: If parameters are provided for the `v/` and `e/` flags, they will be ignored.
    **Tip:** A vendor or event can have any number of tags (including 0).
    -#### Examples: +Examples: * `create v/ n/Hong Lim Trading Pte. Ltd. p/67412943 d/Specialises in lighting effects. t/stage-crew` * `create e/ n/Jubilee Concert on/24 Jan 2025 t/annual` @@ -177,11 +166,11 @@ If parameters are provided for the `v/` and `e/` flags, they will be ignored. Edits an existing vendor or event in EventTory. -#### Format: +Format: * To edit a vendor: `edit v/INDEX [n/NAME] [p/PHONE] [d/DESCRIPTION] [t/TAG]…​` * To edit an event: `edit e/INDEX [n/NAME] [on/DATE] [t/TAG]…​` -#### Notes: +Notes: * Edits the vendor/event at the specified `INDEX`. * The index refers to the index number shown in the vendor or event list. * The index **must be a positive integer** 1, 2, 3, …​ @@ -194,7 +183,7 @@ Edits an existing vendor or event in EventTory. * Tags cannot be added cumulatively. * You can remove all tags from a vendor/event by typing `t/` without specifying any tags after it. -#### Examples: +Examples: * `edit v/1 p/58623042 ` : Edits the phone number of the 1st vendor to be `58623042`. * `edit e/2 n/Baby Shower t/` : Edits the name of the 2nd event to be `Baby Shower`, and clears all existing tags. @@ -202,7 +191,7 @@ Edits an existing vendor or event in EventTory. Deletes a vendor or an event from EventTory. -#### Format: `delete [v/INDEX]` or `delete [e/INDEX]` +Format: `delete [v/INDEX]` or `delete [e/INDEX]` * Deletes the event or vendor at the specified `INDEX`. * The index refers to the index number shown in the displayed event/vendor list respectively. @@ -213,7 +202,7 @@ Deletes a vendor or an event from EventTory. * If the specified vendor/event is currently assigned to another event/vendor respectively, the operation will fail. * If the current viewed vendor/event is deleted, the application will return you to the main list screen. -#### Examples: +Examples: * `list` followed by `delete v/2` deletes the 2nd vendor in EventTory. * `find e/Wedding` followed by `delete e/1` deletes the 1st event shown in the results of the `find` command. @@ -221,15 +210,15 @@ Deletes a vendor or an event from EventTory. Displays the list of vendors and/or events in EventTory. -#### Format: `list [v/] [e/]` +Format: `list [v/] [e/]` -#### Notes: +Notes: * The list(s) displayed depends on whether the `v/` and/or `e/` prefix(es) is specified. * If no prefixes are specified, both the vendor and event lists will be displayed. * The prefixes can be specified in any order. * If values are specified after the prefixes (e.g. `v/2`, `e/Party`), the value is ignored. -#### Examples: +Examples: * `list v/` will display the list of vendors. * `list e/` will display the list of events. * `list v/ e/` and `list` will display both vendor and event lists. @@ -238,7 +227,7 @@ Displays the list of vendors and/or events in EventTory. Views the details of a vendor or event. -#### Format: `view v/INDEX` or `view e/INDEX` +Format: `view v/INDEX` or `view e/INDEX` * Views the details of the vendor/event at the specified `INDEX`. * The index refers to the index number shown in the displayed vendor/event list. @@ -247,7 +236,7 @@ Views the details of a vendor or event. * The operation will succeed even if the specified vendor/event is not visible on screen. * e.g. `view v/2` can be run after `view v/1`. Even though the 1st vendor will not be visible when viewing the 2nd vendor, it can still be accessed and viewed. -#### Examples: +Examples: * `view v/2` will show the details of the 2nd vendor. * `view e/1` will show the details of the 1st event. @@ -255,16 +244,16 @@ Views the details of a vendor or event. Assigns vendors to events and vice versa. -#### Format: `assign INDEX` +Format: `assign INDEX` -#### Notes: +Notes: * Assigns the vendor/event specified at `INDEX` to the current viewed event/vendor. * The index refers to the index number shown in the **assignable** vendor/event list. * The index **must be a positive integer** 1, 2, 3, ... * The command only works when the user is viewing a vendor/event using the `view` command. Otherwise, the operation will fail. * If the specified vendor-event pair are already associated (assigned to each other), the operation will fail. -#### Examples: +Examples: * `view v/2` then `assign 1` will assign the 1st event to the current viewed vendor, which is the 2nd vendor. * `view e/1` then `assign 3` will assign the 3rd vendor to the current viewed event, which is the 1st event. @@ -272,16 +261,16 @@ Assigns vendors to events and vice versa. Unassigns vendors from events and vice versa. -#### Format: `unassign INDEX` +Format: `unassign INDEX` -#### Notes: +Notes: * Unassigns the vendor/event specified at `INDEX` to the current viewed event/vendor. * The index refers to the index number shown in the **assigned** vendor/event list. * The index **must be a positive integer** 1, 2, 3, ... * The command only works when the user is viewing a vendor/event using the `view` command. Otherwise, the operation will fail. * If the specified vendor-event pair are not already associated (not assigned to each other), the operation will fail. -#### Examples: +Examples: * `view v/2` then `unassign 1` will unassign the 1st event from the current viewed vendor, which is the 2nd vendor. * `view e/1` then `unassign 3` will unassign the 3rd vendor from the current viewed event, which is the 1st event. @@ -289,9 +278,9 @@ Unassigns vendors from events and vice versa. Finds vendors or events whose attributes contain any of the space-separated keywords provided. -#### Format: `find v/ KEYWORD [MORE_KEYWORDS]` or `find e/ KEYWORD [MORE_KEYWORDS]` +Format: `find v/ KEYWORD [MORE_KEYWORDS]` or `find e/ KEYWORD [MORE_KEYWORDS]` -#### Notes: +Notes: * The search is case-insensitive. e.g. `party` will match `Party` * Any partial matches will still be matched e.g. `par` will match `party` * The order of the keywords does not matter. @@ -301,7 +290,7 @@ Finds vendors or events whose attributes contain any of the space-separated keyw * e.g. `party wedding` will return `Birthday Party`, `John's Wedding` * If no matches are found, the user will be informed and the current view will remain unchanged. -#### Examples: +Examples: * `find v/ catering` returns `catering` and `Catering Solutions` * `find e/ party wedding` returns `Birthday Party` and `John's Wedding`
    @@ -309,7 +298,7 @@ Finds vendors or events whose attributes contain any of the space-separated keyw Clears all vendor and event entries from EventTory. -#### Format: `clear` +Format: `clear` ### Accessing Help : `help` @@ -317,13 +306,13 @@ Opens a window with instructions on how to access the help page. ![help message](images/helpMessage.png) -#### Format: `help` +Format: `help` ### Exiting the program : `exit` Exits the program. -#### Format: `exit` +Format: `exit` ### Saving Data From 2e552996652fd26a7abeb68480230711c7cb64d1 Mon Sep 17 00:00:00 2001 From: Hans Delano Date: Thu, 7 Nov 2024 21:27:42 +0800 Subject: [PATCH 43/69] Add test --- .../eventtory/logic/LogicManagerTest.java | 21 +++++++++++++++---- 1 file changed, 17 insertions(+), 4 deletions(-) diff --git a/src/test/java/seedu/eventtory/logic/LogicManagerTest.java b/src/test/java/seedu/eventtory/logic/LogicManagerTest.java index 116670d4f29..c8fa6bb2ee8 100644 --- a/src/test/java/seedu/eventtory/logic/LogicManagerTest.java +++ b/src/test/java/seedu/eventtory/logic/LogicManagerTest.java @@ -280,8 +280,8 @@ public void getRelativeIndexOfViewedEvent() { model.addEvent(indexOneEvent); model.addEvent(indexTwoEvent); - assertEquals(0, this.logic.getRelativeIndexOfEvent(indexOneEvent).getZeroBased()); - assertEquals(1, this.logic.getRelativeIndexOfEvent(indexTwoEvent).getZeroBased()); + assertEquals(0, this.logic.getRelativeIndexOfEvent(indexOneEvent)); + assertEquals(1, this.logic.getRelativeIndexOfEvent(indexTwoEvent)); } @Test @@ -291,8 +291,21 @@ public void getRelativeIndexOfViewedVendor() { model.addVendor(indexOneVendor); model.addVendor(indexTwoVendor); - assertEquals(0, this.logic.getRelativeIndexOfVendor(indexOneVendor).getZeroBased()); - assertEquals(1, this.logic.getRelativeIndexOfVendor(indexTwoVendor).getZeroBased()); + assertEquals(0, this.logic.getRelativeIndexOfVendor(indexOneVendor)); + assertEquals(1, this.logic.getRelativeIndexOfVendor(indexTwoVendor)); + } + + @Test + public void getIndexOfSelectedObject() { + Event indexOneEvent = new EventBuilder().withName("Event 1").build(); + Event indexTwoEvent = new EventBuilder().withName("Event 2").build(); + model.addEvent(indexOneEvent); + model.addEvent(indexTwoEvent); + + model.viewEvent(indexOneEvent); + this.logic.getIndexOfSelectedObject().addListener((observable, oldValue, newValue) -> { + assertEquals(1, newValue.intValue()); + }); } /** From 7d2c7b8c8981634bf39b9457c9ddb9d1581f3cef Mon Sep 17 00:00:00 2001 From: Hans Delano Date: Thu, 7 Nov 2024 21:27:47 +0800 Subject: [PATCH 44/69] Fix checkstyle --- src/main/java/seedu/eventtory/model/Model.java | 1 - src/test/java/seedu/eventtory/testutil/ModelStub.java | 10 +++++++--- 2 files changed, 7 insertions(+), 4 deletions(-) diff --git a/src/main/java/seedu/eventtory/model/Model.java b/src/main/java/seedu/eventtory/model/Model.java index 91fecc50462..f473ee9b2fa 100644 --- a/src/main/java/seedu/eventtory/model/Model.java +++ b/src/main/java/seedu/eventtory/model/Model.java @@ -7,7 +7,6 @@ import javafx.beans.value.ObservableObjectValue; import javafx.collections.ObservableList; import seedu.eventtory.commons.core.GuiSettings; -import seedu.eventtory.commons.core.index.Index; import seedu.eventtory.model.association.Association; import seedu.eventtory.model.commons.exceptions.AssociationDeleteException; import seedu.eventtory.model.event.Event; diff --git a/src/test/java/seedu/eventtory/testutil/ModelStub.java b/src/test/java/seedu/eventtory/testutil/ModelStub.java index 72238da3ace..48cee42d162 100644 --- a/src/test/java/seedu/eventtory/testutil/ModelStub.java +++ b/src/test/java/seedu/eventtory/testutil/ModelStub.java @@ -7,7 +7,6 @@ import javafx.beans.value.ObservableObjectValue; import javafx.collections.ObservableList; import seedu.eventtory.commons.core.GuiSettings; -import seedu.eventtory.commons.core.index.Index; import seedu.eventtory.model.Model; import seedu.eventtory.model.ReadOnlyEventTory; import seedu.eventtory.model.ReadOnlyUserPrefs; @@ -191,12 +190,17 @@ public ObservableIntegerValue getStartingIndexOfAssignedEvents() { } @Override - public Index getRelativeIndexOfEvent(Event event) { + public int getRelativeIndexOfEvent(Event event) { throw new AssertionError("This method should not be called."); } @Override - public Index getRelativeIndexOfVendor(Vendor vendor) { + public int getRelativeIndexOfVendor(Vendor vendor) { + throw new AssertionError("This method should not be called."); + } + + @Override + public ObservableIntegerValue getIndexOfSelectedObject() { throw new AssertionError("This method should not be called."); } } From 7a583f49ac7ce6e9fc831eb78c43af7314e463d8 Mon Sep 17 00:00:00 2001 From: Jabez Tho Date: Thu, 7 Nov 2024 21:31:42 +0800 Subject: [PATCH 45/69] Add edit use case --- docs/DeveloperGuide.md | 35 +++++++++++++++++++++++++++++++++++ 1 file changed, 35 insertions(+) diff --git a/docs/DeveloperGuide.md b/docs/DeveloperGuide.md index 86926d0098b..2428cf92f60 100644 --- a/docs/DeveloperGuide.md +++ b/docs/DeveloperGuide.md @@ -450,6 +450,41 @@ Priorities: High (must have) - `* * *`, Medium (nice to have) - `* *`, Low (unli --- +** Use case: UC05 - Edit an item** + +**MSS** +1. User enters command to edit an item. +2. System updates the item with the new details provided by the user. +3. System displays a success message. + + Use case ends. + +**Extensions** +* 1a. The command format entered by the user is invalid. + + * 1a1. System shows an error message and displays the correct command format. + + Use case ends. +* 2a. The item does not exist. + + * 2a1. System shows an error message. + + Use case ends. + +* 2b. The updated details conflict with an existing item. + + * 2b1. System shows an error message. + + Use case ends. + +* 2c. The item is currently being viewed. + + * 2c1. System updates the displayed item with the new details. + + Use case ends. + +--- + *{More to be added}* ### Non-Functional Requirements From da8ccb8b610ead4dca82bd0238728d6618e3fa34 Mon Sep 17 00:00:00 2001 From: C5hives Date: Thu, 7 Nov 2024 21:41:44 +0800 Subject: [PATCH 46/69] Update user stories to fit change in scope --- docs/DeveloperGuide.md | 50 +++++++++++++++++++++++------------------- 1 file changed, 27 insertions(+), 23 deletions(-) diff --git a/docs/DeveloperGuide.md b/docs/DeveloperGuide.md index 4fcb2d6020a..f6f1c1a76b8 100644 --- a/docs/DeveloperGuide.md +++ b/docs/DeveloperGuide.md @@ -303,29 +303,33 @@ With the ability to track event details and contact information for various vend Priorities: High (must have) - `* * *`, Medium (nice to have) - `* *`, Low (unlikely to have) - `*` -| Priority | As a …​ | I want to …​ | So that I can…​ | -|----------|-----------------------------|--------------------------------------------------------|------------------------------------------------------------------------------------------------| -| `* * *` | event planner | create a new event with date, time and location | easily track upcoming events | -| `* * *` | event planner | create a new vendor with phone number | keep track of vendors' data easily | -| `* * *` | event planner | delete an event | remove entries I no longer need and keep the address book less cluttered | -| `* * *` | event planner | delete a vendor | remove entries I no longer need and keep the address book less cluttered | -| `* * *` | event planner | assign a vendor to an event | keep track of which vendors have been hired for an event | -| `* *` | event planner | find a vendor by name and tags | choose a suitable vendor quickly for a new event | -| `* *` | event planner | categorise vendors | easily see what services a vendor provides | -| `* *` | event planner | modify event and vendor details | correct any mistakes or changes made to an event or vendor | -| `* *` | forgetful event planner | write additional notes for an event or vendor | keep track of miscellaneous information regarding each events or remarks regarding a vendor | -| `* *` | event planner | rate vendors in the system | keep track of how good past experiences of working with the vendor were | -| `* *` | event planner | send Whatsapp or Telegram messages from within the app | easily contact vendors without 'leaving' the address book | -| `* *` | fast typer | chain multiple commands together before entering | accomplish multiple actions without worrying about hitting the 'Enter' key after every command | -| `* *` | computer user with no mouse | navigate the address book using only keyboard | use the app without a mouse | -| `* *` | event planner | set progress statuses for vendors | keep track of completed vendor deliverables | -| `* *` | event planner | archive events | clear events that are completed | -| `* *` | event planner | filter vendors by rating | avoid working with less reputable vendors | -| `* *` | event planner | indicate the types of vendors required for an event | know what manpower or vendor I am missing for an event | -| `* *` | fast typer | map commands to (shorter) aliases | customise commands that I use often into more convenient phrases | -| `* *` | fast typer | autocomplete half-typed commands | reduce the number of keystrokes required per command | -| `* *` | event planner | view all my events on a calendar | easily monitor the events that I have across the week/month/year | -| `* *` | event planner | tag a cost range for each vendor | easily find appropriate vendors according to the budget of specific events | +| Priority | As a …​ | I want to …​ | So that I can…​ | +|----------|-----------------------------|-------------------------------------------------------------------|------------------------------------------------------------------------------------------------| +| `* * *` | event planner | create a new event with name, date and tags | easily track upcoming events | +| `* * *` | event planner | create a new vendor with name, phone number, description and tags | keep track of vendors' data easily | +| `* * *` | event planner | delete an event | remove entries I no longer need and keep the address book less cluttered | +| `* * *` | event planner | delete a vendor | remove entries I no longer need and keep the address book less cluttered | +| `* * *` | event planner | assign a vendor to an event | keep track of which vendors have been hired for an event | +| `* * *` | event planner | unassign a vendor from an event | remove vendors assigned from events when they are no longer need for an event | +| `* *` | event planner | find a vendor by name and tags | choose a suitable vendor quickly for a new event | +| `* *` | event planner | find an event by name and tags | search for an event of interest | +| `* *` | event planner | view information related to a vendor | lookup vendor information | +| `* *` | event planner | view information related to an event | lookup event information | +| `* *` | computer user with no mouse | navigate the address book using only a keyboard | use the app without a mouse | +| `* *` | event planner | modify event and vendor details | correct any mistakes or changes made to an event or vendor | +| `* *` | forgetful event planner | write additional notes for an event or vendor | keep track of miscellaneous information regarding each events or remarks regarding a vendor | +| `*` | event planner | categorise vendors | easily see what services a vendor provides | +| `*` | event planner | rate vendors in the system | keep track of how good past experiences of working with the vendor were | +| `*` | event planner | send Whatsapp or Telegram messages from within the app | easily contact vendors without 'leaving' the address book | +| `*` | fast typer | chain multiple commands together before entering | accomplish multiple actions without worrying about hitting the 'Enter' key after every command | +| `*` | event planner | set progress statuses for vendors | keep track of completed vendor deliverables | +| `*` | event planner | archive events | clear events that are completed | +| `*` | event planner | filter vendors by rating | avoid working with less reputable vendors | +| `*` | event planner | indicate the types of vendors required for an event | know what manpower or vendor I am missing for an event | +| `*` | fast typer | map commands to (shorter) aliases | customise commands that I use often into more convenient phrases | +| `*` | fast typer | autocomplete half-typed commands | reduce the number of keystrokes required per command | +| `*` | event planner | view all my events on a calendar | easily monitor the events that I have across the week/month/year | +| `*` | event planner | tag a cost range for each vendor | easily find appropriate vendors according to the budget of specific events | ### Use cases From 40d04fd019d1127b140a1f1a06fa423cc4d02924 Mon Sep 17 00:00:00 2001 From: Kevin Pek Date: Thu, 7 Nov 2024 21:42:01 +0800 Subject: [PATCH 47/69] Add sequence diagram for assign command implementation --- docs/DeveloperGuide.md | 8 +++ docs/diagrams/AssignSequenceDiagram.puml | 86 ++++++++++++++++++++++++ 2 files changed, 94 insertions(+) create mode 100644 docs/diagrams/AssignSequenceDiagram.puml diff --git a/docs/DeveloperGuide.md b/docs/DeveloperGuide.md index f166fcfe51a..b2af884d301 100644 --- a/docs/DeveloperGuide.md +++ b/docs/DeveloperGuide.md @@ -175,6 +175,14 @@ Step 2. Assign the first `Event` from the list of assignable events to the curre Step 3. To unassign the `Event` from the vendor, use the command `unassign 1`. The `Event` should now be shifted from the list of assigned events to the list of assignable events. + + + + +**Note:** The lifeline for `AssignCommand` should end at the destroy marker (X) but due to a limitation of PlantUML, the lifeline reaches the end of diagram. + + + The `AssignCommand` and `UnassignCommand` classes were introduced to represent these operations. To support parsing the arguments to both commands, the `AssignCommandParser` and `UnassignCommandParser` classes were added. #### Changes to Model diff --git a/docs/diagrams/AssignSequenceDiagram.puml b/docs/diagrams/AssignSequenceDiagram.puml new file mode 100644 index 00000000000..c000c986101 --- /dev/null +++ b/docs/diagrams/AssignSequenceDiagram.puml @@ -0,0 +1,86 @@ +@startuml +!include style.puml +skinparam ArrowFontStyle plain + +box Logic LOGIC_COLOR_T1 +participant ":LogicManager" as LogicManager LOGIC_COLOR +participant ":EventToryParser" as EventToryParser LOGIC_COLOR +participant ":AssignCommandParser" as AssignCommandParser LOGIC_COLOR +participant "a:AssignCommand" as AssignCommand LOGIC_COLOR +participant "r:CommandResult" as CommandResult LOGIC_COLOR +end box + +box Model MODEL_COLOR_T1 +participant "m:Model" as Model MODEL_COLOR +end box + +[-> LogicManager : execute("assign 1") +activate LogicManager + +LogicManager -> EventToryParser : parseCommand("assign 1") +activate EventToryParser + +create AssignCommandParser +EventToryParser -> AssignCommandParser +activate AssignCommandParser + +AssignCommandParser --> EventToryParser +deactivate AssignCommandParser + +EventToryParser -> AssignCommandParser : parse("1") +activate AssignCommandParser + +create AssignCommand +AssignCommandParser -> AssignCommand +activate AssignCommand + +AssignCommand --> AssignCommandParser : a +deactivate AssignCommand + +AssignCommandParser --> EventToryParser : a +deactivate AssignCommandParser +destroy AssignCommandParser + +EventToryParser --> LogicManager : a +deactivate EventToryParser + +LogicManager -> AssignCommand : execute(m) +activate AssignCommand + +AssignCommand -> Model : getUiState() + +alt viewing Vendor Details + AssignCommand -> Model : getViewedVendor() + AssignCommand -> Model : resolveEvent(selectedIndex) + + alt vendor already assigned to event + AssignCommand -> AssignCommand : throw CommandException + else + AssignCommand -> Model : assignVendorToEvent(vendor, event) + end +else viewing Event Details + AssignCommand -> Model : getViewedEvent() + AssignCommand -> Model : resolveVendor(selectedIndex) + + alt event already contains vendor + AssignCommand -> AssignCommand : throw CommandException + else + AssignCommand -> Model : assignVendorToEvent(vendor, event) + end +else invalid view + AssignCommand -> LogicManager : CommandResult(MESSAGE_ASSIGN_FAILURE_INVALID_VIEW) +end + +create CommandResult +AssignCommand -> CommandResult +activate CommandResult + +CommandResult --> AssignCommand +deactivate CommandResult + +AssignCommand --> LogicManager : r +deactivate AssignCommand + +[<--LogicManager +deactivate LogicManager +@enduml From 2789b0631d105aab80dfb60490b2b493a1bcd6a4 Mon Sep 17 00:00:00 2001 From: Jabez Tho Date: Thu, 7 Nov 2024 21:46:36 +0800 Subject: [PATCH 48/69] Fix extra spacing in javadocs --- src/main/java/seedu/eventtory/logic/Logic.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/main/java/seedu/eventtory/logic/Logic.java b/src/main/java/seedu/eventtory/logic/Logic.java index ce2df96bc7b..fc198035c2e 100644 --- a/src/main/java/seedu/eventtory/logic/Logic.java +++ b/src/main/java/seedu/eventtory/logic/Logic.java @@ -24,7 +24,7 @@ public interface Logic { * @param commandText The command as entered by the user. * @return the result of the command execution. * @throws CommandException If an error occurs during command execution. - * @throws ParseException If an error occurs during parsing. + * @throws ParseException If an error occurs during parsing. */ CommandResult execute(String commandText) throws CommandException, ParseException; From e768e43c93f0cb2fb1fbcc1a21fe76958912a203 Mon Sep 17 00:00:00 2001 From: Kevin Pek Date: Thu, 7 Nov 2024 21:48:43 +0800 Subject: [PATCH 49/69] Modify some sentences for assigning users --- docs/DeveloperGuide.md | 18 ++++++++++-------- 1 file changed, 10 insertions(+), 8 deletions(-) diff --git a/docs/DeveloperGuide.md b/docs/DeveloperGuide.md index b2af884d301..1477e9a4dac 100644 --- a/docs/DeveloperGuide.md +++ b/docs/DeveloperGuide.md @@ -175,6 +175,10 @@ Step 2. Assign the first `Event` from the list of assignable events to the curre Step 3. To unassign the `Event` from the vendor, use the command `unassign 1`. The `Event` should now be shifted from the list of assigned events to the list of assignable events. +The `AssignCommand` and `UnassignCommand` classes were introduced to represent these commands. To support parsing the arguments to both commands, the `AssignCommandParser` and `UnassignCommandParser` classes were added. + +For better understanding, refer to the sequence diagram below which illustrates the execution of the `assign` command: + @@ -183,15 +187,13 @@ Step 3. To unassign the `Event` from the vendor, use the command `unassign 1`. T -The `AssignCommand` and `UnassignCommand` classes were introduced to represent these operations. To support parsing the arguments to both commands, the `AssignCommandParser` and `UnassignCommandParser` classes were added. - #### Changes to Model Implementing these commands required significant changes to the `Model` of the application, details of which are covered in this section: -* A unique id for both the `Event` and `Vendor` classes was introduced, since otherwise there is no unique identifier for either of the items. This is represented by the new `UniqueId` class, which was represented using Java's built-in UUID class. -* To represent pairs of assigned `Event` and `Vendor`, we introduced a new class `Association`, which stores a pair of `UniqueId` classes, taken from an `Event` and `Vendor` instance. -* A `UniqueAssociationList` class was also implemented to allow the user to keep the list of associations in memory. +* A unique identifier for both the `Event` and `Vendor` classes was added. This is represented by the new `UniqueId` class, which makes use of Java's built-in UUID class. +* The `Association` class represents pairs of assigned events and vendors, which is done using a pair of `UniqueId` classes, taken from the respective `Event` and `Vendor` instances. +* The list of associations in the current application's state are stored in the `UniqueAssociationList` class, which enforces a unique constraint on the `Association` instances stored within it. The following methods to support the `assign` and `unassign` commands were implemented in `EventTory`: @@ -214,7 +216,7 @@ We also expose the following methods in the `Model` interface, exposing the same #### Changes to Storage -To support data persistence, `JsonAdaptedAssociation` was also implemented to allow storing the list of associations alongside `Vendor` and `Event` information. In storage data, the list of associations are represented in the following form: +To support data persistence, `JsonAdaptedAssociation` was implemented to allow storing the list of associations alongside `Vendor` and `Event` information. In storage data, the list of associations are represented in the following form: ``` "associations": [ @@ -235,9 +237,9 @@ In the case where the UUID strings are not valid UUID strings, or do not corresp Adding this command into EventTory introduced new edge cases that had to be handled as well. Their details are covered in this section: -When deleting a `Vendor` or `Event` using the `delete` command, we have to make sure that it is not currently being assigned to any other item, otherwise this would lead to the application storing associations between items that no longer exist. To handle this, the `AssociationDeleteException` was added, and would inform the user if they are trying to delete an item that is currently assigned to another item. +When deleting a `Vendor` or `Event` using the `delete` command, we have to make sure that it is not currently being assigned to any other item, otherwise this would lead to the application storing associations between items that no longer exist. To handle this, the `AssociationDeleteException` was added, to inform the user if they are trying to delete an item that is currently assigned to another item. -Since associations are meant to be unique, the `DuplicateAssociationException` was also added to inform the user, when attempting to assign a pair of events and vendors that have already been assigned to each other. +Since associations are meant to be unique, the `DuplicateAssociationException` was also added to inform the user, if they attempt to assign a pair of events and vendors that have already been assigned to each other. To handle the event where the user attempts to unassign a vendor from an event, when there is no existing association between the 2 items, the `AssociationNotFoundException` was added. From 28524a8812e3132024258ebdc894466b2b8adee2 Mon Sep 17 00:00:00 2001 From: C5hives Date: Thu, 7 Nov 2024 21:49:00 +0800 Subject: [PATCH 50/69] Fix use case numbering --- docs/DeveloperGuide.md | 16 ++++++++-------- 1 file changed, 8 insertions(+), 8 deletions(-) diff --git a/docs/DeveloperGuide.md b/docs/DeveloperGuide.md index 86926d0098b..7d43b37ffdc 100644 --- a/docs/DeveloperGuide.md +++ b/docs/DeveloperGuide.md @@ -409,9 +409,9 @@ Priorities: High (must have) - `* * *`, Medium (nice to have) - `* *`, Low (unli * 1a1. System shows an error message and displays the correct command format. Use case ends. -* 2a. The item does not exist. +* 1b. The item does not exist. - * 2a1. System shows an error message. + * 1b1. System shows an error message. Use case ends. @@ -432,19 +432,19 @@ Priorities: High (must have) - `* * *`, Medium (nice to have) - `* *`, Low (unli * 1a1. System shows an error message and displays the correct command format. Use case ends. -* 2a. The item does not exist. +* 1b. The item does not exist. - * 2a1. System shows an error message. + * 1b1. System shows an error message. Use case ends. -* 2b. The event has associated entities assigned to it. +* 1c. The event has associated entities assigned to it. - * 2b1. System shows an error message. + * 1c1. System shows an error message. Use case ends. -* 3a. The item is currently being viewed. +* 2a. The item is currently being viewed. - * 3a1. Return to the main page with both list of events and vendors. + * 2a1. Return to the main page with both list of events and vendors. Use case ends. From 060a7826b090bfb386d60f76dd703845f9376375 Mon Sep 17 00:00:00 2001 From: Kevin Pek Date: Thu, 7 Nov 2024 21:50:49 +0800 Subject: [PATCH 51/69] Remove trailing whitespaces --- docs/diagrams/AssignSequenceDiagram.puml | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/docs/diagrams/AssignSequenceDiagram.puml b/docs/diagrams/AssignSequenceDiagram.puml index c000c986101..f289e901b9f 100644 --- a/docs/diagrams/AssignSequenceDiagram.puml +++ b/docs/diagrams/AssignSequenceDiagram.puml @@ -52,7 +52,7 @@ AssignCommand -> Model : getUiState() alt viewing Vendor Details AssignCommand -> Model : getViewedVendor() AssignCommand -> Model : resolveEvent(selectedIndex) - + alt vendor already assigned to event AssignCommand -> AssignCommand : throw CommandException else @@ -61,7 +61,7 @@ alt viewing Vendor Details else viewing Event Details AssignCommand -> Model : getViewedEvent() AssignCommand -> Model : resolveVendor(selectedIndex) - + alt event already contains vendor AssignCommand -> AssignCommand : throw CommandException else From 774e12f76108f9e72df16fd596a20c21b6f8efd1 Mon Sep 17 00:00:00 2001 From: Hans Delano Date: Thu, 7 Nov 2024 21:52:00 +0800 Subject: [PATCH 52/69] Update index.md --- docs/index.md | 50 ++++++++++++++++++++++++++++++++++---------------- 1 file changed, 34 insertions(+), 16 deletions(-) diff --git a/docs/index.md b/docs/index.md index 8acbdd73507..801ee5ac546 100644 --- a/docs/index.md +++ b/docs/index.md @@ -3,19 +3,37 @@ title: "" --- -# AddressBook Level-3 - -[![CI Status](https://github.com/se-edu/addressbook-level3/workflows/Java%20CI/badge.svg)](https://github.com/se-edu/addressbook-level3/actions) -[![codecov](https://codecov.io/gh/se-edu/addressbook-level3/branch/master/graph/badge.svg)](https://codecov.io/gh/se-edu/addressbook-level3) - -![Ui](images/Ui.png) - -**AddressBook is a desktop application for managing your contact details.** While it has a GUI, most of the user interactions happen using a CLI (Command Line Interface). - -* If you are interested in using AddressBook, head over to the [_Quick Start_ section of the **User Guide**](UserGuide.html#quick-start). -* If you are interested about developing AddressBook, the [**Developer Guide**](DeveloperGuide.html) is a good place to start. - - -**Acknowledgements** - -* Libraries used: [JavaFX](https://openjfx.io/), [Jackson](https://github.com/FasterXML/jackson), [JUnit5](https://github.com/junit-team/junit5) +

    +

    Welcome to EventTory!

    +

    All your vendor and event management tool, all in one place 🎉

    + Ui +
    + + + +
    +

    About EventTory 📋

    +

    EventTory is a desktop application for managing your vendors and events! While it has a GUI, most of the user interactions happen using a CLI (Command Line Interface).

    +
    + +
    +

    Get Started 🚀

    + +
    + +
    +

    Acknowledgements 🙏

    + +
    From 24182ab7e99b3495c34ef3e6f2e815057b87cfa2 Mon Sep 17 00:00:00 2001 From: C5hives Date: Thu, 7 Nov 2024 21:58:45 +0800 Subject: [PATCH 53/69] Fix more formatting --- docs/DeveloperGuide.md | 14 ++++++++++---- 1 file changed, 10 insertions(+), 4 deletions(-) diff --git a/docs/DeveloperGuide.md b/docs/DeveloperGuide.md index 7d43b37ffdc..6845119c42d 100644 --- a/docs/DeveloperGuide.md +++ b/docs/DeveloperGuide.md @@ -343,7 +343,7 @@ Priorities: High (must have) - `* * *`, Medium (nice to have) - `* *`, Low (unli **Extensions** -* 1a. The event name is invalid or empty. +* 1a. The event name is invalid. * 1a1. System shows an error message. @@ -404,11 +404,13 @@ Priorities: High (must have) - `* * *`, Medium (nice to have) - `* *`, Low (unli Use case ends. **Extensions** + * 1a. The command format entered by the user is invalid. * 1a1. System shows an error message and displays the correct command format. Use case ends. + * 1b. The item does not exist. * 1b1. System shows an error message. @@ -417,7 +419,7 @@ Priorities: High (must have) - `* * *`, Medium (nice to have) - `* *`, Low (unli --- -** Use case: UC04 - Delete an item** +**Use case: UC04 - Delete an item** **MSS** 1. User enters command to delete an item. @@ -427,24 +429,28 @@ Priorities: High (must have) - `* * *`, Medium (nice to have) - `* *`, Low (unli Use case ends. **Extensions** + * 1a. The command format entered by the user is invalid. * 1a1. System shows an error message and displays the correct command format. - Use case ends. + Use case ends. + * 1b. The item does not exist. * 1b1. System shows an error message. Use case ends. + * 1c. The event has associated entities assigned to it. * 1c1. System shows an error message. Use case ends. + * 2a. The item is currently being viewed. - * 2a1. Return to the main page with both list of events and vendors. + * 2a1. System returns to the main page. Use case ends. From f1d222a54785906f4d3ac1f2a25a68b26c4c1e6e Mon Sep 17 00:00:00 2001 From: Jabez Tho Date: Thu, 7 Nov 2024 21:59:56 +0800 Subject: [PATCH 54/69] Update user stories for create --- docs/DeveloperGuide.md | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/docs/DeveloperGuide.md b/docs/DeveloperGuide.md index f6f1c1a76b8..f05e6d87c94 100644 --- a/docs/DeveloperGuide.md +++ b/docs/DeveloperGuide.md @@ -305,8 +305,8 @@ Priorities: High (must have) - `* * *`, Medium (nice to have) - `* *`, Low (unli | Priority | As a …​ | I want to …​ | So that I can…​ | |----------|-----------------------------|-------------------------------------------------------------------|------------------------------------------------------------------------------------------------| -| `* * *` | event planner | create a new event with name, date and tags | easily track upcoming events | -| `* * *` | event planner | create a new vendor with name, phone number, description and tags | keep track of vendors' data easily | +| `* * *` | event planner | create a new event with name and date | easily track upcoming events | +| `* * *` | event planner | create a new vendor with name, phone number, and description | keep track of vendors' data easily | | `* * *` | event planner | delete an event | remove entries I no longer need and keep the address book less cluttered | | `* * *` | event planner | delete a vendor | remove entries I no longer need and keep the address book less cluttered | | `* * *` | event planner | assign a vendor to an event | keep track of which vendors have been hired for an event | @@ -314,7 +314,7 @@ Priorities: High (must have) - `* * *`, Medium (nice to have) - `* *`, Low (unli | `* *` | event planner | find a vendor by name and tags | choose a suitable vendor quickly for a new event | | `* *` | event planner | find an event by name and tags | search for an event of interest | | `* *` | event planner | view information related to a vendor | lookup vendor information | -| `* *` | event planner | view information related to an event | lookup event information | +| `* *` | event planner | view information related to an event | lookup event information | | `* *` | computer user with no mouse | navigate the address book using only a keyboard | use the app without a mouse | | `* *` | event planner | modify event and vendor details | correct any mistakes or changes made to an event or vendor | | `* *` | forgetful event planner | write additional notes for an event or vendor | keep track of miscellaneous information regarding each events or remarks regarding a vendor | From d81f50a0292f7b223be80a4cb23e93b045ea3931 Mon Sep 17 00:00:00 2001 From: Hans Delano Date: Thu, 7 Nov 2024 22:00:22 +0800 Subject: [PATCH 55/69] Add animation banner --- docs/index.md | 20 ++++++++++++++++++++ 1 file changed, 20 insertions(+) diff --git a/docs/index.md b/docs/index.md index 801ee5ac546..3e0836dfed3 100644 --- a/docs/index.md +++ b/docs/index.md @@ -3,6 +3,14 @@ title: "" --- + +

    Welcome to EventTory!

    All your vendor and event management tool, all in one place 🎉

    @@ -23,6 +31,18 @@

    EventTory is a desktop application for managing your vendors and events! While it has a GUI, most of the user interactions happen using a CLI (Command Line Interface).

    +
    + From CLI users for CLI users 😎 +
    + +
    +

    Features ✨

    +
      +
    • Manage vendors and events efficiently
    • +
    • Intuitive CLI for quick operations
    • +
    +
    +

    Get Started 🚀

      From 3afbc07f1b9d81c7fa09659e36e53af9062a5c22 Mon Sep 17 00:00:00 2001 From: Hans Delano Date: Thu, 7 Nov 2024 22:07:53 +0800 Subject: [PATCH 56/69] Change colour --- docs/index.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docs/index.md b/docs/index.md index 3e0836dfed3..98e999310ef 100644 --- a/docs/index.md +++ b/docs/index.md @@ -31,7 +31,7 @@

      EventTory is a desktop application for managing your vendors and events! While it has a GUI, most of the user interactions happen using a CLI (Command Line Interface).

    -
    +
    From CLI users for CLI users 😎
    From 7f86bc8cdff82f49fa692f6c8525f4e63c8744c8 Mon Sep 17 00:00:00 2001 From: C5hives Date: Thu, 7 Nov 2024 22:10:01 +0800 Subject: [PATCH 57/69] Fix use case numbering --- docs/DeveloperGuide.md | 14 +++++++------- 1 file changed, 7 insertions(+), 7 deletions(-) diff --git a/docs/DeveloperGuide.md b/docs/DeveloperGuide.md index 2428cf92f60..572856c9448 100644 --- a/docs/DeveloperGuide.md +++ b/docs/DeveloperGuide.md @@ -454,7 +454,7 @@ Priorities: High (must have) - `* * *`, Medium (nice to have) - `* *`, Low (unli **MSS** 1. User enters command to edit an item. -2. System updates the item with the new details provided by the user. +2. System updates the item with the new details provided. 3. System displays a success message. Use case ends. @@ -465,21 +465,21 @@ Priorities: High (must have) - `* * *`, Medium (nice to have) - `* *`, Low (unli * 1a1. System shows an error message and displays the correct command format. Use case ends. -* 2a. The item does not exist. +* 1b. The item does not exist. - * 2a1. System shows an error message. + * 1b1. System shows an error message. Use case ends. -* 2b. The updated details conflict with an existing item. +* 1c. The updated details conflict with an existing item. - * 2b1. System shows an error message. + * 1c1. System shows an error message. Use case ends. -* 2c. The item is currently being viewed. +* 1d. The item is currently being viewed. - * 2c1. System updates the displayed item with the new details. + * 1d1. System updates the displayed item with the new details. Use case ends. From ca113872ebd079a8b8cd7940ea30a033d95ffda9 Mon Sep 17 00:00:00 2001 From: kahsuann Date: Thu, 7 Nov 2024 22:14:54 +0800 Subject: [PATCH 58/69] Add unassign use cases to DG --- docs/DeveloperGuide.md | 42 ++++++++++++++++++++++++++++++++++++++++-- 1 file changed, 40 insertions(+), 2 deletions(-) diff --git a/docs/DeveloperGuide.md b/docs/DeveloperGuide.md index 6845119c42d..9e2d374d014 100644 --- a/docs/DeveloperGuide.md +++ b/docs/DeveloperGuide.md @@ -395,7 +395,45 @@ Priorities: High (must have) - `* * *`, Medium (nice to have) - `* *`, Low (unli --- -**Use case: UC03 - View an item** +**Use case: UC03 - Unassign a vendor from an event** + +**MSS** + +1. User enters command to unassign a vendor from an event. +2. System unassigns the vendor from the event. +3. System displays a success message. + + Use case ends. + +**Extensions** + +* 1a. The command format entered by the user is invalid. + + * 1a1. System shows an error message and displays the correct command format. + + Use case ends. + +* 2a. The event does not exist. + + * 2a1. System shows an error message. + + Use case ends. + +* 2b. The vendor does not exist. + + * 2b1. System shows an error message. + + Use case ends. + +* 2c. The vendor is not assigned to the event. + + * 2c1. System shows an error message. + + Use case ends. + +--- + +**Use case: UC04 - View an item** **MSS** 1. User enters command to view an item. @@ -419,7 +457,7 @@ Priorities: High (must have) - `* * *`, Medium (nice to have) - `* *`, Low (unli --- -**Use case: UC04 - Delete an item** +**Use case: UC05 - Delete an item** **MSS** 1. User enters command to delete an item. From 9a2a123c156905bee2664506d00336a4d54d8c5b Mon Sep 17 00:00:00 2001 From: C5hives Date: Thu, 7 Nov 2024 22:31:11 +0800 Subject: [PATCH 59/69] Update more formatting --- docs/UserGuide.md | 17 ++++++++++------- 1 file changed, 10 insertions(+), 7 deletions(-) diff --git a/docs/UserGuide.md b/docs/UserGuide.md index f5e85596d3e..6b51ca77fde 100644 --- a/docs/UserGuide.md +++ b/docs/UserGuide.md @@ -138,6 +138,7 @@ Notes on Command Formats: * The `view`, `edit` and `delete` commands support off-screen operations. Even when vendors/events are not currently displayed, they can still be selected by `view`, `edit` and `delete` commands. * This is a feature, not a bug. +

    * If you are using a PDF version of this document, be careful when copying and pasting commands that span multiple lines as space characters surrounding line-breaks may be omitted when copied over to the application. @@ -152,10 +153,10 @@ Format: * To create a vendor: `create v/ n/VENDOR_NAME d/DESCRIPTION p/PHONE_NUMBER [t/TAG]…​` * To create en event: `create e/ n/EVENT_NAME on/DATE [t/TAG]…​` -Notes: +Note: If parameters are provided for the `v/` and `e/` flags, they will be ignored.
    -**Tip:** A vendor or event can have any number of tags (including 0). +Tip: A vendor or event can have any number of tags (including 0).
    Examples: @@ -170,7 +171,7 @@ Format: * To edit a vendor: `edit v/INDEX [n/NAME] [p/PHONE] [d/DESCRIPTION] [t/TAG]…​` * To edit an event: `edit e/INDEX [n/NAME] [on/DATE] [t/TAG]…​` -Notes: +Note: * Edits the vendor/event at the specified `INDEX`. * The index refers to the index number shown in the vendor or event list. * The index **must be a positive integer** 1, 2, 3, …​ @@ -193,6 +194,7 @@ Deletes a vendor or an event from EventTory. Format: `delete [v/INDEX]` or `delete [e/INDEX]` +Note: * Deletes the event or vendor at the specified `INDEX`. * The index refers to the index number shown in the displayed event/vendor list respectively. * The index **must be a positive integer** 1, 2, 3, ... @@ -212,7 +214,7 @@ Displays the list of vendors and/or events in EventTory. Format: `list [v/] [e/]` -Notes: +Note: * The list(s) displayed depends on whether the `v/` and/or `e/` prefix(es) is specified. * If no prefixes are specified, both the vendor and event lists will be displayed. * The prefixes can be specified in any order. @@ -229,6 +231,7 @@ Views the details of a vendor or event. Format: `view v/INDEX` or `view e/INDEX` +Note: * Views the details of the vendor/event at the specified `INDEX`. * The index refers to the index number shown in the displayed vendor/event list. * The index **must be a positive integer** 1, 2, 3, ... @@ -246,7 +249,7 @@ Assigns vendors to events and vice versa. Format: `assign INDEX` -Notes: +Note: * Assigns the vendor/event specified at `INDEX` to the current viewed event/vendor. * The index refers to the index number shown in the **assignable** vendor/event list. * The index **must be a positive integer** 1, 2, 3, ... @@ -263,7 +266,7 @@ Unassigns vendors from events and vice versa. Format: `unassign INDEX` -Notes: +Note: * Unassigns the vendor/event specified at `INDEX` to the current viewed event/vendor. * The index refers to the index number shown in the **assigned** vendor/event list. * The index **must be a positive integer** 1, 2, 3, ... @@ -280,7 +283,7 @@ Finds vendors or events whose attributes contain any of the space-separated keyw Format: `find v/ KEYWORD [MORE_KEYWORDS]` or `find e/ KEYWORD [MORE_KEYWORDS]` -Notes: +Note: * The search is case-insensitive. e.g. `party` will match `Party` * Any partial matches will still be matched e.g. `par` will match `party` * The order of the keywords does not matter. From 13b8fecf3bf851aa88f1473c5fc0d6429e740def Mon Sep 17 00:00:00 2001 From: Jabez Tho Date: Thu, 7 Nov 2024 22:32:33 +0800 Subject: [PATCH 60/69] Add list use case --- docs/DeveloperGuide.md | 26 ++++++++++++++++++++++++++ 1 file changed, 26 insertions(+) diff --git a/docs/DeveloperGuide.md b/docs/DeveloperGuide.md index 174d7541715..9586ef0c869 100644 --- a/docs/DeveloperGuide.md +++ b/docs/DeveloperGuide.md @@ -495,6 +495,32 @@ Priorities: High (must have) - `* * *`, Medium (nice to have) - `* *`, Low (unli --- +**Use case: UC06 - List items** + +**MSS** +1. User enters command to list +2. System displays lists of both events and vendors. + + Use case ends. + +**Extensions** +* 1a. The command format entered by the user is invalid. + + * 1a1. System shows an error message and displays the correct command format. + + Use case ends. +* 1b. User list events only. + + * 1b1. System displays a list of events. + + Use case ends. + +* 1c. User list vendors only. + + * 1c1. System displays a list of vendors. + + Use case ends. + *{More to be added}* ### Non-Functional Requirements From fdc2c9173e8f724fdd2972536dc762ff53d27b39 Mon Sep 17 00:00:00 2001 From: Kevin Pek Date: Thu, 7 Nov 2024 22:40:45 +0800 Subject: [PATCH 61/69] Update sequence diagram for assign command --- docs/diagrams/AssignSequenceDiagram.puml | 16 +++++++--------- 1 file changed, 7 insertions(+), 9 deletions(-) diff --git a/docs/diagrams/AssignSequenceDiagram.puml b/docs/diagrams/AssignSequenceDiagram.puml index f289e901b9f..14dcbfcaedc 100644 --- a/docs/diagrams/AssignSequenceDiagram.puml +++ b/docs/diagrams/AssignSequenceDiagram.puml @@ -53,22 +53,20 @@ alt viewing Vendor Details AssignCommand -> Model : getViewedVendor() AssignCommand -> Model : resolveEvent(selectedIndex) - alt vendor already assigned to event - AssignCommand -> AssignCommand : throw CommandException - else - AssignCommand -> Model : assignVendorToEvent(vendor, event) + opt vendor already assigned to event + AssignCommand --> LogicManager : CommandException() end + AssignCommand -> Model : assignVendorToEvent(vendor, event) else viewing Event Details AssignCommand -> Model : getViewedEvent() AssignCommand -> Model : resolveVendor(selectedIndex) - alt event already contains vendor - AssignCommand -> AssignCommand : throw CommandException - else - AssignCommand -> Model : assignVendorToEvent(vendor, event) + opt event already contains vendor + AssignCommand --> LogicManager : CommandException() end + AssignCommand -> Model : assignVendorToEvent(vendor, event) else invalid view - AssignCommand -> LogicManager : CommandResult(MESSAGE_ASSIGN_FAILURE_INVALID_VIEW) + AssignCommand -> LogicManager : CommandResult() end create CommandResult From 80aea4e7f8b1638d645a952de9acc8fcb4903e95 Mon Sep 17 00:00:00 2001 From: C5hives Date: Thu, 7 Nov 2024 22:43:04 +0800 Subject: [PATCH 62/69] Change wording for list use case --- docs/DeveloperGuide.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docs/DeveloperGuide.md b/docs/DeveloperGuide.md index 9586ef0c869..3e7ddf5a7c8 100644 --- a/docs/DeveloperGuide.md +++ b/docs/DeveloperGuide.md @@ -498,7 +498,7 @@ Priorities: High (must have) - `* * *`, Medium (nice to have) - `* *`, Low (unli **Use case: UC06 - List items** **MSS** -1. User enters command to list +1. User enters command to list items. 2. System displays lists of both events and vendors. Use case ends. From 65e80f319c4e3d5f045ed76d5349b2bdb59c444e Mon Sep 17 00:00:00 2001 From: Kevin Pek Date: Thu, 7 Nov 2024 22:43:08 +0800 Subject: [PATCH 63/69] Update sequence diagram exception message --- docs/diagrams/AssignSequenceDiagram.puml | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/docs/diagrams/AssignSequenceDiagram.puml b/docs/diagrams/AssignSequenceDiagram.puml index 14dcbfcaedc..c2804e09f10 100644 --- a/docs/diagrams/AssignSequenceDiagram.puml +++ b/docs/diagrams/AssignSequenceDiagram.puml @@ -54,7 +54,7 @@ alt viewing Vendor Details AssignCommand -> Model : resolveEvent(selectedIndex) opt vendor already assigned to event - AssignCommand --> LogicManager : CommandException() + AssignCommand --> LogicManager : CommandException(MESSAGE_VENDOR_ALREADY_ASSIGNED_TO_EVENT) end AssignCommand -> Model : assignVendorToEvent(vendor, event) else viewing Event Details @@ -62,11 +62,11 @@ else viewing Event Details AssignCommand -> Model : resolveVendor(selectedIndex) opt event already contains vendor - AssignCommand --> LogicManager : CommandException() + AssignCommand --> LogicManager : CommandException(MESSAGE_EVENT_ALREADY_ASSIGNED_TO_VENDOR) end AssignCommand -> Model : assignVendorToEvent(vendor, event) else invalid view - AssignCommand -> LogicManager : CommandResult() + AssignCommand -> LogicManager : CommandResult(MESSAGE_ASSIGN_FAILURE_INVALID_VIEW) end create CommandResult From 3727598a49401219d950c8ee34ec4f90db1152e3 Mon Sep 17 00:00:00 2001 From: Hans Delano Date: Thu, 7 Nov 2024 22:43:29 +0800 Subject: [PATCH 64/69] Update map when event is edited --- src/main/java/seedu/eventtory/model/event/UniqueEventList.java | 2 ++ 1 file changed, 2 insertions(+) diff --git a/src/main/java/seedu/eventtory/model/event/UniqueEventList.java b/src/main/java/seedu/eventtory/model/event/UniqueEventList.java index 262aa16550f..54570c6e59b 100644 --- a/src/main/java/seedu/eventtory/model/event/UniqueEventList.java +++ b/src/main/java/seedu/eventtory/model/event/UniqueEventList.java @@ -68,6 +68,8 @@ public void setEvent(Event target, Event editedEvent) { throw new DuplicateEventException(); } + UniqueId eventId = target.getId(); + eventMap.put(eventId, editedEvent); internalList.set(index, editedEvent); } From 0519d4091976ccd7e07fa2330abc18984fb8ffc0 Mon Sep 17 00:00:00 2001 From: kahsuann Date: Thu, 7 Nov 2024 22:43:31 +0800 Subject: [PATCH 65/69] Update DG for Assign and Unassign --- docs/DeveloperGuide.md | 22 ++++++---------------- 1 file changed, 6 insertions(+), 16 deletions(-) diff --git a/docs/DeveloperGuide.md b/docs/DeveloperGuide.md index 9e2d374d014..94d1212b69c 100644 --- a/docs/DeveloperGuide.md +++ b/docs/DeveloperGuide.md @@ -359,6 +359,7 @@ Priorities: High (must have) - `* * *`, Medium (nice to have) - `* *`, Low (unli **Use case: UC02 - Assign a vendor to an event** +Preconditions: User is viewing an item. **MSS** 1. User enters command to assign a vendor to an event. @@ -375,28 +376,23 @@ Priorities: High (must have) - `* * *`, Medium (nice to have) - `* *`, Low (unli Use case ends. -* 2a. The event does not exist. +* 2a. The selected item does not exist. * 2a1. System shows an error message. Use case ends. -* 2b. The vendor does not exist. +* 2b. The vendor has already been assigned to the event. * 2b1. System shows an error message. Use case ends. -* 2c. The vendor has already been assigned to the event. - - * 2c1. System shows an error message. - - Use case ends. - --- **Use case: UC03 - Unassign a vendor from an event** +Preconditions: User is viewing an item. **MSS** 1. User enters command to unassign a vendor from an event. @@ -413,24 +409,18 @@ Priorities: High (must have) - `* * *`, Medium (nice to have) - `* *`, Low (unli Use case ends. -* 2a. The event does not exist. +* 2a. The selected item does not exist. * 2a1. System shows an error message. Use case ends. -* 2b. The vendor does not exist. +* 2b. The vendor is not assigned to the event. * 2b1. System shows an error message. Use case ends. -* 2c. The vendor is not assigned to the event. - - * 2c1. System shows an error message. - - Use case ends. - --- **Use case: UC04 - View an item** From c34ff740a5e1a0d64cca7a4e895a2be8ceeb4271 Mon Sep 17 00:00:00 2001 From: Hans Delano Date: Thu, 7 Nov 2024 22:43:53 +0800 Subject: [PATCH 66/69] Update assigned items when items are edited --- src/main/java/seedu/eventtory/ui/EventDetailsPanel.java | 4 ++++ src/main/java/seedu/eventtory/ui/VendorDetailsPanel.java | 4 ++++ 2 files changed, 8 insertions(+) diff --git a/src/main/java/seedu/eventtory/ui/EventDetailsPanel.java b/src/main/java/seedu/eventtory/ui/EventDetailsPanel.java index ec087307f1d..53080526904 100644 --- a/src/main/java/seedu/eventtory/ui/EventDetailsPanel.java +++ b/src/main/java/seedu/eventtory/ui/EventDetailsPanel.java @@ -79,6 +79,10 @@ public EventDetailsPanel(Logic logic) { updateAssignedVendors(); }); + logic.getFilteredVendorList().addListener((ListChangeListener) change -> { + updateAssignedVendors(); + }); + VendorListPanel vendorListPanel = new VendorListPanel(assignedVendors, "Assigned Vendors", startIndexOfAssignedVendors); detailsChildrenPlaceholder.getChildren().add(vendorListPanel.getRoot()); diff --git a/src/main/java/seedu/eventtory/ui/VendorDetailsPanel.java b/src/main/java/seedu/eventtory/ui/VendorDetailsPanel.java index c2e66ace367..44712737db9 100644 --- a/src/main/java/seedu/eventtory/ui/VendorDetailsPanel.java +++ b/src/main/java/seedu/eventtory/ui/VendorDetailsPanel.java @@ -82,6 +82,10 @@ public VendorDetailsPanel(Logic logic) { updateAssignedEvents(); }); + logic.getFilteredEventList().addListener((ListChangeListener) change -> { + updateAssignedEvents(); + }); + EventListPanel eventListPanel = new EventListPanel(assignedEvents, "Assigned Events", startIndexOfAssignedEvents); detailsChildrenPlaceholder.getChildren().add(eventListPanel.getRoot()); From 94253ca257339dd2bec0a37f691d0edfecfe376e Mon Sep 17 00:00:00 2001 From: kahsuann Date: Thu, 7 Nov 2024 22:45:00 +0800 Subject: [PATCH 67/69] Update assign and unassign use cases --- docs/DeveloperGuide.md | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/docs/DeveloperGuide.md b/docs/DeveloperGuide.md index 94d1212b69c..9a03ec08f1d 100644 --- a/docs/DeveloperGuide.md +++ b/docs/DeveloperGuide.md @@ -376,7 +376,7 @@ Preconditions: User is viewing an item. Use case ends. -* 2a. The selected item does not exist. +* 2a. The selected item is invalid. * 2a1. System shows an error message. @@ -409,7 +409,7 @@ Preconditions: User is viewing an item. Use case ends. -* 2a. The selected item does not exist. +* 2a. The selected item is invalid. * 2a1. System shows an error message. From a5fee8b185b5e9ab73f5e317abab94a7119592c3 Mon Sep 17 00:00:00 2001 From: Jabez Tho Date: Thu, 7 Nov 2024 22:48:51 +0800 Subject: [PATCH 68/69] Slight change in unassign use case wording --- docs/DeveloperGuide.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docs/DeveloperGuide.md b/docs/DeveloperGuide.md index 9a03ec08f1d..bf7d377a81f 100644 --- a/docs/DeveloperGuide.md +++ b/docs/DeveloperGuide.md @@ -376,7 +376,7 @@ Preconditions: User is viewing an item. Use case ends. -* 2a. The selected item is invalid. +* 2a. The selected item does not exist. * 2a1. System shows an error message. From 3b6f9dddbfeb5ad87cb5baa532548fe70a98e7ca Mon Sep 17 00:00:00 2001 From: C5hives Date: Thu, 7 Nov 2024 22:52:32 +0800 Subject: [PATCH 69/69] Simplify use case for list item --- docs/DeveloperGuide.md | 15 ++------------- 1 file changed, 2 insertions(+), 13 deletions(-) diff --git a/docs/DeveloperGuide.md b/docs/DeveloperGuide.md index 3e7ddf5a7c8..11bf405d945 100644 --- a/docs/DeveloperGuide.md +++ b/docs/DeveloperGuide.md @@ -498,8 +498,8 @@ Priorities: High (must have) - `* * *`, Medium (nice to have) - `* *`, Low (unli **Use case: UC06 - List items** **MSS** -1. User enters command to list items. -2. System displays lists of both events and vendors. +1. User inputs the lists to display. +2. System displays chosen lists. Use case ends. @@ -509,17 +509,6 @@ Priorities: High (must have) - `* * *`, Medium (nice to have) - `* *`, Low (unli * 1a1. System shows an error message and displays the correct command format. Use case ends. -* 1b. User list events only. - - * 1b1. System displays a list of events. - - Use case ends. - -* 1c. User list vendors only. - - * 1c1. System displays a list of vendors. - - Use case ends. *{More to be added}*