diff --git a/.github/workflows/export-ug-to-pdf.yml b/.github/workflows/export-ug-to-pdf.yml
new file mode 100644
index 00000000000..5abb0a53a3f
--- /dev/null
+++ b/.github/workflows/export-ug-to-pdf.yml
@@ -0,0 +1,26 @@
+name: User Guide to PDF
+
+on:
+ push:
+ branches:
+ - master
+ paths:
+ - 'docs/UserGuide.md'
+
+jobs:
+ converttopdf:
+ name: Build PDF
+ runs-on: ubuntu-latest
+ steps:
+ - uses: actions/checkout@v2
+ - uses: baileyjm02/markdown-to-pdf@v1
+ with:
+ input_path: docs/UserGuide.md
+ output_dir: export
+ images_dir: docs/images
+ image_import: images
+ build_html: false
+ - uses: actions/upload-artifact@v3
+ with:
+ name: UserGuide
+ path: export/UserGuide.pdf
diff --git a/.gitignore b/.gitignore
index 71c9194e8bd..1b0f5264a24 100644
--- a/.gitignore
+++ b/.gitignore
@@ -20,3 +20,9 @@ src/test/data/sandbox/
# MacOS custom attributes files created by Finder
.DS_Store
docs/_site/
+
+# extra removals
+/hs_err_pid[0-9]*.log
+*.class
+.vscode
+bin/*
diff --git a/README.md b/README.md
index 13f5c77403f..402e266c6cf 100644
--- a/README.md
+++ b/README.md
@@ -1,14 +1,10 @@
-[](https://github.com/se-edu/addressbook-level3/actions)
+[](https://github.com/AY2223S1-CS2103T-T11-1/tp/actions)

-* 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.
+# Contactmation
+
+Contactmation is a **desktop, contact management application** that is **optimized for team management and delegation of tasks through the Command Line Interface** (CLI). Contactmation efficiently tracks progress of your team projects.
+
+* For the detailed documentation of this project, see the **[Contactmation Product Website](https://ay2223s1-cs2103t-t11-1.github.io/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 108397716bd..3c2112acab1 100644
--- a/build.gradle
+++ b/build.gradle
@@ -17,7 +17,7 @@ repositories {
}
checkstyle {
- toolVersion = '10.2'
+ setToolVersion('10.2')
}
test {
@@ -41,8 +41,15 @@ task coverage(type: JacocoReport) {
}
dependencies {
- String jUnitVersion = '5.4.0'
- String javaFxVersion = '11'
+ String javaFxVersion = '18.0.2'
+ String jUnitVersion = '5.7.0'
+
+ implementation group: 'com.fasterxml.jackson.core', name: 'jackson-databind', version: '2.7.0'
+ implementation group: 'com.fasterxml.jackson.datatype', name: 'jackson-datatype-jsr310', version: '2.7.4'
+
+ testImplementation group: 'org.junit.jupiter', name: 'junit-jupiter-api', version: jUnitVersion
+ testRuntimeOnly group: 'org.junit.jupiter', name: 'junit-jupiter-engine', version: jUnitVersion
+ testRuntimeOnly group: 'org.junit.jupiter', name: 'junit-jupiter-engine', version: jUnitVersion
implementation group: 'org.openjfx', name: 'javafx-base', version: javaFxVersion, classifier: 'win'
implementation group: 'org.openjfx', name: 'javafx-base', version: javaFxVersion, classifier: 'mac'
@@ -56,17 +63,15 @@ dependencies {
implementation group: 'org.openjfx', name: 'javafx-graphics', version: javaFxVersion, classifier: 'win'
implementation group: 'org.openjfx', name: 'javafx-graphics', version: javaFxVersion, classifier: 'mac'
implementation group: 'org.openjfx', name: 'javafx-graphics', version: javaFxVersion, classifier: 'linux'
-
- implementation group: 'com.fasterxml.jackson.core', name: 'jackson-databind', version: '2.7.0'
- implementation group: 'com.fasterxml.jackson.datatype', name: 'jackson-datatype-jsr310', version: '2.7.4'
-
- testImplementation group: 'org.junit.jupiter', name: 'junit-jupiter-api', version: jUnitVersion
-
- testRuntimeOnly group: 'org.junit.jupiter', name: 'junit-jupiter-engine', version: jUnitVersion
}
shadowJar {
- archiveFileName = 'addressbook.jar'
+ archiveFileName = 'contactmation.jar'
+}
+
+run {
+ standardInput = System.in
+ enableAssertions = true
}
defaultTasks 'clean', 'test'
diff --git a/docs/AboutUs.md b/docs/AboutUs.md
index 1c9514e966a..bdbf0ae7056 100644
--- a/docs/AboutUs.md
+++ b/docs/AboutUs.md
@@ -9,51 +9,52 @@ You can reach us at the email `seer[at]comp.nus.edu.sg`
## Project team
-### John Doe
+### Li Zhaoqi
-
+
-[[homepage](http://www.comp.nus.edu.sg/~damithch)]
-[[github](https://github.com/johndoe)]
-[[portfolio](team/johndoe.md)]
+[[github](https://github.com/Eclipse-Dominator)]
+[[portfolio](team/eclipse-dominator.md)]
-* Role: Project Advisor
+- Role: Developer
+- Responsibilities: System designer, complex commands
-### Jane Doe
+### Eric Lee Ying Yao
-
+
-[[github](http://github.com/johndoe)]
-[[portfolio](team/johndoe.md)]
+[[github](http://github.com/autumn-sonata)]
+[[portfolio](team/autumn-sonata.md)]
-* Role: Team Lead
-* Responsibilities: UI
+- Role: Developer
+- Responsibilities: Update storage components, database
-### Johnny Doe
+### Jason Christopher
-
+
-[[github](http://github.com/johndoe)] [[portfolio](team/johndoe.md)]
+[[github](http://github.com/jasonchristopher21)]
+[[portfolio](team/jasonchristopher21.md)]
-* Role: Developer
-* Responsibilities: Data
+- Role: Developer
+- Responsibilities: Attributes, data modeling
-### Jean Doe
+### Connor Shihern Lim
-
+
-[[github](http://github.com/johndoe)]
-[[portfolio](team/johndoe.md)]
+[[github](https://github.com/connlim)]
+[[portfolio](team/connlim.md)]
-* Role: Developer
-* Responsibilities: Dev Ops + Threading
+- Role: Developer
+- Responsibilities: Implement Tasks, Quality Assurance, Bug fixing
-### James Doe
+### Mohamed Safwan S/O Abdul Wahab Lukuman
-
+
-[[github](http://github.com/johndoe)]
-[[portfolio](team/johndoe.md)]
+[[github](http://github.com/mohamedsaf1)]
+[[portfolio](team/mohamedsaf1.md)]
-* Role: Developer
-* Responsibilities: UI
+- Role: Developer
+- Responsibilities: Group Functions, Code Quality and Code Integrity
diff --git a/docs/DeveloperGuide.md b/docs/DeveloperGuide.md
index 46eae8ee565..6f9924f69aa 100644
--- a/docs/DeveloperGuide.md
+++ b/docs/DeveloperGuide.md
@@ -5,61 +5,62 @@ title: Developer Guide
* Table of Contents
{:toc}
---------------------------------------------------------------------------------------------------------------------
+---
## **Acknowledgements**
-* {list here sources of all reused/adapted ideas, code, documentation, and third-party libraries -- include links to the original source as well}
+- {list here sources of all reused/adapted ideas, code, documentation, and third-party libraries -- include links to the original source as well}
---------------------------------------------------------------------------------------------------------------------
+---
## **Setting up, getting started**
Refer to the guide [_Setting up and getting started_](SettingUp.md).
---------------------------------------------------------------------------------------------------------------------
+---
## **Design**
:bulb: **Tip:** The `.puml` files used to create diagrams in this document can be found in the [diagrams](https://github.com/se-edu/addressbook-level3/tree/master/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.
+The **_Architecture Diagram_** given above explains the high-level design of the App.
Given below is a quick overview of main components and how they interact with each other.
**Main components of the architecture**
**`Main`** has two classes called [`Main`](https://github.com/se-edu/addressbook-level3/tree/master/src/main/java/seedu/address/Main.java) and [`MainApp`](https://github.com/se-edu/addressbook-level3/tree/master/src/main/java/seedu/address/MainApp.java). It is responsible for,
-* At app launch: Initializes the components in the correct sequence, and connects them up with each other.
-* At shut down: Shuts down the components and invokes cleanup methods where necessary.
+
+- At app launch: Initializes the components in the correct sequence, and connects them up with each other.
+- At shut down: Shuts down the components and invokes cleanup methods where necessary.
[**`Commons`**](#common-classes) represents a collection of classes used by multiple other components.
The rest of the App consists of four components.
-* [**`UI`**](#ui-component): The UI of the App.
-* [**`Logic`**](#logic-component): The command executor.
-* [**`Model`**](#model-component): Holds the data of the App in memory.
-* [**`Storage`**](#storage-component): Reads data from, and writes data to, the hard disk.
-
+- [**`UI`**](#ui-component): The UI of the App.
+- [**`Logic`**](#logic-component): The command executor.
+- [**`Model`**](#model-component): Holds the data of the App in memory.
+- [**`Storage`**](#storage-component): Reads data from, and writes data to, the hard disk.
**How the architecture components interact with each other**
-The *Sequence Diagram* below shows how the components interact with each other for the scenario where the user issues the command `delete 1`.
+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),
-* defines its *API* in an `interface` with the same name as the Component.
-* implements its functionality using a concrete `{Component Name}Manager` class (which follows the corresponding API `interface` mentioned in the previous point.
+- defines its _API_ in an `interface` with the same name as the Component.
+- implements its functionality using a concrete `{Component Name}Manager` class (which follows the corresponding API `interface` mentioned in the previous point.
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.
@@ -69,20 +70,34 @@ The sections below give more details of each component.
### UI 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)
+The **API** of this component is specified in [`Ui.java`](https://github.com/AY2223S1-CS2103T-T11-1/tp/blob/master/src/main/java/seedu/address/ui/Ui.java)

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` 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 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/AY2223S1-CS2103T-T11-1/tp/blob/master/src/main/java/seedu/address/ui/MainWindow.java) is specified in [`MainWindow.fxml`](https://github.com/AY2223S1-CS2103T-T11-1/tp/blob/master/src/main/resources/view/MainWindow.fxml)
The `UI` component,
-* executes user commands using the `Logic` component.
-* listens for changes to `Model` data so that the UI can be updated with the modified data.
-* keeps a reference to the `Logic` component, because the `UI` relies on the `Logic` to execute commands.
-* depends on some classes in the `Model` component, as it displays `Person` object residing in the `Model`.
+- executes user commands using the `Logic` component.
+- listens for changes to `Model` data so that the UI can be updated with the modified data.
+- shows the an active view of the currently available content based on filter and current context.
+- keeps a reference to the `Logic` component, because the `UI` relies on the `Logic` to execute commands.
+
+The `DetailPanel` component of the `UI` will display a finer detail of the currently selected `DisplayItem` that is chosen inside Model.
+
+How `UI` displays and updates `DisplayItem`'s in list view. Below will illustrate how any `DisplayItem` is generated as an card UI and then added into the corresponding ListPanel.
+
+1. Whenever the `ObservableList` inside `Model` is modified or changed, each changed item will call `updateItem()` method inside the respective ListPanelCell inner class found inside the respective ListPanels.
+2. The cell will then build the card for the item by calling the `xxxCard` class which represents an UI card object that will be used in the ListView Panel.
+3. For each attribute in the item, the Card class will add a corresponding child element to the Card.
+4. The generated Card is then added to the ListView.
+
+The Sequence Diagram below illustrate how the Person Cell is generated with its attributes when Person is changed.
+
+
+
### Logic component
@@ -93,45 +108,88 @@ Here's a (partial) class diagram of the `Logic` component:
How the `Logic` component works:
+
1. When `Logic` is called upon to execute a command, it uses the `AddressBookParser` class to parse the user command.
1. This results in a `Command` object (more precisely, an object of one of its subclasses e.g., `AddCommand`) which is executed by the `LogicManager`.
+1. The command can now takes in additional optional inputs (either from piping or from creation commands).
1. The command can communicate with the `Model` when it is executed (e.g. to add a person).
-1. The result of the command execution is encapsulated as a `CommandResult` object which is returned back from `Logic`.
+1. The command can also now create new commands / look for next commands to execute (e.g. seq, if else, piping)
+1. Additional information that the command would pass to the next command will be then encapsulated along with the result of the command execution as a `CommandResult` object which is then returned back from `Logic`.
-The Sequence Diagram below illustrates the interactions within the `Logic` component for the `execute("delete 1")` API call.
+The Sequence Diagram below illustrates the interactions within the `Logic` component for the `execute("task delete 1")` API call. Note that this is a nested api call where a selector type is given (`task`, `person`, `team`) and followed by a secondary command. This is handled via a 2 layer parser and the type parser will parse the subsequent text.

+We can illustrate another way of invoking delete command via piping 1 into delete command. This is likely called by some other command (`xxxComand` e.g. (task select 1 task delete)).
+
+
+
+Here the object of the task to be deleted is passed in to the `setInput` parameters. Because there is already an input and no index were provided, the delete command will use the input set by the `xxxCommand` instead and delete that element from model. By using commands like `seq`, if else etc. We can essentially chain multiple commands together to form complicated commands.
+
+If you think about the implementation, this is highly similar to how Java Stream is implemented, where a pipe command is similar to a map command where data is being passed and re-evaluated.
+
: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.
+
+#### Teams and Persons
+
+2 Layer commands like teams and persons (e.g., `team new`, `team delete`, ...) follow a similar sequence of interactions like above.
+
+
Changing of Team Scope
+
+However, during execution, team commands may update the context of the current team scope. To understand teams better,
+Teams are analogous to folders in a basic file system, which can contain other folders (`Team`), or other
+files (`Person` or `Task`).
+
+The Sequence Diagram below shows the interaction between the `Logic` and `Model` component when `execute("cg ..")`
+is called.
+
+
+
+This way of implementation maintains abstraction of details within the `Model` component from the `Logic` component.
+
+#### Parsing
+
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.
-* All `XYZCommandParser` classes (e.g., `AddCommandParser`, `DeleteCommandParser`, ...) inherit from the `Parser` interface so that they can be treated similarly where possible e.g, during testing.
-### Model component
-**API** : [`Model.java`](https://github.com/se-edu/addressbook-level3/tree/master/src/main/java/seedu/address/model/Model.java)
+- When called upon to parse a user command, the `AddressBookParser` class creates an `XYZCommandParser` (`XYZ` is a placeholder for the specific command name e.g., `AddCommandParser`) which uses the other classes shown above to parse the user command and create a `XYZCommand` object (e.g., `AddCommand`) which the `AddressBookParser` returns back as a `Command` object.
+- All `XYZCommandParser` classes (e.g., `AddCommandParser`, `DeleteCommandParser`, ...) inherit from the `Parser` interface so that they can be treated similarly where possible e.g, during testing.
-
+#### Tasks
+Commands for tasks (e.g., `AddTaskCommand`, `MarkTaskCommand`, ...) follow a similar sequence of interactions within
+the `Logic` component as the other commands described above.
-The `Model` component,
+However, during execution, tasks commands may update the context of the current tasks of a team. To understand tasks better,
+it should be understood that Tasks are an attribute of a Teams object, which is used to indicate if a tasks is done (also known as marked),
+or not (also known as unmarked). Moreover, progress of each task can be tracked with specific levels (namely 25%, 50%, 75% and 100 %).
-* stores the address book data i.e., all `Person` objects (which are contained in a `UniquePersonList` object).
-* stores the currently 'selected' `Person` objects (e.g., results of a search query) as a separate _filtered_ list which is exposed to outsiders as an unmodifiable `ObservableList` that can be 'observed' e.g. the UI can be bound to this list so that the UI automatically updates when the data in the list change.
-* stores a `UserPref` object that represents the user’s preferences. This is exposed to the outside as a `ReadOnlyUserPref` objects.
-* does not depend on any of the other three components (as the `Model` represents data entities of the domain, they should make sense on their own without depending on other components)
+Below is the class diagram that illustrates the interactions between Logic and Model components, in relation to tasks.
-
: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.
+
-
+This way of implementation of maintains abstraction of details of the `Logic` component, in the `Model` component.
-
+### Model component
+
+**API** : [`Model.java`](https://github.com/AY2223S1-CS2103T-T11-1/tp/blob/master/src/main/java/seedu/address/model/Model.java)
+
+
+
+The `Model` component,
+
+- stores the address book data i.e., all `Person`, `Task`, `Group` objects which are contained in their respective Unique List object (inherited from `DisplayItemList`).
+- stores the currently 'selected' `Person`, `Task`, `Group` objects (e.g., results of a search query or a change in group context) as a separate _filtered_ list which is exposed to outsiders as an unmodifiable `ObservableList` that can be 'observed' e.g. the UI can be bound to this list so that the UI automatically updates when the data in the list change.
+- stores a `UserPref` object that represents the user’s preferences. This is exposed to the outside as a `ReadOnlyUserPref` objects.
+- does not depend on any of the other three components (as the `Model` represents data entities of the domain, they should make sense on their own without depending on other components)
+
+Additional `Attribute`s are stored within `DisplayItem` (`AbstractDisplayItem`, `AbstractContainerItem`).
### Storage component
@@ -139,30 +197,137 @@ The `Model` component,
-The `Storage` component,
-* can save both address book data and user preference data in json format, and read them back into corresponding objects.
-* inherits from both `AddressBookStorage` and `UserPrefStorage`, which means it can be treated as either one (if only the functionality of only one is needed).
-* depends on some classes in the `Model` component (because the `Storage` component's job is to save/retrieve objects that belong to the `Model`)
+The `Storage` component:
+
+- Can save both `AddressBook` data and user preference data in json format, and read them back into corresponding objects.
+- Inherits from both `AddressBookStorage` and `UserPrefStorage`, which means it can be treated as either one (if only the functionality of only one is needed).
+- Depends on some classes in the `Model` component (because the `Storage` component's job is to save/retrieve objects that belong to the `Model`).
+
+#### Storage of different classes from the `Model` component
+
+To store the different classes from the `Model` component, different Json adapted classes (e.g. `JsonAdaptedPerson`,
+`JsonAdaptedGroup`, ...) will be used to format, store and retrieve from Json files. These classes can then be
+converted back into its `Model` based counterpart easily.
+
+For example, `JsonAdaptedPerson` can be converted back into a `Person` class.
+
+Here are the other classes in the `Storage` component used to store the `Model` component classes. The class
+structure follows closely to the class structure within the `Model` component:
+
+
+
+These Json adapted classes are able to convert any `String`
+representation of attributes within the Json files to its proper class attributes using the `toModelType` method.
+
+:exclamation: **Note:** Due to the nature of `AddressBookParser` being a singleton class, the `toModelType` method
+in `JsonAdaptedAddressBookParser` is the only instance where its return type is `void`.
+
+The Sequence Diagram below illustrates how the Json file is converted back into an AddressBook.
+
+
+
+#### Removing and adding parents to each group, person and task
+
+1. Note that in `JsonSerializableAddressBook`, the parenting is extracted and stored as an additional
+attribute called `itemRelationship`. This attribute is a mapping from the `uuid` of a `person`, `group`
+or `task` to the `uuids` of its respective parents.
+
+
+2. When `Person`, `Group` and `Task` are converted into their `JsonAdapted` classes to be formatted
+correctly in `AddressBook.json`, they will still hold on and store their respective `uuids`.
+
+
+3. When building the `AddressBook` in `JsonSerializableAddressBook`, all `persons`, `groups`
+ and `tasks` are built using `toModelType` without their parents.
+
+
+4. Within the `toModelType` method in `JsonSerializableAddressBook`, parents will then be added using the
+`setParent` method in each `person`, `group` and `task` class.
+
+
+5. The `AddressBook` with a completed tree-like structure consisting of `persons`, `groups` and `tasks` is returned
+from the `toModelType` method in `JsonSerializableAddressBook`.
### Common classes
Classes used by multiple components are in the `seedu.addressbook.commons` package.
---------------------------------------------------------------------------------------------------------------------
+---
## **Implementation**
This section describes some noteworthy details on how certain features are implemented.
+### Attributes Feature
+
+#### Implementation
+
+The attributes mechanism is facilitated by the creation of a new `Attribute` instance that is stored within the
+`AttributesList` object that each `Person`, `Group` and `Task` have, as these three classes extend
+`AbstractDisplayItem`, both directly and indirectly.
+
+To add a custom attribute, the user should provide an attribute name and an attribute value. These arguments are parsed
+by the `AddFieldCommandParser`, and then matched with the known attributes in the `AttributeList`.
+
+The process of parsing an `Attribute` is also done by `ParserUtil::parseAttribute`, which triages the attribute name
+if the attribute is considered as the default attributes (i.e. `Name`, `Email`, `Phone`, `Address`, `Description`) and
+returns a new instance of that default attribute. If the attribute does not fall within the default attributes, then
+it will create a new anonymous class that extends `AbstractAttribute`.
+
+The following sequence diagram shows how the add attribute operation works:
+
+
+
+#### Design Considerations
+
+* **Alternative 1 (current choice)**: Stores each `Attribute` in an `AttributeList` within each `AbstractDisplayItem`
+ instance (e.g. `Person`, `Task`, `Group`).
+ * Pros: Adheres to object-oriented principles, allows storing of non-string attributes.
+ * Cons: Might be more time expensive to check if attribute names are existing, as `equals` method to find matches.
+
+* **Alternative 2**: Stores each `Attribute` in a `Attributes` object within each `AbstractDisplayItem`, with a class
+ to store a `Prefix` and the `AttributeName`
+ * Pros: Adheres to object-oriented principles, more efficient to search for existing attributes with the
+ implementation of `HashMap` for constant-time searching
+ * Cons: Needs an additional class `AttributePrefixes` to store the known `Prefix` objects that was
+ added by the user.
+* **Alternative 3**: Stores all known `Attribute` instances in a separate static class.
+ * Pros: All `Attribute`-related operations are stored within one accessible component
+ * Cons: Might violate composition and encapsulation relationships in the object-oriented design.
+
+
+[Proposed] Detailed view page feature
+
+As we have already implemented the code to dynamically generate CSS for each individual attribute, we can fully implement detailed view page in the following 3 changes.
+
+1. Adds a detailed view page that model/UI can toggle to
+2. Extends the `field add` command to allow users to set custom styles and display settings based on the binary bit flags.
+3. Load the attribute in a similar way as to how the card is being generated in the detailed page.
+
+How `DetailPanel` displays all the details of a `DisplayItem` as an UI page.
+
+1. `UpdateContent(DisplayItem item)` will be called when the content of the UI needs to be updated.
+2. The current content will be cleared.
+3. Similar to how the card is generated by above, DetailPanel will iterate through all displayable Attributes and generate the corresponding UI components to be added to the details page.
+4. The DetailPanel is now updated with the details of the new DisplayItem.
+
+Below shows a sequence diagram of how DetailPanel page is filled with contents of a DisplayItem.
+
+
+
+The proposed detailed view page allows users to have a more detailed analysis of each of the Display Items in address book and allows the user to view hidden detailed hid in list view from the display view list using the bit corresponding `MENU_OK` found in `AccessDisplayFlag.java`
+
+
+
### \[Proposed\] Undo/redo feature
#### 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:
-* `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.
+- `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.
@@ -223,14 +388,15 @@ The following activity diagram summarizes what happens when a user executes a ne
**Aspect: How undo & redo executes:**
-* **Alternative 1 (current choice):** Saves the entire address book.
- * Pros: Easy to implement.
- * Cons: May have performance issues in terms of memory usage.
+- **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
+- **Alternative 2:** Individual command knows how to undo/redo by
itself.
- * Pros: Will use less memory (e.g. for `delete`, just save the person being deleted).
- * Cons: We must ensure that the implementation of each individual command are correct.
+ - Pros: Will use less memory (e.g. for `delete`, just save the person being deleted).
+ - Cons: We must ensure that the implementation of each individual command are correct.
_{more aspects and alternatives to be added}_
@@ -238,18 +404,17 @@ _{more aspects and alternatives to be added}_
_{Explain here how the data archiving feature will be implemented}_
-
---------------------------------------------------------------------------------------------------------------------
+---
## **Documentation, logging, testing, configuration, dev-ops**
-* [Documentation guide](Documentation.md)
-* [Testing guide](Testing.md)
-* [Logging guide](Logging.md)
-* [Configuration guide](Configuration.md)
-* [DevOps guide](DevOps.md)
+- [Documentation guide](Documentation.md)
+- [Testing guide](Testing.md)
+- [Logging guide](Logging.md)
+- [Configuration guide](Configuration.md)
+- [DevOps guide](DevOps.md)
---------------------------------------------------------------------------------------------------------------------
+---
## **Appendix: Requirements**
@@ -257,73 +422,308 @@ _{Explain here how the data archiving feature will be implemented}_
**Target user profile**:
-* has a need to manage a significant number of contacts
-* prefer desktop apps over other types
-* can type fast
-* prefers typing to mouse interactions
-* is reasonably comfortable using CLI apps
+- They are tech-savvy
+- Organised and consistent in using the app
+- Have a need to effectively manage their team, through work progress and employee involvement
+- Doesn’t mind putting extra time to make their life easier in the future
-**Value proposition**: manage contacts faster than a typical mouse/GUI driven app
+**Value proposition**:
+- Manage employees
+- Manage multiple projects and their progress + contributions from employees
+- More effective under the hand of a tech-savvy user
+- Meeting/time management
+- Easily **personalizable**
### 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 |
-
-*{More to be added}*
+| Priority | As a … | I want to … | So that I can… |
+| -------- | ------------------- | -------------------------------------------------------------------------------------------------------------- | ------------------------------------------------------------------------------------------------------------------------ |
+| `* * *` | basic user | add new contacts | add new contacts for use later |
+| `* * *` | basic user | delete contacts | remove old unused contacts |
+| `* * *` | basic user | view my current contacts | see all the contacts I have saved |
+| `* * *` | basic user | group contacts into group | categorise my contacts |
+| `* * *` | basic user | add additional info for each contact via a custom field | record extra information that i need to take note of regarding the contact |
+| `*` | regular user | customise the colors of the user interface to my liking | be more comfortable using the app |
+| `* *` | regular user | add custom commands acting as macros to the app | be more efficient with controls specific to my use. |
+| `* *` | user | export my contacts as to csv or vcard | transfer general contact information to be used elsewhere or for sharing. |
+| `* *` | user | add aliases to my contacts | search the contacts up faster |
+| `* * *` | user | edit group information and group user information | edit and update team information should such details change |
+| `* * *` | user | have an advertisement free experience | be more focused and not get distracted by ads |
+| `* *` | user | transfer app data | keep my current data should i change devices or have multiple devices using the app |
+| `* * *` | user | edit contact information | update my contacts with the most recent update |
+| `* *` | user | have an responsive and snappy user experience | have a more enjoyable experience while using the app as well as increased efficiency |
+| `* *` | user | undo a command | easily revert incorrect changes |
+| `* *` | user | automatically save the data | be assured that i won’t lose data in the event the app exits improperly due to rare circumstances (e.g. computer crash) |
+| `* *` | user | enjoy a simple and accessible user interface | easily understand and use the basic features without the need to extensively refer to a user guide |
+| `* *` | user | enjoy a clean and zen-style gui | be more focused and not easily distracted. |
+| `* * *` | developer | use the app solely using the keyboard (cli like input controls) | be fast and efficient since pressing a key is faster than reaching for the mouse |
+| `*` | busy, working adult | have a clear separation between work contacts and other contacts | have a clear work-life balance |
+| `* * *` | project manager | add extra information to each group of contacts | keep extra information regarding my team |
+| `* * *` | project manager | add task to a group | record tasks to be done by my team |
+| `* * *` | project manager | assign specific task to single or multiple users within a group | delegate tasks assignment when working in a team |
+| `* *` | project manager | view the timeline of task completion within a group | track progress within the group |
+| `* * *` | project manager | add additional information to a contact within a team | track bonus details and information regarding a member |
+| `* * *` | project manager | add completion dates to some tasks assigned in the group | set deadlines to group specific tasks |
+| `* * *` | project manager | add ability to add custom fields when adding contacts to a group | tailor fit the group to my project needs |
+| `*` | project manager | add custom color palette to each group | feel more personalised to each team as well as better differentiate between different teams |
+| `* * *` | project manager | change the completion status of tasks in a group | to indicate the if an assigned task has been completed by a member |
+| `* *` | project manager | generate a progress report of the group progress (i.e. show task done at what time, how many percent done etc) | easily access and present those information to others (e.g. higher ups) as well as tracking the progress of the project. |
+| `* * *` | project manager | have the ability to broadcast messages to my team members | disseminate information in a short time. |
+| `* * *` | project manager | delegate work to each group efficiently via commands | cut down on time spent doing admin work |
+| `* * *` | project manager | access and view the contacts of my team members | track progress of the team on an individual level |
+| `* *` | project manager | organise my project team tasks with efficiency | spend less time doing admin work |
+| `* *` | project manager | switch context easily between multiple groups | manage multiple teams |
+| `* * *` | project manager | issue commands specific to the team | be more efficient and type fewer group related details |
### 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 `Contactmation` and the **Actor** is the `user`, unless specified otherwise)
+
+**Use case: UC01 - Delete a person**
+
+**MSS**
+
+1. User requests to list persons.
+2. Contactmation shows a list of persons.
+3. User requests to delete a specific person in the list.
+4. Contactmation deletes the person.
+
+ Use case ends.
+
+**Extensions**
+
+- 2a. The list is empty.
+
+ Use case ends.
+
+- 3a. The given index is invalid.
+
+ - 3a1. Contactmation shows an error message.
+
+ Use case resumes at step 2.
-**Use case: Delete a person**
+**Use case: UC02 - Edit a person**
**MSS**
-1. User requests to list persons
-2. AddressBook shows a list of persons
-3. User requests to delete a specific person in the list
-4. AddressBook deletes the person
+1. User requests to list persons.
+2. Contactmation shows a list of persons.
+3. User requests to edit a specific person in the list.
+4. Contactmation shows a screen with the properties of the person.
+5. User edits the properties to their liking and saves.
+6. Contactmation saves the data.
Use case ends.
**Extensions**
-* 2a. The list is empty.
+- 2a. The list is empty.
Use case ends.
-* 3a. The given index is invalid.
+- 3a. The given index is invalid.
+
+ - 3a1. Contactmation shows an error message.
+
+ Use case resumes at step 2.
+
+**Use case: UC03 - Create a team**
- * 3a1. AddressBook shows an error message.
+**MSS**
+
+1. User requests to create a team with a team name.
+2. Contactmation creates the team.
+
+ Use case ends.
+
+**Extensions**
- Use case resumes at step 2.
+- 1a. The team name is empty or invalid.
-*{More to be added}*
+ - 1a1. Contactmation shows an error message.
+
+ Use case ends.
+
+- 2a. The new team is in the current path.
+
+ - 2a1. Contactmation adds the new team to the list of teams in this path.
+
+ Use case ends.
+
+**Use case: UC04 - Enter a team context**
+
+**MSS**
+
+1. Contactmation shows a list of teams.
+2. User requests to enter a team context.
+3. Contactmation enters the team context.
+4. Contactmation only shows information specified to the new team context.
+
+ Use case ends.
+
+**Extensions**
+
+- 2a. The team selected is invalid.
+
+ - 2a1. Contactmation shows an error message.
+
+ Use case ends.
+
+**Use case: UC05 - Add a Task**
+
+**MSS**
+
+1. User requests to list groups.
+2. Contactmation shows a list of groups.
+3. User requests to add a task to a group in the list.
+4. Contactmation adds the task.
+
+ Use case ends.
+
+**Extensions**
+
+- 2a. The list is empty.
+
+ Use case ends.
+
+- 3a. The given index is invalid.
+
+ - 3a1. Contactmation shows an error message.
+
+ Use case resumes at step 2.
+
+**Use case: UC06 - Set a Task completion status**
+
+**MSS**
+
+1. User requests to list tasks for a group.
+2. Contactmation shows a list of tasks.
+3. User requests to set the task completion status.
+4. Contactmation sets the task completion status.
+
+ Use case ends.
+
+**Extensions**
+
+- 2a. The list is empty.
+
+ Use case ends.
+
+- 3a. The given index is invalid.
+
+ - 3a1. Contactmation shows an error message.
+
+ Use case resumes at step 2.
+
+- 4a. The given status is empty.
+
+ - 4a1. Contactmation sets the task to `Done`
+
+ Use case ends.
+
+**Use case: UC07 - Create a macro**
+
+**MSS**
+
+1. User enters the command to create a macro.
+2. Contactmation creates and saves the macro.
+
+ Use case ends.
+
+**Extensions**
+
+- 1a. The macro command is invalid.
+
+ - 1a1. Contactmation shows an error message.
+
+ Use case ends.
+
+**Use case: UC08 - Execute a macro**
+
+**MSS**
+
+1. User requests to use a macro.
+2. Contactmation executes the commands defined by the macro.
+
+ Use case ends.
+
+**Extensions**
+
+- 1a. The macro does not exist.
+
+ - 2a1. Contactmation shows an error message.
+
+ Use case ends.
+
+
+**Use case: UC09 - Execute a foreach loop**
+
+**MSS**
+
+1. User requests to use a with a supplied command over selected item type.
+2. Contactmation executes the command over the selected item type.
+
+ Use case ends.
+
+**Extensions**
+
+- 1a. The command is invalid.
+
+ - 1a1. Contactmation shows an error message.
+
+ Use case ends.
+
+- 1b. The selected item type does not exist.
+
+ - 1b1. Contactmation shows an error message.
+
+ Use case ends.
+
+- 2a. The command fails on an item.
+
+ - 2a1. Contactmation stops execution of the loop.
+ - 2a2. Contactmation displays an error message
+
+ Use case ends.
+
+**Use case: UC10 - Use macros for repetitive tasks**
+
+**MSS**
+
+1. User **creates a macro (UC07)**.
+2. User **executes a foreach loop (UC09)** with the macro.
+
+ Use case ends.
+
+**Extensions**
+
+- 2a. The macro does not exist.
+
+ - 2a1. Contactmation shows an error message.
+
+ Use case ends.
### 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.
-
-*{More to be added}*
+4. Should be usable with only a _command-line interface_.
+5. Data should persist between app launches.
+6. Should work with both 32-bit and 64-bit operating systems.
+7. The system is not required to do any communication with the Internet (e.g. sending emails).
+8. Should not use any images or terms that could be deemed as offensive.
### Glossary
-* **Mainstream OS**: Windows, Linux, Unix, OS-X
-* **Private contact detail**: A contact detail that is not meant to be shared with others
+- **Mainstream OS**: Windows, Linux, Unix-like, MacOS
+- **Command-line Interface**: A system that received user input in the form of lines of text
+- **Task**: A piece of work that has to be done, that can be assigned to people and that may have a deadline
---------------------------------------------------------------------------------------------------------------------
+---
## **Appendix: Instructions for manual testing**
@@ -338,18 +738,22 @@ testers are expected to do more *exploratory* testing.
1. Initial launch
- 1. Download the jar file and copy into an empty folder
-
- 1. Double-click the jar file Expected: Shows the GUI with a set of sample contacts. The window size may not be optimum.
+ 1. Download the `contactmation.jar` [file](https://github.com/AY2223S1-CS2103T-T11-1/tp/releases) and copy into an empty folder
-1. Saving window preferences
+ 1. Double-click the jar file Expected: Shows the GUI with a set of sample contacts. The window size may not be optimum.
+
+2. Clearing the default sample contacts
+ 1. Run the `clear` command to remove existing data from the application.
+ Expected: Removes existing sample contacts, groups and/or tasks from the application.
- 1. Resize the window to an optimum size. Move the window to a different location. Close the window.
+### Adding a person
- 1. Re-launch the app by double-clicking the jar file.
- Expected: The most recent window size and location is retained.
-
-1. _{ more test cases … }_
+1. Adding a person to the application
+ 1. Test Case: `person new n/John Doe`
+ Expected: Contact with name John Doe is created with index number 1.
+ 2. Test Case: `person new n/Caroline Smith p/86178049 e/caroline@gmail.com t/friend`
+ Expected: Contact with name Caroline Smith is created with index number 2.
+ Phone, Email and tag is present in the GUI.
### Deleting a person
@@ -368,10 +772,54 @@ testers are expected to do more *exploratory* testing.
1. _{ more test cases … }_
-### Saving data
-
-1. Dealing with missing/corrupted data files
-
- 1. _{explain how to simulate a missing/corrupted file, and the expected behavior}_
-
-1. _{ more test cases … }_
+### Group Commands
+
+1. Creating a group from the main window
+ 1. Test case: `team new cs2103`
+ Expected: A team with name `/cs2103` will appear in the left pane of the GUI.
+2. Navigating to a Group
+ 1. Prerequisite: At least one team should be present in the GUI
+ 2. Test case: `cg 1`
+ Expected: GUI should now be in the scope of the first team in the list of teams. If the first team is `/cs2103`,
+ you can expect to see a `/cs2103` on the bottom left of the GUI.
+3. Add a person in the group
+ 1. Prerequisite: You should now have navigated inside a group.
+ 2. Test case: `person new n/Eric`
+ Expected: A person named `Eric` should now be created inside the group.
+4. Navigate back to the root group:
+ 1. Prerequisite: You should now have navigated inside a group.
+ 2. Test case: `cg /`
+ Expected: You should now be navigated back to the root group (the window that you first see when you start the
+ app).
+
+
+### Task Commands
+
+1. Creating a task from a group
+ 1. Prerequisite: You should have at least one group, and you should now have navigated into a group.
+ 2. Test case: `task add t/Todo d/Finish Work`
+ Expected: A task named todo with description finish work should be visible in the right pane of the GUI.
+2. Mark a task as done
+ 1. Prerequisite: You should have at least one task visible in the current state of the GUI.
+ 2. Test case: `task mark 1`
+ Expected: The task in the index 1 should now be marked as completed.
+3. Mark a task as not done
+ 1. Prerequisite: You should have at least one task visible in the current state of the GUI, and the task should
+ have been marked as done.
+ 2. Test case: `task unmark 1`
+ Expected: The task in the index 1 should now be marked as incomplete.
+4. Delete a task from the list of tasks
+ 1. Prerequisite: You should have at least one task visible in the current state of the GUI.
+ 2. Test case: `task delete 1`
+ Expected: The task in the index 1 should now be removed from the application, and should not be removed from the GUI.
+
+### Attribute Commands
+
+1. Create a new Attribute for a Person
+ 1. Prerequisite: You should have at least one person present in the GUI
+ 2. Test Case: `field add u/1 github johndoe123`
+ Expected: The attribute "github: johndoe123" should be visible in the GUI
+2. Remove an attribute for a person
+ 1. Prerequisite: You should have at least one person present in the GUI, the person should have an attribute
+ 2. Test case: `field delete u/1 github`
+ Expected: The attribute "github: johndoe123" from the previous example should not be visible in GUI.
diff --git a/docs/UserGuide.md b/docs/UserGuide.md
index 3716f3ca8a4..0b0cb9bd3b2 100644
--- a/docs/UserGuide.md
+++ b/docs/UserGuide.md
@@ -3,190 +3,1262 @@ layout: page
title: User Guide
---
-AddressBook Level 3 (AB3) is a **desktop app for managing contacts, optimized for use via a Command Line Interface** (CLI) while still having the benefits of a Graphical User Interface (GUI). If you can type fast, AB3 can get your contact management tasks done faster than traditional GUI apps.
+## **Table of contents**
+
+1. [Introduction](#introduction)
+2. [About](#about)
+ 1. [Purpose of guide](#purpose)
+ 2. [How to navigate the user guide](#user-guide-navigation)
+ 3. [Contactmation window guide](#contactmation-window-guide)
+ 4. [Prerequisites](#prerequisites)
+3. [Quick start](#quick-start)
+4. [Before you begin](#before-you-begin)
+ 1. [Standardised format style](#standardised-format-style)
+ 2. [Constraints on placeholder words](#constraints-on-placeholder-words)
+ 3. [Making groups within groups](#making-groups-within-groups)
+5. [Features](#features)
+ 1. [Basic features](#basic-features)
+ 1. [General commands](#1-general-commands)
+ 1. [Clear command](#clear-command-clear)
+ 2. [Exit command](#exits-the-program-exit)
+ 3. [Add a field](#add-a-new-field-field-add)
+ 4. [Edit a field](#edit-a-field-field-edit)
+ 5. [Delete a field](#delete-a-field-field-delete)
+ 6. [Rename a group, person or task](#rename-the-name-of-items-on-the-screen)
+ 7. [Find command](#find-command-find)
+ 8. [List all contacts in team](#listing-all-contacts-in-current-team)
+ 2. [Team/Group commands](#2-teamgroup-commands)
+ 1. [Create a team](#create-a-team-team-new)
+ 2. [Delete a team](#delete-a-team-team-delete)
+ 3. [Navigate to a team](#navigate-to-a-team-cg)
+ 4. [Add new person to team](#add-new-contacts-within-a-team)
+ 5. [Remove person from team](#removing-contacts-from-team-team-remove)
+ 6. [Creating or deleting a subteam](#creating-and-deleting-a-subteam)
+ 7. [Find a team](#finding-a-team-find)
+ 3. [Person commands](#3-person-commands)
+ 1. [Add a person](#add-a-person-person-new)
+ 2. [Delete a person](#delete-a-person-person-delete)
+ 3. [Find a person](#finding-a-person-find)
+ 4. [Task commands](#4-task-commands)
+ 1. [Adding a task](#adding-a-task-to-a-team-task-add)
+ 2. [Deleting a task](#deleting-a-task-from-team-task-delete)
+ 3. [Mark task](#mark-a-task-task-mark)
+ 4. [Unmark task](#unmark-a-task-task-unmark)
+ 5. [Find a task](#finding-a-task-find)
+ 2. [Advanced features](#advanced-features)
+ 1. [Chaining](#advanced-features-overview-chaining)
+ 2. [Feature constraints](#advanced-feature-constraints)
+ 3. [Select command](#select-command)
+ 4. [Contains command](#contains-command)
+ 5. [Execute command](#execute-command)
+ 6. [Replace command](#replace-command)
+ 7. [Foreach command](#foreach-command)
+ 8. [If else command](#if--else-command)
+ 9. [Aliasing](#aliasing)
+ 10. [Custom command / macro](#custom-command--macro)
+6. [FAQ](#faq)
+7. [Future plans](#future-plans)
+8. [Glossary](#glossary)
+9. [Commands summary](#command-summary)
+ 1. [General commands](#general-commands-summary)
+ 2. [Contact commands](#contact-commands-summary)
+ 3. [Group commands](#group-commands-summary)
+ 4. [Task commands](#task-commands-summary)
+ 5. [Advanced commands](#advanced-commands-summary)
-* Table of Contents
-{:toc}
+---
+
+## **Introduction**
+
+> **What is Contactmation?**
+
+Contactmation is a powerful **desktop-based project and task management solution** that **helps you efficiently and
+effectively manage many projects at once** through the [Command Line Interface (CLI)](#glossary).
+
+Contactmation will be able to help you save all your project member details, keep track of
+each project, and delegate tasks to each project.
+
+> **Who is Contactmation for?**
+
+Contactmation is for **project managers and supervisors** who want to maintain an organised view of their
+projects and streamline the management of their projects.
+
+---
+
+## **About**
+
+### Purpose
+
+This guide will elaborate on all the features available in Contactmation that will help make your experience of using
+Contactmation pain-free.
+
+Examples with real-world applications are present to give you a clearer idea of how the features
+can be utilised.
+
+### User Guide Navigation
+
+This guide is broken into different sections that will aid you in better understanding our application.
+
+Refer to:
+
+- The [contactmation window guide](#contactmation-window-guide) for a guide on the application window.
+- The [basic feature](#basic-features) section to get started on using the application.
+- The [advanced feature](#advanced-features) section for powerful tools that will help make your experience of
+ using Contactmation much more streamlined and customisable.
+- The [glossary](#glossary) for explanations to the different terms used throughout this guide.
+- The [command summary](#command-summary) for a quick overview on how to use all our features.
+
+For a more detailed view of all the features present, please visit the [table of contents](#table-of-contents).
+
+### Contactmation Window Guide
+
+The following figure shows how our application would appear on your screen upon opening Contactmation.
+Each part of our application will be labelled as such:
+
+
+
+We will be referring to these terminologies throughout the user guide.
+
+### **Prerequisites**
+
+Before you start up Contactmation on your computer,
+
+- Ensure that `Java version 11` or above is installed on your device. Do refer to the [FAQ](#faq) if you need help with
+ checking whether `Java 11` is installed on your computer, or if you need help with installing `Java 11`.
+
+- The current version of Contactmation can only be used in a desktop, but should work on all operating systems (such as
+ Windows, macOS and Linux etc.) as long as `Java 11` is installed.
+
+---
+
+## **Quick start**
+
+1. Ensure that the [prerequisites](#prerequisites) are met before installing Contactmation.
+
+2. Download the latest version of `contactmation.jar` from
+ [here](https://github.com/AY2223S1-CS2103T-T11-1/tp/releases). The file `contactmation.jar`
+ can be found under the `Assets` for each version of Contactmation.
+
+
+
+3. Save `contactmation.jar` into a Desktop folder on your computer. This folder will now be the home folder
+ for Contactmation. Do look at the [FAQ](#faq) section for errors related to opening files used in Contactmation.
+
+4. Double-click on `contactmation.jar` to start up the application. You will be greeted with the current window
+ if everything goes well:
+
+
+
+5. You may begin by referring to the [before you begin](#before-you-begin) section to get
+ started.
+
+6. You may then move on to the [basic features](#basic-features) section to get started on using
+ Contactmation. For additional, more powerful commands, refer to our [advanced features](#advanced-features),
+ especially if you are comfortable with the CLI or have prior programming experience.
+
+:bulb: **Tip**: If you wish to clear all default entries and begin with on a fresh slate, use the [clear](#clear-command-clear) command.
+
+---
+
+## **Before you begin**
+
+Before you begin, you will need to know how to interact with Contactmation.
+
+You may only interact with Contactmation by typing [commands](#glossary) into the
+[command box](#contactmation-window-guide). Upon hitting the `Enter` key, you will be able to execute the command
+currently residing in the command box.
+
+> How do I clear the sample data in my newly downloaded version of Contactmation?
+
+Simply type in the word `clear` into the command box and press the `Enter` key on your desktop. All the sample
+data will be wiped. Do note that this action is **irreversible**.
+
+> How do I properly write these commands?
+
+We will go through the standardised formats for each [basic](#basic-features) and [advanced](#advanced-features)
+feature in their respective sections.
+
+> How do I read the standardised formats for each feature?
+
+These formats may look cryptic at first glance. Do visit the [Standardised Format Style](#standardised-format-style)
+section to better understand how to read the formats.
+
+### Standardised Format Style
---------------------------------------------------------------------------------------------------------------------
+This section aims to help you better understand the different terminologies used in the format section of each
+feature description.
-## Quick start
+| Format | Explanation |
+| ------------------------- | ---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
+| **Square brackets** ([ ]) | Anything that is within the square brackets are entirely **optional**. You may skip anything wrapped in the square bracket and move on to the next [word](#glossary) in the [command sequence](#glossary). |
+| **Angled brackets** (< >) | Anything within angled brackets are placeholder words. These words will be replaced by other words for the command to run. The replacing words will be specified in the format section for each feature. |
+| **Ellipses** (`...`) | The word which these ellipses are attached to can be repeated multiple times in a single command. |
-1. Ensure you have Java `11` or above installed in your Computer.
+#### Combining the format styles
-1. Download the latest `addressbook.jar` from [here](https://github.com/se-edu/addressbook-level3/releases).
+The **innermost** format in a word has the **highest** priority, while the **outermost** format in a word
+has a **lower** priority than any format within it. However, since an outer format is considered after the inner format,
+the outer format has a **stronger connotation** to it.
-1. Copy the file to the folder you want to use as the _home folder_ for your AddressBook.
+Here is an additional example to solidify your understanding of how these formats make sense when combined.
-1. Double-click the file to start the app. The GUI similar to the below should appear in a few seconds. Note how the app contains some sample data.
- 
+If the command format in the format section of a feature has `[t/tags...]`, that means that the **ellipses**
+will have a higher priority than the **square brackets**. This means that `t/tags` can be repeated multiple
+times, but `t/tags` can be entirely optional as well. Therefore, it is possible to **skip** `t/tags` altogether, or have
+1 or more `t/tags` in the command sequence.
-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:
+Other keywords utilised in the guide are defined in the [glossary](#glossary).
- * **`list`** : Lists all contacts.
+### Constraints on placeholder words
- * **`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.
+This section will help you understand what placeholder words in the format section for each command can be
+replaced by. Placeholder words are words which are wrapped around angled brackets (`<>`) in the format section.
+Do refer to the [standardised format style](#standardised-format-style) section for more information to
+understand the format styles for each command.
- * **`delete`**`3` : Deletes the 3rd contact shown in the current list.
+- The `NAME` of the person or task must be [alphanumeric](#glossary) and can contain white spaces.
- * **`clear`** : Deletes all contacts.
+- The `TEAM NAME` must be alphanumeric.
- * **`exit`** : Exits the app.
+- The `PHONE_NUMBER` is divided into 3 sections, namely the country code, area code and phone
+ number in that order. Both the country and area code can have **1-4 digits**, and the phone number can
+ be **3 digits or more**. All 3 sections must be separated by a white space. The `PHONE_NUMBER` may also
+ begin with a (`+`) symbol. The country and area codes are entirely **optional**.
+- The `EMAIL` of the person must have an `@` symbol. We will refer to anything before the `@`
+ symbol as `PART 1` and anything after the symbol to be `PART 2`.
-1. Refer to the [Features](#features) below for details of each command.
+ - `PART 1`: Can only contain alphanumeric characters and special characters such as (`+\_.-`).
+ You may only start or end `PART 1` with alphanumeric characters.
---------------------------------------------------------------------------------------------------------------------
+ - `PART 2`: Must have at least one period (`.`). We will refer to text separated by periods as
+ domain labels.
-## Features
+ - `PART 2` must end with a domain label at least **2 characters long**.
+
+ - Each domain label must start and end with alphanumeric characters.
+ - Each domain label can only consist of alphanumeric characters and hyphens.
+
+- The `ADDRESS` of a person can take any values, but it should not be blank.
+
+- The `TAG` must be alphanumeric.
+
+- The `INDEX` must be a positive whole number which cannot exceed the number of groups, contacts or tasks currently displayed in the
+ application window.
+
+- The `KEYWORD` and `MORE_KEYWORDS` must be alphanumeric.
+
+- The `TITLE` is [alphanumeric](#glossary) and can contain hyphens and underscores.
+
+- The `DESCRIPTION` has no restrictions.
+
+- The `ITEM` can only be replaced with either `task`, `person` or `team`.
+- The `SELECTED_ITEM` are item that are selected via a select command or passed down from other commands [See select command](#select-command)
+
+ - e.g.
+
+ - `task select 1` will select the first task and that first task will be considered the `SELECTED_ITEM`
+
+### Making groups within groups
+
+This section aims to help you understand the concept of creating groups under other groups.
+
+> What is "making groups within groups"?
+
+Here is a scenario. Let us say you are a boss of a company called **Just_Incorporated**, and you would like to track
+the different departments in your company. Therefore, the departments in the company
+(e.g. `Marketing` and `Research_And_Development` department) could act as groups within Contactmation.
+
+However, let us also say that you are closely monitoring a particular group in the `Research_And_Development`
+department, and let us call this group is `Vero_Ltd`. Then this group, `Vero_Ltd`, would
+fall under the **`Research_And_Development`** group in Contactmation.
+
+Here is how the grouping for this scenario would look like in theory:
+
+
+
+This will be how the grouping looks like in Contactmation:
+
+
+
+Note that `Vero_Ltd` is listed in group 3 as `/Research_And_Development/Vero_Ltd`.
+This means that `Vero_Ltd` is within the group `Research_And_Development`, and this is shown with
+the name of the group `Vero_Ltd` appearing after `Research_And_Development` followed by a slash (`/`)
+separating the two names.
+
+Now that you understand what it means to have a group inside another group, you might want
+to view specific information about a certain group and ignore other group information.
+
+> How do I restrict what I see on the display to only a specific group?
+
+Let us say you are only interested in seeing everything related to the `Research_And_Development` department
+and nothing else. In this case, you might want to restrict what you see on the Contactmation display
+to only view information within `Research_And_Development`.
+
+When you do this, all the other information in other groups (e.g. `Marketing`) will no longer
+appear on your Contactmation display. Do not worry, all the other information is not lost. Information
+about other groups are simply hidden from your view so that you can focus on `Research_And_Development`.
+
+To "zoom into" a specific group, you can use the [cg](#navigate-to-a-team) command.
+**:information_source: How to type the commands properly:**
+
+For more information on how to type the command, please visit the sections on
+[standardised format styling](#standardised-format-style) and [placeholder constraints](#constraints-on-placeholder-words)
+that is used to type all commands.
+
+
+
+:bulb: **Tip**: The [cg](#navigate-to-a-team) command is also used to view all your other groups again. To do this, just type `cg ..` or `cg /` into the command box.
+
+Following the above example, `cg 2` needs to be typed into the command box for you to view
+`Research_And_Development`, since the `Research_And_Development` department is listed as group 2 in the
+Contactmation display.
+
+The following screen should appear upon pressing `Enter`:
+
+
+
+We can see that the `Marketing` and `Research_And_Development` departments can no longer be seen.
+We are not able to see the `Marketing` department because now, we are focusing solely on the
+`Research_And_Development` department.
+
+> What happened to the `Research_And_Development` department?
+
+At the bottom left-hand corner of the [application window](#contactmation-window-guide), we can see
+the current group we are in.
+
+Therefore, what we are seeing now is **any groups, contacts or tasks that exist within `Research_And_Development`
+only**. Since `Vero_Ltd` is under the `Research_And_Development` group, it still can be seen on the display.
+
+> How do I create a group within another group?
+
+Let's assume you want to create another group, `Kong_Pte_Ltd`, under the `Vero_Ltd` group.
+So, you will have to use the `cg` command to first "zoom in" to `Vero_Ltd` and restrict what you are seeing
+on the display. So we will need to type `cg 1` in the [command box](#contactmation-window-guide) and execute the
+statement.
+
+Now, you are within the `Vero_Ltd` group. You may now create a subgroup within `Vero_Ltd` by executing the
+[team new](#create-a-team) command. In this case, you can type `team new Kong_Pte_Ltd` to create `Kong_Pte_Ltd`
+within `Vero_Ltd`:
+
+
+
+The `Kong_Pte_Ltd` group is now created within `Vero_Ltd`!
+
+---
+
+## **Features**
+
+With Contactmation, you can not only use the [**basic features**](#basic-features) to manage your group project, but also use
+[**advanced features**](#advanced-features) to customise and streamline your experience in Contactmation.
+
+However, if you are a new user of Contactmation, we recommend sticking
+to just the basic features. The basic features are more than enough to provide for all your needs
+with respect to group, contact and task management, whereas the advanced features only help with
+increasing the efficiency of using the application on large numbers of groups, contacts and tasks.
+
+Do visit the [standardised format style](#standardised-format-style) and the [format constraint](#constraints-on-placeholder-words) sections before writing commands in Contactmation.
+
+## Basic features
+
+Now that you have finished setting up Contactmation, let’s start performing basic [commands](#glossary) with Contactmation.
+As Contactmation aims to help you manage your contacts, project groups and tasks, we will start off by performing
+a range of basic commands varying from adding a person to manipulating tasks and groups.
-**:information_source: Notes about the command format:**
+The basic features are categorised as the following:
-* 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`.
+1. [General Commands](#1-general-commands)
+2. [Team/Group Commands](#2-teamgroup-commands)
+3. [Contact Commands](#3-contact-commands)
+4. [Task Commands](#4-task-commands)
-* 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`.
+## 1. General commands
-* 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.
+These commands can be applied to any group, contact or task.
-* 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.
+### Clear command: `clear`
-* If a parameter is expected only once in the command but you specified it multiple times, only the last occurrence of the parameter will be taken.
- e.g. if you specify `p/12341234 p/56785678`, only `p/56785678` will be taken.
+This command clears all group, contact and task entries from the application. You can write this command if you are,
+for example, leaving a company and deciding to wipe all data related to the company.
-* 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`.
+:exclamation: **Caution: This action is irreversible! Please make sure that you really want to
+delete all your information before doing so.**
+
+**Format:** `clear`
+
+### Find command: `find`
+
+This command allows you to search for a person, group or task that matches a given `KEYWORD`. Searches may also include `MORE_KEYWORDS`
+to further narrow the search for a contact, subgroup or task within the current [scope](#glossary).
+
+**Format:** [` find []`](#constraints-on-placeholder-words)
+
+**Examples:**
+
+- `person find John Doe`
+ This command finds a person named John Doe
+- `task find task1 task2`
+ This command finds tasks whose name matches task1 or task2
+- `team find team1 team2`
+ This command finds teams whose name matches team1 or team2
+
+
+
+To reset the find filters, you can use the [List command](#listing-all-contacts-in-current-team).
+
+### Listing all data in current team
+
+Contactmation supports the `list` command that displays all of your contacts in the current team to a list of persons.
+To execute the command, ensure that you have navigated to the desired team, then execute the command `list`. If you
+are currently not in the scope of any team, the `list` command will display all of your contacts in Contactmation by
+default.
+
+**Format**: `list`
+
+
+
+### Exits the program: `exit`
+
+When this command is executed, the program will **save** all the groups, contacts
+and tasks present in Contactmation and **closes** the application.
+
+**Format:** `exit`
+
+### Add a new field: `field add`
+
+This command is for you to add additional information to a group, task, or person. This extra information
+will appear as text below the name of the group, task or person, as shown below:
+
+
+
+Here, we can see that additional information that "`Funding`" is "`On hold`" in the group `Research_and_development`.
+
+A field can provide additional information to the [item](#constraints-on-placeholder-words) when it is needed.
+
+**Format:**
+
+- `field add u/` to add a new field to the person at the current `INDEX`.
+
+- `field add g/` to add a new field to the group at the current `INDEX`.
+
+- `field add t/` to add a new field to the task at the current `INDEX`.
+- ` field add ` to add a new field to the selected task/person/group. [See select command](#select-command)
+
+For example, let us say we have a task `Do paperwork`, and we want to add additional information to it. We can
+call the command `field add t/1 Priority High` to add a field with the `NAME` as `Priority` and
+the `DESCRIPTION` as `High` to the task with `INDEX` 1.
+
+
+
+### Edit a field: `field edit`
+
+This command will attempt to edit an **existing** field that belongs to a group, task or person. It replaces the
+description of an existing field name to a new description.
+
+Do visit the [glossary](#glossary) for more details on what a field is.
+
+However, if the field name does not exist, then the field should be added first through the `field add` command
+explained above. Field names are case-sensitive.
+
+**Format**:
+
+- `field edit u/` to edit the field named `FIELD NAME` to the person at
+ the current `INDEX`.
+- `field edit g/` to edit the field named `FIELD NAME` to the group at
+ the current `INDEX`.
+- `field edit t/` to edit the field named `FIELD NAME` to the task at
+ the current `INDEX`.
+- ` field edit ` to edit the field named `FIELD NAME` to the selected item. [See select command](#select-command)
+
+Here is an example. Let us say that we have a group, `Research_and_development`, that has
+its "`Funding`" field to be "`On hold`".
+
+
+
+Let us now change "`On hold`" to "`No longer on hold`", using the command `field edit g/2 Funding No longer on hold`.
+
+
+
+The field is now successfully updated!
+
+### Delete a field: `field delete`
+
+The command will attempt to delete a field that belongs to a group, task or person.
+A field can provide additional information to the [item](#constraints-on-placeholder-words) when it is needed.
+
+**Format:**
+
+- `field delete u/` to delete a field `` from the person at the current `INDEX`.
+
+- `field delete g/` to delete a field `` from the group at the current `INDEX`.
+
+- `field delete t/` to delete a field `` from the task at the current `INDEX`.
+- ` field delete ` to delete a field `` from the task at the current `INDEX`. [See select command](#select-command)
+
+Continuing from the example in [add a new field](#add-a-new-field-field-add), let us now
+delete the `Priority High` field. To do this, we have to write `field delete t/1 Priority`
+to delete the `Priority` field in the first task listed on the Contactmation display.
+
+
+
+As we can see, the `Priority High` field is now deleted from the `Do paperwork` task.
+
+### Rename the name of items on the screen
+
+If you want to rename any [item](#constraints-on-placeholder-words) in the app, this `rename` command is for you.
+
+