diff --git a/.github/workflows/docs.yml b/.github/workflows/docs.yml
new file mode 100644
index 00000000000..1e1862b0e82
--- /dev/null
+++ b/.github/workflows/docs.yml
@@ -0,0 +1,25 @@
+name: MarkBind Action
+
+on:
+ push:
+ branches:
+ - master
+
+jobs:
+ build_and_deploy:
+ runs-on: ubuntu-latest
+ steps:
+ - name: Install Graphviz
+ run: sudo apt-get install graphviz
+ - name: Install Java
+ uses: actions/setup-java@v3
+ with:
+ java-version: '11'
+ distribution: 'temurin'
+ - name: Build & Deploy MarkBind site
+ uses: MarkBind/markbind-action@v2
+ with:
+ token: ${{ secrets.GITHUB_TOKEN }}
+ rootDirectory: './docs'
+ baseUrl: '/tp' # replace with your repo name
+ version: '^5.1.0'
diff --git a/.gitignore b/.gitignore
index 284c4ca7cd9..eab4c7db6a5 100644
--- a/.gitignore
+++ b/.gitignore
@@ -21,3 +21,4 @@ src/test/data/sandbox/
# MacOS custom attributes files created by Finder
.DS_Store
docs/_site/
+docs/_markbind/logs/
diff --git a/README.md b/README.md
index 13f5c77403f..b7381dae973 100644
--- a/README.md
+++ b/README.md
@@ -1,14 +1,52 @@
-[![CI Status](https://github.com/se-edu/addressbook-level3/workflows/Java%20CI/badge.svg)](https://github.com/se-edu/addressbook-level3/actions)
-
-![Ui](docs/images/Ui.png)
-
-* This is **a sample project for Software Engineering (SE) students**.
- Example usages:
- * as a starting point of a course project (as opposed to writing everything from scratch)
- * as a case study
-* The project simulates an ongoing software project for a desktop application (called _AddressBook_) used for managing contact details.
- * It is **written in OOP fashion**. It provides a **reasonably well-written** code base **bigger** (around 6 KLoC) than what students usually write in beginner-level SE modules, without being overwhelmingly big.
- * It comes with a **reasonable level of user and developer documentation**.
-* It is named `AddressBook Level 3` (`AB3` for short) because it was initially created as a part of a series of `AddressBook` projects (`Level 1`, `Level 2`, `Level 3` ...).
-* For the detailed documentation of this project, see the **[Address Book Product Website](https://se-education.org/addressbook-level3)**.
-* This project is a **part of the se-education.org** initiative. If you would like to contribute code to this project, see [se-education.org](https://se-education.org#https://se-education.org/#contributing) for more info.
+[![CI Status](https://github.com/se-edu/addressbook-level3/workflows/Java%20CI/badge.svg)](https://github.com/AY2324S1-CS2103T-W09-4/tp/actions)
+
+# JABPro
+![ui image](https://raw.githubusercontent.com/ScarletBlanks/tp/master/docs/images/Ui.png)
+
+# Table of Contents
+
+## Features
+
+Search Job Applicants
+
+Add Contact Information
+
+Add Optional Comments
+
+List All Candidate Information
+
+Delete an Entry
+
+Set Applicant Status
+
+Add GitHub/LinkedIn Username for a Candidate
+
+Open User LinkedIn or Github Account
+
+### Applicant Management
+
+JABPro allows you to efficiently search and manage job applicants based on various criteria. You can search for applicants by name, email, phone number, and status. Additionally, you can combine multiple search categories to narrow down your results.
+
+### Command Types
+
+Search Job Applicants : Use Search categories to narrow down results
+
+Add Contact Information : You can add contact information for job applicants, including their name, email, and phone number. This feature helps you keep track of applicant details.
+
+Add Optional Comments : allows you to add optional comments or notes to a candidate's profile. These comments can be tagged with the candidate's details and provide additional information or insights about the applicant.
+
+List All Candidate Information : You can retrieve a comprehensive list of all job applicants and their relevant information, such as name, email, and phone number. This feature makes it easy to review and manage candidate profiles.
+
+Delete an Entry : If needed, you can remove a candidate's profile from the system. This feature helps you maintain an up-to-date database of applicants
+
+Set Applicant Status : You can set the application status for each candidate, including options like "Preliminary," "Interviewed," "Rejected," and "Offered." This feature helps you track the progress of each applicant.
+
+Add Github/LinkedIn Username for a Candidate : JASMS allows you to add the candidate's social profile usernames (Github or LinkedIn) to their existing contact details. This feature helps you link to their online profiles for further evaluation.
+
+Open User LinkedIn or Github Account : You can quickly access a candidate's LinkedIn or Github profile directly from JABPro. This feature provides easy access to additional information about the applicant.
+
+Visit our website for more details!
+(https://github.com/AY2324S1-CS2103T-W09-4/tp)
+
+This project is based on the AddressBook-Level3 project created by the [SE-EDU initiative](https://se-education.org).
+
diff --git a/build.gradle b/build.gradle
index a2951cc709e..7de5c0c99b1 100644
--- a/build.gradle
+++ b/build.gradle
@@ -65,8 +65,12 @@ dependencies {
testRuntimeOnly group: 'org.junit.jupiter', name: 'junit-jupiter-engine', version: jUnitVersion
}
+run {
+ enableAssertions = true
+}
+
shadowJar {
- archiveFileName = 'addressbook.jar'
+ archiveFileName = 'jabpro.jar'
}
defaultTasks 'clean', 'test'
diff --git a/docs/.gitignore b/docs/.gitignore
new file mode 100644
index 00000000000..1748e487fbd
--- /dev/null
+++ b/docs/.gitignore
@@ -0,0 +1,23 @@
+# Logs
+logs
+*.log
+npm-debug.log*
+yarn-debug.log*
+yarn-error.log*
+lerna-debug.log*
+_markbind/logs/
+
+# Dependency directories
+node_modules/
+
+# Production build files (change if you output the build to a different directory)
+_site/
+
+# Env
+.env
+.env.local
+
+# IDE configs
+.vscode/
+.idea/*
+*.iml
diff --git a/docs/AboutUs.md b/docs/AboutUs.md
index 1c9514e966a..d15a4be6f97 100644
--- a/docs/AboutUs.md
+++ b/docs/AboutUs.md
@@ -1,59 +1,70 @@
---
-layout: page
-title: About Us
+ layout: default.md
+ title: "About Us"
---
+# 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 at the email `e0958427[at]comp.nus.edu.sg`
## Project team
-### John Doe
+### Sean Koh Hak Guan
+
+
-
+[[github](https://github.com/sk2001git)]
+[[portfolio](team/sk2001git.md)]
-[[homepage](http://www.comp.nus.edu.sg/~damithch)]
-[[github](https://github.com/johndoe)]
-[[portfolio](team/johndoe.md)]
+* Role: Developer
+* Responsibilities: Deliverables & Deadlines, Integration
+* In charge of: Storage
-* Role: Project Advisor
-### Jane Doe
+### Ariella Thirza Callista
-
-[[github](http://github.com/johndoe)]
-[[portfolio](team/johndoe.md)]
+
+
+[[github](http://github.com/AriellaCallista)]
+[[portfolio](team/ariellacallista.md)]
* Role: Team Lead
-* Responsibilities: UI
+* Responsibilities: Documentation
+* In charge of: Model, UI
-### Johnny Doe
+### Misra Aditya
-
+
-[[github](http://github.com/johndoe)] [[portfolio](team/johndoe.md)]
+[[github](http://github.com/MadLamprey)]
+[[portfolio](team/madlamprey.md)]
* Role: Developer
-* Responsibilities: Data
+* Responsibilities: Testing
+* In charge of: Test cases and coverage
+
-### Jean Doe
+### Catherine Liang
-
+
-[[github](http://github.com/johndoe)]
-[[portfolio](team/johndoe.md)]
+[[github](http://github.com/ketweeen)]
+[[portfolio](team/ketweeen.md)]
* Role: Developer
-* Responsibilities: Dev Ops + Threading
+* Responsibilities: Scheduling and tracking
+* In charge of: Commons
-### James Doe
+### Goh Peng Tat
-
+
-[[github](http://github.com/johndoe)]
-[[portfolio](team/johndoe.md)]
+[[github](http://github.com/ScarletBlanks)]
+[[portfolio](team/scarletblanks.md)]
* Role: Developer
-* Responsibilities: UI
+* Responsibilities: Code Quality
+* In charge of: Logic
diff --git a/docs/Configuration.md b/docs/Configuration.md
index 13cf0faea16..32f6255f3b9 100644
--- a/docs/Configuration.md
+++ b/docs/Configuration.md
@@ -1,6 +1,8 @@
---
-layout: page
-title: Configuration guide
+ layout: default.md
+ title: "Configuration guide"
---
+# Configuration guide
+
Certain properties of the application can be controlled (e.g user preferences file location, logging level) through the configuration file (default: `config.json`).
diff --git a/docs/DevOps.md b/docs/DevOps.md
index d2fd91a6001..8228c845e86 100644
--- a/docs/DevOps.md
+++ b/docs/DevOps.md
@@ -1,12 +1,15 @@
---
-layout: page
-title: DevOps guide
+ layout: default.md
+ title: "DevOps guide"
+ pageNav: 3
---
-* Table of Contents
-{:toc}
+# DevOps guide
---------------------------------------------------------------------------------------------------------------------
+
+
+
+
## Build automation
diff --git a/docs/DeveloperGuide.md b/docs/DeveloperGuide.md
index 8a861859bfd..e01c4a19a60 100644
--- a/docs/DeveloperGuide.md
+++ b/docs/DeveloperGuide.md
@@ -1,15 +1,20 @@
---
-layout: page
-title: Developer Guide
+ layout: default.md
+ title: "Developer Guide"
+ pageNav: 3
---
-* Table of Contents
-{:toc}
+
+# JABPro Developer Guide
+
+
+
--------------------------------------------------------------------------------------------------------------------
## **Acknowledgements**
-* {list here sources of all reused/adapted ideas, code, documentation, and third-party libraries -- include links to the original source as well}
+This is based on the AddressBook-Level3 project created by the [SE-EDU initiative](https://se-education.org).
+
--------------------------------------------------------------------------------------------------------------------
@@ -21,14 +26,9 @@ Refer to the guide [_Setting up and getting started_](SettingUp.md).
## **Design**
-
-
-:bulb: **Tip:** The `.puml` files used to create diagrams in this document `docs/diagrams` folder. Refer to the [_PlantUML Tutorial_ at se-edu/guides](https://se-education.org/guides/tutorials/plantUml.html) to learn how to create and edit diagrams.
-
-
### Architecture
-
+
The ***Architecture Diagram*** given above explains the high-level design of the App.
@@ -53,7 +53,7 @@ The bulk of the app's work is done by the following four components:
The *Sequence Diagram* below shows how the components interact with each other for the scenario where the user issues the command `delete 1`.
-
+
Each of the four main components (also shown in the diagram above),
@@ -62,7 +62,7 @@ Each of the four main components (also shown in the diagram above),
For example, the `Logic` component defines its API in the `Logic.java` interface and implements its functionality using the `LogicManager.java` class which follows the `Logic` interface. Other components interact with a given component through its interface rather than the concrete class (reason: to prevent outside component's being coupled to the implementation of a component), as illustrated in the (partial) class diagram below.
-
+
The sections below give more details of each component.
@@ -70,10 +70,9 @@ The sections below give more details of each component.
The **API** of this component is specified in [`Ui.java`](https://github.com/se-edu/addressbook-level3/tree/master/src/main/java/seedu/address/ui/Ui.java)
-![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`, `PersonInformationPanel`, `SummaryStatisticScreen` 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,
@@ -89,14 +88,16 @@ The `UI` component,
Here's a (partial) class diagram of the `Logic` component:
-
+
-The sequence diagram below illustrates the interactions within the `Logic` component, taking `execute("delete 1")` API call as an example.
+The sequence diagram below illustrates the interactions within the `Logic` component, taking `execute("delete st/interviewed t/developer")` API call as an example.
-![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.
-
+
+
+**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.
+
How the `Logic` component works:
@@ -107,7 +108,7 @@ How the `Logic` component works:
Here are the other classes in `Logic` (omitted from the class diagram above) that are used for parsing a user command:
-
+
How the parsing works:
* When called upon to parse a user command, the `AddressBookParser` class creates an `XYZCommandParser` (`XYZ` is a placeholder for the specific command name e.g., `AddCommandParser`) which uses the other classes shown above to parse the user command and create a `XYZCommand` object (e.g., `AddCommand`) which the `AddressBookParser` returns back as a `Command` object.
@@ -116,32 +117,36 @@ How the parsing works:
### Model component
**API** : [`Model.java`](https://github.com/se-edu/addressbook-level3/tree/master/src/main/java/seedu/address/model/Model.java)
-
+
The `Model` component,
* stores the address book data i.e., all `Person` objects (which are contained in a `UniquePersonList` object).
+* stores the event book data i.e., all `Event` objects (which are contained in a `UniqueEventList`)
* 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 the currently 'selected' `Event` objects as a separate _filtered_ list which is exposed to outsiders as an unmodifiable `ObservableList`
* 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.
+
+
+**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
**API** : [`Storage.java`](https://github.com/se-edu/addressbook-level3/tree/master/src/main/java/seedu/address/storage/Storage.java)
-
+
The `Storage` component,
-* can save both address book data and user preference data in JSON format, and read them back into corresponding objects.
-* inherits from both `AddressBookStorage` and `UserPrefStorage`, which means it can be treated as either one (if only the functionality of only one is needed).
+* can save address book data, event book data and user preference data in JSON format, and read them back into corresponding objects.
+* inherits from `AddressBookStorage`, `EventBookStorage` and `UserPrefStorage`, which means it can be treated as either one (if only the functionality of only one is needed).
* depends on some classes in the `Model` component (because the `Storage` component's job is to save/retrieve objects that belong to the `Model`)
### Common classes
@@ -154,89 +159,411 @@ Classes used by multiple components are in the `seedu.addressbook.commons` packa
This section describes some noteworthy details on how certain features are implemented.
-### \[Proposed\] Undo/redo feature
+### LinkedIn/Github feature
+
+#### Implementation
+
+The LinkedIn/Github feature consists of two parts - adding the linkedin/github username to the candidate's data, and viewing the profile.
+
+The addition is performed by the `AddLCommand` and `AddGCommand` classes. They extend `Command` and override the `execute()` method to add the username to the candidate's existing details.
+
+It involves the command `AddLCommand` and `AddGCommand` classes, and their corresponding parsers `AddLCommandParser` and `AddGCommandParser`, that take in user input and return either `AddLCommand` or `AddGCommand` objects.
+
+When executed, `AddLCommand` and `AddGCommand` find the person at the specified index in the list, and adds either their linkedin or github username to the `LinkedIn` or `Github` class associated with that `Person`. The list is then updated, and a `CommandResult` object is returned.
+
+The viewing is performed by the `LinkedInCommand` and `GithubCommand` classes. They extend `Command` and override the `execute()` method to redirect the user to the candidate's LinkedIn or Github profile on the browser.
+
+It involves the command `LinkedInCommand` and `GithubCommand` classes, and their corresponding parsers `LinkedInCommandParser` and `GithubCommandParser`, that take in user input and return either `LinkedInCommand` or `GithubCommand` objects.
+
+When executed, `LinkedInCommand` and `GithubCommand` append the username of the person to the base URLs for LinkedIn and Github, and open the URL in the browser.
+
+
+
+Given below is an example usage scenario and how the linkedin and github feature behaves at each step.
+
+**Step 1.** The user launches the application. `JABPro` will be initialized with the current saved state
+
+User should see the UI as shown below.
+
+![Ui](images/Ui.png)
+
+**Step 2.** The user wants to add the LinkedIn username to the first person in the list. The user enters the command `addL 1 u/alexyeoh` to add the username to the candidate's existing details.
+
+The following sequence diagram shows how the AddL and AddG operations work:
+
+
+
+
+
+User should see the UI as shown below after entering `addL 1 u/alexyeoh`
+
+![AddL](images/addLState.png)
+
+**Step 3.** The user can then view the linkedin profile for the candidate at index 1. The user enters the command `linkedin 1`.
+
+User should see the UI asa shown below after entering `linkedin 1`
+
+![LinkedIn](images/linkedinState.png)
+
+The following activity diagram shows how the `addL/addG` commands and `linkedin/github` commands are used together to bring together the `Linked/Github` feature:
+
+
+
+#### Alternatives considered ####
+
+Alternative 1 (Chosen):
+
+`LinkedIn` and `Github` are attributes of a `Person` that can be added using the `AddLCommand` and `AddGCommand` and are initially provided with default string values when a Person is initialised.
+
+Pros: There may be candidates who do not provide their LinkedIn or Github profiles as part of their application.
+
+Cons: Person is always initialised with empty values for LinkedIn and Github, and those values would have to be manually set using the commands.
+
+Alternative 2:
+
+`LinkedIn` and `Github`, like all other attributes of `Person`, are required to be non null.
+
+Pros: These details will be provided at the time of addition of a new Person, without having to add them later separately.
+
+Cons: It limits the scope for candidates that do not possess a LinkedIn or Github account.
+
+Alternative 3:
+
+`LinkedIn` and `Github` are attributes of `Person` but are allowed to be null.
+
+Pros: This accounts for candidates that do not have those social profiles, and allows for their addition at the time of Person creation
+
+Cons: With defensive programming in mind, not the best approach having to deal with null values.
+
+
+### View feature
+
+#### Implementation
+
+The view feature is implemented using the `ViewCommand` class. It extends `Command` and overrides the `execute()` method to display the person's details in full in a new window.
+
+Like every other command class, it involves a command `ViewCommand` class and a parser `ViewCommandParser`. `ViewCommand Parser` takes in the user input and returns a `ViewCommand` object.
+
+When executed, `ViewCommand` saves the index of the person to be viewed as `LastViewedPersonIndex` in the `Model` and returns a `CommandResult` object with `isView` property being true.
+
+By having a `isView` property in `CommandResult`, the `MainWindow` component is able to toggle the `UI` to the view the person of the `LastViewedPersonIndex` after the command has been executed.
+
+Additionally by allowing `isView` as a property in `CommandResult`, we are able to view the person's profile after executing other commands such as `add`, `edit`, `set`, `remark`, `addL`, `addG` without having to enter the `view` command again.
+
+We only need to set the `isView` property to true in the `CommandResult` object if the command being executed targets a person. This is because the `ViewCommand` itself originally require an index to be specified to view the person's profile. Thus, if the command does not target a person, the view command will not be triggered and the Person Information Panel and Summary Statistic Screen will not be updated.
+
+Given below is an example usage scenario and how the view feature behaves at each step.
+
+Step 1. The user launches the application. The `AddressBook` will be initialized with the current saved address book state
+
+User should see the UI as shown below.
+
+![Ui](images/Ui.png)
+
+Step 2. The user wants to see the full information displayed for the first person in the displayed list. The user enters the command `view 1` to view the first person in the list.
+
+The following sequence diagram shows how the view operation works:
+
+
+
+
+
+**Note:** The lifeline for `ViewCommand` and `ViewCommandParser` should end at the destroy marker (X) but due to a limitation of PlantUML, the lifeline reaches the end of diagram.
+
+
+User should see the UI as shown below after entering `view 1` (The command shown in Command Box is re-inputted for the sake of clarity. After entering the command, command should be cleared)
+![View](images/viewState.png)
+
+Step 3. The user can then read or process the information stored for the viewed person.
+
+
+
+**Note:** The view command can be most effectively used with `search` and `list`. Since the view index is dependent on the Index on the filtered list shown, the user can view the profile after filtering for specific properties in a person using `search` and sorting them using `list`.
+
+
+
+Alternatives considered
+
+Alternative 1 (Chosen):
+The view feature is implemented using the `ViewCommand` class. It extends `Command` and overrides the `execute()` method to display the person's details in full in a new window.
+
+Pros: Follows the Software Design Patterns of Command. This is the same pattern used for all other commands thus creating consistency.
+
+Cons: Tougher to implement since other commands do not have the ability to trigger the `ViewCommand` in their execution. That is we specifically need to set the isView property to true if we want the `ViewCommand` to occur simultaneously with another command.
+
+Alternative 2 (Not Chosen):
+The view feature is implemented using the `ViewCommand` class. It extends `Command` and overrides the `execute()` method to display the person's details in full in a new window.
+Commands that involved viewing will extend `ViewCommand` instead of the `Command` class. All of them are returned as `ViewCommand` to ensure toggling of the UI after command is executed.
+
+Pros: Arguably a more OOP approach since all commands that trigger view IS-A `ViewCommand`.
+
+Cons: You cannot implement any command that does not involve viewing but inherits from any command that is a children of `ViewCommand`.
+An example could be trying to create identical commands that does not toggle the UI after execution. This would require duplication of the exact same command code but inheriting from `Command` instead of `ViewCommand`.
+
+
+
+The following activity diagram shows how command such as `add`, `edit`, `set`, `remark`, `addL`, `addG` (Commands that trigger view) lead to the update of the Person Information Panel in the UI.
+This is done by setting the `isView` property to true in the `CommandResult` object.
+
+
+
+### Create feature
+
+#### Implementation
+
+The `create` feature is implemented using the `CreateTagCommand` class. It extends `Command` and overrides the `execute()` method
+to create tags of specific categories.
+
+To initiate the creation of tags, users utilize the create command with the following format: `create t/CATEGORY TAGNAME`. Each `/t` prefix denotes the start of a new tag definition. If users intend to create multiple tags, they can employ multiple `/t` prefixes in the command, such as `create t/CATEGORY1 TAGNAME t/CATEGORY2 TAGNAME`.
+
+Parsing of the create command's tag parameters is handled by the `parse` method in the `CreateTagCommandParser` class. This method receives a string containing user input and separates it into individual tags based on the /t prefix. The resulting tags are then passed as an array of tag category and name pairs to the constructor of the CreateTagsCommand class.
+
+Finally, the `execute()` method of the `CreateTagCommand` creates a `Tag` object for each element in the array of tag category and name pairs. These newly created tags are then added to the model.
+
+The following activity diagram summarize what happens when a user attempts to execute the `create` command.
+
+
+
+### Search feature
+
+#### Implementation
+
+The `search` feature is implemented using the `FindCommand` class. It extends `Command` and overrides the `execute()` method to
+filter users by the specified parameters.
+
+The search parameters from the user input are parsed using the parse method in the `FindCommandParser` class. `FindCommandParser::Parse`
+takes in the search parameters from the user input and combines them into a list of predicates. This list of predicates is then
+passed as an argument to the `FindCommand` constructor and the method returns a `FindCommand` instance with the associated list of predicates.
+
+Currently, the search parameters could belong to any of the three following categories: `Name`, `Status`, and `Tag`. Prefixes
+`n/`, `st/` and `t/` are used to denote the category of the search parameters respectively. E.g. `search n/alex st/interviewed t/swe`
+
+The list of predicates is a list comprising predicate objects whose classes implement the `Predicate` class in Java.
+Each category has its own predicate class i.e. `NameContainsKeywordPredicate`, `StatusContainsKeywordPredicate`, `TagContainsKeywordPredicate`
+and each class overrides the `test` method which returns true if the persons list contains any of the given names/status/tags.
+
+Finally, the execute method in `FindCommand` class invokes the `updateFilteredPersonList(predicatesList)` which will
+update the list of persons displayed.
+
+Given below is an example usage scenario and how the search mechanism behaves at each step.
+
+Step 1. The user launches the application.
+
+Step 2. The user executes `search t/intern` command to filter candidates whose status are offered.
+
+The following sequence diagram shows how the search operation works:
+
+
+**Note:**
+* The lifeline for `FindCommand` and `FindCommandParser` should end at the destroy marker (X) but due to a limitation of PlantUML, the lifeline reaches the end of diagram.
+* The `parse` method of `FindCommandParsers` also creates objects of the `NameContainsKeywordPredicate`, `StatusContainsKeywordPredicate` and `TagContainsKeywordPredicate` but these
+ were instantiations not included in the sequence diagram below for the sake of brevity. However, do note that the `n`, `s`, `t` arguments in `getPredicatesList(n, s, t)` in the sequence
+ diagram below refer to instances of `NameContainsKeywordPredicate`, `StatusContainstKeywordPredicate` and `TagContainsKeywordPredicate` respectively.
+
+
+
+
+Step 3. The user should see the UI below upon entering `search t/intern`.
+
+![Search](images/search-dg.png)
+
+The following activity diagram shows summarizes what happens when a user attempts to execute the `search` command.
+
+
+
+
+
+**Note:** The current implementation of search allows users to search by any of the categories individually or by different combinations of the categories e.g. `search n/alex bernice st/offered t/intern`
+It also allows users to specify more than one search parameter for each category e.g. `search n/alex bernice`
+
+
+
+### Delete feature
+
+#### Implementation
+
+The delete feature is implemented using the `DeleteCommand` class. It extends `Command` and overrides the `execute()` method to
+filter users by the specified parameters.
+
+The delete parameters from the user input are parsed using the parse method in the `DeleteCommandParser` class. `DeleteCommandParser::Parse`
+takes in the search parameters from the user input and, depending on the input, either leave it as a number (for delete by index) or combines them into a list of predicates
+(for delete tags & status).
+
+The `DeleteCommand` constructor can take either a positive integer number (for delete by index) or a list of predicates (for delete by tags & status) and both constructor
+will always return a `DeleteCommand` instance with a number and a list of predicates.
+For delete by index, the constructor will return a `DeleteCommand` instance with the associated input number and an empty list of predicates.
+For delete by tags & status, the constructor will return a `DeleteCommand` instance with a default index and the associated list of predicates.
+
+Currently, the delete parameters for delete by tags & status could only belong to either `Tag` or `Status`.
+Prefixes `t/` and `st/` are used to denote the category of the delete parameters respectively. E.g. `delete st/interviewed t/developer`
+
+The list of predicates is a list comprising predicate objects whose classes implement the `Predicate` class in Java.
+Each category has its own predicate class i.e. `TagContainsKeywordPredicate`, `StatusContainsKeywordPredicate`,
+and each class overrides the `test` method which returns true if the persons list contains any of the given tags/status.
+
+Finally, the execute method in `DeleteCommand` class retrieves a person or a list of persons to delete and
+invokes the `deletePerson(personToDelete)` method from the Model class that deletes the associated person(s).
+Additionally, it also retrieves a list of events associated with the person(s) to delete and
+invokes the `deleteEvent(eventToDelete)` method from the Model class that deletes the event(s) associated with the deleted person(s).
+
+Given below is an example usage scenario and how the search mechanism behaves at each step.
+
+Step 1. The user launches the application.
+
+Step 2. The user executes `delete st/interviewed t/developer` command to delete applicants that has been interviewed and tagged as swe.
+
+The following sequence diagram shows how the search operation works:
-#### 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:
+**Note:** The lifeline for `DeleteCommand` and `DeleteCommandParser` should end at the destroy marker (X) but due to a limitation of PlantUML, the lifeline reaches the end of diagram.
-* `VersionedAddressBook#commit()` — Saves the current address book state in its history.
-* `VersionedAddressBook#undo()` — Restores the previous address book state from its history.
-* `VersionedAddressBook#redo()` — Restores a previously undone address book state from its history.
+
-These operations are exposed in the `Model` interface as `Model#commitAddressBook()`, `Model#undoAddressBook()` and `Model#redoAddressBook()` respectively.
+
-Given below is an example usage scenario and how the undo/redo mechanism behaves at each step.
+Step 3. Assuming Bernice is the applicant matching the requirements, the user should see the UI below upon entering `delete st/interviewed t/developer`.
-Step 1. The user launches the application for the first time. The `VersionedAddressBook` will be initialized with the initial address book state, and the `currentStatePointer` pointing to that single address book state.
+![View](images/delete.png)
-![UndoRedoState0](images/UndoRedoState0.png)
+The following activity diagram shows summarizes what happens when a user attempts to execute the `delete` command.
-Step 2. The user executes `delete 5` command to delete the 5th person in the address book. The `delete` command calls `Model#commitAddressBook()`, causing the modified state of the address book after the `delete 5` command executes to be saved in the `addressBookStateList`, and the `currentStatePointer` is shifted to the newly inserted address book state.
+
-![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`.
+**Note:** The current implementation of delete by tags & status allows users to search by any of the categories individually or by different combinations of the categories.
+It also allows users to specify more than one delete parameter for each category e.g. `delete t/intern manager`
+
-![UndoRedoState2](images/UndoRedoState2.png)
+### Set feature
-
:information_source: **Note:** If a command fails its execution, it will not call `Model#commitAddressBook()`, so the address book state will not be saved into the `addressBookStateList`.
+#### Implementation
-
+The set feature is implemented using the `SetCommand` class. It extends `Command` and overrides the `execute()` method to
+edit the status of the user.
-Step 4. The user now decides that adding the person was a mistake, and decides to undo that action by executing the `undo` command. The `undo` command will call `Model#undoAddressBook()`, which will shift the `currentStatePointer` once to the left, pointing it to the previous address book state, and restores the address book to that state.
+The set parameters from the user input are parsed using the parse method in the `SetCommandParser` class. `SetCommandParser::Parse`
+takes in the set parameters from the user input and combines them into a list of predicates. This list of predicates is then
+passed as an argument to the `SetCommand` constructor and the method returns a `SetCommand` instance with the associated list of predicates.
-![UndoRedoState3](images/UndoRedoState3.png)
+Currently, the parameters are , is limited to "Preliminary", "Interviewed", "Rejected", "Accepted".
-
:information_source: **Note:** If the `currentStatePointer` is at index 0, pointing to the initial AddressBook state, then there are no previous AddressBook states to restore. The `undo` command uses `Model#canUndoAddressBook()` to check if this is the case. If so, it will return an error to the user rather
-than attempting to perform the undo.
+Finally, the execute method in `SetCommand` class returns a new updated `Person` which will
+be used to update the status of the Person displayed.
-
+Given below is an example usage scenario and how the set mechanism behaves at each step.
-The following sequence diagram shows how the undo operation works:
+Step 1. The user launches the application.
-![UndoSequenceDiagram](images/UndoSequenceDiagram.png)
+Step 2. The user executes `set 1 Interviewed` command to set the first user to "Interviewed".
-
:information_source: **Note:** The lifeline for `UndoCommand` should end at the destroy marker (X) but due to a limitation of PlantUML, the lifeline reaches the end of diagram.
+Step 3. The user should see the update upon calling the `view` command on the Person again. In this case, `view 1`
-
+The following activity diagram shows how the set operation works:
-The `redo` command does the opposite — it calls `Model#redoAddressBook()`, which shifts the `currentStatePointer` once to the right, pointing to the previously undone state, and restores the address book to that state.
+
-
:information_source: **Note:** If the `currentStatePointer` is at index `addressBookStateList.size() - 1`, pointing to the latest address book state, then there are no undone AddressBook states to restore. The `redo` command uses `Model#canRedoAddressBook()` to check if this is the case. If so, it will return an error to the user rather than attempting to perform the redo.
+### Export feature
-
+#### Implementation
-Step 5. The user then decides to execute the command `list`. Commands that do not modify the address book, such as `list`, will usually not call `Model#commitAddressBook()`, `Model#undoAddressBook()` or `Model#redoAddressBook()`. Thus, the `addressBookStateList` remains unchanged.
+The export feature is implemented using the `ExportCommand` class. It extends `Command` and overrides the `execute()` method to
+export to a csv file.
-![UndoRedoState4](images/UndoRedoState4.png)
+The export parameters from the user input are parsed using the parse method in the `ExportCommandParser` class. `ExportCommandParser::Parse`
+takes in the export parameters from the user input and combines them into a list of predicates.
+However, export does not need to be used with any parameters.
-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.
+Finally, the execute method in `ExportCommand` class exports to the /data/export.csv file and returns a `CommandResult` that
+indicates success or failure.
-![UndoRedoState5](images/UndoRedoState5.png)
+Given below is an example usage scenario and how the export mechanism behaves at each step.
-The following activity diagram summarizes what happens when a user executes a new command:
+Step 1. The user launches the application.
-
+Step 2. The user executes `export` command.
-#### Design considerations:
+Step 3. The user should see the exported .csv file in the directory /data/export.csv.
-**Aspect: How undo & redo executes:**
+The following activity diagram shows how the export operation works:
-* **Alternative 1 (current choice):** Saves the entire address book.
- * 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.
+## Events feature
-_{more aspects and alternatives to be added}_
+#### Implementation
-### \[Proposed\] Data archiving
+The Events feature extends the original ideas of the `AddressBook` to store two types of entities - Candidates and Events associated with candidates.
-_{Explain here how the data archiving feature will be implemented}_
+It consists of two parts - adding the events to JABPro, and viewing the events.
+
+THe addition is performed by the `EventCommand` class. It extends `Command` and overrides the `execute()` method to add the event to JABPro.
+
+It involves the `EventCommand` class and its corresponding parser, `EventCommandParser`, that takes in the user input and returns an `EventCommand` object.
+
+When executed, `EventCommand` finds the person the event is associated with, and adds the name of the person, and other details such as description and start and end time, as input by the user. The existing `EventBook` is then updated to reflect this addition, and a `CommandResult` object is returned.
+
+The viewing is performed by the `ScheduleCommand`. It extends `Command` and overrides the `execute()` method to open the `Events Window` and display the events.
+
+
+
+**Note:** There is another way of viewing events, that is through the `Events` tab. Refer to the [UserGuide](UserGuide.md#viewing-events-schedule) for more information.
+
+
+
+
+Given below is an example usage scenario highlighting how the `Events` feature behaves at each step.
+
+**Step 1.** The user launches the application. The `EventBook` will be initialized with the current saved event book state.
+
+User should see the UI as shown below.
+
+![Ui](images/Ui.png)
+
+**Step 2.** The user wishes to add an "Interview" event for the first candidate in the list. The user enters the following command:
+
+`event 1 d/Interview bt/2023-11-12 10:00 et/2023-11-12 12:00`
+
+This command adds a new event to the `EventBook` that is associated with the first person in the list, with the description as "Interview" and the start and end time as specified.
+
+
+
+**Note:** The start and end times are required to follow a specific format. Refer to the [UserGuide](UserGuide.md#adding-an-event-event) for more information.
+
+
+
+The following sequence diagram shows how the `Event` operation works:
+
+
+
+User should see the UI as shown below after executing the aforementioned command [It is assumed that the first candidate in the list is Alex Yeoh].
+
+
+
+The following activity diagram shows how the `event` and `schedule` command can be used together to schedule events:
+
+
+
+#### Alternatives considered ####
+
+***Duplicate Events***
+
+Alternative 1 (chosen):
+
+`Events` associated with the same `Person`, having the same description are allowed. It is upto the user to input more detailed descriptions to differentiate between them, and to promote readability.
+
+Pros: It makes the `EventBook` a complete product of the user's choice as no restrictions are imposed, and the user can enter data as per their preferences and their convenience.
+
+Cons: It might lead to confusion if multiple events of the same person, having the same description are added. Hence, it is recommended that the user enters detailed descriptions to distinguish events from one another.
+
+Alternative 2:
+
+`Events` associated with the same `Person`, having the same description are considered duplicate `Events` and hence, are rejected by the system.
+
+Pros: It prevents redundant data from being stored and accidental addition of multiple events of the same type for the same person
+
+Cons: It restricts users from entering data that might be understandable or convenient for them. [For example: If the user creates two Events with the description "Interview" for the same person, they might have a distinct idea of what each of those Events mean, but the system prevents them for making this addition].
--------------------------------------------------------------------------------------------------------------------
@@ -257,82 +584,447 @@ _{Explain here how the data archiving feature will be implemented}_
**Target user profile**:
-* has a need to manage a significant number of contacts
+* has a need to manage a significant number of candidates contacts
+* wants an organized way to keep track of candidates information
+* wants to view and manage candidates information in a single place
+* wants to filter and sort candidates based on their details
+* wants to view a schedule/summary of events relating to the candidates
+* wants to attach a score to candidate performance over interview and assessments
+* wants to be able to use scores in order to quantitatively compare candidates
* 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**:
+
+JABPro aims to solve the problem of HR managers having to sort through tons of job applications.
+
+It makes their life easier by allowing them to easily fetch important info about job applicants such as their contact details, application status etc. In addition,
+JABPro also provides them with the ability to quickly fetch summary stats to get an insight on the overall performance of applicants in their interviews. Lastly, JABPro also
+has a built-in event management app that allows them to efficiently note down interview schedules with applicants.
### 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… |
+|----------|----------------|------------------------------------------------------------------------------------------------------------------|--------------------------------------------------------------------------------------------------------------------------------------------|
+| `* * *` | Hiring Manager | add a candidate's contact information, including name, email, phone number | I can easily access and reach out to candidates when needed |
+| `* * *` | Hiring Manager | add notes and comments to candidate profiles to document interview feedback and impressions | I can maintain a record of interactions and feedback |
+| `* * *` | Hiring Manager | delete job applicants information | I can remove redundant/unecessary data bloat and also to abide to privacy laws |
+| `* * *` | Hiring Manager | view a specific job applicant's resume or portfolio | I can check whether they meet the requirements requested by other department heads |
+| `* * *` | Hiring Manager | search for all job applicants matching a given profile | I can find suitable candidates for a project |
+| `* * *` | Hiring Manager | list all applicants information | I can easily get an overview of all of the applicants |
+| `* * *` | Hiring Manager | update the application status for a candidate (e.g. "Interviewed", "Rejected", "Offered") | I can keep track of each candidate's progress in the hiring process |
+| `* * *` | Hiring Manager | record the score of the different activities such as interviewsor assessments that an applicant might go through | I can use them for effective comparison and filter the candidates easily |
+| `* * *` | Hiring Manager | create tags and categorise them | I can colour code them based on categories and use them to tag applicants to easily distinguish them |
+| `* * *` | Hiring Manager | list all tags I have created | I can easily get an overview of all of the tags that I have made |
+| `* * *` | Hiring Manager | compare candidates using their performance in their assessments or interviews | I can choose the best candidates to move to the next stage of the hiring process and get the best performing candidates objectively |
+| `* * *` | Hiring Manager | add social profile (LinkedIn/Github) candidate's information and view with ease | I can get a more holistic view of the candidate's abilities |
+| `* *` | Hiring Manager | view a schedule/summary of events relating to the candidates | I can make preparations and arrangements for the events beforehand, and also get an idea of where each candidate is in the hiring process. |
+| `* *` | Hiring Manager | export candidate information and application data to a spreadsheet | I can perform further analysis using alternate tools on candidate data |
+| `*` | Hiring Manager | get data on which positions are lacking job applicants | I can update the external recruitment team to focus on head hunting applicants for these roles |
+| `*` | Hiring Manager | get data on which positions already have too many applicants | I can forward this to the department heads to see if they still want to keep the job posting or close it |
+
-*{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 `JABPro` and the **Actor** is the `hiring manager`, unless specified otherwise)
+
+**Use case: Add a person**
+
+**Guarantees**: The person is added to the list of persons. The person is also saved in the database.
+
+
+**MSS**
+1. User requests to add a person.
+2. JABPro shows that command has been executed successfully.
+3. JABPro adds the person to the list of persons.
+4. JABPro shows the person added at the end of the list of persons.
+Use case ends.
+
+**Extensions**
+* 1a. User does not provide the correct information for a person to be added.
+ * 1a1. JABPro shows an error message and provides course of action for remedy.
+ Use case resumes at step 1.
+* 1b. User has already been added to the list of persons.
+ * 1b1. JABPro shows an error message and provides course of action for remedy.
+ Use case resumes at step 1.
+
+**Use case: Add a remark to a person**
+
+**Guarantees**: The remark is added to the person. The remark is also saved in the database.
+
+**MSS**
+1. User requests to add a remark to a person.
+2. JABPro shows that command has been executed successfully.
+3. JABPro adds the remark to the person.
+Use case ends.
+
+**Extensions**
+* 1a. User provides invalid index.
+ * 1a1. JABPro shows an error message and provides course of action for remedy.
+ Use case resumes at step 1.
+* 1b. User does not provide a remark.
+ * 1b1. JABPro adds an empty remark to the person, remark no longer seen.
+ Use case ends.
+
+**Use case: List all persons**
+
+**MSS**
+1. User requests to view a list of all persons.
+2. JABPro retrieves the list of all persons from the database.
+3. JABPro displays the list of all persons to the user.
+4. If the user specifies an attribute to sort by, e.g., "s/name" for sorting by name, the application sorts the list accordingly. If no attribute is provided, the list remains unsorted.
+5. The sorted or unsorted list is displayed to the user in ascending order based on the specified attribute.
+Use case ends.
+
+**Extensions**
+* 1a. User provides an incorrect attribute for sorting (e.g., "list s/phone").
+ * 1a1. JABPro shows an error message and provides course of action for remedy.
+ Use case resumes at step 1.
+* 1b. User attempts to list persons when there are no entries in the address book.
+ * 1b1. JABPro shows a message indicating that there are no persons to display.
+ Use case ends.
+
+**Use case: Search persons matching the given profile**
+
+**MSS**
+1. User requests to search users matching the given profile as specified by the search parameters.
+2. JABPro requests details of the profile to be searched.
+3. User enters the profile details.
+4. JABPro retrieves the list of all persons from the database whose profiles match the given search parameters.
+5. JABPro displays the filtered list of persons to the user.
+Use case ends.
+
+**Extensions**
+
+* 3a. The given name/status/tag parameter is invalid.
+ * 3a1. JABPro shows an error message and provides course of action for remedy.
+ Use case resumes at step 3.
+* 5a. No person match the given profile.
+ * 5a1. JABPro shows a message indicating that there are no persons to display.
+ Use case ends.
**Use case: Delete a person**
**MSS**
+1. User requests to list persons.
+2. AddressBook shows a list of persons.
+3. User requests to delete a specific person in the list by providing either the person's index or tags.
+4. AddressBook deletes the specified person(s).
+Use case ends.
-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
+**Extensions**
+* 2a. The list is empty.
+ * 2a1. AddressBook displays a message indicating that the list is empty.
+ Use case ends.
+* 3a. The given index is invalid.
+ * 3a1. AddressBook shows an error message indicating that the specified index is invalid.
+ Use case resumes at step 3.
+* 3b. The given tags do not match any persons.
+ * 3b1. AddressBook shows an error message indicating that no persons with the specified tags were found.
+ Use case resumes at step 3
+* 4a. Deletion encounters an error
+ * 4a1. AddressBook displays an error message indicating that the deletion process failed.
+ Use case ends.
+**Use case: Set a person's status**
+
+**MSS**
+1. User requests to list persons.
+2. AddressBook shows a list of persons.
+3. User requests to set the status of a specific person in the list.
+4. AddressBook sets the status of that person in the list.
Use case ends.
**Extensions**
+* 2a. The list is empty.
+ * 2a1. AddressBook displays a message indicating that the list is empty.
+ Use case ends.
+* 3a. The given index is invalid.
+ * 3a1. AddressBook shows an error message indicating that the specified index is invalid.
+ Use case resumes at step 3.
+* 3b. The given status is invalid.
+ * 3b1. AddressBook shows an error message indicating that the specified status is invalid.
+ Use case resumes at step 3.
+**Use case: View a person's details**
+
+**Guarantees**: Person's details are displayed in full in a new window.
+
+**MSS**
+1. User requests to list persons.
+2. JABPro shows a list of persons.
+3. User requests to view a specific person in the current displayed AddressBook.
+4. JABPro shows the details of that person.
+ Use case ends.
+
+**Extensions**
* 2a. The list is empty.
+ * 2a1. AddressBook displays a message indicating that the list is empty.
+ Use case ends.
+* 3a. The given index is invalid.
+ * 3a1. AddressBook shows an error message indicating that the specified index is invalid.
+ Use case resumes at step 3.
+
+* 3b. User decides to search for a person based on a criteria such as name.
+ * 3b1. Displayed AddressBook changes to match that of search result.
+ Use case resumes at step 3.
+
+**Use case: Using scores to compare and filter people**
+
+**Guarantees**: Persons are displayed has a score that exceed the specified threshold based on the metric and value provided for a tag.
+
+
+**MSS**
+1. User requests to list persons.
+2. JABPro shows a list of persons.
+3. User edits the scores of persons tying it to a tag
+4. User requests to filter persons by their scores for a particular tag based on a particular metric.
+5. JABPro shows a list of persons with scores.
+
+**Extensions**
+* 3a. The tag or score is invalid.
+ * 3a1. JABPro shows an error message indicating that the specified tag or score is invalid.
+ Use case resumes at step 3.
+* 4a. The parameters provided are invalid.
+ * 4a1. JABPro shows an error message indicating that the specified method is invalid.
+ Use case resumes at step 4.
+
+
+**Use case: Export the current data to excel**
+
+**MSS**
+1. User requests to export persons.
+2. JABPro exports the list of persons to a .csv file.
+ Use case ends.
+
+**Extensions**
+* 2a. The .csv file to edit is open
+ * 2a1. AddressBook displays a message indicating that we cannot write to it as it is open.
+ Use case ends.
+**Use case: Add social profile to person's details**
+
+**MSS**
+1. User requests to add social profile (linkedin or github).
+2. JABPro shows that command has been executed successfully.
+3. JABPro adds the social profile to the person's existing details in the list.
+ Use case ends.
+
+**Extensions**
+* 2a. User does not provide valid information for the person.
+ * 2a1. JABPro displays error message.
+ Use case resumes at Step 1.
+* 2b. User requests to add social profile other than LinkedIn or Github
+ * 2b1. JABPro displays error message.
+ Use case resumes at Step 1.
+
+**Use case: Open social profile for a person**
+
+**MSS**
+1. User requests to open social profile for a person.
+2. JABPro shows that command has been executed successfully.
+3. JABPro redirects to the webpage of the corresponding profile.
+ Use case ends.
+
+**Extension**
+* 1a. Person does not exist in the list.
+ * 1a1. JABPro displays error message.
+ Use case ends.
+* 1b. Social profile requested other than LinkedIn or Github.
+ * 1b1. JABPro displays error message.
+ Use case ends.
+* 3a. Person does not exist on the social platform.
Use case ends.
-* 3a. The given index is invalid.
+**Use case: Add events relating to candidates**
- * 3a1. AddressBook shows an error message.
+**MSS**
+1. User requests to add an event relating to a candidate.
+2. JABPro shows that command has been executed successfully.
+3. JABPro adds the event to the list of events.
+ Use case ends.
- Use case resumes at step 2.
+**Extension**
+* 2a. User does not provide the correct information for an event to be added.
+ * 2a1. JABPro shows an error message anf provides course of action for remedy. Use case resumes at step 1.
+* 2b. Event has already been added to the list of events.
+ * 2b1. JABPro shows an error message and provides course of action for remedy. Use case resumes at step 1.
-*{More to be added}*
+**Use case: Tag a candidate with a newly created tag**
+
+**MSS**
+1. User requests to create a tag of a specific category.
+2. JABPro adds the tag to the list of tags.
+3. JABPro shows a message indicating that the tag has been added successfully.
+4. User requests to view all persons.
+5. User requests to add the newly created tag to add tag to a person.
+6. JABPro adds tag to the person.
+ Use case ends.
+
+**Extension**
+* 1a. The given tag name is invalid
+ * 1a1. JABPro displays an error message
+* 1b. User did not provide the complete command (missing category or name). Use case resumes at step 1.
+ * 1b1. JABPro displays an error message and provides a course of action for remedy. Use case resumes at step 1
+* 2a. Tag already exists in JABPro
+ * 2b1. JABPro displays an error message saying tag already exists. Use case resumes at step 1.
+* 5a. Multiple tags exist with the same name in different categories
+ * 5a1. JABPro displays an error message and provides a course of action for remedy. Use case resumes at step 5.
### Non-Functional Requirements
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.
+2. Should be able to `hold up to 1000 persons` without a noticeable sluggishness in performance for typical usage.
+3. A user with above `average typing speed for regular English text` (i.e. not code, not system admin commands) should be able to accomplish most of the tasks faster using commands than using the mouse.
+4. System should respond within a `reasonable amount of time` (e.g. < 2 second) for typical usage (e.g. listing 1000 persons).
+5. Should not deal with `external database` or `network connections`.
+6. Product is expected to be used by a `single user` only.
+7. Product is `not expected to contain API` for other software to communicate with.
+8. Product is expected to be used in a system with at least 4GB RAM and `1GB free disk space`.
+9. Product Visuals should be `unambiguous` and clear to the user
+10. Commands should be `easy to remember` and `intuitive` to use
+11. Product should be `consistent` in its visuals and commands formatting
-*{More to be added}*
### Glossary
* **Mainstream OS**: Windows, Linux, Unix, OS-X
-* **Private contact detail**: A contact detail that is not meant to be shared with others
+* **Hiring Manager**: Inter-changable with users in this context
+* **Candidate**: Inter-changable with persons/applicants
+* **AddressBook**: Inter-changable with JABPro in this context since this is an evolve project built on-top of AB3 functionality
+* **Keyword**: Search parameter
--------------------------------------------------------------------------------------------------------------------
+## Appendix: Planned Enhancements
+
+### Improve on Delete feature: `delete`
+**Improve the delete feature**:
+Currently, JABPro only supports applicant related operations such as delete applicants by index, status and tags.
+However, it does not support deletion of specific events and tags. We would like to improve on this by expanding the `delete` feature
+functionality to also support deletion of specific events and tags. This makes it easier for users to delete events and tags, without
+having to manually edit the json file.
+
+### Improve on Clear feature: `clear`
+**Improve the clear feature**:
+Currently, `clear` will wipe out all applicants' data and events. However, it does not wipe out the tags created by the user
+which falls short of the user's expectations of what a `clear` command is supposed to do. Thus, we would like to enhance `clear`
+to also include the deletion of created tags.
+
+### Improve on Export feature: `export`
+**Improve the export feature**:
+Currently, `export` is limited to only exporting applicants' data and it does not support a function to export events.
+This feature will be implemented in future iterations.
+
+### Add and general uniqueness constraint: `add`
+**Improve what identifies as a unique person**:
+Currently, a person is uniquely identified by their name. This is not ideal as there may be multiple persons with the same name. We would like to improve this by using a unique identifier such as internal ID or NRIC number.
+This would allow us to have a more robust system that can handle multiple persons with the same name.
+
+### Improve on Edit feature: `edit`
+**Improve the edit feature**:
+Currently, it falls short of the user's expectations as it does not allow the user to add on to existing tags. We would like to improve this by creating a feature that allows the user to add on to existing tags.
+Thereby users can add on to existing tags without having to retype all the previous tags.
+
+### Improve on Summary Statistics
+**Improve the summary statistic implementation**:
+Currently, if the applicants do not have a good spread of scores, the summary statistics will not be very useful. We would like to improve on this by implementing a more robust summary statistics that can handle small sample sizes and outliers.
+Additionally, you can only use the summary statistic table for comparison after you have inputted most of the scores. At that point, it might be more relevant to use the filter feature instead. Thereby we hope to add more visualisations like graphs to the summary statistics table to make it more useful for comparison.
+
+### Improve on Filter feature: `filter`
+**Improve the filter feature**
+Currently, the filter feature might be too flexible for the user. That is it works on the displayed list and not across the board. We would like to improve on this by implementing a filter feature that works across the database.
+This makes it more intuitive and logical for the user to use since the user would expect the filter feature to work across the database and not just the displayed list.
+
+### Error Message for `filter` feature
+**Improve the error message for filter feature**
+Currently if you were use the filter feature with an invalid tag, that is a tag which does not have a alphanumeric name or is an `assessment` tag, it shows the error message: `Invalid tag provided. Needs to be non-empty name`.
+This is attained from a sample input like `filter t/Intern met/median` where `Intern` is a tag that is on applicant but does not have a `assessment` category. Error message should contain `Check that the tag contains an asssessment category, use create command if it does not`
+Additionally inputs like `filter t/Int@/a met/median` will also show the same error message. The current error message is too vague in nature, and should contain `Check that the tag name is not empty and is alphanumeric (a valid tag name) and does not contain space`.
+The error message should be split into two in order to not confuse the user about what is wrong with the tag.
+Therefore, the final output should have 1 error message for invalid tag names that are not alphanumeric or contains space and another error message for when the tag does not have an assessment category in `listT`.
+`
+
+### Improve on `remark` feature
+**Improve the remark feature**
+Currently, if you use multiple prefix , it is allowed and only the last prefix will be used. We would like to improve on this by only allowing 1 prefix to be used. Thus, we verify for duplicate `r/` prefix since it does not make sense to have multiple remarks for the same person.
+
+### Improve on `edit` feature
+**Improve on the edit feature**
+Currently, for tagging, once you add a tag to a person, it does not update when you add the tag categories to the same tag name using `create`.
+This is a feature flaw since a user would expect the tag to be updated and would not need to be re-tag again. We would like to improve on this by updating the tag when the tag category is updated.
+That is if you add an extra category to the tag name, the tag will be updated to include the tag category. Thus, a user would not need to re-tag the person again to update the tag category.
+
+
+## **Appendix: Effort**
+
+### ScoreList, Score, Summary Statistic, Filter
+In terms of integration of features, this was by far the biggest and most complex. This is due to how `Summary Statistic` relied on `Score`, `ScoreList` and `Tag` to function and Filter requiring all of them to function properly.
+The thought process came when we first tried to implement 1 score for each applicant. This was the naive approach. However, we realise that with only 1 score, would mean that it can only represent 1 thing.
+This means that the Hiring Manager would have to keep track of what each score means individually and any point in arranging these scores would lead to massive confusion. Hence, we decided to attach a score to a tag.
+However, this meant that with optional and possibly multiple tagging, we will need a flexible way of attaching scores to tags. This led to the HashMap implementation of `ScoreList`.
+Additionally, we had to decide on the constraint of scores. While a common approach was to let it be between 0 and 100, we wanted to maintain great flexibility and thus constraint it as a positive integer >= 0.
+
+For storage wise, we had to learn how to store `ScoreList` in a key-value format and also decode it. So that was one big challenge in terms of storing it in a json format that can be decoded.
+
+One of the biggest problem with using the `Parser` and `Command` model is that the `Parser` has no access to the model. So at the parsing stage, you are unable to determine if the tag exists or is valid since we only want to enable it for `assessment` tags.
+This meant that it had to be carried out at the `Command` stage of execution. Additionally, it might have been a misstep trying to implement the editing of scores in the `edit` command.
+This is due to the complexity of how the `edit` command was implemented. Since you could add a tag in edit while simultaneously trying to add a score to the tag, it led to a lot of need to check.
+Additionally since tags can be easily edited, it meant that we needed to check if the ScoreList was updated and if the tag was edited.
+This also led to many errors, since you could remove all tags, and the ScoreList would still remain. Especially since EditPersonDescriptor did not have access to the tags that the person currently have.
+Additionally, since tag was not cumulative, you would want to keep track of the scores of the current tag if they are being kept. This meant that you would need to keep track of the current tag and the current score while also allowing for changes.
+
+After that, there was the choice of implementing Summary Statistic. A lot of thought went into how we can make the scores useful. What would be a great visualisation. We chose the couple of simple statistic that we thought would be useful.
+However, the calculation of the statistic was not simple since we decided to use streams for implementation. This meant that misconception of how streams work would lead to a lot of errors. The most common 1 being that the stream is closed due to a close operation.
+Additionally, percentile was originally implemented incorrectly. This was because we did not account for the edge case of people scoring the same. This meant that the percentile would vary for same score. This was fixed by then subtracting the number of people with the same score from the total number of people.
+
+
+Following that we had filter which relied on all of the above. This was simpler to implement once all the logic was down.
+Overall, the implementation of the feature was complex due to nature of Streams and UI updates for JavaFX.
+
+### View
+UI generation was rather tedious in terms of using CSS and trying to get things to align properly. Additionally, the design implementation using `Commands` meant that commands did not have access to other commands during runtime.
+This meant that we had to add an extra parameter to the CommandResult in order to get commands to auto execute view after executing the command. The implementation was simple but the design was not.
+
+### Flexibility for further analysis
+We acknowledge that there will be some who would prefer to analyse data outside JABPro - and that is completely fine.
+With the ability to export to a .csv file using JABPro, users are empowered with the ability to conduct analysis in
+other applications that they are more familiar with.
+
+The introduction of the export command showcases our commitment towards user flexibility, and focus towards
+making JABPro a tool that adds towards hiring manager's ecosystem, as opposed to a trade-off that requires them
+to only rely on JABPro. We strongly believe that users should have the flexibility and ability to conduct
+further analysis outside JABPro if they wish to.
+
+
+### Storage Complications and Effort
+In relation to saving of data to storage, we largely followed the same format as AB3. The only strict deviation from the AB3 method of saving was using a different data structure.
+In the case of `ScoreList` and `UniqueTagList`, we used a hashmap to save the details of the score and tags for `ScoreList` or tag category and tag name for `Tags`. This was more complicated to implement as the conversion from hashmap to json and vice versa was more complicated than the conversion of a list to json and vice versa.
+
+### Redirection Implementation
+
+Adhering closely to our viewpoint of hiring managers, we realised that JABPro can only add value to their workflows if it goes above and beyond what existing low-level applications such as spreadsheets can provide. This helped us identify a key aspect of reviewing applications - the existence of a social profile linked with candidates.
+At the same time, we were bound by the limitations of what could and could not be implemented. For instance, the use of APIs or external libraries was prohibited.
+Hence, we stumbled upon the idea of implementing a feature that simply redirects the user to the social profile, without the need for any external libraries.
+
+We believe this highlights the scope of adaptation that AB3 provided, and we could recognise. There still existed the notion of allowing users to provide the link, which could subsequently be copied to view the social profile. However, in lieu of making JABPro user-friendly, we focused on building redirection.
+
## **Appendix: Instructions for manual testing**
Given below are instructions to test the app manually.
-
:information_source: **Note:** These instructions only provide a starting point for testers to work on;
+
+
+**Note:** These instructions only provide a starting point for testers to work on;
testers are expected to do more *exploratory* testing.
-
+
### Launch and shutdown
@@ -340,38 +1032,296 @@ testers are expected to do more *exploratory* testing.
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.
+ 2. 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
+2. Saving window preferences
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.
+ 2. 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
+### Adding a person while all persons are being shown
+1. Adding a person while all persons are being shown
1. Prerequisites: List all persons using the `list` command. Multiple persons in the list.
+
+ 2. Test case 1 (Positive Test Case):
+ `add n/John Poh p/98765432 e/johnpoe@gmail.com a/ 311, Clementi Ave 2, #02-25 r/ 2 years of experience in software development`
+
+ **Note**: The current AddressBook cannot contain anyone named `John Poh`
+ **Expected**: New person is added to the list. Details of the new person shown in the status message.
+
+ 3. Test case (Negative Test Case):
+ `add n/John Poh p/98765432 e/johnpoe@gmail.com a/ 311, Clementi Ave 2, #02-25 r/ 2 years of experience in software development`
+ **Note**: The current AddressBook should contain a person named `John Poh`
+ **Expected**: No person is added. Error details shown in the status message. List of persons remains the same.
- 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 … }_
+### Deleting a person
+1. Deleting a person while all persons are being shown
+ 1. Prerequisites:
+ 1. List all persons using the `list` command. Multiple persons in the list.
+ 2. Set one of the applicants' status in the sample data to `interviewed` by doing `set 1 interviewed`
+
+ 2. Test case: `delete st/interviewed`
+ **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.
+
+ 3. 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.
+
+ 4. Test case: `delete 0`
+ **Expected**: No person is deleted. Error details shown in the status message. Status bar remains the same.
+
+ 5. Other incorrect delete commands to try: `delete`, `delete x`, `...` (where x is larger than the list size)
+ **Expected**: Similar to previous.
+
+### Viewing a person's details while all persons are being shown
+1. Viewing a person's details while all persons are being shown
+ 1. Prerequisites: List all persons using the `list` command. Multiple persons in the list.
+
+ 2. Test case 1 (Positive Test Case):
+ `view 1`
+ **Expected**: Person information panel is updated to reflect the details of the person.
+
+ 3. Test case 2 (Negative Test Case):
+ `view 0`
+ **Expected**: No person is viewed. Error details shown in the status message. Person information panel remains the same.
+
+### Adding a remark to a person while all persons are being shown
+
+1. Adding a remark to a person while all persons are being shown
+ 1. Prerequisites: List all persons using the `list` command.
+
+ 2. Test case 1 (Positive Test Case):
+ `remark 1 r/John is a good candidate`
+ **Expected**: New remark is added to the person. Details of remark displayed on the person information panel.
+
+ 3. Test case 2 (Positive Test Case):
+ `remark 1 r/**REMARK** Furthermore, hes capable of working in a team`
+ **Expected**: Remark is added on from the previous existing remark. Person information panel is updated to reflect the addition of the remark.
+ Specifically `John is a good candidate` is followed by `Furthermore, hes capable of working in a team` on the person information panel.
+
+ 4. Test case 3 (Negative Test Case):
+ `remark 1 r/`
+ **Expected**: Previous remark is deleted. Person information panel is updated to reflect the deletion of the remark and is blank.
+
+ 5. Test case 4:
+ `remark 0 r/John is a good candidate`
+ **Expected**: No remark is added. Error details shown in the status message. Person information panel remains the same.
+
+### Searching for applicants matching a given profile
+
+1. Searching for applicants matching a given profile
+ 1. Prerequisites:
+ 1. Set one of the applicants' status in the sample data to `interviewed` by doing `set 1 interviewed`
+
+ 2. Test case 1:
+ `search n/alex bernice`
+ **Note**: JABPro does an `OR` search for each category meaning it will look for applicants whose names match any of the given names.
+ **Expected**: If you are using our sample data, you should see `Alex Yeoh` and `Bernice Yu` being listed.
+
+ 3. Test case 2:
+ `search st/interviewed rejected`
+ **Note**: JABPro does an `OR` search for each category meaning it will look for applicants whose status match any of the given status.
+ **Expected**: If you are using our sample data, you should see `Alex Yeoh` being displayed as he is the only applicant whose status is `interviewed`
+ (other applicants' status are `preliminary` by default).
+
+ 4. Test case 3:
+ `search t/intern developer`
+ **Note**: JABPro does an `OR` search for each category meaning it will look for applicants who have **any** of the given tags.
+ **Expected**: If you are using our sample data, you should see all the applicants listed since all of them
+ contain either of the given tags.
+
+ 5. Test case 4:
+ `search n/alex bernice st/interviewed rejected t/intern developer`
+ **Note**: JABPro does an `AND` search for multiple categories meaning it will look for applicants meaning it will look for applicants
+ whose name contains either alex or bernice `AND` status is either interviewed or rejected `AND` has any of the given tags.
+ **Expected**: If you are using our sample data, you should see `Alex Yeoh` being the only applicant listed as he is the only applicant matching
+ the given profile.
+
+ Some incorrect commands to try: `search`, `search n/`, `search t/`, `search st/`, `search n/@`, `search t/@`, `search st/accepted` (note this is incorrect because status has to be either: preliminary, interviewed, rejected or offered)
+ **Expected**: JABPro displays an error message along with a corrective action you can take to amend the command.
+
+### Creating tags
+
+1. Creating tags
+ 1. Prerequisites: nil
+
+ 2. Test case 1:
+ `create t/dept finance`
+ **Expected**: JABPro displays a message indicating the successful execution of command. You can also check that the tag
+ has been successfully created by using the `listT` command to view the newly created tag.
+
+ 3. Test case 2:
+ `create t/finance`
+ **Note**: The creation of tags **must** specify both the **tag category** and **tag name**.
+ **Expected**: JABPro displays an error message.
+
+ 4. Test case 3:
+ `create t/role analyst, role engineer`
+ **Note**: Creation of multiple tags is done through using multiple tag prefixes i.e. `create t/role analyst t/role engineer`
+ **Expected**: JABPro displays an error message.
+
+ 5. Test case 4:
+ `create t/role software developer`
+ **Note**:
+ * Tag names must **not** contain any spaces. Instead, we encourage users to use either `camelCase` or `PascalCase`. This was
+ done so that the tags would appear neater in the UI.
+ * Similarly, any other word keyed in after the tag name and without a proper prefix would prompt a similar behaviour.
+ * JABPro's default behaviour will create the first valid tag it sees.
+ **Expected**: JABPro displays a message indicating the successful creation of tags. Upon executing `listT` it will be evident that
+ the tag `software` would be created under the category `role`. Any word that comes after this and not enclosed in a `/t` prefix
+ is ignored.
+
+ Some other incorrect commands to try: `create t/`, `create t/role @analyst`
+ **Expected**: JABPro displays an error message along with a corrective action you can take to amend the command.
+
+### Editing a person's score for an assessment type tag while all persons are being shown
+
+1. Editing a person's score for an assessment type tag while all persons are being shown
+ 1. Prerequisites:
+ 1. List all persons using the `list` command. The list should have at least one person.
+ 2. Create an `assessment` type tag named `Interview` using the `create` command. This is done by entering `create t/assessment Interview` in the command box.
+
+ 2. Test case 1 (Positive Test Case):
+ `edit 1 t/Interview sc/Interview 70`
+ **Note**: The score value should be a positive integer and must contain a space between the tag and the score value.
+ **Expected**: Score for the assessment type tag `Interview` is updated to 70.
+ Both Person List and Person Information Panel is updated to reflect the new `Interview` Tag. The new score is reflected on the Summary Statistics Screen(Third panel from the left).
+
+ 3. Test case 2 (Negative Test Case):
+ `edit 1 t/swe sc/swe 70`
+ **Note**: Tag `swe` is not categorised as an assessment type tag. Thus, you cannot edit the score for this tag.
+ **Expected**: Neither score nor tag is updated for person. Error details shown in the status message.
+
+ 4. Test case 3 (Negative Test Case):
+ `edit 1 t/Interview sc/Interview -10`
+ **Note**: The score value should be a positive integer and must contain a space between the tag and the score value.
+ **Expected**: Neither score nor tag is updated for person. Error details shown in the status message.
+
+### Setting a person's status (Preliminary, Interviewed, Accepted/Rejected)
+1. Setting a person's status in the list
+ 1. Prerequisites: List all persons using the `list` command. Multiple persons in the list.
+
+ 2. Test case 1:
+ `set 1 Interviewed`
+ **Expected**: On the next 'view' command, the personnel's details shows as Interviewed.
+
+ 3. Test case 2:
+ `Set 0 Interviewed`
+ **Expected**: No person is set to 'Interviewed'. Error details shown in the status message. Person information panel remains the same.
+
+### Exporting the information into a csv file
+1. Exporting all current user data to csv
+ 1. Prerequisites: Necessary write permissions to the /data/export.csv location
+
+ 2. Test case 1:
+ `export`
+ **Expected**: File is successfully exported to the location /data/export.csv
+
+ 3. Test case 2:
+ `export` (without write permissions)
+ **Expected**: /data/export.csv file is not updated. Error details shown in the status message.
+
+### Filtering persons by their scores for a particular tag based on a particular metric while all persons are being shown
+1. Filtering persons by their scores for a particular tag based on a particular metric while all persons are being shown
+ 1. Prerequisites:
+ 1. List all persons using the `list` command. The list should have at least one person.
+ 2. Create an `assessment` type tag named `Interview` using the `create` command. This is done by entering `create t/assessment Interview` in the command box.
+ 3. Edit the score for the `Interview` tag for at least two people using the `edit` command. This is done by entering `edit 1 t/Interview sc/Interview 70` and `edit 2 t/Interview sc/Interview 50` in the command box.
+
+ 2. Test case 1 (Positive Test Case):
+ `filter t/Interview met/score val/60`
+ **Expected**: Person list is updated to reflect the persons with scores greater than 60 for the `Interview` tag. In this case its only the person with index 1.
+
+ 3. Test case 2 (Positive Test Case):
+ `filter t/Interview met/median`
+ **Expected**: Person list is updated to reflect the persons with scores greater than the median score for the `Interview` tag. In this case its only the person with index 1.
+
+ 4. Test case 3 (Positive Test Case):
+ `filter t/Interview met/percentile val/0`
+ **Expected**: Person list is updated to reflect the persons with scores greater than the 0th percentile score for the `Interview` tag. In this case it will be all the persons with the `Interview` tag.
+
+ 5. Test case 4 (Negative Test Case):
+ `filter t/swe met/score val/60`
+ **Expected**: No person is filtered. Error details shown in the status message. Person list remains the same.
+
+ 6. Test case 5 (Negative Test Case):
+ `filter t/Interview met/score val/-10`
+ **Expected**: No person is filtered. Error details shown in the status message. Person list remains the same.
+
+ 7. Test case 6 (Negative Test Case):
+ `filter t/Interview met/variance val/100`
+ **Expected**: No person is filtered. Error details shown in the status message. Person list remains the same.
+
+ 8. Test case 7 (Negative Test Case):
+ `filter t/Interview met/percentile`
+ **Expected**: No person is filtered. Error details shown in the status message. Person list remains the same.
+
+### Adding LinkedIn/GitHub username to a person while all persons are being shown ###
+
+1. Adding LinkedIn/GitHub username to a person while all persons are being shown
+ 1. Prerequisites: List all persons using the `list` command. Multiple persons in the list.
+
+ 2. Test case (Positive test case): `addL 1 u/alexyeoh`
+ **Expected:** LinkedIn username added to the person's profile. Displayed in person card.
+
+ 3. Test case (Negative test case): `addG -1 u/madlad`
+ **Expected:** No Github username is added to any person. Error details shown in the status message. Person information panel remains the same.
+
+ 4. Test case (Negative test case): `addL u/maxcodes`
+ **Expected:** No LinkedIn username is added to any person. Error details shown in the status message. Person information panel remains the same.
+
+ 5. Test case (Negative test case): `addG 1`
+ **Expected:** No Github username is added to any person. Error details shown in the status message. Person information panel remains the same.
+
+### Viewing person's social profile ###
+
+1. Viewing a person's social profile
+ 1. Prerequisites: List all persons using the `list` command. Multiple persons in the list, with their usernames previously added.
+
+ 2. Test case (Positive test case): `linkedin 1`
+ **Expected:** Redirected to LinkedIn profile of the person, in the browser. Success message displayed on JABPro.
+
+ 3. Test case (Negative test case): `github 0`
+ **Expected:** No Github profile shown. Error details shown in the status message.
+
+ 4. Test case (Negative test case): `linkedin 2`
+ [Assumption: LinkedIn username has not been previously added for candidate 2]
+ **Expected:** No LInkedin profile shown. Error details shown in the status message.
+
+ 5. Test case (Negative test case): `github`
+ **Expected:** No Github profile shown. Error details shown in the status message.
+
+### Adding Event relating to a candidate ###
+
+1. Adding event relating to a candidate
+ 1. Prerequisites: List all persons using the `list` command. Multiple person in the list.
+
+ 2. Test case (Positive test case): `event 1 d/Interview bt/2023-11-12 10:00 et/2023-11-12 12:00`
+ **Expected:** Event added to EventBook. Success message displayed. Event visible in Events window.
+
+ 3. Test case (Negative test case): `event 0 d/Interview bt/2023-11-12 10:00 et/2023-11-12 12:00`
+ **Expected:** No event added to EventBook. Error details shown in status message. Event Window remains the same.
+
+ 4. Test case (Negative test case): `event 1 bt/2023-11-12 10:00 et/2023-11-12 12:00`
+ **Expected:** No event added to EventBook. Error details shown in status message. Event Window remains the same.
+
+ 5. Test case (Negative test case): `event 1 d/Interview bt/12-11-2023 10:00 et/12-11-2023 12:00`
+ **Expected:** No event added to EventBook. Error details shown in status message. Event Window remains the same.
+
+ 6. Test case (Negative test case): `event 1 d/Interview bt/2023-11-12 12:00 et/2023-11-12 10:00`
+ **Expected:** No event added to EventBook. Error details shown in status message. Event Window remains the same.
+
+ 7. Test case (Negative test case): `event 1 d/Interview bt/2023-11-31 10:00 et/2023-12-01 10:00`
+ **Expected:** No event added to EventBook. Error details shown in status message. Event Window remains the same.
### 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. On your command terminal, `cd` into the folder where your jar file is in.
+ 2. Run `cd Data` to enter the directory where all of JABPro's data is stored.
+ 3. Run `ls` to view all files stored in this directory.
+ 4. If you see any of the following json files: `addressbook.json` or `eventbook.json`, delete them using
+ the `rm` command e.g. `rm addressbook.json` to start fresh and remove any corrupted data files.
diff --git a/docs/Documentation.md b/docs/Documentation.md
index 3e68ea364e7..082e652d947 100644
--- a/docs/Documentation.md
+++ b/docs/Documentation.md
@@ -1,29 +1,21 @@
---
-layout: page
-title: Documentation guide
+ layout: default.md
+ title: "Documentation guide"
+ pageNav: 3
---
-**Setting up and maintaining the project website:**
-
-* We use [**Jekyll**](https://jekyllrb.com/) to manage documentation.
-* The `docs/` folder is used for documentation.
-* To learn how set it up and maintain the project website, follow the guide [_[se-edu/guides] **Using Jekyll for project documentation**_](https://se-education.org/guides/tutorials/jekyll.html).
-* Note these points when adapting the documentation to a different project/product:
- * The 'Site-wide settings' section of the page linked above has information on how to update site-wide elements such as the top navigation bar.
- * :bulb: In addition to updating content files, you might have to update the config files `docs\_config.yml` and `docs\_sass\minima\_base.scss` (which contains a reference to `AB-3` that comes into play when converting documentation pages to PDF format).
-* If you are using Intellij for editing documentation files, you can consider enabling 'soft wrapping' for `*.md` files, as explained in [_[se-edu/guides] **Intellij IDEA: Useful settings**_](https://se-education.org/guides/tutorials/intellijUsefulSettings.html#enabling-soft-wrapping)
+# Documentation Guide
+* We use [**MarkBind**](https://markbind.org/) to manage documentation.
+* The `docs/` folder contains the source files for the documentation website.
+* To learn how set it up and maintain the project website, follow the guide [[se-edu/guides] Working with Forked MarkBind sites](https://se-education.org/guides/tutorials/markbind-forked-sites.html) for project documentation.
**Style guidance:**
* Follow the [**_Google developer documentation style guide_**](https://developers.google.com/style).
+* Also relevant is the [_se-edu/guides **Markdown coding standard**_](https://se-education.org/guides/conventions/markdown.html).
-* Also relevant is the [_[se-edu/guides] **Markdown coding standard**_](https://se-education.org/guides/conventions/markdown.html)
-
-**Diagrams:**
-
-* See the [_[se-edu/guides] **Using PlantUML**_](https://se-education.org/guides/tutorials/plantUml.html)
-**Converting a document to the PDF format:**
+**Converting to PDF**
-* See the guide [_[se-edu/guides] **Saving web documents as PDF files**_](https://se-education.org/guides/tutorials/savingPdf.html)
+* See the guide [_se-edu/guides **Saving web documents as PDF files**_](https://se-education.org/guides/tutorials/savingPdf.html).
diff --git a/docs/Gemfile b/docs/Gemfile
deleted file mode 100644
index c8385d85874..00000000000
--- a/docs/Gemfile
+++ /dev/null
@@ -1,10 +0,0 @@
-# frozen_string_literal: true
-
-source "https://rubygems.org"
-
-git_source(:github) {|repo_name| "https://github.com/#{repo_name}" }
-
-gem 'jekyll'
-gem 'github-pages', group: :jekyll_plugins
-gem 'wdm', '~> 0.1.0' if Gem.win_platform?
-gem 'webrick'
diff --git a/docs/Logging.md b/docs/Logging.md
index 5e4fb9bc217..589644ad5c6 100644
--- a/docs/Logging.md
+++ b/docs/Logging.md
@@ -1,8 +1,10 @@
---
-layout: page
-title: Logging guide
+ layout: default.md
+ title: "Logging guide"
---
+# Logging guide
+
* We are using `java.util.logging` package for logging.
* The `LogsCenter` class is used to manage the logging levels and logging destinations.
* The `Logger` for a class can be obtained using `LogsCenter.getLogger(Class)` which will log messages according to the specified logging level.
diff --git a/docs/SettingUp.md b/docs/SettingUp.md
index 275445bd551..03df0295bd2 100644
--- a/docs/SettingUp.md
+++ b/docs/SettingUp.md
@@ -1,27 +1,32 @@
---
-layout: page
-title: Setting up and getting started
+ layout: default.md
+ title: "Setting up and getting started"
+ pageNav: 3
---
-* Table of Contents
-{:toc}
+# Setting up and getting started
+
+
--------------------------------------------------------------------------------------------------------------------
## Setting up the project in your computer
-
:exclamation: **Caution:**
+
+**Caution:**
Follow the steps in the following guide precisely. Things will not work out if you deviate in some steps.
-
+
First, **fork** this repo, and **clone** the fork into your computer.
If you plan to use Intellij IDEA (highly recommended):
1. **Configure the JDK**: Follow the guide [_[se-edu/guides] IDEA: Configuring the JDK_](https://se-education.org/guides/tutorials/intellijJdk.html) to to ensure Intellij is configured to use **JDK 11**.
-1. **Import the project as a Gradle project**: Follow the guide [_[se-edu/guides] IDEA: Importing a Gradle project_](https://se-education.org/guides/tutorials/intellijImportGradleProject.html) to import the project into IDEA.
- :exclamation: Note: Importing a Gradle project is slightly different from importing a normal Java project.
+1. **Import the project as a Gradle project**: Follow the guide [_[se-edu/guides] IDEA: Importing a Gradle project_](https://se-education.org/guides/tutorials/intellijImportGradleProject.html) to import the project into IDEA.
+
+ Note: Importing a Gradle project is slightly different from importing a normal Java project.
+
1. **Verify the setup**:
1. Run the `seedu.address.Main` and try a few commands.
1. [Run the tests](Testing.md) to ensure they all pass.
@@ -34,10 +39,11 @@ If you plan to use Intellij IDEA (highly recommended):
If using IDEA, follow the guide [_[se-edu/guides] IDEA: Configuring the code style_](https://se-education.org/guides/tutorials/intellijCodeStyle.html) to set up IDEA's coding style to match ours.
-
:bulb: **Tip:**
+
+ **Tip:**
Optionally, you can follow the guide [_[se-edu/guides] Using Checkstyle_](https://se-education.org/guides/tutorials/checkstyle.html) to find how to use the CheckStyle within IDEA e.g., to report problems _as_ you write code.
-
+
1. **Set up CI**
diff --git a/docs/Testing.md b/docs/Testing.md
index 8a99e82438a..78ddc57e670 100644
--- a/docs/Testing.md
+++ b/docs/Testing.md
@@ -1,12 +1,15 @@
---
-layout: page
-title: Testing guide
+ layout: default.md
+ title: "Testing guide"
+ pageNav: 3
---
-* Table of Contents
-{:toc}
+# Testing guide
---------------------------------------------------------------------------------------------------------------------
+
+
+
+
## Running tests
@@ -19,8 +22,10 @@ There are two ways to run tests.
* **Method 2: Using Gradle**
* Open a console and run the command `gradlew clean test` (Mac/Linux: `./gradlew clean test`)
-
:link: **Link**: Read [this Gradle Tutorial from the se-edu/guides](https://se-education.org/guides/tutorials/gradle.html) to learn more about using Gradle.
-
+
+
+**Link**: Read [this Gradle Tutorial from the se-edu/guides](https://se-education.org/guides/tutorials/gradle.html) to learn more about using Gradle.
+
--------------------------------------------------------------------------------------------------------------------
diff --git a/docs/UserGuide.md b/docs/UserGuide.md
index 57437026c7b..c10772948ac 100644
--- a/docs/UserGuide.md
+++ b/docs/UserGuide.md
@@ -1,197 +1,1329 @@
---
-layout: page
-title: User Guide
+ layout: default.md
+ title: "User Guide"
+ pageNav: 3
---
-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.
+# JABPro User Guide
-* Table of Contents
-{:toc}
+--------------------------------------------------------------------------------------------------------------------
+
+## Table of Contents
+* [Product Overview](#product-overview)
+* [Features Overview](#overview-of-main-features)
+* [Key Definitions](#key-definitions)
+* [Quick Start](#quick-start)
+* [Command Failures](#command-failure)
+* [Viewing help](#viewing-help-help)
+* [Features](#features)
+ * [Managing Tags](#1-managing-tags)
+ * [Creating tags](#creating-tags-create)
+ * [Listing all tags](#listing-all-tags-listt)
+ * [Managing Applicants](#2-managing-applicants)
+ * [Adding an applicant](#adding-an-applicant-add)
+ * [Adding a remark to an applicant](#adding-a-remark-to-an-applicant-remark)
+ * [Adding applicant's LinkedIn/GitHub](#adding-linkedingithub-username-for-a-user-addl-or-addg)
+ * [Opening applicant's LinkedIn/GitHub](#opening-user-linkedin-or-github-account-linkedin-or-github)
+ * [Setting an applicant's status](#setting-an-applicants-status-set)
+ * [Viewing an applicant's details](#viewing-a-applicants-details-view)
+ * [Editing an applicant's detail](#editing-a-applicant-edit)
+ * [Deleting an applicant](#deleting-job-applicants-delete)
+ * [Filtering and Listing Applicants](#3-filtering-and-listing-applicants)
+ * [Searching for applicants](#searching-job-applicants-by-category-search)
+ * [Filtering applicants](#filter-job-applicants-by-statistics-filter)
+ * [Listing all applicants](#listing-all-applicant-list)
+ * [Managing Events](#4-managing-events)
+ * [Adding an event](#adding-an-event-event)
+ * [Viewing all events](#viewing-events-schedule)
+ * [Others](#5-others)
+ * [Exporting all entries](#exporting-the-existing-data-to-csv-export)
+ * [Clear all entries](#clearing-all-entries-clear)
+ * [Exiting the program](#exiting-the-program-exit)
+* [Additional Information](#additional-information)
+ * [Summary Statistics](#summary-statistics)
+ * [Saving Data](#saving-the-data)
+ * [Editing Data](#editing-the-data-file)
+* [FAQ](#faq)
+* [Command Summary](#command-summary)
+* [Prefix Summary](#prefix-summary)
+* [Glossary](#glossary)
--------------------------------------------------------------------------------------------------------------------
-## Quick start
+## Product Overview
+
+Are you a Hiring Manager who's tired of managing applicant applications through cumbersome spreadsheets?
+
+Upgrade your hiring process with **JABPro (JobApplicationsBook Pro)**, a CLI based desktop app that allows you to:
+
+* easily manage job applicants' contact details,
+* schedule interviews,
+* and gain valuable insights on their interview performance!
+
+From interns to full-time roles, software to marketing, JABPro’s versatile interface allows you to keep track of all kinds of job applicants in various industries.
+
+**If you are a Hiring Manager, looking to improve your applications management workflow, JABPro is the tool for you!**
+
+Access our self-curated user guide below to learn more on how you can integrate various JABPro’s functions into your workflow.
+
+[Jump back to Table of Contents](#table-of-contents)
+
+## Features Overview
+
+
+While **JABPro** offers a whole range of features, we believe that the following features are likely to be the most useful to you:
+
+**Viewing details of applicants:**
+* Viewing applicant's information: `view`
+
+**Tag colouring and categorisation:**
+* Creating a tag with a specified category: `create`
+* Listing all tags: `listT`
+* Adding and editing an applicant's tags and tag scores: `edit`
+
+**Event management and Scheduling:**
+* Adding an event: `event`
+* Viewing events: `schedule`
+
+**Comparing and filtering applicants:**
+* Filtering applicants by statistics: `filter`
+
+These features address the complications that Hiring Managers face when managing applicants:
+1. **Visual Noise and Clutter** from using other applicant management software like Excel
+
+`Viewing details of applicants` and `Tag colouring and categorisation` address this by creating an organized and intuitive way to view applicants and their details. This is done through colour coding and minimalistic design.
+
+2. **Toggling between different software** to manage applicants and schedule events
+
+`Event Management and Scheduling` address this by allowing you to schedule events and view them in the same software. This means that you do not have to toggle between different software to manage applicants and schedule events.
+
+3. Having to manually calculate summary statistics and compare applicants
+`Comparing and filtering applicants` address this by allowing you to filter applicants by statistics and compare them. This means that you do not have to manually calculate summary statistics and compare applicants.
+
+--------------------------------------------------------------------------------------------------------------------
+Go to the [Table of Contents](#table-of-contents) to navigate to the feature that you are interested in
+
+
+
+--------------------------------------------------------------------------------------------------------------------
+
+## Key Definitions
+
+Our user guide takes into consideration your level of expertise in JABPro.
+
+You are a **beginner** user if ...
+
+1. You are new to JABPro (used JABPro less than 5 times) *and*,
+2. you wish to fully rely on the JABPro interface.
+
+ALl the **notes** and **tips** mentioned in this user guide are directed towards beginners unless otherwise stated.
+
+You are an **advanced** user if ...
+
+1. You have used JABPro multiple times now *and*,
+2. you use JABPro's search and summary statistics extensively for comparison *or*
+3. you would like to challenge yourself to go beyond the JABPro user interface and manually edit files.
+
+**Notes** and **tips** curated for you are labeled by the following box!
+
+
+
+
Advanced
+
+
+
+
+**Also, take note of the following icons and their meanings.**
+
+
+
+This is a warning. Watch out for these!
+
+
+
+
+This refers to highlighted information that you should take note of!
+
+
+
+
+This is a tip. It's good to know but not a must-have!
+
+
+[Jump back to Table of Contents](#table-of-contents)
+
+--------------------------------------------------------------------------------------------------------------------
+
+## Quick Start
1. Ensure you have Java `11` or above installed in your Computer.
-1. Download the latest `addressbook.jar` from [here](https://github.com/se-edu/addressbook-level3/releases).
+2. Download the latest `jabpro.jar` from [here](https://github.com/AY2324S1-CS2103T-W09-4/tp/releases).
+
+3. Copy the file to the folder you want to use as the _home folder_ for your JabPro.
+
+4. Open a command terminal, `cd` into the folder you put the jar file in, and use the `java -jar jabpro.jar` command to run the application.
+ A GUI similar to the below should appear in a few seconds. Note how the app contains some sample data.
+
+ ![Ui](images/main.png)
+
+
+
+**Caution:** ensure your JABPro contains some sample data. If it starts off empty then there might be some issues with the launch which might result in
+some commands to not run properly. See below to learn how to troubleshoot this problem!
+
+
+
+
-1. Copy the file to the folder you want to use as the _home folder_ for your AddressBook.
+**My app does not contain any sample data!**
+Not to worry, here are some steps you can take to fix this:
+1. On your command terminal, `cd` into the folder where you put the jar file in.
+2. Run `cd Data` to navigate to the `Data` folder. This is the folder where JABPro stores the application data on your computer.
+3. Run `ls` to view all the files stored in this folder.
+4. You should be able to see a file titled `addressbook.json`. Run `rm addressbook.json` to delete this file.
+5. Run `cd ..` to navigate back to the folder you were in before.
+6. Run `java -jar jabpro.jar` to relaunch the application. You should be able to see a GUI similar to the one above.
-1. Open a command terminal, `cd` into the folder you put the jar file in, and use the `java -jar addressbook.jar` command to run the application.
- A GUI similar to the below should appear in a few seconds. Note how the app contains some sample data.
- ![Ui](images/Ui.png)
+
-1. Type the command in the command box and press Enter to execute it. e.g. typing **`help`** and pressing Enter will open the help window.
- Some example commands you can try:
+5. If your UI looks **compressed and words are being cut off such as that seen below**, you should **resize** the window to a larger size by dragging the corners of the application window. The UI should now look like the example given above.
+
+
+ ![Ui](images/UICompressed.png)
- * `list` : Lists all contacts.
+
- * `add n/John Doe p/98765432 e/johnd@example.com a/John street, block 123, #01-01` : Adds a contact named `John Doe` to the Address Book.
+ **Here's what each part of the GUI signifies:**
- * `delete 3` : Deletes the 3rd contact shown in the current list.
+ ![UiBreakdown](images/uibreak.png)
- * `clear` : Deletes all contacts.
- * `exit` : Exits the app.
+| Colour | Component | Description |
+|----------------------------------------------------------|-----------------------------|--------------------------------------------------------------------------------------------------------------------------------------------------|
+| | Menu Bar | Provides buttons for exiting, opening Help window, and opening Events window. |
+| | Command Box | Allows you to enter a command. |
+| | Result Display | Displays the result of the command execution. |
+| | Applicant List Panel | Displays a list of all applicants in JABPro. |
+| | Applicant Card | Displays certain details of an applicant for quick view, such as name, address, phone, email, tags, LinkedIn/GitHub username. |
+| | Applicant Information Panel | Displays a detailed view of an applicant, providing information of status and remarks, in addition to the basic information about the applicant. |
+| | Summary Statistics Panel | Displays summary statistics for a particular applicant pertaining to a specific tag. |
-1. Refer to the [Features](#features) below for details of each command.
+
+
+In addition, there are windows such as:
+ * Help Window [accessed by the `help` command, or through Menu Bar].
+ * Events Window [accessed by the `schedule` command, or through Menu Bar].
+ * TagList window [accessed through the `listT` command].
+
+ Details for each have been provided with the respective commands.
+
+6. Type the command in the command box and press Enter to execute it. Go to our [command summary](#command-summary) to see
+ some example commands you can try.
+
+[Jump back to Table of Contents](#table-of-contents)
+
+
--------------------------------------------------------------------------------------------------------------------
+## Command Failure
+
+
+**How to know if your command has failed?**
+1. You will see the command that you have entered being highlighted in red.
+2. The command will not be cleared from the command box.
+3. The error message will be shown in the result display panel.
+4. The UI below will not be updated if your command has failed.
+
+
+**The example below shows a command failure for `view`:**
+![CommandFailure](images/view-command-failure.png)
+
+
+[Jump back to Table of Contents](#table-of-contents)
+
+## Viewing help: `help`
+
+
+Opens the `Help window` that leads you to the User Guide for assistance on working with JABPro.
+
+Format: `help`
+
+
+
+**Tip:** The `Help window` can also be accessed by clicking `Help > Help F1` in the menu bar, located at the top of the window.
+
+Additionally, pressing the `F1` key also opens the `Help Window`.
+
+
+
+
+
+**Example of successful execution of the `help` command:**
+
+1. Enter the command `help`
+2. This is the result of the successful `help` command:
+
+![Help](images/helpwindow-mh.png)
+
+The `Help Window` opens up as follows:
+
+![HelpWindow](images/hw.png)
+
+[Jump back to Table of Contents](#table-of-contents)
+
+
+
## Features
-
+
-**:information_source: Notes about the command format:**
+**Notes about the command format:**
* Words in `UPPER_CASE` are the parameters to be supplied by the user.
e.g. in `add n/NAME`, `NAME` is a parameter which can be used as `add n/John Doe`.
* Items in square brackets are optional.
- e.g `n/NAME [t/TAG]` can be used as `n/John Doe t/friend` or as `n/John Doe`.
+ e.g. `n/NAME [t/TAGNAME]` can be used as `n/John Doe t/friend` or as `n/John Doe`.
+
+* When using parentheses ( ) with items separated by the slash symbol /, at least one item must be included.
+ e.g. in the command `search (n/NAME... st/STATUS... t/TAGNAME...)`, it is necessary to specify at least one search category.
* Items with `…` after them can be used multiple times including zero times.
- e.g. `[t/TAG]…` can be used as ` ` (i.e. 0 times), `t/friend`, `t/friend t/family` etc.
+ e.g. `t/TAGNAME…` can be used as ` ` (i.e. 0 times), `t/swe t/intern` for `add` commands or `t/swe intern` for `search` and `delete` commands.
* 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 `n/NAME p/PHONE_NUMBER`, `p/PHONE_NUMBER n/NAME` is also acceptable.
-* Extraneous parameters for commands that do not take in parameters (such as `help`, `list`, `exit` and `clear`) will be ignored.
- e.g. if the command specifies `help 123`, it will be interpreted as `help`.
+* Extraneous parameters for commands that do not take in parameters (such as `help`, `listT`, `exit` and `clear`) will be ignored.
+ e.g. if the command specifies `help 123`, it will be interpreted as `help`.
* If you are using a PDF version of this document, be careful when copying and pasting commands that span multiple lines as space characters surrounding line-breaks may be omitted when copied over to the application.
+
+
+[Jump back to Table of Contents](#table-of-contents)
+
+--------------------------------------------------------------------------------------------------------------------
+
+### 1. Managing Tags
+
+Tags are meant to help you easily remember applicants details by appending different colour coding to different types of information.
+
+#### Creating tags: `create`
+
+
+Creates a tag and categorises it to the specified category.
+
+Format: `create t/CATEGORY TAGNAME…`
+
+| Type | Field | Constraints |
+|-----------|----------------------|----------------------------------------------------------------------------------------------------------|
+| Mandatory | `t/CATEGORY TAGNAME` | `TAGNAME` must be alphanumeric (letters and numbers, no spaces and symbols allowed such as `/`, `,` ...) |
+
+**Note:**
+* JABPro offers 3 predefined tag categories namely `employment`, `role`, and `dept`. However, you can define up to 3 more tag categories of your own!
+* The tags created using this command can be used to tag applicants using the `add` or `edit` command. Tagging
+ applicant without previously creating the tags using `create` would still work but the tags would be *uncategorised*.
+* `create` only allows tags to be categorised at creation meaning tags that have already been created, cannot be categorised further i.e. cannot edit tag categories of tags.
+* The field `t/CATEGORY TAGNAME` must strictly contain only two words hence it is advisable for you to keep the `TAGNAME` alphanumerical (contains no spaces). Any other word
+ that comes after `t/CATEGORY TAGNAME` that is not preceded by a `t/` prefix would be ignored and the tag for the first valid tag is created.
+
+ Example: `create t/role software developer` would create the tag **software** and ignore the word developer.
+
+
+
+**Tip:**
+* You can create multiple tags at once i.e. `create t/dept marketing t/role developer ...`
+* Use this command for frequently used tags for better efficiency in tagging applicants.
+* You can view all of your tags by keying in the `listT` command.
+
+
+**An example of the `create` command being successfully executed:**
+1. Enter the command `create t/dept marketing t/role developer`
+2. This is what you should see upon successful execution of command.
+
+ ![create-success](images/create-success.png)
+
+3. View your newly created tags using the `listT` command.
+
+ ![listT-create](images/listT-create-success.png)
+
+**Failed to create tags? Here are some possible reasons why**
+
+| Reason for Error | Error Message | Remedy / Suggested course of action |
+|-------------------------------------------------------------------------------------------------------------------------|----------------------------------------------|----------------------------------------------------------------------------------------------------------------------------|
+| Missing create keyword: `create` | Unknown command | Follow the command format of `create t/CATEGORY TAGNAME…` closely |
+| Missing mandatory field e.g. `create` | Invalid command format! | Ensure that you specify at least one tag category and tag name of the tag you would like to create. |
+| Incomplete field e.g. `create t/test` | Invalid command format! | Ensure that both parts of the field are included i.e. specify both tag category and tag name. |
+| Invalid tag name e.g. `create t/developer@` | Tags names should be alphanumeric. | Ensure that the tag name does not contain any non-alphanumeric characters i.e. no symbols and whitespaces. |
+| Tag already exists | This tag already exists in the address book! | Since the tag already exists, there is no need for you to create a new one. You can reuse this same tag to tag applicants! |
+| Using commas as delimiters of different prefixes instead of whitespaces e.g. `create t/dept software, t/role marketing` | Invalid command format! | Remove the comma(s) e.g. `create t/dept software, t/role marketing` | |
+
+[Jump back to Table of Contents](#table-of-contents)
+
+#### Listing all tags: `listT`
+
+
+Shows a list of all tags in JABPro
+
+Format: `listT`
+
+* The `listT` command does not require any additional parameters or arguments.
+* Tags listed by the `listT` command are unique and do not repeat.
+
+**Example:**
+* `listT` Shows a list of all tags.
+
+![ListT](images/listT.png)
+
+[Jump back to Table of Contents](#table-of-contents)
+
+
+
+
+### 2. Managing Applicants
+
+
+#### Adding an applicant: `add`
+
+
+Adds an applicant to JABPro.
+
+Format: `add n/NAME p/PHONE_NUMBER e/EMAIL a/ADDRESS [t/[CATEGORY] TAGNAME]…`
+
+| Type | Field | Constraints |
+|-----------|------------------------|-----------------------------------------------------------------------------------------------------------------------------|
+| Mandatory | `n/NAME` | `NAME` must be alphanumeric (Letters and numbers, no symbols allowed such as `/`, `,` ...). |
+| Mandatory | `p/PHONE_NUMBER` | `PHONE_NUMBER` must contain numbers only and should be at-least 3 digits long. |
+| Mandatory | `e/EMAIL` | `EMAIL` must be the standard email address format (There must be an email-prefix followed by `@` symbol and email domain). |
+| Mandatory | `a/ADDRESS` | `ADDRESS` can be any value, including special characters such as `#`, `,` ... |
+| Optional | `t/[CATEGORY] TAGNAME` | `[CATEGORY]` is optional. TAGNAME` must be alphanumeric with no spaces. Any details after the space will be ignored. |
+
+**Notes regarding additional constraint on `add` command:**
+* The uniqueness of the applicant is determined by the name only. This means that you cannot have 2 applicants with the same name in the application book.
+* All other fields other than name can be identical between different people in JABPro.
+* Applicants added using the `add` command will be added to the end of the overall list of applicants (i.e. the list that you would get when you do `list`).
+
+**Notes on adding tags:**
+* If you would like to tag a user with a tag that has not been categorised yet using the `create` command,
+ you can specify the category that you would like it to be categorised to in the `add` command. e.g. `...t/role swe`
+* If you are using a tag that has not been categorised yet, and you did not specify its category in the `add` command,
+ the tag would still be saved, but it would be _uncategorized_ by default.
+* If you have multiple tags in different categories with the same name, you must specify the category when you want to
+ add one of these tags to the applicant you are adding.
+
+
+
+**Tip:**
+* An applicant can have any number of tags (including 0)!
+
+
+**An example of the `add` command being successfully executed:**
+1. Enter the command `add n/Betsy Crowe t/friend e/betsycrowe@example.com a/Newgate Prison p/1234567 t/dept finance`
+2. This is the result of the successful `add` command (Take note that command entered will not be shown in the result):
+
+ ![Add-Success](images/add-command-success.png)
+
+
+**Failed to add applicants? Here are some possible reasons why**
+
+| Reason for Error | Error Message | Remedy / Suggested course of action |
+|-----------------------------------------------|-------------------------------------------------------------------------------------------|--------------------------------------------------------------------------------------------------------------------------------------------------|
+| Missing add keyword: `add` | Unknown command | Follow the command format of `add n/NAME p/PHONE_NUMBER e/EMAIL a/ADDRESS [t/TAGNAME]…` closely |
+| Missing mandatory fields | Invalid command format! | Ensure that all mandatory fields are filled up. |
+| Duplicate name | This person already exists in the address book | Ensure that the name of the applicant is unique. That is you cannot add the same name twice. Use some form of extra identification like a number |
+| Invalid phone number | Phone numbers should only contain numbers, and it should be at least 3 digits long | Ensure that the phone number only contains number and should be at least 3 digits long |
+| Invalid email | Emails should be of the format local-part@domain and adhere to the following constraints: | Ensure that the prefix and domain of the email is correct following the constraints stated by the error |
+| Invalid tag name | Tag names should only contain alphanumeric characters and should not be blank | Ensure that the tag name only contains alphanumeric characters and should not be blank |
+| Multiple prefixes of the same type being used | Multiple values specified for the following single-valued field(s): `prefix/` | Remove the duplicate prefix. The command should only have 1 of every prefix except for `t/` |
+
+[Jump back to Table of Contents](#table-of-contents)
+
+#### Adding a remark to an applicant: `remark`
+
+
+Edits a remark of an existing applicant in JABPro.
+Format: `remark INDEX r/REMARK`
+
+| Type | Field | Constraints |
+|-----------|---------------|---------------------------------------------------------------------------------------------------------------------------------------------|
+| Mandatory | `INDEX` | `INDEX` must be an existing index in the displayed applicant list and it must not be greater than the total number of applicants in JABPro. |
+| Optional | `r/ [REMARK]` | `REMARK` can be any value, including special characters such as `#`, `,` ... |
+
+**Notes regarding `remark` command:**
+* The previous remark is not saved, and instead is replaced by the inputted remark. The command does not add to the existing remark.
+* You can empty out a remark by inputting `r/` without any text after it or by omitting the `r/` prefix.
+* You can get the remark previously inputted by using the `**REMARK**` keyword. It will be replaced with the previous remark (see example below). The keyword `**REMARK**` is case-sensitive. This means that `remark 1 r/**remark**` will just replace the remark with the word `**remark**`.
+* You can use multiple prefix for `remark` but only the last prefix will be used. This means that `remark 1 r/remark r/remark2` will just replace the remark with `remark2`.
+
+
+**An example of the `remark` command being successfully executed:**
+1. Enter the command `remark 1 r/Great attitude, hardworking`
+2. This is the result of the successful `remark` command (Take note that command entered will not be shown in the result):
+ ![Remark-Success](images/remark-command-success.png)
+
+
+
+
+**An example of the `remark` command being successfully executed with the **REMARK** keyword:**
+1. Enter the command `remark 1 r/**REMARK** furthermore he is great at teamwork`
+2. This is the result of the successful `remark` command (Take note that command entered will not be shown in the result):
+ ![Remark-Success](images/remark-command-enhanced-success.png)
+
+
+**Failed to add remark to an applicant? Here are some possible reasons why**
+
+| Reason for Error | Error Message | Remedy / Suggested course of action |
+|----------------------------------|--------------------------------------|-----------------------------------------------------------------------------------------------------------|
+| Missing remark keyword: `remark` | Unknown command | Follow the command format of `remark INDEX r/[REMARK]` closely |
+| Missing Index | Invalid command format! | Ensure that the index is filled up. |
+| Invalid Index | The person index provided is invalid | Ensure that the index is valid. That is it is a number that is on the displayed applicant list. |
+ | Negative or 0 Index | Invalid command format! | Ensure that the index is a positive integer and is also a number that is on the displayed applicant list. |
+
+**Additional Examples:**
+* `remark 1` Empties the remark of the 1st applicant. It is equivalent to `remark 1 r/`.
+
+[Jump back to Table of Contents](#table-of-contents)
+
+#### Adding LinkedIn/GitHub username for a user: `addL` or `addG`
+
+
+Adds the username for their social profile [LinkedIn/GitHub] to the existing contact details of applicants.
+
+Format: `addL INDEX u/USERNAME` or `addG INDEX u/USERNAME`
+
+| Type | Field | Constraints |
+|-----------|--------------|-----------------------------------------------------------------------------------------------------------------------|
+| Mandatory | `INDEX` | `INDEX` must be a non-zero unsigned integer and it must not be greater than the total number of applicants in JABPro. |
+| Mandatory | `u/USERNAME` | `USERNAME` must be a string value. Only the prefix (i.e. `u/`) is mandatory. |
+
+**Notes regarding `addL` and `addG` command:**
+
+* Any set of characters entered after the prefix `u/` is taken to be the username, except if the prefix `u/` occurs multiple times.
+* You may provide the username multiple times with the prefix `u/`, however, JABPro only considers the set of characters entered after the last occurring instance of `u/` as the username.
+* You are expected to ensure that `USERNAME` is a valid username for the respective social profile. If it is not a valid username, user will be redirected to the error page of the corresponding social profile when `linkedin` or `github` command is invoked. JABPro does not perform checks for the validity of the username for the corresponding social profile.
+* Invoking the `addL` or `addG` command for an applicant for whom a username has already been added, will simply overwrite the existing username with the new one.
+* You may run the command `addL INDEX u/` or `addG INDEX u/`, i.e. providing no username, or simply providing blanks for the username. Such inputs are accepted by JABPro. However, it will prove to be erroneous when `linkedin` or `github` command is invoked.
+
+**Example of successful execution of the `addL` command:**
+
+1. Enter the command `addL 1 u/alexyeoh`
+2. This is the result of the successful `addL` command
+
+![AddL](images/addL.png)
+
+**`addG` command is invoked in the same way.**
+
+**Failed to add LinkedIn/Github username? Here are some possible reasons why**
+
+| Reason for Error | Error Message | Remedy / Suggested course of action |
+|----------------------------------|--------------------------------------|-----------------------------------------------------------------------------------------------------------|
+| Missing `addL` or `addG` keyword | Unknown command | Follow the command format of `addL INDEX u/USERNAME` or `addG INDEX u/USERNAME` closely |
+| Missing Index | Invalid command format! | Ensure that the index is filled up. |
+| Invalid Index | The person index provided is invalid | Ensure that the index is valid. That is it is a number that is on the displayed applicant list. |
+| Negative or 0 Index | Invalid command format! | Ensure that the index is a positive integer and is also a number that is on the displayed applicant list. |
+| Missing username | Invalid command format! | Ensure that the username is filled up |
+
+[Jump back to Table of Contents](#table-of-contents)
+
+#### Opening user LinkedIn or GitHub account: `linkedin` or `github`
+
+
+Redirects user to applicant's LinkedIn or GitHub account.
+
+Format: `linkedin INDEX` or `github INDEX`
+
+| Type | Field | Constraints |
+|-----------|---------|-----------------------------------------------------------------------------------------------------------------------|
+| Mandatory | `INDEX` | `INDEX` must be a non-zero unsigned integer and it must not be greater than the total number of applicants in JABPro. |
+
+**Notes regarding `LinkedIn` and `GitHub` commands:**
+
+* User is expected to enter `INDEX` for an applicant for whom username [that is not blank, or does not comprise of only spaces] has been added previously.
+* User is redirected to the page of the social profile regardless of the validity of the username for that particular social profile (i.e. whether the social profile exists)
+
+**Example of successful execution of `github` command:**
+
+1. Enter the command `github 1`
+2. This is the result of the successful `github` command [It is assumed an applicant exists in JABPro, with Github username previously added]:
+
+![Github](images/linkedin.png)
+
+The GitHub window opens as follows, displaying the profile with the specified username, or error page in case profile with that username does not exist:
+
+![GithubProfile](images/github.png)
+
+`linkedin` command is invoked in the same manner.
+
+**Failed to redirect to social profile? Here are some possible reasons why**
+
+| Reason for Error | Error Message | Remedy / Suggested course of action |
+|----------------------------------------|----------------------------------------------------------------------------------------------------------------|-----------------------------------------------------------------------------------------------------------|
+| Missing `linkedin` or `github` keyword | Unknown command | Follow the command format of `linkedin INDEX` or `github INDEX` closely |
+| Missing Index | Invalid command format! | Ensure that the index is filled up. |
+| Invalid Index | The person index provided is invalid | Ensure that the index is valid. That is it is a number that is on the displayed applicant list. |
+| Negative or 0 Index | Invalid command format! | Ensure that the index is a positive integer and is also a number that is on the displayed applicant list. |
+| Missing account for provided Index | No LinkedIn account has been added for this candidate. or No Github account has been added for this candidate. | Ensure that username has been previously added to the specified candidate |
+
+[Jump back to Table of Contents](#table-of-contents)
+
+#### Setting an applicant's status: `set`
+
+
+Sets the applicant to a specific status ("Preliminary"/ "Interviewed"/ "Rejected"/ "Offered").
+
+Format: `set INDEX STATUS`
+
+| Type | Field | Constraints |
+|-----------|----------|-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------|
+| Mandatory | `INDEX` | `INDEX` must be an existing index in the displayed applicant list and it must not be greater than the total number of applicant in JABPro. It must also be a positive integer |
+| Mandatory | `STATUS` | `STATUS` must be one of the following - "Preliminary", "Interviewed", "Rejected", "Accepted". It is case-insensitive. |
+
+**Examples:**
+* `list` followed by `set 2 Interviewed` sets the 2nd applicant in the address book to "Interviewed".
+
+[Jump back to Table of Contents](#table-of-contents)
+
+#### Viewing an applicant's details: `view`
+
+
+Creates a complete view for details of an applicant in the applicant information panel and summary statistics (if applicable) of an applicant in the summary statistics panel.
+
+Format: `view INDEX`
+
+| Type | Field | Constraints |
+|-----------|---------|--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------|
+| Mandatory | `INDEX` | `INDEX` must be an existing index in the displayed applicant list and it must not be greater than the total number of applicant in JABPro. It must also be a positive integer. |
+
+**Notes regarding `view` command:**
+* Refer to the [Summary Statistics](#summary-statistics) section for more details on the summary statistics.
+
+
+
+**Tip:** Other operations that affect user's data will trigger a refresh of the view.
+These include `add`, `edit`, `set`, `remark`, `addL`, `addG`.
+This means that the view will be updated to reflect the latest changes to the data for that particular applicant.
+
+
+
+**An example of the `view` command being successfully executed:**
+1. Enter the command `view 3`
+2. This is the result of the successful `view` command (Take note that command entered will not be shown in the result):
+
+ ![View-Success](images/view-command-success.png)
+
+
+**An example of the `view` command being successfully executed for applicant with tags and score:**
+1. Enter the command `view 2` (**Applicant with tags and score**)
+2. This is the result of the successful `view` command (Take note that command entered will not be shown in the result):
+
+ ![View-Success](images/view-command-with-stats-success.png)
+
+
+
+**Failed to execute `view` command? Here are some possible reasons why**
+
+| Reason for Error | Error Message | Remedy / Suggested course of action |
+|------------------------------|--------------------------------------|-------------------------------------------------------------------------------------------------|
+| Missing view keyword: `view` | Unknown command | Follow the command format of `view INDEX` closely |
+| Missing Index | Invalid command format! | Ensure that the index is filled up. |
+| Invalid Index | The person index provided is invalid | Ensure that the index is valid. That is it is a number that is on the displayed applicant list. |
+
+[Jump back to Table of Contents](#table-of-contents)
+
+#### Editing an applicant: `edit`
+
+
+Edits an existing applicant's detail in JABPro. It also includes the functionality to add scores to a specific applicant.
+
+Format: `edit INDEX ([n/NAME] [p/PHONE] [e/EMAIL] [a/ADDRESS] [t/TAGNAME]… [sc/TAGNAME SCORE])`
+
+| Type | Field | Constraints |
+|------------|------------------------|-----------------------------------------------------------------------------------------------------------------------------|
+| Mandatory | `INDEX` | `INDEX` must be a non-zero unsigned integer and must also not be greater than the total number of applicants in JABPro. |
+| Mandatory* | `n/NAME` | `NAME` must be alphanumeric (Letters and numbers, no symbols allowed such as `/`, `,` ...). |
+| Mandatory* | `p/PHONE_NUMBER` | `PHONE_NUMBER` must contain numbers only and should be at-least 3 digits long. |
+| Mandatory* | `e/EMAIL` | `EMAIL` must be the standard email address format (There must be an email-prefix followed by `@` symbol and email domain). |
+| Mandatory* | `a/ADDRESS` | `ADDRESS` can be any value, including special characters such as `#`, `,` ... |
+| Mandatory* | `t/[CATEGORY] TAGNAME` | `TAGNAME` must be alphanumeric with no spaces. Any details after the space will be ignored. |
+| Mandatory* | `sc/TAGNAME SCORE` | `TAGNAME` a tag that is being created or already exist for that applicant. `SCORE` must be a non-negative integer. |
+
+*it is mandatory if and only if it is the only field used in the command.
+
+**Notes regarding `edit` command:**
+* At least one of the optional fields must be provided.
+* Existing attributes will be updated to the parameters.
+* There is a way to edit tags to an existing applicant and their categories at the same time. Look at the notes for editing tags with categories `t/[CATEGORY] TAGNAME` for more details.
+
+
+
+**Tip:** Editing an applicant's details will trigger a refresh of the view. This means that the view will be updated to reflect the latest changes to the data for that particular applicant.
+
+
+**Editing tags of an applicant? Take note of the following**:
+* When editing the tags of a specific applicant, the existing tags of the applicant will be removed i.e. adding of tags is **not** cumulative.
+ You will have to re-tag the applicant with the existing tags and the new tags.
+* Doing `edit INDEX /t` removes the tags of the applicant at that index.
+* If you used a tag that has not been created using `create` in an `edit` command, the tag would still be added to the applicant, but it would be _uncategorized_.
+* If you have **multiple tags in different categories with the same name**, you must **specify the category** when you want to tag the specified applicant with one of these tags e.g. `edit INDEX t/CATEGORY DUPLICATETAGNAME`
+
+
+
+
Advanced
-### Viewing help : `help`
-Shows a message explaning how to access the help page.
+* If you still would like to tag an applicant that has **not** been created, but you do not want this tag to be _uncategorized_, you can do so by doing
+`edit INDEX t/CATEGORY TAGNAME`.
-![help message](images/helpMessage.png)
+
-Format: `help`
+**Caution:**
+If you tag a person with a tag that has not been categorised yet without specifying the category i.e. `edit 1 t/UNCATEGORIZEDTAG`, and then you created that same tag with a specific category using `create`,
+you need to re-tag the person with the same tag name again in order to overwrite the previous uncategorized tag with the categorized tag.
+This is because, `create` only creates **new** categorized tags. It does **not** categorize existing tags when you do `create t/CATEGORY EXISTINGTAGNAME`
+
-### Adding a person: `add`
+**Editing the score of an applicant? Take note of the following**:
+* The `TAG` in `sc/TAGNAME SCORE` must be a tag of the category `assessment`. You cannot use the `sc/TAG SCORE` field for tags that are not of the `assessment` category.
+* The `SCORE` in `sc/TAG SCORE` is non-negative, that is `SCORE` must be more than or equal to 0.
+* To clear a tag's score, just re-tag it with the same tag name, but without using the `sc/TAG SCORE` field e.g. `edit 1 t/SCORETAG`
+* You can only edit the score of an applicant i.e. `edit INDEX sc/TAGNAME SCORE` if they have been tagged with the assessment-related `TAGNAME`.
-Adds a person to the address book.
-Format: `add n/NAME p/PHONE_NUMBER e/EMAIL a/ADDRESS [t/TAG]…`
-
:bulb: **Tip:**
-A person can have any number of tags (including 0)
+
+
Advanced
-Examples:
-* `add n/John Doe p/98765432 e/johnd@example.com a/John street, block 123, #01-01`
-* `add n/Betsy Crowe t/friend e/betsycrowe@example.com a/Newgate Prison p/1234567 t/criminal`
-### Listing all persons : `list`
+* You can also tag the applicant and edit their score **at the same time** by doing `edit INDEX t/TAGNAME sc/TAGNAME SCORE`.
+* Note that the tag has to have already been created using `create` with the category `assessment`. You **cannot** do this with a tag that hasn't been created even if you specified its category _assessment_ i.e. `edit INDEX t/assessment interview1 sc/interview1 100` does **NOT**
+work. This is because, you cannot create tag and edit score at the same time as editing score relies on the fact that the tag has already existed.
-Shows a list of all persons in the address book.
+
-Format: `list`
+**How is creating tags using `edit` different from `create`?**
+
+Both will create categorized tags and add them to the tag list but `create` serves the singular purpose of creating categorized tags, while the main purpose of `edit`
+is to _edit_ the details of an applicant which includes tags.
+
+The reason why we've allowed you to create tags in the event you use `edit` with a tag that
+hasn't been created is for the sake of convenience (i.e. if you had forgotten to create the tag, it would still be added to the applicant you were editing).
+
+Nonetheless, we **strongly recommend you to use `create` to create categorized tags** if your only intention is to _create tags_.
+
-### Editing a person : `edit`
-Edits an existing person in the address book.
+**An example of the `edit` command being successfully executed:**
+1. Enter the command `edit 1 n/Alex Ho p/91234567` (**edits name and phone number**)
+2. This is the result of the successful `edit` command (Take note that command entered will not be shown in the result):
+
+ ![Edit-Success](images/edit-command-success.png)
+
-Format: `edit INDEX [n/NAME] [p/PHONE] [e/EMAIL] [a/ADDRESS] [t/TAG]…`
-* Edits the person at the specified `INDEX`. The index refers to the index number shown in the displayed person list. The index **must be a positive integer** 1, 2, 3, …
-* 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.
+**An example of the `edit` command being successfully executed with tags and score:**
+1. Ensure that you have created a tag `Interview` under the `assessment` category using the `create` command. Enter the command `create t/assessment Interview`
+2. Enter the command `edit 1 t/Interview sc/Interview 80` (**edits tag and score**)
+3. This is the result of the successful `edit` command (Take note that command entered will not be shown in the result):
+
+ ![Edit-Success](images/edit-command-with-stats-success.png)
+
+
+**An example of the `edit` command being successfully executed to clear a tags and score:**
+1. Enter the command `edit 1 t/` (**Clear all tags**)
+2. This is the result of the successful `edit` command (Take note that command entered will not be shown in the result):
+
+ ![Edit-Success](images/edit-command-clear-tags-success.png)
+
+
+**Failed to edit an applicant's details? Here are some possible reasons why**
+
+| Reason for Error | Error Message | Remedy / Suggested course of action |
+|----------------------------------------------------------------------------------|--------------------------------------------------------------------------------------------------------------------------------|-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------|
+| Missing edit keyword: `edit` | Unknown command | Follow the command format of `edit INDEX [n/NAME] [p/PHONE] [e/EMAIL] [a/ADDRESS] [t/TAGNAME]… [sc/TAGNAME SCORE]` closely |
+| Missing Index | Invalid command format! | Ensure that the index is filled up. |
+| Invalid Index | The person index provided is invalid | Ensure that the index is a valid number on the displayed applicant list. |
+| Missing at least one of the field | At least one field to edit must be provided. | Ensure that at least one of the field is filled up and to be changed. |
+| Duplicate name | This person already exists in the address book | Ensure that the name of the applicant is unique. That is, you cannot add the same name twice. Use some form of extra identification like a number |
+| Invalid phone number | Phone numbers should only contain numbers, and it should be at least 3 digits long | Ensure that the phone number only contains numbers and should be at least 3 digits long |
+| Invalid email | Emails should be of the format local-part@domain and adhere to the following constraints: ... | Ensure that the prefix and domain of the email is correct, following the constraints stated by the error |
+| Invalid tag name | Tag names should only contain alphanumeric characters and should not be blank | Ensure that the tag name only contains alphanumeric characters and should not be blank |
+| Multiple prefixes of the same type being used (does not apply to tag prefix `t`) | Multiple values specified for the following single-valued field(s): `prefix/` | Remove the duplicate prefix. The command should only have 1 of every prefix except for `t/` |
+| Missing score for tag | Invalid score, score must be non-negative integer. | Ensure that the score is filled up and is separated from the `TAGNAME` by a whitespace (NOT commas). |
+| Invalid tag to attach score | Invalid score tag, tag must a tag of the category assessment and must exist on the applicant | Ensure that the tag is of the category assessment and it exists on the applicant. If it's the wrong category, use `create` i.e. `create t/assessment TAGNAME` to firstly create the categorized tag. If it is not tagged to the person use `edit` i.e. `edit INDEX t/TAGNAME` |
+| Missing valid score-tag on applicant | The tag does not exist, cannot attach a score to it | Ensure that the applicant has the tag and it is of category `assessment`, this is what is considered a valid score-tag. This is done by creating an `assessment` category for the tag name using `create` and update tag using `edit INDEX t/TAGNAME ...` |
+| Tag ambiguity | Multiple tags exists with the same name! Specify the category of the tag when adding it to a person e.g. edit 1 t/experience 3 | Specify the category of the tag you want to add in the field e.g.`edit INDEX t/CATEGORY DUPLICATETAGNAME` |
+
+
+[Jump back to Table of Contents](#table-of-contents)
+
+#### Deleting job applicants: `delete`
+
+
+Deletes the specified job applicants from the address book.
+
+Format: `delete INDEX`
+
+| Type | Field | Constraints |
+|-----------|---------|-------------------------------------------------------------------------------------------------------------------------|
+| Mandatory | `INDEX` | `INDEX` must be a non-zero unsigned integer and must also not be greater than the total number of applicants in JABPro. |
+
+Format: `delete (t/TAGNAME... st/STATUS...)`
+
+| Type | Field | Constraints |
+|------------|-------------|------------------------------------------------------------------------------|
+| Mandatory* | `t/TAGNAME` | `TAGNAME` must be alphanumeric and contains no spaces. |
+| Mandatory* | `st/STATUS` | `STATUS` must either be `preliminary`, `interviewed`, `offered`, `rejected`. |
+
+*it is mandatory if and only if it is the only field used in the command.
+
+**Note:**
+* User **cannot** delete by index and delete by tags & status in a single command.
+ E.g. `delete 1 t/hardworking` is **not** allowed.
+* `delete` by tags & status requires at least ONE delete parameter i.e. `st/STATUS`, or `t/TAGNAME`.
+* Each prefix can only be used at most once.
+* Multiple delete parameters for a specific category are divided by spaces (not commas!) i.e. `delete st/preliminary interviewed`
+* Delete parameters are case-insensitive i.e. doing `delete t/interN` is the same as `delete t/intern`
+
+
+
+
Advanced
+
+
+
+
+**Note:**
+* You can combine multiple delete categories in a single `delete` command e.g. `delete st/interviewed t/intern`
+
+**An example of **delete by index** command being successfully executed:**
+1. Enter the command `delete Bernice`
+
+ ![delete-by-index-pre](images/delete-by-index-pre.png)
+
+2. Enter the command `delete 1`
+
+ ![delete-by-index-success](images/delete-by-index-success.png)
+
+Similarly, here are some examples of **delete by tags & status** command being successfully executed:
+
+Assuming this as the data after executing `list`:
+![delete-by-tags-status-pre](images/delete-by-tags-status-pre.png)
+
+1. `delete t/marketing software`
+
+ ![delete-by-tags-status-pre](images/delete-by-tags-status-1.png)
+
+ The above `delete` command deleted all applicants whose tags match ANY of the given keywords. This is because
+ `delete` does an `OR` search **within a specific category**.
+
+2. `delete st/interviewed t/software`
+
+ ![delete-by-tags-status-pre](images/delete-by-tags-status-2.png)
+
+ The above `delete` command only deleted Bernice because `delete` does an `AND` search **across multiple categories**.
+
+
+
+**What does it mean to do an `OR` delete within a single category and an `AND` delete across multiple categories?**
+
+It's best to explain this by breaking down an example `delete` command!
+`delete st/interviewed rejected t/intern manager` will delete applicants whose:
+* status is either **interviewed** `OR` **rejected**
+* `AND` has a tag `intern` or `manager`.
+
+
+
+**Failed to execute the `delete` command? Here are some possible reasons why**
+
+| Reason for Error | Error Message | Remedy / Suggested course of action |
+|-------------------------------------------------------------------------------------------------------------|------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------|-------------------------------------------------------------------------------------------------------------------|
+| Missing delete keyword | Unknown command! | Follow the command format `delete INDEX` OR `delete (st/STATUS... t/TAGNAME...)` |
+| Missing delete categories e.g. `delete` | Invalid command format! | Make sure you include **at least one** of the delete categories i.e. `/st`, `/t`. |
+| Invalid INDEX e.g. `delete 0`, `delete -1` | Invalid command format! | Make sure `INDEX` is a positive integer. |
+| Invalid status e.g. `delete st/in`, `delete st/` | Status should be either one of the following: 'Preliminary','Interviewed', 'Offered', 'Rejected' and it should not be blank. | Check that the `status` is one of the following: `preliminary`, `interviewed`, `rejected`, `offered`. |
+| Invalid tag e.g. `delete t/intern@`, `delete t/` | Tags names should be alphanumeric. | Ensure that `tag` does not contain any non alphanumeric characters such as &, $, @, -, %, *, _, empty space, etc. |
+| Multiple prefixes of the same category being used e.g. `delete t/intern t/manager` | Multiple values specified for the following single-valued field(s): `prefix/`. | Remove the duplicate prefix. The command should only have at most **one** of every prefix. |
+| Using commas as delimiters of different parameters instead of spaces e.g. `delete t/intern, manager` | Status should be either one of the following: 'Preliminary','Interviewed', 'Offered', 'Rejected' and it should not be blank Tags names should be alphanumeric. | Remove the comma(s) e.g. `delete t/intern manager` |
+| Using commas as delimiters of different parameters instead of spaces e.g. `delete st/interviewed, t/intern` | Should display the error message for either invalid `status` or `tag` depending on the first prefix because it will consider the comma and anything that comes after it as part of the first prefix. | Remove the comma(s) e.g. `delete n/alex t/intern` |
+
+[Jump back to Table of Contents](#table-of-contents)
+
+
+--------------------------------------------------------------------------------------------------------------------
+### 3. Filtering and Listing Applicants
+
+
+#### Searching job applicants by category: `search`
+
+
+Finds job applicants whose profiles match the specified categories' keywords. The search categories are: name, status, tag.
+
+Format: `search (n/NAME... st/STATUS... t/TAGNAME...)`
+
+| Type | Field | Constraints |
+|------------|-------------|---------------------------------------------------------------------------------------------|
+| Mandatory* | `n/NAME` | `NAME` must be alphanumeric (Letters and numbers, no symbols allowed such as `/`, `,` ...). |
+| Mandatory* | `st/STATUS` | `STATUS` must either be `preliminary`, `interviewed`, `offered`, `rejected`. |
+| Mandatory* | `t/TAGNAME` | `TAGNAME` must be alphanumeric and contains no spaces. |
+
+*it is mandatory if and only if it is the only field used in the command.
+
+**Note**:
+* `search` requires at least ONE search parameter i.e. `n/NAME`, `st/STATUS`, or `t/TAGNAME`.
+* Each prefix can only be used at most once.
+* Multiple search parameters for a specific category are divided by spaces (not commas!) i.e. `search st/preliminary interviewed`
+* Search parameters are case-insensitive i.e. doing `search n/aLeX` is the same as `search n/alex`
+
+
+
+
Advanced
+
+
+
+
+**Note:**
+* You can combine multiple search categories in a single `search` command e.g. `search n/alex st/interviewed t/intern`
+
+**Here are some examples of **search** command being successfully executed:**
+1. Enter `search n/alex bernice`
+
+ ![search-success-1](images/search-success-1.png)
+
+ The above `search` command displayed all applicants whose name match ANY of the given keywords. This is because
+ `search` does an `OR` search **within a specific category**.
+
+2. Enter `search n/alex bernice st/interviewed t/intern`
+
+ ![search-success](images/search-success.png)
+
+ Notice how the above `search` command did not display "Alex" despite his profile matching
+ the `name` and `tag` categories. This is because `search` does an `AND` search **across multiple categories**.
+
+
+
+**What does it mean to do an `OR` search within a single category and an `AND` search across multiple categories?**
+It's best to explain this by breaking down an example `search` command!
+
+`search n/alex bernice st/interviewed t/intern` will output applicants whose:
+* names contain either Alex `OR` Bernice
+* `AND` status is either interviewed
+* `AND` has a tag `intern`
+
+
+
+**Failed to execute the `search` command? Here are some possible reasons why**
+
+| Reason for Error | Error Message | Remedy / Suggested course of action |
+|-----------------------------------------------------------------------------------------------------|-----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------|--------------------------------------------------------------------------------------------------------------------------------------------------------|
+| Missing search keyword | Unknown command! | Follow the command format `search (n/NAME... st/STATUS... t/TAGNAME...)` |
+| Missing search categories e.g. `search` | Invalid command format! | Make sure you include **at least one** of the search categories i.e. `/n`, `/st`, `/t`. |
+| Invalid name e.g. `search n/alex@`, `search n/` | Names should only contain alphanumeric characters and spaces, and it should not be blank. | Ensure that `name` does not contain any non-alphanumeric characters such as &, $, @, -, %, *, _, etc. |
+| Invalid status e.g. `search st/in`, `search st/` | Status should be either one of the following: 'Preliminary','Interviewed', 'Offered', 'Rejected' and it should not be blank. | Check that the `status` is one of the following: `preliminary`, `interviewed`, `rejected`, `offered`. Enter the command again with any of the 4 metric |
+| Invalid tag e.g. `search t/intern@`, `search t/` | Tags names should be alphanumeric. | Ensure that `tag` does not contain any non alphanumeric characters such as &, $, @, -, %, *, _, empty space, etc. |
+| Multiple prefixes of the same category being used e.g. `search n/alex n/bernice` | Multiple values specified for the following single-valued field(s): `prefix/`. | Remove the duplicate prefix. The command should only have at most **one** of every prefix. |
+| Using commas as delimiters of different parameters instead of spaces e.g. `search n/alex, bernice` | Names should only contain alphanumeric characters and spaces, and it should not be blank Status should be either one of the following: 'Preliminary','Interviewed', 'Offered', 'Rejected' and it should not be blank Tags names should be alphanumeric. | Remove the comma(s) e.g. `search n/alex yeoh` |
+| Using commas as delimiters of different parameters instead of spaces e.g. `search n/alex, t/intern` | Should display the error message for either invalid `name`, `status`, or `tag` depending on the first prefix because it will consider the comma and anything that comes after it as part of the first prefix. | Remove the comma(s) e.g. `search n/alex t/intern` |
+
+[Jump back to Table of Contents](#table-of-contents)
-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.
+#### Filter job applicants by statistics: `filter`
+
-### Locating persons by name: `find`
+Filters and display applicants in the current displayed applicant list using statistical metrics and values.
+
+In essence, this allows you to find job applicants whose performance rating is above a certain percentile, score or mean/median score for that tag.
+
+Ideally, this feature can then be used to find the best applicants easily and quickly without having to manually look through the list of applicants.
-Finds persons whose names contain any of the given keywords.
+Format:`filter t/TAGNAME met/METRIC val/VALUE` or `filter t/TAGNAME met/METRIC`
-Format: `find KEYWORD [MORE_KEYWORDS]`
+| Type | Field | Constraints |
+|------------|--------------------|---------------------------------------------------------------------------------------------------|
+| Mandatory | `t/TAGNAME` | `TAGNAME` must be a tag that is of the category `assessment`. |
+| Mandatory | `met/METRIC` | `METRIC` must be either `score`, `percentile`, `mean`, `median`. |
+| Mandatory* | `val/VALUE` | `VALUE` must be a non-negative integer and is a mandatory field only for `score` and `percentile` |
-* The search is case-insensitive. e.g `hans` will match `Hans`
-* The order of the keywords does not matter. e.g. `Hans Bo` will match `Bo Hans`
-* Only the name is searched.
-* Only full words will be matched e.g. `Han` will not match `Hans`
-* Persons matching at least one keyword will be returned (i.e. `OR` search).
- e.g. `Hans Bo` will return `Hans Gruber`, `Bo Yang`
+*`val/VALUE` is an **optional** field for `mean` and `median`
-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`
+* For `METRIC` that is `score` or `percentile`, `filter` displays job applicants whose **value** is **greater than or equal** to the specified value for the specified statistic metric.
+* For `METRIC` that is `mean` or `median`, the `VALUE` is optional. Specifying a `VALUE` here will be ignored accordingly. `filter t/TAGNAME met/METRIC` is equivalent to `filter t/TAGNAME met/METRIC val/X` where `X` is any positive integer.
+* Do look at the [Summary Statistics](#summary-statistics) section for more details on the summary statistics metrics.
+
-Deletes the specified person from the address book.
+**Notes:**
+* Filter works only on the **current list of job applicants displayed**. It is **essential** that you enter `list` before using `filter` to ensure that you are filtering the correct list of job applicants.
+* Filter does not edit, update or in any way change the data of the job applicants. It only filters and displays the job applicants.
+* Filter does not trigger view, that is your view panels represent the previous applicant you viewed before filtering.
+* To get back the **original list with all the applicants**, simply type `list` again.
-Format: `delete INDEX`
+
-* Deletes the person at the specified `INDEX`.
-* The index refers to the index number shown in the displayed person list.
-* The index **must be a positive integer** 1, 2, 3, …
+You should use `filter` after you have tagged most of the job applicants with a tag that has a score.
+This is because some metrics such as `percentile`, `mean` and `median` require a certain number of scores to be considered meaningful.
+Read more about this in the [Summary Statistics](#summary-statistics) section.
-Examples:
-* `list` followed by `delete 2` deletes the 2nd person in the address book.
-* `find Betsy` followed by `delete 1` deletes the 1st person in the results of the `find` command.
+
-### Clearing all entries : `clear`
+Set up for examples when you first start JABPro with default data:
+1. `list`
+2. `create t/assessment interview` to create a tag `interview` under the `assessment` category.
+3. `edit 1 t/interview sc/interview 80`
+4. `edit 2 t/interview sc/interview 90`
+5. `edit 3 t/interview sc/interview 70`
+6. The result of the above commands should look like this:
-Clears all entries from the address book.
+ ![Filter-Setup](images/filter-setup.png)
+
+
+
+**An example of the `filter` command being successfully executed:**
+1. Enter the command `list`
+2. Enter the command `filter t/interview met/percentile val/80` (**Filter by percentile**)
+3. This is the result of the successful `filter` command (Take note that command entered will not be shown in the result):
+
+ ![Filter-Success](images/filter-command-success.png)
+
+
+
+**An example of the `filter` command being successfully executed with `median`:**
+1. Enter the command `list`
+2. Enter the command `filter t/interview met/median` (**Filter by median**)
+3. This is the result of the successful `filter` command (Take note that command entered will not be shown in the result):
+
+ ![Filter-Success](images/filter-command-median-success.png)
+
+
+**Failed to execute the `filter` command? Here are some possible reasons why:**
+
+| Reason for Error | Error Message | Remedy / Suggested course of action |
+|-----------------------------------------------|--------------------------------------------------------------------------------------------|----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------|
+| Missing filter keyword: `filter` | Unknown command! | Follow the command format strictly of `filter t/TAGNAME met/METRIC val/VALUE` for score and percentile or `filter t/TAGNAME met/METRIC` for mean or median. |
+| Missing parameters | Incomplete parameter inputs. t/TAG and met/SCORE are compulsory fields. | Enter the command again with the correct parameters. |
+| Tag missing on applicants | Tag does not exist! | Check that the tag is used on at least one applicant and that the tag is a `assessment` tag also. Add the tag to the applicants using `edit` |
+| Invalid tag name | Invalid tag provided. Needs to be non-empty name | Check that the tag name is not empty and is alphanumeric (a valid tag name) and does not contain space. Additionally, the tag must already have a category of `assessment`, ensure this by using `listT` | | | | | |
+| Invalid metric | Invalid metric provided. Needs to be one of: score, mean, median, percentile | Check that the metric is one of the following: `score`, `mean`, `median`, `percentile` and that it is spelt correctly. Enter the command again with any of the 4 metric |
+ | Invalid value | Invalid value provided. Needs to be a non negative integer that is more than or equal to 0 | Check that the value is a non-negative integer that is more than or equal to 0. Enter the command again with the correct value. |
+ | Missing value | val/VALUE is missing, it is compulsory. | Enter a value for `val/VALUE` since the metric requires it. |
+| Multiple prefixes of the same type being used | Multiple values specified for the following single-valued field(s): `prefix/` | Remove the duplicate prefix. The command should only have 1 of every prefix |
+
+[Jump back to Table of Contents](#table-of-contents)
+
+
+#### Listing all applicant: `list`
+
+
+Shows a list of all applicants in JABPro
+
+Format:
+`list [so/ATTRIBUTE]`
+
+| Type | Field | Constraints |
+|----------|----------------|-----------------------------------------------|
+| Optional | `so/ATTRIBUTE` | `ATTRIBUTE` must either be `name` or `email`. |
+
+**Note:**
+* Attribute is case-insensitive: `list so/NAME` and `list so/name` return the same result.
+* The result will be sorted in **ascending** order.
+* The sorting algorithm is case-sensitive, which means it will treat uppercase and
+ lowercase letters as distinct. This may result in names being sorted as A B C a b c, rather than A a B b C c.
+
+[Jump back to Table of Contents](#table-of-contents)
+
+
+--------------------------------------------------------------------------------------------------------------------
+
+### 4. Managing Events
+
+
+#### Adding an Event: `event`
+
+
+Adds an event, associated with an applicant, to JABPro.
+
+Format: `event INDEX d/DESCRIPTION bt/BEGIN_TIME et/END_TIME`
+
+| Type | Field | Constraints |
+|------------|-----------------|---------------------------------------------------------------------------------------------------------------------|
+| Mandatory | `INDEX` | `INDEX` must be a non-zero unsigned integer and it must not be greater than the total number of applicant in JABPro |
+| Mandatory | `d/DESCRIPTION` | `DESCRIPTION` must be a string value. Only the prefix (i.e. `d/`) is mandatory. |
+| Mandatory | `bt/BEGIN_TIME` | `BEGIN_TIME` must be a valid date-time, in the format `yyyy-MM-dd HH:mm` |
+| Mandatory | `et/END_TIME` | `END_TIME` must be a valid date-time, in the format `yyyy-MM-dd HH:mm`, and after the `BEGIN_TIME` |
+
+**Note:**
+
+* JABPro allows the addition of multiple events associated with the same applicant, having the same description. It is up to the user to provided detailed descriptions to distinguish events from one another.
+* Events added to JABPro can also be found in the `data/eventbook.json` file. Existing events are also read from the file when JABPro starts up.
+* Events with empty `DESCRIPTION`s can also be added. However, the prefix `d/` must still be present.
+
+**Example of successful execution of `event` command:**
+
+1. Enter the command `event 1 d/Interview bt/2023-11-12 10:00 et/2023-11-12 12:00`
+2. This is the result of the successful `event` command [It is assumed an applicant called Alex Yeoh exists in JABPro]:
+
+![Event](images/event.png)
+
+The changes in UI take place in the `Events Window`. Please find more details in [Viewing Events](UserGuide.md#viewing-events-schedule).
+
+**Failed to execute teh `event` command? Here are some possible reasons why:**
+
+| Reason for Error | Error Message | Remedy / Suggested course of action |
+|-------------------------------------------|--------------------------------------|-----------------------------------------------------------------------------------------------------------|
+| Missing event keyword: `event` | Unknown command | Follow the command format of `event INDEX d/DESCRIPTION bt/START_TIME et/END_TIME` closely |
+| Missing Index | Invalid command format! | Ensure that the index is filled up. |
+| Invalid Index | The person index provided is invalid | Ensure that the index is valid. That is it is a number that is on the displayed applicant list. |
+| Negative or 0 Index | Invalid command format! | Ensure that the index is a positive integer and is also a number that is on the displayed applicant list. |
+| Missing description | Invalid command format! | Ensure that the description is filled up |
+| Missing start time | Invalid command format! | Ensure that the start time is filled up |
+| Missing end time | Invalid command format! | Ensure that the end time is filled up |
+| Start time/End time not in correct format | Date is not in correct format! | Ensure that the start time/end time is in yyyy-MM-dd format |
+| Start time/End time not a valid date-time | Date entered is invalid! | Ensure that the start time/end time is a semantically valid date |
+| End time before or same as start time | End time must be after start time! | Ensure that the end time is after the start time | | |
+
+[Jump back to Table of Contents](#table-of-contents)
+
+#### Viewing events: `schedule`
+
+
+Displays all events that have been added to JABPro.
+
+Format: `schedule`
+
+**Note:**
+
+* `schedule` command will open the `Events` window regardless of whether there are events in JABPro or not.
+* Any set of characters added after the `schedule` keyword will be ignored. E.g.: `schedule a1b2c3`
+
+
+
+**Tip:** The `Events` window can also be accessed by clicking `Events > Events` in the menu bar, located at the top of the window.
+
+
+
+**Example of successful execution of `schedule` command:**
+
+1. Enter the command `schedule`
+2. This is the result of the successful `schedule` command [It is assumed that an event was previously added using the command `event 1 d/Interview bt/2023-11-12 10:00 et/2023-11-12 12:00]:
+
+![Schedule](images/schedule.png)
+
+The `Events` window opens up:
+
+![EventWindow](images/eventwin.png)
+
+There is no possibility of a "failed" execution of the `schedule` command.
+
+[Jump back to Table of Contents](#table-of-contents)
+
+
+--------------------------------------------------------------------------------------------------------------------
+### 5. Others
+
+
+#### Exporting the existing data to csv: `export`
+
+
+Format: `export`
+
+Exports the entries into a .csv file located in the current directory as (/data/export.csv)
+
+**Note:**
+* Export only exports the following: Name, Phone, Email, Address, Tags, Linkedin, Github, Remark, Status.
+* JABPro must have write permissions, this means that if the .csv file is open,
+ exporting again will not be possible.
+
+**Examples:**
+* `export` exports the data to /data/export.csv
+
+[Jump back to Table of Contents](#table-of-contents)
+
+#### Clearing all entries: `clear`
+
+
+Clears all entries from JABPro - including applicants and events.
Format: `clear`
-### Exiting the program : `exit`
+**Note:**
+
+* Usage of the `clear` command empties all records, not only in the current running instance of JABPro, but from the `json` files as well where the data is written to/read from. Hence, a subsequent launch of JABPro will display an empty application.
+* `clear` command can be invoked on an already empty instance of JABPro as well, without any errors being raised. There is no effect of running this command.
+
+**Example of the successful execution of the `clear` command:**
+
+![Clear](images/clear.png)
+
+[Jump back to Table of Contents](#table-of-contents)
+
+#### Exiting the program: `exit`
+
Exits the program.
Format: `exit`
+[Jump back to Table of Contents](#table-of-contents)
+
+
+
+--------------------------------------------------------------------------------------------------------------------
+## Additional information
+
+
+
+
Advanced
+
+
+
+
+### Summary Statistics
+
+Summary Statistics is a table generated by JABPro that displays the following information about an applicant:
+It is generated for tags that are categorised under the `assessment` category.
+
+| Statistic / Metric | Description |
+|--------------------|-----------------------------------------------|
+| `score` | The score of the applicant for the tag. |
+| `mean` | The mean score of applicant with that tag. |
+| `median` | The median score of applicant with that tag. |
+| `minimum` | The minimum score of applicant with that tag. |
+| `maximum` | The maximum score of applicant with that tag. |
+| `percentile` | The percentile of the applicant for that tag. |
+
+
+
+You should ensure that you have **sufficient candidates of more than 20** with a score for the tag you are interested in, before using the summary statistics to make comparisons.
+
+
+**Notes on why you should have sufficient applicants with a score for the tag you are interested in:**
+* This is due to the fact that these summary statistics rely on concepts such as mean, median and percentile, which are statistical concepts that require a sufficient sample size to be meaningful.
+* For example, if you have only assigned 5 out of 100 applicants, the summary statistics will not be representative of the actual mean, median and percentile for that tag.
+* In this case, you should assign more applicants with a score for that tag, before using the summary statistics to make comparisons.
+* If you have assigned a sufficient number of applicants with a score for that tag, you can use the summary statistics to make comparisons. For example, you want to check if an applicant's score for a tag is more than or equal to half of all the applicant who have a score for that tag, you can use the median to make this comparison.
+* A **sufficient number** could be deemed as **any number that is more than 20**, but this is not a hard and fast rule. You should use your own discretion to determine if the number of applicant with a score for that tag is sufficient.
+
+
+
+**Tip:**
+1. Use mostly `median` and `percentile` to make your judgement on the performance of an applicant.
+2. `median` to find applicants who are the better performing half
+3. `percentile` as where this applicant stands among all other applicants (treat it like a ranking system, the higher the percentile, the better the applicant is performing)
+
+
+
+
Advanced
+
+
+
+
+**Note**:
+* Understand that `percentile` has limited functionality in some context. This is because if two applicants have the same score, they are `rank` the same. This means that the percentile of both applicants will be the same.
+ * If all applicants have the same score, their percentile will all be 0.0. This is because they are all `rank` the same.
+ * Additionally, when the spread of scores is small, the percentile will not be able to differentiate between applicants with similar scores.
+
+**Formula used to calculate the summary statistics:**
+* **mean** is calculated by using the formula `sum of all scores with that tag / number of applicants with that tag`
+* **median** is calculated by using the formula `middle score of all scores with that tag`
+* **minimum** is calculated by using the formula `lowest score of all scores with that tag`
+* **maximum** is calculated by using the formula `highest score of all scores with that tag`
+* **percentile** is calculated by using the formula `number of applicants with a score strictly lower than the applicant / total number of applicants with that tag`
+
+[Jump back to Table of Contents](#table-of-contents)
+
### Saving the data
-AddressBook data are saved in the hard disk automatically after any command that changes the data. There is no need to save manually.
+JABPro data are saved in the hard disk automatically after any command that changes the data. There is no need to save manually.
### Editing the data file
-AddressBook data are saved automatically as a JSON file `[JAR file location]/data/addressbook.json`. Advanced users are welcome to update data directly by editing that data file.
+JABPro data are saved automatically as a JSON file `[JAR file location]/data/addressbook.json`. Advanced users are welcome to update data directly by editing that data file.
-
: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. Hence, it is recommended to take a backup of the file before editing it.
-
+
-### Archiving data files `[coming in v2.0]`
+**Caution:**
+If your changes to the data file makes its format invalid, JABPro will discard all data and start with an empty data file at the next run. Hence, it is recommended to take a backup of the file before editing it.
+
-_Details coming soon ..._
+[Jump back to Table of Contents](#table-of-contents)
--------------------------------------------------------------------------------------------------------------------
## FAQ
+**Q**: What would happen if I used JABPro for the first time without the sample data? Would the app break?
+**A**: Not necessarily, we've tested out the JABPro launch without any sample data and basic functionalities are working fine. However,
+we do not recommend this because there could be unexpected behaviours that we might have not accounted for. It is always advisable to follow
+the [quickstart instructions](#quick-start) and launch JABPro with the sample data!
+
**Q**: How do I transfer my data to another Computer?
-**A**: Install the app in the other computer and overwrite the empty data file it creates with the file that contains the data of your previous AddressBook home folder.
+**A**: Install the app in the other computer and overwrite the empty data file it creates with the file that contains the data of your previous JABPro home folder.
---------------------------------------------------------------------------------------------------------------------
+[Jump back to Table of Contents](#table-of-contents)
-## Known issues
-1. **When using multiple screens**, if you move the application to a secondary screen, and later switch to using only the primary screen, the GUI will open off-screen. The remedy is to delete the `preferences.json` file created by the application before running the application again.
+
--------------------------------------------------------------------------------------------------------------------
-## Command summary
-
-Action | Format, Examples
---------|------------------
-**Add** | `add n/NAME p/PHONE_NUMBER e/EMAIL a/ADDRESS [t/TAG]…` e.g., `add n/James Ho p/22224444 e/jamesho@example.com a/123, Clementi Rd, 1234665 t/friend t/colleague`
-**Clear** | `clear`
-**Delete** | `delete INDEX` e.g., `delete 3`
-**Edit** | `edit INDEX [n/NAME] [p/PHONE_NUMBER] [e/EMAIL] [a/ADDRESS] [t/TAG]…` e.g.,`edit 2 n/James Lee e/jameslee@example.com`
-**Find** | `find KEYWORD [MORE_KEYWORDS]` e.g., `find James Jake`
-**List** | `list`
-**Help** | `help`
+## Command Summary
+
+| Action | Format, Examples |
+|--------------------------|-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------|
+| **Add** | `add n/NAME p/PHONE_NUMBER e/EMAIL a/ADDRESS [t/[CATEGORY] TAGNAME]…` e.g., `add n/James Ho p/22224444 e/jamesho@example.com a/123, Clementi Rd, 1234665 t/developer t/intern` |
+| **Remark** | `remark r/REMARK` e.g., `remark 1 r/Great attitude, hardworking` |
+| **Add LinkedIn/Github** | `addL INDEX u/USERNAME` or `addG INDEX u/USERNAME` e.g., `addL 1 u/alex-yeoh`, `addG 2 u/bernicesanders123` |
+| **Open LinkedIn/Github** | `linkedin INDEX` or `github INDEX` e.g., `linkedin 1`, `github 2` |
+| **Set** | `set INDEX STATUS` e.g., `set 2 Interviewed` |
+| **View** | `view INDEX` e.g., `view 1` |
+| **Edit** | `edit INDEX [n/NAME] [p/PHONE_NUMBER] [e/EMAIL] [a/ADDRESS] [t/TAGNAME] [sc/TAGNAME SCORE]` e.g.,`edit 2 n/James Lee e/jameslee@example.com t\MarketingInterview sc\MarketingInterview 50` |
+| **Delete** | `delete INDEX` or `delete (t/TAGNAME... st/STATUS...)` e.g., `delete 3`, `delete t/intern st/rejected` |
+| **Create** | `create t/CATEGORY NAME…` e.g. `create t/dept software` |
+| **ListT** | `listT` |
+| **Search** | `search (n/NAME... st/STATUS... t/TAGNAME...)` e.g., `search n/alex` |
+| **Filter** | `filter t/TAGNAME met/METRIC val/VALUE` e.g., `filter t/interview met/score val/80` |
+| **List** | `list so/ATTRIBUTE` e.g. `list so/name` |
+| **Event** | `event INDEX d/DESCRIPTION bt/START_TIME et/END_TIME` |
+| **Schedule** | `schedule` |
+| **Help** | `help` |
+| **Export** | `export` |
+| **Clear** | `clear` |
+
+[Jump back to Table of Contents](#table-of-contents)
+
+## Prefix Summary
+
+| Prefix | Description | Commands | Constraint |
+|--------|--------------|-----------------------------------|-------------------------------------------------------------------------------------------------------------------|
+| `n/` | Name | Add, Edit, Search | Must be alphanumeric (Letters and numbers, no symbols allowed such as `/`, `,` ...). |
+| `p/` | Phone Number | Add, Edit | Must contain numbers only and should be at-least 3 digits long. |
+| `e/` | Email | Add, Edit | Must be the standard email address format (There must be an email-prefix followed by @ symbol and email domain). |
+| `a/` | Address | Add, Edit | can be any value, including special characters such as `#`, `,` ... |
+| `t/` | Tag | Add, Edit, Search, Create, Delete | Must be alphanumeric with no spaces. Any details after the space will be ignored. |
+| `sc/` | Score | Edit | Must be a non-negative integer. |
+| `st/` | Status | Search, Delete, Set | Must either be `preliminary`, `interviewed`, `offered`, `rejected`. |
+| `r/` | Remark | Remark | can be any value, including special characters such as `#`, `,` ... |
+| `u/` | Username | Add Github/LinkedIn | Must be a string value. |
+| `met/` | Metric | Filter | Must be either `score`, `percentile`, `mean`, `median`. |
+| `val/` | Value | Filter | Optional only for mean and median. Otherwise, must be a non-negative integer. |
+| `so/` | Sort | List | Must be either `name` or `email`. |
+| `d/` | Description | Event | Must be a string value. |
+| `bt/` | Begin Time | Event | Must be a valid date-time, in the format `yyyy-MM-dd HH:mm`. |
+| `et/` | End Time | Event | Must be a valid date-time, in the format `yyyy-MM-dd HH:mm`. |
+
+[Jump back to Table of Contents](#table-of-contents)
+
+## Glossary
+| Keyword | Definition |
+|--------------|-----------------------------------------------------------------------------------------|
+| Alphanumeric | Letters and numbers. Should NOT contain symbols, or whitespaces. |
+| Index | The index of the applicant of the currently displayed list in the applicant list panel. |
+| Parameter | Details about the job applicant that will be included in the command. |
+| Command | Instructions that `JABPro` will execute. |
+| JAR | Compressed file of `JABPro` that is in the form of a Java Archive. |
+
+[Jump back to Table of Contents](#table-of-contents)
diff --git a/docs/_config.yml b/docs/_config.yml
deleted file mode 100644
index 6bd245d8f4e..00000000000
--- a/docs/_config.yml
+++ /dev/null
@@ -1,15 +0,0 @@
-title: "AB-3"
-theme: minima
-
-header_pages:
- - UserGuide.md
- - DeveloperGuide.md
- - AboutUs.md
-
-markdown: kramdown
-
-repository: "se-edu/addressbook-level3"
-github_icon: "images/github-icon.png"
-
-plugins:
- - jemoji
diff --git a/docs/_data/projects.yml b/docs/_data/projects.yml
deleted file mode 100644
index 8f3e50cb601..00000000000
--- a/docs/_data/projects.yml
+++ /dev/null
@@ -1,23 +0,0 @@
-- name: "AB-1"
- url: https://se-edu.github.io/addressbook-level1
-
-- name: "AB-2"
- url: https://se-edu.github.io/addressbook-level2
-
-- name: "AB-3"
- url: https://se-edu.github.io/addressbook-level3
-
-- name: "AB-4"
- url: https://se-edu.github.io/addressbook-level4
-
-- name: "Duke"
- url: https://se-edu.github.io/duke
-
-- name: "Collate"
- url: https://se-edu.github.io/collate
-
-- name: "Book"
- url: https://se-edu.github.io/se-book
-
-- name: "Resources"
- url: https://se-edu.github.io/resources
diff --git a/docs/_includes/custom-head.html b/docs/_includes/custom-head.html
deleted file mode 100644
index 8559a67ffad..00000000000
--- a/docs/_includes/custom-head.html
+++ /dev/null
@@ -1,6 +0,0 @@
-{% comment %}
- Placeholder to allow defining custom head, in principle, you can add anything here, e.g. favicons:
-
- 1. Head over to https://realfavicongenerator.net/ to add your own favicons.
- 2. Customize default _includes/custom-head.html in your source directory and insert the given code snippet.
-{% endcomment %}
diff --git a/docs/_includes/head.html b/docs/_includes/head.html
deleted file mode 100644
index 83ac5326933..00000000000
--- a/docs/_includes/head.html
+++ /dev/null
@@ -1,12 +0,0 @@
-
-
-
-
-
-
-
- {%- include custom-head.html -%}
-
- {{page.title}}
-
-
diff --git a/docs/_includes/header.html b/docs/_includes/header.html
deleted file mode 100644
index 33badcd4f99..00000000000
--- a/docs/_includes/header.html
+++ /dev/null
@@ -1,36 +0,0 @@
-
-
-