Skip to content

Commit

Permalink
Merge branch 'master' into edit-default-tags
Browse files Browse the repository at this point in the history
  • Loading branch information
tingxuanp committed Oct 30, 2024
2 parents fb725b3 + 47b0420 commit d0225fe
Show file tree
Hide file tree
Showing 185 changed files with 9,728 additions and 394 deletions.
6 changes: 5 additions & 1 deletion build.gradle
Original file line number Diff line number Diff line change
Expand Up @@ -20,6 +20,10 @@ checkstyle {
toolVersion = '10.2'
}

run {
enableAssertions = true
}

test {
useJUnitPlatform()
finalizedBy jacocoTestReport
Expand Down Expand Up @@ -66,7 +70,7 @@ dependencies {
}

shadowJar {
archiveFileName = 'addressbook.jar'
archiveFileName = 'WedLinker.jar'
}

defaultTasks 'clean', 'test'
230 changes: 180 additions & 50 deletions docs/UserGuide.md
Original file line number Diff line number Diff line change
Expand Up @@ -6,7 +6,7 @@

# WedLinker 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.
WedLinker 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.

<!-- * Table of Contents -->
<page-nav-print />
Expand Down Expand Up @@ -42,7 +42,8 @@ AddressBook Level 3 (AB3) is a **desktop app for managing contacts, optimized fo

--------------------------------------------------------------------------------------------------------------------

## Features
# Features
## General Features

<box type="info" seamless>

Expand Down Expand Up @@ -70,16 +71,85 @@ AddressBook Level 3 (AB3) is a **desktop app for managing contacts, optimized fo

Shows a message explaning how to access the help page.

//Reminder to update the link of help
![help message](images/helpMessage.png)

Format: `help`

### Listing all Persons : `list`

Shows a list of all saved [Persons](#adding-a-person-add) in the WedLinker.

Format: `list`

### Listing all Weddings : `list-weddings`

Shows a list of all [Weddings](#adding-a-wedding--create-wedding) in the WedLinker.

### Listing all Tasks : `list-tasks`

Shows a list of all [Tasks](#creating-a-task--create-task) in the WedLinker

### Locating contacts by any field, similar to a search function: `find`

Finds all persons based on the specified keywords (case-insensitive) after the prefix representing the field, and displays them as a list with index numbers.

Format: `find PREFIX KEYWORD [KEYWORD]…​`

* The search is case-insensitive. e.g `hans` will match `Hans`
* The search will return partial matches and full matches
* The order of the keywords does not matter. e.g. `Hans Bo` will match `Bo Hans`

Examples of Prefixes:
* n/ Name
* a/ Address
* p/ Phone Number
* e/ Email
* t/ Tag
* w/ Wedding
* tk/ Task

Examples:
* `find n/John` returns `john` and `John Doe`
* `find n/alex david` returns `Alex Yeoh`, `David Li`<br>
![result for 'find alex david'](images/findAlexDavidResult.png)
* `find t/Friends` returns all Contacts tagged with Friends
* `find w/Amy's Wedding` returns all Contacts involved with Amy's Wedding

### Clearing all entries : `clear`

Clears all entries from the address book.

Format: `clear`

### Exiting the program : `exit`

Exits the program.

Format: `exit`

### Saving the data

AddressBook data are saved in the hard disk automatically after any command that changes the data. There is no need to save manually.

### Editing the data file

AddressBook data are saved automatically as a JSON file `[JAR file location]/data/addressbook.json`. Advanced users are welcome to update data directly by editing that data file.

<box type="warning" seamless>

**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.<br>
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.
</box>

## Person Features

### Adding a person: `add`

Adds a person to the address book.

Format: `add n/NAME p/PHONE_NUMBER e/EMAIL a/ADDRESS [t/TAG]…​`
Format: `add n/NAME [p/PHONE_NUMBER] [e/EMAIL] [a/ADDRESS] [t/TAG]…​ [w/WEDDING]…​`

<box type="tip" seamless>

Expand All @@ -90,50 +160,23 @@ Examples:
* `add n/John Doe p/98765432 e/[email protected] a/John street, block 123, #01-01`
* `add n/Betsy Crowe t/friend e/[email protected] a/Newgate Prison p/1234567 t/criminal`

### Listing all persons : `list`

Shows a list of all persons in the address book.

Format: `list`

### Editing a person : `edit`

Edits an existing person in the address book.

Format: `edit INDEX [n/NAME] [p/PHONE] [e/EMAIL] [a/ADDRESS] [t/TAG]…​`
Format: `edit INDEX [n/NAME] [p/PHONE] [e/EMAIL] [a/ADDRESS]`

* Edits the person at the specified `INDEX`. The index refers to the index number shown in the displayed person list. The index **must be a positive integer** 1, 2, 3, …​
* At least one of the optional fields must be provided.
* Existing values will be updated to the input values.
* When editing tags, the existing tags of the person will be removed i.e adding of tags is not cumulative.
* You can remove all the person’s tags by typing `t/` without
specifying any tags after it.

Examples:
* `edit 1 p/91234567 e/[email protected]` Edits the phone number and email address of the 1st person to be `91234567` and `[email protected]` respectively.
* `edit 2 n/Betsy Crower t/` Edits the name of the 2nd person to be `Betsy Crower` and clears all existing tags.

### Locating persons by name: `find`

Finds persons whose names contain any of the given keywords.

Format: `find KEYWORD [MORE_KEYWORDS]`

* The search is case-insensitive. e.g `hans` will match `Hans`
* The order of the keywords does not matter. e.g. `Hans Bo` will match `Bo Hans`
* Only the name is searched.
* Only full words will be matched e.g. `Han` will not match `Hans`
* Persons matching at least one keyword will be returned (i.e. `OR` search).
e.g. `Hans Bo` will return `Hans Gruber`, `Bo Yang`

Examples:
* `find John` returns `john` and `John Doe`
* `find alex david` returns `Alex Yeoh`, `David Li`<br>
![result for 'find alex david'](images/findAlexDavidResult.png)
* `edit 2 n/Betsy Crower` Edits the name of the 2nd person to be `Betsy Crower`

### Deleting a person : `delete`

Deletes the specified person from the address book.
Deletes the specified person from WedLiker.

Format: `delete INDEX`

Expand All @@ -145,36 +188,123 @@ 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`
### Tag Features

Clears all entries from the address book.
### Adding a tag : `create-tag`

Format: `clear`
Creates a `Tag` within WedLinker to be used on contacts.

### Exiting the program : `exit`
Format: `create-tag t/TAGNAME`

Exits the program.
* The `TAGNAME` is alphanumeric and can contain whitespaces.
* Tags are unique in WedLinker, there would not be any duplicated Tags.
* Contacts can share Tags.

Format: `exit`
### Assign tag to contact : `tag`

### Saving the data
Assigns a `Tag` to the specified person in WedLinker

AddressBook data are saved in the hard disk automatically after any command that changes the data. There is no need to save manually.
Format: `tag INDEX t/TAGNAME [f/]`

### Editing the data file
* Tag a specified contact based on the `INDEX` with a `Tag`.
* The index refers to the index number shown in the displayed person list.
* The index **must be a positive integer** 1, 2, 3, …​.
* The `Tag` must exists in WedLinker before it can be assigned.
* If the `Tag` does not exist, you can use `f/` to force the creation and assignment of the `Tag`.

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.
### Unassign tag to contacts : `untag`

<box type="warning" seamless>
Untags a `Tag` from a specified person in WedLinker

Format: `untag INDEX t/TAGNAME`

* Untag a specified contact based on their `INDEX` with a `Tag`.
* The index refers to the index number shown in the displayed person list.
* The index **must be a positive integer** 1, 2, 3, …​.

### Deleting a tag : `delete-tag`

Deletes a `Tag` from WedLinker.

Format: `delete-tag t/TAGNAME [f/]`

* Deletes a `Tag` from WedLinker.
* The `Tag` must exists in WedLinker.
* The `Tag` cannot be assigned to any contacts.
* If the `Tag` is in used, you can use `f/` to force the deletion of the `Tag` and unassign this tag from all contacts.

### Wedding Features

### Adding a Wedding : `create-wedding`

Creates a `Wedding` within WedLinker to be with contacts.

Format: `create-wedding w/WEDDINGNAME`

* The `WEDDINGNAME` is alphanumeric and can contain whitespaces.
* Weddings are unique in WedLinker, there would not be any duplicated Weddings.
* Contacts can be assigned to the Wedding using the [assign-wedding](#assign-contact-to-a-wedding--assign-wedding) command.

### Assign contact to a Wedding : `assign-wedding`

Assigns a contact to a `Wedding`.

Format: `assign-wedding INDEX w/WEDDINGNAME`

* Assigns a specified contact to the `Wedding` based on their `INDEX`.
* The index refers to the index number shown in the displayed person list.
* The index **must be a positive integer** 1, 2, 3, …​.
* The `Wedding` must exists in WedLinker before it can be assigned.
* If the `Wedding` does not exist, you can use `f/` to force the creation and assignment of the `Wedding`.

### Edit Wedding details : `edit-wedding`

Edits the details of a `Wedding`.

Format: `edit-wedding INDEX [w/WEDDINGNAME] [a/ADDRESS]`

* Edits the specific `Wedding` at the INDEX when in [list-wedding](#listing-all-weddings-list-weddings) view.
* The index **must be a positive integer** 1, 2, 3, …​.
* Existing values in the specified fields will be overwritten with the specified values.

### Unassign contacts from a Wedding : `unassign-wedding`

Unassigns a contact from a `Wedding` in WedLinker.

Format: `unassign-wedding INDEX w/WEDDINGNAME`

* Unassign a contact that is assigned in a `Wedding`.
* The index refers to the index number shown in the displayed person list.
* The index **must be a positive integer** 1, 2, 3, …​.

### Deleting a Wedding : `delete-wedding`

Deletes a `Wedding` from WedLinker.

Format: `delete-wedding w/WEDDINGNAME [f/]`

* Deletes a `Wedding ` from WedLinker.
* The no contacts should be assigned to the `Wedding` before it is deleted.
* If there are still contacts assigned, you can use `f/` to force the deletion of the `Wedding` and unassign all contacts.

### Task Features

### Creating a Task : `create-task`

Creates a `Task` in WedLinker

Format: `create-task tk/TASKTYPE TASKDESCRIPTION [REMARKS]`

### Delete a Task : `delete-task`

Deletes a `Task` from WedLinker

Format: `delete-task INDEX`

**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.<br>
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.
</box>

### Archiving data files `[coming in v2.0]`
### Assigning a Task to a contact : `assign-task` **(WIP)**

_Details coming soon ..._
### Unassigning a Task from a contact : `unassign-task` **(WIP)**

--------------------------------------------------------------------------------------------------------------------

Expand Down
37 changes: 37 additions & 0 deletions docs/diagrams/FindCommandClass.puml
Original file line number Diff line number Diff line change
@@ -0,0 +1,37 @@
@startuml

hide circle
skinparam classAttributeIconSize 0
skinparam classMethodAttributeIconSize 0
hide empty methods


Class "<<interface>>\nModel" as Model
Class "{abstract}\nCommand" as Command
Class "{abstract}\nFindCommand" as FindCommand
Command : CommandResult execute(Model model) &#123;abstract&#125;


Model <.left. FindCommand
Class FindXYZCommand extends FindCommand
Class FindCommand extends Command
Class "{abstract}\nPredicate<T>" as Predicate {
+ boolean test(T t) &#123;abstract&#125;
}
Class "{abstract}\nTraitContainsKeywordPredicate<T>" as TraitContainsKeywordPredicate
Class "XYZContainsKeywordsPredicate" as XYZContainsKeywordPredicate
Class TraitContainsKeywordPredicate implements Predicate
Class XYZContainsKeywordPredicate extends TraitContainsKeywordPredicate

TraitContainsKeywordPredicate.up.>Predicate
FindXYZCommand -right-> XYZContainsKeywordPredicate

hide FindCommand fields
hide Model fields
hide TraitContainsKeywordPredicate fields
hide FindXYZCommand fields
hide XYZContainsKeywordPredicate fields



@enduml
Loading

0 comments on commit d0225fe

Please sign in to comment.