diff --git a/README.md b/README.md
index 13f5c77403f..1bb0a15a2d1 100644
--- a/README.md
+++ b/README.md
@@ -1,14 +1,26 @@
-[![CI Status](https://github.com/se-edu/addressbook-level3/workflows/Java%20CI/badge.svg)](https://github.com/se-edu/addressbook-level3/actions)
+[![CI Status](https://github.com/AY2223S1-CS2103T-W12-2/tp/workflows/Java%20CI/badge.svg)](https://github.com/AY2223S1-CS2103T-W12-2/tp/actions)
![Ui](docs/images/Ui.png)
-* This is **a sample project for Software Engineering (SE) students**.
+* This is **a brownfield project for Software Engineering (SE) students**.
Example usages:
- * as a starting point of a course project (as opposed to writing everything from scratch)
- * as a case study
-* The project simulates an ongoing software project for a desktop application (called _AddressBook_) used for managing contact details.
+ * Can be used by secretaries and treasurers to manage the club they belong to.
+ * Can also be used to take notes and as a bare-boned address book as well.
+* The project simulates an ongoing software project for a desktop application (called _SectresBook_) used for managing contact details.
* It is **written in OOP fashion**. It provides a **reasonably well-written** code base **bigger** (around 6 KLoC) than what students usually write in beginner-level SE modules, without being overwhelmingly big.
* It comes with a **reasonable level of user and developer documentation**.
-* It is named `AddressBook Level 3` (`AB3` for short) because it was initially created as a part of a series of `AddressBook` projects (`Level 1`, `Level 2`, `Level 3` ...).
-* For the detailed documentation of this project, see the **[Address Book Product Website](https://se-education.org/addressbook-level3)**.
-* This project is a **part of the se-education.org** initiative. If you would like to contribute code to this project, see [se-education.org](https://se-education.org#https://se-education.org/#contributing) for more info.
+* It is named `SectresBook` because it is used by Secretaries and Treasurers of clubs to manage their club information.
+* For the detailed documentation of this project, see the **[SectresBook Product Website](https://ay2223s1-cs2103t-w12-2.github.io/tp/)**.
+* This project is based on the AddressBook-Level3 project created by the [SE-EDU initiative](https://se-education.org).
+
+-------------
+
+## Acknowledgements
+
+The background of the program is a large-scale city, attributed to [GiulioDesign94](https://www.deviantart.com/giuliodesign94)'s [Big City](https://www.deviantart.com/giuliodesign94/art/Big-City-198672166).
+
+The icon of this program is an edited image from DepositPhotos, found [here](https://depositphotos.com/471137460/stock-illustration-book-yellow-glowing-neon-icon.html).
+
+The fonts used in this application are [Minion](https://fonts.adobe.com/fonts/minion) by Robert Slimbach and [Bender](https://www.1001fonts.com/bender-font.html) by Ivan Gladkikh, Oleg Zhuravlev and published by Jovanny Lemonad.
+
+This team recognises that the rights to the images go to their respective owners.
diff --git a/build.gradle b/build.gradle
index 108397716bd..8b388ebebb6 100644
--- a/build.gradle
+++ b/build.gradle
@@ -25,6 +25,10 @@ test {
finalizedBy jacocoTestReport
}
+run {
+ enableAssertions = true
+}
+
task coverage(type: JacocoReport) {
sourceDirectories.from files(sourceSets.main.allSource.srcDirs)
classDirectories.from files(sourceSets.main.output)
@@ -42,7 +46,7 @@ task coverage(type: JacocoReport) {
dependencies {
String jUnitVersion = '5.4.0'
- String javaFxVersion = '11'
+ String javaFxVersion = '11.0.2'
implementation group: 'org.openjfx', name: 'javafx-base', version: javaFxVersion, classifier: 'win'
implementation group: 'org.openjfx', name: 'javafx-base', version: javaFxVersion, classifier: 'mac'
@@ -66,7 +70,7 @@ dependencies {
}
shadowJar {
- archiveFileName = 'addressbook.jar'
+ archiveFileName = 'SectresBook.jar'
}
defaultTasks 'clean', 'test'
diff --git a/docs/AboutUs.md b/docs/AboutUs.md
index 1c9514e966a..3fa019980f4 100644
--- a/docs/AboutUs.md
+++ b/docs/AboutUs.md
@@ -5,55 +5,67 @@ title: About Us
We are a team based in the [School of Computing, National University of Singapore](http://www.comp.nus.edu.sg).
-You can reach us at the email `seer[at]comp.nus.edu.sg`
+You can reach us on our GitHub portfolios, links provided below.
## Project team
-### John Doe
+### T Neethesh
-
+
-[[homepage](http://www.comp.nus.edu.sg/~damithch)]
-[[github](https://github.com/johndoe)]
-[[portfolio](team/johndoe.md)]
+[[github](https://github.com/Neethesh26)]
+[[portfolio](team/neethesh26.md)]
-* Role: Project Advisor
+* Role: Developer
+* Responsibilities:
+ * Feature (EditLoan, Loan History)
+ * English Proofreading
+ * Meeting coordinator
-### Jane Doe
+### Chen Ruihan
-
+
-[[github](http://github.com/johndoe)]
-[[portfolio](team/johndoe.md)]
+[[github](http://github.com/rui-han-crh)]
+[[portfolio](team/rui-han-crh.md)]
-* Role: Team Lead
-* Responsibilities: UI
+* Role: Developer
+* Responsibilities:
+ * User Interface
+ * Feature (Loans)
+ * English Proofreading
+ * Project Embellishments
-### Johnny Doe
+### Ryan Chua
-
+
-[[github](http://github.com/johndoe)] [[portfolio](team/johndoe.md)]
+[[github](http://github.com/ryanczx)]
+[[portfolio](team/ryanczx.md)]
* Role: Developer
-* Responsibilities: Data
+* Responsibilities: Tags
-### Jean Doe
+### Chee Zhong Wei
-
+
-[[github](http://github.com/johndoe)]
-[[portfolio](team/johndoe.md)]
+[[github](http://github.com/czhongwei)]
+[[portfolio](team/czhongwei.md)]
* Role: Developer
-* Responsibilities: Dev Ops + Threading
+* Responsibilities: Find, Birthday, Documentation
-### James Doe
+### Jiang Pinran
-
+
-[[github](http://github.com/johndoe)]
-[[portfolio](team/johndoe.md)]
+[[github](http://github.com/Pinran-J)]
+[[portfolio](team/pinran-j.md)]
* Role: Developer
-* Responsibilities: UI
+* Responsibilities:
+ * Feature (All notes related)
+ * English Proofreading
+ * Team meeting management
+
diff --git a/docs/DeveloperGuide.md b/docs/DeveloperGuide.md
index 46eae8ee565..a73328fbb8a 100644
--- a/docs/DeveloperGuide.md
+++ b/docs/DeveloperGuide.md
@@ -2,14 +2,68 @@
layout: page
title: Developer Guide
---
-* Table of Contents
-{:toc}
+
+## Table of Contents
+* [Acknowledgements](#acknowledgements)
+* [Overview](#overview)
+* [Setting up, getting started](#setting-up-getting-started)
+* [Design](#design)
+ * [Architecture](#architecture)
+ * [UI Component](#ui-component)
+ * [Logic Component](#logic-component)
+ * [Model Component](#model-component)
+ * [Storage Component](#storage-component)
+* [Properties Objects](#properties-objects)
+ * [Properties of Person Objects](#properties-of-person-objects)
+ * [Properties of Note Objects](#properties-of-note-objects)
+* [Implementation](#implementation)
+ * [Person Features](#person-features)
+ * [Edit Person](#edit-person)
+ * [Delete Person](#delete-person)
+ * [Find Person](#find-person)
+ * [Edit Loan](#edit-loan-value-and-history-of-person-by-editloan-feature)
+ * [Find by Tag](#find-persons-and-notes-by-tag)
+ * [Notes Features](#notes-features)
+ * [Add Note](#add-note)
+ * [Delete Note](#delete-note)
+ * [Edit Note](#edit-note)
+ * [UI Features](#ui-features)
+ * [General UI Design and Mechanism](#general-ui-design-and-mechanism)
+ * [Inspect Feature](#inspect-feature)
+ * [Showing and Hiding Panel Feature](#showing-and-hiding-the-notes-panel-feature)
+ * [[Proposed] Undo redo feature](#proposed-undoredo-feature)
+* [Documentation, logging, testing, configuration, dev-ops](#documentation-logging-testing-configuration-dev-ops)
+* [Appendix](#appendix-requirements)
+ * [Requirements](#appendix-requirements)
+ * [Product scope](#product-scope)
+ * [User stories](#user-stories)
+ * [Use Cases](#use-cases)
+ * [Non-Functional Requirements](#non-functional-requirements)
+ * [Glossary](#glossary)
+ * [Instructions for manual testing](#appendix-instructions-for-manual-testing)
+
--------------------------------------------------------------------------------------------------------------------
## **Acknowledgements**
-* {list here sources of all reused/adapted ideas, code, documentation, and third-party libraries -- include links to the original source as well}
+The background of the program is a large-scale city, attributed to [GiulioDesign94](https://www.deviantart.com/giuliodesign94)'s [Big City](https://www.deviantart.com/giuliodesign94/art/Big-City-198672166).
+
+The icon of this program is an edited image from DepositPhotos, found [here](https://depositphotos.com/471137460/stock-illustration-book-yellow-glowing-neon-icon.html).
+
+This team recognises the rights to the images go to their respective owners.
+
+--------------------------------------------------------------------------------------------------------------------
+
+## **Overview**
+
+SectresBook helps secretaries to maintain all the information of the members of their club by collating a list of identifiable information, past loan records and future tasks.
+
+Our main target audience is secretaries, but this may be expanded to any person in need of loan tracking and task tracking features provided by our software.
+
+This Developer Guide is written for maintainers of SectresBook.
+
+Designers and developers who wish to extend or morph this product may also use this documentation to gain a better understanding of the design of this software.
--------------------------------------------------------------------------------------------------------------------
@@ -18,6 +72,7 @@ title: Developer Guide
Refer to the guide [_Setting up and getting started_](SettingUp.md).
--------------------------------------------------------------------------------------------------------------------
+
## **Design**
@@ -73,16 +128,32 @@ The **API** of this component is specified in [`Ui.java`](https://github.com/se-
![Structure of the UI Component](images/UiClassDiagram.png)
-The UI consists of a `MainWindow` that is made up of parts e.g.`CommandBox`, `ResultDisplay`, `PersonListPanel`, `StatusBarFooter` etc. All these, including the `MainWindow`, inherit from the abstract `UiPart` class which captures the commonalities between classes that represent parts of the visible GUI.
+The UI consists of a `MainWindow` that is made up of parts e.g.`CommandBox`, `ResultDisplay`, `PersonListPanel`, `NoteListPanel`, `PersonInspectPanel` `StatusBarFooter` etc. All these, including the `MainWindow`, inherit from the abstract `UiPart` class which captures the commonalities between classes that represent parts of the visible GUI.
The `UI` component uses the JavaFx UI framework. The layout of these UI parts are defined in matching `.fxml` files that are in the `src/main/resources/view` folder. For example, the layout of the [`MainWindow`](https://github.com/se-edu/addressbook-level3/tree/master/src/main/java/seedu/address/ui/MainWindow.java) is specified in [`MainWindow.fxml`](https://github.com/se-edu/addressbook-level3/tree/master/src/main/resources/view/MainWindow.fxml)
+The `UI` component is separate from the state of the `Model` and changes to the `UI` will not affect the `Model`, but changes to the `Model`'s state will affect the information displayed by the `UI` elements.
+
+Similarly, changes to the visual aspects of `UI`, such as current person viewed, or the filtered state of the lists, will not be saved to file as they do not affect the `Model`'s data.
+
The `UI` component,
* executes user commands using the `Logic` component.
* listens for changes to `Model` data so that the UI can be updated with the modified data.
* keeps a reference to the `Logic` component, because the `UI` relies on the `Logic` to execute commands.
-* depends on some classes in the `Model` component, as it displays `Person` object residing in the `Model`.
+* depends on some classes in the `Model` component, as it displays `Person` and `Notes` object residing in the `Model`.
+
+This component may be controlled by commands through the `CommandResult` class, which specifies an optional `UiState` that the program should be in at the end of the command execution. This is parsed finally in the `MainWindow::executeCommand` which invokes necessary changes to the UI.
+
+For more information related to the implementation of the UI, please review the section [UI Features](#ui-features).
+
+#### UI Elements
+![](images/UiLabeled.png)
+1. **Command Box**: A text box that allows users to enter in commands for later execution.
+2. **ResultDisplay**: A readonly text box that serves as a console to give feedback from the `Logic` component to the user, such as error messages or logs.
+3. **Person List**: A horizontal sliding list that displays all persons in the SectresBook. This list can be filtered to display only relevant people according to some predicate.
+4. **Note List**: A vertical sliding list that displays all notes in the SectresBook. This list can be filtered to display only relevant notes according to some predicate.
+5. **Person Inspect Panel**: This Panel displays data of a person, using the UI command `inspect`.
### Logic component
@@ -102,9 +173,13 @@ The Sequence Diagram below illustrates the interactions within the `Logic` compo
![Interactions Inside the Logic Component for the `delete 1` Command](images/DeleteSequenceDiagram.png)
-
:information_source: **Note:** The lifeline for `DeleteCommandParser` should end at the destroy marker (X) but due to a limitation of PlantUML, the lifeline reaches the end of diagram.
+
:information_source: **Note:** The lifeline for `DeleteCommandParser` should end at the destroy-marker (X) but due to a limitation of PlantUML, the lifeline reaches the end of diagram.
+Commands such as Edit and Delete feature the ability to delete by name, which utilises the Find feature. Illustrated here is how `execute("edit Lynette")` interacts with the Logic component, using a sequence diagram
+
+![Interactions Inside the Logic Component for the `edit Lynette` Command](images/EditSequenceDiagram.png)
+
Here are the other classes in `Logic` (omitted from the class diagram above) that are used for parsing a user command:
@@ -121,17 +196,11 @@ How the parsing works:
The `Model` component,
-* stores the address book data i.e., all `Person` objects (which are contained in a `UniquePersonList` object).
+* stores the address book data i.e., all `Person` objects (which are contained in a `UniquePersonList` object) and all `Note` objects (contained in a `NoteBook` object)
* stores the currently 'selected' `Person` objects (e.g., results of a search query) as a separate _filtered_ list which is exposed to outsiders as an unmodifiable `ObservableList` that can be 'observed' e.g. the UI can be bound to this list so that the UI automatically updates when the data in the list change.
* stores a `UserPref` object that represents the user’s preferences. This is exposed to the outside as a `ReadOnlyUserPref` objects.
* does not depend on any of the other three components (as the `Model` represents data entities of the domain, they should make sense on their own without depending on other components)
-
-
:information_source: **Note:** An alternative (arguably, a more OOP) model is given below. It has a `Tag` list in the `AddressBook`, which `Person` references. This allows `AddressBook` to only require one `Tag` object per unique tag, instead of each `Person` needing their own `Tag` objects.
-
-
-
-
-
+
### Storage component
@@ -149,14 +218,483 @@ The `Storage` component,
Classes used by multiple components are in the `seedu.addressbook.commons` package.
--------------------------------------------------------------------------------------------------------------------
+
+
+## Properties Objects
+
+### Properties of Person Objects
+
+This section explains the components of a person object and how they can be used to track information.
+
+
+
+A person object contains editable properties:
+1. Name
+ - Describes the full name of the person
+2. Phone
+ - Records the mobile phone contact number of the person
+3. Email
+ - Records the email address of the person
+4. Address
+ - Records the home address of the person
+5. Birthday
+ - Records the birthday of the person
+6. Tag
+ - Optionally tags the person with a variable number of tags for easy reference within the SectresBook.
+
+And a non-editable properties:
+1. Loan
+ - Tracks the current loan amount of the person. A positive number means that the person currently owes money to the club, a negative number means that money is due to be paid to the person.
+2. List of Loan Histories
+ - Tracks the transactional history of incoming and outgoing loans. Each Loan History comprises a Loan and a Record.
+
+During instantiation, a person object can be declared with all fields, but during editing, Loan must use a specialised command `editLoan` to transform its data.
+
+
+### Properties of Note Objects
+
+This section explains the components of a note object and how they can be used to track information.
+
+
-## **Implementation**
+A note object contains editable properties:
+1. Title
+ - The title of the note, which can be searched by.
+2. Content
+ - The description of the note.
+3. Tags
+ - Optional tags that can be assigned to the notes, after-which every person with that tag will be associated with the notes.
+
+During instantiation, a note object can be declared with any of these properties.
+
+-------------------
+
+## Implementation
This section describes some noteworthy details on how certain features are implemented.
+### Person Features
+
+#### Edit Person
+
+The Edit Person feature is facilitated by the `EditCommand` which utilises the `FindCommand`. It allows users to edit any editable field of a person given the index of the person, or the name of the person.
+
+If given a name that does not correspond to any person in the SectresBook, the edit features performs the same operations as the `Find` command.
+
+Given below is an example usage scenario and how the edit mechanism behaves at each step.
+
+Step 1. The user enters the edit command, with either the index or the person's name.
+
+Step 2a If an index is entered, the `EditCommandParser` carries this index to the `EditCommand`, which retrieves the `Person` to edit by getting the `Model`'s current `FilteredList` and retrieving by index.
+
+Step 2b. If a non-number is entered, the `EditCommandParser` invokes the `FindCommandParser#parse` method and executes it at the same time with `FindCommand#execute`. The `FilteredList` is then checked to ensure that there is exactly one person that corresponds with the search term. Otherwise, the method short-circuits with ambiguity errors (more than 1 person) or invalid person errors (no persons at all). If successful, `EditCommandParser` returns a new `EditCommand` with a one-based-index of 1.
+
+- Example of ambiguity error message:
+> There is more than 1 person with the name [NAME]
+
+- Example of invalid name error message:
+> There is nobody with the name [NAME]
+
+Step 3. `EditCommand#execute` is called by the `LogicManager`. The person to edit is retrieved by the index given and a new edited person is created by copying over non-transformed fields and replacing the transformed field.
+
+Step 4. The `editedPerson` is then set to replace the previous state of the `Person` object in the `Model` with `Model#setPerson`.
+
+The following sequence diagram shows how the `edit` feature works.
+
+![Interactions Inside the Logic Component for the `delete 1` Command](images/EditSequenceDiagram.png)
+
+#### Delete Person
+
+The delete person feature is facilitated by `DeleteCommand`. It allows users to delete a person from the SectresBook that match the full
+First name or Last name of the person.
+
+Given below is the example usage scenario and how the delete feature behaves at each step.
+
+Step 1. The user executes 'delete David' command to delete a person with the name 'David' from the SectresBook.
+
+Step 2. The `DeleteCommandParser` creates a `FindCommand` with 'David'.
+
+Step 3. The `DeleteCommand` is executed with Index 1.
+
+The following sequence diagram shows how the delete command works:
+
+
+
+
:information_source: **Note:** The lifeline for `DeleteCommandParser` should end at the destroy marker (X)
+but due to a limitation of PlantUML, the lifeline reaches the end of diagram.
+
+##### Design Considerations:
+
+**Aspect: How delete executes:**
+
+* **Alternative 1 (Currect choice):** Deletes person based on complete first/last name from input.
+ * Pros: Less strictness of input from the user to delete a person.
+ * Cons: User may accidentally delete a person not meant to be deleted.
+* **Alternative 2:** Delete a person based on complete name i.e. first and last name required in input.
+ * Pros: Stricter input requirement, ensuring that persons are not accidentally deleted.
+ * Cons: Longer input required for the same output.
+
+
+#### Find Person
+
+The Find Person feature is facilitated by 'FindCommand'. It allows users to find all Persons with names that are matching or phone number starting with any of the keywords.
+
+Given below is an example usage scenario and how the find feature behaves at each step.
+
+Step 1. The user executes 'find David' command to find all Persons in the address book that includes the name `David`.
+
+Step 2. A `FindCommand` is constructed with a `NameContainsKeywordPredicate` which checks through the list of persons in the address book and only shows those with their first/last name matching `David`.
+
+Step 3. The `FindCommand` is executed and the `NameContainsKeywordsPredicate` is used to update the filtered person list.
+
+The following sequence diagram shows how the find command works:
+
+
+
+
:information_source: **Note:** The lifeline for `FindCommandParser` and `FindCommand` should end at the destroy marker (X) but due to a limitation of PlantUML, the lifeline reaches the end of diagram.
+
+
+
+##### Design considerations:
+
+**Aspect: How find executes:**
+
+* **Alternative 1 (current choice):** Chooses person based on the whole first/last name matching the keyword.
+ * Pros: More specific Persons list after the find command.
+ * Cons: User needs to know the first/last name of the person they are trying to find.
+
+* **Alternative 2:** Chooses person if name contains the keyword.
+ * Pros: Easier to find person.
+ * Cons: Persons list may show other persons that are not desired by the user.
+
+#### Edit loan value and history of Person by EditLoan feature
+
+The Edit Loan feature is facilitated by the `EditLoanCommand` which utilises the `FindCommand`. It allows users to edit the loan value and update the loan history of a person given the index of the person, or the name of the person.
+
+If given a name that does not correspond to any person in the SectresBook, the edit feature performs the same operations as the `Find` command.
+
+Given below is an example usage scenario and how the editLoan mechanism behaves at each step.
+
+Step 1. The user enters the editLoan command, with either the index or the person's name.
+
+Step 2a If an index is entered, the `EditLoanCommandParser` carries this index to the `EditCommand`, which retrieves the `Person` to edit by getting the `Model`'s current `FilteredList` and retrieving by index.
+
+Step 2b. If a non-number is entered, the `EditLoanCommandParser` invokes the `FindCommandParser#parse` method and executes it at the same time with `FindCommand#execute`. The `FilteredList` is then checked to ensure that there is exactly one person that corresponds with the search term. Otherwise, the method short-circuits with ambiguity errors (more than 1 person) or invalid person errors (no persons at all). If successful, `EditLoanCommandParser` returns a new `EditLoanCommand` with a one-based-index of 1.
+
+- Example of ambiguity error message:
+> There is more than 1 person with the name [NAME]
+
+- Example of invalid name error message:
+> There is nobody with the name [NAME]
+
+Step 3. `EditLoanCommand#execute` is called by the `LogicManager`. The person to edit is retrieved by the index given and a new edited person is created by copying over non-transformed fields and replacing the transformed field.
+
+Step 4. The `editedPerson` is then set to replace the previous state of the `Person` object in the `Model` with `Model#setPerson`.
+
+The following sequence diagram shows how the `editLoan` feature works with index.
+
+
+
+
+#### Find Persons and Notes by Tag
+
+The find Persons and Notes by Tag feature (called `findTag`) is facilitated by `FindTagCommand`. It allows users to find all Persons and Notes with the given Tags.
+
+Given below is an example usage scenario and how the findTag feature behaves at each step.
+
+Step 1. The user executes `findTag Finance` command to find all Persons and Notes in the SectresBook with the tag `Finance`.
+
+Step 2. A `FindTagCommand` is constructed with a `PersonTagsContainsKeywordsPredicate` and `NoteTagsContainsKeywordsPredicate` which will check through the list of Persons and Notes in the SectresBook and only show those with the tag `Finance`.
+
+Step 3. The `FindTagCommand` is executed and the `PersonTagsContainsKeywordsPredicate` and `NoteTagsContainsKeywordsPredicate` is passed to model to update the Person List and Note List to only show Persons and Notes with the tag `Finance`.
+
+The following sequence diagram shows how the findTag command works:
+
+
+
+
:information_source: **Note:** The lifeline for `FindTagCommandParser` and `FindTagCommand` should end at the destroy marker (X) but due to a limitation of PlantUML, the lifeline reaches the end of diagram.
+
+
+
+##### Design considerations:
+
+**Aspect: How findTag executes:**
+
+* **Alternative 1 (current choice):** Goes through all Persons and Notes to check for Tag.
+ * Pros: Easy to implement (Similar to current find command).
+ * Cons: May have performance issues in terms of having to do many more steps.
+
+* **Alternative 2:** Goto searched Tags and get the Persons and Notes that each Tag points to.
+ * Pros: Will use fewer steps (Go directly to the Tags rather than looking through all Persons and Notes).
+ * Cons: Implementation would be more complicated.
+
+
+### Notes Features
+
+#### Add Note
+
+The addNote mechanism is facilitated by `AddNoteCommand`. It extends `Command` and overrides `Command#execute()` to implement the following operation:
+- `AddNoteCommand#execute()` : adds the specified note with its associated title and content into the list of notes to be kept track of.
+
+Given below is an example usage scenario and how the addNote mechanism behaves at each step.
+
+Step 1. The user launches the application and wishes to keep track of a note with the following attributes :
+1. Title : Club meeting
+2. Content : 3rd October 9pm, brief everybody on upcoming events.
+
+Step 2. The user executes `addNote title/Meeting content/3rd October 9pm`, which calls `LogicManager#execute()`. Subsequently, `AddressBookParser#parseCommand()` is called
+which will create a `AddNoteCommandParser` object and call `AddNoteCommandParser#parse()`. This method will take the user's input and make sense of it to create a `Note` object.
+
+Step 3. An `AddNoteCommand` will be created and `AddNoteCommand#execute()` will be called by `LogicManager#execute()`.
+
+Step 4. `AddNoteCommand#execute()` will call the following method from `Model` :
+- `addNote(toAdd)`
+
+Step 5. `AddNoteCommand#execute()` will return a `CommandResult` object which will display the following message back to the user:
+> New note added: Title: Meeting, Content: 3rd October 9pm
+
+The following sequence diagram shows how the addNote operation works:
+
+![AddNoteSequenceDiagram](images/AddNoteSequenceDiagram.png)
+
+##### Design considerations
+
+**Aspect: How Title and Content are represented:**
+
+* **Alternative 1 (current choice):** Title and Content as separate objects.
+ * Pros: Easy to validate Title/Content. (In the respective classes)
+ * Cons: May have performance issues in terms of memory usage(Many objects might be created).
+
+* **Alternative 2:** Title and Content as fields of Note
+ * Pros: Will use less memory (Fewer objects created).
+ * Cons: Harder to validate Title/Content. Better OOP(Object-oriented programming) design.
+
+#### Delete Note
+
+The deleteNote mechanism is facilitated by `DeleteNoteCommand`. It extends `Command` and overrides `Command#execute()` to implement the following operation:
+- `DeleteNoteCommand#execute()` : deletes the note at the specified index from the note list.
+
+Given below is an example usage scenario and how the addNote mechanism behaves at each step.
+
+Step 1. The user launches the application and wishes to delete a note that no longer needs to be kept track of. The user lists the current notes:
+1. Title: Meeting, Content: 3rd October 9pm
+2. Title: Event, Content: Remind club members to attend.
+
+The user has decided to delete note 1.
+
+Step 2. The user executes `deleteNote 1`, which calls `LogicManager#execute()`. Subsequently, `AddressBookParser#parseCommand()` is called
+which will create a `DeleteNoteCommandParser` object and call `DeleteNoteCommandParser#parse()`. This method will take the user's input and make sense of it to get the index of note to be deleted.
+
+Step 3. A `DeleteNoteCommand` object will be created and `DeleteNoteCommand#execute()` will be called by `LogicManager#execute()`.
+
+Step 4. `DeleteNoteCommand#execute()` will call the following method from `Model` :
+- `getAddressBook()`
+- `deleteNote(noteToDelete)`
+
+Step 5. `DeleteNoteCommand#execute()` will return a `CommandResult` object which will display the following message back to the user:
+> Deleted Note: Title: Meeting, Content: 3rd October 9pm
+
+The following sequence diagram shows how the addNote operation works:
+
+![DeleteNoteSequenceDiagram](images/DeleteNoteSequenceDiagram.png)
+
+##### Design considerations
+
+**Aspect: How the note to be deleted is specified:**
+
+* **Alternative 1 (current choice):** Note is specified by index.
+ * Pros: Easy to implement.
+ * Cons: Would need to use listNotes command or gui to allow easy identification of index of note.
+
+* **Alternative 2:** Note is specified by Title.
+ * Pros: Would be more precise (Title of notes are unique).
+ * Cons: Long command would be needed to delete a note with a long Title.
+
+#### Edit Note
+
+The editNote mechanism is facilitated by `EditNoteCommand` and utilises the `FindNoteCommand`. It extends `Command` and overrides `Command#execute()` to implement the following operation:
+- `EditNoteCommand#execute()` : edits the note at the specified index (or with matching title) from the note list.
+
+Given below is an example usage scenario and how the editNote mechanism behaves at each step.
+
+Step 1. The user launches the application and wishes to edit a note's title with a new title. The user lists the current notes:
+1. Title: Meeting, Content: 3rd October 9pm
+2. Title: Event, Content: Remind club members to attend.
+
+The user has decided to edit the first note titled `Meeting` with a new title, `Club Meeting`.
+
+Step 2a. If an index is entered (user executes `editNote 1 title/Club Meeting`), the `EditNoteCommandParser` carries this index to the `EditNoteCommand`, which retrieves the `Note` to edit by getting the `Model`'s current `FilteredList` and retrieving by index.
+
+Step 2b. If a non-number is entered (user executes `editNote meeting title/Club Meeting`), `EditNoteCommandParser` calls `FindNoteCommandParser#parse()` and executes `FindNoteCommand#execute()` concurrently.
+
+`FilteredList` is then checked to ensure that exactly one note corresponds with the search term.
+
+Otherwise, the method short-circuits with ambiguity errors (more than 1 note) or invalid note errors (no notes at all). If successful, `EditNoteCommandParser` returns a new `EditNoteCommand` object.
+
+
+- Example of ambiguity error message:
+> There is more than 1 note with meeting in their title!
+>
+> Please use a more unique specifier or use indices to edit.
+
+- Example of invalid title error message:
+> There are no notes with meeting in their titles in the list!
+
+Step 3. `EditNoteCommand#execute()` will be called by `LogicManager#execute()`. The note to edit is retrieved by the index given and a new edited note is created by copying over non-transformed fields and replacing the transformed field.
+
+Step 4. The `editedNote` is then set to replace the previous state of the `Note` object in the `Model` with `Model#setNote`.
+
+The following sequence diagram shows how the `editNote` feature works.
+
+![EditNoteSequenceDiagram](images/EditNoteSequenceDiagram.png)
+
+The following activity diagram shows the workflow of `editNote` feature.
+
+![EditNoteActivityDiagram](images/EditNoteActivityDiagram.png)
+
+##### Design considerations
+
+**Aspect: How the note to be edited is specified:**
+
+* **Alternative 1 (current choice):** Note is specified by index or title.
+ * Pros: Better convenience for users.
+ * Cons: Would need to use findNote command for notes specified by title. (more dependencies)
+
+* **Alternative 2:** Note is specified by Title.
+ * Pros: Easy to implement
+ * Cons: Not flexible for users.
+
+
+### UI Features
+
+#### General UI Design and Mechanism
+
+During the creation of the new UI, a lot of the FXML structure and the relationships between containers of the UI had to be refactored.
+
+![](images/UIComponentsLabeled.png)
+
+The UI is divided into 2 major sections - one occupied by the `CommandBox` and another occupied by the `WindowAnchorPane`.
+
+The `WindowAnchorPane` consists of an StackPane.
+- The `ResultDisplay` is in the first layer
+- The `PersonListPanel`, `InspectionPanel` and the `NotesListPanel` are in the second layer below.
+
+The `ResultDisplay` is _click-through_ (does not capture any mouse clicks) and normally has an opacity of 0, so it is effectively hidden.
+
+The `InspectionPanel` is another anchor pane divided into two left and right elements:
+ - A basic information `HBox` on the left
+ - A loan history list view display on the right
+
+These two elements in the `InspectionPanel` will always maintain the same ratio, basic information to loan history list view, of 2:3.
+
+When the user clicks the `CommandBox` or presses the `SPACE` key, this triggers an event on the `CommandBox` that invokes a transition to the `ResultDisplay` to show the display. As it is on the first layer, the `ResultDisplay` will partially cover the elements below it.
+
+Note that the `ResultsDisplay` never reach full opacity, instead an opacity of 0.8 allows the elements below to be partially visible.
+
+Here are the anchor points of the three major panes within the second layer of `WindowAnchorPane`:
+
+- The `PersonListPanel` has a left anchor of `0`, top anchor of `0`, right anchor of `0.6` with respect to window width (starting from left) and bottom anchor of `0.45` with respect to window height (starting from top).
+- The `InspectionPanel` has a left anchor of `0`, top anchor of `0.45`, right anchor of `0.6` with respect to window width (starting from left) and bottom anchor of `0` with respect to window height (starting from top).
+- The `NotesListPanel` has a left anchor of `0.6`, top anchor of `0`, right anchor of `0` with respect to window width (starting from left) and bottom anchor of `0` with respect to window height (starting from top).
+
+The arbitrary values above are actually boundaries shared by the three panels and may be manipulated to change the view of the three major elements together. We may imagine the `PersonListPanel` to be glued to the `NotesListPanel` on its right and the `InspectionPanel` below, likewise for the other two elements. This allows the ratios to be adjusted together by simply change the vertical anchor or horizontal anchors.
+
+The Observer Pattern is prevalent throughout the UI design in order to update other components in response to any change to the UI. One such example is the [`inspect` command](#inspect-feature).
+
+This activity diagram details how interactions with the UI is controlled
+
+![](images/UIActivityDiagram.png)
+
+##### Design Considerations
+
+As the main window of the application is resizable, the ratio of the anchors maintains the aspect of each panel with respect to the window size (unlike constant values which will not change according to window size).
+
+The resizing is handled through the _Observer Pattern_, thankfully existing by default in JavaFX, which updates the proportions of the components upon any change to the height or width of the window.
+
+The main problem came from estimating the correct current space allocated by the window size.
+
+As the three main components are within the `WindowAnchorPane`, and the `WindowAnchorPane` shares its space with an unnamed `StackPane` described by the structure above, this meant that the `WindowAnchorPane` has less space than the actual window size. To make things worse, JavaFX overestimates the actual scene proportions in relation to the window size.
+
+A padding of around 200px was used to help `WindowAnchorPane` displace it's top height to the true position it is at and a bottom padding of 20px was added to give some room from the bottom of the window. The height and width passed into function resizing the anchor panes must always be adjusted according the scene size and the offsets.
+
+A visual defect exists when the screen size exceeds 1080p, as the Inspection Panel is no longer able to stay attached to the anchor point at the bottom of the screen. This defect worsens as the window gets taller.
+
+#### Inspect Feature
+
+The inspect command is a UI-Centric command that controls which person's details are currently shown in the inspection panel.
+
+This is functionally similar to clicking on a person's card, which also updates the information in the inspection panel.
+
+This features uses an Observer on the `SelectionModel` of the `ListView` of persons, updating the `InspectionPanel` whenever a new person is selected.
+
+Step 1. The user executes `'inspect David'` command to view the details of David.
+
+Step 2. An `InspectCommandParser` is parsed with `David`.
+
+Step 3. The `InspectCommand` is created containing a keyword `David`.
+
+Step 4. The `InspectCommand` is executed and a `CommandResult` is created with the `UiState` `inspect` and arguments `David`.
+
+Step 5. The `MainWindow` is receives the `CommandResult` and reads the `UiState` part of the result. This directs it to update the inspect panel.
+
+Step 6. The Person List is retrieved from the `MainWindow` and its selection model is accessed. From here, if the given argument is a number, we will index the person through the order in the list. Otherwise, we will search through the entire list until first person matching the keywords is returned.
+
+Step 7. The Inspection Panel is retrieved from the main window and has its properties updated from the person's information that was returned.
+
+The following sequence diagram shows how the inspect command works:
+
+
+
+
:information_source: **Note:** The lifeline for `InspectCommandSequence` and `InspectCommand` should end at the destroy marker (X) but due to a limitation of PlantUML, the lifeline reaches the end of diagram.
+
+
+
+##### Design considerations:
+
+**Aspect: How to design a UI command**
+
+Unlike other command, this command does not mutate any underlying data. One challenge is that the execution flow is different from other commands which mutate data, making the implementation less direct.
+
+We had to find a good insertion point where the information carried from the user input could be used in the program without the need for major refactoring. We realised that the user's input is first taken in through the `MainWindow` class, and through following the function calls, would be used in `MainWindow::executeCommand`. So the inspection operation is effectively added at the end of the executeCommand just before it terminates.
+
+Inspiration was taken from the execution flow of `handleExit` and `handleHelp` prior to the construction of the new UI.
+
+The procedures for `handleExit` and `handleHelp` were changed by refactoring `CommandResult` to carry an ideal state that the UI is expected to be in by the end of the execution. A switch statement was added to the bottom of the `executeCommand` function, much like how the normal commands are parsed, to deal with UI-Centric commands like `help`, `exit` and `inspect`.
+
+#### Showing and Hiding the Notes Panel Feature
+
+Here are the anchor points of the three major panes within the `WindowAnchorPane`:
+
+- The `PersonListPanel` has a left anchor of `0`, top anchor of `0`, right anchor of `0.6` with respect to window width (starting from left) and bottom anchor of `0.45` with respect to window height (starting from top).
+- The `InspectionPanel` has a left anchor of `0`, top anchor of `0.45`, right anchor of `0.6` with respect to window width (starting from left) and bottom anchor of `0` with respect to window height (starting from top).
+- The `NotesListPanel` has a left anchor of `0.6`, top anchor of `0`, right anchor of `0` with respect to window width (starting from left) and bottom anchor of `0` with respect to window height (starting from top).
+
+Notice that the `PersonListPanel` and `InspectionPanel` share a boundary of the ratio `0.45` with respect to the window height and the both of them share a boundary of `0.6` with respect to screen width with the `NotesListPanel`.
+
+The command `hideNotes` is effectively accomplished by interpolating the ratios smoothly over time to create a sliding effect. To maintain the aspect ratio of the notes panel and prevent deformities, the right anchor interpolates from 0 to `0.6 - 1 = -0.4`, as the left anchor interpolates from `0.6` to `1`.
+
+This maintains the constant size of `x0.4` with respect to window size during the transition.
+
+A fading transition is applied across the same time to smoothly reduce the opacity of the panel.
+
+The time interval set for this transition is `0.3` seconds.
+
+The `showNotes` implementation is exactly the inverse of the `hideNotes` implementation across time.
+
+
+##### Design considerations:
+
+**Aspect: Challenges related to resizing**
+
+Because hiding the notes panel will also pull the inspection panel longer, and that the inspection panel is divided into two parts itself, the `InspectionPanel` is also further another anchor pane that maintains the ratio of the width between the basic information display and the loans history property.
+
+This concept was only implemented after the implementation of hideNotes, where visual inconsistencoes will start appearing due to disobeying the original ratio.
+
+The padding of the `InspectionPanel` also causes an issue if the right anchor of the pane is not manipulated with the left anchor, as the padding will snap the left anchor to the right of the right anchor. This causes the `InspectionPanel` to be pulled through the entire width of the `NotesListPanel` cause the entire `WindowAnchorPane` to overflow its allocated width. The consideration to slide the right anchor at a constant difference with respect to the left anchor was introduced to combat this issue.
+
### \[Proposed\] Undo/redo feature
-#### Proposed Implementation
+##### Proposed Implementation
The proposed undo/redo mechanism is facilitated by `VersionedAddressBook`. It extends `AddressBook` with an undo/redo history, stored internally as an `addressBookStateList` and `currentStatePointer`. Additionally, it implements the following operations:
@@ -176,7 +714,7 @@ Step 2. The user executes `delete 5` command to delete the 5th person in the add
![UndoRedoState1](images/UndoRedoState1.png)
-Step 3. The user executes `add n/David …` to add a new person. The `add` command also calls `Model#commitAddressBook()`, causing another modified address book state to be saved into the `addressBookStateList`.
+Step 3. The user executes `add name/David …` to add a new person. The `add` command also calls `Model#commitAddressBook()`, causing another modified address book state to be saved into the `addressBookStateList`.
![UndoRedoState2](images/UndoRedoState2.png)
@@ -211,7 +749,7 @@ Step 5. The user then decides to execute the command `list`. Commands that do no
![UndoRedoState4](images/UndoRedoState4.png)
-Step 6. The user executes `clear`, which calls `Model#commitAddressBook()`. Since the `currentStatePointer` is not pointing at the end of the `addressBookStateList`, all address book states after the `currentStatePointer` will be purged. Reason: It no longer makes sense to redo the `add n/David …` command. This is the behavior that most modern desktop applications follow.
+Step 6. The user executes `clear`, which calls `Model#commitAddressBook()`. Since the `currentStatePointer` is not pointing at the end of the `addressBookStateList`, all address book states after the `currentStatePointer` will be purged. Reason: It no longer makes sense to redo the `add name/David …` command. This is the behavior that most modern desktop applications follow.
![UndoRedoState5](images/UndoRedoState5.png)
@@ -219,26 +757,21 @@ The following activity diagram summarizes what happens when a user executes a ne
-#### Design considerations:
+##### Design considerations:
**Aspect: How undo & redo executes:**
* **Alternative 1 (current choice):** Saves the entire address book.
- * Pros: Easy to implement.
- * Cons: May have performance issues in terms of memory usage.
+ * Pros: Easy to implement.
+ * Cons: May have performance issues in terms of memory usage.
* **Alternative 2:** Individual command knows how to undo/redo by
itself.
- * Pros: Will use less memory (e.g. for `delete`, just save the person being deleted).
- * Cons: We must ensure that the implementation of each individual command are correct.
+ * Pros: Will use less memory (e.g. for `delete`, just save the person being deleted).
+ * Cons: We must ensure that the implementation of each individual command are correct.
_{more aspects and alternatives to be added}_
-### \[Proposed\] Data archiving
-
-_{Explain here how the data archiving feature will be implemented}_
-
-
--------------------------------------------------------------------------------------------------------------------
## **Documentation, logging, testing, configuration, dev-ops**
@@ -257,42 +790,101 @@ _{Explain here how the data archiving feature will be implemented}_
**Target user profile**:
+* is acting as a secretary or a treasurer of a club with a lot of people
+* has a need for a convenient way to organise paperwork and general information about the club
* has a need to manage a significant number of contacts
+* has a requirement to keep notes and tabs on people and projects
* prefer desktop apps over other types
* can type fast
* prefers typing to mouse interactions
* is reasonably comfortable using CLI apps
-**Value proposition**: manage contacts faster than a typical mouse/GUI driven app
+**Value proposition**: manage club members and track notes faster than a typical mouse/GUI driven app or by pen and paper
### User stories
Priorities: High (must have) - `* * *`, Medium (nice to have) - `* *`, Low (unlikely to have) - `*`
-| Priority | As a … | I want to … | So that I can… |
-| -------- | ------------------------------------------ | ------------------------------ | ---------------------------------------------------------------------- |
-| `* * *` | new user | see usage instructions | refer to instructions when I forget how to use the App |
-| `* * *` | user | add a new person | |
-| `* * *` | user | delete a person | remove entries that I no longer need |
-| `* * *` | user | find a person by name | locate details of persons without having to go through the entire list |
-| `* *` | user | hide private contact details | minimize chance of someone else seeing them by accident |
-| `*` | user with many persons in the address book | sort persons by name | locate a person easily |
+| Priority | As a … | I want to … | So that I can… |
+|----------|----------------------------------|---------------------------------------------------------------------------------------|-------------------------------------------------------------------------|
+| `* * *` | secretary | add club members’ information into the address book | keep track of their contact information. |
+| `* * *` | secretary | edit a club member’s information | stay updated with them if their contact information changes. |
+| `* * *` | secretary | delete a club member’s information from the address book | stop keeping track of them when they leave the club. |
+| `* * *` | user | search for a person by their name or contact number | locate details of persons without having to go through the entire list. |
+| `* *` | secretary | search contacts according to a specific tag | easily contact people in a whole group. |
+| `*` | user | maintain a set of tasks to be done | keep track of things to be done. |
+| `* * *` | treasurer | see the amount each person owes me | keep track of my finances. |
+| `*` | person that keeps track of tasks | see who in my contacts lies under which tasks and which tasks lies under each contact | keep track of my deadlines. |
+| `*` | treasurer | keep track of my club's fund and the budget assigned to every project | better organise and plan the club's finances. |
+| `*` | secretary | archive the contact information of a club member that has left the club | contact old club members by looking at archived contacts. |
+| `* *` | expert user | quickly use the CLI commands to speed up operations | enhance the productivity of meetings and task recording. |
+| `* *` | secretary | pinpoint all the addresses of members and find the nearest amongst all members | organise club activities and events that minimise travel time. |
+| `* * *` | treasurer | identify which member owes the club money | |
+| `* *` | secretary | password protect the software | protect member's personal data. |
+| `* *` | busy treasurer | get reminded of upcoming payments | ask for payments before they are due. |
+| `*` | user | use the GUI elements to autofill the CLI | recognise and learn the commands for future typing. |
+| `* *` | user | configure the GUI elements' size and colours | customise the application to my needs. |
+| `* *` | secretary | set priorities on tasks | focus on tasks that are more important first. |
+| `*` | secretary | get statistics on the number of tasks done | ensure that the club is on track with finishing tasks. |
+| `*` | new user | learn how to use the commands using in-app guidance | easily pick up the commands and perform my duties |
+| `* *` | new user | have sample data that I can test out commands with | familiarize myself with how the application works. |
+| `* * *` | outgoing secretary | transfer the data to an incoming secretary | hand over my job without hassle. |
-*{More to be added}*
### Use cases
-(For all use cases below, the **System** is the `AddressBook` and the **Actor** is the `user`, unless specified otherwise)
+(For all use cases below, the **System** is the `SectresBook` and the **Actor** is the `user`, unless specified otherwise)
+
+#### Use case: UC1 - Add a person
+
+**MSS**
+1. User requests to add a person.
+2. SectresBook adds the person to the list of persons.
+
+ Use case ends.
+
+**Extensions**
+* 1a. The given person already exists.
+ * 1a1. SectresBook shows an error message.
+
+ Use case ends.
+* 1b. Necessary fields are incomplete/empty.
+ * 1b1. Sectresbook shows an error message.
+
+ Use case ends.
+
+#### Use case: UC2 - Update a person
+
+**MSS**
+1. User requests to list persons.
+2. SectresBook shows a list of persons.
+3. User requests to update a specific person in the list.
+4. SectresBook updates information of the person.
+
+ Use case ends.
+
+**Extensions**
+* 2a. The list is empty.
+
+ Use case ends.
+* 3a. The given index is invalid.
+ * 3a1. SectresBook shows an error message.
+
+ Use case resumes at step 2.
+* 3b. The command line arguments are invalid.
+ * 3b1. SectresBook shows an error message.
+
+ Use case resumes at step 2.
-**Use case: Delete a person**
+#### Use case: UC3 - Delete a person
**MSS**
-1. User requests to list persons
-2. AddressBook shows a list of persons
-3. User requests to delete a specific person in the list
-4. AddressBook deletes the person
+1. User requests to list persons.
+2. SectresBook shows a list of persons.
+3. User requests to delete a specific person in the list.
+4. SectresBook deletes the person.
Use case ends.
@@ -304,24 +896,197 @@ Priorities: High (must have) - `* * *`, Medium (nice to have) - `* *`, Low (unli
* 3a. The given index is invalid.
- * 3a1. AddressBook shows an error message.
+ * 3a1. SectresBook shows an error message.
Use case resumes at step 2.
-*{More to be added}*
+#### Use case: UC4 - Find a person
-### Non-Functional Requirements
+**MSS**
+1. User request to find using keyword.
+2. SectresBook shows a list of persons matching keyword.
+
+ Use case ends.
+
+#### Use case: UC5 - Display list of persons
+
+**MSS**
+1. User requests to list persons.
+2. SectresBook displays the list of persons stored.
-1. Should work on any _mainstream OS_ as long as it has Java `11` or above installed.
-2. Should be able to hold up to 1000 persons without a noticeable sluggishness in performance for typical usage.
-3. A user with above average typing speed for regular English text (i.e. not code, not system admin commands) should be able to accomplish most of the tasks faster using commands than using the mouse.
+ Use case ends.
-*{More to be added}*
+#### Use case: UC6 - Edit Loan of person
+
+**MSS**
+1. User requests to list persons.
+2. SectresBook shows a list of persons.
+3. User requests to update the loan of a specific person in the list.
+4. SectresBook updates loan and loan history of the person.
+
+**Extensions**
+* 2a. The list is empty.
+
+ Use case ends.
+* 3a. The given index is invalid.
+ * 3a1. SectresBook shows an error message.
+
+ Use case resumes at step 2.
+* 3b. The command line arguments are invalid.
+ * 3b1. SectresBook shows an error message.
+
+ Use case resumes at step 2.
+
+
+#### Use case: UC7 - Find Person by their tag
+
+**MSS**
+1. User requests to find using a tag keyword.
+2. SectresBook shows a list of persons matching the tag keyword.
+
+ Use case ends.
+
+#### Use case: UC8 - Add a Note
+
+**MSS**
+1. User requests to add a note.
+2. SectresBook adds the note to the list of notes.
+
+ Use case ends.
+
+**Extensions**
+* 1a. The given note title already exists.
+ * 1a1. SectresBook shows an error message.
+
+ Use case ends.
+* 1b. Necessary fields are incomplete/empty.
+ * 1b1. Sectresbook shows an error message.
+
+ Use case ends.
+
+#### Use case: UC9 - Update a Note
+
+**MSS**
+1. User requests to list notes.
+2. SectresBook shows a list of notes.
+3. User requests to update a specific note in the list.
+4. SectresBook updates information of the note.
+
+ Use case ends.
+
+**Extensions**
+* 2a. The list is empty.
+
+ Use case ends.
+* 3a. The given index is invalid.
+ * 3a1. SectresBook shows an error message.
+
+ Use case resumes at step 2.
+* 3b. The command line arguments are invalid.
+ * 3b1. SectresBook shows an error message.
+
+ Use case resumes at step 2.
+
+#### Use case: UC10 - Delete a Note
+
+**MSS**
+1. User requests to list notes.
+2. SectresBook shows a list of notes.
+3. User requests to delete a specific note in the list.
+4. SectresBook deletes the person.
+
+ Use case ends.
+
+**Extensions**
+
+* 2a. The list is empty.
+
+ Use case ends.
+
+* 3a. The given index is invalid.
+
+ * 3a1. SectresBook shows an error message.
+
+ Use case resumes at step 2.
+
+#### Use case: UC11 - Find a Note
+
+**MSS**
+1. User request to find using keyword.
+2. SectresBook shows a list of notes matching keyword.
+
+ Use case ends.
+
+#### Use case: UC12 - Display list of notes
+
+**MSS**
+1. User has completed [UC11](#use-case-uc11---display-list-of-notes)
+2. User requests to list notes.
+3. SectresBook displays the list of all notes stored.
+
+ Use case ends.
+
+#### Use case: UC13 - Hide Note section
+
+**MSS**
+1. User requests to hide the notes section of the Sectresbook.
+2. Sectresbook hides the note section, extending the addressbook section.
+
+ Use case ends.
+
+**Extensions**
+* 1a. Already hiding the notes section.
+
+ Use case ends.
+
+#### Use case: UC14 - Show note section
+
+**MSS**
+1. User requests to show the notes section.
+2. Sectresbook shows the notes section on the right side of the interface.
+
+ Use case ends.
+
+**Extensions**
+
+* 1a. Already showing the notes section.
+
+ Use case ends.
+
+#### Use case: UC15 - Exit program
+
+**MSS**
+1. User requests to exit program.
+2. Sectresbook closes the program.
+
+ Use case ends.
+
+### Non-Functional Requirements
+
+1. Should run independently of remote servers.
+2. Should not use a relational database management system to store data.
+3. Should work on any _mainstream OS_ as long as it has Java `11` or above installed.
+4. Should not require internet connection, all operations are performed locally.
+5. Should not consume a lot of battery to keep it running in the background.
+6. Should be able to hold up to 1000 persons without a noticeable sluggishness in performance for typical usage.
+7. Should be able to hold up to 1000 notes without a noticeable sluggishness in performance for typical usage.
+8. Should be able to respond to any commands within 2 seconds as long as there are under 1000 entries stored in the application.
+9. A user with above average typing speed for regular English text (i.e. not code, not system admin commands) should be able to accomplish most of the tasks faster using commands than using the mouse.
+10. Should automatically save any changes to the data in the storage directly.
+11. The product is intended only for a single user (i.e. not a multi-user product)
### Glossary
* **Mainstream OS**: Windows, Linux, Unix, OS-X
+* **Java 11**: Eleventh version of the Java Platform, Standard Edition Development Kit (JDK). SectresBook requires this to be installed to run.
* **Private contact detail**: A contact detail that is not meant to be shared with others
+* **Note**: A segment of text that describes a task to be done, coupled with tags that reference people in the SectresBook who are associated with the given task.
+* **Secretary**: A person acting as overseers for the administrative functions of a club.
+* **Treasurer**: A club member that manages and accounts for all the funds of a club.
+* **Tag**: A label that groups related people or notes together, such that they can be referred to as a single encapsulated entity specified by the tag.
+* **Graphical User Interface (GUI)**: An image-based interface that is more visually appealing than a command-line interface and encapsulates information through the use of icons and images.
+* **Command Line Interface (CLI)**: A text-based interface that receives typed commands as input and returns textual feedback as output.
+
--------------------------------------------------------------------------------------------------------------------
@@ -338,40 +1103,249 @@ testers are expected to do more *exploratory* testing.
1. Initial launch
- 1. Download the jar file and copy into an empty folder
+ 1. Download the jar file and copy into an empty folder
- 1. Double-click the jar file Expected: Shows the GUI with a set of sample contacts. The window size may not be optimum.
+ 1. Double-click the jar file Expected: Shows the GUI with a set of sample contacts. The window size may not be optimum.
1. Saving window preferences
- 1. Resize the window to an optimum size. Move the window to a different location. Close the window.
+ 1. Resize the window to an optimum size. Move the window to a different location. Close the window.
- 1. Re-launch the app by double-clicking the jar file.
+ 1. Re-launch the app by double-clicking the jar file.
Expected: The most recent window size and location is retained.
-1. _{ more test cases … }_
-
### Deleting a person
1. Deleting a person while all persons are being shown
- 1. Prerequisites: List all persons using the `list` command. Multiple persons in the list.
-
- 1. Test case: `delete 1`
- Expected: First contact is deleted from the list. Details of the deleted contact shown in the status message. Timestamp in the status bar is updated.
-
- 1. Test case: `delete 0`
- Expected: No person is deleted. Error details shown in the status message. Status bar remains the same.
-
- 1. Other incorrect delete commands to try: `delete`, `delete x`, `...` (where x is larger than the list size)
- Expected: Similar to previous.
-
-1. _{ more test cases … }_
-
-### Saving data
-
-1. Dealing with missing/corrupted data files
-
- 1. _{explain how to simulate a missing/corrupted file, and the expected behavior}_
-
-1. _{ more test cases … }_
+ 1. Prerequisites: List all persons using the `list` command. Multiple persons in the list.
+
+ 2. Test case: `delete 1`
+ Expected: First contact is deleted from the list. Result display shows details of the deleted contact.
+
+ 3. Test case: `delete 0`
+ Expected: No person is deleted. Result display shows error message stating non-positive indices not allowed.
+
+ 4. Test case: `delete Charlotte`, assuming there is only 1 person with the name `Charlotte` in the Sectresbook.
+ Expected: Person with name `Charlotte` is deleted from the list. Result display shows details of the deleted contact.
+
+ 5. Other incorrect delete commands to try: `delete`, `delete x`, `...` (where x is larger than the list size)
+ Expected: Similar to previous.
+
+2. Deleting a person, but not all persons are shown
+
+ 1. Prerequisites: List a subset of persons using the `find` command. At least 1 person in the list.
+
+ 2. Test case: `delete 1`, assuming there is more than or equal to 1 person in the Sectresbook.
+ Expected: First contact is deleted from the list. Result display shows details of the deleted contact.
+
+ 3. Test case: `delete -1`
+ Expected: No person is deleted from the list. Result display shows error message stating non-positive indices not allowed.
+
+ 4. Test case: `delete Charlotte`, assuming there is only 1 person with the name `Charlotte` in the Sectresbook.
+ Expected: Person with name `Charlotte` is deleted from the list. Result display shows details of the deleted contact shown.
+
+ 5. Test case: `delete Sean`, assuming there is more than 1 person with the name `Sean` in the Sectresbook.
+ Expected: No person is deleted from the list. Sectresbook lists the contacts with `Sean` in their name. Result display shows error message stating more than one person with that name.
+
+ 6. Other incorrect delete commands to try: `delete`, `delete phone/PHONE_NUMBER`, `...` (where `PHONE_NUMBER` is a phone number of a person).
+ Expected: No person is deleted from the list. Result display shows error message stating invalid command format.
+
+### Editing a person
+
+1. Editing a person after listing all persons or after finding a list of persons (list should contain more than 0 people).
+
+ 1. Test case: `edit 1 phone/98112233`, assuming there is more than or equal to 1 person in the Sectresbook.
+ Expected: Phone number of the first contact in the list is edited. Result display shows details of the edited contact.
+
+ 2. Test case: `edit 5 tag/Friend`, assuming there is less than 5 people currently displayed in the Sectresbook.
+ Expected: No person is edited. Result display shows error message stating invalid index.
+
+ 3. Test case: `edit Charlotte tag/Friend`, assuming there is only 1 person with the name `Charlotte` in the Sectresbook.
+ Expected: The tag of the Person with the name `Charlotte` is edited. Result display shows details of the edited contact.
+
+ 4. Test case: `edit Sean tag/Colleague`, assuming there is more than 1 person with the name `Sean` in the Sectresbook.
+ Expected: No person is edited from the list. Sectresbook shows the list of persons with `Sean` in their name. Result display shows error message stating more than one person with that name.
+
+ 5. Other incorrect edit commands to try: `edit`, `edit 2 phone/TEXT`, `...` (where `TEXT` is an input with only alphabets).
+ Expected: No person is edited in the list. Result display shows error message stating phone number should be only contain numbers and at least 3 digits.
+
+### Editing a loan of a person
+
+1. Editing a loan of a person after listing all persons or after finding a list of persons (list should contain more than 0 people).
+
+ 1. Test case: `editLoan 1 amt/10 reason/Logistics`, assuming there is more than or equal to 1 person in the Sectresbook.
+ Expected: Loan amount and history of the first contact is updated. Result display shows details of the edited contact.
+
+ 2. Test case: `editLoan 5 amt/100 reason/Logistics`, assuming there is less than 5 people currently displayed in the Sectresbook.
+ Expected: No person is edited. Result display shows error message stating invalid index provided.
+
+ 3. Test case: `editLoan Charlotte amt/10 reason/Test`, assuming there is only 1 person with the name `Charlotte` in the Sectresbook.
+ Expected: Loan amount and history of the Person with the name `Charlotte` is edited. Result display shows details of the edited contact.
+
+ 4. Test case: `editLoan Sean amt/10 reason/Test`, assuming there is more than 1 person with the name `Sean` in the Sectresbook.
+ Expected: No person is edited from the list. Sectresbook shows the list of persons with `Sean` in their name. Result display shows error message stating more than one person with that name.
+
+ 5. Other incorrect editLoan commands to try: `editLoan`, `editLoan amt/`,`editLoan 1 amt/TEXT reason/TEXT`, `...` (where `TEXT` is an input with only alphabets).
+ Expected: No person is edited in the list. Result display shows error message stating invalid command format.
+
+### Finding a person
+
+1. Finding a person with the given keyword.
+
+ 1. Test case: `find Ryan`, assuming there is at least 1 person with the substring `Ryan` in the Sectresbook.
+ Expected: Person list is updated with contacts that contain the substring `Ryan`. Result display shows the number of persons listed.
+
+ 2. Test case: `find Jack`, assuming there is no one with the substring `Jack`.
+ Expected: Person list is updated, showing nobody in the list. Result display shows the number of persons listed.
+
+ 3. Test case: `find 8445`, assuming there is at least 1 person with phone number starting with `8445` in the Sectresbook.
+ Expected: Person list is updated with contacts with phone number starting with `8445`. Result display shows the number of persons listed.
+
+ 4. Test case: `find 8445 Ryan`, assuming there is at least 1 person with phone number starting with `8445` and substring `Ryan` in their name in the Sectresbook.
+ Expected: Person list is updated with contacts that contain the substring `Ryan` and phone number starting with `8445`. Result display shows the number of persons listed.
+
+ 5. Incorrect editLoan command to try: `editLoan`.
+ Expected: No change in the list shown. Result display shows message stating invalid command format.
+
+### Listing a person
+
+1. Listing all persons in the Sectresbook.
+
+ 1. Test case: `list`
+ Expected: Person list is updated to show all persons in the Sectresbook. Result display shows success message.
+
+ 2. Test case: `list TEXT`, where `TEXT` is any string input.
+ Expected: Person list is updated to show all persons in the Sectresbook. Result display shows success message.
+
+### Inspecting a person
+
+1. Inspecting a person while all persons are shown.
+
+ 1. Test case: `inspect 1`, assuming there is at least 1 person shown in the person list.
+ Expected: Displays the information of the contact with index 1 in the person list. Result display shows success message.
+
+ 2. Test case: `inspect Charlotte`, assuming there is only 1 person with the name `Charlotte` in the Sectresbook.
+ Expected: Displays the information of the contact with name `Charlotte` in the person list. Result display shows success message.
+
+ 3. Test case: `inspect -1`
+ Expected: No change in the person being inspected. Result display shows error message stating inspection failed, name should be alphanumeric characters only.
+
+ 4. Test case: `inspect Jack`, assuming there is more than 1 person with the name `Jack` in the person list.
+ Expected: No change in the person currently being inspected. Result display shows error message stating more than one person with that name.
+
+ 5. Other incorrect inspect commands to try: `inspect`.
+ Expected: No change in the person currently being inspected. Result display shows error message stating nothing to inspect.
+
+
+### Adding a note
+
+1. Adding a note with title that is yet to exist
+ 1. Test case: `addNote title/event content/november 3rd 4pm`
+ Expected: Note with title `event` and content `november 3rd 4pm` added into notes list. Result display shows message stating new note is added. Notes display panel shows new note.
+
+ 2. Test case: `addNote title/event content/november 3rd 4pm tag/progs`
+ Expected: Result display shows message stating new note is added. Notes display panel shows new note.
+
+ 3. Test case: incorrect `addNote` commands (e.g. `addNote`, `addNote title/event`, `addNote content/groceries`)
+ Expected: No new note is added to notes list. Result display shows error message stating invalid command format.
+
+2. Adding a note with a duplicate title
+ 1. Test case: `addNote title/event content/november 3rd 4pm`
+ Expected: No new note is added to notes list. Result display shows message stating that note already exists in the notes list. No change to the notes display panel.
+
+### Editing a note
+
+1. Editing a note
+ 1. Test case: `editNote 1 content/meeting at mpsh`, assuming there exists at least 1 note in the current notes list.
+ Expected: Note at index 1 in the current notes list have its content changed to `meeting at mpsh`. Result display shows message stating note was edited.
+
+ 2. Test case: `editNote progs content/meeting at mpsh`, assuming there exists a note with title `progs`.
+ Expected: Note with title `progs` in the current notes list have its content changed to `meeting at mpsh`. Result display shows message stating note was edited.
+
+ 3. Test case: `editNote 5 content/meeting at mpsh`, assuming there are less than 5 notes in the current notes list.
+ Expected: No note was edited. Result display shows error message stating index provided to be invalid.
+
+ 4. Test case: `editNote content/meeting at mpsh`
+ Expected: No note was edited. Status bar display error message stating at least one field to be edited has to be provided.
+
+ 5. Test case: incorrect `editNote` commands (e.g. `editNote`, `editNote content/abc`)
+ Expected: No note was edited. Result display shows error message stating invalid command format.
+
+### Deleting a note
+
+1. Deleting a note
+ 1. Test case: `deleteNote 1`, assuming there exists at least 1 note in the current notes list.
+ Expected: Note at index 1 is removed from the current notes list. Result display shows message stating note was deleted.
+
+ 2. Test case: `deleteNote`
+ Expected: No note was deleted. Result display shows error message stating invalid command format.
+
+### Finding a note
+
+1. Finding a note
+ 1. Test case: `findNote progs`
+ Expected: Notes with title containing the keyword `progs` are shown on the notes display panel. Result display shows message stating number of notes listed.
+ If there are no notes with `progs` in the title, notes display panel will be empty.
+
+ 2. Test case: `findNote`
+ Expected: No change to the notes display panel. Status bar display error message stating invalid command format.
+
+### List all notes
+
+1. List notes
+ 1. Test case: `listNote`
+ Expected: Notes display panel is populated with all existing notes. Result display shows message stating listed all notes.
+
+### Hide notes
+
+1. Hide notes
+ 1. Test case: `hideNotes`, assuming notes display panel is on shown on the GUI.
+ Expected: Notes display panel is hidden from the GUI. Persons list and Inspect section is extended horizontally to fill the GUI. Result display shows message stating notes panel hidden.
+
+ 2. Test case: `hideNotes`, assuming notes display panel is already hidden. Result display shows message stating notes panel hidden.
+ Expected: No change to the GUI. Result display shows message stating notes panel hidden.
+
+ 3. Other `hideNotes` commands with additional arguments (e.g. `hideNotes 1`, `hideNotes abc`)
+ Expected: Additional arguments are ignored, behaviour is same as `hideNotes`.
+
+### Show notes
+
+1. Show notes
+ 1. Test case: `showNotes`, assuming notes display panel is hidden from GUI.
+ Expected: Notes display panel appears on the right side of the GUI. Persons list and Inspect section becomes horizontally narrower. Result display shows message stating notes panel shown.
+
+ 2. Test case: `showNotes`, assuming notes display panel is already shown on the GUI.
+ Expected: No change to the GUI. Result display shows message stating notes panel shown.
+
+ 3. Other `showNotes` commands with additional arguments (e.g. `showNotes 1`, `showNotes abc`)
+ Expected: Additional arguments are ignored, behaviour is same as `showNotes`.
+
+### Finding person/notes based on tag
+
+1. Find using tag
+ 1. Test case: `findTag cs2103`
+ Expected: Persons list display persons tagged with `cs2103`. Notes display panel displays notes tagged with `cs2103`. Result display shows message stating number of people listed in the persons list.
+ If there is no person tagged with `cs2103`, the persons list will be empty.
+ If there is no note tagged with `cs2103`, the notes display panel will be empty.
+
+### Viewing Help
+
+1. Viewing help bar.
+
+ 1. Test case: `help`
+ Expected: The help popup screen is shown.
+
+### Clearing all data
+
+1. Clearing all data
+
+ 1. Test case: `clear`
+ Expected: Clears all data from the Sectresbook.
+
+### Exiting program
+
+1. Exiting the Sectresbook
+
+ 1. Test case: `exit`
+ Expected: The program closes.
diff --git a/docs/SettingUp.md b/docs/SettingUp.md
index 275445bd551..1de01ecf4d1 100644
--- a/docs/SettingUp.md
+++ b/docs/SettingUp.md
@@ -45,7 +45,7 @@ If you plan to use Intellij IDEA (highly recommended):
1. **Learn the design**
- When you are ready to start coding, we recommend that you get some sense of the overall design by reading about [AddressBook’s architecture](DeveloperGuide.md#architecture).
+ When you are ready to start coding, we recommend that you get some sense of the overall design by reading about [SectresBook’s architecture](DeveloperGuide.md#architecture).
1. **Do the tutorials**
These tutorials will help you get acquainted with the codebase.
diff --git a/docs/UserGuide.md b/docs/UserGuide.md
index 3716f3ca8a4..cf57b6f6e2f 100644
--- a/docs/UserGuide.md
+++ b/docs/UserGuide.md
@@ -3,38 +3,469 @@ layout: page
title: User Guide
---
-AddressBook Level 3 (AB3) is a **desktop app for managing contacts, optimized for use via a Command Line Interface** (CLI) while still having the benefits of a Graphical User Interface (GUI). If you can type fast, AB3 can get your contact management tasks done faster than traditional GUI apps.
+# SectresBook
-* Table of Contents
-{:toc}
+
+
+
---------------------------------------------------------------------------------------------------------------------
+SectresBook helps secretaries to **maintain all the information of the members of their club** by collating a list of identifiable information, past records, loan amounts and future tasks. This all-in-one tool eliminates the trouble of having to search through multiple notebooks or apps to find information regarding a club member, saving you time and effort so that you can focus on other tasks at hand.
+
+With speed and efficiency, you can interact with SectresBook using the **Command Line Interface (CLI)**[3](#glossary), while still having the benefits of a visually appealing **Graphical User Interface (GUI)**[4](#glossary).
+
+The intended audience of this User Guide are secretaries who are planning to use SectresBook, or secretaries who are already using SectresBook.
+
+This User Guide is an in-depth guide to help you start managing your contacts, notes and finances. It includes **installation instructions, features and how to use them, and [Frequently Asked Questions (FAQ)](#faq) for troubleshooting**, ensuring a smooth pickup of SectresBook.
+
+---
+
+## Table of Contents
+ * [Introduction to SectresBook](#introduction-to-sectresbook)
+ * [Using this guide](#using-this-guide)
+ * [Quick start](#quick-start)
+ * [User Interface](#user-interface)
+ * [Properties](#properties)
+ + [Person Properties](#person-properties)
+ + [Notes Properties](#notes-properties)
+ + [Tag Properties](#tag-properties)
+ * [Features](#features)
+ + [Person Features](#person-features)
+ - [Adding a new person : `add`](#adding-a-new-person--add)
+ - [Editing a club member : `edit`](#editing-a-club-member--edit)
+ - [Editing loan of a person : `editLoan`](#editing-loan-of-a-person--editloan)
+ - [Deleting a person : `delete`](#deleting-a-person--delete)
+ - [Locating persons by name or contact number : `find`](#locating-persons-by-name-or-contact-number--find)
+ - [Listing all persons : `list`](#listing-all-persons--list)
+ - [Sorting by property : `sort` `[coming in v2.0]`](#sorting-by-property--sort-coming-in-v20)
+ + [Note Features](#note-features)
+ - [Adding Notes : `addNote`](#adding-notes--addnote)
+ - [Editing Notes : `editNote`](#editing-notes--editnote)
+ - [Deleting Notes : `deleteNote`](#deleting-notes--deletenote)
+ - [Locating a note by title : `findNote`](#locating-a-note-by-title--findnote)
+ - [Listing Notes : `listNote`](#listing-notes--listnote)
+ - [Sorting Notes : `sortNotes` `[coming in v2.0]`](#sorting-notes--sortnotes-coming-in-v20)
+ - [Hiding notes panel : `hideNotes`](#hiding-notes-panel--hidenotes)
+ - [Showing notes panel : `showNotes`](#showing-notes-panel--shownotes)
+ + [General Features](#general-features)
+ - [Locating persons and notes by tag : `findTag`](#locating-persons-and-notes-by-tag--findtag)
+ - [Inspecting a person : `inspect`](#inspecting-a-person--inspect)
+ - [Viewing help : `help`](#viewing-help--help)
+ - [Clearing all entries : `clear`](#clearing-all-entries--clear)
+ - [Exiting the program : `exit`](#exiting-the-program--exit)
+ - [Saving the data](#saving-the-data)
+ - [Editing the data file](#editing-the-data-file)
+ - [Archiving data files `[coming in v2.0]`](#archiving-data-files-coming-in-v20)
+ - [Undo `[coming in v2.0]`](#undo-coming-in-v20)
+ - [Redo `[coming in v2.0]`](#redo-coming-in-v20)
+ * [FAQ](#faq)
+ * [Glossary](#glossary)
+ * [Summary](#summary)
+
+---
+
+## Introduction to SectresBook
+
+**SectresBook** is a desktop application that helps you to manage information about your club members (such as loans and birthdays) and keep track of your tasks using notes.
+
+**SectresBook** provides these main features:
+* Adding a club member.
+* Accessing, modifying members' information.
+* Adding a note.
+* Accessing, modifying contents of a note.
+* Tagging a club member or a note (or both) for organisation
+
+
+SectresBook is already a convenient way to keep track of information you need to manage a club. However, if you can type fast, using SectresBook will be quicker and more efficient.
+
+
+[Back to Table of Contents](#table-of-contents)
+
+---
+
+## Using this guide
+
+This user guide contains all the information that you will need to use and learn **SectresBook**.
+
+If you are a **new user**, the necessary knowledge for you to get started can be found [here](#quick-start).
+
+If you are an **experienced user**, a [Summary](#summary) is also provided, so you can quickly refer to the command formats.
+
+Before you delve into the guide, do take note of the following highlighted information panels.
+
+
:information_source: **Note:** Used to highlight and display information you should
+pay attention to.
+
+
:bulb: **Tip:** used to highlight tips which you might find useful
+
+
:exclamation: **Caution:** used to highlight dangers and things to look out for.
+
+In addition, for better readability, icons in this guide have been colored black. In the actual application, colors may be inverted, but their shape will remain the same.
+
+
:bulb: **Tip:** This User Guide contains many clickable links. Use the keyboard shortcuts Alt + Left arrow and Alt + Right arrow to navigate back and forth between links quickly. (Command + Left arrow and Command + Right arrow for Mac)
+
+[Back to Table of Contents](#table-of-contents)
+
+---
## Quick start
-1. Ensure you have Java `11` or above installed in your Computer.
+1. Ensure you have Java `11`[7](#glossary) or above installed in your Computer.
+
+1. Download the latest `SectresBook.jar` from [here](https://github.com/AY2223S1-CS2103T-W12-2/tp/releases).
+
+1. Copy the file to the folder you want to use as the _home folder_[5](#glossary) for your SectresBook.
+
+1. Double-click the file to start the app. A GUI[4](#glossary) similar to the one below should appear in a few seconds. Note how the app contains some sample data. (Don't worry about the layout of the GUI[4](#glossary) yet! It will be explained in the next section.)
+ ![Ui](images/Ui.png)
+
+1. We **strongly recommend** you to use this app at a resolution of 1024x640 or greater to experience the greatest level of comfort. You may also click the fullscreen icon at the top right hand corner of the window next to the close icon to maximise the window.
+
+1. Press your spacebar (recommended), or bring your cursor to the [command box](#command-box) area and click onto it, to access the typing space. The results display will come into view below the command box.
+
+1. Type commands in the [command box](#command-box) and press Enter to execute them. For example, typing **`help`** into the command box and pressing Enter will open the [help window](#viewing-help--help).
+ - Some example commands you can try:
+ - **`list`** : Lists all contacts.
+ - add name/John Doe phone/98765432 email/johnd@example.com home/John street, block 123, #01-01 bday/01/01/2000 : Adds a contact named `John Doe` to the SectresBook.
+ - **`delete 3`** : Deletes the 3rd contact shown in the current list.
+ - **`help`** : Opens a [help window](#viewing-help--help).
+ - **`clear`** : Deletes all contacts.
+ - **`exit`** : Exits the app.
+
+1. Once you are done executing commands and want to see the GUI, press the `ESC` key (recommended), or click on anywhere that is not the command box, to leave the typing space and hide the results display.
+
+Refer to [Features](#features) below for details of each command.
+
+[Back to Table of Contents](#table-of-contents)
+
+---
+
+## User Interface
+
+Here is an overview of the User Interface (UI) components.
+
+The UI comprises four sections:
+
+![UILabeled](images/UiLabeled.png)
+
+### Command Box
+
+The Command Box is where you type in your command inputs. For more information on command inputs, refer to [Features](#features) below.
+
+Once the command box is selected, a results display will appear to report the status of the program to you. Error messages and success messages will be shown in this box. Click anywhere else on the screen, or press the `ESC` key to exit the command box and hide the results display.
+
+
+
+
+
Results Display.
+
+
+
+
:bulb: **Tip:**
+You may activate the command box by simply pressing the spacebar on your keyboard. There is no need to use your mouse to click on the bar.
+
+
+
:bulb: **Tip:**
+Similarly, you may press the `ESC` key on your keyboard to exit out of the command box and hide the results display.
+
+
+[Back to Table of Contents](#table-of-contents)
+
+### People Panel
+
+The People Panel contains all the club and organisation members you have registered in this book. They are laid out horizontally. You can scroll the list by hovering your mouse over the People Panel and scrolling the mouse-wheel, or by clicking on and dragging the horizontal scroll bar to scroll.
+
+Each card represents a person and displays their name, phone number and total present loan amount. The loan amount may be positive to indicate an amount owed by the person, or negative to indicate an amount due to be paid to the person.
+
+
+
+
+
A person card.
+
+The index of the person only applies to the currently displayed list, it is **not** tied to the person itself.
+
+Check [Person Features](#person-features) to learn more about the commands you can execute related to people.
+
+[Back to Table of Contents](#table-of-contents)
+
+### Inspect Panel
+
+The Inspect Panel is related to the People Panel and shows the basic information of the currently inspected person. A person can be inspected by either clicking on his or her card, or by using the `inspect` command. More details on the `inspect` command can be found [here](#inspecting-a-person--inspect).
+
+The left side of the Inspect Panel shows the basic information, while the right side shows the history of loan transactions.
+
+Note that the transaction record next to the icon of the hand holding coins is the most recent, and the earlier transactions are listed below.
+
+The total amount of the loans is also stated in the right of this panel, describing in fuller detail if the sum is owed by or to be paid to the person.
+
+[Back to Table of Contents](#table-of-contents)
+
+### Notes Panel
+
+This Notes Panel stores all the information related to notes and tasks that the user may want to keep track of.
+
+Each note contains an index, a title, contents and tags.
+
+
+
+
+
A note card.
+
+The index of the notes only applies to the currently displayed list, it is **not** tied to the note itself.
+
+Both the People Panel and Notes Panel share a pool of tags to more easily relate a group of people to a specific note.
+
+Check [Notes Features](#note-features) to learn more about the commands you can execute related to notes.
+
+[Back to Table of Contents](#table-of-contents)
+
+---
+
+## Properties
+
+### Person Properties
+
+
+
+
+
A typical person card.
+
+#### Name
+
+This is the name of the person to be recorded in the SectresBook. Two persons cannot have exactly the same name, but slight deviations are acceptable. Our team recognizes that many people may share the same name, so it is alright to use close aliases.
+
+This property[12](#glossary) is compulsory to declare during initialisation[6](#glossary).
+
+Only alphanumeric characters[1](#glossary) are accepted in this property[12](#glossary). Numbers are accepted in use as disambiguation, but may not exist as a standalone word without alphabets immediately before or following it. See examples below for a more specific overview.
+
+This property[12](#glossary) can be identified in the GUI[4](#glossary) by the icon of the silhouette of a person.
+
+
+
+- Identified by the prefix `name`.
+- This is a valid property[12](#glossary) to find a person by using the [`find` command](#locating-persons-by-name-or-contact-number--find).
-1. Download the latest `addressbook.jar` from [here](https://github.com/se-edu/addressbook-level3/releases).
+
+
+
Valid Examples
+
+ Samuel West
+ Jonathan Lee Wen Xin
+ Jack Robert the 3rd
+ 3Lite M1k0ch1
+ Elizabeth Wong n11
+
+
+
+
Invalid Examples
+
+ @*)^% (Non-alphanumeric characters are not accepted)
+ Jack Robert the 3 (Number may not exist as a standalone word)
+ Elizabeth Wong 11 (Number may not exist as a standalone word)
+ Jonathan 25 Chin (Number may not exist as a standalone word)
+ (25) Jonathan Chin (Non-alphanumeric characters cannot be used adjacent to numbers)
+
+
+
-1. Copy the file to the folder you want to use as the _home folder_ for your AddressBook.
+
:bulb: **Tip:**
+It is recommended to include the full name of the person instead of aliases for easier searching.
+
+
+[Back to Table of Contents](#table-of-contents)
+
+#### Phone
+
+This is the phone number of the person to be recorded in the SectresBook. It is compulsory to declare this during initialisation[6](#glossary).
+
+This property[12](#glossary) can be identified in the GUI[4](#glossary) by the icon of a mobile phone.
+
+
+
+- Identified by the prefix `phone`.
+- A phone number should contain only numbers and be at least 3 digits long.
+- This is a valid property[12](#glossary) to find a person by using the [`find` command](#locating-persons-by-name-or-contact-number--find).
+
+Please record the phone number by which the member is most easily contacted. You are not allowed to enter multiple phone numbers in this field.
+
+
:exclamation: **Caution:**
+Ensure that no two persons have the same phone number! This is allowed in the program, but you may have difficulties contacting the person you want in the future.
+
+
+[Back to Table of Contents](#table-of-contents)
+
+#### Email
+
+This is the email address of the person to be recorded in the SectresBook. It serves mainly as a point of information regarding the person, and has no additional features tied to it. This property[12](#glossary) is compulsory to declare during initialisation[6](#glossary).
+
+This property[12](#glossary) can be identified in the GUI[4](#glossary) by the icon of an envelope.
+
+
+
+- Identified by the prefix `email`.
+- Emails should be of the format `local-part@domain` and adhere to the following constraints:
+
+| Part | Constraint |
+|------|-------------|
+| Local part | The local-part should only contain alphanumeric characters[1](#glossary) and these special characters `_`, `.`, `+` and `-`.
The local-part may not start or end with any special characters and special characters may not be adjacent to each other.
+ Domain name | The domain name is made up of domain labels separated by periods. The domain name must: - end with a domain label at least 2 characters long - have each domain label start and end with alphanumeric characters[1](#glossary) - have each domain label consist of alphanumeric characters[1](#glossary), separated only by hyphens, if any.
+
+The local part and domain part **must** be connected by an `@` symbol.
+
+[Back to Table of Contents](#table-of-contents)
+
+#### Address
+This is the residing address of the person. It serves mainly as a point of information regarding the person, and has no additional features tied to it. This property[12](#glossary) is compulsory to declare during initialisation[6](#glossary).
+
+This property[12](#glossary) can be identified in the GUI[4](#glossary) by the icon of a house.
+
+
+
+- Identified by the prefix `home`.
+- There is no constraint on how the home address of a person should be written, as long as it is sufficiently understandable.
+
+
:information_source: **Note:**
+Please ensure that your SectresBook window can accommodate the length of the text. If you find the text being cut off and see ellipses `...` showing, please resize the SectresBook window to fit the text.
+
+
+[Back to Table of Contents](#table-of-contents)
+
+#### Loan
+This is amount of money that is owed by a person, or is to be paid to that person. This is a property[12](#glossary) that cannot be manipulated directly, but can only be edited with the [`editLoan` command](#editing-loan-of-a-person--editloan).
+
+This property[12](#glossary) can be identified in the GUI[4](#glossary) by the icon of the hand holding two stacks of coins.
+
+
+
+- A loan amount can be either negative, positive or zero.
+ + A positive value indicates an amount that the person has yet to pay to the organisation.
+ + A zero value indicates no outstanding loan.
+ + A negative value indicates an amount that should be paid back to the person.
+- Loans can only take up numerical values.
+- The maximum value this property[12](#glossary) can take is `$1,000,000,000,000.00` (1 trillion dollars ). Similarly, the minimum value is `-$1,000,000,000,000.00` (negative 1 trillion dollars). This should be more than sufficient for general purpose use.
+
+[Back to Table of Contents](#table-of-contents)
+
+#### Loan History
+A loan history is linked to the loans properties and describes the changes to the numeric values of the loans in detail. There is no way to declare this during initialisation[6](#glossary), but it can be modified by the [`editLoan` command](#editing-loan-of-a-person--editloan).
+
+This property[12](#glossary) is represented as a descending list on the right side of the inspection panel.
+
+![img.png](images/LoanHistoryPanel.png)
+
+The most recent transaction is recorded at the top, on the row next to the loans icon.
+
+The upward pointing red arrow signifies an amount loaned to this member in a transaction.
+
+
+
+The downward pointing green arrow signifies an amount that this member has paid back in a transaction.
+
+
+
+- Consists of the following sub-properties:
+ - Current loan value
+ - Change in amount from last value
+ - Reason for change
+
+
:bulb: **Tip:**
+Including a reason for every change to a person's loan value reduces the risk of accidentally adding an incorrect amount to someone. It keeps a detailed tab of every increment and decrement in value.
+
-1. Double-click the file to start the app. The GUI similar to the below should appear in a few seconds. Note how the app contains some sample data.
- ![Ui](images/Ui.png)
+[Back to Table of Contents](#table-of-contents)
-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:
+#### Birthday
+The birthday date of a person. This property[12](#glossary) is compulsory to declare during initialisation[6](#glossary).
- * **`list`** : Lists all contacts.
+This property[12](#glossary) can be identified in the GUI[4](#glossary) by the icon of a birthday cake.
- * **`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.
+
- * **`delete`**`3` : Deletes the 3rd contact shown in the current list.
+- Identified by the prefix `bday`.
+- Serves as a point of information for a person.
+- This must be a valid date in the form `dd/MM/yyyy`.
- * **`clear`** : Deletes all contacts.
+[Back to Table of Contents](#table-of-contents)
- * **`exit`** : Exits the app.
+#### Tags
+Persons can be linked to tag objects, which serve as markers that draw connections between different people as well as associated notes. This property[12](#glossary) is completely optional.
-1. Refer to the [Features](#features) below for details of each command.
+This property[12](#glossary) can be identified in the GUI[4](#glossary) by tag shaped labels with text inside them. They are usually located at the bottom right of each person card. If there is no such label, then it means this person has no associated tags.
+
+![img.png](images/PersonTags.png)
+
+
:bulb: **Tip:**
+Choose short, identifiable tag names.
+
+
+
:exclamation: **Caution:**
+There is no limit to how many tags you can apply to an individual person, but applying too many tags increases confusion and decreases user experience. Please choose the most relevant tags to apply only.
+
+
+
:bulb: **Tip:**
+Please refer to the [`Tag Properties`](#tag-properties) below for more information regarding tags.
+
+
+[Back to Table of Contents](#table-of-contents)
+
+### Notes Properties
+
+
+
+
+
A typical note card.
+
+#### Title
+The title serves as the main marker for notes and summarises the important details of this specific note. This property[12](#glossary) is compulsory to declare during initialisation[6](#glossary).
+
+It is the first line of a note card, which is bigger than the rest of the text.
+
+Special characters are allowed in the title, but they will always be treated as a whitespace[17](#glossary) during operations. This is because punctuation is not normally a part of a word. This feature is relevant to [`findNote`](#locating-a-note-by-title--findnote).
+
+- This property[12](#glossary) is identified by the prefix `title`.
+- Notes can be filtered through with the [`findNote` command](#locating-a-note-by-title--findnote) using the title property[12](#glossary).
+- Titles must be within 100 characters and can contain any ASCII characters[2](#glossary).
+- This property[12](#glossary) cannot be left empty.
+
+[Back to Table of Contents](#table-of-contents)
+
+#### Content
+The content serves as the description for notes. This property[12](#glossary) is compulsory to declare during initialisation[6](#glossary).
+
+This is immediately below the title and is in a smaller font size.
+
+- This property[12](#glossary) is identified by `content`.
+- This property[12](#glossary) cannot be left empty.
+
+[Back to Table of Contents](#table-of-contents)
+
+#### Tags
+
+Notes can be linked to tag objects, which serve as markers that draw connections between different people as well as associated notes. This is an optional property[12](#glossary) for all notes.
+
+This is located at the bottom right of the notes card. If there is no such label, then it means this note has no associated tags.
+
+![img.png](images/NoteTags.png)
+
+
:bulb: **Tip:**
+Choose short, identifiable tag names.
+
+
+
:bulb: **Tip:**
+Please refer to the [`Tag Properties`](#tag-properties) section below for more information regarding tags.
+
+
+[Back to Table of Contents](#table-of-contents)
+
+### Tag Properties
+A tag is used to group together specific People and Notes.
+
+This way, searching for a tag brings up all the People and Notes that have the tag for easier classification of related information.
+
+- Identified by the prefix `tag`.
+- Tags can only consist of alphanumeric characters[1](#glossary).
+- Persons and Notes can hold tags.
+
+[Back to Table of Contents](#table-of-contents)
--------------------------------------------------------------------------------------------------------------------
@@ -45,148 +476,676 @@ AddressBook Level 3 (AB3) is a **desktop app for managing contacts, optimized fo
**:information_source: Notes about the command format:**
* 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. in `add name/NAME`, `NAME` is a parameter which can be used as `add name/John Doe`.
* Items in square brackets are optional.
- e.g `n/NAME [t/TAG]` can be used as `n/John Doe t/friend` or as `n/John Doe`.
+ e.g `name/NAME [tag/TAG]` can be used as `name/John Doe tag/friend` or as `name/John Doe`.
+
+* `` signifies an exclusive-or parameter that is to be input.
+ e.g `INDEX NAME` allows either the parameter `INDEX` or the parameter `NAME`, but not both
* Items with `…` after them can be used multiple times including zero times.
- e.g. `[t/TAG]…` can be used as ` ` (i.e. 0 times), `t/friend`, `t/friend t/family` etc.
+ e.g. `[tag/TAG]…` can be used as ` ` (i.e. 0 times), `tag/friend`, `tag/friend tag/family` 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.
+ e.g. if the command specifies `name/NAME phone/PHONE_NUMBER`, `phone/PHONE_NUMBER name/NAME` is also acceptable.
* If a parameter is expected only once in the command but you specified it multiple times, only the last occurrence of the parameter will be taken.
- e.g. if you specify `p/12341234 p/56785678`, only `p/56785678` will be taken.
+ e.g. if you specify `phone/12341234 phone/56785678`, only `phone/56785678` will be taken.
* Extraneous parameters for commands that do not take in parameters (such as `help`, `list`, `exit` and `clear`) will be ignored.
e.g. if the command specifies `help 123`, it will be interpreted as `help`.
-### Viewing help : `help`
-Shows a message explaning how to access the help page.
+### Person Features
-![help message](images/helpMessage.png)
+#### Adding a new person : `add`
-Format: `help`
+Adds a person to the SectresBook. The new member will appear at the end of the persons' list residing in the People Panel.
+Format: `add name/NAME phone/PHONE_NUMBER email/EMAIL home/ADDRESS bday/BIRTHDAY [tag/TAG]...`
-### Adding a person: `add`
+
:bulb: **Tip:**
+A person can have any number of tags (including 0).
+
-Adds a person to the address book.
+Examples:
+* `add name/John Doe phone/98765432 email/johnd@example.com home/John street, block 123, #01-01 bday/01/04/2010 tag/Member`
+* `add name/Jane Doe phone/98876542 email/jane@example.com home/That Street, block 133, #11-10 bday/05/11/1986 tag/Member`
+* `add name/Neethesh tag/VicePresident email/neethesh@example.com home/Happy Avenue phone/91234567 bday/24/05/1998`
-Format: `add n/NAME p/PHONE_NUMBER e/EMAIL a/ADDRESS [t/TAG]…`
+[Back to Table of Contents](#table-of-contents)
-
:bulb: **Tip:**
-A person can have any number of tags (including 0)
+#### Editing a club member : `edit`
+
+Edits an existing club member’s information in the SectresBook.
+
+Format: `edit INDEX NAME [name/NAME] [phone/PHONE] [email/EMAIL] [home/ADDRESS] [bday/BIRTHDAY] [tag/TAG]…`
+
+Remember that all terms are optional for edit commands, but it must include at least one property[12](#glossary) to edit the person by.
+
+If ambiguities by the keywords given exist, the persons' list will auto-filter to display all matching persons that cause the ambiguity to arise. Please fine tune your search requirements, or use an index from here, to edit the person again.
+
+Example of usage:
+
+`edit 1 phone/99999999` can be used to easily update the first person's contact information.
+
+`edit John phone/91235555` can be used to update a person’s contact information if there exists only one person whose name contains John.
+
+
:information_source: **Note:**
+If no person is named `John`, or if more than one person has `John` in their name, then the operation is equivalent to `find John`.
-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`
+[Back to Table of Contents](#table-of-contents)
-### Listing all persons : `list`
+#### Editing loan of a person : `editLoan`
-Shows a list of all persons in the address book.
+Edits an existing club member's loan amount in the SectresBook. Please note that the value must be either positive or negative values with up to 2 decimal places.
-Format: `list`
+The absolute maximum amount for a loan is `$1,000,000,000,000.00` (positive or negative 1 trillion). If you are intending to file more than a trillion dollars in total transactions, this application may not be a suitable one for you, as our expected clients do not normally transfer this much money.
-### Editing a person : `edit`
+
:exclamation: **Caution:**
+If the total amount after the `editLoan` command adds up to more than a trillion, the program will block the command from going through. You will be notified by the results display should such a command be attempted.
+
-Edits an existing person in the address book.
+Format: `editLoan INDEX NAME amt/VALUE reason/REASON`
-Format: `edit INDEX [n/NAME] [p/PHONE] [e/EMAIL] [a/ADDRESS] [t/TAG]…`
+* Edits the loan value of the existing 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 …
+* The `VALUE` can be a positive or negative value with up to 2 decimal places.
+* The `VALUE` may not contain delimiters to separate digits, i.e. `$1,000,000` must be expressed as `$1000000` in the program.
+* The loan value will be changed by the value given i.e current loan + `VALUE`.
+
+Examples of usage:
+
+* `editLoan 2 amt/30 reason/bought logistics`
+* `editLoan alex amt/-30 reason/return money from logistics`
+* `list` followed by `editLoan 1 amt/-20 reason/return money` will edit the 1st person in the SectresBook, reducing their loan by $20 and saving the `REASON` as `return money`.
+
+
:information_source: **Note:**
+In the second example, if no person is named `Alex`, or if more than one person has `Alex` in their name, then the operation is equivalent to `find alex`.
+
-* 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.
+[Back to Table of Contents](#table-of-contents)
+
+#### Deleting a person : `delete`
+
+Deletes the specified person from the SectresBook. Delete commands are irreversible, so please ensure that you are deleting the correct person.
+
+Format: `delete INDEX NAME`
+
+
+
+
+ Deleting by 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, …
+
+
+
+
+
+ Deleting by NAME
+
+
+
+
Delete the entry of the person by name with the given keyword, only if the keywords specified are unique to that person's name.
+
Will not perform any operation if the name of the person does not exist, but instead execute find NAME
+
If the SectresBook contains more than one person that can be found by the keyword specified, the delete command will not execute but will return a list of all people with the given name. From here, you may choose to delete by index.
+
+
+
+
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.
+* `list` followed by `delete 2` deletes the 2nd person in the SectresBook.
+* `find Betsy` followed by `delete 1` deletes the 1st person in the results of the `find` command.
+* `delete Betsy` deletes the entry belonging to Betsy in the SectresBook.
+* `delete Lynette` does not perform any operation, if Lynette does not exist in the SectresBook.
+
+
:bulb: **Tip:**
+To delete everyone at the same time, please refer to the clear command.
+
+
+[Back to Table of Contents](#table-of-contents)
-### Locating persons by name: `find`
+#### Locating persons by name or contact number : `find`
-Finds persons whose names contain any of the given keywords.
+Finds persons whose names match any of the given keywords, or persons whose phone numbers start with any of the given keywords (in digits).
+
+
:information_source: **Note:**
+The People Panel will show a `FILTERED` indicator to inform you that the list has been filtered.
+
+
+
Format: `find KEYWORD [MORE_KEYWORDS]`
-* The search is case-insensitive. e.g `hans` will match `Hans`
+* The search is not case-sensitive. 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`
+* Phone numbers starting with any of the given keywords (in digits), of at least 2 digits, will be returned.
Examples:
-* `find John` returns `john` and `John Doe`
+
* `find alex david` returns `Alex Yeoh`, `David Li`
- ![result for 'find alex david'](images/findAlexDavidResult.png)
+
-### Deleting a person : `delete`
-Deletes the specified person from the address book.
+* `find 86` returns `Theodore`
+
+
-Format: `delete INDEX`
+* `find 8` will not be accepted as a command, as searching by phone numbers must be of at least 2 digits.
-* Deletes the person at the specified `INDEX`.
-* The index refers to the index number shown in the displayed person list.
+[Back to Table of Contents](#table-of-contents)
+
+#### Listing all persons : `list`
+
+List of all persons in the SectresBook.
+
+
:information_source: **Note:**
+If the list was formerly filtered, the filter icon to the right of the person's label will disappear.
+
+
+Format: `list`
+
+[Back to Table of Contents](#table-of-contents)
+
+#### Sorting by property : `sort` `[coming in v2.0]`
+
+
:exclamation: **Caution:**
+This command does not exist in the present version of the program that this User Guide is written for. It **will not work** if entered.
+
+
+Sorts the members in the persons' list by properties in either ascending or descending order.
+
+[Back to Table of Contents](#table-of-contents)
+
+
+### Note Features
+
+#### Adding Notes : `addNote`
+
+Adds a note to the SectresBook.
+
+Format: `addNote title/TITLE content/CONTENT [tag/TAG]... `
+
+
:bulb: **Tip:**
+TITLE must be unique and not longer than 100 characters. Tags are also optional.
+
+
+Examples:
+* `addNote title/Club meeting soon! content/Remind club members to attend meeting.`
+* `addNote title/T-Shirt payment due content/Collect money tag/Juniors`
+
+[Back to Table of Contents](#table-of-contents)
+
+#### Editing Notes : `editNote`
+
+Edits an existing specified note in the SectresBook.
+
+Format: `editNote INDEX TITLE [title/TITLE] [content/CONTENT] [tag/TAG]...`
+
+Example of usage:
+
+* `editNote 1 content/Second club meeting` can be used to easily update the first note's contents.
+* `editNote alumni title/2020 alumni meeting` can be used to amend a note with the title "2020 alumni meeting", only if it is the only note containing "alumni" in its title.
+
+[Back to Table of Contents](#table-of-contents)
+
+#### Deleting Notes : `deleteNote`
+
+Deletes the specified note from the SectresBook. This operation is irreversible, so please ensure that the note you are about to delete is the correct one.
+
+Format: `deleteNote INDEX`
+
+* Deletes the note at the specified `INDEX`.
+* The index refers to the index number shown in the displayed note list.
* The index **must be a positive integer** 1, 2, 3, …
+Unlike other entities, you may not delete a note by name. This is to minimise errors in deletion as many notes may have similar names.
+
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.
+* `listNotes` followed by `deleteNote 2` deletes the second note in the SectresBook.
+
+[Back to Table of Contents](#table-of-contents)
+
+#### Locating a note by title : `findNote`
+
+Finds the notes whose titles match any of the given keywords.
+
+
:information_source: **Note:**
+The Notes Panel will show a `FILTERED` indicator to inform you that the list has been filtered.
+
+
+
+
+The search is not case-sensitive. For example, `meeting` will match any notes containing the word `Meeting`. As in find for persons, the order of the keywords also does not matter, and `Meeting Club` will also match a note called `Club Meeting`.
+
+Please be informed that only the title will be search. Contents will not be searched through this command.
+
+Although the title may contain special characters such as `,`, `.`, `?` or `!`, these special characters are not accepted as part of a keyword. This is because punctuation are not normally associated as part of a word. During the parsing of the [title](#title), special characters are treated as spaces, so adjacent segments of the word containing it are treated as separate words.
+ * The keywords `?!` and `t-shirt` will not be allowed, as they contain special characters.
+ * `2` will match `shirt 2` but will not match `shirt2`, as `shirt2` is an entire word by itself.
+ * To search for `Upcoming club meeting!`, `meeting!` is not allowed as a keyword as it contains a special character, but `meeting` is allowed.
+ * `tshirt` will not match `t–shirt` as `t-shirt` is now treated as two words, `t` and `shirt` with the special character `-` being treated as a spacing.
+
+Format: `findNote KEYWORD [MORE_KEYWORDS]`
+
+Examples:
+* `findNote Meeting` returns `Club Meeting`, `Meeting!` and `Meeting 2`
+* `findNote Soon` returns `Payment (soon)`
+
+[Back to Table of Contents](#table-of-contents)
+
+#### Listing Notes : `listNote`
+
+Shows a list of all notes in the SectresBook.
+
+
:information_source: **Note:**
+If the notes list was previously filtered, the filter icon will disappear to indicate that you are now looking at the full list.
+
+
+This command, unlike many others, does not take in any parameters[10](#glossary).
+
+Format: `listNote`
+
+Examples:
+* `listNote`
+
+[Back to Table of Contents](#table-of-contents)
+
+#### Sorting Notes : `sortNotes` `[coming in v2.0]`
+
+
:exclamation: **Caution:**
+This command does not exist in the present version of the program that this User Guide is written for. It **will not work** if entered.
+
+
+Sorts the notes in either ascending or descending order by title.
+
+[Back to Table of Contents](#table-of-contents)
+
+#### Hiding notes panel : `hideNotes`
+
+Hides the notes panel to the right side of the screen if visible, otherwise, no operation is performed. Use this command if you do not wish to see the notes view while you are working with information related to the members only.
-### Clearing all entries : `clear`
+
:information_source: **Note:**
+Even though the notes panel may be hidden, operations on notes will still work as normal. This is purely a visual feature.
+
+
+Format: `hideNotes`
+
+Example:
+
+Initial view:
+![before hiding note](images/hideNotes-before.png)
+
+After executing `hideNotes`:
+![after hiding notes](images/hideNotes-after.png)
+
+[Back to Table of Contents](#table-of-contents)
+
+#### Showing notes panel : `showNotes`
+
+Slides the notes panel into view if hidden, otherwise, no operation is performed.
+
+Format: `showNotes`
+
+Example :
+
+Initial view:
+![before showing notes](images/showNotes-before.png)
+
+After executing `showNotes`:
+![after showing notes](images/showNotes-after.png)
-Clears all entries from the address book.
+[Back to Table of Contents](#table-of-contents)
+
+
:information_source: **Note:**
+**Q** Why are `hideNotes` and `showNotes` in plural, but the rest of the operations in singular nouns?
+**A** `hideNotes` and `showNotes` are a separate class of commands that are _UI-Centric_, meaning that they only operate on the user interface, as they only shift a panel in the UI, and do not modify any underlying data of the application. The pluarity of the command disambiguates its usage from the other commands that mutates data. For more information, please read our developer guide.
+
+
To ease interpretation, you may read `showNotes` as _"show the **notes panel**"_ or `hideNotes` as _"hide the **notes panel**"_, while `listNote` may be read as _"list each individual **note**"_, `findNote` as _"find each **note** matching"_ and `editNote` as _"edit this **note**"_.
+
+
+### General Features
+
+#### Locating persons and notes by tag : `findTag`
+
+Finds People and Notes that have the given tags. Both the People Panel and Notes Panel will be updated synchronously with all entities that match the specifiers.
+
+
:information_source: **Note:**
+Both the People Panel and Notes Panel will show a `FILTERED` indicator to inform you that both lists have been filtered.
+
+
+Format: `findTag TAG [MORE_TAGS]`
+
+* The tag search is not case-sensitive. e.g `finance` will match `Finance`
+* Only tags are searched.
+* Only full words will be matched e.g. `Tech` will not match `Technology`
+* Persons and Notes matching at least one tag will be returned (i.e. `OR` search).
+ e.g. `Operations Finance` will return
+ * Person `Alex Yeoh` (tag: Friends) (tag: Operations),
+ * Person `Charlotte Oliveiro` (tag: Colleagues) (tag: Finance),
+ * Note `Collect funds from operations team` (tag: Operations)
+
+Examples:
+* `findTag Operations Finance` returns Person `Alex Yeoh`, Person `Charlotte Oliveiro` and Note `Collect funds from operations team`
+ ![result for 'findTag Operations Finance'](images/findTagOperationsFinance.png)
+
+[Back to Table of Contents](#table-of-contents)
+
+#### Inspecting a person : `inspect`
+
+Updates the Inspect Panel with the basic information and loan history of the person inspected.
+
+Inspection is a _UI-centric_ command that operates on the currently viewed person’s list, so you may only inspect those that are presently listed.
+
+If you wish to view the properties of anyone in the full list, please remember to specify `list` to clear the filter.
+
+
:information_source: **Note:**
+If there are multiple people in the list satisfying the keywords given, it will, by default, inspect the first person that matches the keywords.
+
+You may wish to use more unique keywords to reduce ambiguity, or inspect by an index.
+
+
+Format: `inspect INDEX NAME`
+
+Examples:
+* `inspect 2` inspects the second person in the list of people
+* `inspect Lynette` will attempt to find the first person called `Lynette` in the currently **filtered** persons' list and update the Inspect Panel with her information.
+
+
:exclamation: **Caution:**
+If you are trying to inspect a person by name, who does not exist in the currently viewed person list, which may be filtered, it will not be successful. This is because `inspect` only works on the currently viewed list.
+
+
+[Back to Table of Contents](#table-of-contents)
+
+#### Viewing help : `help`
+
+Shows a message explaining how to access the help page.
+
+![help message](images/helpMessage.png)
+
+Copy the link to your clipboard by clicking the `Copy URL` button and paste it in your favourite browser to come back to this page anytime.
+
+Format: `help`
+
+[Back to Table of Contents](#table-of-contents)
+
+#### Clearing all entries : `clear`
+
+Clears all entries of people and notes from the SectresBook. This command is irreversible. This effectively restarts the app from a blank slate.
Format: `clear`
-### Exiting the program : `exit`
+[Back to Table of Contents](#table-of-contents)
+
+#### Exiting the program : `exit`
Exits the program.
Format: `exit`
-### Saving the data
+
:information_source: **Note:**
+Your data is saved automatically.
+
-AddressBook data are saved in the hard disk automatically after any command that changes the data. There is no need to save manually.
+[Back to Table of Contents](#table-of-contents)
-### Editing the data file
+#### Saving the data
-AddressBook data are saved as a JSON file `[JAR file location]/data/addressbook.json`. Advanced users are welcome to update data directly by editing that data file.
+SectresBook data is saved in the hard disk automatically after any command that changes the data. There is no need to save manually.
+
+[Back to Table of Contents](#table-of-contents)
+
+#### Editing the data file
+
+SectresBook data is saved as a JSON file[8](#glossary) at `[JAR file location]/data/sectresbook.json`. Advanced users are welcome to update data directly by editing that data file.
:exclamation: **Caution:**
-If your changes to the data file makes its format invalid, AddressBook will discard all data and start with an empty data file at the next run.
+If your changes to the data file makes its format invalid, SectresBook will discard all data and start with an empty data file at the next run.
-### Archiving data files `[coming in v2.0]`
+[Back to Table of Contents](#table-of-contents)
-_Details coming soon ..._
+#### Archiving data files `[coming in v2.0]`
---------------------------------------------------------------------------------------------------------------------
+
:exclamation: **Caution:**
+This command does not exist in the present version of the program that this User Guide is written for. It **will not work** if entered.
+
+
+Copies the current data file as a new file in the `HOME_FOLDER_LOCATION/archives` folder. This file may be used as a saved checkpoint to load past information into the SectresBook.
+
+[Back to Table of Contents](#table-of-contents)
+
+#### Undo `[coming in v2.0]`
+
+
:exclamation: **Caution:**
+This command does not exist in the present version of the program that this User Guide is written for. It **will not work** if entered.
+
+
+Undoes the last command that the user has inputted, setting the state of the saved data to an earlier state.
+
+[Back to Table of Contents](#table-of-contents)
+
+#### Redo `[coming in v2.0]`
+
+
:exclamation: **Caution:**
+This command does not exist in the present version of the program that this User Guide is written for. It **will not work** if entered.
+
+
+Pushes the state of the program to the later state if it was set back to an earlier state by the `undo` command. If the present state is the most recent state, no operation is performed.
+
+
:information_source: **Note:**
+Note that performing undo commands and inputting a new command after will set the present state to the most recent state. No redo commands may be performed subsequently.
+
+
+[Back to Table of Contents](#table-of-contents)
+--------------------------------------------------------------------------------------------------------------------
## FAQ
+[//]: # (**Q** I work in a highly classified/important organisation and we have large volumes of monetary transactions and tasks we need to keep track of. Can we use this version of the program to manage our operations? )
+
+[//]: # (**A** No, the current version of _SectresBook_ is not designed for such intensive and critical operations. It does not support any form of encryption or security and its performance has not been tested rigorously against larger loads. We ***do not suggest*** using this program in places where information loss or leaks may result in catastrophic consequences.)
+
+**Q** I cannot see any images in this document, what is wrong?
+**A** You are likely viewing the document in dark mode. The images are in black as their main color, please view this document in light mode instead.
+
**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 previous SectresBook data file.
+
+**Q**: Double-clicking the jar file does not open the jar file, why does this happen?
+**A**: Make sure that Java 11[7](#glossary) is installed on your computer. You may also open the terminal[15](#glossary) and type in `java -jar SectresBook.jar`.
+
+**Q** Do I need to have Java installed to run SectresBook?
+**A** Yes, SectresBook runs on Java and would require it to work. For more information on how to install Java 11[7](#glossary), visit this [website](https://docs.oracle.com/en/java/javase/11/install/overview-jdk-installation.html).
+
+**Q** What can I can do if the window size is too small?
+**A** Drag the window of the application with your mouse to enlarge it, or simply click the top right maximise icon of the window.
+
+**Q** Why can't I see the full address of the person I am inspecting?
+**A** Your window is too small to accommodate the full label text, please resize your window either wider or taller so that the full text can be displayed.
+
+**Q** I have entered a command, but there is no response from the program, why did this happen?
+**A** A critical error may have occurred. You may likely be able to continue your usage of the program. Please review your terminal[15](#glossary) output and file a bug report on our [issues page](https://github.com/AY2223S1-CS2103T-W12-2/tp/issues), detailing a description of the bug as well as the steps to reproduce, attaching screenshots if any.
+
+**Q** Do I require an internet connection to use SectresBook?
+**A** No, SectresBook fully works without the need for internet connection.
+
+**Q** I have an existing data file but the app does not show any of the information, what is wrong?
+**A** Your data file is corrupted. If you know how to, please open the JSON data file[8](#glossary) in a text editor and remove the offending data. Otherwise, please refer to someone who knows how to remedy a corrupted data file.
+
+**Q** Who can I contact for questions regarding this version of the program if the information I need cannot be found in this guide?
+**A** Please contact the person from whom you obtained this present version from, or contact any of our developers (links to Github):
+
+
+
+[Back to Table of Contents](#table-of-contents)
--------------------------------------------------------------------------------------------------------------------
-## 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`
+## Glossary
+The definitions in this glossary are context-specific to this application.
+
+No. | Word | Definition
+---|----------------------------------|------------------
+1 | **Alphanumeric Characters** | A combination of alphabetical and numerical characters
+2 | **ASCII Characters** | Characters from the American Standard Code for Information Interchange character encoding standard
+3| **Command Line Interface (CLI)** | A text-based interface that receives typed commands as input and returns textual feedback as output.
+4| **Graphical User Interface (GUI)** | An image-based interface that is more visually appealing than a command-line interface and encapsulates information through the use of icons and images.
+5| **Home Folder** | The folder that SectresBook is located in. It is also where SectresBook will store its data
+6|**Initialisation** | The moment when a Person or Note is created and added into SectresBook.
+7| **Java 11** | Eleventh version of the Java Platform, Standard Edition Development Kit (JDK). SectresBook requires this to be installed to run.
+8| **JSON data file** | A data file that uses the JavaScript Object Notation format.
+9| **Loan** | An amount of money that is borrowed by or owed to a person. A positive value signifies an amount owed by the person and a negative value signifies an amount to be paid to that person.
+10| **Parameter** | A value passed as a section of a command, typically following a prefix.
+11| **Prefix** | A signposting word that indicates the kind of property (i.e. name, email, address, etc), which typically follows immediately after the prefix, that is to be passed as a parameter.
+12| **Property** | An identifiable feature a person or object has that sufficiently distinguishes it from other objects of the same kind.
+13| **Secretary** | A person that manages the tasks and events related to the operations of an organisation.
+14| **Tag** | A label that groups related people together, such that they can be referred to as a single encapsulated entity specified by the tag.
+15| **Terminal** | A text-based interface to the computer
+16| **Treasurer** | A person that manages the finances and monetary transactions related to the operations of an organisation.
+17| **Whitespace** | A space character
+
+[Back to Table of Contents](#table-of-contents)
+
+--------------------------------------------------------------------------------------------------------------------
+## Summary
+
+### Person Properties
+
+
+
+
Person Properties
+
+
+
+
Properties
+
Examples
+
+
+
Compulsory Properties
+
Name
+
Captain Daniel Patrick the 5th
+
+
+
Phone
+
99123510
+
+
+
Address
+
Canopy Street 11 Blk 709, #20-112
+
+
+
Email
+
capt_daniel.patrick-the+5th@example.com
+
+
+
Birthday
+
09/12/2000
+
+
+
Optional Properties
+
Loan
+
Cannot be declared, used by loan history
+
+
+
Loan History
+
An amount of $55 with a reason of "To buy a porcelain vase"
+
+
+
Tags
+
Coworkers; Friends; Operations
+
+
+
+[Back to Table of Contents](#table-of-contents)
+
+### Person Commands
+
+Action | Format | Examples
+--------|----------------------|--------
+**Add a person** | `add name/NAME phone/PHONE_NUMBER email/EMAIL home/ADDRESS bday/BIRTHDAY [tag/TAG]…` | `add name/James Ho phone/22224444 email/jamesho@example.com home/123, Clementi Rd, 1234665 bday/01/01/2000 tag/friend tag/colleague`
+**Edit a person** | `edit INDEX NAME [name/NAME] [phone/PHONE] [email/EMAIL] [home/ADDRESS] [bday/BIRTHDAY] [tag/TAG]…` | `edit 2 name/James Lee email/jameslee@example.com`
+**Edit the loan of a person** | `editLoan INDEX NAME amt/VALUE reason/REASON` | `editLoan 1 amt/-20 reason/Buy Logistics`
+**Delete a person** | `delete INDEX NAME` | `delete 3` `delete Jane`
+**Find a person** | `find KEYWORD [MORE_KEYWORDS]` | `find James Jake` `find 8651`
+**List every person** | `list` | `list`
+
+[Back to Table of Contents](#table-of-contents)
+
+### Notes Properties
+
+
+
+
Notes Properties
+
+
+
+
Properties
+
Examples
+
+
+
Compulsory Properties
+
Title
+
Organise a charity to raise money for the foundling hospital
+
+
+
Content
+
Target $50,000 - by 23rd of December. We're aiming to attract at least 1000 contributors.
+
+
+
Optional Properties
+
Tags
+
Coworkers; Friends; Operations
+
+
+
+[Back to Table of Contents](#table-of-contents)
+
+### Notes Commands
+
+Action | Format | Examples
+--------|-------------------|-------------
+**Add a Note** | `addNote title/TITLE content/CONTENT [tag/TAG]...` | `addNote title/Create Excel Sheet content/Create sheet for blockchain department`
+**Edit a Note** | `editNote INDEX TITLE [title/TITLE] [content/CONTENT] [tag/TAG]...` | `editNote 1 title/Check meeting availability tag/president`
+**Delete a Note** | `deleteNote INDEX` | `deleteNote 1`
+**Find a Note** | `findNote KEYWORD [MORE_KEYWORDS]` | `findNote meeting`
+**List Every Note** | `listNote` | `listNote`
+**Hide Notes Panel** | `hideNotes` | `hideNotes`
+**Show Notes Panel** | `showNotes` | `showNotes`
+
+[Back to Table of Contents](#table-of-contents)
+
+### General Commands
+
+Action | Format | Examples
+-------|---------------------------|----------|
+**Find Tag** | `findTag TAG [MORE_TAGS]` | `findTag Operations Outreach`
+**Inspect** | `inspect INDEX NAME` | `inspect 1` or `inspect Alex`
+**Help** | `help` | `help`
+**Clear all data** | `clear` | `clear`
+**Exit** | `exit` | `exit`
+
+[Back to Table of Contents](#table-of-contents)
diff --git a/docs/_config.yml b/docs/_config.yml
index 6bd245d8f4e..d8a0fa10725 100644
--- a/docs/_config.yml
+++ b/docs/_config.yml
@@ -1,4 +1,4 @@
-title: "AB-3"
+title: "SectresBook"
theme: minima
header_pages:
@@ -8,7 +8,7 @@ header_pages:
markdown: kramdown
-repository: "se-edu/addressbook-level3"
+repository: "AY2223S1-CS2103T-W12-2/tp"
github_icon: "images/github-icon.png"
plugins:
diff --git a/docs/_sass/minima/_base.scss b/docs/_sass/minima/_base.scss
index 0d3f6e80ced..6700ae00931 100644
--- a/docs/_sass/minima/_base.scss
+++ b/docs/_sass/minima/_base.scss
@@ -288,7 +288,7 @@ table {
text-align: center;
}
.site-header:before {
- content: "AB-3";
+ content: "SectresBook";
font-size: 32px;
}
}
diff --git a/docs/diagrams/AddNoteSequenceDiagram.puml b/docs/diagrams/AddNoteSequenceDiagram.puml
new file mode 100644
index 00000000000..e2b485088c7
--- /dev/null
+++ b/docs/diagrams/AddNoteSequenceDiagram.puml
@@ -0,0 +1,93 @@
+@startuml
+!include style.puml
+
+box Logic LOGIC_COLOR_T1
+participant ":LogicManager" as LogicManager LOGIC_COLOR
+participant ":AddressBookParser" as AddressBookParser LOGIC_COLOR
+participant ":AddNoteCommandParser" as AddNoteCommandParser LOGIC_COLOR
+participant ":Title" as Note_Title LOGIC_COLOR
+participant ":Content" as Content LOGIC_COLOR
+participant ":Note" as Note LOGIC_COLOR
+participant "a:AddNoteCommand" as AddNoteCommand LOGIC_COLOR
+participant ":CommandResult" as CommandResult LOGIC_COLOR
+end box
+
+box Model MODEL_COLOR_T1
+participant ":Model" as Model MODEL_COLOR
+end box
+
+[-> LogicManager : execute("addNote n_t/Meeting \nn_c/3rd October 9pm")
+activate LogicManager
+
+LogicManager -> AddressBookParser : parseCommand("addNote n_t/Meeting \nn_c/3rd October 9pm")
+activate AddressBookParser
+
+create AddNoteCommandParser
+AddressBookParser -> AddNoteCommandParser
+activate AddNoteCommandParser
+
+AddNoteCommandParser --> AddressBookParser
+deactivate AddNoteCommandParser
+
+AddressBookParser -> AddNoteCommandParser : parse("n_t/Meeting \nn_c/3rd October 9pm")
+activate AddNoteCommandParser
+
+create Note_Title
+AddNoteCommandParser -> Note_Title
+activate Note_Title
+
+Note_Title --> AddNoteCommandParser
+deactivate Note_Title
+
+create Content
+AddNoteCommandParser -> Content
+activate Content
+
+Content --> AddNoteCommandParser
+deactivate Content
+
+create Note
+AddNoteCommandParser -> Note
+activate Note
+
+Note --> AddNoteCommandParser
+deactivate Note
+
+create AddNoteCommand
+AddNoteCommandParser -> AddNoteCommand
+activate AddNoteCommand
+
+AddNoteCommand --> AddNoteCommandParser : a
+deactivate AddNoteCommand
+
+AddNoteCommandParser --> AddressBookParser : a
+deactivate AddNoteCommandParser
+'Hidden arrow to position the destroy marker below the end of the activation bar.
+AddNoteCommandParser -[hidden]-> AddressBookParser
+destroy AddNoteCommandParser
+
+AddressBookParser --> LogicManager : a
+deactivate AddressBookParser
+
+LogicManager -> AddNoteCommand : execute()
+activate AddNoteCommand
+
+AddNoteCommand -> Model : addNote()
+activate Model
+
+Model --> AddNoteCommand
+deactivate Model
+
+create CommandResult
+AddNoteCommand -> CommandResult
+activate CommandResult
+
+CommandResult --> AddNoteCommand
+deactivate CommandResult
+
+AddNoteCommand --> LogicManager : result
+deactivate AddNoteCommand
+
+[<--LogicManager
+deactivate LogicManager
+@enduml
diff --git a/docs/diagrams/DeleteNoteSequenceDiagram.puml b/docs/diagrams/DeleteNoteSequenceDiagram.puml
new file mode 100644
index 00000000000..f8b2466f7a4
--- /dev/null
+++ b/docs/diagrams/DeleteNoteSequenceDiagram.puml
@@ -0,0 +1,77 @@
+@startuml
+!include style.puml
+
+box Logic LOGIC_COLOR_T1
+participant ":LogicManager" as LogicManager LOGIC_COLOR
+participant ":AddressBookParser" as AddressBookParser LOGIC_COLOR
+participant ":DeleteNoteCommandParser" as DeleteNoteCommandParser LOGIC_COLOR
+participant "d:DeleteNoteCommand" as DeleteNoteCommand LOGIC_COLOR
+participant ":CommandResult" as CommandResult LOGIC_COLOR
+end box
+
+box Model MODEL_COLOR_T1
+participant ":Model" as Model MODEL_COLOR
+end box
+
+[-> LogicManager : execute("deleteNote 1")
+activate LogicManager
+
+LogicManager -> AddressBookParser : parseCommand("deleteNote 1")
+activate AddressBookParser
+
+create DeleteNoteCommandParser
+AddressBookParser -> DeleteNoteCommandParser
+activate DeleteNoteCommandParser
+
+DeleteNoteCommandParser --> AddressBookParser
+deactivate DeleteNoteCommandParser
+
+AddressBookParser -> DeleteNoteCommandParser : parse("1")
+activate DeleteNoteCommandParser
+
+create DeleteNoteCommand
+DeleteNoteCommandParser -> DeleteNoteCommand
+activate DeleteNoteCommand
+
+DeleteNoteCommand --> DeleteNoteCommandParser : d
+deactivate DeleteNoteCommand
+
+DeleteNoteCommandParser --> AddressBookParser : d
+deactivate DeleteNoteCommandParser
+'Hidden arrow to position the destroy marker below the end of the activation bar.
+DeleteNoteCommandParser -[hidden]-> AddressBookParser
+destroy DeleteNoteCommandParser
+
+AddressBookParser --> LogicManager : d
+deactivate AddressBookParser
+
+LogicManager -> DeleteNoteCommand : execute()
+activate DeleteNoteCommand
+
+DeleteNoteCommand -> Model : getAddressBook()
+activate Model
+
+Model --> DeleteNoteCommand
+deactivate Model
+
+DeleteNoteCommand -> Model : deleteNote(noteToDelete)
+activate Model
+
+Model --> DeleteNoteCommand
+deactivate Model
+
+create CommandResult
+DeleteNoteCommand -> CommandResult
+activate CommandResult
+
+CommandResult --> DeleteNoteCommand
+deactivate CommandResult
+
+DeleteNoteCommand --> LogicManager : result
+deactivate DeleteNoteCommand
+
+
+
+[<--LogicManager
+deactivate LogicManager
+@enduml
diff --git a/docs/diagrams/DeleteSequenceWithNameDiagram.puml b/docs/diagrams/DeleteSequenceWithNameDiagram.puml
new file mode 100644
index 00000000000..891285c2c39
--- /dev/null
+++ b/docs/diagrams/DeleteSequenceWithNameDiagram.puml
@@ -0,0 +1,76 @@
+@startuml
+!include style.puml
+
+box Logic LOGIC_COLOR_T1
+participant ":LogicManager" as LogicManager LOGIC_COLOR
+participant ":AddressBookParser" as AddressBookParser LOGIC_COLOR
+participant ":DeleteCommandParser" as DeleteCommandParser LOGIC_COLOR
+participant ":FindCommand" as FindCommand LOGIC_COLOR
+participant "d:DeleteCommand" as DeleteCommand LOGIC_COLOR
+participant ":CommandResult" as CommandResult LOGIC_COLOR
+end box
+
+box Model MODEL_COLOR_T1
+participant ":Model" as Model MODEL_COLOR
+end box
+
+[-> LogicManager : execute("delete David")
+activate LogicManager
+
+LogicManager -> AddressBookParser : parseCommand("delete David")
+activate AddressBookParser
+
+create DeleteCommandParser
+AddressBookParser -> DeleteCommandParser
+activate DeleteCommandParser
+
+DeleteCommandParser --> AddressBookParser
+deactivate DeleteCommandParser
+
+AddressBookParser -> DeleteCommandParser : parse("David")
+activate DeleteCommandParser
+
+create FindCommand
+DeleteCommandParser -> FindCommand
+activate FindCommand
+FindCommand --> DeleteCommandParser
+deactivate FindCommand
+
+create DeleteCommand
+DeleteCommandParser -> DeleteCommand
+activate DeleteCommand
+
+DeleteCommand --> DeleteCommandParser : d
+deactivate DeleteCommand
+
+DeleteCommandParser --> AddressBookParser : d
+deactivate DeleteCommandParser
+'Hidden arrow to position the destroy marker below the end of the activation bar.
+DeleteCommandParser -[hidden]-> AddressBookParser
+destroy DeleteCommandParser
+
+AddressBookParser --> LogicManager : d
+deactivate AddressBookParser
+
+LogicManager -> DeleteCommand : execute()
+activate DeleteCommand
+
+DeleteCommand -> Model : deletePerson(1)
+activate Model
+
+Model --> DeleteCommand
+deactivate Model
+
+create CommandResult
+DeleteCommand -> CommandResult
+activate CommandResult
+
+CommandResult --> DeleteCommand
+deactivate CommandResult
+
+DeleteCommand --> LogicManager : result
+deactivate DeleteCommand
+
+[<--LogicManager
+deactivate LogicManager
+@enduml
diff --git a/docs/diagrams/EditLoanSequenceDiagram.puml b/docs/diagrams/EditLoanSequenceDiagram.puml
new file mode 100644
index 00000000000..2ec0d915bd2
--- /dev/null
+++ b/docs/diagrams/EditLoanSequenceDiagram.puml
@@ -0,0 +1,69 @@
+@startuml
+!include style.puml
+
+box Logic LOGIC_COLOR_T1
+participant ":LogicManager" as LogicManager LOGIC_COLOR
+participant ":AddressBookParser" as AddressBookParser LOGIC_COLOR
+participant ":EditLoanCommandParser" as EditLoanCommandParser LOGIC_COLOR
+participant "d:EditLoanCommand" as EditLoanCommand LOGIC_COLOR
+participant ":CommandResult" as CommandResult LOGIC_COLOR
+end box
+
+box Model MODEL_COLOR_T1
+participant ":Model" as Model MODEL_COLOR
+end box
+
+[-> LogicManager : execute("editLoan 1 amt/10 reason/logistics")
+activate LogicManager
+
+LogicManager -> AddressBookParser : parseCommand("editLoan 1 amt/10 reason/logistics")
+activate AddressBookParser
+
+create EditLoanCommandParser
+AddressBookParser -> EditLoanCommandParser
+activate EditLoanCommandParser
+
+EditLoanCommandParser --> AddressBookParser
+deactivate EditLoanCommandParser
+
+AddressBookParser -> EditLoanCommandParser : parse("1 amt/10 reason/logistics")
+activate EditLoanCommandParser
+
+create EditLoanCommand
+EditLoanCommandParser -> EditLoanCommand
+activate EditLoanCommand
+
+EditLoanCommand --> EditLoanCommandParser : d
+deactivate EditLoanCommand
+
+EditLoanCommandParser --> AddressBookParser : d
+deactivate EditLoanCommandParser
+'Hidden arrow to position the destroy marker below the end of the activation bar.
+EditLoanCommandParser -[hidden]-> AddressBookParser
+destroy EditLoanCommandParser
+
+AddressBookParser --> LogicManager : d
+deactivate AddressBookParser
+
+LogicManager -> EditLoanCommand : execute()
+activate EditLoanCommand
+
+EditLoanCommand -> Model : deletePerson(1)
+activate Model
+
+Model --> EditLoanCommand
+deactivate Model
+
+create CommandResult
+EditLoanCommand -> CommandResult
+activate CommandResult
+
+CommandResult --> EditLoanCommand
+deactivate CommandResult
+
+EditLoanCommand --> LogicManager : result
+deactivate EditLoanCommand
+
+[<--LogicManager
+deactivate LogicManager
+@enduml
diff --git a/docs/diagrams/EditNoteActivityDiagram.puml b/docs/diagrams/EditNoteActivityDiagram.puml
new file mode 100644
index 00000000000..1c12b2954e6
--- /dev/null
+++ b/docs/diagrams/EditNoteActivityDiagram.puml
@@ -0,0 +1,31 @@
+@startuml
+start
+:User executes editNote command;
+
+:Parses the command;
+
+switch ()
+
+case ( [invalid] )
+ :Show parse
+ error message;
+
+case ([command given index/title])
+ :Executes editNote
+ command;
+
+ switch()
+ case ([valid index and descriptor])
+ :Edit note with
+ new details;
+
+ case ([else])
+ :Show invalid note
+ index error message;
+
+ endswitch
+
+
+endswitch
+stop
+@enduml
diff --git a/docs/diagrams/EditNoteSequenceDiagram.puml b/docs/diagrams/EditNoteSequenceDiagram.puml
new file mode 100644
index 00000000000..7bf5145d5dc
--- /dev/null
+++ b/docs/diagrams/EditNoteSequenceDiagram.puml
@@ -0,0 +1,110 @@
+@startuml
+!include style.puml
+
+box Logic LOGIC_COLOR_T1
+participant ":LogicManager" as LogicManager LOGIC_COLOR
+participant ":AddressBookParser" as AddressBookParser LOGIC_COLOR
+participant ":EditNoteCommandParser" as EditNoteCommandParser LOGIC_COLOR
+participant ":FindNoteCommandParser" as FindNoteCommandParser LOGIC_COLOR
+participant "f:FindNoteCommand" as FindNoteCommand LOGIC_COLOR
+participant "e:EditNoteCommand" as EditNoteCommand LOGIC_COLOR
+participant ":CommandResult" as CommandResult LOGIC_COLOR
+end box
+
+box Model MODEL_COLOR_T1
+participant ":Model" as Model MODEL_COLOR
+end box
+
+[-> LogicManager : execute("edit meeting \ntitle/Club Meeting")
+activate LogicManager
+
+LogicManager -> AddressBookParser : parseCommand("edit meeting \ntitle/Club Meeting")
+activate AddressBookParser
+
+create EditNoteCommandParser
+AddressBookParser -> EditNoteCommandParser
+activate EditNoteCommandParser
+
+EditNoteCommandParser --> AddressBookParser
+deactivate EditNoteCommandParser
+
+AddressBookParser -> EditNoteCommandParser : parse("meeting \ntitle/Club Meeting")
+activate EditNoteCommandParser
+
+create FindNoteCommandParser
+EditNoteCommandParser -> FindNoteCommandParser
+activate FindNoteCommandParser
+
+FindNoteCommandParser --> EditNoteCommandParser
+deactivate FindNoteCommandParser
+
+EditNoteCommandParser -> FindNoteCommandParser : parse("meeting")
+activate FindNoteCommandParser
+
+create FindNoteCommand
+FindNoteCommandParser -> FindNoteCommand
+activate FindNoteCommand
+
+FindNoteCommand --> FindNoteCommandParser
+deactivate FindNoteCommand
+
+FindNoteCommandParser --> EditNoteCommandParser :f
+deactivate FindNoteCommandParser
+
+EditNoteCommandParser -> FindNoteCommand : execute()
+activate FindNoteCommand
+
+FindNoteCommand -> Model : updateFilteredNoteList(predicate)
+activate Model
+
+Model --> FindNoteCommand
+deactivate Model
+
+
+FindNoteCommand --> EditNoteCommandParser
+destroy FindNoteCommand
+
+create EditNoteCommand
+EditNoteCommandParser -> EditNoteCommand
+activate EditNoteCommand
+
+EditNoteCommand --> EditNoteCommandParser : e
+deactivate EditNoteCommand
+
+EditNoteCommandParser --> AddressBookParser : e
+deactivate EditNoteCommandParser
+'Hidden arrow to position the destroy marker below the end of the activation bar.
+EditNoteCommandParser -[hidden]-> AddressBookParser
+destroy EditNoteCommandParser
+
+AddressBookParser --> LogicManager : d
+deactivate AddressBookParser
+
+LogicManager -> EditNoteCommand : execute()
+activate EditNoteCommand
+
+EditNoteCommand -> Model : getFilteredNoteList()
+activate Model
+
+Model --> EditNoteCommand
+deactivate Model
+
+EditNoteCommand -> Model : setNote(noteToEdit, editedNote)
+activate Model
+
+Model --> EditNoteCommand
+deactivate Model
+
+create CommandResult
+EditNoteCommand -> CommandResult
+activate CommandResult
+
+CommandResult --> EditNoteCommand
+deactivate CommandResult
+
+EditNoteCommand --> LogicManager : result
+deactivate EditNoteCommand
+
+[<--LogicManager
+deactivate LogicManager
+@enduml
diff --git a/docs/diagrams/EditSequenceDiagram.puml b/docs/diagrams/EditSequenceDiagram.puml
new file mode 100644
index 00000000000..a43c69aacbb
--- /dev/null
+++ b/docs/diagrams/EditSequenceDiagram.puml
@@ -0,0 +1,91 @@
+@startuml
+!include style.puml
+
+box Logic LOGIC_COLOR_T1
+participant ":LogicManager" as LogicManager LOGIC_COLOR
+participant ":AddressBookParser" as AddressBookParser LOGIC_COLOR
+participant ":EditCommandParser" as EditCommandParser LOGIC_COLOR
+participant ":FindCommandParser" as FindCommandParser LOGIC_COLOR
+participant "f:FindCommand" as FindCommand LOGIC_COLOR
+participant "d:EditCommand" as EditCommand LOGIC_COLOR
+participant ":CommandResult" as CommandResult LOGIC_COLOR
+end box
+
+box Model MODEL_COLOR_T1
+participant ":Model" as Model MODEL_COLOR
+end box
+
+[-> LogicManager : execute("edit Lynette")
+activate LogicManager
+
+LogicManager -> AddressBookParser : parseCommand("edit Lynette")
+activate AddressBookParser
+
+create EditCommandParser
+AddressBookParser -> EditCommandParser
+activate EditCommandParser
+
+EditCommandParser --> AddressBookParser
+deactivate EditCommandParser
+
+AddressBookParser -> EditCommandParser : parse("Lynette")
+activate EditCommandParser
+
+create FindCommandParser
+EditCommandParser -> FindCommandParser : find("Lynette")
+activate FindCommandParser
+
+create FindCommand
+FindCommandParser -> FindCommand
+activate FindCommand
+
+FindCommand --> FindCommandParser
+deactivate FindCommand
+
+FindCommandParser -> EditCommandParser
+deactivate FindCommandParser
+
+EditCommandParser -> FindCommand : execute()
+activate FindCommand
+
+FindCommand --> EditCommandParser
+destroy FindCommand
+
+create EditCommand
+EditCommandParser -> EditCommand
+activate EditCommand
+
+EditCommand --> EditCommandParser : d
+deactivate EditCommand
+
+EditCommandParser --> AddressBookParser : d
+deactivate EditCommandParser
+'Hidden arrow to position the destroy marker below the end of the activation bar.
+EditCommandParser -[hidden]-> AddressBookParser
+destroy EditCommandParser
+
+AddressBookParser --> LogicManager : d
+deactivate AddressBookParser
+
+LogicManager -> EditCommand : execute()
+activate EditCommand
+
+EditCommand -> Model : deletePerson(1)
+activate Model
+
+Model --> EditCommand
+deactivate Model
+
+create CommandResult
+EditCommand -> CommandResult
+activate CommandResult
+
+CommandResult --> EditCommand
+deactivate CommandResult
+
+EditCommand --> LogicManager : result
+deactivate EditCommand
+
+[<--LogicManager
+deactivate LogicManager
+@enduml
diff --git a/docs/diagrams/FindCommandSequence.puml b/docs/diagrams/FindCommandSequence.puml
new file mode 100644
index 00000000000..13731f6eb12
--- /dev/null
+++ b/docs/diagrams/FindCommandSequence.puml
@@ -0,0 +1,65 @@
+@startuml
+!include style.puml
+
+box Logic LOGIC_COLOR_T1
+participant ":LogicManager" as LogicManager LOGIC_COLOR
+participant ":AddressBookParser" as AddressBookParser LOGIC_COLOR
+participant ":FindCommandParser" as FindCommandParser LOGIC_COLOR
+participant ":FindCommand" as FindCommand LOGIC_COLOR
+participant "predicate:NameContainsKeywordsPredicate" as NameContainsKeywordsPredicate LOGIC_COLOR
+end box
+
+box Model MODEL_COLOR_T1
+participant ":Model" as Model MODEL_COLOR
+end box
+
+[-> LogicManager : execute(find David)
+activate LogicManager
+
+LogicManager -> AddressBookParser : parseCommand(find)
+activate AddressBookParser
+
+create FindCommandParser
+AddressBookParser -> FindCommandParser
+activate FindCommandParser
+
+create FindCommand
+FindCommandParser -> FindCommand
+activate FindCommand
+
+create NameContainsKeywordsPredicate
+FindCommand -> NameContainsKeywordsPredicate
+activate NameContainsKeywordsPredicate
+
+NameContainsKeywordsPredicate --> FindCommand
+deactivate NameContainsKeywordsPredicate
+
+FindCommand --> FindCommandParser
+deactivate FindCommand
+
+FindCommandParser --> AddressBookParser
+deactivate FindCommandParser
+FindCommandParser -[hidden]-> AddressBookParser
+destroy FindCommandParser
+
+AddressBookParser --> LogicManager
+deactivate AddressBookParser
+
+LogicManager -> FindCommand :execute(model)
+activate FindCommand
+
+FindCommand -> Model :updateFilteredPersonList(predicate)
+activate Model
+
+Model --> FindCommand
+deactivate Model
+
+FindCommand --> LogicManager
+deactivate FindCommand
+FindCommand -[hidden]-> LogicManager
+destroy FindCommand
+
+<-- LogicManager
+deactivate LogicManager
+
+@enduml
diff --git a/docs/diagrams/FindTagSequenceDiagram.puml b/docs/diagrams/FindTagSequenceDiagram.puml
new file mode 100644
index 00000000000..3432642a92f
--- /dev/null
+++ b/docs/diagrams/FindTagSequenceDiagram.puml
@@ -0,0 +1,78 @@
+@startuml
+!include style.puml
+
+box Logic LOGIC_COLOR_T1
+participant ":LogicManager" as LogicManager LOGIC_COLOR
+participant ":AddressBookParser" as AddressBookParser LOGIC_COLOR
+participant ":FindTagCommandParser" as FindTagCommandParser LOGIC_COLOR
+participant ":FindTagCommand" as FindTagCommand LOGIC_COLOR
+participant ":PersonTagsContainsKeywordsPredicate" as PersonTagsContainsKeywordsPredicate LOGIC_COLOR
+participant ":NoteTagsContainsKeywordsPredicate" as NoteTagsContainsKeywordsPredicate LOGIC_COLOR
+end box
+
+box Model MODEL_COLOR_T1
+participant ":Model" as Model MODEL_COLOR
+end box
+
+[-> LogicManager : execute(findTag Finance)
+activate LogicManager
+
+LogicManager -> AddressBookParser : parseCommand(findTag)
+activate AddressBookParser
+
+create FindTagCommandParser
+AddressBookParser -> FindTagCommandParser
+activate FindTagCommandParser
+
+create FindTagCommand
+FindTagCommandParser -> FindTagCommand
+activate FindTagCommand
+
+create PersonTagsContainsKeywordsPredicate
+FindTagCommand -> PersonTagsContainsKeywordsPredicate
+activate PersonTagsContainsKeywordsPredicate
+
+PersonTagsContainsKeywordsPredicate --> FindTagCommand
+deactivate PersonTagsContainsKeywordsPredicate
+
+create NoteTagsContainsKeywordsPredicate
+FindTagCommand -> NoteTagsContainsKeywordsPredicate
+activate NoteTagsContainsKeywordsPredicate
+
+NoteTagsContainsKeywordsPredicate --> FindTagCommand
+deactivate NoteTagsContainsKeywordsPredicate
+
+
+FindTagCommand --> FindTagCommandParser
+deactivate FindTagCommand
+
+FindTagCommandParser --> AddressBookParser
+deactivate FindTagCommandParser
+FindTagCommandParser -[hidden]-> AddressBookParser
+destroy FindTagCommandParser
+
+AddressBookParser --> LogicManager
+deactivate AddressBookParser
+
+LogicManager -> FindTagCommand :execute(model)
+activate FindTagCommand
+
+FindTagCommand -> Model :updateFilteredPersonList()
+activate Model
+
+Model --> FindTagCommand
+
+FindTagCommand -> Model :updateFilteredNoteList()
+
+Model --> FindTagCommand
+deactivate Model
+
+FindTagCommand --> LogicManager
+deactivate FindTagCommand
+FindTagCommand -[hidden]-> LogicManager
+destroy FindTagCommand
+
+<-- LogicManager
+deactivate LogicManager
+
+@enduml
diff --git a/docs/diagrams/InspectSequenceDiagram.puml b/docs/diagrams/InspectSequenceDiagram.puml
new file mode 100644
index 00000000000..27fef6befc8
--- /dev/null
+++ b/docs/diagrams/InspectSequenceDiagram.puml
@@ -0,0 +1,107 @@
+@startuml
+!include style.puml
+
+box Logic LOGIC_COLOR_T1
+participant ":MainWindow" as MainWindow LOGIC_COLOR
+participant ":LogicManager" as LogicManager LOGIC_COLOR
+participant ":AddressBookParser" as AddressBookParser LOGIC_COLOR
+participant ":InspectCommandParser" as InspectCommandParser LOGIC_COLOR
+participant ":InspectCommand" as InspectCommand LOGIC_COLOR
+participant ":CommandResult" as CommandResult LOGIC_COLOR
+end box
+
+box UI UI_COLOR_T1
+participant ":ResultDisplay" as ResultDisplay LOGIC_COLOR
+participant "personListView:ListView" as ListView LOGIC_COLOR
+participant ":InspectionPanel" as InspectionPanel LOGIC_COLOR
+end box
+
+
+[-> MainWindow : executeCommand("inspect David")
+activate MainWindow
+
+MainWindow -> LogicManager : execute"("inspect David")
+activate LogicManager
+
+LogicManager -> AddressBookParser : parseCommand("inspect David")
+activate AddressBookParser
+
+create InspectCommandParser
+AddressBookParser -> InspectCommandParser
+activate InspectCommandParser
+
+create InspectCommand
+InspectCommandParser -> InspectCommand : parse("David")
+activate InspectCommand
+
+create CommandResult
+InspectCommand -> CommandResult : CommandResult(inspectionMessage, UIState.Inspect, ["David"])
+activate CommandResult
+
+
+CommandResult --> InspectCommand
+deactivate CommandResult
+
+InspectCommand --> InspectCommandParser : commandResult
+deactivate InspectCommand
+InspectCommand -[hidden]-> InspectCommandParser
+destroy InspectCommand
+
+InspectCommandParser --> AddressBookParser : commandResult
+deactivate InspectCommandParser
+InspectCommandParser -[hidden]-> AddressBookParser
+destroy InspectCommandParser
+
+AddressBookParser --> LogicManager : commandResult
+deactivate AddressBookParser
+
+LogicManager --> MainWindow : commandResult
+deactivate LogicManager
+
+MainWindow -> CommandResult : getFeedbackToUser()
+activate CommandResult
+
+CommandResult --> MainWindow : feedback
+deactivate CommandResult
+
+MainWindow -> ResultDisplay : setFeedbackToUser(feedback)
+activate ResultDisplay
+ResultDisplay -[hidden]-> MainWindow
+deactivate ResultDisplay
+
+MainWindow -> CommandResult : getUiState()
+activate CommandResult
+CommandResult --> MainWindow : UIState.Inspect
+deactivate CommandResult
+
+MainWindow -> CommandResult : getArgs()
+activate CommandResult
+CommandResult --> MainWindow : ["David"]
+deactivate CommandResult
+
+MainWindow -> MainWindow : handleInspect(["David"])
+
+MainWindow -> ListView : find 1st relevant person matching "David"
+activate ListView
+
+
+ListView -> InspectionPanel : setInspectParameters()
+activate InspectionPanel
+
+ListView -[hidden]-> InspectionPanel
+ListView -[hidden]-> InspectionPanel
+ListView -[hidden]-> InspectionPanel
+deactivate InspectionPanel
+
+ListView -> ResultDisplay
+activate ResultDisplay
+
+ResultDisplay --[hidden]> ListView
+deactivate ResultDisplay
+
+deactivate ListView
+
+<-- MainWindow
+deactivate MainWindow
+
+@enduml
diff --git a/docs/diagrams/ModelClassDiagram.puml b/docs/diagrams/ModelClassDiagram.puml
index 4439108973a..dd5da9afcd4 100644
--- a/docs/diagrams/ModelClassDiagram.puml
+++ b/docs/diagrams/ModelClassDiagram.puml
@@ -13,12 +13,20 @@ Class ModelManager
Class UserPrefs
Class UniquePersonList
+Class UniqueTagMapping
Class Person
Class Address
+Class Birthday
+Class Loan
+Class LoanHistory
Class Email
Class Name
Class Phone
Class Tag
+Class NoteBook
+Class Note
+Class Content
+Class Title
}
@@ -28,23 +36,35 @@ HiddenOutside ..> Model
AddressBook .up.|> ReadOnlyAddressBook
ModelManager .up.|> Model
-Model .right.> ReadOnlyUserPrefs
-Model .left.> ReadOnlyAddressBook
+Model ..> ReadOnlyUserPrefs
+Model ..> ReadOnlyAddressBook
ModelManager -left-> "1" AddressBook
-ModelManager -right-> "1" UserPrefs
+ModelManager -up-> "1" UserPrefs
UserPrefs .up.|> ReadOnlyUserPrefs
-AddressBook *--> "1" UniquePersonList
+AddressBook *---> "1" UniquePersonList
+AddressBook *---> "1" UniqueTagMapping
+AddressBook *---> "1" NoteBook
UniquePersonList --> "~* all" Person
+UniqueTagMapping ---> "~* all" Tag
+NoteBook --> Note
+Note *--> Content
+Note *--> Title
+Note *--> "1" Tag
Person *--> Name
Person *--> Phone
Person *--> Email
Person *--> Address
-Person *--> "*" Tag
+Person *--> Birthday
+Person *--> Loan
+Person *--> LoanHistory
+Person "*" <--> "*" Tag
Name -[hidden]right-> Phone
Phone -[hidden]right-> Address
Address -[hidden]right-> Email
+NoteBook -[hidden]right-> UniquePersonList
ModelManager -->"~* filtered" Person
+ModelManager -->"~* filtered" Note
@enduml
diff --git a/docs/diagrams/NoteClassDiagram.puml b/docs/diagrams/NoteClassDiagram.puml
new file mode 100644
index 00000000000..62de706bcb5
--- /dev/null
+++ b/docs/diagrams/NoteClassDiagram.puml
@@ -0,0 +1,12 @@
+@startuml
+!include style.puml
+skinparam arrowThickness 1.1
+skinparam arrowColor MODEL_COLOR
+skinparam classBackgroundColor MODEL_COLOR
+
+
+Note *--> Title
+Note *--> Content
+Note "*" <--> "*" Tag
+Person "1..*" <-up-> "*" Tag
+@enduml
diff --git a/docs/diagrams/PersonClassDiagram.puml b/docs/diagrams/PersonClassDiagram.puml
new file mode 100644
index 00000000000..8593c575507
--- /dev/null
+++ b/docs/diagrams/PersonClassDiagram.puml
@@ -0,0 +1,18 @@
+@startuml
+!include style.puml
+skinparam arrowThickness 1.1
+skinparam arrowColor MODEL_COLOR
+skinparam classBackgroundColor MODEL_COLOR
+
+Person "1..*" <--> "*" Tag
+
+Person *--> Name
+Person *--> Phone
+Person *--> Email
+Person *--> Address
+Person *--> Birthday
+Person *-right-> Loan
+Person *--right-> "*" LoanHistory
+LoanHistory --> "1" Loan
+LoanHistory --> "1" Reason
+@enduml
diff --git a/docs/diagrams/UIActivityDiagram.puml b/docs/diagrams/UIActivityDiagram.puml
new file mode 100644
index 00000000000..22fde66333d
--- /dev/null
+++ b/docs/diagrams/UIActivityDiagram.puml
@@ -0,0 +1,56 @@
+@startuml
+start
+ :User Interface is loaded;
+repeat
+
+ switch ()
+
+ case ()
+ if () then ([User presses SPACE])
+ :CommandBox captures the event tied
+ to the space key;
+ else ([User clicks on the CommandBox])
+ endif
+ :ResultDisplay opacity increases
+ from 0 to 0.8 over the period of 0.3 seconds;
+ :User types in command;
+ :User presses the enter button;
+
+ if ()
+ ->[User typed in "exit"] ;
+ stop
+ else ()
+ :Execute command;
+ endif
+
+ case ([User clicks on anywhere outside of CommandBox])
+ if () then ([ResultDisplay is shown])
+ :ResultDisplay opacity is reduced from
+ 0.8 to 0 over a period of 0.3 seconds;
+ else ([ResultDisplay is hidden])
+ endif
+
+ case ( [User clicks on any PersonCard])
+ :Selection Model of the ListView of Persons
+ is updated to the selected person;
+ :Inspection Panel captures the change in
+ Selection Model;
+ :Inspection Panel updates the labels with the
+ selection Person's particulars;
+
+ endswitch
+
+
+ 'Since the beta syntax does not support placing the condition outside the
+ 'diamond we place it as the true branch instead.
+
+ if () then ([valid command])
+ :ResultDisplay shows command result message;
+ :UI updates state based on UIState and arguments passed;
+ else ([else])
+ :ResultDisplay shows invalid command result message;
+ endif
+ repeat while (more commands?) is ([yes])
+ ->[User presses the cross icon on the window];
+stop
+@enduml
diff --git a/docs/diagrams/UiClassDiagram.puml b/docs/diagrams/UiClassDiagram.puml
index 95473d5aa19..0e53dffcf3a 100644
--- a/docs/diagrams/UiClassDiagram.puml
+++ b/docs/diagrams/UiClassDiagram.puml
@@ -6,15 +6,18 @@ skinparam classBackgroundColor UI_COLOR
package UI <>{
Class "<>\nUi" as Ui
-Class "{abstract}\nUiPart" as UiPart
Class UiManager
Class MainWindow
Class HelpWindow
Class ResultDisplay
Class PersonListPanel
+Class NoteListPanel
Class PersonCard
-Class StatusBarFooter
+Class NoteCard
Class CommandBox
+Class InspectPanel
+Class LoanHistoryCard
+Class WindowAnchorPane
}
package Model <> {
@@ -30,31 +33,29 @@ HiddenOutside ..> Ui
UiManager .left.|> Ui
UiManager -down-> "1" MainWindow
+
MainWindow *-down-> "1" CommandBox
-MainWindow *-down-> "1" ResultDisplay
-MainWindow *-down-> "1" PersonListPanel
-MainWindow *-down-> "1" StatusBarFooter
+MainWindow *-left-> "1" WindowAnchorPane
MainWindow --> "0..1" HelpWindow
-PersonListPanel -down-> "*" PersonCard
-
-MainWindow -left-|> UiPart
+WindowAnchorPane *-down-> "1" ResultDisplay
+WindowAnchorPane *-down-> "1" PersonListPanel
+WindowAnchorPane *-down-> "1" NoteListPanel
+WindowAnchorPane *-down-> "1" InspectPanel
-ResultDisplay --|> UiPart
-CommandBox --|> UiPart
-PersonListPanel --|> UiPart
-PersonCard --|> UiPart
-StatusBarFooter --|> UiPart
-HelpWindow --|> UiPart
+PersonListPanel -down-> "*" PersonCard
+NoteListPanel -down-> "*" NoteCard
+InspectPanel -down-> "*" LoanHistoryCard
PersonCard ..> Model
+NoteCard ..> Model
+LoanHistoryCard ..> Model
UiManager -right-> Logic
MainWindow -left-> Logic
PersonListPanel -[hidden]left- HelpWindow
HelpWindow -[hidden]left- CommandBox
CommandBox -[hidden]left- ResultDisplay
-ResultDisplay -[hidden]left- StatusBarFooter
MainWindow -[hidden]-|> UiPart
@enduml
diff --git a/docs/images/AddNoteSequenceDiagram.png b/docs/images/AddNoteSequenceDiagram.png
new file mode 100644
index 00000000000..81849155051
Binary files /dev/null and b/docs/images/AddNoteSequenceDiagram.png differ
diff --git a/docs/images/DeleteNoteSequenceDiagram.png b/docs/images/DeleteNoteSequenceDiagram.png
new file mode 100644
index 00000000000..c9a4ffb6b2f
Binary files /dev/null and b/docs/images/DeleteNoteSequenceDiagram.png differ
diff --git a/docs/images/DeleteSequenceWithNameDiagram.png b/docs/images/DeleteSequenceWithNameDiagram.png
new file mode 100644
index 00000000000..1a077fd4388
Binary files /dev/null and b/docs/images/DeleteSequenceWithNameDiagram.png differ
diff --git a/docs/images/EditLoanSequenceDiagram.png b/docs/images/EditLoanSequenceDiagram.png
new file mode 100644
index 00000000000..19e3f0b0f8b
Binary files /dev/null and b/docs/images/EditLoanSequenceDiagram.png differ
diff --git a/docs/images/EditNoteActivityDiagram.png b/docs/images/EditNoteActivityDiagram.png
new file mode 100644
index 00000000000..13864c2d48b
Binary files /dev/null and b/docs/images/EditNoteActivityDiagram.png differ
diff --git a/docs/images/EditNoteSequenceDiagram.png b/docs/images/EditNoteSequenceDiagram.png
new file mode 100644
index 00000000000..dfef1db30fd
Binary files /dev/null and b/docs/images/EditNoteSequenceDiagram.png differ
diff --git a/docs/images/EditSequenceDiagram.png b/docs/images/EditSequenceDiagram.png
new file mode 100644
index 00000000000..e841d9e97b5
Binary files /dev/null and b/docs/images/EditSequenceDiagram.png differ
diff --git a/docs/images/FindCommandSequence.png b/docs/images/FindCommandSequence.png
new file mode 100644
index 00000000000..b61ede7739d
Binary files /dev/null and b/docs/images/FindCommandSequence.png differ
diff --git a/docs/images/FindTagSequenceDiagram.png b/docs/images/FindTagSequenceDiagram.png
new file mode 100644
index 00000000000..9d99897d248
Binary files /dev/null and b/docs/images/FindTagSequenceDiagram.png differ
diff --git a/docs/images/InspectSequenceDiagram.png b/docs/images/InspectSequenceDiagram.png
new file mode 100644
index 00000000000..cff6086b59d
Binary files /dev/null and b/docs/images/InspectSequenceDiagram.png differ
diff --git a/docs/images/LoanHistoryPanel.png b/docs/images/LoanHistoryPanel.png
new file mode 100644
index 00000000000..a1343d85b7e
Binary files /dev/null and b/docs/images/LoanHistoryPanel.png differ
diff --git a/docs/images/ModelClassDiagram.png b/docs/images/ModelClassDiagram.png
index 04070af60d8..d166be8291c 100644
Binary files a/docs/images/ModelClassDiagram.png and b/docs/images/ModelClassDiagram.png differ
diff --git a/docs/images/NoteClassDiagram.png b/docs/images/NoteClassDiagram.png
new file mode 100644
index 00000000000..a81e234200b
Binary files /dev/null and b/docs/images/NoteClassDiagram.png differ
diff --git a/docs/images/NoteTags.png b/docs/images/NoteTags.png
new file mode 100644
index 00000000000..22a69387cb9
Binary files /dev/null and b/docs/images/NoteTags.png differ
diff --git a/docs/images/NotesFilteredIcon.png b/docs/images/NotesFilteredIcon.png
new file mode 100644
index 00000000000..ce14b82fd5c
Binary files /dev/null and b/docs/images/NotesFilteredIcon.png differ
diff --git a/docs/images/PeopleFilteredIcon.png b/docs/images/PeopleFilteredIcon.png
new file mode 100644
index 00000000000..ca3d723b641
Binary files /dev/null and b/docs/images/PeopleFilteredIcon.png differ
diff --git a/docs/images/PersonClassDiagram.png b/docs/images/PersonClassDiagram.png
new file mode 100644
index 00000000000..061946bab55
Binary files /dev/null and b/docs/images/PersonClassDiagram.png differ
diff --git a/docs/images/PersonTags.png b/docs/images/PersonTags.png
new file mode 100644
index 00000000000..54e9774e749
Binary files /dev/null and b/docs/images/PersonTags.png differ
diff --git a/docs/images/ResultsDisplay.png b/docs/images/ResultsDisplay.png
new file mode 100644
index 00000000000..543057a07cd
Binary files /dev/null and b/docs/images/ResultsDisplay.png differ
diff --git a/docs/images/TypicalNoteCard.png b/docs/images/TypicalNoteCard.png
new file mode 100644
index 00000000000..4dd52628db0
Binary files /dev/null and b/docs/images/TypicalNoteCard.png differ
diff --git a/docs/images/TypicalPersonCard.png b/docs/images/TypicalPersonCard.png
new file mode 100644
index 00000000000..fd877bb03c9
Binary files /dev/null and b/docs/images/TypicalPersonCard.png differ
diff --git a/docs/images/UIActivityDiagram.png b/docs/images/UIActivityDiagram.png
new file mode 100644
index 00000000000..a41b31ef31f
Binary files /dev/null and b/docs/images/UIActivityDiagram.png differ
diff --git a/docs/images/UIComponentsLabeled.png b/docs/images/UIComponentsLabeled.png
new file mode 100644
index 00000000000..4eb1a84cc7b
Binary files /dev/null and b/docs/images/UIComponentsLabeled.png differ
diff --git a/docs/images/Ui.png b/docs/images/Ui.png
index 5bd77847aa2..5624ac233ab 100644
Binary files a/docs/images/Ui.png and b/docs/images/Ui.png differ
diff --git a/docs/images/UiClassDiagram.png b/docs/images/UiClassDiagram.png
index 785e04dbab4..e66dc737c52 100644
Binary files a/docs/images/UiClassDiagram.png and b/docs/images/UiClassDiagram.png differ
diff --git a/docs/images/UiLabeled.png b/docs/images/UiLabeled.png
new file mode 100644
index 00000000000..eb3b2252b7e
Binary files /dev/null and b/docs/images/UiLabeled.png differ
diff --git a/docs/images/czhongwei.png b/docs/images/czhongwei.png
new file mode 100644
index 00000000000..2ae5ef2911d
Binary files /dev/null and b/docs/images/czhongwei.png differ
diff --git a/docs/images/find86result.png b/docs/images/find86result.png
new file mode 100644
index 00000000000..98906cf7695
Binary files /dev/null and b/docs/images/find86result.png differ
diff --git a/docs/images/findAlexDavidResult.png b/docs/images/findAlexDavidResult.png
index 235da1c273e..ab27b081114 100644
Binary files a/docs/images/findAlexDavidResult.png and b/docs/images/findAlexDavidResult.png differ
diff --git a/docs/images/findTagOperationsFinance.png b/docs/images/findTagOperationsFinance.png
new file mode 100644
index 00000000000..c21a3f90a90
Binary files /dev/null and b/docs/images/findTagOperationsFinance.png differ
diff --git a/docs/images/helpMessage.png b/docs/images/helpMessage.png
index b1f70470137..6c0ea259c4c 100644
Binary files a/docs/images/helpMessage.png and b/docs/images/helpMessage.png differ
diff --git a/docs/images/hideNotes-after.png b/docs/images/hideNotes-after.png
new file mode 100644
index 00000000000..37eb5e2c6e6
Binary files /dev/null and b/docs/images/hideNotes-after.png differ
diff --git a/docs/images/hideNotes-before.png b/docs/images/hideNotes-before.png
new file mode 100644
index 00000000000..3da8c4dc0cd
Binary files /dev/null and b/docs/images/hideNotes-before.png differ
diff --git a/docs/images/icons/address_book_32.png b/docs/images/icons/address_book_32.png
new file mode 100644
index 00000000000..3bea0752ed5
Binary files /dev/null and b/docs/images/icons/address_book_32.png differ
diff --git a/docs/images/icons/bg.png b/docs/images/icons/bg.png
new file mode 100644
index 00000000000..4e5cec32c27
Binary files /dev/null and b/docs/images/icons/bg.png differ
diff --git a/docs/images/icons/birthday.png b/docs/images/icons/birthday.png
new file mode 100644
index 00000000000..61ff2d89127
Binary files /dev/null and b/docs/images/icons/birthday.png differ
diff --git a/docs/images/icons/calendar.png b/docs/images/icons/calendar.png
new file mode 100644
index 00000000000..8b2bdf4f1c1
Binary files /dev/null and b/docs/images/icons/calendar.png differ
diff --git a/docs/images/icons/clock.png b/docs/images/icons/clock.png
new file mode 100644
index 00000000000..0807cbf6451
Binary files /dev/null and b/docs/images/icons/clock.png differ
diff --git a/docs/images/icons/decrease_arrow.png b/docs/images/icons/decrease_arrow.png
new file mode 100644
index 00000000000..ef9f53d5278
Binary files /dev/null and b/docs/images/icons/decrease_arrow.png differ
diff --git a/docs/images/icons/fail.png b/docs/images/icons/fail.png
new file mode 100644
index 00000000000..6daf01290dd
Binary files /dev/null and b/docs/images/icons/fail.png differ
diff --git a/docs/images/icons/filter.png b/docs/images/icons/filter.png
new file mode 100644
index 00000000000..19c7571e6d8
Binary files /dev/null and b/docs/images/icons/filter.png differ
diff --git a/docs/images/icons/help_icon.png b/docs/images/icons/help_icon.png
new file mode 100644
index 00000000000..f8e80d6c1c5
Binary files /dev/null and b/docs/images/icons/help_icon.png differ
diff --git a/docs/images/icons/home.png b/docs/images/icons/home.png
new file mode 100644
index 00000000000..61093ae5525
Binary files /dev/null and b/docs/images/icons/home.png differ
diff --git a/docs/images/icons/increase_arrow.png b/docs/images/icons/increase_arrow.png
new file mode 100644
index 00000000000..fb7739be0c1
Binary files /dev/null and b/docs/images/icons/increase_arrow.png differ
diff --git a/docs/images/icons/indicator_arrow.png b/docs/images/icons/indicator_arrow.png
new file mode 100644
index 00000000000..8d81b2d072b
Binary files /dev/null and b/docs/images/icons/indicator_arrow.png differ
diff --git a/docs/images/icons/info_icon.png b/docs/images/icons/info_icon.png
new file mode 100644
index 00000000000..f8cef714095
Binary files /dev/null and b/docs/images/icons/info_icon.png differ
diff --git a/docs/images/icons/loan.png b/docs/images/icons/loan.png
new file mode 100644
index 00000000000..0f4adeedb52
Binary files /dev/null and b/docs/images/icons/loan.png differ
diff --git a/docs/images/icons/mail.png b/docs/images/icons/mail.png
new file mode 100644
index 00000000000..49487a284f1
Binary files /dev/null and b/docs/images/icons/mail.png differ
diff --git a/docs/images/icons/no_records.png b/docs/images/icons/no_records.png
new file mode 100644
index 00000000000..9baa2f74743
Binary files /dev/null and b/docs/images/icons/no_records.png differ
diff --git a/docs/images/icons/notebook.png b/docs/images/icons/notebook.png
new file mode 100644
index 00000000000..c0691e3e632
Binary files /dev/null and b/docs/images/icons/notebook.png differ
diff --git a/docs/images/icons/person.png b/docs/images/icons/person.png
new file mode 100644
index 00000000000..a611c16cf4b
Binary files /dev/null and b/docs/images/icons/person.png differ
diff --git a/docs/images/icons/phone.png b/docs/images/icons/phone.png
new file mode 100644
index 00000000000..aa56f805281
Binary files /dev/null and b/docs/images/icons/phone.png differ
diff --git a/docs/images/neethesh26.png b/docs/images/neethesh26.png
new file mode 100644
index 00000000000..129f11b6c6b
Binary files /dev/null and b/docs/images/neethesh26.png differ
diff --git a/docs/images/pinran-j.png b/docs/images/pinran-j.png
new file mode 100644
index 00000000000..2ae5ef2911d
Binary files /dev/null and b/docs/images/pinran-j.png differ
diff --git a/docs/images/rui-han-crh.png b/docs/images/rui-han-crh.png
new file mode 100644
index 00000000000..88942516341
Binary files /dev/null and b/docs/images/rui-han-crh.png differ
diff --git a/docs/images/ryanczx.png b/docs/images/ryanczx.png
new file mode 100644
index 00000000000..2ae5ef2911d
Binary files /dev/null and b/docs/images/ryanczx.png differ
diff --git a/docs/images/showNotes-after.png b/docs/images/showNotes-after.png
new file mode 100644
index 00000000000..3fc9ed20536
Binary files /dev/null and b/docs/images/showNotes-after.png differ
diff --git a/docs/images/showNotes-before.png b/docs/images/showNotes-before.png
new file mode 100644
index 00000000000..707fa342bfa
Binary files /dev/null and b/docs/images/showNotes-before.png differ
diff --git a/docs/index.md b/docs/index.md
index 7601dbaad0d..7be8226f2f5 100644
--- a/docs/index.md
+++ b/docs/index.md
@@ -1,17 +1,18 @@
---
layout: page
-title: AddressBook Level-3
+title: SectresBook
---
-[![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)
+[![CI Status](https://github.com/AY2223S1-CS2103T-W12-2/tp/workflows/Java%20CI/badge.svg)](https://github.com/AY2223S1-CS2103T-W12-2/tp/actions)
+[![codecov](https://codecov.io/gh/AY2223S1-CS2103T-W12-2/tp/branch/master/graph/badge.svg)](https://codecov.io/gh/AY2223S1-CS2103T-W12-2/tp)
![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).
+**SectresBook** is a desktop application for club secretaries to (i) manage club member information, (ii) keep track of their tasks.
-* 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.
+
+* If you are interested in using SectresBook, head over to the [_Quick Start_ section of the **User Guide**](UserGuide.html#quick-start).
+* If you are interested about developing SectresBook, the [**Developer Guide**](DeveloperGuide.html) is a good place to start.
**Acknowledgements**
diff --git a/docs/team/czhongwei.md b/docs/team/czhongwei.md
new file mode 100644
index 00000000000..5284fb36447
--- /dev/null
+++ b/docs/team/czhongwei.md
@@ -0,0 +1,47 @@
+---
+layout: page
+title: Chee Zhong Wei's Project Portfolio Page
+---
+
+### Project: SectresBook
+
+SectresBook helps secretaries to maintain all the information of the members of their club by collating a list of identifiable information, past records and future tasks.
+
+Given below are my contributions to the project.
+
+* **Code contributed:** [RepoSense link](https://nus-cs2103-ay2223s1.github.io/tp-dashboard/?search=w12-2&sort=groupTitle&sortWithin=title&timeframe=commit&mergegroup=&groupSelect=groupByRepos&breakdown=true&checkedFileTypes=docs~functional-code~test-code~other&since=2022-09-16&tabOpen=true&tabType=authorship&zFR=false&tabAuthor=czhongwei&tabRepo=AY2223S1-CS2103T-W12-2%2Ftp%5Bmaster%5D&authorshipIsMergeGroup=false&authorshipFileTypes=docs~functional-code~test-code&authorshipIsBinaryFileTypeChecked=false&authorshipIsIgnoredFilesChecked=false)
+
+
+* **Enhancements implemented:**
+ * Enhancement: Locate persons by starting digits of phone number in `find`
+ * Originally, `find` only searches for a person that contains the whole keyword in their names
+ * Now, `find` also searches for a person with starting digits of the phone number (at least 2) that matches the keywords provided
+ * Enhancement: Added `Birthday` attribute to `Person`
+ * Each `Person` stores an additional information `Birthday`, which is in dd/mm/yyyy format
+ * The regular expression for `Birthday` includes checks for 29th February on leap years and invalid dates
+ * Enhancement: Changed prefixes of properties
+ * Changed prefixes of properties in commands to better differentiate them
+
+
+* **Contributions to the UG:**
+ * Editted section to include enchancements : `find`
+ * Brief description and explanation
+ * Added screenshots for different features
+ * Wrote up the opening paragraph of the UG
+
+
+* **Contributions to the DG:**
+ * Added content to `find` feature section:
+ * Brief description, explanation and design considerations
+ * Sequence diagram
+ * Added more User stories
+ * Added more Non-Functional Requirements
+ * Added more instructions for manual testing
+ * Did final polishing and checks for UG:
+ * Language use
+ * Spelling mistakes
+ * Formatting
+
+
+* **Review/mentoring contributions**:
+ * Read through, checked and approved team PRs.
diff --git a/docs/team/neethesh26.md b/docs/team/neethesh26.md
new file mode 100644
index 00000000000..212eae7771d
--- /dev/null
+++ b/docs/team/neethesh26.md
@@ -0,0 +1,85 @@
+---
+layout: page
+title: T Neethesh's Project Portfolio Page
+---
+
+### Project: SectresBook
+
+Sectresbook helps secretaries to maintain all the information of the members of their club by collating a list
+of identifiable information, past records and future tasks.
+
+Given below are my contributions to the project.
+
+### New Features Implemented
+
+---------------------------------
+1. Delete by Name
+ * What it does: Allows user to delete a contact from the Sectresbook by name rather than index.
+ * Justification: A secretary/treasurer might remember people by name rather than their indexes in the Sectresbook, hence might have a preference for deleting by name. Catering to that improves user experience.
+ * Highlights: Requires understanding of parser, ensuring that checks are done well when implementing the delete command. Difficult to ensure that a wrong person is not accidentally deleted and the number and name format does not overlap with each other.
+ * Credits: Neethesh [(Link to own PR)](https://github.com/AY2223S1-CS2103T-W12-2/tp/pull/57)
+
+2. Create Loan History
+ * What it does: Allows users to keep track of the changes in their loan amount and the reason for those changes.
+ * Justification: As a treasurer/secretary it is important to be able to keep track of the changes in the loan amount of people in their committee and the reasons for these changes for auditing purposes.
+ * Highlights: Difficult task as it requires full understanding of the code and its structure. Having to understand how the data is stored in `JsonSerializableAddressBook`. Required the modification/creation of over 20 files. Ensuring test cases aligned to the creation of the new field of a person as well.
+ * Credits: Neethesh [(Link to own PR)](https://github.com/AY2223S1-CS2103T-W12-2/tp/pull/99)
+
+3. Edit Loan command
+ * What it does: Allows the user to change the loan amounts by X amount with a reason.
+ * Justification: As a secretary/treasurer, the loan amounts of specific people will change often due to the usage and returning of funds of the committee. Hence, it is important to be able to change these amounts with the respective reasons for the changes being tracked.
+ * Highlights: Have to ensure that the inputs for the editLoan command for the amount to be changed is an integer that fits, and the reason is alphanumeric characters.
+ * Credits: Neethesh [(Link to own PR)](https://github.com/AY2223S1-CS2103T-W12-2/tp/pull/99)
+
+
+### Code contributed
+
+-----------------------------------
+
+[RepoSense link](https://nus-cs2103-ay2223s1.github.io/tp-dashboard/?search=w12-2&sort=groupTitle&sortWithin=title&timeframe=commit&mergegroup=&groupSelect=groupByRepos&breakdown=true&checkedFileTypes=docs~functional-code~test-code~other&since=2022-09-16&tabOpen=true&tabType=authorship&zFR=false&tabAuthor=Neethesh26&tabRepo=AY2223S1-CS2103T-W12-2%2Ftp%5Bmaster%5D&authorshipIsMergeGroup=false&authorshipFileTypes=docs~functional-code~test-code&authorshipIsBinaryFileTypeChecked=false&authorshipIsIgnoredFilesChecked=false)
+
+### Project management
+
+-----------------------------------
+
+* Ensured meetings at stipulated timings.
+* Approved PRs.
+* Facilitated discussion and teamwork during meetings.
+* Advocated asking for help when stuck with code.
+
+
+### Contributions to the UG
+
+----------------------------------
+
+* Added description for `delete` command to include delete by name.
+* Added `editLoan` command description.
+* Compiled and formatted the Summary portion for the commands.
+
+
+
+### Contributions to the DG
+
+-----------------------------------
+
+* Added the sequence diagram for `Delete` command, updating the description to include delete by name.
+![DeleteSequenceWithNameDiagram](../images/DeleteSequenceWithNameDiagram.png)
+
+
+* Added the section, description and sequence diagram for the editLoan command.
+ ![EditLoanSequenceDiagram](../images/EditLoanSequenceDiagram.png)
+
+* Compiled and added the use cases.
+
+* Compiled the `Appendix: Instructions for manual testing` section, adding the commands for testing and the description for majority of the features.
+
+
+### Team based contributions
+
+--------------------------------
+
+* Necessary implementation of Loan and Loan History feature, which is the biggest selling point of our product, where secretaries/treasurers are able to keep track of the individual amounts and changes.
+* Updated parts of UG/DG not specific to a feature.
+* Recognised and fixed bugs relating to features implemented and other features(Including UG bugs)
+
+
diff --git a/docs/team/pinran-j.md b/docs/team/pinran-j.md
new file mode 100644
index 00000000000..3f0196be758
--- /dev/null
+++ b/docs/team/pinran-j.md
@@ -0,0 +1,119 @@
+---
+layout: page
+title: Pinran's Project Portfolio Page
+---
+
+### Project: SectresBook
+
+SectresBook helps secretaries to maintain all the information of the members of their club by collating a list of identifiable information, past records and future tasks.
+
+Given below are my contributions to the project.
+* **Code contributed**: [RepoSense link](https://nus-cs2103-ay2223s1.github.io/tp-dashboard/?search=pinran-j&breakdown=true)
+
+* **New Features Implemented**
+
+ 1. **_Notes model_** [(Link to own PR)](https://github.com/AY2223S1-CS2103T-W12-2/tp/pull/54)
+ * **What it does**: Add structure of notes in model. Notes contain a unique title and its content. Notes are contained in a `NoteBook`.
+ * **Justification**: A treasurer/secretary may require keeping notes on his/her tasks.
+ * **Highlights**: Difficult to implement as Notes interact with many parts of the code which requires full understanding of the code and its structure.(From `AddressBook`, `Model`, `ModelManger`, to how data is stored in `JsonSerializableAddressBook`). Required the modification/creation of over 15 classes.
+
+ 2. **_Add Note command_** [(Link to own PR)](https://github.com/AY2223S1-CS2103T-W12-2/tp/pull/54)
+ * **What it does**: Allows adding of notes into SectresBook by specifying a title and content (optional tag) using respective prefixes.
+ * **Justification**: Command is needed to allow the user to add a note into SectresBook to be kept track of.
+
+ 3. **_Delete Note command_** [(Link to own PR)](https://github.com/AY2223S1-CS2103T-W12-2/tp/pull/54)
+ * **What it does**: Allows the deleting of notes in SectresBook by specifying an index in the notes listed.
+ * **Justification**: A delete command is needed to allow users to delete notes that are no longer relevant or needed to be kept track of.
+
+ 4. **_List Note command_** [(Link to own PR)](https://github.com/AY2223S1-CS2103T-W12-2/tp/pull/54)
+ * **What it does**: Lists all the notes that is being kept track of.
+ * **Justification**: A list command is needed to allow users at any point to view/reset the full list of notes.
+
+ 5. **_Edit Note command_** [(Link to own PR)](https://github.com/AY2223S1-CS2103T-W12-2/tp/pull/81)
+ * **What it does**: Edits the note specified by index/name in the list of notes being kept track of. Notes can be edited by any combinations of `Title`, `Content` or `Tag` (At least one).
+ * **Justification**: An edit command is important to allow users to change a certain property of a note (In the event that a mistake was made when adding a note or a note's property changed) without the need of deleting the note and re-adding it.
+ * **Highlights**: Editing of notes was difficult as the properties of a Note cannot be directly accessed and modified, thus, a system needed to be in place in creating a new `Note` that needed to replace the `Note` to be edited. This new `Note` had to retain properties of the old `Note` that were not modified.
+
+ 6. **_Find Note command_** [(Link to own PR)](https://github.com/AY2223S1-CS2103T-W12-2/tp/pull/81)
+ * **What it does**: Allow the user to find a note in the list of notes kept in SectresBook that matches the keyword specified.
+ * **Justification**: Find command for notes is important to allow users to filter through the current list of notes to magnify and search for the note that are of interest to them. This is important especially in the case where many notes are currently being kept track of.
+ * **Highlights**: Searching by keywords that matches words in `Title` of `Note` was tricky as `Title` contain special characters (ASCII). Thus, many design considerations were needed in deciding what should and should not be allowed to be keyed in as the keywords for the command. Keywords also made to ignore special characters, thus, special`String` manipulation was needed to allow for a correct search.
+
+* **Project management:**
+ * Initiated meetings
+ * Approved a majority of PRs (42 pull requests)
+ * Facilitated and encouraged discussion during meetings.
+ * Ensure that project deadlines are met timely.
+
+* **Enhancements implemented:**
+ * Wrote test cases for all note features/commands to increase coverage by ***+2.38%***, from ***65.96%*** to ***68.34%***
+ * Pull requests [#100](https://github.com/AY2223S1-CS2103T-W12-2/tp/pull/100), Code coverage report [here](https://app.codecov.io/gh/AY2223S1-CS2103T-W12-2/tp/commit/2591db4951ad72aca890421c00da739c76e687ee)
+ * **Justification**: After adding 5 new commands for `Note` and implementation of `Note` itself, code coverage fell as many new classes were created.
+ * **Highlights**: Since notes are a completely new implementation, tedious work was required to set up `TypicalNotes`, an example of a typical note used for testing with. Extra utility classes were also needed to be created for the new notes.
+
+* **Contributions to team-based tasks:**
+ * Necessary implementations of entire Note features.
+ * Structure of Notes, its integration and all of its related commands.
+ * Updated parts of UG/DG not specific to a feature.
+ * Fixed bugs(including UG bugs) related to implementation of notes.
+
+* **Review/mentoring contributions:**
+ * Reviewed contributions/pull requests by other group members
+ * Reading and checking of pull requests by other members, subsequently approving them
+ * Approved a majority of PRs (42 pull requests approved total)
+ * Gave comments and helped correct bugs brought up in PRs
+ * Wrote the probable source of bug
+ * Directed to exact location of bug in a comment
+ * Example of such cases [here](https://github.com/AY2223S1-CS2103T-W12-2/tp/pull/75#pullrequestreview-1158333153)
+
+* **Contributions beyond the project team:**
+ * During PE-D, bugs were thoroughly sieved and detected. Feedbacks regarding bugs found were organised neatly into `small description of feature` and `problem found`. Feedbacks were accompanied by screenshots for better clarity and documenting.
+ * Suggestions were also made to strive and improve quality of product.
+ * [Links to section](https://github.com/Pinran-J/ped/issues)
+
+-------------------
+
+## Contributions to the UG:
+1. Added section on `Introduction to SectresBook` (***not specific to feature***)
+ 1. [Link to section](https://ay2223s1-cs2103t-w12-2.github.io/tp/UserGuide.html#introduction-to-sectresbook)
+2. Added section on `Using this guide` (***not specific to feature***)
+ 1. [Link to section](https://ay2223s1-cs2103t-w12-2.github.io/tp/UserGuide.html#using-this-guide)
+3. Added sections on `Note Features`
+ 1. Including the following sections [(All of which can be found here)](https://ay2223s1-cs2103t-w12-2.github.io/tp/UserGuide.html#note-features)
+ 1. `Adding Notes: addNote`
+ 2. `Editing Notes: editNote`
+ 3. `Deleting Notes: deleteNote`
+ 4. `Locating a note by title: findNote`
+ 5. `Listing Notes: listNote`
+4. Added some questions under `FAQ`
+ 1. [Link to section](https://ay2223s1-cs2103t-w12-2.github.io/tp/UserGuide.html#faq)
+
+
+## Contributions to the DG:
+1. **Helped implemented Model class diagram**
+ 1. ![Model class diagram](../images/ModelClassDiagram.png)
+
+
+2. **Added entire section on `Notes Features`**
+ 1. Added section on `addNote feature`
+ 1. Includes : implementation, example scenario and design considerations
+ 2. Includes the following sequence diagram (using PlantUML)
+ 1. ![AddNoteSequenceDiagram](../images/AddNoteSequenceDiagram.png)
+
+ 2. Added section on `deleteNote feature`
+ 1. Includes : implementation, example scenario and design considerations
+ 2. Includes the following sequence diagram (using PlantUML)
+ 1. ![DeleteNoteSequenceDiagram](../images/DeleteNoteSequenceDiagram.png)
+
+ 3. Added section on `editNote feature`
+ 1. Includes : implementation, example scenario and design considerations
+ 2. Includes the following sequence diagram (using PlantUML)
+ 1. ![EditNoteSequenceDiagram](../images/EditNoteSequenceDiagram.png)
+ 3. Includes the following activity diagram (using PlantUML)
+ 1. ![EditNoteActivityDiagram](../images/EditNoteActivityDiagram.png)
+3. **Added User stories**
+ 1. Added all user stories in the table.
+
+> Link to DG can be found [here](https://ay2223s1-cs2103t-w12-2.github.io/tp/DeveloperGuide.html)
+
+
diff --git a/docs/team/rui-han-crh.md b/docs/team/rui-han-crh.md
new file mode 100644
index 00000000000..c1552845d98
--- /dev/null
+++ b/docs/team/rui-han-crh.md
@@ -0,0 +1,96 @@
+---
+layout: page
+title: Chen Ruihan's Project Portfolio Page
+---
+
+### Project: SectresBook
+
+SectresBook helps secretaries to maintain all the information of the members of their club by collating a list of identifiable information, past records and future tasks. Given below are my contributions to the project.
+
+**Code contributed**: [RepoSense link](https://nus-cs2103-ay2223s1.github.io/tp-dashboard/?search=w12&sort=groupTitle&sortWithin=title&timeframe=commit&mergegroup=&groupSelect=groupByRepos&breakdown=true&checkedFileTypes=docs~functional-code~test-code~other&since=2022-09-16&tabOpen=true&tabType=authorship&tabAuthor=rui-han-crh&tabRepo=AY2223S1-CS2103T-W12-2%2Ftp%5Bmaster%5D&authorshipIsMergeGroup=false&authorshipFileTypes=docs~functional-code&authorshipIsBinaryFileTypeChecked=false&authorshipIsIgnoredFilesChecked=false)
+
+**New Features Implemented**
+
+1. **_Loan Property of a Person_** ([#50](https://github.com/AY2223S1-CS2103T-W12-2/tp/pull/50))
+ * **What it does**: Implements the ability to track monetary amounts that are represented as loaned amounts. The loan amounts must be between -1 trillion to 1 trillion inclusive.
+ * **Justification**: A treasurer requires the need to keep track of monetary transactions. A loan is a data type created to serve this purpose.
+
+2. **_User Interface Design_** ([#75](https://github.com/AY2223S1-CS2103T-W12-2/tp/pull/75))
+ * **What it does**: Remodel and redesigned the user interface as shown in the landing page. Various small icons, images, alignment details and transitions are also applied for visual enhancement.
+ * **Justification**: The previous UI design did not look appealing, so a more visually appealing design was created. This will help the product's publicity and attractiveness to clients.
+ * **Highlights**: Event based triggers (space to start typing, esc to exit typing), transition effects and embellishments.
+
+3. **_Inspect command_** ([#75](https://github.com/AY2223S1-CS2103T-W12-2/tp/pull/75))
+ * **What it does**: Inspects a person in the person's list. Inspection is a UI-centric command that updates UI values. It does not mutate any data in the model. This is also equivalent to just click on the person card.
+ * **Justification**: The UI requires more flexibility when coupled with the CLI, there shouldn't be things that the GUI can do that the CLI cannot, so the `inspect` command was created.
+
+4. **_Show and Hide Notes Panel Command_** ([#75](https://github.com/AY2223S1-CS2103T-W12-2/tp/pull/75))
+ * **What it does**: Shows/hides the notes panel by applying a translational transition with a fade transition to the StackPane containing the notes panel with anchor points on an AnchorPane.
+ * **Justification**: It is difficult to view more than 6 people in the list at the same time especially if working on a monitor with a smaller resolution. By hiding the notes panel, more screen real estate can be given to the person list and inspect panel.
+
+5. **_Edit By Name_** ([#52](https://github.com/AY2223S1-CS2103T-W12-2/tp/pull/52))
+ * **What it does**: Adding onto the ability to edit by index, I implemented an ability to edit by any keyword of the person's name. This makes it more convenient to specify edit operations without checking for name
+ * **Justification**: It is easier to recall a person's name than to read the index from the list.
+
+**Project management**:
+
+* Called meetings to discuss plans.
+* Created milestones and description of milestones and provided feedback on Github PRs and organised issues with tags.
+
+**Contributions to team-based tasks**:
+
+* Setting up the GitHub team org/repo
+* Changed the product icon to the current version (ledger with pen) using GIMP ([#102](https://github.com/AY2223S1-CS2103T-W12-2/tp/pull/102))
+* Released version v1.3.1 for PE-D and fixed 16 bugs after PE-D ([#179](https://github.com/AY2223S1-CS2103T-W12-2/tp/pull/179))
+
+**Review/mentoring contributions**:
+
+* Reviewed contributions by other group members, sometimes suggesting other alternatives for better maintainability.
+* Gave comments on suggestions for bug fixes in the issues tab and published issues based on more bugs found in the issues sections.
+
+**Contributions beyond the project team**:
+
+* Frequently posted in the forums to help other on iP related issues, such as setting the background, smoke testing and basic feature development.
+* During the PE-D, authored issues based on the structure of `Description`, `Steps to reproduce` and `Suggestion`, making the issues clear and reproducible
+
+**Contributions to the UG/DG**:
+
+- UG
+ 1. Added images and icons
+ 2. Added the User Interface section of the UG with pointers to which part corresponds to what function and usage. [Link to UI section](https://ay2223s1-cs2103t-w12-2.github.io/tp/UserGuide.html#user-interface)
+ 3. Added description of properties for both people and notes, found [here](https://ay2223s1-cs2103t-w12-2.github.io/tp/UserGuide.html#properties) and description of commands [`inspect`](https://ay2223s1-cs2103t-w12-2.github.io/tp/UserGuide.html#inspecting-a-person--inspect), [`hideNotes`](https://ay2223s1-cs2103t-w12-2.github.io/tp/UserGuide.html#hiding-notes-panel--hidenotes) and [`showNotes`](https://ay2223s1-cs2103t-w12-2.github.io/tp/UserGuide.html#showing-notes-panel--shownotes).
+ 4. Added [Glossary](https://ay2223s1-cs2103t-w12-2.github.io/tp/UserGuide.html#glossary) terms.
+- DG
+ 1. Added Edit _Sequence Diagram_ involving either searching by index or by name and Inspect _Sequence Diagram_ for the `inspect` command ([#84](https://github.com/AY2223S1-CS2103T-W12-2/tp/pull/84))
+ 2. Updated the UI _Class Diagram_ to reflect the current state of the UI organisation and the Person _Class Diagram_ by adding the loans property to the Person _Class Diagram_
+ 3. Wrote the sections involving [UI design](https://ay2223s1-cs2103t-w12-2.github.io/tp/DeveloperGuide.html#ui-features) and the implementation details of [`inspect`](https://ay2223s1-cs2103t-w12-2.github.io/tp/DeveloperGuide.html#inspect-feature), and `showNotes` and `hideNotes`, found [here](https://ay2223s1-cs2103t-w12-2.github.io/tp/DeveloperGuide.html#showing-and-hiding-the-notes-panel-feature). ([#189](https://github.com/AY2223S1-CS2103T-W12-2/tp/pull/189))
+ 4. Added UI _Activity Diagram_ that describes how a user would interact with the UI
+
+-----------------------------
+
+### Diagram Extracts for DG
+
+**Edit _Sequence Diagram_**
+
+![](../images/EditSequenceDiagram.png)
+
+**Inspect _Sequence Diagram_**
+
+![](../images/InspectSequenceDiagram.png)
+
+
+
+**UI _Class Diagram_**
+
+![](../images/UiClassDiagram.png)
+
+**Person _Class Diagram_**
+
+![](../images/PersonClassDiagram.png)
+
+**UI _Activity Diagram_**
+
+![](../images/UIActivityDiagram.png)
+
+Text extracts to UG and DG are linked in the text above.
+
diff --git a/docs/team/ryanczx.md b/docs/team/ryanczx.md
new file mode 100644
index 00000000000..6bd90459914
--- /dev/null
+++ b/docs/team/ryanczx.md
@@ -0,0 +1,53 @@
+---
+layout: page
+title: Ryan Chua's Project Portfolio Page
+---
+
+### Project: SectresBook
+
+SectresBook helps secretaries to maintain all the information of the members of their club by collating a list of identifiable information, past records and future tasks.
+
+Given below are my contributions to the project.
+
+* **Code contributed**: [RepoSense link](https://nus-cs2103-ay2223s1.github.io/tp-dashboard/?search=w12-2&sort=groupTitle&sortWithin=title&timeframe=commit&mergegroup=&groupSelect=groupByRepos&breakdown=true&checkedFileTypes=docs~functional-code~test-code~other&since=2022-09-16&tabOpen=true&tabType=authorship&zFR=false&tabAuthor=ryanczx&tabRepo=AY2223S1-CS2103T-W12-2%2Ftp%5Bmaster%5D&authorshipIsMergeGroup=false&authorshipFileTypes=docs~functional-code~test-code~other&authorshipIsBinaryFileTypeChecked=false&authorshipIsIgnoredFilesChecked=false)
+
+* **Enhancements implemented**:
+ * Enhancement: Restructure `Tag`
+ * Restructure `Tag` such that SectresBook has a `UniqueTagMapping` that `Person` and `Note` references. This allows SectresBook to only require one `Tag` object per unique tag, instead of each `Person` and `Note` needing their own `Tag` objects.
+ * In addition, every `Tag` has a `Person` list containing references of `Person` objects that are "tagged" with the `Tag`.
+ * This would allow for future features to better make use of `Tag`.
+ * Feature: Locating persons and notes by tag : `findTag`
+ * What it does: Finds `Person`s and `Note`s in SectresBook that have the given tags.
+ * Justification: This feature improves the product because secretaries can give `Person`s and `Note`s tags and find them by those given tags when they are needed in the future.
+ * Enhancement: Added the `Tag` functionality to `Note`
+ * Updated `Note` to have a `Tag` set.
+ * Updated `Note` commands to work with `Tag` functionality.
+ * Added tests to ensure that `Tag` functionality works properly
+
+* **Contributions to the UG**:
+ * Added section for Locating persons and notes by tag : `findTag`
+ * Brief description and explanation
+ * Screenshot for example
+ * Did final polishing and checks for UG
+ * Language use
+ * Formatting
+ * Organization
+ * Links
+ * Conversion to final PDF
+
+* **Contributions to the DG**:
+ * Updated `Model` component UML class diagram to reflect the correct associations between `UniqueTagMapping`, `Person`, `Note` and `Tag`.
+ * Added section for Find Person by Tag feature
+ * Brief description, explanation and design considerations
+ * Sequence diagram
+
+* **Contributions to team-based tasks**:
+ * Setting up the correct Codecov and CI links at the start.
+ * Managed the release v1.3.trial for the trial JAR activity.
+
+* **Review/mentoring contributions**:
+ * Read through, checked and approved team PRs.
+ * Occasionally offered suggestions or fixes for typos.
+
+* **Contributions beyond the project team**:
+ * Gave comments and suggestions for the bugs I found during the PE-D activity.
diff --git a/src/main/java/seedu/address/MainApp.java b/src/main/java/seedu/address/MainApp.java
index 4133aaa0151..b0d72cdc9c4 100644
--- a/src/main/java/seedu/address/MainApp.java
+++ b/src/main/java/seedu/address/MainApp.java
@@ -2,10 +2,12 @@
import java.io.IOException;
import java.nio.file.Path;
+import java.util.Objects;
import java.util.Optional;
import java.util.logging.Logger;
import javafx.application.Application;
+import javafx.scene.text.Font;
import javafx.stage.Stage;
import seedu.address.commons.core.Config;
import seedu.address.commons.core.LogsCenter;
@@ -36,7 +38,7 @@
*/
public class MainApp extends Application {
- public static final Version VERSION = new Version(0, 2, 0, true);
+ public static final Version VERSION = new Version(1, 3, 0, true);
private static final Logger logger = LogsCenter.getLogger(MainApp.class);
@@ -51,6 +53,8 @@ public void init() throws Exception {
logger.info("=============================[ Initializing AddressBook ]===========================");
super.init();
+ loadFonts();
+
AppParameters appParameters = AppParameters.parse(getParameters());
config = initConfig(appParameters.getConfigPath());
@@ -68,6 +72,38 @@ public void init() throws Exception {
ui = new UiManager(logic);
}
+ private void loadFonts() {
+ Font.loadFont(
+ Objects.requireNonNull(MainApp.class.getResource("/fonts/MinionPro-Bold.otf")).toExternalForm(),
+ 10
+ );
+
+ Font.loadFont(
+ Objects.requireNonNull(MainApp.class.getResource("/fonts/MinionPro-Medium.otf")).toExternalForm(),
+ 10
+ );
+
+ Font.loadFont(
+ Objects.requireNonNull(MainApp.class.getResource("/fonts/MinionPro-Semibold.otf")).toExternalForm(),
+ 10
+ );
+
+ Font.loadFont(
+ Objects.requireNonNull(MainApp.class.getResource("/fonts/Bender.otf")).toExternalForm(),
+ 10
+ );
+
+ Font.loadFonts(
+ Objects.requireNonNull(MainApp.class.getResource("/fonts/Bender-Bold.otf")).toExternalForm(),
+ 10
+ );
+
+ Font.loadFonts(
+ Objects.requireNonNull(MainApp.class.getResource("/fonts/Bender-Light.otf")).toExternalForm(),
+ 10
+ );
+ }
+
/**
* Returns a {@code ModelManager} with the data from {@code storage}'s address book and {@code userPrefs}.
* The data from the sample address book will be used instead if {@code storage}'s address book is not found,
@@ -169,6 +205,7 @@ protected UserPrefs initPrefs(UserPrefsStorage storage) {
public void start(Stage primaryStage) {
logger.info("Starting AddressBook " + MainApp.VERSION);
ui.start(primaryStage);
+ primaryStage.setTitle("SectresBook");
}
@Override
diff --git a/src/main/java/seedu/address/commons/core/GuiSettings.java b/src/main/java/seedu/address/commons/core/GuiSettings.java
index ba33653be67..0e631ac4d6a 100644
--- a/src/main/java/seedu/address/commons/core/GuiSettings.java
+++ b/src/main/java/seedu/address/commons/core/GuiSettings.java
@@ -10,8 +10,8 @@
*/
public class GuiSettings implements Serializable {
- private static final double DEFAULT_HEIGHT = 600;
- private static final double DEFAULT_WIDTH = 740;
+ private static final double DEFAULT_HEIGHT = 640;
+ private static final double DEFAULT_WIDTH = 1024;
private final double windowWidth;
private final double windowHeight;
diff --git a/src/main/java/seedu/address/commons/core/Messages.java b/src/main/java/seedu/address/commons/core/Messages.java
index 1deb3a1e469..5c93d489409 100644
--- a/src/main/java/seedu/address/commons/core/Messages.java
+++ b/src/main/java/seedu/address/commons/core/Messages.java
@@ -1,13 +1,62 @@
package seedu.address.commons.core;
+import seedu.address.logic.parser.CliSyntax;
+
/**
* Container for user visible messages.
*/
public class Messages {
public static final String MESSAGE_UNKNOWN_COMMAND = "Unknown command";
+
public static final String MESSAGE_INVALID_COMMAND_FORMAT = "Invalid command format! \n%1$s";
+
+ public static final String MESSAGE_INVALID_AMBIGUOUS_TITLE = "There is more than 1 note with %s in their title!\n"
+ + "Please use a more unique specifier or use indices to edit.";
+
+ public static final String MESSAGE_INVALID_TITLE = "There are no notes with %s in their titles in the list!";
+
+ public static final String MESSAGE_INVALID_NOTE_DISPLAYED_INDEX = "The note index provided is invalid";
+
public static final String MESSAGE_INVALID_PERSON_DISPLAYED_INDEX = "The person index provided is invalid";
+
public static final String MESSAGE_PERSONS_LISTED_OVERVIEW = "%1$d persons listed!";
+ public static final String MESSAGE_NOTES_LISTED_OVERVIEW = "%1$d notes listed!";
+
+ public static final String MESSAGE_NUMBER_TOO_SHORT = "Number to check must be at least 2 digits";
+
+ public static final String MESSAGE_INVALID_KEYWORD = "Keyword is invalid,keyword cannot contain special characters";
+
+ public static final String MESSAGE_INVALID_AMBIGUOUS_NAME = "There is more than 1 person with %s in their name!\n"
+ + "Please use a more unique specifier or use indices to edit.";
+
+ public static final String MESSAGE_INVALID_NAME = "No names matched the given keywords %s!";
+
+ public static final String MESSAGE_INVALID_NON_POSITIVE_INDEX = "You may not specify non-positive indices!";
+
+ public static final String AMOUNT_NOT_SPECIFIED = "No amount to was specified to edit the loan with.\n"
+ + "Please use " + CliSyntax.PREFIX_LOAN_AMOUNT + " to specify a change in loan amount!";
+
+ public static final String REASON_NOT_SPECIFIED = "A reason must be given to change loan amounts.\n"
+ + "Please use " + CliSyntax.PREFIX_LOAN_REASON + " to specify a reason to change the loan value!";
+
+ public static final String OUT_OF_BOUNDS = "The index given to be inspected must be within "
+ + "the bounds of the list!";
+
+ public static final String NOT_AN_INTEGER = "The index given was not an integer value";
+
+ public static final String TOTAL_LOAN_OUT_OF_BOUNDS = "Operation refused as the total loan amount"
+ + " will be out of bounds.";
+
+ public static final String AMBIGUOUS_NAME_INSPECT_FIRST = "There was more than one person of that name found.\n"
+ + "Showing the first person matching the given name.\n"
+ + "Note that inspection works only on the list you are currently viewing.\n"
+ + "Perhaps you would like to perform a find operation with keywords using "
+ + "the find command to narrow your search?";
+
+ public static final String MESSAGE_INVALID_NAME_INSPECT = "No names matched the given keywords %s!\n"
+ + "Note that inspection works only on the list you are currently viewing.\n"
+ + "Perhaps you would like to list out all persons with the list command "
+ + "to widen your search?";
}
diff --git a/src/main/java/seedu/address/commons/util/StringUtil.java b/src/main/java/seedu/address/commons/util/StringUtil.java
index 61cc8c9a1cb..e168e1ed94a 100644
--- a/src/main/java/seedu/address/commons/util/StringUtil.java
+++ b/src/main/java/seedu/address/commons/util/StringUtil.java
@@ -38,6 +38,54 @@ public static boolean containsWordIgnoreCase(String sentence, String word) {
.anyMatch(preppedWord::equalsIgnoreCase);
}
+ /**
+ * Returns true if the {@code sentence} contains the {@code word}.
+ * Ignores case and special characters(!,.""),but a full word match is required.
+ * examples:
+ * @param sentence cannot be null
+ * @param word cannot be null, cannot be empty, must be a single word
+ */
+ public static boolean containsWordIgnoreCaseIgnoreSpecial(String sentence, String word) {
+ requireNonNull(sentence);
+ requireNonNull(word);
+
+ String preppedWord = word.trim();
+ checkArgument(!preppedWord.isEmpty(), "Word parameter cannot be empty");
+ checkArgument(preppedWord.split("\\s+").length == 1, "Word parameter should be a single word");
+
+ String preppedSentence = sentence.replaceAll("[^a-zA-Z0-9]", " ");
+ String[] wordsInPreppedSentence = preppedSentence.split("\\s+");
+
+ return Arrays.stream(wordsInPreppedSentence)
+ .anyMatch(preppedWord::equalsIgnoreCase);
+ }
+
+ /**
+ * Returns true if the {@code phone } contains the {@code numbers}.
+ * Full phone number match is not required.
+ * examples: