diff --git a/README.md b/README.md
index 13f5c77403f..a1a3c0855a6 100644
--- a/README.md
+++ b/README.md
@@ -1,14 +1,42 @@
-[](https://github.com/se-edu/addressbook-level3/actions)
+[](https://github.com/AY2021S1-CS2103T-T09-1/tp/actions)
+
+# GradPad
+
+GradPad is a one-stop solution to **module management** for Computer Science Undergraduates.
+Planning for modules has always been a tedious process but it does not have to be.
+
+The current approach to planning and tracking graduation requirements is to open up tabs after tabs of NUS resources such as
+[NUSMods](https://nusmods.com/) and [websites](https://www.comp.nus.edu.sg/programmes/ug/cs/curr/) of the School of
+ Computing, which can be messy at times.
+So, the GradPad team has come up with the idea of an **easy-to-use**, **all-in-one application** that
+can ease the process of **module management** for Computer Science Undergraduates.
+
+GradPad **consolidates** the modules you have taken and **displays** the remaining required modules to
+ease your module planning process. A **module searching platform** is also included in GradPad, providing easy
+**navigation** of modules.

-* 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.
+## Installation
+### Requirements
+GradPad requires that you have a Java SE Runtime Environment (JRE) installed on your machine.
+
+### Steps
+1. Download the latest jar release of GradPad from this repository.
+2. Run the downloaded jar file
+ - You can either double-click on the jar file, or
+ - Execute this command from your terminal: `java -jar GradPad.jar`
+
+## Usage
+For detailed guidance on using GradPad, take a look at our user guide
+[here](https://ay2021s1-cs2103t-t09-1.github.io/tp/UserGuide.html).
+
+For developers, view our detailed documentation
+[here](https://ay2021s1-cs2103t-t09-1.github.io/tp/DeveloperGuide.html).
+
+## Contributing
+Although GradPad is an open source project, it is currently not open to public contribution.
+
+## Authors and acknowledgement
+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 be2d2905dde..947980e8ba7 100644
--- a/build.gradle
+++ b/build.gradle
@@ -66,7 +66,11 @@ dependencies {
}
shadowJar {
- archiveName = 'addressbook.jar'
+ archiveName = 'gradpad.jar'
+}
+
+run {
+ enableAssertions = true
}
defaultTasks 'clean', 'test'
diff --git a/docs/AboutUs.md b/docs/AboutUs.md
index 1c9514e966a..acd6e753b52 100644
--- a/docs/AboutUs.md
+++ b/docs/AboutUs.md
@@ -5,55 +5,46 @@ title: About Us
We are a team based in the [School of Computing, National University of Singapore](http://www.comp.nus.edu.sg).
-You can reach us at the email `seer[at]comp.nus.edu.sg`
-
## Project team
-### John Doe
-
-
-
-[[homepage](http://www.comp.nus.edu.sg/~damithch)]
-[[github](https://github.com/johndoe)]
-[[portfolio](team/johndoe.md)]
-
-* Role: Project Advisor
+### Lau Siaw Sam
-### Jane Doe
+
-
-
-[[github](http://github.com/johndoe)]
-[[portfolio](team/johndoe.md)]
+[[github](https://github.com/silvernitro)]
+[[portfolio](team/silvernitro.md)]
* Role: Team Lead
-* Responsibilities: UI
+* Responsibilities: Testing
-### Johnny Doe
+### Lim Shao Kiat
-
+
-[[github](http://github.com/johndoe)] [[portfolio](team/johndoe.md)]
+[[github](http://github.com/shaokiat)]
+[[portfolio](team/shaokiat.md)]
* Role: Developer
-* Responsibilities: Data
+* Responsibilities: Documentation
-### Jean Doe
+### Muhammad Syafiq Bin Abas
-
+
-[[github](http://github.com/johndoe)]
-[[portfolio](team/johndoe.md)]
+[[github](http://github.com/mhdsyfq)]
+[[portfolio](team/mhdsyfq.md)]
* Role: Developer
-* Responsibilities: Dev Ops + Threading
+* Responsibilities: Code Quality
-### James Doe
+### Soon Xiang, Yan
-
+
-[[github](http://github.com/johndoe)]
-[[portfolio](team/johndoe.md)]
+[[github](http://github.com/yan-soon)]
+[[portfolio](team/yan-soon.md)]
* Role: Developer
-* Responsibilities: UI
+* Responsibilities: Deliverables and deadlines
+
+
diff --git a/docs/DeveloperGuide.md b/docs/DeveloperGuide.md
index 4829fe43011..39d2292b41e 100644
--- a/docs/DeveloperGuide.md
+++ b/docs/DeveloperGuide.md
@@ -5,6 +5,27 @@ title: Developer Guide
* Table of Contents
{:toc}
+--------------------------------------------------------------------------------------------------------------------
+## Introduction
+
+GradPad is an offline computer application meant to help Computer Science students from the
+National University of Singapore (NUS) plan their modules with more ease. All module information is
+displayed through our simple and organised Graphical User Interface (GUI). GradPad is also optimised
+for users who prefer working on a Command Line Interface (CLI).
+
+The objectives of the application include:
+
+1. Allowing NUS CS students to track their degree progress.
+2. Allowing NUS CS students to plan their modules for upcoming semesters.
+3. Providing a fast and convenient way to view NUS CS module details.
+
+--------------------------------------------------------------------------------------------------------------------
+## About this Guide
+
+This is a Developer Guide written for developers who wish to contribute to or extend
+our GradPad Project. The guide will explain the different components that make up GradPad
+and how these components come together to implement GradPad.
+
--------------------------------------------------------------------------------------------------------------------
## **Setting up, getting started**
@@ -23,24 +44,25 @@ The ***Architecture Diagram*** given above explains the high-level design of the
-: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.
+:bulb: **Tip:** The `.puml` files used to create diagrams in this document can be found in the [diagrams](https://github.com/AY2021S1-CS2103T-T09-1/tp/blob/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.
-**`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,
+**`Main`** has two classes called [`Main`](https://github.com/AY2021S1-CS2103T-T09-1/tp/blob/master/src/main/java/seedu/address/Main.java) and [`MainApp`](https://github.com/AY2021S1-CS2103T-T09-1/tp/blob/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.
[**`Commons`**](#common-classes) represents a collection of classes used by multiple other components.
-The rest of the App consists of four components.
+The rest of the App consists of five 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.
+* [**`Nusmods`**](#nusmods-component): Reads data from the NUSMODS public API.
-Each of the four components,
+Each of the first four components,
* defines its *API* in an `interface` with the same name as the Component.
* exposes its functionality using a concrete `{Component Name}Manager` class (which implements the corresponding API `interface` mentioned in the previous point.
@@ -62,11 +84,11 @@ The sections below give more details of each component.

**API** :
-[`Ui.java`](https://github.com/se-edu/addressbook-level3/tree/master/src/main/java/seedu/address/ui/Ui.java)
+[`Ui.java`](https://github.com/AY2021S1-CS2103T-T09-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.
+The UI consists of a `MainWindow` that is made up of parts e.g.`CommandBox`, `ResultDisplay`, `ModuleListPanel`, `StatusBarFooter` etc. All these, including the `MainWindow`, inherit from the abstract `UiPart` class.
-The `UI` component uses 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 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/AY2021S1-CS2103T-T09-1/tp/blob/master/src/main/java/seedu/address/ui/MainWindow.java) is specified in [`MainWindow.fxml`](https://github.com/AY2021S1-CS2103T-T09-1/tp/blob/master/src/main/resources/view/MainWindow.fxml)
The `UI` component,
@@ -78,11 +100,11 @@ The `UI` component,

**API** :
-[`Logic.java`](https://github.com/se-edu/addressbook-level3/tree/master/src/main/java/seedu/address/logic/Logic.java)
+[`Logic.java`](https://github.com/AY2021S1-CS2103T-T09-1/tp/blob/master/src/main/java/seedu/address/logic/Logic.java)
-1. `Logic` uses the `AddressBookParser` class to parse the user command.
+1. `Logic` uses the `GradPadParser` class to parse the user command.
1. This results in a `Command` object which is executed by the `LogicManager`.
-1. The command execution can affect the `Model` (e.g. adding a person).
+1. The command execution can affect the `Model` (e.g. adding a module).
1. The result of the command execution is encapsulated as a `CommandResult` object which is passed back to the `Ui`.
1. In addition, the `CommandResult` object can also instruct the `Ui` to perform certain actions, such as displaying help to the user.
@@ -97,31 +119,70 @@ Given below is the Sequence Diagram for interactions within the `Logic` componen

-**API** : [`Model.java`](https://github.com/se-edu/addressbook-level3/tree/master/src/main/java/seedu/address/model/Model.java)
+**API** : [`Model.java`](https://github.com/AY2021S1-CS2103T-T09-1/tp/blob/master/src/main/java/seedu/address/model/Model.java)
The `Model`,
* stores a `UserPref` object that represents the user’s preferences.
-* stores the address book data.
-* exposes 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 GradPad data.
+* exposes 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.
* does not depend on any of the other three 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` object.
-
-
-
-
-
### Storage component

-**API** : [`Storage.java`](https://github.com/se-edu/addressbook-level3/tree/master/src/main/java/seedu/address/storage/Storage.java)
+**API** : [`Storage.java`](https://github.com/AY2021S1-CS2103T-T09-1/tp/blob/master/src/main/java/seedu/address/storage/Storage.java)
The `Storage` component,
* can save `UserPref` objects in json format and read it back.
-* can save the address book data in json format and read it back.
+* can save the GradPad data in json format and read it back.
+* stores required modules that are on the Computer Science curriculum, in the `RequiredCommandStorage` class.
+* stores all General Education modules available in NUS, in the `GemCommandStorage` class.
+
+### Design considerations
+
+We chose to set up the module-specific Storage classes, with the sole purpose of extracting and parsing the JSON data
+so that GradPad can interact with it.
+
+### Rationale
+
+This is done so that the `RequiredCommand`, `GemCommand` and `ScienceCommand` classes do not have to worry about
+data retrieval and storage, such that they can focus on executing the command logic.
+
+The two Storage classes are separated to avoid cluttering up `RequiredCommandStorage`, due to the hefty size of
+General Education Modules.
+
+### Nusmods component
+
+
+
+**API** : [`NusmodsData.java`](https://github.com/AY2021S1-CS2103T-T09-1/tp/blob/master/src/main/java/seedu/address/nusmods/NusmodsData.java)
+
+The `Nusmods` component,
+* can fetch module data from the NUSMODS public API.
+* can save fetched module data in the form of `ModuleInfo` objects to a local JSON file.
+* can provide module information based on a module code, in the form of `ModuleInfo` objects.
+
+Critically, the component is able to fall back on reading pre-fetched module information from a local file when
+there's no internet connection.
+
+#### Design considerations
+
+We chose to split the `Nusmods` component into two main parts that have the following responsibilities respectively:
+* Fetch module data - handled by `DataFetcher`
+* Allow other GradPad components to access module data - handled by `NusmodsData`
+
+##### Rationale
+
+We chose to do this instead of clumping all the logic together to achieve better encapsulation and abstraction.
+With this, the `NusmodsData` class only needs to be concerned with reading available module data, processing it,
+and serving it up to the code who requested it. It doesn't need to care about how the data got there.
+That's the job of the `DataFetcher` class. As such, it is easy for us to swap out `DataFetcher`, or change its
+implementation without the need to touch the public interface provided by `NusmodsData`. This will prove to be
+useful when, for example, the NUSMODS API becomes obsolete, and we need to use another API, or if the NUSMODS
+API changes, and we need to redesign how we fetch data from it.
+
### Common classes
@@ -133,41 +194,681 @@ Classes used by multiple components are in the `seedu.addressbook.commons` packa
This section describes some noteworthy details on how certain features are implemented.
+### Nusmods feature
+GradPad is tightly integrated with the NUSMods public API by using it to retrieve NUS module information to display
+to users. More specifically, GradPad can perform the following operations:
+
+* Retrieve information about a single module via the `/modules` API endpoint
+* Retrieve a list of all NUS modules via the `/moduleList` API endpoint
+* Store retrieved module information data from the aforementioned endpoints as local JSON files
+* Read pre-fetched module information from local JSON files
+
+The last 2 operations are crucial to allow GradPad to operate even without an internet connection. This will
+be elaborated further below.
+
+#### How a single module's data is retrieved (when connected to the internet)
+GradPad uses the `ModuleInfo` class to represent module information received from NUSMods. Besides storing the various
+schema fields in the API's JSON response as plain old Java objects (POJOs), it also handles the massaging of these
+fields when they are read.
+For e.g. the raw numerical semesters "3" and "4" must be mapped to "Special Term I" and "Special Term II" when read.
+
+This is the flow of logic when a single module's data is fetched via the API:
+
+1. Some client code calls the `getModuleInfo` method in the `NusmodsDataManager` class and passes in a
+module code as a string parameter.
+
+2. `getModuleInfo` calls the `fetchModuleInfo` method in the `DataFetcherManager` class.
+
+3. `fetchModuleInfo` then makes a HTTP GET request to the NUSMods `/modules` endpoint via the `makeGETRequest`
+utility method defined within the `HttpUtil` class. It also specifies the module code of the module it wants to fetch.
+
+4. The `makeGETRequest` method returns the HTTP response as a string. In this case, the response returned is a
+JSON string.
+
+5. `fetchModuleInfo` then parses this JSON string into a `ModuleInfo` object.
+
+Note: GradPad sets a 3s second timeout for all HTTP GET requests made. Adjust this where necessary.
+
+The following sequence diagram illustrates this flow:
+
+
+
+#### How a single module's data is retrieved (when disconnected from the internet)
+Without an internet connection, GradPad clearly cannot retrieve module information via HTTP requests. Instead,
+GradPad provides a fallback by including pre-fetched CS curriculum modules in each app release. This is a compromise
+we choose to take. While pre-fetched data implies that it might not be up-to-date, we feel that this is better than
+completely disallowing users from using GradPad without an internet connection. On top of this, we only choose
+to pre-fetch CS curriculum modules as scraping and saving all 5800+ NUS modules means we'll have to make ungraceful
+API requests and bloat our releases. It is also not scalable in any way.
+
+This is the flow of logic when a single module's data is retrieved without an internet collection:
+
+1. Some client code calls the `getModuleInfo` method in the `NusmodsDataManager` class and passes in a
+module code as a string parameter.
+
+2. `getModuleInfo` calls the `fetchModuleInfo` method in the `DataFetcherManager` class. However, as there is no
+ internet connection, this method call will fail with an exception.
+
+3. Catching this, `getModuleInfo` proceeds to call the `getModuleInfoFromFile` method within the same class instead.
+
+4. `getModuleInfoFromFile` then retrieves the local JSON file containing the module's information, reads it, and
+parses it into a `ModuleInfo` object.
+
+The following sequence diagram illustrates this flow:
+
+
+
+#### How module data is scraped and saved locally
+As explained in the previous section, GradPad is able to access pre-fetched module information stored as local
+JSON files. This section will explain the script used to scrape and save the 100+ CS curriculum modules that runs
+before shipping out GradPad releases.
+
+This is the script's flow of logic:
+1. The entry point of this flow is the `fetchAndSaveModules` method within the `DataFetcherManager` class.
+
+2. `fetchAndSaveModules` starts by fetching a list of all modules from the `/moduleList` API endpoint via a call
+to the `fetchModuleSummaryList` method.
+
+3. `fetchModuleSummaryList` makes the HTTP GET request and parses the JSON string response into a list of
+ `ModuleSummary`
+objects.
+
+4. This list of `ModuleSummary` objects are then filtered to remove all non-CS curriculum modules by passing it through
+the `filterModuleSummaries` method.
+
+5. Now that this list only contains `ModuleSummary` objects related to the CS curriculum, it is then passed to the
+`generateModuleInfoMap` method.
+
+6. `generateModuleInfoMap`'s main job is to create a map of module codes to `ModuleInfo` objects so that GradPad can
+easily retrieve `ModuleInfo` objects given a module code. It does this by
+iterating through every `ModuleSummary`, and fetching that module's module information from the `/modules` endpoint.
+It then parses each module's information into a `ModuleInfo` object and puts it in a hashmap.
+
+7. After this map is populated, it is then serialized and saved into a local JSON file.
+
+Note: GradPad rate-limits step 6 with a 100ms delay between successive hits to the `/modules` endpoint. Adjust where
+necessary.
+
+The following sequence diagram illustrates this flow:
+
+
+
+### Command Stalling feature
+
+GradPad stalls certain commands that erase data so that users can provide confirmation as to
+whether or not they wish to proceed with the commands. This feature relies heavily on each commands' `requiresStall()` method.
+
+This is the general flow of logic when handling commands:
+
+
+
+
+1. If a command `requiresStall`, `LogicManager` will self-invoke its `handleStall()` to store the command to be stalled.
+
+2. `handleStall()` will then return a `CommandResult` which prompts the user for a confirmation.
+
+The following sequence diagram illustrates this flow:
+
+
+
+If the user provides a `YesCommand`, the `stalledCommand` is executed.
+
+The following sequence diagram illustrates this flow:
+
+
+
+However, if the user does not provide a `YesCommand`, the stalledCommand will be set to null, after which an abort message will be displayed.
+
+The following sequence diagram illustrates this flow:
+
+
+
+### Add feature
+GradPad allows users to add modules to their list.
+
+The following fields of a module are required (* for optional):
+* Module Code
+* Tags*
+
+As with all operations in GradPad, the `AddCommand` class handles the execution of add operations.
+The `AddCommandParser` class helps to parse user's input before creating the correct add command.
+
+Given below is how an add operation behaves at each step of its execution.
+
+1. The user types in a command string corresponding to an add operation.
+
+2. This calls the `execute` method of the `LogicManager` class. The user input is passed in as a string.
+
+3. `Logic.execute()` then calls the `parseCommand` method of the `gradPadParser` class to parse the string input.
+
+4. `gradPadParser.parseCommand()` sees that this is an add command, and so uses the `AddCommandParser` class to create a corresponding `AddCommand`, using the `AddCommandParser.parse()` method.
+
+5. In `AddCommandParser.parse()`, the string input is first split into tokens, i.e. module code, tags, etc.
+
+6. The `ModuleInfoSearcher.searchModule()` is then called to retrieve module information (module title, modular credits, etc.) from Nusmods.
+
+7. Once the module information is retrieved, a new `Module` object is created from the module information and tags. It now stores the values that we want to add into our list.
+
+8. Lastly, in the same method call, an `AddCommand` is created with the new populated `Module`, and is passed back to the `LogicManager` in step 2.
+
+9. `Logic Manager` executes the newly created `AddCommand`.
+
+10. Finally, the `Model` is then updated by adding the new `Module` object.
+
+**Auto-Retrieval of Module Information**
+
+GradPad's `add` feature supports auto retrieval of module information from NUSMods, mainly a module's title and modular credits.
+This is to ensure that the modules added into GradPad are valid NUS modules, and the module information for each module is accurate.
+
+The following sequence diagram shows how the add command is executed.
+
+
+
+### Edit feature
+GradPad allows users to edit modules that have already been added.
+
+The following fields of a module can be edited:
+* Module Code
+* Tags
+
+As with all operations in GradPad, the `EditCommand` class handles the execution of edit operations.
+The `EditCommandParser` class helps to parse a user's input before creating the correct edit command.
+
+GradPad uses the `EditModuleDescriptor` class to facilitate edit operations. An `EditModuleDescriptor` is
+a temporary bridge that holds the newly-edited fields of a module. You can set the `ModuleCode` and `Tags` of an `EditModuleDescriptor`,
+whereas the `ModuleTitle` and `ModularCredits` of a module will be retrieved automatically via NUSMods.
+At least one field (`ModuleCode` or `Tags`) must be specified to successfully edit a module.
+
+Given below is how an edit operation behaves at each step of its execution.
+
+1. The user types in a command string corresponding to an edit operation.
+
+2. This calls the `execute` method of the `LogicManager` class. The user input is passed in as a string.
+
+3. `Logic.execute()` then calls the `parseCommand` method of the `gradPadParser` class to parse the string input.
+
+4. `gradPadParser.parseCommand()` sees that this is an edit command, and so uses the `EditCommandParser`
+class to create a corresponding `EditCommand`.
+
+5. In `EditCommandParser`, the string input is first split into tokens, i.e. new module code, new tags, etc.
+
+6. The `ModuleInfoSearcher.searchModule()` is then called to retrieve module information (module title, modular credits, etc.) of the new module from Nusmods.
+
+7. Once the module information is retrieved, an `EditModuleDescriptor` object is created from the module information and tags. It now stores
+the new values that we want to update the target module with.
+
+8. An `EditCommand` is then created with this populated `EditModuleDescriptor`, and is passed back to the
+`LogicManager` in step 2.
+
+9. `LogicManager` executes the newly created `EditCommand`.
+
+10. The target module to be edited is retrieved. A copy of it is made and using the populated
+ `EditModuleDescriptor`, the fields that are to be updated are replaced with their new values.
+
+11. The `Model` is then updated by replacing the target module with its new updated copy.
+
+**Auto-Retrieval of Module Information**
+
+When a user wishes to edit the module code of a module, GradPad's `edit` feature supports auto retrieval of the new module information from NUSMods, mainly the module's title and modular credits.
+This is to ensure that newly edited modules are valid NUS modules, and the module information for the edited module is accurate.
+
+The following sequence diagram shows how the edit command is executed.
+
+
+
+### Delete feature
+GradPad allows users to delete modules that have already been added.
+
+As with all operations in GradPad, the `DeleteCommand` class handles the execution of delete operations.
+The `DeleteCommandParser` class helps to parse a user's input before creating the correct delete command.
+
+Given below is how a delete operation behaves at each step of its execution.
+
+1. The user types in a command string corresponding to a delete operation.
+
+2. This calls the `execute` method of the `LogicManager` class. The user input is passed in as a string.
+
+3. `Logic.execute()` then calls the `parseCommand` method of the `gradPadParser` class to parse the string input.
+
+4. `gradPadParser.parseCommand()` sees that this is an delete command, and so uses the `DeleteCommandParser`
+class to create a corresponding `DeleteCommand`, using the `DeleteCommandParser.parse()` method.
+
+5. In `DeleteCommandParser`, the ModuleCode is first extracted from the string input.
+
+6. A `DeleteCommand` is then created with the ModuleCode, and is passed back to the
+`LogicManager` in step 2.
+
+7. `LogicManager` self-invokes its `handleStall()` method and returns a `CommandResult` which prompts the user for a confirmation.
+
+8. When the user enters a `YesCommand`, `LogicManager` executes the stalled `DeleteCommand`.
+
+9. The target module to be deleted is retrieved, if it exists in the Completed Modules of GradPad.
+
+10. The `Model` is then updated by removing the target module.
+
+The following sequence diagram shows how the delete command is executed.
+
+
+
+
:information_source: **Note:** If the user performs a Force Delete Operation,
+the `LogicManager` will skip the part where it self-invokes its `handleStall()` method, and execute the command immediately.
+
+
+
+### Find feature
+GradPad allows users to find a specific module or a group of modules with common tags or sequence of characters. This feature is especially useful
+if there is a long list of modules currently in GradPad and users want to avoid the hassle of scrolling through the
+entire list to look for specific module(s).
+
+As with all operations in GradPad, the `FindCommand` class handles the execution of find operations.
+The `FindCommandParser` class helps to parse a user's input before creating the correct find command.
+
+Given below is a series of steps to show how a find operation behaves during its execution.
+
+1. The user types in a command string corresponding to a find operation, e.g. "find cs foundation".
+
+2. This calls the `execute` method of the `LogicManager` class. The user input is passed in as a string.
+
+3. `Logic.execute()` then calls the `parseCommand` method of the `GradPadParser` class to parse the string input.
+
+4. `GradPadParser.parseCommand()` identifies the command as a find command, and thus uses the `FindCommandParser`
+class to extract the string input as a list of keywords and create a `CompoundFindPredicate` with said list.
+
+5. `CompoundFindPredicate` will test every keyword in the list against the logical union of both predicates
+`ModuleCodeContainsKeywordsPredicate` and `ModuleContainsTagsPredicate`, and returns the result.
+
+6. A corresponding `FindCommand` will then be created using this `CompoundFindPredicate`.
+
+5. This `FindCommand` is then passed back to the`LogicManager` in step 2.
+
+6. `LogicManager` executes the newly created `FindCommand`.
+
+7. `FindCommand.execute()` calls for `Model` to filter the GradPad list based on the given predicate(s).
+
+8. Finally, a `CommandResult` is created and returned to show the result of the execution.
+
+The following sequence diagram illustrates how the find command is executed.
+
+
+
+### List feature
+
+The `list` command shows all modules that have been added by the user in the `Completed Modules` list.
+This is needed as certain commands can change the modules that are being displayed. One such command is the
+`find` command, which shows only matching modules in the list.
+
+Before diving into how the `list` operation is executed, we must first gain a brief understanding of how the
+`Completed Modules` list displays its modules, and how this display can be changed by other commands.
+
+The `Completed Modules` list is implemented by the `ModuleListPanel` UI class.
+This class contains a list of modules, which comes from GradPad's `Model` component, that it uses to
+display to the user. To change the contents of the list, commands can apply filters to this list through `Model`.
+For example, a command may ask `Model` to only show modules that have 4 modular credits.
+When this happens, `Completed Modules` naturally changes the modules it displays too.
+
+The following diagram illustrates this relationship:
+
+
+
+With this in mind, the aim of the `list` command is therefore to remove any existing filter on this module list,
+effectively getting `Completed Modules` to display all modules once again.
+
+Given below is a series of steps to show how a list operation behaves during its execution to achieve just this.
+
+1. The user input is parsed and constructs a `ListCommand` object. (Implementation details of the parser are omitted
+ here as they are not central in developing an understanding of the `list` operation)
+
+2. When this command is executed, it calls the `updateFilteredModuleList` method in the `Model` class and passes in
+a predicate that lets all modules through the filter.
+
+3. The `Model` class updates its `filteredModules` list to include all modules as if it were unfiltered.
+
+4. The `ModuleListPanel` UI component listens to changes in `filteredModules` and updates whenever the list is updated.
+It thus updates to display all modules too.
+
+The following sequence diagram illustrates how the list command is executed.
+
+
+
+### CheckMc feature
+
+The `checkmc` command allows users to view a tally of the total no. of modular credits from the modules present
+in the `Completed Modules` list.
+
+As with all operations in GradPad, the `CheckMcCommand` class handles the execution of `checkmc` operations.
+In brief, it works by going through all modules in the `Completed Modules` list and summing up each module's
+modular credits.
+
+Given below is a series of steps to show how a `checkmc` operation behaves during its execution.
+
+1. The user enters the `checkmc` command string.
+
+2. This calls the `execute` method of the `LogicManager` class with the user input passed in as a string.
+
+3. `Logic.execute()` then calls the `parseCommand` method of the `GradPadParser` class to parse the string input.
+
+4. `GradPadParser.parseCommand()` identifies the command as a checkmc command and thus creates a `CheckMcCommand`
+object.
+
+5. This command object is then passed back to the `LogicManager` in step 2.
+
+6. `LogicManager` executes the newly created `CheckMcCommand`.
+
+7. `CheckMcCommand.execute()` retrieves the `GradPad` object stored within `Model` and accesses the `modules` field
+within the `GradPad`.
+
+8. It then loops through `modules`, which is a list of `Module` objects, and sums up all their modular credits.
+
+8. Finally, a `CommandResult` is created to show the total no. of modular credits calculated.
+
+The following sequence diagram illustrates how the `checkmc` command is executed.
+
+
+
+### Check required modules feature
+
+The `required` command allows users to view the required modules in the NUS Computer Science curriculum
+that they have yet to take.
+
+When the command is executed, it checks through the current modules in the `Completed Modules` list and ensures
+that modules that have already been taken are not displayed in the list of remaining required modules.
+
+This is achieved with the `RequiredCommand` and `RequiredCommandStorage` class. The `RequiredCommandStorage` class
+handles the extracting, parsing of JSON module data while the `RequiredCommand` handles the logic
+behind filtering the undone modules.
+
+As with all operations in GradPad, the `RequiredCommand` class handles the execution of `required` operations.
+
+Given below is a series of steps to show how a `required` operation behaves during its execution.
+
+1. The user enters the `required` command string.
+
+2. This calls the `execute` method of the `LogicManager` class with the user input passed in as a string.
+
+3. `Logic.execute()` then calls the `parseCommand` method of the `GradPadParser` class to parse the string input.
+
+4. `GradPadParser.parseCommand()` identifies the command as a required command and thus creates a `RequiredCommand`
+object.
+
+5. This command object is then passed back to the `LogicManager` in step 2.
+
+6. `LogicManager` executes the newly created `RequiredCommand`, which will contain the following uninitialised attributes,
+list of `currentModules` in GradPad, all the `leftOverModules` and a `RequiredCommandStorage` to store all modules
+in the syllabus.
+
+7. Then, `RequiredCommand.execute()` retrieves the `GradPad` object stored within `Model` and accesses the `modules
+` field within the `GradPad` with a few method calls, before storing it in `currentModules`.
+
+8. `RequiredCommand.execute()` then calls its own method `setStorage` to create a `RequiredCommandStorage` object.
+
+9. Within the `setStorage` method, various method calls are made for each module category (Eg. Foundation, IT Professionalism)
+ to set up the `RequiredCommandStorage` object with the all the relevant modules.
+
+10. Then, `RequireCommand.execute()` call its own method `compareAllGEs()` to check if any GE pillars have not been cleared.
+It then keeps track of which pillars have not been cleared.
+
+11. `RequireCommand.execute()` then proceeds to call its own methods `compareModules`, `compareScience` and `compareInternship`
+to keep track of undone modules by cross-referring to the `currentModules` list.
+
+12. Finally, a `CommandResult` is created with the `leftOverModules` to show the filtered list of remaining required modules.
+
+The following sequence diagram illustrates how the `required` command is executed.
+
+
+
+### Check all available Science Modules
+
+The `science` command allows users to view all available Science modules available on the Computer Science curriculum.
+
+When the command is executed, a list of all available Science modules will be displayed on the `Result Display`.
+
+This is achieved by tapping into the `RequiredCommandStorage` class to extract and parse the Science modules, while the
+`ScienceCommand` class handles the logic of displaying the modules. This command is separated from the `required`
+command to avoid cluttering of the `Result Display`.
+
+As with all operations in GradPad, the `ScienceCommand` class handles the execution of `science` operations.
+
+Given below is a series of steps to show how a `science` operation behaves during its execution.
+
+1. The user enters the `science` command string.
+
+2. This calls the `execute` method of the `LogicManager` class with the user input passed in as a string.
+
+3. `Logic.execute()` then calls the `parseCommand` method of the `GradPadParser` class to parse the string input.
+
+4. `GradPadParser.parseCommand()` identifies the command as a science command and thus creates a `ScienceCommand`
+object.
+
+5. This command object is then passed back to the `LogicManager` in step 2.
+
+6. `LogicManager` executes the newly created `ScienceCommand`, which will contain an empty list of `scienceModules`,
+to be filled up by fetching a `RequiredCommandStorage` object.
+
+7. Then, the `ScienceCommand.execute()` calls its own method, `setScienceModules()` which creates a
+`RequiredCommandStorage` object.
+
+8. Inside the `setScienceModules()` method, the `setRequiredScience` method of the `RequiredCommandStorage` class
+is invoked, which sets `scienceModules` with the list of available Science modules.
+
+9. Then, `ScienceCommand.execute()` calls for `Model` to filter out all existing Science modules in GradPad from
+`scienceModules`, via the `hasModule()` method.
+
+10. Finally, a `CommandResult` is created with the `filteredScienceModules` to display the modules.
+
+The following sequence diagram illustrates how the `science` command is executed.
+
+
+
+### Check all available General Education Modules
+
+The `gem` command allows users to view all available General Education (GE) modules available in NUS.
+
+When the command is executed, a list of all available GE modules will be displayed on the `Result Display`.
+
+This is achieved with the `GemCommand` and `GemCommandStorage` class. The `GemCommandStorage` class
+handles the extracting and parsing of JSON module data while the `GemCommand` handles the logic of displaying the
+modules. This command is separated from `required` to avoid cluttering up the `Result Display` due to the hefty
+amount of GE modules displayed.
+
+As with all operations in GradPad, the `GemCommand` class handles the execution of `gem` operations.
+
+Given below is a series of steps to show how a `gem` operation behaves during its execution.
+
+1. The user enters the `gem` command string.
+
+2. This calls the `execute` method of the `LogicManager` class with the user input passed in as a string.
+
+3. `Logic.execute()` then calls the `parseCommand` method of the `GradPadParser` class to parse the string input.
+
+4. `GradPadParser.parseCommand()` identifies the command as a gem command and thus creates a `GemCommand`
+object.
+
+5. This command object is then passed back to the `LogicManager` in step 2.
+
+6. `LogicManager` executes the newly created `GemCommand`, which will contain 2 uninitialised
+`GemCommandStorage` attributes, used to store Semester 1 and 2 General Education Modules.
+
+7. `GemCommand.execute()` then calls its own method `setSem1Storage` and `setSem2Storage` to create 2 `GemCommandStorage`
+objects.
+
+8. Within the `setSem1Storage` and `setSem2Storage` methods, various method calls are made for each GE pillar (Eg. GET, GER)
+to set up the `sem1Storage` and `sem2Storage` objects with the all the relevant `sem1GeModules` and `sem2GeModules`.
+
+9. Then, `GemCommand.execute()` calls for `Model` to filter out all existing GE modules in GradPad from both
+`sem1GeModules` and `sem2GeModules`, via the `hasModule()` method.
+
+10. Finally, a `CommandResult` is created with all the filtered GE modules, displaying all the available
+GE modules by Semester.
+
+The following sequence diagram illustrates how the `gem` command is executed.
+
+
+
+### Search feature
+
+The `search` command allows users to search for any module available in NUS and display the module details.
+
+To retrieve a module's information, the execution of this command interacts with the `Nusmods` component, which
+contains all logic related to the access of module data from the NUSMODS public API. We will not go into detail
+about the component here as we are mainly focused on the implementation of the search functionality.
+
+As with all operations in GradPad, the `SearchCommand` class handles the execution of `search` operations.
+
+Given below is a series of steps to show how a `search` operation behaves during its execution.
+
+1. The user enters a search command string containing a module code, e.g. "search CS2103T".
+
+2. This calls the `execute` method of the `LogicManager` class with the user input passed in as a string.
+
+3. `Logic.execute()` then calls the `parseCommand` method of the `GradPadParser` class to parse the string input.
+
+4. `GradPadParser.parseCommand()` sees that this is a search command, and so uses the `SearchCommandParser.parse()`
+method in `SearchCommandParser`.
+
+5. In `SearchCommandParser`, `SearchCommandParser.parse()` extracts the ModuleCode from the string input.
+
+6. A `SearchCommand` is then created with the ModuleCode, and is passed back to the
+`LogicManager` in step 2.
+
+7. `LogicManager` executes the newly created `SearchCommand`.
+
+8. `SearchCommand.execute()` then creates an instance of `ModuleInfoSearcher` to call the `searchModule()` method by
+passing in the module code.
+
+9. `searchModule()` method will then take in the module code and retrieve the `ModuleInfo` by calling
+`NusmodsData.getModuleInfo()` in the `Nusmods` package.
+
+10. The `ModuleInfo` of the searched module retrieved will then be accessed and formatted according to the display
+requirement.
+
+11. Finally, a `CommandResult` is created to display the module information that has been retrieved.
+
+The following sequence diagram illustrates how the `search CS2103T` command is executed.
+
+
+
+### Tags feature
+
+GradPad allows users to add tags to modules that they add, remove tags from existing modules, list out all
+existing tags in GradPad, and filter the `Completed Modules` list by tags.
+
+Tags are represented by `Tag` objects which are referenced by `Module` objects when modules are tagged.
+
+To prevent duplicate tags from being created everytime a module is tagged (as was the case in the original AB3),
+the `GradPad` class uses a `UniqueTagMap` class to keep track of a collection of unique `Tag` objects. With this,
+when a user tags a module with an existing tag, `UniqueTagMap` looks for the existing `Tag` object and adds it to
+that `Module` object. As such, all modules who use a particular tag now reference that corresponding singular `Tag
+` object.
+
+The main benefit of this is evident when GradPad needs to print out a list of all tags, which can be simply done
+by printing out `UniqueTagMap`'s tags. Otherwise, one would have to iterate through all `Module` objects,
+retrieve all their tags, and then filter them to remove any duplicates.
+
+Following this, `UniqueTagMap` also has to handle the addition and deletion of modules, which is utilized by
+the `GradPad` class's add, edit, and delete operations for modules.
+
+#### Adding a module with tags
+
+1. When a module with tags is going to be added, the `GradPad` class within the `Model` component is passed that newly
+ constructed `Module` object from the `Logic` component (see [add feature](#add-feature)).
+
+2. Its `addModule` method is invoked with this object as a parameter.
+
+3. Before adding this module to its list of modules, this new module's tags will first be parsed and replaced with
+existing tags where possible. This is done using the`checkAndReplaceTags` method in the `UniqueTagMap` class.
+
+4. The `checkAndReplaceTags` method basically loops through a list of `Tag` objects and checks each one against
+the collection of existing `Tag` objects it already holds. If it comes across a "new" `Tag` that already exists
+within its collection of tags, it replaces that "new" `Tag` with its existing equivalent `Tag` object in the list.
+Otherwise, it adds genuinely new `Tag` objects to its collection.
+
+5. Now that the new `Module` object's tags have been checked and replaced, the model adds this `Module` to its
+`UniqueModuleList`.
+
+The following diagram illustrates this flow of logic.
+
+
+
+#### Deleting a module with tags
+
+When a module is being deleted, its `Tag` objects within cannot simply be deleted, since multiple
+`Module`s may share the same `Tag` object. Yet at the same time, when a `Tag` is no longer referenced by any `Module`,
+it should be removed so that it doesn't loiter around in `UniqueTagMap`. To achieve this, `Tag` objects
+store a count of the no. of modules that are currently using it. When this count hits 0, the `Tag` can be safely
+ removed.
+
+This is the execution flow when a module is deleted:
+
+1. The `removeModule` method in the `GradPad` class is invoked.
+
+2. The `remove` method in `UniqueTagMap` is then invoked with a set of all `Tag` objects belonging to the `Module` that
+is to be removed.
+
+3. Within the `remove` method, each `Tag`'s module count is decremented. If the count reaches 0 at this point,
+then the `Tag` must be unused by all modules. It is thus removed from the collection of `Tag`s within
+`UniqueTagMap`.
+
+4. The `Module` object can now be deleted from the `UniqueModuleList` in the `GradPad` class.
+
+The diagram illustrates this flow of logic:
+
+
+
+#### Editing a module's tags
+
+When editing a module's tags, the old tags are simply "removed" as when
+[a module is deleted](#deleting-a-module-with-tags), followed by "adding" the new tags, as when
+[a module is added](#adding-a-module-with-tags).
+
+
### \[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:
+The proposed undo/redo mechanism is facilitated by `VersionedGradPad`. It extends `GradPad` with an undo/redo history,
+stored internally as a `gradPadStateList` 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.
+* `VersionedGradPad.commit()` — Saves the current GradPad state in its history.
+* `VersionedGradPad.undo()` — Restores the previous GradPad state from its history.
+* `VersionedGradPad.redo()` — Restores a previously undone GradPad state from its history.
-These operations are exposed in the `Model` interface as `Model#commitAddressBook()`, `Model#undoAddressBook()` and `Model#redoAddressBook()` respectively.
+These operations are exposed in the `Model` interface as `Model.commitGradPad()`, `Model.undoGradPad()`
+and `Model.redoGradPad()` respectively.
Given below is an example usage scenario and how the undo/redo mechanism behaves at each step.
-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.
+Step 1. The user launches the application for the first time. The `VersionedGradPad` will be initialized with
+the initial GradPad state, and the `currentStatePointer` pointing to that single GradPad state.

-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.
+Step 2. The user executes `delete CS2103T` command to delete the `CS2103T` Module from the Completed Modules. The
+`delete` command calls `Model.commitGradPad()`, causing the modified state of the GradPad after the `delete CS2103T`
+command executes to be saved in the `gradPadStateList`, and the `currentStatePointer` is shifted to the newly inserted
+GradPad state.

-Step 3. The user executes `add n/David …` to add a new person. The `add` command also calls `Model#commitAddressBook()`, causing another modified address book state to be saved into the `addressBookStateList`.
+Step 3. The user executes `add CS2100` to add a new module. The `add` command also calls `Model.commitGradPad()`,
+causing another modified GradPad state to be saved into the `gradPadStateList`.

-
: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`.
+
:information_source: **Note:** If a command fails its execution, it
+will not call `Model.commitGradPad()`, so the GradPad state will not be saved into the `gradPadStateList`.
-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.
+Step 4. The user now decides that adding the module was a mistake, and decides to undo that action by executing the
+`undo` command. The `undo` command will call `Model.undoGradPad()`, which will shift the `currentStatePointer` once
+to the left, pointing it to the previous GradPad state, and restores the GradPad to that state.

-
: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
+
:information_source: **Note:** If the `currentStatePointer` is at index
+0, pointing to the initial GradPad state, then there are no previous GradPad states to restore. The `undo` command
+uses `Model.canUndoGradPad()` to check if this is the case. If so, it will return an error to the user rather
than attempting to perform the undo.
@@ -176,21 +877,31 @@ The following sequence diagram shows how the undo operation works:

-
: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.
+
: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.
-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.
+The `redo` command does the opposite — it calls `Model.redoGradPad()`, which shifts the `currentStatePointer` once
+to the right, pointing to the previously undone state, and restores the GradPad 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.
+
:information_source: **Note:** If the `currentStatePointer` is at index
+`gradPadStateList.size() - 1`, pointing to the latest GradPad state, then there are no undone GradPad states to restore.
+The `redo` command uses `Model.canRedoGradPad()` to check if this is the case. If so, it will return an error to the
+user rather than attempting to perform the redo.
-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.
+Step 5. The user then decides to execute the command `list`. Commands that do not modify the GradPad, such as `list`,
+will usually not call `Model.commitGradPad()`, `Model.undoGradPad()` or `Model.redoGradPad()`. Thus, the
+`gradPadStateList` remains unchanged.

-Step 6. The user executes `clear`, which calls `Model#commitAddressBook()`. Since the `currentStatePointer` is not pointing at the end of the `addressBookStateList`, all address book states after the `currentStatePointer` will be purged. Reason: It no longer makes sense to redo the `add n/David …` command. This is the behavior that most modern desktop applications follow.
+Step 6. The user executes `clear`, which calls `Model.commitGradPad()`. Since the `currentStatePointer` is not pointing
+at the end of the `gradPadStateList`, all GradPad states after the `currentStatePointer` will be purged. Reason: It no
+longer makes sense to redo the `add CS2100` command. This is the behavior that most modern desktop
+applications follow.

@@ -202,22 +913,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.
+* **Alternative 1 (current choice):** Saves the entire GradPad.
* 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).
+ * Pros: Will use less memory (e.g. for `delete`, just save the module being deleted).
* Cons: We must ensure that the implementation of each individual command are correct.
-_{more aspects and alternatives to be added}_
-
-### \[Proposed\] Data archiving
-
-_{Explain here how the data archiving feature will be implemented}_
-
-
--------------------------------------------------------------------------------------------------------------------
## **Documentation, logging, testing, configuration, dev-ops**
@@ -230,19 +934,20 @@ _{Explain here how the data archiving feature will be implemented}_
--------------------------------------------------------------------------------------------------------------------
-## **Appendix: Requirements**
+## **Appendix A: Requirements**
### Product scope
**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
+Anybody → Students → University Students → tech savvy University student → Computer Science students
+NUS Computer Science undergraduate students, who wish to keep track of their necessary modules (how many are done, how many are left), and also the total MCs tabulation.
+
+
+**Value proposition**:
+
+Keep track of your degree progress and modules taken during your time in NUS with ease. Faster and more lightweight than traditional GUI applications, view and update your progress by issuing simple text commands. Modules are conveniently categorized into their respective groupings e.g. Unrestricted Electives, Computer Science Foundations, etc.
-**Value proposition**: manage contacts faster than a typical mouse/GUI driven app
### User stories
@@ -251,60 +956,226 @@ Priorities: High (must have) - `* * *`, Medium (nice to have) - `* *`, Low (unli
| 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 |
+| `* * *` | NUS Student | see my total Modular Credits | know how many more I require to graduate |
+| `* * *` | NUS Student | see my past Modules | know what I have taken before |
+| `* * *` | user | delete modules | remove entries that I no longer need |
+| `* * *` | user | add modules and MCs | keep track of my Modular progress |
+| `* *` | first-time user | access the available commands | use the app efficiently |
+| `* *` | user | save and load my Module data | keep track of my Modular progress |
-*{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 `GradPad` and the **Actor** is the `user`, unless specified otherwise)
-**Use case: Delete a person**
+**Use case: UC01 - Delete a module from `Completed Modules`**
**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 delete a specific Module in the `Completed Modules`
+2. GradPad deletes the module
+3. GradPad displays the deleted module onto the `Result Display`
Use case ends.
**Extensions**
-* 2a. The list is empty.
+* 1a. The module does not exist in `Completed Modules`.
- Use case ends.
+ * 1a1. GradPad shows an error message.
+
+ Use case ends.
-* 3a. The given index is invalid.
+* 2a. The given module code is invalid.
- * 3a1. AddressBook shows an error message.
+ * 2a1. GradPad shows an error message.
- Use case resumes at step 2.
+ Use case resumes at step 1.
+
+**Use case : UC02 - Add a module into `Completed Modules`**
+
+**MSS**
+
+1. User requests to add a module into the `Completed Modules`
+2. GradPad adds the module into `Completed Modules`
+3. GradPad displays the module added onto the `Result Display`
+
+ Use case ends.
+
+**Extensions**
+
+* 1a. The input command format is invalid.
+
+ * 1a1. GradPad shows an error message.
+
+ Use case ends.
+
+* 1b. Module to be added does not exist in NUS.
+
+ * 1b1. GradPad shows an error message.
+
+ Use case ends.
+
+**Use case : UC03 - View help**
+
+**MSS**
+
+1. User requests to view help commands
+2. GradPad shows a list of commands
+
+ Use case ends.
+
+**Use case : UC04 - View all `Completed Modules`**
+
+**MSS**
+
+1. User requests to view list of modules in `Completed Modules`
+2. GradPad shows all modules added into `Completed Modules`
+
+ Use case ends.
+
+**Use case: UC05 - Edit a module in `Completed Modules`**
+
+1. User requests to edit a module in `Completed Modules`
+2. Module is replaced with updated fields
+3. GradPad displays the module edited onto the `Result Display`
+
+ Use case ends.
+
+**Extensions**
+
+* 1a. The module does not exist in `Completed Modules`.
+
+ * 1a1. GradPad shows an error message.
+
+ Use case ends.
+
+* 1b. No field is edited for the module.
+
+ * 1b1. GradPad shows an error message.
+
+ Use case ends.
+
+* 1c. Edited module does not exist in NUS.
+
+ * 1c1. GradPad shows an error message.
+
+ Use case ends.
+
+
+* 1d. The input fields format is invalid.
+
+ * 1d1. GradPad shows an error message.
+
+ Use case ends.
+
+**Use case : UC06 - Find modules in `Completed Modules`**
+
+**MSS**
+
+1. User requests to find modules in `Completed Modules` using keywords.
+2. GradPad displays the modules found onto the `Result Display`
+
+ Use case ends.
+
+**Extensions**
+
+* 1a. No modules or tag found.
+
+ * 1a1. GradPad displays no modules found message onto `Result Display`.
+
+ Use case ends.
+
+**Use case : UC07 - View required modules in CS curriculum**
+
+**MSS**
+
+1. User requests to view all required modules in CS curriculum
+2. GradPad displays the required modules in CS curriculum onto the `Result Display`
+
+ Use case ends.
+
+**Use case : UC08 - View all available General Education Modules offered in NUS**
+
+**MSS**
+
+1. User requests to view all available General Education Modules offered in NUS.
+2. GradPad displays all available General Education modules onto the `Result Display`
+
+ Use case ends.
+
+**Use case : UC09 - View all available Science modules in the CS curriculum**
+
+**MSS**
+
+1. User requests to view all available Science modules in the CS curriculum.
+2. GradPad displays all available Science modules in the CS curriculum onto the `Result Display`
+
+ Use case ends.
+
+
+**Use case : UC010 - Search for module details**
+
+**MSS**
+
+1. User requests to search for a module in NUS.
+2. GradPad displays the module details in the `Result Display`
+
+ Use case ends.
+
+**Extensions**
+
+* 1a. The module searched does not exist in NUS.
+
+ * 1a1. GradPad shows an error message.
+
+ Use case ends.
+
+**Use case : UC011 - Check total modular credits**
+
+**MSS**
+
+1. User requests to view total modular credits achieved.
+2. GradPad displays the total modular credits in the `Result Display`
+
+ Use case ends.
+
+**Use case : UC12 - exit GradPad**
+
+**MSS**
+
+1. User requests to exit GradPad
+2. GradPad exits
+
+ Use case ends.
-*{More to be added}*
### 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 work on both 32-bit and 64-bit environments.
+3. Should be backwards compatible with data produced by earlier versions of the application.
+4. Should be able to hold up to 1000 modules without a noticeable sluggishness in performance for typical usage.
+5. 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.
+6. Should be able to respond within one seconds.
+7. Should be usable by a novice who has never done module tracking of any sort.
+8. The application is not required to handle module tracking by NUS students outside of the Computer Science major.
*{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
+* **Module Code**: Each module of study has a unique module code consisting of a two- or three-letter prefix that generally denotes the discipline, and four digits.
+ * **First digit**: Represents the level of the module, i.e., 1000 indicates a Level 1 module and 2000, a Level 2 module, etc.
+ * **Second digit**: Indicates the type of module, i.e., 1 for essential, 2 for elective, 3 for enrichment.
+* **Modular Credit (MC)**: A unit of the effort, stated in terms of time, expected of a typical student in managing his/her workload. The MC-value of a module is derived by dividing the estimated total number of workload hours per week for that module by the credit factor of 2.5 (i.e., one MC is equivalent to 2.5 hours of study and preparation per week).
+
+*{More to be added}*
--------------------------------------------------------------------------------------------------------------------
-## **Appendix: Instructions for manual testing**
+## **Appendix B: Instructions for Manual Testing**
Given below are instructions to test the app manually.
@@ -313,44 +1184,392 @@ testers are expected to do more *exploratory* testing.
-### Launch and shutdown
-
-1. Initial launch
+### Launch and Shutdown
- 1. Download the jar file and copy into an empty folder
+1. Initial Launch
- 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 jar file and copy into an empty folder.
+
+ 1. Double-click the jar file.
+ Expected: GUI runs with a set of sample modules. The window size may not be optimum.
-1. Saving window preferences
+1. 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.
Expected: The most recent window size and location is retained.
-1. _{ more test cases … }_
-
-### Deleting a person
-
-1. Deleting a person while all persons are being shown
-
- 1. Prerequisites: List all persons using the `list` command. Multiple persons in the list.
-
- 1. Test case: `delete 1`
- Expected: First contact is deleted from the list. Details of the deleted contact shown in the status message. Timestamp in the status bar is updated.
-
- 1. Test case: `delete 0`
- Expected: No person is deleted. Error details shown in the status message. Status bar remains the same.
-
- 1. Other incorrect delete commands to try: `delete`, `delete x`, `...` (where x is larger than the list size)
- Expected: Similar to previous.
-
-1. _{ more test cases … }_
+1. Shutdown
+
+ 1. Test case: Click the "close" button (red button) at the top of the window.
+ Expected: The window closes immediately.
+
+ 1. Test case: `exit`
+ Expected: GUI shows a farewell message,"Exiting GradPad as requested ..." and delays for 1.5 seconds,
+ after which the window closes.
+
+ 1. Test case: `exitt`
+ Expected: Window does not close. _Unknown command_ message is shown in the result display.
+
+### Testing features
+
+#### Add a Module
+
+Prerequisites:
+ 1. Module code must be specified.
+ 1. Module code format must be valid, e.g. 'CS2100' is a valid module code.
+ 1. Module to be added must exist in the valid modules list fetched from NUSMods, e.g. module code CS2100 is a
+ valid module, whereas module code CS1000 is an invalid module.
+ 1. Module added must not already exist in GradPad.
+ 1. Command must follow the `add` format.
+
+Test Cases:
+1. Test case: `add cs2100 t/fun`
+ Expected: CS2100 module is added into 'Completed Modules' in GradPad. Details of the added module are shown in the result display.
+
+1. Test case: `add cs2100`
+ Expected: No module added. _Duplicate module_ message is shown in the result display.
+
+1. Test case: `add cs2100 t/funnn`
+ Expected: No module added. _Duplicate module_ message is shown in the result display.
+
+1. Test case: `add cs2100 Computer Organisation`
+ Expected: No module added. _Invalid module code format_ message is shown in the result display.
+
+1. Test case: `add cs1000`
+ Expected: No module added. _Invalid module_ message is shown in the result display.
+
+1. Test case: `add`
+ Expected: No module added. _Invalid command format_ message is shown in the result display.
+
+1. Test case: `addd cs2100`
+ Expected: No module added. _Unknown command_ message is shown in the result display.
+
+#### Delete a Module
+
+Prerequisites:
+ 1. Module code must be specified.
+ 1. Module code format must be valid.
+ 1. Module to be deleted must exist in the list being displayed in GradPad, e.g. CS2100 is in the list and CS2106 is not.
+ 1. Command must follow the `delete` format, followed by `y`, `ye`, or `yes` formats for confirmation.
+
+Test Cases:
+1. Test case: `delete cs2100` followed by `y`
+ Expected: CS2100 module is deleted from 'Completed Modules' in GradPad. _Confirmation_ message followed by
+ details of the deleted module are shown in the result display.
+
+1. Test case: `delete cs2100` followed by `n`
+ Expected: No module deleted. _Confirmation_ message followed by _Command aborted_ message are shown in the
+ result display.
+
+1. Test case: `delete cs2100 Computer Ogranisation`
+ Expected: No module deleted. _Invalid module code format_ message is shown in the result display.
+
+1. Test case: `delete cs2106`
+ Expected: No module deleted. _Module not found_ message is shown in the result display.
+
+1. Test case: `delete`
+ Expected: No module deleted. _Invalid command format_ message is shown in the result display.
+
+1. Test case: `deleteee cs2100`
+ Expected: No module deleted. _Unknown command_ message is shown in the result display.
+
+#### Force Delete a module
+
+Prerequisites:
+ 1. Module code must be specified.
+ 1. Module code format must be valid.
+ 1. Module to be deleted must exist in the list being displayed in GradPad, e.g. CS2100 is in the list and CS2106 is not.
+ 1. Command must follow the `fdelete` format.
+
+Test Cases:
+1. Test case: `fdelete cs2100`
+ Expected: CS2100 module is deleted from 'Completed Modules' in GradPad. Details of the deleted module are shown
+ in the result display.
+
+1. Test case: `fdelete cs2100 Computer Ogranisation`
+ Expected: No module deleted. _Invalid module code format_ message is shown in the result display.
+
+1. Test case: `fdelete cs2106`
+ Expected: No module deleted. _Module not found_ message is shown in the result display.
+
+1. Test case: `fdelete`
+ Expected: No module deleted. _Invalid command format_ message is shown in the result display.
+
+1. Test case: `fdeleteee cs2100`
+ Expected: No module deleted. _Unknown command_ message is shown in the result display.
+
+#### Clear current list of Modules
+
+Prerequisites:
+ 1. Command must follow the `clear` format followed by `y`, `ye`, or `yes` formats for confirmation.
+
+Test Cases:
+1. Test case: `clear` followed by `y`
+ Expected: All modules are cleared from GradPad. _Confirmation_ message followed by _GradPad cleared_ message
+ are shown in the result display.
+
+1. Test case: `clearrr`
+ Expected: Modules are not cleared from GradPad. _Unknown command_ message is shown in the result display.
+
+#### Force Clear current list of Modules
+
+Prerequisites:
+ 1. Command must follow the `fclear` format.
+
+Test Cases:
+1. Test case: `fclear`
+ Expected: All modules are cleared from GradPad. _GradPad cleared_ message is shown in the result display.
+
+1. Test case: `fclearrr`
+ Expected: Modules are not cleared from GradPad. _Unknown command_ message is shown in the result display.
+
+#### Edit a Module
+
+Prerequisites:
+ 1. Module code of module to be edited must be specified.
+ 1. Module code format of module to be edited must be valid.
+ 1. Module to be edited must exist in the list being displayed in GradPad, e.g. CS2100 is in the list and CS2106 is not.
+ 1. Module replaced must be an existing module in NUS.
+ 1. At least 1 field to edit must be specified (module code/tags)
+ 1. Format of field to edit must be valid.
+ 1. Replaced fields must be different from current fields.
+ 1. Command must follow the `edit` format.
+
+Test Cases:
+1. Test case: `edit cs2100 c/cs2103t`
+ Expected: CS2100 module is replaced with CS2103T. Details of the edited module are shown in the result display.
+
+1. Test case: `edit cs2100 Computer Organisation c/cs2103t`
+ Expected: No module edited. _Invalid module code format_ message is shown in the result display.
+
+1. Test case: `edit cs2106 c/cs2103t`
+ Expected: No module edited. _Module not found_ message is shown in the result display.
+
+1. Test case: `edit cs2100 c/cs1000`
+ Expected: No module edited. _Invalid module_ message is shown in the result display.
+
+1. Test case: `edit cs2100 c/cs2100s Computer Organisation II`
+ Expected: No module edited. _Invalid module code format_ message is shown in the result display.
+
+1. Test case: `edit cs2100 c/cs2100`
+ Expected: No module edited. _Same module_ message is shown in the result display.
+
+1. Test case: `edit cs2100 t/fun`
+ Expected: CS2100 module tag is replaced with "fun" tag. Details of the edited module are shown in the result display.
+
+1. Test case: `edit cs2100 t/fun`
+ Expected: No module edited. _Same tag_ message is shown in the result display.
+
+1. Test case: `edit cs2100 t/fun!!!`
+ Expected: No module edited. _Invalid tag format_ message is shown in the result display.
+
+1. Test case: `edit`
+ Expected: No module edited. _Invalid command format_ message is shown in the result display.
+
+1. Test case: `edittt cs2100 t/cool`
+ Expected: No module edited. _Unknown command_ message is shown in the result display.
+
+#### List All Modules
+
+Prerequisite:
+ 1. Command must follow the `list` format.
+
+Test Cases:
+1. Test case: `list`
+ Expected: The full list of 'Completed Modules' is displayed. "Listed all modules" message shown in the result display.
+
+1. Test case: `listttt`
+ Expected: Current list remains unchanged. _Unknown command_ message is shown in the result display.
+
+#### Find a Specific Module or a Group of Modules
+
+Prerequisites:
+ 1. Arguments must be specified.
+ 1. Module to be included must exist in the 'Completed Modules' in GradPad, e.g. CS2100 (fun), CS2101 (fun),
+ ST2334 (fun) and CS3230 are in the list and CS2106 is not. The words in the bracket represent the module tags.
+ 1. Command must follow the `find` format.
+
+Test Cases:
+1. Test case: `find cs2`
+ Expected: CS2100 and CS2101 are displayed. "2 modules found!" message shown in the result display.
+
+1. Test case: `find cs2 st`
+ Expected: CS2100, CS2101 and ST2334 are displayed. "3 modules found!" message shown in the result display.
+
+1. Test case: `find cs3230`
+ Expected: CS3230 is displayed. "1 modules found!" message shown in the result display.
+
+1. Test case: `find cs2106`
+ Expected: No modules displayed. "0 modules found!" message shown in the result display.
+
+1. Test case: `find fu`
+ Expected: CS2100, CS2101 and ST2334 are displayed. "3 modules found!" message shown in the result display.
+
+1. Test case: `find fun`
+ Expected: CS2100, CS2101 and ST2334 are displayed. "3 modules found!" message shown in the result display.
+
+1. Test case: `find funnnn`
+ Expected: No modules displayed. "0 modules found!" message shown in the result display.
+
+1. Test case: `find`
+ Expected: Current list is unchanged. _Invalid command format_ message is shown in the result display.
+
+1. Test case: `findd CS2101`
+ Expected: No modules displayed. _Unknown command_ message is shown in the result display.
+
+#### Check Total Modular Credits
+
+Prerequisite:
+ 1. Command must follow the `checkmc` format.
+
+Test Cases:
+1. Test case: `checkmc`
+ Expected: Total modular credits are calculated and displayed. If there are no modules in 'Completed Modules',
+ total modular credits will be 0.
+
+1. Test case: `checkmccccc`
+ Expected: Total modular credits are not calculated. _Unknown command_ message is shown in the result display.
+
+#### Open Help Page
+
+Prerequisite:
+ 1. Command must follow the `help` format.
+
+Test Cases:
+1. Test case: `help`
+ Expected: Help page is displayed.
+
+1. Test case: `helppppp`
+ Expected: Help page is not displayed. _Unknown command_ message is shown in the result display.
+
+#### Show Required Modules
+
+Prerequisite:
+ 1. Command must follow the `required` format.
+
+Test Cases:
+1. Test case: `required`
+ Expected: All required modules are displayed in the result display. Modules already in the 'Completed Modules' list in GradPad would not be displayed in the 'Required Modules' list.
+
+1. Test case: `requiredddd`
+ Expected: Required modules are not displayed. _Unknown command_ message is shown in the result display.
+
+#### Show available Science Modules
+
+Prerequisite:
+ 1. Command must follow the `science` format.
+
+Test Cases:
+1. Test case: `science`
+ Expected: All available Science modules are displayed in the result display. Modules already in the 'Completed Modules'
+ list would not be displayed.
+
+1. Test case: `scienceeeee`
+ Expected: Science modules are not displayed. _Unknown command_ message is shown in the result display.
+
+#### Show available General Education Modules
+
+Prerequisite:
+ 1. Command must follow the `gem` format.
+
+Test Cases:
+1. Test case: `gem`
+ Expected: All available General Education modules are displayed in the result display. Modules already in the 'Completed Modules'
+ list would not be displayed.
+
+1. Test case: `gemmmmm`
+ Expected: General Education modules are not displayed. _Unknown command_ message is shown in the result display.
+
+#### Search Module Information
+
+Prerequisites:
+ 1. Module code must be specified.
+ 1. Module code format must be valid.
+ 1. Module to be searched must exist in the valid modules list fetched from NUSMods,e.g. module code CS2100
+ is a valid module, whereas module code CS1000 is an invalid module.
+ 1. Command must follow the `search` format.
+
+Test Cases:
+1. Test case: `search cs2100`
+ Expected: CS2100 module information is displayed in the result display.
+
+1. Test case: `search cs2100 Computer Organisation`
+ Expected: No module information is displayed. _Invalid module code format_ message is shown in the result display.
+
+1. Test case: `search cs1000`
+ Expected: No module information is displayed. _Invalid module_ message is shown in the result display.
+
+1. Test case: `search`
+ Expected: No module information is displayed. _Invalid command format_ message is shown in the result display.
+
+1. Other invalid search commands to try: `search c/cs2103t`, `search 1`
+ Expected: No module information is displayed. _Invalid module_ message is shown in the result display.
+1. Test case: `searchh cs2100`
+ Expected: No module information is displayed. _Unknown command_ message is shown in the result display.
+
+#### List all current Tags
+
+Prerequisites:
+ 1. Command must follow the `tags` format.
+
+Test Cases:
+1. Test case: `tags`
+ Expected: All tags currently in use will be shown in the result display.
+
+1. Test case: `tagss`
+ Expected: No tags displayed. _Unknown command_ message is shown in the result display.
### 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. Corrupt the current saved data file under `./data/gradpad.json`. One way is to add `-` into one of the module
+ code.
+
+ 1. Open the jar file `gradpad.jar`
+ Expected: No data shown in the Completed Modules list.
+
+ 1. Delete the data folder `./data`
+
+ 1. Open the jar file `gradpad.jar`
+ Expected: Saved data will reset to sample data and will be shown in the Completed Modules list.
+
+## **Appendix C: Effort**
+
+### 1. NusMods 
+GradPad is tightly integrated with the NUSMods public API by using it to retrieve NUS module information to display to
+users. This integration with NUSMods is definitely complex and not easy. Fortunately, one of our team members had some
+experience with web development and managed to integrate the API into GradPad. This allows GradPad to
+retrieve up-to-date module data directly from NUSMods, making GradPad more relevant and adaptable.
+
+As if integrating GradPad, a Java application, with a public web API isn't tedious enough, we also had to meet the
+project constraint that GradPad should be able to function even without an active connection to the API. Ideally,
+it would be straightforward for us to simply scrape data from the API and store it in our own database via a DBMS,
+which is generally done in other applications to reduce dependency on external APIs. However, the module also
+forbids the use of a DBMS, which meant we had to come up with a way to scrape and store data in local files instead.
+At the end of the day, we spent a considerable effort to write a script in Java that scrapes data from the API
+, transforms them into Java objects, and serializes them into human-readable JSON files.
+
+### 2. NUS CS Curriculum
+Our target audience is Computer Science Undergraduates and so we had to get the NUS CS curriculum and utilize
+this data in GradPad. Our initial idea was to just store the entire list of modules in the CS curriculum into GradPad.
+However, we soon realized that there are way more modules than we had anticipated as there is a list of GEMs and
+science modules that we had initially missed out. Besides this, there are also preclusions in some modules and
+equivalent modules with different module codes. These are tough challenges that we had to brainstorm hard to come up
+with innovative solutions to address them. Fortunately, our team managed to address these fundamental problems in the final product.
+
+### 3. UI
+Our GradPad Team has spent a considerable amount of effort on the UI aspect, from choosing the position of the result
+display and command box input, to the color theme that is the most pleasing to the audience. There should also be a
+special mention to Syafiq for coming up with the logo of GradPad from scratch, personalizing GradPad's Ui to our target
+audience. Our team absolutely loves the color theme we have ended up with and we believe our target audience (Computer
+Science Undergraduate) will too.
+
+### 4. Overall
+As a whole, we believe that even though this project was rather demanding and time-consuming, we thoroughly enjoyed
+working with one another. Right from the start, we helped each other with the setting up of Github and the process of
+the project's workflow. All of us were also very encouraging and constantly reviewed each other's pull requests with
+comprehensive comments, allowing us to learn from each other's strengths in coding. We are definitely proud of GradPad
+, and believe that it will serve its purpose to the fullest potential.
diff --git a/docs/UserGuide.md b/docs/UserGuide.md
index b91c3bab04d..2bddbd53852 100644
--- a/docs/UserGuide.md
+++ b/docs/UserGuide.md
@@ -3,176 +3,514 @@ 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
{:toc}
+--------------------------------------------------------------------------------------------------------------------
+## GradPad
+
+We are a team of **Computer Science Undergraduates** working together to solve **module management** and **graduation planning** problems
+faced by fellow Computer Science students. Below is the detailed User Guide for effective use of GradPad which can
+ease and improve your **module planning process**.
+
+GradPad is a one-stop solution to **module management** for Computer Science Undergraduates.
+Planning for modules has always been a tedious process but it does not have to be.
+
+The current approach to planning and tracking graduation requirements is to open up tabs after tabs of NUS resources such as
+[NUSMods](https://nusmods.com/) and School of Computing
+[websites](https://www.comp.nus.edu.sg/programmes/ug/cs/curr/), which can be messy at times.
+So, our team has come up with the idea of an **easy-to-use**, **all-in-one application** that
+can ease the process of **module management** for Computer Science Undergraduates.
+
+GradPad **consolidates** the modules you have taken and **displays** the remaining required modules to
+ease your module planning process. A **module searching platform** is also included in GradPad, providing easy
+**access** to module information.
+
+This user guide introduces what you can do with GradPad and the steps needed to do them. In addition,
+it includes a [quick start guide](#quick-start) that walks you through the installation and set-up process.
+With this guide, you'll be ready to use GradPad in no time.
+
+--------------------------------------------------------------------------------------------------------------------
+## NUSMods integration
+
+
+To streamline your module searching process with added convenience, GradPad integrates data from [NUSMods](https://nusmods.com/). With this,
+you no longer have to visit NUSMods separately to look up module information. Instead, GradPad offers you all that data
+in the same app you use to plan your modules.
+
+We have requested and was granted permission from NUSMods to utilise their platform to retrieve module data. These data
+are retrieved in **realtime**, directly from NUSMods.
+
--------------------------------------------------------------------------------------------------------------------
## Quick start
+Follow the steps below to learn how to get started with GradPad!
+
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).
+1. Download the latest `gradPad.jar` from [here](https://github.com/AY2021S1-CS2103T-T09-1/tp/releases).
-1. Copy the file to the folder you want to use as the _home folder_ for your AddressBook.
+1. Copy the file to the folder you want to use as the _home folder_ for your GradPad.
-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.
- 
+1. Ensure you have **internet connectivity** to fully utilise GradPad with the latest data from [NUSMods](https://nusmods.com/).
-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:
+1. Double-click the file to start the app. The Main Page similar to the image below should appear in a few seconds. Note
+ how the app contains some sample data.
- * **`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.
+1. Type a command in the _Command Box_ and press Enter to execute it. e.g. typing **`help`** and pressing Enter will
+ display the help page.
+ Some other example commands you can try:
+
+ * **`required`** : Shows a list of required modules in the CS curriculum.
+
+ * **`search`** `CS2103T` : Searches for module named `CS2103T` from the NUSMods database
+ (if connected to the internet) or from a local saved file.
- * **`delete`**`3` : Deletes the 3rd contact shown in the current list.
+ * **`add`** `CS2103T` : Adds a module named `CS2103T` to the GradPad.
- * **`clear`** : Deletes all contacts.
+ * **`delete`** `CS2103T` : Deletes the module named `CS2103T` in the current list.
* **`exit`** : Exits the app.
+
+
+
+
-1. Refer to the [Features](#features) below for details of each command.
+**:information_source: Note:**
+* You can still use GradPad without an internet connection. However, you will only be able to access modules
+within the NUS Computer Science [curriculum](https://www.comp.nus.edu.sg/programmes/ug/cs/curr/) while you're offline.
+* Detailed explanation of each command can be found [here](#commands).
+* Refer to the [Feature Summary List](#feature-summary-list) below for a summary of all features.
+
--------------------------------------------------------------------------------------------------------------------
-## Features
+## Feature Summary List
+A consolidated view of GradPad's features is listed in the table below for easy reference.
+
+
+
+**:information_source: Note:**
+* Italicised words (e.g. *Completed Modules List*) refer to actual sections on the GradPad user interface.
+
+
+ Features | Description
+ ----------------------------------------|------------
+ Add a Module | Allows you to add any module of choice to the *Completed Modules List* for tracking purposes
+ View Added Modules | Allows you to check all the modules you've added to *Completed Modules List*
+ Find Modules in Completed Modules | Allows you to look for modules in *Completed Modules List* using keywords
+ Delete a Module | Allows you to delete unwanted modules from *Completed Modules List*
+ Edit a Module | Allows you to edit the details of a module you've already added to *Completed Modules List*
+ Check Modular Credits | Allows you to check your current modular credit tally
+ View all Required Modules | Allows you to display all required modules in the Computer Science curriculum onto the *Result Display Box*
+ View all General Education Modules | Allows you to display all available General Education Modules offered in NUS onto the *Result Display Box*
+ View all Science Modules | Allows you to display all available Science modules in the Computer Science curriculum onto the *Result Display Box*
+ Search for a Module | Allows you to search for any module available in NUS and display the module details onto the *Result Display Box*
+ Find Tags from Completed Modules | Allows you to check all tags that are used in *Completed Modules List*
+ Clear all Modules | Allows you to delete all the modules from *Completed Modules List*
+ View Help | Allows you to view a list of all possible commands
+ Exit the Program | Allows you to exit GradPad
+
+
+Refer to [Commands](#commands) below for details on all commands.
+
+## Commands
+
+This section contains detailed explanations of all commands and their respective usages.
+
+Each command explanation starts with a usage scenario, followed by an explanation of what the command does, and ends
+off by showing you how to use it.
+
+
+
+**:information_source: Notes about the Command Format and Feature Descriptions:**
+
+* When a command requires parameters, they can be entered in any order.
+For example, if the command specifies `edit MODULE_CODE c/NEW_MODULE_CODE t/core`, `edit MODULE_CODE t/core c/NEW_MODULE_CODE
+` is also acceptable.
+
+* When a command does not require parameters, e.g. `help`, adding extraneous words, e.g `help me` will not affect the
+ command, allowing the command to run as per normal.
+
+* Highlighted words (e.g. `this`) refer to actual commands.
+
+* Italicised words (e.g. *Completed Modules List*) refer to actual sections on the GradPad user interface.
+
+
+
+### Adding a module: `add`
+
+Scenario:
+You have just completed the CS2101 module, and you want to add the module into GradPad to track your academic progress.
+You found the module to be enjoyable so you would like to add tags to remind yourself of how fun the module was.
+
+The `add` command allows you to add a module you have completed into the *Completed Modules List*.
+
+You can add a module by specifying a valid module code. You can also include multiple tags using the prefix `t/` but they are optional.
+Conveniently, you don't have to specify the module title or modular credits of the module you are adding - GradPad
+automatically retrieves them for you using data from NUSMods.
-**:information_source: Notes about the command format:**
+**:information_source: Note:**
+* You cannot add a module that has been previously added as GradPad does not allow duplicate modules.
+* You can use multiple words in a tag. However, there should only be a single space between any 2 words.
+* Tags **within a single module** are case-insensitive, i.e. "core", "CORE", and "CoRe" are all considered the same.
+In such a case, only the first tag amongst a group of duplicates will be added. For e.g.
+`add cs2103t t/core t/CORE t/CoRe` results in only "core" being added.
+
+
+
+To add the module:
+
+1. Type `add cs2101 t/superbmodule t/superfun` into the *Command Box*, and press **Enter** to execute it.
+
+
+2. The *Result Display Box* will display the message "The following module has been successfully added", along with
+ the details of the module. You will then be able to see the CS2101 module at the bottom of the *Completed Modules List*
+ .
+
+
+### Viewing all added modules: `list`
+
+Scenario:
+You have filtered the _Completed Modules List_ to show modules whose module codes contain 'cs1', and you wish to
+restore the list to view all the modules you have added.
+
+The `list` command allows you to view all the modules you have added into the _Completed Modules List_ in GradPad
+using this command. This is especially useful when you have previously used a command that filters the list (i.e. `find`), and you wish to restore the list to its original state.
+
+To view all modules:
+
+1. Type `list` into the _Command Box_, and press **Enter** to execute it.
+
+
+2. The _Result Display Box_ will display the message "All your modules have been listed!", and you will be able to
+view all your previously added modules in the _Completed Modules List_.
+
+
+### Viewing all added tags: `tags`
+
+Scenario:
+You wish to filter your _Completed Modules List_ to display modules tagged as "foundation". However, you've added
+tons of tags to tons of modules and so you can't remember if this tag actually exists.
+
+The `tags` command allows you to view all the tags currently in your _Completed Modules List_ in
+ GradPad. This is useful when you want to see what tags you can filter your _Completed Modules List_ by (see the
+ `find` command below).
+
+To view all tags:
+
+1. Type `tags` into the _Command Box_, and press **Enter** to execute it.
+
+
+2. The _Result Display Box_ will display a list of all existing tags.
+
+
+### Editing module details: `edit`
+
+Scenario:
+When you were a freshman, you added a module with tags "superbmodule" and "superfun". But now that you're graduating,
+you actually think that the module was the best you'd taken in NUS.
+
+The `edit` command allows you to edit the details of a module that you have added into GradPad.
+
+You can edit a module by specifying the module code of the module in the _Completed Modules List_, followed by the
+fields you wish to edit with their respective prefixes, `c/` for new module code, `t/` for new tag. You may edit
+multiple fields in a single `edit` command.
+
+The respective module title and modular credits for a module code will be automatically updated with data from NUSMods.
+
+
+
+ **:information_source: Note:**
+* When you edit tags, instead of changing the descriptions of the existing tags, editing tags replaces
+ them with new ones.
+
+* Instead of deleting that module and adding it again with new tags, you can simply edit the module and replace the tags.
+
+
-* 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`.
+To edit the tag of an existing module:
-* 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. Type `edit cs2101 t/bestmodule` into the _Command Box_, and press **Enter** to execute it.
+
-* 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.
+2. The _Result Display Box_ will display the message "The following module has been successfully edited",
+along with the newly edited details of the module. You will also be able to see that the tags of the
+module displayed in the _Completed Modules List_ has been replaced.
-* 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.
+
+
+### Finding a specific module or a group of modules: `find`
+
+Scenario:
+Let's say you have been adding a huge number of modules into GradPad, and you have lost track of the modules you
+have added. You want to check and see all MA-coded modules with the "bestmodule" tag.
+
+The `find` command allows you to filter the _Completed Modules List_ to display the modules that you want to see.
+You can do this by specifying parts of the module code of the module(s) you wish to display.
+Additionally, you can also specify the tags of the module(s) you wish to display. Likewise, you can also simply
+specify parts of a tag instead of the entire tag.
+
+Instead of scrolling through the long _Completed Modules List_ and checking the modules one by one, you can easily
+filter the list to display that module by `find`-ing said module.
+
+To find the module:
+
+1. Type `find ma bestmodule` into the _Command Box_, and press **Enter** to execute it.
+
+
+2. The _Result Display Box_ will display the message "2 modules found!" and you will be able to see only the modules
+whose module codes contain "ma" and modules with "bestmodule" as a tag in the _Completed Modules List_.
+
+
+### Deleting a Module: `delete`
+
+Scenario:
+You have added several modules into GradPad but you realised that you accidentally added an additional module 'CS2107'
+that you have not completed yet. If you no longer want that module in your _Completed Modules List_,
+you can simply delete it.
+
+The `delete` command allows you to remove a module you have added into GradPad.
+
+You can delete a module by specifying the **module code** of the module. (Case insensitive)
+
+To delete the module:
+
+1. Type `delete cs2107` into the _Command Box_, and press **Enter** to execute it.
+
+
+2. When you are prompted for a confirmation, type `yes` into the _Command Box_, and press **Enter**.
+
+
+3. The _Result Display Box_ will display the message "The following module has been successfully deleted" along
+with the details of the module you deleted.
+
+
+
+
+**:bulb: Tip:**
+For experienced users, you can use the `fdelete` command instead, to bypass the confirmation step!
+
+
+
+### Checking total modular credits: `checkmc`
+
+
+
+**:information_source: Note:**
+A **Modular Credit** (MC) is a unit of the effort, stated in terms of time, expected of a typical student in managing his/her workload, with
+an average of 20 MCs per semester.
-### Viewing help : `help`
+Scenario:
+
+You want to make sure you have hit the minimum criteria of 70MCs required for applying internship modules or
+the 160MCs graduation requirements.
+
+The `checkmc` command allows you to check the total amount of modular credits you have accumulated so far using this command.
+This gives you a rough gauge of the progress of your graduation planning.
-Shows a message explaning how to access the help page.
+To check total modular credits:
-
+1. Type `checkmc` into the _Command Box_, and press **Enter** to execute it.
+
-Format: `help`
+2. The _Result Display Box_ will display a message telling you how many modular credits you have accumulated so far.
+
+### Checking required modules: `required`
-### Adding a person: `add`
+Scenario:
+You have added several modules into your GradPad so far but you are unsure if they are part of
+the Computer Science curriculum. You can simply check by using the `required` command.
-Adds a person to the address book.
+The `required` command allows you to check the modules of the Computer Science curriculum you have yet to take,
+based on your _Completed Modules List_.
-Format: `add n/NAME p/PHONE_NUMBER e/EMAIL a/ADDRESS [t/TAG]…`
+
+
+**:bulb: Tip:**
+The `required` command is able to identify equivalent and precluded Modules! (Eg. CS1010X and CS1101S)
-
:bulb: **Tip:**
-A person can have any number of tags (including 0)
-Examples:
-* `add n/John Doe p/98765432 e/johnd@example.com a/John street, block 123, #01-01`
-* `add n/Betsy Crowe t/friend e/betsycrowe@example.com a/Newgate Prison p/1234567 t/criminal`
+To check required modules:
+
+1. Type `required` into the _Command Box_, press **Enter** to execute it.
+
+
+2. The _Result Display Box_ will then display all the modules you have yet to take for each particular field, as shown below.
+
-### Listing all persons : `list`
+### Checking General Education Modules: `gem`
-Shows a list of all persons in the address book.
+Scenario:
+You wish to take some GE modules to clear your GE requirement, but you are unsure what modules are available.
+You can simply check by using the `gem` command.
-Format: `list`
+The `gem` command allows you to check all the available General Education (GE) modules that are available in NUS.
+To ease your planning, the `gem` command indicates which modules are available in Semester 1 and/or 2.
-### Editing a person : `edit`
+To check GE modules:
-Edits an existing person in the address book.
+1. Type `gem` into the _Command Box_, press **Enter** to execute it.
+
-Format: `edit INDEX [n/NAME] [p/PHONE] [e/EMAIL] [a/ADDRESS] [t/TAG]…`
+2. The _Result Display Box_ will then display all the available GE modules that you can take,
+categorised into Semester 1 and 2, as shown below.
+
-* 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.
+### Checking Science modules: `science`
-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.
+Scenario:
+You wish to take a Science module to clear your Science requirement, but you forgot what modules are available.
+You can simply check by using the `science` command.
-### Locating persons by name: `find`
+The `science` command allows you to check all the available Science modules of the Computer Science curriculum.
-Finds persons whose names contain any of the given keywords.
+To check Science modules:
-Format: `find KEYWORD [MORE_KEYWORDS]`
+1. Type `science` into the _Command Box_, press **Enter** to execute it.
+
-* 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`
+2. The _Result Display Box_ will then display all the available Science modules that you can take, as shown below.
+
-Examples:
-* `find John` returns `john` and `John Doe`
-* `find alex david` returns `Alex Yeoh`, `David Li`
- 
+### Searching for a module: `search`
-### Deleting a person : `delete`
+Scenario:
+After viewing the required modules you have yet to take, you wish to find out more about those modules (Eg. What are they about?
+Do they have any pre-requisites?). You can simply look up those details by using the `search` command.
-Deletes the specified person from the address book.
+The `search` command allows you to search for any module available in NUS.
-Format: `delete INDEX`
+You can search for a module by specifying the module code of the module. The essential module details will then be retrieved
+from NUSMods database directly and displayed in the _Result Display Box_.
-* 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, …
+
+
+**:information_source: Note:**
+If you are not connected to the internet, you can only search for modules that are in the NUS Computer Science
+ curriculum.
+
+
+
+1. Type `search MA1521` into the _Command Box_, press **Enter** to execute it.
+
+
+2. The _Result Display Box_ will then display all the relevant information about the module "MA1521", as shown below.
+
+
+### Clearing all modules in GradPad: `clear`
+
+Scenario:
+You used GradPad to draft a plan for the modules you're going to take, but now you wish to erase all of that and
+ start a new plan. Instead of deleting every module one by one, you can simply delete them all at one go.
+
+The Clear command allows you to erase all modules from the *Completed Modules List* at one go with a single command.
+
+To clear all modules:
+
+1. Type `clear` into the _Command Box_, and press **Enter** to execute it.
+
+
+2. When you are prompted for a confirmation, type `yes` into the _Command Box_, and press **Enter**.
+
+
+3. The *Result Display Box* will then display the message "GradPad has been cleared!" and the
+*Completed Modules List* will now be empty, as shown below.
+
+
+
-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.
+:bulb: Tip:
+For experienced users, you can use the `fclear` command instead, to bypass the confirmation step!
-### Clearing all entries : `clear`
+
+
+### Showing the help display: `help`
-Clears all entries from the address book.
+Scenario:
+You are in the midst of planning your modules, but you suddenly forgot what commands are available to you.
+Simply refresh your memory by using the `help` command to see all available commands and their respective functions.
-Format: `clear`
+The `help` command displays all of GradPad's available commands and how to use them, to you.
+This command is useful for first-timers or users who generally do not know how to use GradPad.
-### Exiting the program : `exit`
+To show the help display:
-Exits the program.
+1. Type `help` into the _Command Box_, and press **Enter** to execute it.
+
-Format: `exit`
+1. The _Result Display Box_ will display all of GradPad's commands along with examples on how to use them.
+
-### Saving the data
+### Exiting GradPad: `exit`
-AddressBook data are saved in the hard disk automatically after any command that changes the data. There is no need to save manually.
+Apart from clicking the "close" button (red button) at the top of the GradPad window, you can exit GradPad using the `exit` command.
-### Archiving data files `[coming in v2.0]`
+To exit:
-_{explain the feature here}_
+1. Type `exit` into the _Command Box_, and press **Enter** to execute it.
+
+
+2. The _Result Display Box_ will display the message "Take care!" and after a 1.5 second delay, the application will terminate.
+
--------------------------------------------------------------------------------------------------------------------
## FAQ
**Q**: How do I transfer my data to another Computer?
-**A**: Install the app in the other computer and overwrite the empty data file it creates with the file that contains the data of your previous AddressBook home folder.
+**A**:
+1. In your old computer, find the `gradPad.json` file within your GradPad home folder and transfer this file
+to your new computer.
+
+2. On your new computer, launch GradPad once. In GradPad's home folder, you should now see that
+an empty `gradPad.json` file has been created.
+
+3. Delete this empty file and replace it with the `gradPad.json` file from your old computer.
--------------------------------------------------------------------------------------------------------------------
## 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`
+This section is the table of all the commands available, and their respective usage example in GradPad.
+
+
+
+**:information_source: Notes about the Command summary:**
+
+* Words in curly braces (e.g. `{module code}`) refers to **compulsory** input that is required for the command to function.
+
+* Words in square brackets (e.g. `[c/module code]`) refers to **optional** input that can be entered.
+
+* For the `edit` command, at least the module code or tag is required for the command to function.
+
+
+
+Action | Format | Example
+--------|-------|----------
+**Add** | `add {module code} [t/tags]` | `add CS2100 t/core`
+**Edit** | `edit {module code} [c/module code] [t/tags]` | `edit cs2103 c/CS2103T t/core`
+**Delete** | `delete {module code}` | `delete CS2103T`
+**Force Delete** | `fdelete {module code}` | `fdelete CS2103T`
+**Completed Modules** | `list` | `list`
+**Find** | `find {module code or tag}` | `find CS2103T foundation fun`
+**Check MCs** | `checkmc` | `checkmc`
+**Required Modules** | `required` | `required`
+**General Education Modules** | `gem` | `gem`
+**Science Modules** | `science` | `science`
+**Search module details** | `search {module code}` | `search CS2103T`
+**Check existing Tags** | `tags` | `tags`
+**Clear** | `clear` | `clear`
+**Force Clear** | `fclear` | `fclear`
+**Help** | `help` | `help`
+**Exit** | `exit` | `exit`
diff --git a/docs/_config.yml b/docs/_config.yml
index 6bd245d8f4e..ddbdf582ac9 100644
--- a/docs/_config.yml
+++ b/docs/_config.yml
@@ -1,5 +1,5 @@
-title: "AB-3"
-theme: minima
+title: "GradPad"
+theme: jekyll-theme-hacker
header_pages:
- UserGuide.md
@@ -8,7 +8,7 @@ header_pages:
markdown: kramdown
-repository: "se-edu/addressbook-level3"
+repository: "AY2021S1-CS2103T-T09-1/tp"
github_icon: "images/github-icon.png"
plugins:
diff --git a/docs/diagrams/AddModuleTagsSequenceDiagram.puml b/docs/diagrams/AddModuleTagsSequenceDiagram.puml
new file mode 100644
index 00000000000..da4880dcba9
--- /dev/null
+++ b/docs/diagrams/AddModuleTagsSequenceDiagram.puml
@@ -0,0 +1,27 @@
+@startuml
+!include style.puml
+
+box Model MODEL_COLOR_T1
+participant ":GradPad" as GradPad MODEL_COLOR
+participant ":UniqueTagMap" as UniqueTagMap MODEL_COLOR
+participant ":UniqueModuleList" as UniqueModuleList MODEL_COLOR
+end box
+
+[-> GradPad : addModule(m)
+activate GradPad
+
+GradPad -> UniqueTagMap : checkAndReplaceTags(m.tags)
+activate UniqueTagMap
+
+UniqueTagMap --> GradPad : replacedTagSet
+deactivate UniqueTagMap
+
+GradPad -> UniqueModuleList : addModule(mWithReplacedTags)
+activate UniqueModuleList
+
+UniqueModuleList --> GradPad
+deactivate UniqueModuleList
+
+[<--GradPad
+deactivate GradPad
+@enduml
diff --git a/docs/diagrams/AddSequenceDiagram.puml b/docs/diagrams/AddSequenceDiagram.puml
new file mode 100644
index 00000000000..7ab1e82e65d
--- /dev/null
+++ b/docs/diagrams/AddSequenceDiagram.puml
@@ -0,0 +1,132 @@
+@startuml
+!include style.puml
+
+box Logic LOGIC_COLOR_T1
+participant ":LogicManager" as LogicManager LOGIC_COLOR
+participant ":GradPadParser" as GradPadParser LOGIC_COLOR
+participant ":AddCommandParser" as AddCommandParser LOGIC_COLOR
+participant ":ParserUtil" as ParserUtil LOGIC_COLOR
+participant ":ModuleInfoSearcher" as ModuleInfoSearcher LOGIC_COLOR
+participant "a:AddCommand" as AddCommand LOGIC_COLOR
+participant ":CommandResult" as CommandResult LOGIC_COLOR
+end box
+
+box Nusmods NUSMODS_COLOR_T1
+participant ":NusmodsDataManager" as NusmodsDataManager NUSMODS_COLOR
+participant ":ModuleInfo" as ModuleInfo NUSMODS_COLOR
+end box
+
+box Model MODEL_COLOR_T1
+participant ":Module" as Module MODEL_COLOR
+participant ":Model" as Model MODEL_COLOR
+end box
+
+[-> LogicManager : execute("add cs1231")
+activate LogicManager
+
+LogicManager -> GradPadParser : parseCommand("add cs1231")
+activate GradPadParser
+
+create AddCommandParser
+GradPadParser -> AddCommandParser
+activate AddCommandParser
+
+AddCommandParser --> GradPadParser
+deactivate AddCommandParser
+
+GradPadParser -> AddCommandParser : parse("cs1231")
+activate AddCommandParser
+
+AddCommandParser -> ParserUtil : parseModuleCode("cs1231")
+activate ParserUtil
+
+ParserUtil --> AddCommandParser : code
+deactivate ParserUtil
+
+AddCommandParser -> ModuleInfoSearcher : searchModule(code)
+activate ModuleInfoSearcher
+
+ModuleInfoSearcher -> NusmodsDataManager : getModuleInfo(code)
+activate NusmodsDataManager
+
+NusmodsDataManager --> ModuleInfoSearcher : moduleInfo
+deactivate NusmodsDataManager
+
+ModuleInfoSearcher --> AddCommandParser : moduleInfo
+deactivate ModuleInfoSearcher
+
+AddCommandParser -> ParserUtil : parseModuleTitle()
+activate ParserUtil
+
+ParserUtil -> ModuleInfo : getTitle()
+activate ModuleInfo
+
+ModuleInfo --> ParserUtil : title
+deactivate ModuleInfo
+
+ParserUtil --> AddCommandParser : title
+deactivate ParserUtil
+
+AddCommandParser -> ParserUtil : parseModularCredits()
+activate ParserUtil
+
+ParserUtil -> ModuleInfo : getModuleCredit()
+activate ModuleInfo
+
+ModuleInfo --> ParserUtil : credits
+deactivate ModuleInfo
+
+ParserUtil --> AddCommandParser : credits
+deactivate ParserUtil
+
+AddCommandParser -> ParserUtil : parseTags("")
+activate ParserUtil
+
+ParserUtil --> AddCommandParser : tagList
+deactivate ParserUtil
+
+create Module
+AddCommandParser -> Module : Module(code, title, credits, tagList)
+activate Module
+
+Module --> AddCommandParser
+deactivate Module
+
+create AddCommand
+AddCommandParser -> AddCommand : AddCommand(Module)
+activate AddCommand
+
+AddCommand --> AddCommandParser : a
+deactivate AddCommand
+
+AddCommandParser --> GradPadParser : a
+deactivate AddCommandParser
+'Hidden arrow to position the destroy marker below the end of the activation bar.
+AddCommandParser -[hidden]-> GradPadParser
+destroy AddCommandParser
+
+GradPadParser --> LogicManager : a
+deactivate GradPadParser
+
+LogicManager -> AddCommand : execute()
+activate AddCommand
+
+AddCommand -> Model : addModule(Module)
+activate Model
+
+Model --> AddCommand
+deactivate Model
+
+create CommandResult
+AddCommand -> CommandResult
+activate CommandResult
+
+CommandResult --> AddCommand
+deactivate CommandResult
+
+AddCommand --> LogicManager : result
+deactivate AddCommand
+
+[<--LogicManager
+deactivate LogicManager
+@enduml
diff --git a/docs/diagrams/ArchitectureDiagram.puml b/docs/diagrams/ArchitectureDiagram.puml
index a929d8e40b3..5cdc4d0414d 100644
--- a/docs/diagrams/ArchitectureDiagram.puml
+++ b/docs/diagrams/ArchitectureDiagram.puml
@@ -11,6 +11,7 @@ Package " "<>{
Class Model MODEL_COLOR
Class Main #grey
Class Commons LOGIC_COLOR_T2
+ Class Nusmods NUSMODS_COLOR
}
Class "<$user>" as User MODEL_COLOR_T2
@@ -21,11 +22,13 @@ UI -[#green]> Logic
UI -right[#green]-> Model
Logic -[#blue]-> Storage
Logic -down[#blue]-> Model
+Logic -right[#blue]-> Nusmods
Main -[#grey]-> UI
Main -[#grey]-> Logic
Main -[#grey]-> Storage
Main -up[#grey]-> Model
+Nusmods .right.> File
Storage .right[STORAGE_COLOR].>File
User ..> UI
@enduml
diff --git a/docs/diagrams/ArchitectureSequenceDiagram.puml b/docs/diagrams/ArchitectureSequenceDiagram.puml
index ef81d18c337..8431456294b 100644
--- a/docs/diagrams/ArchitectureSequenceDiagram.puml
+++ b/docs/diagrams/ArchitectureSequenceDiagram.puml
@@ -7,19 +7,19 @@ Participant ":Logic" as logic LOGIC_COLOR
Participant ":Model" as model MODEL_COLOR
Participant ":Storage" as storage STORAGE_COLOR
-user -[USER_COLOR]> ui : "delete 1"
+user -[USER_COLOR]> ui : "delete c/CS2103T"
activate ui UI_COLOR
-ui -[UI_COLOR]> logic : execute("delete 1")
+ui -[UI_COLOR]> logic : execute("delete c/CS2103T")
activate logic LOGIC_COLOR
-logic -[LOGIC_COLOR]> model : deletePerson(p)
+logic -[LOGIC_COLOR]> model : deleteModule(m)
activate model MODEL_COLOR
model -[MODEL_COLOR]-> logic
deactivate model
-logic -[LOGIC_COLOR]> storage : saveAddressBook(addressBook)
+logic -[LOGIC_COLOR]> storage : saveGradPad(gradPad)
activate storage STORAGE_COLOR
storage -[STORAGE_COLOR]> storage : Save to file
diff --git a/docs/diagrams/BetterModelClassDiagram.puml b/docs/diagrams/BetterModelClassDiagram.puml
index 29076104af3..c3552c550c2 100644
--- a/docs/diagrams/BetterModelClassDiagram.puml
+++ b/docs/diagrams/BetterModelClassDiagram.puml
@@ -4,18 +4,17 @@ skinparam arrowThickness 1.1
skinparam arrowColor MODEL_COLOR
skinparam classBackgroundColor MODEL_COLOR
-AddressBook *-right-> "1" UniquePersonList
-AddressBook *-right-> "1" UniqueTagList
-UniqueTagList -[hidden]down- UniquePersonList
-UniqueTagList -[hidden]down- UniquePersonList
+GradPad *-right-> "1" UniqueModuleList
+GradPad *-right-> "1" UniqueTagList
+UniqueTagList -[hidden]down- UniqueModuleList
+UniqueTagList -[hidden]down- UniqueModuleList
UniqueTagList *-right-> "*" Tag
-UniquePersonList o-right-> Person
+UniqueModuleList o-right-> Module
-Person -up-> "*" Tag
+Module -up-> "*" Tag
-Person *--> Name
-Person *--> Phone
-Person *--> Email
-Person *--> Address
+Module *--> ModuleCode
+Module *--> ModularCredits
+Module *--> ModuleName
@enduml
diff --git a/docs/diagrams/CancelStalledSequenceDiagram.puml b/docs/diagrams/CancelStalledSequenceDiagram.puml
new file mode 100644
index 00000000000..ee4a65d1366
--- /dev/null
+++ b/docs/diagrams/CancelStalledSequenceDiagram.puml
@@ -0,0 +1,30 @@
+@startuml
+!include style.puml
+
+box Logic LOGIC_COLOR_T1
+participant ":LogicManager" as LogicManager LOGIC_COLOR
+participant ":CommandResult" as CommandResult LOGIC_COLOR
+end box
+
+[-> LogicManager : execute("no")
+activate LogicManager
+
+LogicManager -> LogicManager
+activate LogicManager
+
+note left: Set stalledCommand to null
+
+LogicManager --> LogicManager
+deactivate LogicManager
+
+create CommandResult
+LogicManager -> CommandResult
+activate CommandResult
+
+CommandResult --> LogicManager : abortMessage
+deactivate CommandResult
+
+[<--LogicManager : abortMessage
+deactivate LogicManager
+
+@enduml
diff --git a/docs/diagrams/CheckMcSequenceDiagram.puml b/docs/diagrams/CheckMcSequenceDiagram.puml
new file mode 100644
index 00000000000..c0790b1995e
--- /dev/null
+++ b/docs/diagrams/CheckMcSequenceDiagram.puml
@@ -0,0 +1,66 @@
+@startuml
+!include style.puml
+
+box Logic LOGIC_COLOR_T1
+participant ":LogicManager" as LogicManager LOGIC_COLOR
+participant ":GradPadParser" as GradPadParser LOGIC_COLOR
+participant "C:CheckMcCommand" as CheckMcCommand LOGIC_COLOR
+participant ":CommandResult" as CommandResult LOGIC_COLOR
+end box
+
+box Model MODEL_COLOR_T1
+participant ":Model" as Model MODEL_COLOR
+participant "gradpad:GradPad" as GradPad MODEL_COLOR
+end box
+
+[-> LogicManager : execute("checkmc")
+activate LogicManager
+
+LogicManager -> GradPadParser : parseCommand("checkmc")
+activate GradPadParser
+
+create CheckMcCommand
+GradPadParser -> CheckMcCommand
+activate CheckMcCommand
+
+CheckMcCommand -> GradPadParser : C
+deactivate CheckMcCommand
+
+GradPadParser --> LogicManager : C
+deactivate GradPadParser
+
+LogicManager -> CheckMcCommand : execute()
+activate CheckMcCommand
+
+CheckMcCommand -> Model : getGradPad()
+activate Model
+
+Model --> CheckMcCommand : gradpad
+deactivate Model
+
+CheckMcCommand -> GradPad : getModuleList()
+activate GradPad
+
+GradPad -> CheckMcCommand : modules
+deactivate GradPad
+
+CheckMcCommand -> CheckMcCommand
+activate CheckMcCommand
+note left: sum up MCs of all modules
+
+CheckMcCommand -> CheckMcCommand
+deactivate CheckMcCommand
+
+create CommandResult
+CheckMcCommand -> CommandResult
+activate CommandResult
+
+CommandResult --> CheckMcCommand
+deactivate CommandResult
+
+CheckMcCommand --> LogicManager
+deactivate CheckMcCommand
+
+[<--LogicManager
+deactivate LogicManager
+@enduml
diff --git a/docs/diagrams/CommitActivityDiagram.puml b/docs/diagrams/CommitActivityDiagram.puml
index 7f8fe407f89..f0d53b48dd7 100644
--- a/docs/diagrams/CommitActivityDiagram.puml
+++ b/docs/diagrams/CommitActivityDiagram.puml
@@ -5,10 +5,10 @@ start
'Since the beta syntax does not support placing the condition outside the
'diamond we place it as the true branch instead.
-if () then ([command commits AddressBook])
+if () then ([command commits GradPad])
:Purge redunant states;
- :Save AddressBook to
- addressBookStateList;
+ :Save GradPad to
+ gradPadStateList;
else ([else])
endif
stop
diff --git a/docs/diagrams/ConfirmStalledSequenceDiagram.puml b/docs/diagrams/ConfirmStalledSequenceDiagram.puml
new file mode 100644
index 00000000000..b32ca6f5ee4
--- /dev/null
+++ b/docs/diagrams/ConfirmStalledSequenceDiagram.puml
@@ -0,0 +1,38 @@
+@startuml
+!include style.puml
+
+box Logic LOGIC_COLOR_T1
+participant ":LogicManager" as LogicManager LOGIC_COLOR
+participant "stalledCommand:DeleteCommand" as DeleteCommand LOGIC_COLOR
+participant ":CommandResult" as CommandResult LOGIC_COLOR
+end box
+
+box Model MODEL_COLOR_T1
+participant ":Model" as Model MODEL_COLOR
+end box
+
+[-> LogicManager : execute("yes")
+activate LogicManager
+
+LogicManager -> DeleteCommand : stalledCommand.execute()
+activate DeleteCommand
+
+DeleteCommand -> Model : deleteModule("CS2103T")
+activate Model
+
+Model --> DeleteCommand
+deactivate Model
+
+create CommandResult
+DeleteCommand -> CommandResult
+activate CommandResult
+
+CommandResult --> DeleteCommand : result
+deactivate CommandResult
+
+DeleteCommand --> LogicManager : result
+deactivate DeleteCommand
+
+[<--LogicManager : result
+deactivate LogicManager
+@enduml
diff --git a/docs/diagrams/DeleteModuleTagsSequenceDiagram.puml b/docs/diagrams/DeleteModuleTagsSequenceDiagram.puml
new file mode 100644
index 00000000000..3ddfc3263c0
--- /dev/null
+++ b/docs/diagrams/DeleteModuleTagsSequenceDiagram.puml
@@ -0,0 +1,38 @@
+@startuml
+!include style.puml
+
+box Model MODEL_COLOR_T1
+participant ":GradPad" as GradPad MODEL_COLOR
+participant ":UniqueTagMap" as UniqueTagMap MODEL_COLOR
+participant ":UniqueModuleList" as UniqueModuleList MODEL_COLOR
+participant ":Tag" as Tag MODEL_COLOR
+end box
+
+[-> GradPad : removeModule(m)
+activate GradPad
+
+GradPad -> UniqueTagMap : remove(m.tags)
+activate UniqueTagMap
+
+loop for tag in m.tags
+
+UniqueTagMap -> Tag : decrementModuleCount()
+activate Tag
+
+Tag --> UniqueTagMap
+deactivate Tag
+
+end
+
+UniqueTagMap --> GradPad
+deactivate UniqueTagMap
+
+GradPad -> UniqueModuleList : remove(m)
+activate UniqueModuleList
+
+UniqueModuleList --> GradPad
+deactivate UniqueModuleList
+
+[<--GradPad
+deactivate GradPad
+@enduml
diff --git a/docs/diagrams/DeleteSequenceDiagram.puml b/docs/diagrams/DeleteSequenceDiagram.puml
index 1dc2311b245..1f9cce379dd 100644
--- a/docs/diagrams/DeleteSequenceDiagram.puml
+++ b/docs/diagrams/DeleteSequenceDiagram.puml
@@ -3,8 +3,9 @@
box Logic LOGIC_COLOR_T1
participant ":LogicManager" as LogicManager LOGIC_COLOR
-participant ":AddressBookParser" as AddressBookParser LOGIC_COLOR
+participant ":GradPadParser" as GradPadParser LOGIC_COLOR
participant ":DeleteCommandParser" as DeleteCommandParser LOGIC_COLOR
+participant ":ParserUtil" as ParserUtil LOGIC_COLOR
participant "d:DeleteCommand" as DeleteCommand LOGIC_COLOR
participant ":CommandResult" as CommandResult LOGIC_COLOR
end box
@@ -13,22 +14,28 @@ box Model MODEL_COLOR_T1
participant ":Model" as Model MODEL_COLOR
end box
-[-> LogicManager : execute("delete 1")
+[-> LogicManager : execute("delete CS2103T")
activate LogicManager
-LogicManager -> AddressBookParser : parseCommand("delete 1")
-activate AddressBookParser
+LogicManager -> GradPadParser : parseCommand("delete CS2103T")
+activate GradPadParser
create DeleteCommandParser
-AddressBookParser -> DeleteCommandParser
+GradPadParser -> DeleteCommandParser
activate DeleteCommandParser
-DeleteCommandParser --> AddressBookParser
+DeleteCommandParser --> GradPadParser
deactivate DeleteCommandParser
-AddressBookParser -> DeleteCommandParser : parse("1")
+GradPadParser -> DeleteCommandParser : parse("CS2103T")
activate DeleteCommandParser
+DeleteCommandParser -> ParserUtil : parseModuleCode("CS2103T")
+activate ParserUtil
+
+ParserUtil --> DeleteCommandParser : code
+deactivate ParserUtil
+
create DeleteCommand
DeleteCommandParser -> DeleteCommand
activate DeleteCommand
@@ -36,19 +43,31 @@ activate DeleteCommand
DeleteCommand --> DeleteCommandParser : d
deactivate DeleteCommand
-DeleteCommandParser --> AddressBookParser : d
+DeleteCommandParser --> GradPadParser : d
deactivate DeleteCommandParser
'Hidden arrow to position the destroy marker below the end of the activation bar.
-DeleteCommandParser -[hidden]-> AddressBookParser
+DeleteCommandParser -[hidden]-> GradPadParser
destroy DeleteCommandParser
-AddressBookParser --> LogicManager : d
-deactivate AddressBookParser
+GradPadParser --> LogicManager : d
+deactivate GradPadParser
+
+LogicManager -> LogicManager : handleStall()
+activate LogicManager
+
+LogicManager --> LogicManager : confirmationPrompt
+deactivate LogicManager
+
+[<-- LogicManager : confirmationPrompt
+deactivate LogicManager
+
+[-> LogicManager : execute("yes")
+activate LogicManager
LogicManager -> DeleteCommand : execute()
activate DeleteCommand
-DeleteCommand -> Model : deletePerson(1)
+DeleteCommand -> Model : deleteModule("CS2103T")
activate Model
Model --> DeleteCommand
@@ -64,6 +83,6 @@ deactivate CommandResult
DeleteCommand --> LogicManager : result
deactivate DeleteCommand
-[<--LogicManager
+[<--LogicManager : result
deactivate LogicManager
@enduml
diff --git a/docs/diagrams/EditSequenceDiagram.puml b/docs/diagrams/EditSequenceDiagram.puml
new file mode 100644
index 00000000000..1e13e6cab2b
--- /dev/null
+++ b/docs/diagrams/EditSequenceDiagram.puml
@@ -0,0 +1,138 @@
+@startuml
+!include style.puml
+
+box Logic LOGIC_COLOR_T1
+participant ":LogicManager" as LogicManager LOGIC_COLOR
+participant ":GradPadParser" as GradPadParser LOGIC_COLOR
+participant ":EditCommandParser" as EditCommandParser LOGIC_COLOR
+participant ":ParserUtil" as ParserUtil LOGIC_COLOR
+participant ":EditModuleDescriptor" as EditModuleDescriptor LOGIC_COLOR
+participant ":ModuleInfoSearcher" as ModuleInfoSearcher LOGIC_COLOR
+participant "e:EditCommand" as EditCommand LOGIC_COLOR
+participant ":CommandResult" as CommandResult LOGIC_COLOR
+end box
+
+box Nusmods NUSMODS_COLOR_T1
+participant ":NusmodsDataManager" as NusmodsDataManager NUSMODS_COLOR
+participant ":ModuleInfo" as ModuleInfo NUSMODS_COLOR
+end box
+
+box Model MODEL_COLOR_T1
+participant ":Model" as Model MODEL_COLOR
+end box
+
+[-> LogicManager : execute("edit cs2103t c/cs2101")
+activate LogicManager
+
+LogicManager -> GradPadParser : parseCommand("edit cs2103t c/cs2101")
+activate GradPadParser
+
+create EditCommandParser
+GradPadParser -> EditCommandParser
+activate EditCommandParser
+
+EditCommandParser --> GradPadParser
+deactivate EditCommandParser
+
+GradPadParser -> EditCommandParser : parse("cs2103t c/cs2101")
+activate EditCommandParser
+
+EditCommandParser -> ParserUtil : parseModuleCode("cs2103t")
+activate ParserUtil
+
+ParserUtil --> EditCommandParser : code
+deactivate ParserUtil
+
+create EditModuleDescriptor
+EditCommandParser -> EditModuleDescriptor
+activate EditModuleDescriptor
+
+EditModuleDescriptor --> EditCommandParser : desc
+deactivate EditModuleDescriptor
+
+EditCommandParser -> ParserUtil : parseModuleCode("cs2101")
+activate ParserUtil
+
+ParserUtil --> EditCommandParser : newCode
+deactivate ParserUtil
+
+EditCommandParser -> ModuleInfoSearcher : searchModule(newCode)
+activate ModuleInfoSearcher
+
+ModuleInfoSearcher -> NusmodsDataManager : getModuleInfo(code)
+activate NusmodsDataManager
+
+NusmodsDataManager --> ModuleInfoSearcher : moduleInfo
+deactivate NusmodsDataManager
+
+ModuleInfoSearcher --> EditCommandParser : moduleInfo
+deactivate ModuleInfoSearcher
+
+EditCommandParser -> EditModuleDescriptor : setModuleCode(newCode)
+activate EditModuleDescriptor
+
+EditModuleDescriptor --> EditCommandParser :
+deactivate EditModuleDescriptor
+
+EditCommandParser -> EditModuleDescriptor : setModuleTitle()
+activate EditModuleDescriptor
+
+EditModuleDescriptor -> ModuleInfo : getTitle()
+activate ModuleInfo
+
+ModuleInfo --> EditModuleDescriptor : title
+deactivate ModuleInfo
+
+EditModuleDescriptor --> EditCommandParser :
+deactivate EditModuleDescriptor
+
+EditCommandParser -> EditModuleDescriptor : setModularCredits()
+activate EditModuleDescriptor
+
+EditModuleDescriptor -> ModuleInfo : getModuleCredit()
+activate ModuleInfo
+
+ModuleInfo --> EditModuleDescriptor : credits
+deactivate ModuleInfo
+
+EditModuleDescriptor --> EditCommandParser :
+deactivate EditModuleDescriptor
+
+create EditCommand
+EditCommandParser -> EditCommand : EditCommand(code, desc)
+activate EditCommand
+
+EditCommand --> EditCommandParser : e
+deactivate EditCommand
+
+EditCommandParser --> GradPadParser : e
+deactivate EditCommandParser
+'Hidden arrow to position the destroy marker below the end of the activation bar.
+EditCommandParser -[hidden]-> GradPadParser
+destroy EditCommandParser
+
+GradPadParser --> LogicManager : e
+deactivate GradPadParser
+
+LogicManager -> EditCommand : execute()
+activate EditCommand
+
+EditCommand -> Model : setModule(moduleToEdit, editedModule)
+activate Model
+
+Model --> EditCommand
+deactivate Model
+
+create CommandResult
+EditCommand -> CommandResult
+activate CommandResult
+
+CommandResult --> EditCommand
+deactivate CommandResult
+
+EditCommand --> LogicManager : result
+deactivate EditCommand
+
+[<--LogicManager
+deactivate LogicManager
+@enduml
diff --git a/docs/diagrams/FindSequenceDiagram.puml b/docs/diagrams/FindSequenceDiagram.puml
new file mode 100644
index 00000000000..14c28dd6824
--- /dev/null
+++ b/docs/diagrams/FindSequenceDiagram.puml
@@ -0,0 +1,77 @@
+@startuml
+!include style.puml
+
+box Logic LOGIC_COLOR_T1
+participant ":LogicManager" as LogicManager LOGIC_COLOR
+participant ":GradPadParser" as GradPadParser LOGIC_COLOR
+participant ":FindCommandParser" as FindCommandParser LOGIC_COLOR
+participant "f:FindCommand" as FindCommand LOGIC_COLOR
+participant ":CommandResult" as CommandResult LOGIC_COLOR
+end box
+
+box Model MODEL_COLOR_T1
+participant "c:CompoundFindPredicate" as CompoundFindPredicate MODEL_COLOR
+participant ":Model" as Model MODEL_COLOR
+end box
+
+[-> LogicManager : execute("find cs foundation")
+activate LogicManager
+
+LogicManager -> GradPadParser : parseCommand("find cs foundation")
+activate GradPadParser
+
+create FindCommandParser
+GradPadParser -> FindCommandParser
+activate FindCommandParser
+
+FindCommandParser --> GradPadParser
+deactivate FindCommandParser
+
+GradPadParser -> FindCommandParser : parse("cs foundation")
+activate FindCommandParser
+
+create CompoundFindPredicate
+FindCommandParser -> CompoundFindPredicate
+activate CompoundFindPredicate
+
+CompoundFindPredicate --> FindCommandParser : c
+deactivate CompoundFindPredicate
+
+create FindCommand
+FindCommandParser -> FindCommand : new FindCommand(c)
+activate FindCommand
+
+FindCommand --> FindCommandParser : f
+deactivate FindCommand
+
+FindCommandParser --> GradPadParser : f
+deactivate FindCommandParser
+'Hidden arrow to position the destroy marker below the end of the activation bar.
+FindCommandParser -[hidden]-> GradPadParser
+destroy FindCommandParser
+
+GradPadParser --> LogicManager : f
+deactivate GradPadParser
+
+LogicManager -> FindCommand : execute()
+activate FindCommand
+
+FindCommand -> Model : updateFilteredModuleList(c)
+activate Model
+
+Model --> FindCommand
+deactivate Model
+
+create CommandResult
+FindCommand -> CommandResult
+activate CommandResult
+
+CommandResult --> FindCommand
+deactivate CommandResult
+
+FindCommand --> LogicManager : result
+deactivate FindCommand
+
+[<--LogicManager
+deactivate LogicManager
+@enduml
diff --git a/docs/diagrams/GemSequenceDiagram.puml b/docs/diagrams/GemSequenceDiagram.puml
new file mode 100644
index 00000000000..d087b323833
--- /dev/null
+++ b/docs/diagrams/GemSequenceDiagram.puml
@@ -0,0 +1,93 @@
+@startuml
+!include style.puml
+
+box Logic LOGIC_COLOR_T1
+participant ":LogicManager" as LogicManager LOGIC_COLOR
+participant ":GradPadParser" as GradPadParser LOGIC_COLOR
+participant "G:GemCommand" as GemCommand LOGIC_COLOR
+participant ":CommandResult" as CommandResult LOGIC_COLOR
+end box
+
+box Storage STORAGE_COLOR_T1
+participant "sem1Storage:GemCommandStorage" as GemCommandStorage STORAGE_COLOR
+participant "sem2Storage:GemCommandStorage" as GemCommandStorage2 STORAGE_COLOR
+end box
+
+box Model MODEL_COLOR_T1
+participant ":Model" as Model MODEL_COLOR
+end box
+
+[-> LogicManager : execute("gem")
+activate LogicManager
+
+LogicManager -> GradPadParser : parseCommand("gem")
+activate GradPadParser
+
+create GemCommand
+GradPadParser -> GemCommand
+activate GemCommand
+
+GemCommand --> GradPadParser : G
+deactivate GemCommand
+
+GradPadParser --> LogicManager : G
+deactivate GradPadParser
+
+LogicManager -> GemCommand : execute()
+activate GemCommand
+
+GemCommand -> GemCommand : setSem1Storage()
+activate GemCommand
+
+create GemCommandStorage
+GemCommand -> GemCommandStorage : sem1Storage
+activate GemCommandStorage
+
+GemCommandStorage --> GemCommand : sem1Storage
+deactivate GemCommandStorage
+
+GemCommand -> GemCommandStorage : setGeModules(SEM_1_PATH)
+activate GemCommandStorage
+
+GemCommandStorage --> GemCommand : sem1GeModules
+deactivate GemCommandStorage
+
+deactivate GemCommand
+
+GemCommand -> GemCommand : setSem2Storage()
+activate GemCommand
+
+create GemCommandStorage2
+GemCommand -> GemCommandStorage2 : sem2Storage
+activate GemCommandStorage2
+
+GemCommandStorage2 --> GemCommand : sem2Storage
+deactivate GemCommandStorage2
+
+GemCommand -> GemCommandStorage2 : setGeModules(SEM_2_PATH)
+activate GemCommandStorage2
+
+GemCommandStorage2 --> GemCommand : sem2GeModules
+deactivate GemCommandStorage2
+
+deactivate GemCommand
+
+GemCommand -> Model : hasModule(semXXXGeModules)
+activate Model
+
+Model --> GemCommand : filteredSemXXXGeModules
+deactivate Model
+
+create CommandResult
+GemCommand -> CommandResult : filteredSemXXXGeModules
+activate CommandResult
+
+CommandResult --> GemCommand
+deactivate CommandResult
+
+GemCommand --> LogicManager
+deactivate GemCommand
+
+[<--LogicManager
+deactivate LogicManager
+@enduml
diff --git a/docs/diagrams/ListSequenceDiagram.puml b/docs/diagrams/ListSequenceDiagram.puml
new file mode 100644
index 00000000000..03fae1f6d4a
--- /dev/null
+++ b/docs/diagrams/ListSequenceDiagram.puml
@@ -0,0 +1,52 @@
+@startuml
+!include style.puml
+
+box Logic LOGIC_COLOR_T1
+participant ":LogicManager" as LogicManager LOGIC_COLOR
+participant ":GradPadParser" as GradPadParser LOGIC_COLOR
+participant "L:ListCommand" as ListCommand LOGIC_COLOR
+participant ":CommandResult" as CommandResult LOGIC_COLOR
+end box
+
+box Model MODEL_COLOR_T1
+participant ":Model" as Model MODEL_COLOR
+end box
+
+[-> LogicManager : execute("list")
+activate LogicManager
+
+LogicManager -> GradPadParser : parseCommand("list")
+activate GradPadParser
+
+create ListCommand
+GradPadParser -> ListCommand
+activate ListCommand
+
+ListCommand -> GradPadParser : L
+deactivate ListCommand
+
+GradPadParser --> LogicManager : L
+deactivate GradPadParser
+
+LogicManager -> ListCommand : execute()
+activate ListCommand
+
+ListCommand -> Model : updateFilteredModuleList(PREDICATE_SHOW_ALL_MODULES)
+activate Model
+
+Model --> ListCommand
+deactivate Model
+
+create CommandResult
+ListCommand -> CommandResult
+activate CommandResult
+
+CommandResult --> ListCommand
+deactivate CommandResult
+
+ListCommand --> LogicManager
+deactivate ListCommand
+
+[<--LogicManager
+deactivate LogicManager
+@enduml
diff --git a/docs/diagrams/LogicClassDiagram.puml b/docs/diagrams/LogicClassDiagram.puml
index 016ef33e2e2..94d2af92ba1 100644
--- a/docs/diagrams/LogicClassDiagram.puml
+++ b/docs/diagrams/LogicClassDiagram.puml
@@ -8,7 +8,7 @@ package Logic {
package Parser {
Interface Parser <>
-Class AddressBookParser
+Class GradPadParser
Class XYZCommandParser
Class CliSyntax
Class ParserUtil
@@ -35,8 +35,8 @@ Class HiddenOutside #FFFFFF
HiddenOutside ..> Logic
LogicManager .up.|> Logic
-LogicManager -->"1" AddressBookParser
-AddressBookParser .left.> XYZCommandParser: creates >
+LogicManager -->"1" GradPadParser
+GradPadParser .left.> XYZCommandParser: creates >
XYZCommandParser ..> XYZCommand : creates >
XYZCommandParser ..|> Parser
diff --git a/docs/diagrams/ModelClassDiagram.puml b/docs/diagrams/ModelClassDiagram.puml
index e85a00d4107..a10f2f9c8af 100644
--- a/docs/diagrams/ModelClassDiagram.puml
+++ b/docs/diagrams/ModelClassDiagram.puml
@@ -5,52 +5,52 @@ skinparam arrowColor MODEL_COLOR
skinparam classBackgroundColor MODEL_COLOR
Package Model <>{
-Interface ReadOnlyAddressBook <>
+Interface ReadOnlyGradPad <>
Interface Model <>
Interface ObservableList <>
-Class AddressBook
-Class ReadOnlyAddressBook
+Class GradPad
+Class ReadOnlyGradPad
Class Model
Class ModelManager
Class UserPrefs
Class ReadOnlyUserPrefs
-Package Person {
-Class Person
-Class Address
-Class Email
-Class Name
-Class Phone
-Class UniquePersonList
+Package Module {
+Class Module
+Class ModuleName
+Class ModuleCode
+Class ModularCredits
+Class UniqueModuleList
}
Package Tag {
Class Tag
+Class UniqueTagMap
}
}
Class HiddenOutside #FFFFFF
HiddenOutside ..> Model
-AddressBook .up.|> ReadOnlyAddressBook
+GradPad .up.|> ReadOnlyGradPad
ModelManager .up.|> Model
Model .right.> ObservableList
-ModelManager o--> "1" AddressBook
+ModelManager o--> "1" GradPad
ModelManager o-left-> "1" UserPrefs
UserPrefs .up.|> ReadOnlyUserPrefs
-AddressBook *--> "1" UniquePersonList
-UniquePersonList o--> "*" Person
-Person *--> Name
-Person *--> Phone
-Person *--> Email
-Person *--> Address
-Person *--> "*" Tag
+GradPad *--> "1" UniqueModuleList
+GradPad *--> "1" UniqueTagMap
+UniqueTagMap o--> "*" Tag
+UniqueModuleList o--> "*" Module
+Module *--> ModuleCode
+Module *--> ModularCredits
+Module *--> ModuleName
+Module --> "*" Tag
-Name -[hidden]right-> Phone
-Phone -[hidden]right-> Address
-Address -[hidden]right-> Email
+ModuleCode -[hidden]right-> ModularCredits
+ModularCredits -[hidden]right-> ModuleName
-ModelManager -->"1" Person : filtered list
+ModelManager -->"1" Module : filtered list
@enduml
diff --git a/docs/diagrams/ModelFilteredListClassDiagram.puml b/docs/diagrams/ModelFilteredListClassDiagram.puml
new file mode 100644
index 00000000000..10b38858230
--- /dev/null
+++ b/docs/diagrams/ModelFilteredListClassDiagram.puml
@@ -0,0 +1,22 @@
+@startuml
+!include style.puml
+skinparam arrowThickness 1.1
+skinparam arrowColor MODEL_COLOR
+skinparam classBackgroundColor MODEL_COLOR
+
+Package Ui {
+ Class ModuleListPanel UI_COLOR
+}
+
+Package Model {
+ Class Model
+ Class FilteredModules
+}
+Package Logic {
+ Class XYZCommand LOGIC_COLOR
+}
+
+ModuleListPanel .down[UI_COLOR].> FilteredModules : displays modules from >
+Model .left.> FilteredModules : filters >
+XYZCommand .up[LOGIC_COLOR].> Model : applies list filters via >
+@enduml
diff --git a/docs/diagrams/NusmodsClassDiagram.puml b/docs/diagrams/NusmodsClassDiagram.puml
new file mode 100644
index 00000000000..9e0f6cc225f
--- /dev/null
+++ b/docs/diagrams/NusmodsClassDiagram.puml
@@ -0,0 +1,21 @@
+@startuml
+!include style.puml
+skinparam arrowThickness 1.1
+skinparam arrowColor NUSMODS_COLOR
+skinparam classBackgroundColor NUSMODS_COLOR
+
+Interface NusmodsData <>
+Class "{abstract}\nDataFetcher" as DataFetcher
+
+Class DataFetcherManager
+Class NusmodsDataManager
+Class ModuleSummary
+Class ModuleInfo
+
+NusmodsDataManager -up-|> NusmodsData
+NusmodsDataManager .down.> ModuleInfo
+NusmodsDataManager .right.> DataFetcher : may get module data from >
+DataFetcherManager .left.|> DataFetcher
+DataFetcherManager ..> ModuleSummary
+DataFetcherManager ..> ModuleInfo : creates >
+@enduml
diff --git a/docs/diagrams/NusmodsFetchLocalModuleSequenceDiagram.puml b/docs/diagrams/NusmodsFetchLocalModuleSequenceDiagram.puml
new file mode 100644
index 00000000000..9db94ac2f4b
--- /dev/null
+++ b/docs/diagrams/NusmodsFetchLocalModuleSequenceDiagram.puml
@@ -0,0 +1,26 @@
+@startuml
+!include style.puml
+
+box Nusmods NUSMODS_COLOR_T1
+participant ":NusmodsDataManager" as NusmodsDataManager NUSMODS_COLOR
+participant ":DataFetcherManager" as DataFetcherManager NUSMODS_COLOR
+end box
+
+[-> NusmodsDataManager : getModuleInfo(code)
+activate NusmodsDataManager
+
+NusmodsDataManager -> DataFetcherManager : fetchModuleInfo(code)
+activate DataFetcherManager
+
+DataFetcherManager --> NusmodsDataManager : NusmodsException
+deactivate DataFetcherManager
+
+NusmodsDataManager -> NusmodsDataManager : getModuleInfoFromFile(code)
+activate NusmodsDataManager
+
+NusmodsDataManager --> NusmodsDataManager : moduleInfo
+deactivate NusmodsDataManager
+
+[<--NusmodsDataManager : moduleInfo
+deactivate NusmodsDataManager
+@enduml
diff --git a/docs/diagrams/NusmodsFetchModuleSequenceDiagram.puml b/docs/diagrams/NusmodsFetchModuleSequenceDiagram.puml
new file mode 100644
index 00000000000..e915b940ecb
--- /dev/null
+++ b/docs/diagrams/NusmodsFetchModuleSequenceDiagram.puml
@@ -0,0 +1,30 @@
+@startuml
+!include style.puml
+
+box Nusmods NUSMODS_COLOR_T1
+participant ":NusmodsDataManager" as NusmodsDataManager NUSMODS_COLOR
+participant ":DataFetcherManager" as DataFetcherManager NUSMODS_COLOR
+end box
+
+box Commons LOGIC_COLOR_T1
+participant ":HttpUtil" as HttpUtil LOGIC_COLOR_T3
+end box
+
+[-> NusmodsDataManager : getModuleInfo(code)
+activate NusmodsDataManager
+
+NusmodsDataManager -> DataFetcherManager : fetchModuleInfo(code)
+activate DataFetcherManager
+
+DataFetcherManager -> HttpUtil : makeGETRequest(API_URL)
+activate HttpUtil
+
+HttpUtil --> DataFetcherManager : moduleJsonResponse
+deactivate HttpUtil
+
+DataFetcherManager --> NusmodsDataManager : moduleInfo
+deactivate DataFetcherManager
+
+[<--NusmodsDataManager : moduleInfo
+deactivate NusmodsDataManager
+@enduml
diff --git a/docs/diagrams/NusmodsScrapeModuleSequenceDiagram.puml b/docs/diagrams/NusmodsScrapeModuleSequenceDiagram.puml
new file mode 100644
index 00000000000..1a02d28dfee
--- /dev/null
+++ b/docs/diagrams/NusmodsScrapeModuleSequenceDiagram.puml
@@ -0,0 +1,49 @@
+@startuml
+!include style.puml
+
+box Nusmods NUSMODS_COLOR_T1
+participant ":DataFetcherManager" as DataFetcherManager NUSMODS_COLOR
+end box
+
+box Commons LOGIC_COLOR_T1
+participant ":HttpUtil" as HttpUtil LOGIC_COLOR_T3
+end box
+
+[-> DataFetcherManager : fetchAndSaveModules()
+activate DataFetcherManager
+
+DataFetcherManager -> DataFetcherManager : fetchModuleSummaryList()
+activate DataFetcherManager
+
+DataFetcherManager --> DataFetcherManager : summaries
+deactivate DataFetcherManager
+
+DataFetcherManager -> DataFetcherManager : filterModuleSummaries(summaries)
+activate DataFetcherManager
+
+DataFetcherManager --> DataFetcherManager : filteredSummaries
+deactivate DataFetcherManager
+
+DataFetcherManager -> DataFetcherManager : generateModuleInfoMap(summaries)
+activate DataFetcherManager
+
+loop for summary in summaries
+DataFetcherManager -> DataFetcherManager : fetchModuleInfo(module)
+activate DataFetcherManager
+
+DataFetcherManager -> HttpUtil : makeGETRequest(API_URL)
+activate HttpUtil
+
+HttpUtil --> DataFetcherManager : moduleJsonResponse
+deactivate HttpUtil
+
+DataFetcherManager -> DataFetcherManager : moduleInfo
+deactivate DataFetcherManager
+end
+
+DataFetcherManager -> DataFetcherManager : moduleInfoMap
+deactivate DataFetcherManager
+
+[<--DataFetcherManager :
+deactivate DataFetcherManager
+@enduml
diff --git a/docs/diagrams/RequiredSequenceDiagram.puml b/docs/diagrams/RequiredSequenceDiagram.puml
new file mode 100644
index 00000000000..830981a5197
--- /dev/null
+++ b/docs/diagrams/RequiredSequenceDiagram.puml
@@ -0,0 +1,94 @@
+@startuml
+!include style.puml
+
+box Logic LOGIC_COLOR_T1
+participant ":LogicManager" as LogicManager LOGIC_COLOR
+participant ":GradPadParser" as GradPadParser LOGIC_COLOR
+participant "R:RequiredCommand" as RequiredCommand LOGIC_COLOR
+participant ":CommandResult" as CommandResult LOGIC_COLOR
+end box
+
+box Storage STORAGE_COLOR_T1
+participant "Rs:RequiredCommandStorage" as RequiredCommandStorage STORAGE_COLOR
+end box
+
+
+box Model MODEL_COLOR_T1
+participant ":Model" as Model MODEL_COLOR
+end box
+
+[-> LogicManager : execute("required")
+activate LogicManager
+
+LogicManager -> GradPadParser : parseCommand("required")
+activate GradPadParser
+
+create RequiredCommand
+GradPadParser -> RequiredCommand
+activate RequiredCommand
+
+RequiredCommand --> GradPadParser : R
+deactivate RequiredCommand
+
+GradPadParser --> LogicManager : R
+deactivate GradPadParser
+
+LogicManager -> RequiredCommand : execute()
+activate RequiredCommand
+
+RequiredCommand -> Model : getGradPad()
+activate Model
+
+Model --> RequiredCommand : GradPad
+
+RequiredCommand -> Model : getModuleList()
+
+Model --> RequiredCommand : currentModules
+deactivate Model
+
+RequiredCommand -> RequiredCommand : setStorage()
+activate RequiredCommand
+
+create RequiredCommandStorage
+RequiredCommand -> RequiredCommandStorage : RequiredCommandStorage()
+activate RequiredCommandStorage
+
+RequiredCommandStorage --> RequiredCommand :Rs
+deactivate RequiredCommandStorage
+
+RequiredCommand -> RequiredCommandStorage : setRequiredXXX(XXX_PATH)
+activate RequiredCommandStorage
+
+RequiredCommandStorage --> RequiredCommand : requiredXXX
+deactivate RequiredCommandStorage
+
+deactivate RequiredCommand
+
+RequiredCommand -> RequiredCommand : compareAllGEs()
+activate RequiredCommand
+
+alt allGEsCleared
+RequiredCommand -> RequiredCommand : MESSAGE_SUCCESS_GE
+
+else
+RequiredCommand -> RequiredCommand : MESSAGE_FAILURE_GE
+end
+deactivate RequiredCommand
+
+RequiredCommand -> RequiredCommand : compareModules(XXX_PATH)
+RequiredCommand -> RequiredCommand : compareScience(SCIENCE_PATH)
+RequiredCommand -> RequiredCommand : compareInternship(INTERNSHIP_PATH)
+
+create CommandResult
+RequiredCommand -> CommandResult : CommandResult(leftOverModules)
+activate CommandResult
+
+CommandResult --> RequiredCommand
+deactivate CommandResult
+
+RequiredCommand --> LogicManager
+deactivate RequiredCommand
+
+[<--LogicManager
+deactivate LogicManager
+@enduml
diff --git a/docs/diagrams/ScienceSequenceDiagram.puml b/docs/diagrams/ScienceSequenceDiagram.puml
new file mode 100644
index 00000000000..6a50d30754b
--- /dev/null
+++ b/docs/diagrams/ScienceSequenceDiagram.puml
@@ -0,0 +1,74 @@
+@startuml
+!include style.puml
+
+box Logic LOGIC_COLOR_T1
+participant ":LogicManager" as LogicManager LOGIC_COLOR
+participant ":GradPadParser" as GradPadParser LOGIC_COLOR
+participant "S:ScienceCommand" as ScienceCommand LOGIC_COLOR
+participant ":CommandResult" as CommandResult LOGIC_COLOR
+end box
+
+box Storage STORAGE_COLOR_T1
+participant "Rs:RequiredCommandStorage" as RequiredCommandStorage STORAGE_COLOR
+end box
+
+box Model MODEL_COLOR_T1
+participant ":Model" as Model MODEL_COLOR
+end box
+
+[-> LogicManager : execute("science")
+activate LogicManager
+
+LogicManager -> GradPadParser : parseCommand("science")
+activate GradPadParser
+
+create ScienceCommand
+GradPadParser -> ScienceCommand
+activate ScienceCommand
+
+ScienceCommand --> GradPadParser : S
+deactivate ScienceCommand
+
+GradPadParser --> LogicManager : S
+deactivate GradPadParser
+
+LogicManager -> ScienceCommand : execute()
+activate ScienceCommand
+
+ScienceCommand -> ScienceCommand : setScienceModules(SCIENCE_PATH)
+activate ScienceCommand
+
+create RequiredCommandStorage
+ScienceCommand -> RequiredCommandStorage : RequiredCommandStorage()
+activate RequiredCommandStorage
+
+RequiredCommandStorage --> ScienceCommand : Rs
+deactivate RequiredCommandStorage
+
+ScienceCommand -> RequiredCommandStorage : setRequiredScience(SCIENCE_PATH)
+activate RequiredCommandStorage
+
+RequiredCommandStorage --> ScienceCommand : scienceModules
+deactivate RequiredCommandStorage
+
+deactivate ScienceCommand
+
+ScienceCommand -> Model : hasModule(scienceModules)
+activate Model
+
+Model --> ScienceCommand : filteredScienceModules
+deactivate Model
+
+create CommandResult
+ScienceCommand -> CommandResult : filteredScienceModules
+activate CommandResult
+
+CommandResult --> ScienceCommand
+deactivate CommandResult
+
+ScienceCommand --> LogicManager
+deactivate ScienceCommand
+
+[<--LogicManager
+deactivate LogicManager
+@enduml
diff --git a/docs/diagrams/SearchSequenceDiagram.puml b/docs/diagrams/SearchSequenceDiagram.puml
new file mode 100644
index 00000000000..371200c3760
--- /dev/null
+++ b/docs/diagrams/SearchSequenceDiagram.puml
@@ -0,0 +1,80 @@
+@startuml
+!include style.puml
+
+box Logic LOGIC_COLOR_T1
+participant ":LogicManager" as LogicManager LOGIC_COLOR
+participant ":GradPadParser" as GradPadParser LOGIC_COLOR
+participant ":SearchCommandParser" as SearchCommandParser LOGIC_COLOR
+participant ":ParserUtil" as ParserUtil LOGIC_COLOR
+participant "s:SearchCommand" as SearchCommand LOGIC_COLOR
+participant ":ModuleInfoSearcher" as ModuleInfoSearcher LOGIC_COLOR
+participant ":CommandResult" as CommandResult LOGIC_COLOR
+end box
+
+[-> LogicManager : execute("search CS2103T")
+activate LogicManager
+
+LogicManager -> GradPadParser : parseCommand("search CS2103T")
+activate GradPadParser
+
+create SearchCommandParser
+GradPadParser -> SearchCommandParser
+activate SearchCommandParser
+
+SearchCommandParser --> GradPadParser
+deactivate SearchCommandParser
+
+GradPadParser -> SearchCommandParser : parse("CS2103T")
+activate SearchCommandParser
+
+SearchCommandParser -> ParserUtil : parseModuleCode("CS2103T")
+activate ParserUtil
+
+ParserUtil --> SearchCommandParser : ModuleCode
+deactivate ParserUtil
+
+create SearchCommand
+SearchCommandParser -> SearchCommand : SearchCommand("CS2103T")
+activate SearchCommand
+
+SearchCommand --> SearchCommandParser : s
+deactivate SearchCommand
+
+SearchCommandParser --> GradPadParser : s
+deactivate SearchCommandParser
+'Hidden arrow to position the destroy marker below the end of the activation bar.
+SearchCommandParser -[hidden]-> GradPadParser
+destroy SearchCommandParser
+
+GradPadParser --> LogicManager : s
+deactivate GradPadParser
+
+LogicManager -> SearchCommand : execute()
+activate SearchCommand
+
+create ModuleInfoSearcher
+SearchCommand -> ModuleInfoSearcher
+activate ModuleInfoSearcher
+
+ModuleInfoSearcher --> SearchCommand
+deactivate ModuleInfoSearcher
+
+SearchCommand -> ModuleInfoSearcher : searchModule("CS2103T")
+activate ModuleInfoSearcher
+
+ModuleInfoSearcher --> SearchCommand : ModuleInfo
+deactivate ModuleInfoSearcher
+
+create CommandResult
+SearchCommand -> CommandResult : ModuleInfo
+activate CommandResult
+
+CommandResult --> SearchCommand
+deactivate CommandResult
+
+SearchCommand --> LogicManager : result
+deactivate SearchCommand
+
+[<--LogicManager
+deactivate LogicManager
+@enduml
diff --git a/docs/diagrams/StalledActivityDiagram.puml b/docs/diagrams/StalledActivityDiagram.puml
new file mode 100644
index 00000000000..92a7d1b6b3d
--- /dev/null
+++ b/docs/diagrams/StalledActivityDiagram.puml
@@ -0,0 +1,18 @@
+@startuml
+start
+:User enters command;
+if () then ([GradPad awaiting confirmation])
+ if () then ([isConfirmation])
+ :Execute stalled command;
+ else ([isCancel])
+ :Abort stalled command;
+endif
+else ([else])
+ if () then ([requiresStall])
+ :Handle stall;
+ else ([else])
+ :Execute Command;
+endif
+endif
+stop
+@enduml
diff --git a/docs/diagrams/StalledSequenceDiagram.puml b/docs/diagrams/StalledSequenceDiagram.puml
new file mode 100644
index 00000000000..eca1ba76e35
--- /dev/null
+++ b/docs/diagrams/StalledSequenceDiagram.puml
@@ -0,0 +1,30 @@
+@startuml
+!include style.puml
+
+box Logic LOGIC_COLOR_T1
+participant ":LogicManager" as LogicManager LOGIC_COLOR
+participant "stalledCommand:DeleteCommand" as DeleteCommand LOGIC_COLOR
+participant ":CommandResult" as CommandResult LOGIC_COLOR
+end box
+
+[-> LogicManager : execute("delete cs2103t")
+activate LogicManager
+
+LogicManager -> LogicManager : handleStall(command, commandText)
+activate LogicManager
+
+create CommandResult
+LogicManager -> CommandResult
+activate CommandResult
+
+CommandResult --> LogicManager: confirmationPrompt
+deactivate CommandResult
+
+LogicManager --> LogicManager : confirmationPrompt
+deactivate LogicManager
+
+[<-- LogicManager : confirmationPrompt
+deactivate LogicManager
+
+
+@enduml
diff --git a/docs/diagrams/StorageClassDiagram.puml b/docs/diagrams/StorageClassDiagram.puml
index 6adb2e156bf..a8b6f058469 100644
--- a/docs/diagrams/StorageClassDiagram.puml
+++ b/docs/diagrams/StorageClassDiagram.puml
@@ -6,19 +6,24 @@ skinparam classBackgroundColor STORAGE_COLOR
Interface Storage <>
Interface UserPrefsStorage <>
-Interface AddressBookStorage <>
+Interface GradPadStorage <>
Class StorageManager
Class JsonUserPrefsStorage
-Class JsonAddressBookStorage
+Class JsonGradPadStorage
+Class RequiredCommandStorage
+Class GemCommandStorage
StorageManager .left.|> Storage
StorageManager o-right-> UserPrefsStorage
-StorageManager o--> AddressBookStorage
+StorageManager o--> GradPadStorage
JsonUserPrefsStorage .left.|> UserPrefsStorage
-JsonAddressBookStorage .left.|> AddressBookStorage
-JsonAddressBookStorage .down.> JsonSerializableAddressBookStorage
-JsonSerializableAddressBookStorage .right.> JsonSerializablePerson
-JsonSerializablePerson .right.> JsonAdaptedTag
+JsonGradPadStorage .left.|> GradPadStorage
+JsonGradPadStorage .down.> JsonSerializableGradPad
+JsonSerializableGradPad .right.> JsonAdaptedModule
+JsonAdaptedModule .right.> JsonAdaptedTag
+
+RequiredCommandStorage .down.> JsonSerializableGradPad
+GemCommandStorage .down.> JsonSerializableGradPad
@enduml
diff --git a/docs/diagrams/UiClassDiagram.puml b/docs/diagrams/UiClassDiagram.puml
index 92746f9fcf7..97fe277716b 100644
--- a/docs/diagrams/UiClassDiagram.puml
+++ b/docs/diagrams/UiClassDiagram.puml
@@ -9,10 +9,9 @@ Interface Ui <>
Class "{abstract}\nUiPart" as UiPart
Class UiManager
Class MainWindow
-Class HelpWindow
Class ResultDisplay
-Class PersonListPanel
-Class PersonCard
+Class ModuleListPanel
+Class ModuleCard
Class StatusBarFooter
Class CommandBox
}
@@ -30,29 +29,25 @@ HiddenOutside ..> Ui
UiManager .left.|> Ui
UiManager -down-> MainWindow
-MainWindow --> HelpWindow
MainWindow *-down-> CommandBox
MainWindow *-down-> ResultDisplay
-MainWindow *-down-> PersonListPanel
+MainWindow *-down-> ModuleListPanel
MainWindow *-down-> StatusBarFooter
-PersonListPanel -down-> PersonCard
+ModuleListPanel -down-> ModuleCard
MainWindow -left-|> UiPart
ResultDisplay --|> UiPart
CommandBox --|> UiPart
-PersonListPanel --|> UiPart
-PersonCard --|> UiPart
+ModuleListPanel --|> UiPart
+ModuleCard --|> UiPart
StatusBarFooter --|> UiPart
-HelpWindow -down-|> UiPart
-PersonCard ..> Model
+ModuleCard ..> Model
UiManager -right-> Logic
MainWindow -left-> Logic
-PersonListPanel -[hidden]left- HelpWindow
-HelpWindow -[hidden]left- CommandBox
CommandBox -[hidden]left- ResultDisplay
ResultDisplay -[hidden]left- StatusBarFooter
diff --git a/docs/diagrams/UndoRedoState0.puml b/docs/diagrams/UndoRedoState0.puml
index 96e30744d24..ed205ab56f5 100644
--- a/docs/diagrams/UndoRedoState0.puml
+++ b/docs/diagrams/UndoRedoState0.puml
@@ -6,9 +6,9 @@ skinparam ClassBorderColor #000000
title Initial state
package States {
- class State1 as "__ab0:AddressBook__"
- class State2 as "__ab1:AddressBook__"
- class State3 as "__ab2:AddressBook__"
+ class State1 as "__gp0:GradPad__"
+ class State2 as "__gp1:GradPad__"
+ class State3 as "__gp2:GradPad__"
}
State1 -[hidden]right-> State2
State2 -[hidden]right-> State3
diff --git a/docs/diagrams/UndoRedoState1.puml b/docs/diagrams/UndoRedoState1.puml
index 01fcb9b2b96..d3bb8892b2d 100644
--- a/docs/diagrams/UndoRedoState1.puml
+++ b/docs/diagrams/UndoRedoState1.puml
@@ -3,12 +3,12 @@
skinparam ClassFontColor #000000
skinparam ClassBorderColor #000000
-title After command "delete 5"
+title After command "delete CS2103T"
package States <> {
- class State1 as "__ab0:AddressBook__"
- class State2 as "__ab1:AddressBook__"
- class State3 as "__ab2:AddressBook__"
+ class State1 as "__gp0:GradPad__"
+ class State2 as "__gp1:GradPad__"
+ class State3 as "__gp2:GradPad__"
}
State1 -[hidden]right-> State2
diff --git a/docs/diagrams/UndoRedoState2.puml b/docs/diagrams/UndoRedoState2.puml
index bccc230a5d1..aa80e4fb8d4 100644
--- a/docs/diagrams/UndoRedoState2.puml
+++ b/docs/diagrams/UndoRedoState2.puml
@@ -3,12 +3,12 @@
skinparam ClassFontColor #000000
skinparam ClassBorderColor #000000
-title After command "add n/David"
+title After command "add CS2100"
package States <> {
- class State1 as "__ab0:AddressBook__"
- class State2 as "__ab1:AddressBook__"
- class State3 as "__ab2:AddressBook__"
+ class State1 as "__gp0:GradPad__"
+ class State2 as "__gp1:GradPad__"
+ class State3 as "__gp2:GradPad__"
}
State1 -[hidden]right-> State2
diff --git a/docs/diagrams/UndoRedoState3.puml b/docs/diagrams/UndoRedoState3.puml
index ea29c9483e4..290b1769031 100644
--- a/docs/diagrams/UndoRedoState3.puml
+++ b/docs/diagrams/UndoRedoState3.puml
@@ -6,9 +6,9 @@ skinparam ClassBorderColor #000000
title After command "undo"
package States <> {
- class State1 as "__ab0:AddressBook__"
- class State2 as "__ab1:AddressBook__"
- class State3 as "__ab2:AddressBook__"
+ class State1 as "__gp0:GradPad__"
+ class State2 as "__gp1:GradPad__"
+ class State3 as "__gp2:GradPad__"
}
State1 -[hidden]right-> State2
diff --git a/docs/diagrams/UndoRedoState4.puml b/docs/diagrams/UndoRedoState4.puml
index 1b784cece80..0050aa81a4a 100644
--- a/docs/diagrams/UndoRedoState4.puml
+++ b/docs/diagrams/UndoRedoState4.puml
@@ -6,9 +6,9 @@ skinparam ClassBorderColor #000000
title After command "list"
package States <> {
- class State1 as "__ab0:AddressBook__"
- class State2 as "__ab1:AddressBook__"
- class State3 as "__ab2:AddressBook__"
+ class State1 as "__gp0:GradPad__"
+ class State2 as "__gp1:GradPad__"
+ class State3 as "__gp2:GradPad__"
}
State1 -[hidden]right-> State2
diff --git a/docs/diagrams/UndoRedoState5.puml b/docs/diagrams/UndoRedoState5.puml
index 88927be32bc..65ac88db645 100644
--- a/docs/diagrams/UndoRedoState5.puml
+++ b/docs/diagrams/UndoRedoState5.puml
@@ -6,9 +6,9 @@ skinparam ClassBorderColor #000000
title After command "clear"
package States <> {
- class State1 as "__ab0:AddressBook__"
- class State2 as "__ab1:AddressBook__"
- class State3 as "__ab3:AddressBook__"
+ class State1 as "__gp0:GradPad__"
+ class State2 as "__gp1:GradPad__"
+ class State3 as "__gp2:GradPad__"
}
State1 -[hidden]right-> State2
@@ -17,5 +17,5 @@ State2 -[hidden]right-> State3
class Pointer as "Current State" #FFFFF
Pointer -up-> State3
-note right on link: State ab2 deleted.
+note right on link: State gp2 deleted.
@end
diff --git a/docs/diagrams/UndoSequenceDiagram.puml b/docs/diagrams/UndoSequenceDiagram.puml
index 410aab4e412..3d88970ade8 100644
--- a/docs/diagrams/UndoSequenceDiagram.puml
+++ b/docs/diagrams/UndoSequenceDiagram.puml
@@ -3,42 +3,42 @@
box Logic LOGIC_COLOR_T1
participant ":LogicManager" as LogicManager LOGIC_COLOR
-participant ":AddressBookParser" as AddressBookParser LOGIC_COLOR
+participant ":GradPadParser" as GradPadParser LOGIC_COLOR
participant "u:UndoCommand" as UndoCommand LOGIC_COLOR
end box
box Model MODEL_COLOR_T1
participant ":Model" as Model MODEL_COLOR
-participant ":VersionedAddressBook" as VersionedAddressBook MODEL_COLOR
+participant ":VersionedGradPad" as VersionedGradPad MODEL_COLOR
end box
[-> LogicManager : execute(undo)
activate LogicManager
-LogicManager -> AddressBookParser : parseCommand(undo)
-activate AddressBookParser
+LogicManager -> GradPadParser : parseCommand(undo)
+activate GradPadParser
create UndoCommand
-AddressBookParser -> UndoCommand
+GradPadParser -> UndoCommand
activate UndoCommand
-UndoCommand --> AddressBookParser
+UndoCommand --> GradPadParser
deactivate UndoCommand
-AddressBookParser --> LogicManager : u
-deactivate AddressBookParser
+GradPadParser --> LogicManager : u
+deactivate GradPadParser
LogicManager -> UndoCommand : execute()
activate UndoCommand
-UndoCommand -> Model : undoAddressBook()
+UndoCommand -> Model : undoGradPad()
activate Model
-Model -> VersionedAddressBook : undo()
-activate VersionedAddressBook
+Model -> VersionedGradPad : undo()
+activate VersionedGradPad
-VersionedAddressBook -> VersionedAddressBook :resetData(ReadOnlyAddressBook)
-VersionedAddressBook --> Model :
-deactivate VersionedAddressBook
+VersionedGradPad -> VersionedGradPad :resetData(ReadOnlyGradPad)
+VersionedGradPad --> Model :
+deactivate VersionedGradPad
Model --> UndoCommand
deactivate Model
diff --git a/docs/diagrams/style.puml b/docs/diagrams/style.puml
index fad8b0adeaa..1ece74a45a9 100644
--- a/docs/diagrams/style.puml
+++ b/docs/diagrams/style.puml
@@ -31,6 +31,9 @@
!define STORAGE_COLOR_T3 #806600
!define STORAGE_COLOR_T2 #544400
+!define NUSMODS_COLOR #BD0074
+!define NUSMODS_COLOR_T1 #FFA7DD
+
!define USER_COLOR #000000
skinparam BackgroundColor #FFFFFFF
diff --git a/docs/images/Add1.png b/docs/images/Add1.png
new file mode 100644
index 00000000000..be11678be1f
Binary files /dev/null and b/docs/images/Add1.png differ
diff --git a/docs/images/Add2.png b/docs/images/Add2.png
new file mode 100644
index 00000000000..c521cb70507
Binary files /dev/null and b/docs/images/Add2.png differ
diff --git a/docs/images/AddModuleTagsSequenceDiagram.png b/docs/images/AddModuleTagsSequenceDiagram.png
new file mode 100644
index 00000000000..e1ed803d68b
Binary files /dev/null and b/docs/images/AddModuleTagsSequenceDiagram.png differ
diff --git a/docs/images/AddSequenceDiagram.png b/docs/images/AddSequenceDiagram.png
new file mode 100644
index 00000000000..96d9e009cfc
Binary files /dev/null and b/docs/images/AddSequenceDiagram.png differ
diff --git a/docs/images/AnnotatedUi.png b/docs/images/AnnotatedUi.png
new file mode 100644
index 00000000000..c6db4b94269
Binary files /dev/null and b/docs/images/AnnotatedUi.png differ
diff --git a/docs/images/ArchitectureDiagram.png b/docs/images/ArchitectureDiagram.png
index 5cdcf67e747..e4abede244f 100644
Binary files a/docs/images/ArchitectureDiagram.png and b/docs/images/ArchitectureDiagram.png differ
diff --git a/docs/images/ArchitectureSequenceDiagram.png b/docs/images/ArchitectureSequenceDiagram.png
index 2f1346869d0..ea90fccabf9 100644
Binary files a/docs/images/ArchitectureSequenceDiagram.png and b/docs/images/ArchitectureSequenceDiagram.png differ
diff --git a/docs/images/BetterModelClassDiagram.png b/docs/images/BetterModelClassDiagram.png
index bc7ed18ae29..7611064cea5 100644
Binary files a/docs/images/BetterModelClassDiagram.png and b/docs/images/BetterModelClassDiagram.png differ
diff --git a/docs/images/CancelStalledSequenceDiagram.png b/docs/images/CancelStalledSequenceDiagram.png
new file mode 100644
index 00000000000..da0330b4bea
Binary files /dev/null and b/docs/images/CancelStalledSequenceDiagram.png differ
diff --git a/docs/images/CheckMc1.png b/docs/images/CheckMc1.png
new file mode 100644
index 00000000000..2a2521ac910
Binary files /dev/null and b/docs/images/CheckMc1.png differ
diff --git a/docs/images/CheckMc2.png b/docs/images/CheckMc2.png
new file mode 100644
index 00000000000..d50c1281799
Binary files /dev/null and b/docs/images/CheckMc2.png differ
diff --git a/docs/images/CheckMcSequenceDiagram.png b/docs/images/CheckMcSequenceDiagram.png
new file mode 100644
index 00000000000..1c4a676ca4a
Binary files /dev/null and b/docs/images/CheckMcSequenceDiagram.png differ
diff --git a/docs/images/Clear1.png b/docs/images/Clear1.png
new file mode 100644
index 00000000000..63a3ec85ffd
Binary files /dev/null and b/docs/images/Clear1.png differ
diff --git a/docs/images/Clear2.png b/docs/images/Clear2.png
new file mode 100644
index 00000000000..42d7f85cc67
Binary files /dev/null and b/docs/images/Clear2.png differ
diff --git a/docs/images/Clear3.png b/docs/images/Clear3.png
new file mode 100644
index 00000000000..6a961352508
Binary files /dev/null and b/docs/images/Clear3.png differ
diff --git a/docs/images/CommitActivityDiagram.png b/docs/images/CommitActivityDiagram.png
index 4de4fa4bf2b..642d99e6996 100644
Binary files a/docs/images/CommitActivityDiagram.png and b/docs/images/CommitActivityDiagram.png differ
diff --git a/docs/images/ConfirmStalledSequenceDiagram.png b/docs/images/ConfirmStalledSequenceDiagram.png
new file mode 100644
index 00000000000..f8e89fcea52
Binary files /dev/null and b/docs/images/ConfirmStalledSequenceDiagram.png differ
diff --git a/docs/images/Delete1.png b/docs/images/Delete1.png
new file mode 100644
index 00000000000..396a2219e92
Binary files /dev/null and b/docs/images/Delete1.png differ
diff --git a/docs/images/Delete2.png b/docs/images/Delete2.png
new file mode 100644
index 00000000000..ba4ae4cae55
Binary files /dev/null and b/docs/images/Delete2.png differ
diff --git a/docs/images/Delete3.png b/docs/images/Delete3.png
new file mode 100644
index 00000000000..5bdab3f2255
Binary files /dev/null and b/docs/images/Delete3.png differ
diff --git a/docs/images/DeleteModuleTagsSequenceDiagram.png b/docs/images/DeleteModuleTagsSequenceDiagram.png
new file mode 100644
index 00000000000..bd57e20a6a6
Binary files /dev/null and b/docs/images/DeleteModuleTagsSequenceDiagram.png differ
diff --git a/docs/images/DeleteSequenceDiagram.png b/docs/images/DeleteSequenceDiagram.png
index fa327b39618..320e3454431 100644
Binary files a/docs/images/DeleteSequenceDiagram.png and b/docs/images/DeleteSequenceDiagram.png differ
diff --git a/docs/images/Edit1.png b/docs/images/Edit1.png
new file mode 100644
index 00000000000..d2fea33bdee
Binary files /dev/null and b/docs/images/Edit1.png differ
diff --git a/docs/images/Edit2.png b/docs/images/Edit2.png
new file mode 100644
index 00000000000..17d0ffdd4ee
Binary files /dev/null and b/docs/images/Edit2.png differ
diff --git a/docs/images/EditSequenceDiagram.png b/docs/images/EditSequenceDiagram.png
new file mode 100644
index 00000000000..f0b3cbe4088
Binary files /dev/null and b/docs/images/EditSequenceDiagram.png differ
diff --git a/docs/images/Exit1.png b/docs/images/Exit1.png
new file mode 100644
index 00000000000..e49ed95f1b9
Binary files /dev/null and b/docs/images/Exit1.png differ
diff --git a/docs/images/Exit2.png b/docs/images/Exit2.png
new file mode 100644
index 00000000000..b91473e70d8
Binary files /dev/null and b/docs/images/Exit2.png differ
diff --git a/docs/images/Find1.png b/docs/images/Find1.png
new file mode 100644
index 00000000000..4d7fc165f0b
Binary files /dev/null and b/docs/images/Find1.png differ
diff --git a/docs/images/Find2.png b/docs/images/Find2.png
new file mode 100644
index 00000000000..bbcbe93be84
Binary files /dev/null and b/docs/images/Find2.png differ
diff --git a/docs/images/FindSequenceDiagram.png b/docs/images/FindSequenceDiagram.png
new file mode 100644
index 00000000000..a44252f50ac
Binary files /dev/null and b/docs/images/FindSequenceDiagram.png differ
diff --git a/docs/images/Gem1.png b/docs/images/Gem1.png
new file mode 100644
index 00000000000..80136417e54
Binary files /dev/null and b/docs/images/Gem1.png differ
diff --git a/docs/images/Gem2.png b/docs/images/Gem2.png
new file mode 100644
index 00000000000..f5ecc0043be
Binary files /dev/null and b/docs/images/Gem2.png differ
diff --git a/docs/images/GemSequenceDiagram.png b/docs/images/GemSequenceDiagram.png
new file mode 100644
index 00000000000..c36f6560e61
Binary files /dev/null and b/docs/images/GemSequenceDiagram.png differ
diff --git a/docs/images/Help1.png b/docs/images/Help1.png
new file mode 100644
index 00000000000..57bc408f9f9
Binary files /dev/null and b/docs/images/Help1.png differ
diff --git a/docs/images/Help2.png b/docs/images/Help2.png
new file mode 100644
index 00000000000..657ed509ed8
Binary files /dev/null and b/docs/images/Help2.png differ
diff --git a/docs/images/List1.png b/docs/images/List1.png
new file mode 100644
index 00000000000..3f9be05aec7
Binary files /dev/null and b/docs/images/List1.png differ
diff --git a/docs/images/List2.png b/docs/images/List2.png
new file mode 100644
index 00000000000..df426b4c605
Binary files /dev/null and b/docs/images/List2.png differ
diff --git a/docs/images/ListSequenceDiagram.png b/docs/images/ListSequenceDiagram.png
new file mode 100644
index 00000000000..52fb0b25b1e
Binary files /dev/null and b/docs/images/ListSequenceDiagram.png differ
diff --git a/docs/images/LogicClassDiagram.png b/docs/images/LogicClassDiagram.png
index b9e853cef12..32034ad3c6b 100644
Binary files a/docs/images/LogicClassDiagram.png and b/docs/images/LogicClassDiagram.png differ
diff --git a/docs/images/ModelClassDiagram.png b/docs/images/ModelClassDiagram.png
index 280064118cf..e1cd848a813 100644
Binary files a/docs/images/ModelClassDiagram.png and b/docs/images/ModelClassDiagram.png differ
diff --git a/docs/images/ModelFilteredListClassDiagram.png b/docs/images/ModelFilteredListClassDiagram.png
new file mode 100644
index 00000000000..2f8198ec16d
Binary files /dev/null and b/docs/images/ModelFilteredListClassDiagram.png differ
diff --git a/docs/images/NusmodsClassDiagram.png b/docs/images/NusmodsClassDiagram.png
new file mode 100644
index 00000000000..6b7694db9f1
Binary files /dev/null and b/docs/images/NusmodsClassDiagram.png differ
diff --git a/docs/images/NusmodsFetchLocalModuleSequenceDiagram.png b/docs/images/NusmodsFetchLocalModuleSequenceDiagram.png
new file mode 100644
index 00000000000..809c5d53073
Binary files /dev/null and b/docs/images/NusmodsFetchLocalModuleSequenceDiagram.png differ
diff --git a/docs/images/NusmodsFetchModuleSequenceDiagram.png b/docs/images/NusmodsFetchModuleSequenceDiagram.png
new file mode 100644
index 00000000000..ebc440ff3b1
Binary files /dev/null and b/docs/images/NusmodsFetchModuleSequenceDiagram.png differ
diff --git a/docs/images/NusmodsScrapeModuleSequenceDiagram.png b/docs/images/NusmodsScrapeModuleSequenceDiagram.png
new file mode 100644
index 00000000000..fcdbce7d23b
Binary files /dev/null and b/docs/images/NusmodsScrapeModuleSequenceDiagram.png differ
diff --git a/docs/images/Required1.png b/docs/images/Required1.png
new file mode 100644
index 00000000000..076d5d387cf
Binary files /dev/null and b/docs/images/Required1.png differ
diff --git a/docs/images/Required2.png b/docs/images/Required2.png
new file mode 100644
index 00000000000..7811fab8414
Binary files /dev/null and b/docs/images/Required2.png differ
diff --git a/docs/images/RequiredSequenceDiagram.png b/docs/images/RequiredSequenceDiagram.png
new file mode 100644
index 00000000000..6c5f7005eea
Binary files /dev/null and b/docs/images/RequiredSequenceDiagram.png differ
diff --git a/docs/images/Science1.png b/docs/images/Science1.png
new file mode 100644
index 00000000000..3faa9c7af48
Binary files /dev/null and b/docs/images/Science1.png differ
diff --git a/docs/images/Science2.png b/docs/images/Science2.png
new file mode 100644
index 00000000000..e219bbe0e03
Binary files /dev/null and b/docs/images/Science2.png differ
diff --git a/docs/images/ScienceSequenceDiagram.png b/docs/images/ScienceSequenceDiagram.png
new file mode 100644
index 00000000000..971fd0534d8
Binary files /dev/null and b/docs/images/ScienceSequenceDiagram.png differ
diff --git a/docs/images/Search1.png b/docs/images/Search1.png
new file mode 100644
index 00000000000..ac49df7df82
Binary files /dev/null and b/docs/images/Search1.png differ
diff --git a/docs/images/Search2.png b/docs/images/Search2.png
new file mode 100644
index 00000000000..f1c3dbf7b17
Binary files /dev/null and b/docs/images/Search2.png differ
diff --git a/docs/images/SearchSequenceDiagram.png b/docs/images/SearchSequenceDiagram.png
new file mode 100644
index 00000000000..15154a0cc63
Binary files /dev/null and b/docs/images/SearchSequenceDiagram.png differ
diff --git a/docs/images/StalledActivityDiagram.png b/docs/images/StalledActivityDiagram.png
new file mode 100644
index 00000000000..42feef33662
Binary files /dev/null and b/docs/images/StalledActivityDiagram.png differ
diff --git a/docs/images/StalledSequenceDiagram.png b/docs/images/StalledSequenceDiagram.png
new file mode 100644
index 00000000000..bc34fddf41e
Binary files /dev/null and b/docs/images/StalledSequenceDiagram.png differ
diff --git a/docs/images/StorageClassDiagram.png b/docs/images/StorageClassDiagram.png
index d87c1216820..4c7dea78790 100644
Binary files a/docs/images/StorageClassDiagram.png and b/docs/images/StorageClassDiagram.png differ
diff --git a/docs/images/Tags1.png b/docs/images/Tags1.png
new file mode 100644
index 00000000000..d5e38952bb7
Binary files /dev/null and b/docs/images/Tags1.png differ
diff --git a/docs/images/Tags2.png b/docs/images/Tags2.png
new file mode 100644
index 00000000000..607f5f3870c
Binary files /dev/null and b/docs/images/Tags2.png differ
diff --git a/docs/images/Ui.png b/docs/images/Ui.png
index 5bd77847aa2..37a632c99ce 100644
Binary files a/docs/images/Ui.png and b/docs/images/Ui.png differ
diff --git a/docs/images/UiClassDiagram.png b/docs/images/UiClassDiagram.png
index 7b4b3dbea45..116d5a880cb 100644
Binary files a/docs/images/UiClassDiagram.png and b/docs/images/UiClassDiagram.png differ
diff --git a/docs/images/UndoRedoState0.png b/docs/images/UndoRedoState0.png
index 8f7538cd884..f25a8d66a2e 100644
Binary files a/docs/images/UndoRedoState0.png and b/docs/images/UndoRedoState0.png differ
diff --git a/docs/images/UndoRedoState1.png b/docs/images/UndoRedoState1.png
index df9908d0948..88aa54b36ba 100644
Binary files a/docs/images/UndoRedoState1.png and b/docs/images/UndoRedoState1.png differ
diff --git a/docs/images/UndoRedoState2.png b/docs/images/UndoRedoState2.png
index 36519c1015b..ba6b5b74dbf 100644
Binary files a/docs/images/UndoRedoState2.png and b/docs/images/UndoRedoState2.png differ
diff --git a/docs/images/UndoRedoState3.png b/docs/images/UndoRedoState3.png
index 19959d01712..a8760691d20 100644
Binary files a/docs/images/UndoRedoState3.png and b/docs/images/UndoRedoState3.png differ
diff --git a/docs/images/UndoRedoState4.png b/docs/images/UndoRedoState4.png
index 4c623e4f2c5..da27507494d 100644
Binary files a/docs/images/UndoRedoState4.png and b/docs/images/UndoRedoState4.png differ
diff --git a/docs/images/UndoRedoState5.png b/docs/images/UndoRedoState5.png
index 84ad2afa6bd..ba798dd478b 100644
Binary files a/docs/images/UndoRedoState5.png and b/docs/images/UndoRedoState5.png differ
diff --git a/docs/images/UndoSequenceDiagram.png b/docs/images/UndoSequenceDiagram.png
index 6addcd3a8d9..91612c9c1ed 100644
Binary files a/docs/images/UndoSequenceDiagram.png and b/docs/images/UndoSequenceDiagram.png differ
diff --git a/docs/images/add.png b/docs/images/add.png
new file mode 100644
index 00000000000..33d9a2bb6d7
Binary files /dev/null and b/docs/images/add.png differ
diff --git a/docs/images/checkmc.png b/docs/images/checkmc.png
new file mode 100644
index 00000000000..9584c9f2997
Binary files /dev/null and b/docs/images/checkmc.png differ
diff --git a/docs/images/delete.png b/docs/images/delete.png
new file mode 100644
index 00000000000..91b96ad4770
Binary files /dev/null and b/docs/images/delete.png differ
diff --git a/docs/images/edit.png b/docs/images/edit.png
new file mode 100644
index 00000000000..ec628802eaf
Binary files /dev/null and b/docs/images/edit.png differ
diff --git a/docs/images/exit.png b/docs/images/exit.png
new file mode 100644
index 00000000000..6941cde8a30
Binary files /dev/null and b/docs/images/exit.png differ
diff --git a/docs/images/find.png b/docs/images/find.png
new file mode 100644
index 00000000000..a0401355a40
Binary files /dev/null and b/docs/images/find.png differ
diff --git a/docs/images/help.png b/docs/images/help.png
new file mode 100644
index 00000000000..62f7e654c12
Binary files /dev/null and b/docs/images/help.png differ
diff --git a/docs/images/list.png b/docs/images/list.png
new file mode 100644
index 00000000000..f1708794ae6
Binary files /dev/null and b/docs/images/list.png differ
diff --git a/docs/images/mhdsyfq.png b/docs/images/mhdsyfq.png
new file mode 100644
index 00000000000..d8006632906
Binary files /dev/null and b/docs/images/mhdsyfq.png differ
diff --git a/docs/images/nusmods.png b/docs/images/nusmods.png
new file mode 100644
index 00000000000..1b52d92eb1a
Binary files /dev/null and b/docs/images/nusmods.png differ
diff --git a/docs/images/nusmods_small.png b/docs/images/nusmods_small.png
new file mode 100644
index 00000000000..41d3dd85081
Binary files /dev/null and b/docs/images/nusmods_small.png differ
diff --git a/docs/images/save.png b/docs/images/save.png
new file mode 100644
index 00000000000..e2e8fe978ab
Binary files /dev/null and b/docs/images/save.png differ
diff --git a/docs/images/shaokiat.png b/docs/images/shaokiat.png
new file mode 100644
index 00000000000..0a3261d2fe8
Binary files /dev/null and b/docs/images/shaokiat.png differ
diff --git a/docs/images/silvernitro.png b/docs/images/silvernitro.png
new file mode 100644
index 00000000000..f70f1e2b004
Binary files /dev/null and b/docs/images/silvernitro.png differ
diff --git a/docs/images/yan-soon.png b/docs/images/yan-soon.png
new file mode 100644
index 00000000000..62c0ed37edc
Binary files /dev/null and b/docs/images/yan-soon.png differ
diff --git a/docs/index.md b/docs/index.md
index 7601dbaad0d..f9e1dee2965 100644
--- a/docs/index.md
+++ b/docs/index.md
@@ -1,17 +1,24 @@
---
layout: page
-title: AddressBook Level-3
+title: GradPad
---
-[](https://github.com/se-edu/addressbook-level3/actions)
-[](https://codecov.io/gh/se-edu/addressbook-level3)
+[](https://github.com/AY2021S1-CS2103T-T09-1/tp/actions)
+[](https://codecov.io/gh/AY2021S1-CS2103T-T09-1/tp)

-**AddressBook is a desktop application for managing your contact details.** While it has a GUI, most of the user interactions happen using a CLI (Command Line Interface).
+**GradPad is a desktop application for managing your NUS modules.** While it has a GUI, most of the user interactions happen using a CLI (Command Line Interface).
-* If you are interested in using AddressBook, head over to the [_Quick Start_ section of the **User Guide**](UserGuide.html#quick-start).
-* If you are interested about developing AddressBook, the [**Developer Guide**](DeveloperGuide.html) is a good place to start.
+GradPad is a one-stop solution to **module management** for Computer Science Undergraduates.
+Planning for modules has always been a tedious process but it does not have to be.
+
+GradPad **consolidates** the modules you have taken and **displays** the remaining required modules to
+ease your module planning process. A **module searching platform** is also included in GradPad, providing easy
+**navigation** of modules.
+
+* If you are interested in using GradPad, head over to the [_Quick Start_ section of the **User Guide**](UserGuide.html#quick-start).
+* If you are interested about developing GradPad, the [**Developer Guide**](DeveloperGuide.html) is a good place to start.
**Acknowledgements**
diff --git a/docs/team/johndoe.md b/docs/team/johndoe.md
deleted file mode 100644
index 1f1e9e6f6db..00000000000
--- a/docs/team/johndoe.md
+++ /dev/null
@@ -1,46 +0,0 @@
----
-layout: page
-title: John Doe's Project Portfolio Page
----
-
-## Project: AddressBook Level 3
-
-AddressBook - Level 3 is a desktop address book application used for teaching Software Engineering principles. The user interacts with it using a CLI, and it has a GUI created with JavaFX. It is written in Java, and has about 10 kLoC.
-
-Given below are my contributions to the project.
-
-* **New Feature**: Added the ability to undo/redo previous commands.
- * What it does: allows the user to undo all previous commands one at a time. Preceding undo commands can be reversed by using the redo command.
- * Justification: This feature improves the product significantly because a user can make mistakes in commands and the app should provide a convenient way to rectify them.
- * Highlights: This enhancement affects existing commands and commands to be added in future. It required an in-depth analysis of design alternatives. The implementation too was challenging as it required changes to existing commands.
- * Credits: *{mention here if you reused any code/ideas from elsewhere or if a third-party library is heavily used in the feature so that a reader can make a more accurate judgement of how much effort went into the feature}*
-
-* **New Feature**: Added a history command that allows the user to navigate to previous commands using up/down keys.
-
-* **Code contributed**: [RepoSense link]()
-
-* **Project management**:
- * Managed releases `v1.3` - `v1.5rc` (3 releases) on GitHub
-
-* **Enhancements to existing features**:
- * Updated the GUI color scheme (Pull requests [\#33](), [\#34]())
- * Wrote additional tests for existing features to increase coverage from 88% to 92% (Pull requests [\#36](), [\#38]())
-
-* **Documentation**:
- * User Guide:
- * Added documentation for the features `delete` and `find` [\#72]()
- * Did cosmetic tweaks to existing documentation of features `clear`, `exit`: [\#74]()
- * Developer Guide:
- * Added implementation details of the `delete` feature.
-
-* **Community**:
- * PRs reviewed (with non-trivial review comments): [\#12](), [\#32](), [\#19](), [\#42]()
- * Contributed to forum discussions (examples: [1](), [2](), [3](), [4]())
- * Reported bugs and suggestions for other teams in the class (examples: [1](), [2](), [3]())
- * Some parts of the history feature I added was adopted by several other class mates ([1](), [2]())
-
-* **Tools**:
- * Integrated a third party library (Natty) to the project ([\#42]())
- * Integrated a new Github plugin (CircleCI) to the team repo
-
-* _{you can add/remove categories in the list above}_
diff --git a/docs/team/mhdsyfq.md b/docs/team/mhdsyfq.md
new file mode 100644
index 00000000000..b00795ebf4c
--- /dev/null
+++ b/docs/team/mhdsyfq.md
@@ -0,0 +1,103 @@
+---
+layout: page
+title: Muhammad Syafiq Bin Abas's Project Portfolio Page
+---
+
+## Project: GradPad
+
+GradPad provides an all-in-one solution to **Module Management** for Computer Science Undergraduates. It
+**consolidates** all the processes required for students to **plan their modules** and **track their academic progress**
+into a single platform. The first of its kind - GradPad offers a **collaboration** like no other, allowing students to
+manage their modules more efficiently without the need to use several platforms all at once. Users interact with
+GradPad using a Command Line Interface (CLI), and it has a Graphical User Interface (GUI) created with JavaFX.
+
+Given below are my contributions to the project.
+
+* **Code contributed**: [RepoSense link](https://nus-cs2103-ay2021s1.github.io/tp-dashboard/#breakdown=true&search=mhdsyfq&sort=groupTitle&sortWithin=title&since=2020-08-14&timeframe=commit&mergegroup=&groupSelect=groupByRepos&checkedFileTypes=docs~functional-code~test-code~other)
+
+* **New Features Implemented**:
+ * Added the ability to choose to `delete`/`clear` with a confirmation prompt, or to force delete or
+ force clear using `fdelete`/`fclear`.
+
+ * What it does:
+ Allows users to provide confirmation whether or not they want to proceed with deleting or clearing
+ data, and also allows users to force delete or clear data without a confirmation prompt.
+
+ * Justification:
+ This feature is significant because users can make mistakes in certain commands that results in them
+ losing data and the app should provide a convenient way for users to avoid making those mistakes by prompting users
+ for a confirmation before executing the commands. Some users (usually regulars or experts), however, may find it
+ troublesome to have to constantly provide confirmation, so the app should also provide a way for users to
+ instantly execute these commands.
+
+ * Highlights:
+ This enhancement of adding a confirmation prompt affects some existing commands and commands to be
+ added in future. The implementation was fairly challenging and it required an in-depth analysis of design alternatives
+ as there is a need to stall the original command, prompt for a confirmation, and then execute or stop the execution
+ of the command (based on the confirmation provided). Also, there was a need to create a `YesCommand` which accepts any
+ of `y`, `ye`, or `yes` as a confirmation. After figuring out the implementation, however, the extension to other
+ existing commands was relatively straightforward.
+
+ * Added the ability to check accumulated Modular Credits (MCs) using `checkmc`.
+
+ * What it does:
+ Allows users to check how many Modular Credits they have attained based on the modules that they have
+ completed/added into GradPad.
+
+ * Justification:
+ This feature improves the application slightly as users might want to occasionally check how much
+ MCs they have attained so far so as to gauge how close they are to graduation without having to check the MCs for each
+ module and manually calculate.
+
+* **Enhancements to features implemented by peers**:
+ * Improved `gem` and `science` features to support auto update [\#182](https://github.com/AY2021S1-CS2103T-T09-1/tp/pull/182)
+
+* **Enhancements to existing features**:
+
+ * Refactored the Address Book 3 `ui` package and components [\#37](https://github.com/AY2021S1-CS2103T-T09-1/tp/pull/37)
+ * Improved flexibility of `find` feature [\#77](https://github.com/AY2021S1-CS2103T-T09-1/tp/pull/77)
+ * Improved implementation of `add` and `edit` features [\#111](https://github.com/AY2021S1-CS2103T-T09-1/tp/pull/111)
+ * Added a 1.5 second delay before closing GradPad window for `exit` feature [\#95](https://github.com/AY2021S1-CS2103T-T09-1/tp/pull/95)
+ * Added assertions to the `core`, `logic` and `module` packages [\#92](https://github.com/AY2021S1-CS2103T-T09-1/tp/pull/92)
+ * Refactored Index package [\#219](https://github.com/AY2021S1-CS2103T-T09-1/tp/pull/219)
+ * Changed the entire outlook of the Graphical User Interface (GUI)
+ * Changed arrangement of GUI components [\#51](https://github.com/AY2021S1-CS2103T-T09-1/tp/pull/51)
+ * Updated GUI color scheme [\#66](https://github.com/AY2021S1-CS2103T-T09-1/tp/pull/66)
+ * Added introduction display with original GradPad logo [\#127](https://github.com/AY2021S1-CS2103T-T09-1/tp/pull/127)
+
+* **Contributions to team-based tasks**:
+ * Came up with product name
+ * Changed product icon
+ * Designed GradPad logo
+ * Designed and added images with mark-ups for the User Guide
+ * Documented Non-Functional Requirements and Glossary to the Developer Guide
+ * Consolidated all messages into a single class
+ * Updated User Guide according to peers' and tutor's comments
+ * Improved readability and clarity for result display messages
+ * Standardised JavaDoc comments
+
+* **Documentation**:
+ * User Guide:
+ * Added documentation for `help`,`add` and `find` features [\#24](https://github.com/AY2021S1-CS2103T-T09-1/tp/pull/24)
+ * Updated command descriptions [\#102](https://github.com/AY2021S1-CS2103T-T09-1/tp/pull/102)
+
+ * Developer Guide:
+ * Added documentation for `find` feature, including sequence diagram [\#62](https://github.com/AY2021S1-CS2103T-T09-1/tp/pull/62)
+ * Added documentation for integration of NUSMods for `add` and `edit` features [\#214](https://github.com/AY2021S1-CS2103T-T09-1/tp/pull/214)
+ * Added documentation for Command Stalling feature [\#217](https://github.com/AY2021S1-CS2103T-T09-1/tp/pull/217)
+ * Updated documentation for `Ui` component, including class diagram [\#62](https://github.com/AY2021S1-CS2103T-T09-1/tp/pull/62)
+ * Updated documentation for manual testing [\#87](https://github.com/AY2021S1-CS2103T-T09-1/tp/pull/87)
+ * Updated documentation for `find` feature [\#215](https://github.com/AY2021S1-CS2103T-T09-1/tp/pull/215)
+ * Updated documentation for `delete` feature [\#217](https://github.com/AY2021S1-CS2103T-T09-1/tp/pull/217)
+
+
+* **Community**:
+ * Assisted in testing and reporting bugs for another team's product:
+ [\#1](https://github.com/mhdsyfq/ped/issues/1),
+ [\#2](https://github.com/mhdsyfq/ped/issues/2),
+ [\#3](https://github.com/mhdsyfq/ped/issues/3),
+ [\#4](https://github.com/mhdsyfq/ped/issues/4),
+ [\#5](https://github.com/mhdsyfq/ped/issues/5),
+ [\#6](https://github.com/mhdsyfq/ped/issues/6),
+ [\#7](https://github.com/mhdsyfq/ped/issues/7),
+ [\#8](https://github.com/mhdsyfq/ped/issues/8)
diff --git a/docs/team/shaokiat.md b/docs/team/shaokiat.md
new file mode 100644
index 00000000000..e2ff81c00da
--- /dev/null
+++ b/docs/team/shaokiat.md
@@ -0,0 +1,76 @@
+---
+layout: page
+title: Lim Shao Kiat's Project Portfolio Page
+---
+
+## Project: GradPad
+
+GradPad is a one-stop solution to **module management** for Computer Science Undergraduates.
+GradPad **consolidates** the modules you have taken and **displays** the remaining required modules to
+ease your module planning process. A **module searching platform** is also included in GradPad, providing easy
+**navigation** of modules.
+
+Given below are my contributions to the project.
+
+* **Code contributed**: [RepoSense link](https://nus-cs2103-ay2021s1.github.io/tp-dashboard/#breakdown=true&search=shaokiat&sort=groupTitle&sortWithin=title&since=2020-08-14&timeframe=commit&mergegroup=&groupSelect=groupByRepos&checkedFileTypes=docs~functional-code~test-code~other&tabOpen=true&tabType=zoom&zA=shaokiat&zR=AY2021S1-CS2103T-T09-1%2Ftp%5Bmaster%5D&zACS=239.02341137123747&zS=2020-08-14&zFS=t09&zU=2020-11-05&zMG=false&zFTF=commit&zFGS=groupByRepos&zFR=false)
+* **New Feature**: Added a `search` feature to search for modules from NUSMods and display it to the user. [\#100](https://github.com/AY2021S1-CS2103T-T09-1/tp/pull/100)
+ * What it does: Allows users to search for module details using module code and displaying all module information
+ onto the Result Display. Module information are fetch directly from NUSMods if internet is available, else it will
+ be fetched from local saved JSON file.
+
+ * Justification: This feature is required for users to look up relevant module details that they want to find out
+ about when planning for which modules to take. This command displays the module code, module title, modular credits,
+ semesters, descriptions, prerequisites and preclusion directly from NUSMods.
+
+ * Highlights: To implement this feature, I created a logic class `ModuleInfoSearcher` to utilize the nusmods package
+ previously created by my team mates. This logic class make method calls `NusmodsDataManager` to retrieve module
+ information directly from NUSMods using the NUSMods API. The search command then utilize `ModuleInfoSearcher` class
+ to search for module information and display the information accordingly in the Result Display.
+
+* **Team tasks**:
+ * Updated the User Guide according to Peers and Tutors comments
+ * Updated the project's logfile to gradpad.log
+ * Added introduction section to the user guide.
+
+* **Project management**:
+ * Recorded comments by Peers and Tutors with regards to GradPad especially on User Guide and Developer Guide.
+ * Addressed issues on User Guide from mock PE.
+ * Reviews and comments to team mates PR. [Example: \#111](https://github.com/AY2021S1-CS2103T-T09-1/tp/pull/111)
+
+* **Enhancements to existing features**:
+ * Refactored the `Delete` feature and command to take in module code as parameters instead of index. [\#120](https://github.com/AY2021S1-CS2103T-T09-1/tp/pull/120)
+ * Refactored the `Model` package and component of AddressBook into GradPad. [\#55](https://github.com/AY2021S1-CS2103T-T09-1/tp/pull/55)
+ * Added assertions to `StorageManager`. [\#105](https://github.com/AY2021S1-CS2103T-T09-1/tp/pull/105)
+ * Added semester data field to `ModuleInfo` class. [\#174](https://github.com/AY2021S1-CS2103T-T09-1/tp/pull/174)
+
+* **Documentation**:
+ * User Guide:
+ * Added Ui Markup for User Guide. [\#52](https://github.com/AY2021S1-CS2103T-T09-1/tp/pull/52)
+ * Added documentation for the v1.2 feature `delete` [\#23](https://github.com/AY2021S1-CS2103T-T09-1/tp/pull/23)
+ * Added documentation for the v1.3 feature `search` [\#75](https://github.com/AY2021S1-CS2103T-T09-1/tp/pull/75)
+ * Added documentation for the v1.3 feature `required` [\#75](https://github.com/AY2021S1-CS2103T-T09-1/tp/pull/75)
+ * Added introduction and NUSMods section to User Guide. [\#52](https://github.com/AY2021S1-CS2103T-T09-1/tp/pull/52) & [\#130](https://github.com/AY2021S1-CS2103T-T09-1/tp/pull/130)
+ * Updated documentation with comments from CS2101 Tutor and CS2103T TA. [\#130](https://github.com/AY2021S1-CS2103T-T09-1/tp/pull/130)
+ * Updated command summary in documentation. [\#75](https://github.com/AY2021S1-CS2103T-T09-1/tp/pull/75)
+ * Updated feature summary list into table form. [\#75](https://github.com/AY2021S1-CS2103T-T09-1/tp/pull/75)
+ * Updated documentation with issues reported from mock PE for v1.4. [\#172](https://github.com/AY2021S1-CS2103T-T09-1/tp/pull/172)
+
+ * Developer Guide:
+ * Refactored the `Model` component class diagram and description. [\#55](https://github.com/AY2021S1-CS2103T-T09-1/tp/pull/55)
+ * Added implementation details of the `delete` feature. [\#55](https://github.com/AY2021S1-CS2103T-T09-1/tp/pull/55)
+ * Refactored the `Undo/Redo` proposed implementation. [\#75](https://github.com/AY2021S1-CS2103T-T09-1/tp/pull/75)
+ * Added use cases for GradPad in the documentation. [\#75](https://github.com/AY2021S1-CS2103T-T09-1/tp/pull/75)
+
+* **Review/mentoring contributions**:
+ * PRs reviewed (with non-trivial review comments): [\#58](https://github.com/AY2021S1-CS2103T-T09-1/tp/pull/58),
+ [\#35](https://github.com/AY2021S1-CS2103T-T09-1/tp/pull/35),
+ [\#111](https://github.com/AY2021S1-CS2103T-T09-1/tp/pull/111)
+ * Assisted teammates with any Git queries or issues, specifically on SourceTree.
+
+* **Community**:
+ * Assisted in testing and reporting bugs for another team's product:
+ [\#1](https://github.com/shaokiat/ped/issues/1),
+ [\#2](https://github.com/shaokiat/ped/issues/2),
+ [\#3](https://github.com/shaokiat/ped/issues/3),
+ [\#4](https://github.com/shaokiat/ped/issues/4),
+ [\#5](https://github.com/shaokiat/ped/issues/5)
diff --git a/docs/team/silvernitro.md b/docs/team/silvernitro.md
new file mode 100644
index 00000000000..187d4795af3
--- /dev/null
+++ b/docs/team/silvernitro.md
@@ -0,0 +1,131 @@
+---
+layout: page
+title: Lau Siaw Sam's Project Portfolio Page
+---
+
+## Project: GradPad
+
+GradPad is a one-stop solution to **module management** for Computer Science Undergraduates.
+GradPad **consolidates** the modules you have taken and **displays** the remaining required modules to
+ease your module planning process. A **module searching platform** is also included in GradPad, providing easy
+**navigation** of modules.
+
+Given below are my contributions to the project.
+
+* **Code contributed**: [RepoSense link](https://nus-cs2103-ay2021s1.github.io/tp-dashboard/#breakdown=true&search=silvernitro&sort=groupTitle&sortWithin=title&since=2020-08-14&timeframe=commit&mergegroup=&groupSelect=groupByRepos&checkedFileTypes=docs~functional-code~test-code~other)
+
+* **New Feature**: Implemented the back-end logic to fetch and use module data from the NUSMods API.
+ * What it does: Allows GradPad to send HTTP requests to the public NUSMods API to retrieve module summaries
+ and specific module information data. Additionally, it also has a script to scrape all CS modules to save locally.
+
+ * Justification: This feature is core to GradPad's module searching platform as it allows users to view
+ the most up-to-date information, that can't be achieved if GradPad simply used an archive of pre-fetched data.
+ Additionally, since GradPad must not be reliant on an internet connection, we also had to scrape and save CS
+ module data to a local file and ship that with GradPad releases, so that users can still search for CS modules
+ even when offline.
+
+ * Highlights: The feature was not trivial to implement as it consists of several major parts: fetching module
+ summaries, fetching module information, deserializing JSON data received into Java objects, serializing these
+ objects into JSON save files compatible with GradPad, and also making module info available even without an internet
+ connection. On the whole, I found it difficult to handle API requests and JSON data in Java and had to read up
+ quite a bit on the topic.
+ To make it easier for other developers to use NUSMods data,
+ I designed the NUSMods package with a high degree of encapsulation and a lean public interface.
+ As such, client code elsewhere in GradPad can simply pass in module codes and get back module info using simple
+ function calls. There is no need to handle the fetching, storing, or the fall-back to local data (when offline)
+ anywhere else in GradPad.
+
+ * Credits: Code reuse was minimal. However, the basic logic to make HTTP GET requests is rather boilerplate and may
+ seem to be the same in any Java application.
+
+* **New Feature**: Added a feature to allow filtering of modules by tags
+ * What it does: Allows users to key in tags that they wish to search for, and view all modules with those tags.
+
+ * Justification: This feature allows users to use tags to organize their list of modules and navigate that list
+ conveniently when their no. of modules are large.
+
+ * Highlights: To implement this feature, I had to create a new predicate to test if a module contained certain tags.
+ After that, I had to tweak the existing `find` command to allow it to search by tags too. However, in order to
+ retain the original functionality of searching by module code keywords, I had to come up with a way to combine
+ both search predicates. In order to make things more extensible, I decided to create a new compound predicate class
+ that handles the chaining of multiple predicates.
+
+
+
+* **New Feature**: Added a command to allow users to view all tags in GradPad
+ * What it does: Allows users to view a list of all the tags they've added.
+
+ * Justification: This feature allows users to check if a certain tag exists. This is especially useful when they
+ need to know what tags they can use to filter their list of modules (see feature above).
+
+ * Highlights: The implementation of this feature is not as straightforward as it sounds. In the original AB3
+ project, a module's tags were implemented by storing a list of `Tag` objects within each `Module`.
+ However, this provided no way to easily retrieve all tags without duplicates. To do so, one would
+ have to iterate through every module in GradPad, iterate through each module's list of `Tag` objects, filter them,
+ and then display them.
+ As such, I re-implemented the tags feature by creating a central class to hold a collection of unique tags in
+ GradPad. All `Module` objects thus reference unique `Tag` objects within this collection, rather than store their
+ own duplicate copies of `Tag`s. Printing out all tags would just involve printing this collection out. This
+ also meant that I had to rework the implementation for the addition, editing, and deletion of modules to use
+ this new collection of unique tags.
+
+* **Team tasks**:
+ * Set up assertions in Gradle.
+ * Updated the project's readme page to reflect the project's features and direct all hyperlinks to GradPad pages.
+ * Updated GradPad's Jekyll config (remove AB3-specific content).
+ * Added feature summary list and command summary table to the user guide.
+
+* **Project management**:
+ * Managed releases `v1.3-trial` and `v1.3` (2 releases) on GitHub
+
+* **Enhancements to existing features**:
+ * Refactored the entire AB3 `Person` package and its containing classes to GradPad's `Module` package.
+ * Added assertions to the `NUSMods` package.
+ * Allow multi-word tags and substring module searches by tags.
+ * Add case-insensitive check for duplicate tags when users add a module.
+
+* **Documentation**:
+ * User Guide:
+ * Added documentation for the feature `tag` [\#131](https://github.com/AY2021S1-CS2103T-T09-1/tp/pull/131)
+ * Added documentation for the feature `edit` [\#64](https://github.com/AY2021S1-CS2103T-T09-1/tp/pull/64)
+ * Added documentation for the feature `clear` [\#216](https://github.com/AY2021S1-CS2103T-T09-1/tp/pull/216)
+ * Added documentation to explain the automatic addition of module titles and modular credits
+ [\#83](https://github.com/AY2021S1-CS2103T-T09-1/tp/pull/64)
+ * Updated documentation for the features `add`, `find`, `edit`
+ [\#131](https://github.com/AY2021S1-CS2103T-T09-1/tp/pull/131)
+ * Updated introduction to include the purpose of the guide
+ [\#113](https://github.com/AY2021S1-CS2103T-T09-1/tp/pull/113)
+ * Developer Guide:
+ * Added architecture details and design considerations for the `NUSMods` component, including a class diagram.
+ [\#78](https://github.com/AY2021S1-CS2103T-T09-1/tp/pull/78)
+ * Added implementation details of the `tags` feature, including sequence diagrams.
+ [\#192](https://github.com/AY2021S1-CS2103T-T09-1/tp/pull/192)
+ * Added implementations details of GradPad's NUSMods integration, including sequence diagrams.
+ [\#198](https://github.com/AY2021S1-CS2103T-T09-1/tp/pull/198)
+ * Added implementation details of the `edit`, `list`, `checkmc`, `required`, `search` command features, including
+ all sequence diagrams.
+ [\#78](https://github.com/AY2021S1-CS2103T-T09-1/tp/pull/78) &
+ [\#42](https://github.com/AY2021S1-CS2103T-T09-1/tp/pull/42)
+ * Updated the `Storage` component class diagram.
+ [\#42](https://github.com/AY2021S1-CS2103T-T09-1/tp/pull/42)
+
+* **Review/mentoring contributions**:
+ * PRs reviewed (with non-trivial review comments): [\#94](https://github.com/AY2021S1-CS2103T-T09-1/tp/pull/94),
+ [\#97](https://github.com/AY2021S1-CS2103T-T09-1/tp/pull/97),
+ [\#111](https://github.com/AY2021S1-CS2103T-T09-1/tp/pull/111),
+ [\#133](https://github.com/AY2021S1-CS2103T-T09-1/tp/pull/133),
+ [\#169](https://github.com/AY2021S1-CS2103T-T09-1/tp/pull/169),
+ [\#176](https://github.com/AY2021S1-CS2103T-T09-1/tp/pull/176),
+ [\#197](https://github.com/AY2021S1-CS2103T-T09-1/tp/pull/197)
+ * Assisted teammates with any Git queries or issues.
+ * Assisted in the program design of adding confirmation prompts when executing `delete` and `clear` commands.
+
+* **Community**:
+ * Assisted in testing and reporting bugs for another team's product:
+ [\#1](https://github.com/Silvernitro/ped/issues/1),
+ [\#2](https://github.com/Silvernitro/ped/issues/2),
+ [\#3](https://github.com/Silvernitro/ped/issues/3),
+ [\#4](https://github.com/Silvernitro/ped/issues/4),
+ [\#5](https://github.com/Silvernitro/ped/issues/5),
+ [\#6](https://github.com/Silvernitro/ped/issues/6),
+ [\#7](https://github.com/Silvernitro/ped/issues/7)
diff --git a/docs/team/yan-soon.md b/docs/team/yan-soon.md
new file mode 100644
index 00000000000..6172f9860ae
--- /dev/null
+++ b/docs/team/yan-soon.md
@@ -0,0 +1,117 @@
+---
+layout: page
+title: Soon Xiang, Yan's Project Portfolio Page
+---
+
+## Project: GradPad
+
+GradPad is an offline computer application meant to help Computer Science students from the
+National University of Singapore (NUS) plan their modules with more ease. All module information is
+displayed through our simple and organised Graphical User Interface (GUI) created with JavaFX.
+GradPad is also optimised for users who prefer working on a Command Line Interface (CLI). It is written
+in Java, and has about 13k LoC.
+
+
+Given below are my contributions to the project.
+
+* **New Feature**: Added `required` command to check left-over required modules from the Computer Science Curriculum.
+
+ * What it does: Allows the user to check any undone required modules by cross-referring their current list of completed modules
+ against the list of all the required modules that we store within GradPad. Modules are split into separate categories
+ (Eg. Foundation, GE, Etc) for enhanced readability. The command also accounts for equivalent modules and preclusion (Eg. CS1010X & CS1101S).
+
+ * Justification: This feature enhances the product significantly as users no longer have to refer manually to the NUS
+ website, just to see a list of modules that they have not completed. Also, they do not have to manually filter our their
+ completed modules, just to check what are the left-over modules, saving them loads of time during their module planning.
+
+ * Highlights: This enhancement is a vital selling point of GradPad and will affect our future features. As the command
+ deals with a lot of data and functionality, it required an in-depth analysis of design alternatives and OOP. The implementation
+ was also tedious as it required a lot of testing. Initially, we used the provided JsonGradPadStorage class to read JSON
+ file paths. However, we realised that our JAR release was not able to load the JSON files properly in runtime, due to
+ pathing issues. Hence, with help from fellow teammate Lau Siaw Sam and some further study, we managed to find another
+ way to read JSON files during runtime with the help of a ClassLoader, allowing our app to run smoothly during our release.
+
+ * Credits: [Read a file from resources folder](https://mkyong.com/java/java-read-a-file-from-resources-folder/)
+
+* **New Feature**: Added `science` and `gem` commands to check all the available Science and General Education Modules
+under the Computer Science Curriculum and in NUS respectively.
+
+ * What it does: Allows the user to check all the undone and available Science and General Education modules
+ in the curriculum, based on their current list of modules accomplished.
+
+ * Justification: This feature enhances the product as users no longer have to refer to the School website just to view
+ the available Science Modules. It is separated from the `required` command from making the required command too
+ cluttered, thus improving overall user experience. Separating the two commands also makes it easier to update our storage
+ as we can now update our database for science modules without touching the other databases. Furthermore, General Education
+ modules are also split according to Semester Availability which saves users more time.
+
+ * Highlights: This enhancement is vital to GradPad as it is part of our core `required` command feature. The command deals
+ with a fair bit of data and testing, making the implementation slightly difficult. Faced the same issue as described above
+ regarding accessing JSON files in our JAR release.
+
+ * Credits: [Read a file from resources folder](https://mkyong.com/java/java-read-a-file-from-resources-folder/)
+
+* **Code contributed**: [RepoSense link](https://nus-cs2103-ay2021s1.github.io/tp-dashboard/#breakdown=true&search=yan-soon&sort=groupTitle&sortWithin=title&since=2020-08-14&timeframe=commit&mergegroup=&groupSelect=groupByRepos&checkedFileTypes=docs~functional-code~test-code~other)
+
+* **Project management**:
+ * Minutes Taker during meetings and consultations.
+ * Assign weekly workload to team.
+ * Provide feedback constantly, to teammate's code.
+ [Comments made](https://nus-cs2103-ay2021s1.github.io/dashboards/contents/tp-comments.html)
+
+* **Enhancements to existing features**:
+ * Refactored `Command`, `Parser` and `Storage` Component of AB3 code base
+ (Pull request [\#35](https://github.com/AY2021S1-CS2103T-T09-1/tp/pull/35))
+ * Updated `help` command to display instructions directly instead of a link to the UG.
+ (Pull request [\#70](https://github.com/AY2021S1-CS2103T-T09-1/tp/pull/70))
+ * Added Assertions to Model Component.
+ (Pull request [\#99](https://github.com/AY2021S1-CS2103T-T09-1/tp/pull/99))
+ * Added tests to existing features to improve overall Test Coverage.
+ (Pull requests [\#197](https://github.com/AY2021S1-CS2103T-T09-1/tp/pull/197),
+ [\#204](https://github.com/AY2021S1-CS2103T-T09-1/tp/pull/204))
+
+* **Documentation**:
+ * User Guide:
+ * Added documentation for the features `required`, `science`, `gem`, `checkmc`, and `exit`.
+ (Pull requests [\#16](https://github.com/AY2021S1-CS2103T-T09-1/tp/pull/16),
+ [\#117](https://github.com/AY2021S1-CS2103T-T09-1/tp/pull/117),
+ [\#134](https://github.com/AY2021S1-CS2103T-T09-1/tp/pull/134))
+ * Used Markdown to write Tips and Notes to make UG more visually stunning.
+ (Pull requests [\#134](https://github.com/AY2021S1-CS2103T-T09-1/tp/pull/134),
+ [\#218](https://github.com/AY2021S1-CS2103T-T09-1/tp/pull/218))
+ * Improved sentence structuring and language use in UG to make it more user-centric.
+ (Pull requests [\#45](https://github.com/AY2021S1-CS2103T-T09-1/tp/pull/45),
+ [\#70](https://github.com/AY2021S1-CS2103T-T09-1/tp/pull/70),
+ [\#117](https://github.com/AY2021S1-CS2103T-T09-1/tp/pull/117),
+ [\#134](https://github.com/AY2021S1-CS2103T-T09-1/tp/pull/134))
+
+ * Developer Guide:
+ * Added implementation details for the features `add`, `required`, `science` and `gem`
+ and the Storage Component.
+ (Pull requests [\#45](https://github.com/AY2021S1-CS2103T-T09-1/tp/pull/45),
+ [\#180](https://github.com/AY2021S1-CS2103T-T09-1/tp/pull/180)
+ [\#218](https://github.com/AY2021S1-CS2103T-T09-1/tp/pull/218))
+ * Added Introduction and 'About This Guide' section to the DG.
+ (Pull request [\#70](https://github.com/AY2021S1-CS2103T-T09-1/tp/pull/70))
+ * Added Target User Profile, Value Proposition, User Stories and Use Cases to the DG.
+ (Pull request [\#19](https://github.com/AY2021S1-CS2103T-T09-1/tp/pull/19))
+ * Added Manual Testing for all features to the DG.
+ (Pull request [\#180](https://github.com/AY2021S1-CS2103T-T09-1/tp/pull/180))
+ * Refactored `Logic` component portion of DG.
+ (Pull request [\#45](https://github.com/AY2021S1-CS2103T-T09-1/tp/pull/45))
+
+* **Community**:
+ * PRs reviewed (with non-trivial review comments):
+ [\#100](https://github.com/AY2021S1-CS2103T-T09-1/tp/pull/100),
+ [\#111](https://github.com/AY2021S1-CS2103T-T09-1/tp/pull/111)
+ * Reported bugs and suggestions for other teams in the class
+ (examples: [\#1](https://github.com/yan-soon/ped/issues/1),
+ [\#2](https://github.com/yan-soon/ped/issues/2),
+ [\#3](https://github.com/yan-soon/ped/issues/3),
+ [\#4](https://github.com/yan-soon/ped/issues/4),
+ [\#5](https://github.com/yan-soon/ped/issues/5),
+ [\#6](https://github.com/yan-soon/ped/issues/6),
+ [\#7](https://github.com/yan-soon/ped/issues/7),
+ [\#8](https://github.com/yan-soon/ped/issues/8),
+ [\#9](https://github.com/yan-soon/ped/issues/9),
+ [\#10](https://github.com/yan-soon/ped/issues/10))
diff --git a/src/main/java/seedu/address/MainApp.java b/src/main/java/seedu/address/MainApp.java
index e5cfb161b73..88611aed77e 100644
--- a/src/main/java/seedu/address/MainApp.java
+++ b/src/main/java/seedu/address/MainApp.java
@@ -15,15 +15,15 @@
import seedu.address.commons.util.StringUtil;
import seedu.address.logic.Logic;
import seedu.address.logic.LogicManager;
-import seedu.address.model.AddressBook;
+import seedu.address.model.GradPad;
import seedu.address.model.Model;
import seedu.address.model.ModelManager;
-import seedu.address.model.ReadOnlyAddressBook;
+import seedu.address.model.ReadOnlyGradPad;
import seedu.address.model.ReadOnlyUserPrefs;
import seedu.address.model.UserPrefs;
import seedu.address.model.util.SampleDataUtil;
-import seedu.address.storage.AddressBookStorage;
-import seedu.address.storage.JsonAddressBookStorage;
+import seedu.address.storage.GradPadStorage;
+import seedu.address.storage.JsonGradPadStorage;
import seedu.address.storage.JsonUserPrefsStorage;
import seedu.address.storage.Storage;
import seedu.address.storage.StorageManager;
@@ -48,7 +48,7 @@ public class MainApp extends Application {
@Override
public void init() throws Exception {
- logger.info("=============================[ Initializing AddressBook ]===========================");
+ logger.info("=============================[ Initializing GradPad ]===========================");
super.init();
AppParameters appParameters = AppParameters.parse(getParameters());
@@ -56,8 +56,8 @@ public void init() throws Exception {
UserPrefsStorage userPrefsStorage = new JsonUserPrefsStorage(config.getUserPrefsFilePath());
UserPrefs userPrefs = initPrefs(userPrefsStorage);
- AddressBookStorage addressBookStorage = new JsonAddressBookStorage(userPrefs.getAddressBookFilePath());
- storage = new StorageManager(addressBookStorage, userPrefsStorage);
+ GradPadStorage gradPadStorage = new JsonGradPadStorage(userPrefs.getGradPadFilePath());
+ storage = new StorageManager(gradPadStorage, userPrefsStorage);
initLogging(config);
@@ -69,25 +69,25 @@ public void init() throws Exception {
}
/**
- * Returns a {@code ModelManager} with the data from {@code storage}'s address book and {@code userPrefs}.
- * The data from the sample address book will be used instead if {@code storage}'s address book is not found,
- * or an empty address book will be used instead if errors occur when reading {@code storage}'s address book.
+ * Returns a {@code ModelManager} with the data from {@code storage}'s GradPad and {@code userPrefs}.
+ * The data from the sample GradPad will be used instead if {@code storage}'s GradPad is not found,
+ * or an empty GradPad will be used instead if errors occur when reading {@code storage}'s GradPad.
*/
private Model initModelManager(Storage storage, ReadOnlyUserPrefs userPrefs) {
- Optional addressBookOptional;
- ReadOnlyAddressBook initialData;
+ Optional gradPadOptional;
+ ReadOnlyGradPad initialData;
try {
- addressBookOptional = storage.readAddressBook();
- if (!addressBookOptional.isPresent()) {
- logger.info("Data file not found. Will be starting with a sample AddressBook");
+ gradPadOptional = storage.readGradPad();
+ if (!gradPadOptional.isPresent()) {
+ logger.info("Data file not found. Will be starting with a sample GradPad");
}
- initialData = addressBookOptional.orElseGet(SampleDataUtil::getSampleAddressBook);
+ initialData = gradPadOptional.orElseGet(SampleDataUtil::getSampleGradPad);
} catch (DataConversionException e) {
- logger.warning("Data file not in the correct format. Will be starting with an empty AddressBook");
- initialData = new AddressBook();
+ logger.warning("Data file not in the correct format. Will be starting with an empty GradPad");
+ initialData = new GradPad();
} catch (IOException e) {
- logger.warning("Problem while reading from the file. Will be starting with an empty AddressBook");
- initialData = new AddressBook();
+ logger.warning("Problem while reading from the file. Will be starting with an empty GradPad");
+ initialData = new GradPad();
}
return new ModelManager(initialData, userPrefs);
@@ -151,7 +151,7 @@ protected UserPrefs initPrefs(UserPrefsStorage storage) {
+ "Using default user prefs");
initializedPrefs = new UserPrefs();
} catch (IOException e) {
- logger.warning("Problem while reading from the file. Will be starting with an empty AddressBook");
+ logger.warning("Problem while reading from the file. Will be starting with an empty GradPad");
initializedPrefs = new UserPrefs();
}
@@ -167,13 +167,13 @@ protected UserPrefs initPrefs(UserPrefsStorage storage) {
@Override
public void start(Stage primaryStage) {
- logger.info("Starting AddressBook " + MainApp.VERSION);
+ logger.info("Starting GradPad " + MainApp.VERSION);
ui.start(primaryStage);
}
@Override
public void stop() {
- logger.info("============================ [ Stopping Address Book ] =============================");
+ logger.info("============================ [ Stopping GradPad ] =============================");
try {
storage.saveUserPrefs(model.getUserPrefs());
} catch (IOException e) {
diff --git a/src/main/java/seedu/address/commons/core/GuiSettings.java b/src/main/java/seedu/address/commons/core/GuiSettings.java
index ba33653be67..1cc07c88ff2 100644
--- a/src/main/java/seedu/address/commons/core/GuiSettings.java
+++ b/src/main/java/seedu/address/commons/core/GuiSettings.java
@@ -10,8 +10,8 @@
*/
public class GuiSettings implements Serializable {
- private static final double DEFAULT_HEIGHT = 600;
- private static final double DEFAULT_WIDTH = 740;
+ public static final double DEFAULT_HEIGHT = 600;
+ public static final double DEFAULT_WIDTH = 740;
private final double windowWidth;
private final double windowHeight;
@@ -30,6 +30,8 @@ public GuiSettings() {
* Constructs a {@code GuiSettings} with the specified height, width and position.
*/
public GuiSettings(double windowWidth, double windowHeight, int xPosition, int yPosition) {
+ assert(windowWidth > 0);
+ assert(windowHeight > 0);
this.windowWidth = windowWidth;
this.windowHeight = windowHeight;
windowCoordinates = new Point(xPosition, yPosition);
diff --git a/src/main/java/seedu/address/commons/core/LogsCenter.java b/src/main/java/seedu/address/commons/core/LogsCenter.java
index 431e7185e76..4fdc19471a6 100644
--- a/src/main/java/seedu/address/commons/core/LogsCenter.java
+++ b/src/main/java/seedu/address/commons/core/LogsCenter.java
@@ -18,7 +18,7 @@
public class LogsCenter {
private static final int MAX_FILE_COUNT = 5;
private static final int MAX_FILE_SIZE_IN_BYTES = (int) (Math.pow(2, 20) * 5); // 5MB
- private static final String LOG_FILE = "addressbook.log";
+ private static final String LOG_FILE = "gradpad.log";
private static Level currentLogLevel = Level.INFO;
private static final Logger logger = LogsCenter.getLogger(LogsCenter.class);
private static FileHandler fileHandler;
@@ -31,10 +31,20 @@ public class LogsCenter {
* is requested again from the LogsCenter.
*/
public static void init(Config config) {
+ assert(config != null);
currentLogLevel = config.getLogLevel();
logger.info("currentLogLevel: " + currentLogLevel);
}
+ /**
+ * Retrieves the currentLogLevel attribute.
+ *
+ * @return currentLogLevel attribute of type Level.
+ */
+ public Level getCurrentLogLevel() {
+ return currentLogLevel;
+ }
+
/**
* Creates a logger with the given name.
*/
diff --git a/src/main/java/seedu/address/commons/core/Messages.java b/src/main/java/seedu/address/commons/core/Messages.java
index 1deb3a1e469..bf2cf3c2944 100644
--- a/src/main/java/seedu/address/commons/core/Messages.java
+++ b/src/main/java/seedu/address/commons/core/Messages.java
@@ -5,9 +5,230 @@
*/
public class Messages {
- public static final String MESSAGE_UNKNOWN_COMMAND = "Unknown command";
- public static final String MESSAGE_INVALID_COMMAND_FORMAT = "Invalid command format! \n%1$s";
- public static final String MESSAGE_INVALID_PERSON_DISPLAYED_INDEX = "The person index provided is invalid";
- public static final String MESSAGE_PERSONS_LISTED_OVERVIEW = "%1$d persons listed!";
+ // module components constraints
+ public static final String MESSAGE_CONSTRAINTS_CREDITS =
+ "Modular credits should only contain numbers, and it should be either 1 or 2 digits long.";
+ public static final String MESSAGE_CONSTRAINTS_CODE = "A module code must have 2 or more characters as "
+ + "its prefix followed by 1 or more digits as its numerical code. It can optionally end with 1 or "
+ + "more characters as a suffix. It is also case-insensitive.";
+ public static final String MESSAGE_CONSTRAINTS_TITLE = "Module titles should only contain alphanumeric "
+ + "characters and spaces.";
+ public static final String MESSAGE_CONSTRAINTS_TAG = "Tag descriptions should be alphanumeric and non-empty.";
+ // general
+ public static final String MESSAGE_NEED_HELP = "If you need help, type \"help\".";
+ public static final String MESSAGE_MORE_INFO = "For more information, type \"help\".";
+ public static final String MESSAGE_EMPTY_FIELD = "Please enter a command.\n\n"
+ + MESSAGE_NEED_HELP;
+ public static final String MESSAGE_UNKNOWN_COMMAND = "You have entered an unknown command. Please try "
+ + "again.\n\n" + MESSAGE_NEED_HELP;
+ public static final String MESSAGE_INVALID_COMMAND_FORMAT = "Please use the correct format for the "
+ + "following command: %1$s";
+ public static final String MESSAGE_DUPLICATE_MODULE = "Module with module code %1$s already exists!";
+ public static final String MESSAGE_INVALID_MODULE = "Module with module code %1$s cannot be found in "
+ + "GradPad!";
+ public static final String MESSAGE_EMPTY_GRADPAD = "GradPad is empty!";
+ public static final String MESSAGE_MODULES_FOUND_OVERVIEW = "%1$d modules found!";
+ public static final String MESSAGE_INVALID_MODULE_CODE = "%1$s is an invalid module code. Please try"
+ + " again.\n\n"
+ + "Note:\n" + MESSAGE_CONSTRAINTS_CODE;
+ public static final String MESSAGE_INVALID_TAG = "\"%1$s\" is an invalid tag. Please try again.\n\n"
+ + "Note:\n" + MESSAGE_CONSTRAINTS_TAG;
+ public static final String LINE = "----------------------------------------------------------------------"
+ + "--------------------------------------\n\n";
+
+ // ModuleInfoSearcher
+ public static final String MESSAGE_FAILED_TO_FIND_MODULE = "Failed to find module: %s";
+ public static final String MESSAGE_EMPTY_SEARCH = "Search is empty";
+
+ // add command
+ public static final String ADD_COMMAND_WORD = "add";
+ public static final String MESSAGE_ADD_USAGE = ADD_COMMAND_WORD + "\n\n"
+ + "Format:\nadd MODULE_CODE [t/TAG]...\n\nNote:\n"
+ + "\u2022 [ ] indicate optional fields.\n"
+ + "\u2022 ... indicate fields that may have multiple instances.\n\n"
+ + MESSAGE_MORE_INFO;
+ public static final String MESSAGE_ADD_SUCCESS = "The following module has been successfully added:\n\n"
+ + "%1$s";
+
+ // checkmc command
+ public static final String CHECKMC_COMMAND_WORD = "checkmc";
+ public static final String MESSAGE_CHECKMC_SUCCESS = "You have accumulated a total of %.1f MCs so "
+ + "far!";
+
+ // clear command
+ public static final String CLEAR_COMMAND_WORD = "clear";
+ public static final String FORCE_CLEAR_COMMAND_WORD = "fclear";
+ public static final String MESSAGE_CLEAR_SUCCESS = "GradPad has been cleared!";
+ public static final String MESSAGE_CLEAR_CONFIRMATION = "Are you sure you wish to clear all modules? "
+ + "(yes/no)";
+
+ // delete command
+ public static final String DELETE_COMMAND_WORD = "delete";
+ public static final String FORCE_DELETE_COMMAND_WORD = "fdelete";
+ public static final String MESSAGE_DELETE_USAGE = DELETE_COMMAND_WORD + "\n\n"
+ + "Format:\ndelete MODULE_CODE\n\n"
+ + MESSAGE_MORE_INFO;
+ public static final String MESSAGE_FORCE_DELETE_USAGE = FORCE_DELETE_COMMAND_WORD + "\n\n"
+ + "Format:\nfdelete MODULE_CODE\n\n"
+ + MESSAGE_MORE_INFO;
+ public static final String MESSAGE_DELETE_SUCCESS = "The following module has been successfully "
+ + "deleted:\n\n%1$s";
+ public static final String MESSAGE_DELETE_CONFIRMATION = "Are you sure you wish to delete the following"
+ + " module? (yes/no)\n\n";
+
+ // edit command
+ public static final String EDIT_COMMAND_WORD = "edit";
+ public static final String MESSAGE_EDIT_USAGE = EDIT_COMMAND_WORD + "\n\n"
+ + "Format:\nedit MODULE_CODE [c/NEW_MODULE_CODE] [t/TAG]...\n\nNote:\n"
+ + "\u2022 At least 1 field to edit must be specified.\n"
+ + "\u2022 [ ] indicate optional fields.\n"
+ + "\u2022 ... indicate fields that may have multiple instances.\n\n"
+ + MESSAGE_MORE_INFO;
+ public static final String MESSAGE_EDIT_SUCCESS = "The following module has been successfully edited:"
+ + "\n\n%1$s\n\nEdited module:\n\n%2$s";
+ public static final String MESSAGE_NOT_EDITED = "You must provide at least one field to edit!";
+ public static final String MESSAGE_ALL_EDIT_FIELDS_SAME = "The new fields provided have the same values as the "
+ + "current ones.";
+
+ // exit command
+ public static final String EXIT_COMMAND_WORD = "exit";
+ public static final String MESSAGE_EXIT_ACKNOWLEDGEMENT = "Take care!";
+
+ // find command
+ public static final String FIND_COMMAND_WORD = "find";
+ public static final String MESSAGE_FIND_USAGE = FIND_COMMAND_WORD + "\n\n"
+ + "Format:\nfind [KEYWORD]... [TAG]...\n\nNote:\n"
+ + "\u2022 At least 1 keyword or tag to find must be specified.\n"
+ + "\u2022 [ ] indicate optional fields.\n"
+ + "\u2022 ... indicate fields that may have multiple instances.\n\n"
+ + MESSAGE_MORE_INFO;
+
+ // help command
+ public static final String HELP_COMMAND_WORD = "help";
+ public static final String ADD_COMMAND = "To add a module:\tType \"add\" followed by a valid module "
+ + "code and tags.\n"
+ + "\t\t\t\t(Tags are optional and you can have any number of tags)\n\n"
+ + "\t\t\t\tExample(s):\tadd cs1231\n"
+ + "\t\t\t\t\t\t\tadd cs1231 t/Foundation t/Core\n\n";
+ public static final String DELETE_COMMAND = "To delete a module:\tType \"delete\" followed by a valid "
+ + "module code.\n\n"
+ + "\t\t\t\tNote:\n" + "\t\t\t\tThis command prompts for a confirmation before deleting.\n\n"
+ + "\t\t\t\tExample(s):\tdelete cs1231\n\n";
+ public static final String FORCE_DELETE_COMMAND = "To force delete" + "\t\tType \"fdelete\" followed by"
+ + " a valid module code.\n"
+ + "a module:\n"
+ + "\t\t\t\tNote:\n" + "\t\t\t\tThis command does not prompt for a confirmation before\n"
+ + "\t\t\t\tdeleting.\n\n"
+ + "\t\t\t\tExample(s):\tfdelete cs1231\n\n";
+ public static final String EDIT_COMMAND = "To edit a module:\tType \"edit\" followed by a valid module "
+ + "code and the fields\n"
+ + "\t\t\t\tyou wish to edit (at least 1 field must be provided). You can\n"
+ + "\t\t\t\tonly edit the module code and tags of a module by using the\n"
+ + "\t\t\t\tprefixes \"c/\" and \"t/\" respectively.\n\n"
+ + "\t\t\t\tNote:\n" + "\t\t\t\tEditing tags replaces existing tags with new ones instead of\n"
+ + "\t\t\t\tchanging their respective descriptions. You can remove tags of a\n"
+ + "\t\t\t\tmodule simply by including the aforementioned prefix without a\n"
+ + "\t\t\t\tdescription as one of the edit fields, i.e., \"t/\".\n\n"
+ + "\t\t\t\tExample(s):\tedit cs1231 c/cs2100\n"
+ + "\t\t\t\t\t\t\tedit cs1231 c/cs2100 t/Foundation\n"
+ + "\t\t\t\t\t\t\tedit cs1231 t/ (to remove tags)\n\n";
+ public static final String FIND_COMMAND = "To find a" + "\t\t\tType \"find\" followed by the respective "
+ + "keywords or tags.\n"
+ + "specific module" + "\t\t(You can specify multiple keywords or tags)\n"
+ + "or a group of\n"
+ + "modules with" + "\t\tNote:\n"
+ + "common tags" + "\t\tKeywords can be specified as a sequence of characters of a\n"
+ + "or keywords:" + "\t\tmodule code whereas tags must be specified fully.\n\n"
+ + "\t\t\t\tExample(s):\tfind cs1231\n"
+ + "\t\t\t\t\t\t\tfind cs st (to find modules which module codes\n"
+ + "\t\t\t\t\t\t\tcontain \"cs\" or \"st\")\n"
+ + "\t\t\t\t\t\t\tfind foundation (to find modules with\n"
+ + "\t\t\t\t\t\t\t\"foundation\" as a tag)\n\n";
+ public static final String SEARCH_COMMAND = "To view details" + "\t\tType \"search\" followed by a "
+ + "valid module code.\n"
+ + "of a module:\n"
+ + "\t\t\t\tExample(s):\tsearch cs1231\n\n";
+ public static final String REQUIRED_COMMAND = "To view all" + "\t\t\tType \"required\".\n"
+ + "your required\nmodules:\n\n";
+ public static final String SCIENCE_COMMAND = "To view all" + "\t\t\tType \"science\".\n"
+ + "available Science\n"
+ + "modules:" + "\t\t\tNote:\n"
+ + "\t\t\t\tThis command shows a list of Science modules you can take\n"
+ + "\t\t\t\tto satisfy the Science component of your module requirements.\n"
+ + "\t\t\t\tOnce you have completed one of the modules specified in the\n"
+ + "\t\t\t\tlist, this command will be of zero significance to you.\n\n";
+ public static final String GEM_COMMAND = "To view all" + "\t\t\tType \"gem\".\n"
+ + "available GE\n"
+ + "modules:" + "\t\t\tNote:\n"
+ + "\t\t\t\tThis command shows a list of General Education (GE) modules you\n"
+ + "\t\t\t\tcan take to satisfy your University Level Requirements. Once you\n"
+ + "\t\t\t\thave completed one module for each of the five GE pillars, this\n"
+ + "\t\t\t\tcommand will be of zero significance to you.\n\n";
+ public static final String CHECKMC_COMMAND = "To check\t\t\tType \"checkmc\".\n"
+ + "your total MCs:\n\n";
+ public static final String TAG_COMMAND = "To view all" + "\t\t\tType \"tags\".\n"
+ + "your tags:\n\n";
+ public static final String LIST_COMMAND = "To list all" + "\t\t\tType \"list\".\n"
+ + "your completed\nmodules:\n\n";
+ public static final String CLEAR_COMMAND = "To clear GradPad:\tType \"clear\".\n\n"
+ + "\t\t\t\tNote:\n" + "\t\t\t\tThis command prompts for a confirmation before clearing.\n\n";
+ public static final String FORCE_CLEAR_COMMAND = "To force clear" + "\t\tType \"fclear\".\n"
+ + "GradPad:\n"
+ + "\t\t\t\tNote:\n" + "\t\t\t\tThis command does not prompt for a confirmation before\n"
+ + "\t\t\t\tclearing.\n\n";
+ public static final String EXIT_COMMAND = "To exit:\t\t\tType \"exit\".";
+
+ public static final String SHOWING_HELP_MESSAGE = ADD_COMMAND + LINE + DELETE_COMMAND + LINE
+ + FORCE_DELETE_COMMAND + LINE + EDIT_COMMAND + LINE + FIND_COMMAND + LINE + SEARCH_COMMAND + LINE
+ + REQUIRED_COMMAND + LINE + SCIENCE_COMMAND + LINE + GEM_COMMAND + LINE + CHECKMC_COMMAND + LINE
+ + TAG_COMMAND + LINE + LIST_COMMAND + LINE + CLEAR_COMMAND + LINE + FORCE_CLEAR_COMMAND + LINE
+ + EXIT_COMMAND;
+
+ // list command
+ public static final String LIST_COMMAND_WORD = "list";
+ public static final String MESSAGE_LIST_SUCCESS = "All your modules have been listed!";
+
+ // required command
+ public static final String REQUIRED_COMMAND_WORD = "required";
+
+ // gem command
+ public static final String GEM_COMMAND_WORD = "gem";
+ public static final String MESSAGE_GEM_SUCCESS = "--------------- Available GE Modules ---------------";
+ public static final String MESSAGE_GEM_FAILURE = "There was an error loading the required GE Modules.";
+
+ // science command
+ public static final String SCIENCE_COMMAND_WORD = "science";
+ public static final String MESSAGE_SCIENCE_SUCCESS = "--------------- Available Science Modules "
+ + "---------------";
+ public static final String MESSAGE_FAILURE_SCIENCE = "Oh no, there was an error loading the required "
+ + "Science Modules...";
+
+ // search command
+ public static final String SEARCH_COMMAND_WORD = "search";
+ public static final String MESSAGE_SEARCH_USAGE = SEARCH_COMMAND_WORD + "\n\n"
+ + "Format:\nsearch MODULE_CODE\n\n"
+ + MESSAGE_MORE_INFO;
+ public static final String MESSAGE_SEARCH_SUCCESS = "Module details for %1$s \n\n"
+ + "Module Title: %3$s \n"
+ + "Modular Credits: %2$s\n"
+ + "Semesters: %7$s \n\n"
+ + "Module Description: \n%4$s \n\n"
+ + "Preclusion(s): \n%5$s\n\n"
+ + "Prerequisite(s): \n%6$s\n";
+
+ // tags command
+ public static final String TAGS_COMMAND_WORD = "tags";
+ public static final String MESSAGE_TAGS_SUCCESS = "All tags:\n";
+ public static final String MESSAGE_NO_TAGS = "You have not included any tags.";
+
+ // yes command
+ public static final String YES_COMMAND_WORD = "yes";
+ public static final String YE_COMMAND_WORD = "ye";
+ public static final String Y_COMMAND_WORD = "y";
+ public static final String MESSAGE_NO_CONFIRMATION = "There is nothing to confirm!";
+
+ // logic manager messages
+ public static final String FILE_OPS_ERROR_MESSAGE = "Could not save data to file: ";
+ public static final String MESSAGE_CONFIRMATION_CANCEL = "Command aborted - ";
}
diff --git a/src/main/java/seedu/address/commons/core/index/Index.java b/src/main/java/seedu/address/commons/core/index/Index.java
deleted file mode 100644
index 19536439c09..00000000000
--- a/src/main/java/seedu/address/commons/core/index/Index.java
+++ /dev/null
@@ -1,54 +0,0 @@
-package seedu.address.commons.core.index;
-
-/**
- * Represents a zero-based or one-based index.
- *
- * {@code Index} should be used right from the start (when parsing in a new user input), so that if the current
- * component wants to communicate with another component, it can send an {@code Index} to avoid having to know what
- * base the other component is using for its index. However, after receiving the {@code Index}, that component can
- * convert it back to an int if the index will not be passed to a different component again.
- */
-public class Index {
- private int zeroBasedIndex;
-
- /**
- * Index can only be created by calling {@link Index#fromZeroBased(int)} or
- * {@link Index#fromOneBased(int)}.
- */
- private Index(int zeroBasedIndex) {
- if (zeroBasedIndex < 0) {
- throw new IndexOutOfBoundsException();
- }
-
- this.zeroBasedIndex = zeroBasedIndex;
- }
-
- public int getZeroBased() {
- return zeroBasedIndex;
- }
-
- public int getOneBased() {
- return zeroBasedIndex + 1;
- }
-
- /**
- * Creates a new {@code Index} using a zero-based index.
- */
- public static Index fromZeroBased(int zeroBasedIndex) {
- return new Index(zeroBasedIndex);
- }
-
- /**
- * Creates a new {@code Index} using a one-based index.
- */
- public static Index fromOneBased(int oneBasedIndex) {
- return new Index(oneBasedIndex - 1);
- }
-
- @Override
- public boolean equals(Object other) {
- return other == this // short circuit if same object
- || (other instanceof Index // instanceof handles nulls
- && zeroBasedIndex == ((Index) other).zeroBasedIndex); // state check
- }
-}
diff --git a/src/main/java/seedu/address/commons/exceptions/IllegalValueException.java b/src/main/java/seedu/address/commons/exceptions/IllegalValueException.java
index 19124db485c..a473b43bd86 100644
--- a/src/main/java/seedu/address/commons/exceptions/IllegalValueException.java
+++ b/src/main/java/seedu/address/commons/exceptions/IllegalValueException.java
@@ -10,12 +10,4 @@ public class IllegalValueException extends Exception {
public IllegalValueException(String message) {
super(message);
}
-
- /**
- * @param message should contain relevant information on the failed constraint(s)
- * @param cause of the main exception
- */
- public IllegalValueException(String message, Throwable cause) {
- super(message, cause);
- }
}
diff --git a/src/main/java/seedu/address/commons/util/HttpUtil.java b/src/main/java/seedu/address/commons/util/HttpUtil.java
new file mode 100644
index 00000000000..bebde4a7ea2
--- /dev/null
+++ b/src/main/java/seedu/address/commons/util/HttpUtil.java
@@ -0,0 +1,41 @@
+package seedu.address.commons.util;
+
+import java.io.IOException;
+import java.net.URI;
+import java.net.http.HttpClient;
+import java.net.http.HttpRequest;
+import java.net.http.HttpResponse;
+import java.time.Duration;
+
+import seedu.address.nusmods.exceptions.NusmodsException;
+
+/**
+ * Utilities for HTTP requests.
+ */
+public class HttpUtil {
+ public static final HttpUtil SINGLETON = new HttpUtil();
+ /**
+ * Makes a HTTP GET request to a URL and returns the response as a string.
+ *
+ * @param urlString The URL to send the GET request to.
+ * @return The HTTP response as a string.
+ * @throws NusmodsException an error occurs while making the request.
+ */
+ //CHECKSTYLE.OFF: AbbreviationAsWordInName
+ public String makeGETRequest(String urlString) throws NusmodsException {
+ //CHECKSTYLE.ON: AbbreviationAsWordInName
+ HttpClient client = HttpClient.newHttpClient();
+ HttpRequest request = HttpRequest.newBuilder()
+ .timeout(Duration.ofSeconds(3))
+ .uri(URI.create(urlString))
+ .GET()
+ .build();
+
+ try {
+ HttpResponse response = client.send(request, HttpResponse.BodyHandlers.ofString());
+ return response.body();
+ } catch (IOException | InterruptedException ex) {
+ throw new NusmodsException(ex);
+ }
+ }
+}
diff --git a/src/main/java/seedu/address/commons/util/JsonUtil.java b/src/main/java/seedu/address/commons/util/JsonUtil.java
index 8ef609f055d..a796f02653b 100644
--- a/src/main/java/seedu/address/commons/util/JsonUtil.java
+++ b/src/main/java/seedu/address/commons/util/JsonUtil.java
@@ -5,6 +5,7 @@
import java.io.IOException;
import java.nio.file.Files;
import java.nio.file.Path;
+import java.util.Map;
import java.util.Optional;
import java.util.logging.Level;
import java.util.logging.Logger;
@@ -12,6 +13,7 @@
import com.fasterxml.jackson.annotation.JsonAutoDetect;
import com.fasterxml.jackson.annotation.PropertyAccessor;
import com.fasterxml.jackson.core.JsonProcessingException;
+import com.fasterxml.jackson.core.type.TypeReference;
import com.fasterxml.jackson.databind.DeserializationContext;
import com.fasterxml.jackson.databind.DeserializationFeature;
import com.fasterxml.jackson.databind.ObjectMapper;
@@ -20,8 +22,12 @@
import com.fasterxml.jackson.databind.module.SimpleModule;
import com.fasterxml.jackson.databind.ser.std.ToStringSerializer;
+import javafx.collections.ObservableList;
import seedu.address.commons.core.LogsCenter;
import seedu.address.commons.exceptions.DataConversionException;
+import seedu.address.commons.exceptions.IllegalValueException;
+import seedu.address.model.module.Module;
+import seedu.address.storage.JsonSerializableGradPad;
/**
* Converts a Java object instance to JSON and vice versa
@@ -140,4 +146,21 @@ public Class handledType() {
}
}
+ /**
+ * Converts a given JSON file via its runtime path, into a list of Modules.
+ * @param file Converted file content of type String.
+ * @return List of modules taken from the JSON file via the runtime path.
+ * @throws IOException When the file is invalid.
+ * @throws IllegalValueException When the data from the JSON file does not match the
+ * specific field headers of the JsonAdaptedModule class (Eg.'moduleCode', 'modularCredits').
+ */
+ public static ObservableList getModulesFromJsonFile(String file) throws IOException, IllegalValueException {
+ JsonSerializableGradPad jsonGradPad = JsonUtil.fromJsonString(file, JsonSerializableGradPad.class);
+ return jsonGradPad.toModelType().getModuleList();
+ }
+
+ public static Map getPreclusionMapFromJsonFile(String file) throws IOException {
+ TypeReference