diff --git a/.github/workflows/gradle.yml b/.github/workflows/gradle.yml index ce1a0f882e0..59c6dcd203c 100644 --- a/.github/workflows/gradle.yml +++ b/.github/workflows/gradle.yml @@ -6,6 +6,32 @@ jobs: build: strategy: matrix: + include: + # Ubuntu Linux (trusty) / Oracle JDK 8 / Headed (AWT Robot) + - os: linux + dist: trusty + jdk: oraclejdk8 + env: + - _JAVA_OPTIONS="-Dtestfx.robot=awt" + # Ubuntu Linux (trusty) / Oracle JDK 8 / Headed (Glass Robot) / HiDPI + - os: linux + dist: trusty + jdk: oraclejdk8 + env: + - _JAVA_OPTIONS="-Dtestfx.robot=glass -Dglass.gtk.uiScale=2.0" + # Ubuntu Linux (trusty) / Oracle JDK 8 / Headless + - os: linux + dist: trusty + jdk: oraclejdk8 + env: + - _JAVA_OPTIONS="-Djava.awt.headless=true -Dtestfx.robot=glass -Dtestfx.headless=true -Dprism.order=sw" + # macOS / Oracle JDK 8 / Headless + - os: osx + osx_image: xcode9.4 + jdk: oraclejdk8 + env: + - _JAVA_OPTIONS="-Djava.awt.headless=true -Dtestfx.robot=glass -Dtestfx.headless=true -Dprism.order=sw -Dprism.verbose=true" + # Headed macOS is not currently possible on Travis. platform: [ubuntu-latest, macos-latest, windows-latest] runs-on: ${{ matrix.platform }} diff --git a/LICENSE b/LICENSE index 39b3478982c..f8de81232f3 100644 --- a/LICENSE +++ b/LICENSE @@ -2,11 +2,11 @@ MIT License Copyright (c) 2016 Software Engineering Education - FOSS Resources -Permission is hereby granted, free of charge, to any person obtaining a copy +Permission is hereby granted, free of charge, to any module obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell -copies of the Software, and to permit persons to whom the Software is +copies of the Software, and to permit modules to whom the Software is furnished to do so, subject to the following conditions: The above copyright notice and this permission notice shall be included in all diff --git a/README.md b/README.md index 13f5c77403f..cf9f077ec25 100644 --- a/README.md +++ b/README.md @@ -1,14 +1,17 @@ -[![CI Status](https://github.com/se-edu/addressbook-level3/workflows/Java%20CI/badge.svg)](https://github.com/se-edu/addressbook-level3/actions) +[![CI Status](https://github.com/se-edu/addressbook-level3/workflows/Java%20CI/badge.svg)](https://github.com/AY2021S1-CS2103T-T17-1/tp/actions) ![Ui](docs/images/Ui.png) -* This is **a sample project for Software Engineering (SE) students**.
+* This is **a 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. +* The project simulates an ongoing software project for a desktop application (called _MyMods_) used for managing module 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)**. +* It is named **MyMods**. +* For the detailed documentation of this project, see the **[MyMods Product Website](https://ay2021s1-cs2103t-t17-1.github.io/tp/)**. + * [User Guide](https://ay2021s1-cs2103t-t17-1.github.io/tp/UserGuide.html) + * [Developer Guide](https://ay2021s1-cs2103t-t17-1.github.io/tp/DeveloperGuide.html) + * [About Us](https://ay2021s1-cs2103t-t17-1.github.io/tp/AboutUs.html) * 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. + +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..7b78a568143 100644 --- a/build.gradle +++ b/build.gradle @@ -66,7 +66,15 @@ dependencies { } shadowJar { - archiveName = 'addressbook.jar' + archiveName = 'MyMods.jar' } defaultTasks 'clean', 'test' + +run { + enableAssertions = true +} + + + + diff --git a/docs/AboutUs.md b/docs/AboutUs.md index 1c9514e966a..d3e89f1c747 100644 --- a/docs/AboutUs.md +++ b/docs/AboutUs.md @@ -9,51 +9,51 @@ You can reach us at the email `seer[at]comp.nus.edu.sg` ## Project team -### John Doe +### Hong Kunnan - + -[[homepage](http://www.comp.nus.edu.sg/~damithch)] -[[github](https://github.com/johndoe)] -[[portfolio](team/johndoe.md)] +[[github](https://github.com/kunnan97)] +[[portfolio](team/kunnan97.md)] -* Role: Project Advisor +* Role: Team Lead -### Jane Doe +### Zhang Xin Yue - + -[[github](http://github.com/johndoe)] -[[portfolio](team/johndoe.md)] +[[github](http://github.com/xyzhangg)] +[[portfolio](team/xyzhangg.md)] -* Role: Team Lead -* Responsibilities: UI +* Role: Documentation +* Responsibilities: Data -### Johnny Doe +### Augustine Kau - + -[[github](http://github.com/johndoe)] [[portfolio](team/johndoe.md)] +[[github](http://github.com/augustinekau)] +[[portfolio](team/augustinekau.md)] -* Role: Developer -* Responsibilities: Data +* Role: Code Quality +* Responsibilities: UI -### Jean Doe +### Li Xupeng - + -[[github](http://github.com/johndoe)] -[[portfolio](team/johndoe.md)] +[[github](http://github.com/pongzers)] +[[portfolio](team/pongzers.md)] -* Role: Developer +* Role: Testing * Responsibilities: Dev Ops + Threading -### James Doe +### Zhao Lingshan - + -[[github](http://github.com/johndoe)] -[[portfolio](team/johndoe.md)] +[[github](http://github.com/zhaolingshan)] +[[portfolio](team/zhaolingshan.md)] -* Role: Developer +* Role: Integration * Responsibilities: UI diff --git a/docs/DevOps.md b/docs/DevOps.md index 4414eea3344..da5d09fe20b 100644 --- a/docs/DevOps.md +++ b/docs/DevOps.md @@ -73,7 +73,7 @@ Any warnings or errors will be printed out to the console. Here are the steps to create a new release. -1. Update the version number in [`MainApp.java`](https://github.com/se-edu/addressbook-level3/tree/master/src/main/java/seedu/address/MainApp.java). +1. Update the version number in [`MainApp.java`](https://github.com/se-edu/addressbook-level3/tree/master/src/main/java/seedu/grade/MainApp.java). 1. Generate a fat JAR file using Gradle (i.e., `gradlew shadow`). 1. Tag the repo with the version number. e.g. `v0.1` 1. [Create a new release using GitHub](https://help.github.com/articles/creating-releases/). Upload the JAR file you created. diff --git a/docs/DeveloperGuide.md b/docs/DeveloperGuide.md index 4829fe43011..bd7053be35a 100644 --- a/docs/DeveloperGuide.md +++ b/docs/DeveloperGuide.md @@ -2,355 +2,775 @@ layout: page title: Developer Guide --- -* Table of Contents -{:toc} +MyMods is an open source, brownfield project based on the existing [Address book Level-3](https://github.com/se-edu/addressbook-level3). +Contribute to this [project](https://github.com/AY2021S1-CS2103T-T17-1/tp) + if you wish to help us in improving every university student's life! + +### + +* **[Setting up, getting started](#Setting_up,_getting_started)** +* **[Design](#Design)** + * [Architecture](#Architecture) + * [UI component](#UI_component) + * [Logic component](#Logic_component) + * [Model component](#Model_component) + * [Storage component](#Storage_component) + * [Common classes](#Common_classes) +* **[Implementation](#Implementation)** + * [Obtaining module information automatically](#Obtaining_module_information_automatically) + * [Recommend S/U](#Recommend_S/U) + * [Dark/Light Mode](#Dark/Light_Mode) + * [Start Semester](#Start_Semester) + * [Show progress towards target CAP](#Show_progress_towards_target_CAP) +* **[Instructions for Manual Testing](#Instructions_for_Manual_Testing)** + * [Launch and shutdown](#Launch_and_shutdown) + * [Adding a module](#Adding_a_module) + * [Updating/SU-ing a module](#Updating/SU-ing_a_module) + * [Recommending modules to SU](#Recommending_modules_to_SU) +* **[Effort](#Effort)** + * [Difficulty level](#Difficulty_level) + * [Challenges faced](#Challenges_faced) + * [Effort required](#Effort_required) + * [Achievements of this projects](#Achievements_of_this_projects) +* **[Documentation, logging, testing, configuration, dev-ops](#Documentation,_logging,_testing,_configuration,_dev-ops)** +* **[Product scope](#Product_scope)** + * [Target user profile](#Target_user_profile) + * [User stories](#User_stories) + * [Use cases](#Use_cases) + * [Non-Functional Requirements](#Non-Functional_Requirements) + * [Glossary](#Glossary) + +
-------------------------------------------------------------------------------------------------------------------- -## **Setting up, getting started** +## **Setting up, getting started** Refer to the guide [_Setting up and getting started_](SettingUp.md). -------------------------------------------------------------------------------------------------------------------- -## **Design** +## **Design** -### Architecture +### Architecture -The ***Architecture Diagram*** given above explains the high-level design of the App. Given below is a quick overview of each component. +The ***Architecture Diagram*** given above explains the high-level design of the App. Given below is a quick overview +of each component. -
- -: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. - -
- -**`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-T17-1/tp/blob/master/src/main/java/seedu/address/Main.java) +and [`MainApp`](https://github.com/AY2021S1-CS2103T-T17-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. +[**`Commons`**](#Common_classes) represents a collection of classes used by multiple other components. The rest of the App consists of four components. -* [**`UI`**](#ui-component): The UI of the App. -* [**`Logic`**](#logic-component): The command executor. -* [**`Model`**](#model-component): Holds the data of the App in memory. -* [**`Storage`**](#storage-component): Reads data from, and writes data to, the hard disk. +* [**`UI`**](#UI_component): The UI of the App. +* [**`Logic`**](#Logic_component): The command executor. +* [**`Model`**](#Model_component): Holds the data of the App in memory. +* [**`Storage`**](#Storage_component): Reads data from, and writes data to, the hard disk. Each of the 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. +* exposes its functionality using a concrete `{Component Name}Manager` class +(which implements the corresponding API `interface` mentioned in the previous point. -For example, the `Logic` component (see the class diagram given below) defines its API in the `Logic.java` interface and exposes its functionality using the `LogicManager.java` class which implements the `Logic` interface. +For example, the `Logic` component (see the class diagram given below) defines its API in the `Logic.java` +interface and exposes its functionality using the `LogicManager.java` class which implements the `Logic` interface. ![Class Diagram of the Logic Component](images/LogicClassDiagram.png) **How the architecture components interact with each other** -The *Sequence Diagram* below shows how the components interact with each other for the scenario where the user issues the command `delete 1`. +The *Sequence Diagram* below shows how the components interact with each other for the scenario where the +user issues the command `delete CS1101S`. The sections below give more details of each component. -### UI component +
+ +### UI component ![Structure of the UI Component](images/UiClassDiagram.png) **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-T17-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-T17-1/tp/blob/master/src/main/java/seedu/address/ui/MainWindow.java) +is specified in [`MainWindow.fxml`](https://github.com/AY2021S1-CS2103T-T17-1/tp/blob/master/src/main/resources/view/MainWindow.fxml) The `UI` component, * Executes user commands using the `Logic` component. * Listens for changes to `Model` data so that the UI can be updated with the modified data. -### Logic component +
+ +### Logic component ![Structure of the Logic Component](images/LogicClassDiagram.png) **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-T17-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 `GradeBookParser` 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. -Given below is the Sequence Diagram for interactions within the `Logic` component for the `execute("delete 1")` API call. +Given below is the Sequence Diagram for interactions within the `Logic` component for the `execute("delete CS2103T")` API call. ![Interactions Inside the Logic Component for the `delete 1` Command](images/DeleteSequenceDiagram.png)
:information_source: **Note:** The lifeline for `DeleteCommandParser` should end at the destroy marker (X) but due to a limitation of PlantUML, the lifeline reaches the end of diagram.
-### Model component +
+ +### Model component ![Structure of the Model Component](images/ModelClassDiagram.png) -**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-T17-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 grade book data, semester data, and goal target 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.
-![BetterModelClassDiagram](images/BetterModelClassDiagram.png) - -
- +### Storage component -### Storage component +
![Structure of the Storage Component](images/StorageClassDiagram.png) -**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-T17-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 grade book data in json format and read it back. -### Common classes +### Common classes -Classes used by multiple components are in the `seedu.addressbook.commons` package. +Classes used by multiple components are in the `seedu.address.commons` package. --------------------------------------------------------------------------------------------------------------------- - -## **Implementation** - -This section describes some noteworthy details on how certain features are implemented. - -### \[Proposed\] Undo/redo feature +
-#### Proposed Implementation +[Back to top](#top) +
-The proposed undo/redo mechanism is facilitated by `VersionedAddressBook`. It extends `AddressBook` with an undo/redo history, stored internally as an `addressBookStateList` and `currentStatePointer`. Additionally, it implements the following operations: +-------------------------------------------------------------------------------------------------------------------- -* `VersionedAddressBook#commit()` — Saves the current address book state in its history. -* `VersionedAddressBook#undo()` — Restores the previous address book state from its history. -* `VersionedAddressBook#redo()` — Restores a previously undone address book state from its history. +## **Implementation** -These operations are exposed in the `Model` interface as `Model#commitAddressBook()`, `Model#undoAddressBook()` and `Model#redoAddressBook()` respectively. +This section describes some noteworthy details on how certain features are implemented. -Given below is an example usage scenario and how the undo/redo mechanism behaves at each step. +### Obtaining module information automatically: +![Structure of the Storage Component](images/ObtainModuleInformation.png) + +This feature is facilitated by ```ModuleInfoRetriever```, and is used to obtain the number of modular credits +when you are adding a module, or the “su” status of the module when you are recommending S/U options. + +It implements the following operation: +```ModuleInfoRetriever#retrieve(String moduleName)``` - Returns a HashMap containing module-related information. + +Given below is an example usage scenario and how obtaining module information is used and integrated into +the ```add``` command. + +Step 1: The user executes ```add m/CS1101S g/A+```. + +Step 2: Logic uses the ```AddCommandParser``` class to parse the command. +```AddCommandParser#parse(“add m/CS1101S g/A+”)``` is executed, which then executes +```(ModuleInfoRetriever#retrieve(“CS1101S”)``` to retrieve the number of modular credits CS1101S has. + +Step 3: During the call of ```ModuleInfoRetriever#retrieve(“CS1101S”)``` , it parses the JSON file +```moduleInfo.json```, and searches the file for “moduleCode” : “CS1101S”, retrieving the following information, +returning it as a HashMap. +\ +\ +Title: “Programming Methodology” +\ +moduleCredit: 4 +\ +SU: True +An exception is thrown if the module is not found. + +Step 4: The new module constructor is executed with the following arguments, +```new Module(“CS1101S”, “A+”, 4, "Y2S1")```. An ```AddCommand``` object is then returned with the module, +and the new module with modular credit information is saved to storage. + +#### Design Considerations: +Aspect: Whether to allow users to manually overwrite the number of modular credits attached to each module. +* Alternative 1 (current choice): Allow users the choice to manually key in how many modular credits a module has. + * Pros: + 1. Allows users more flexibility, and enables them to dictate how many modular credits each module has. + 2. In the event that a module in our database is outdated, users are able to overwrite the outdated + modular credits. + * Cons: + 1. Users may not be fully aware of module details, and may key in incorrect modular credits. +* Alternative 2: Disallowing users to manually key in how many modular credits a module has. + * Pros: + 1. Users will not be able to input wrong modular credits. + 2. Modules will always have accurate modular credits, given that our database is accurate. + * Cons: + 1. In the event that our database is outdated, users have no way of overwriting the modular credits. + This renders many functionalities of our application to be hindered, such as the calculation of CAP, + which requires accurate modular credits. + +[Back to top](#top) + +
+ +### Recommend S/U: +#### Implementation +The Recommend S/U feature works in conjunction with the goal-setting feature. +MyMods will recommend modules to S/U based on the goal that the user has set and the user’s grade. \ +\ +The implementation of goal-setting is first done by introducing a new model class - ```GoalTarget```. +The ```GoalTarget``` class models the 6 different levels following the Honours Classification in NUS. +For the user to set their goal, there is a ```SetCommand``` class under the logic commands. +There will be two different variants of the goal command, there is a ```SetCommandParser``` class under parser to +handle the different user’s input: ```goal set``` and ```goal list```. +The goal of the user will update a field under ```ModelManager```. \ +\ +User’s goal will be written to and can be read from the ```gradebook.json``` file under the attribute +“```goalTarget```” which will store a default value of ```0```. \ +\ +To implement the command ```RecommendSU```, a class ```RecommendSuCommand``` is introduced in logic commands. +To determine which module to recommend the user to S/U the method ```RecommendSuCommand#filterModule()``` will +retrieve the user’s goal and modules and filter using the following conditions: +1. ```RecommendSuCommand#isModSuAble(Module mod)``` -- Checks if module can be S/U by NUS based on data +file ```moduleInfo.json```. +2. ```RecommendSuCommand#isGradeBelowGoal(Module mod, GoalTarget goal)``` -- Checks if the grade of the module is +below the lower bound of the goal. +3. ```RecommendSuCommand#isGraded(Module mod)``` -- Checks if the grade of the module is valid. + +The following activity diagram summarizes what happens when a user executes a new command: \ + + +[Back to top](#top) + +#### Design Considerations: +Aspect: How to represent the different levels of goals (Highest Distinction, Distinction, Merit, Honours, Pass, Fail) +* Alternative 1 (current choice): Labels each level with a number 1 to 6 and the user inputs the level number to +set the goal. + * Pros: + 1. Using number to label the goals is easier for the user to type + (eg: ```goal set 2``` instead of ```goal set distinction```) + 2. Using an integer value is more efficient for comparison as compared to a String. + * Cons: + 1. Difficult for the user to know which level represents which goal. +* Alternative 2: User key in the full name of the goal level. + * Pros: + 1. User knows what to key in without referring. + * Cons: + 1. It is longer for the user to type. +* Justification for choosing Alternative 1: Having a shorter command will be easier for the user. +To solve the con of the user not sure on which level represents which goal, the command “```goal list```” is +provided. + +[Back to top](#top) +
+ +### Dark/Light Mode: + +#### Implementation + +The dark and light mode switch is part of the UI implementation that allows the user to instantly switch between two +different styles of the application. It is facilitated by the ```MainWindow``` component in the +```UI``` component and the ```Scene``` object from the ```Stage``` object(private property in ```MainWindow```). +**The stylesheet property in the ```Scene``` object is manipulated**. The two different stylings are supplied by +two CSS files that contain CSS styling for both dark and light mode separately. + +The following method in ```MainWindow``` facilitates the switching process: +- ```MainWindow#setStyleSheet(String cssFileName)``` - sets a specific CSS file to be the current stylesheet for UI. + +Below is the flow of the mechanism behind switching of themes. +1. User selects "Light" under "Theme" menu bar. +2. The action calls ```handleLightThemeSelection()``` from ```MainWindow```. +3. ```MainWindow``` then call a function ```setStyleSheet("LightTheme)```of itself. +4. ```Scene``` object is obtain from ```Stage``` object +5. An ```ObservableList``` of stylesheets is obtained from ```Scene``` object +6. File path to the “Light” CSS file is added as a string that overrides the current ```ObservableList``` +of stylesheets + +The following sequence diagram illustrates how the program changes the theme of the desktop application. + +![Sequence of Dark/Light Mode Switch](images/ModeSequenceDiagram.png) + +
+:information_source: **Note:** The lifeline for `scene` and `listOfStylesheet` should end at the destroy marker (X) +but due to a limitation of PlantUML, the lifeline reaches the end of diagram. +
-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. +The following activity diagram summarises what happens when a user chooses "Light" under the Theme menu bar. -![UndoRedoState0](images/UndoRedoState0.png) +![Activity Diagram for Dark/Light Mode Switch](images/ModeActivityDiagram.png) -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. +**Default theme** is decided by the time of the day. -![UndoRedoState1](images/UndoRedoState1.png) +* 7am - 7pm: Light Mode +* 7pm - 7am: Dark Mode -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`. +[Back to top](#top) +
-![UndoRedoState2](images/UndoRedoState2.png) +### Start Semester: -
:information_source: **Note:** If a command fails its execution, it will not call `Model#commitAddressBook()`, so the address book state will not be saved into the `addressBookStateList`. +#### Implementation -
+`start` is a command which allows the user to start modifying the list of modules in the semester which +the user specifies by adding, updating, deleting or S/U-ing the modules in the specified semester. +Modifying the list of modules is only allowed after the user types in `start` followed by the semester +which the user wishes to edit the module list of. -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. +A class `StartCommand` is added in the commands folder under logic to execute the command `start`. +A singleton class `SemesterManager` to control the semester is added in the semester folder under model +to retrieve the current semester the user is in and set the current semester to a specified semester. +The `SemesterManager` class is created as a singleton class as there should only be one instance of a controller class. -![UndoRedoState3](images/UndoRedoState3.png) +`StartCommand#execute()` gets an instance of the `SemesterManager` class via the static `SemesterManager#getInstance()` +method to set the current semester to the semester input by the user via `SemesterManager#setCurrentSemester()`. -
:information_source: **Note:** If the `currentStatePointer` is at index 0, pointing to the initial AddressBook state, then there are no previous AddressBook states to restore. The `undo` command uses `Model#canUndoAddressBook()` to check if this is the case. If so, it will return an error to the user rather -than attempting to perform the undo. +`SemesterManager#isValidSemester()` ensures that the user keys in a valid semester from Y1S1 to Y5S2 +(Y5S1 and Y5S2 in the case of ddp students) and prevents starting an invalid semester. -
+The following sequence diagram shows how the `start` command works: -The following sequence diagram shows how the undo operation works: +![Sequence diagram for start command](images/StartSemesterSequenceDiagram.png) -![UndoSequenceDiagram](images/UndoSequenceDiagram.png) +The following activity diagram summaries what happens when a user executes the `start` command: -
: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. +![Activity diagram for start command](images/StartSemesterActivityDiagram.png) -
-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. +#### Design Considerations -
: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. +Aspect: How does the user edit the list of modules in a specified semester -
+* Alternative 1 (current choice): the user can input the `start` keyword followed by the specific semester +which the user wishes to add, update, delete or S/U modules in (eg. `start Y1S1`). + * Pros: + 1. Users can key in fewer words which is more convenient, fuss-free and time-efficient and prioritises fast-typists. + 2. It is a more intuitive approach. + * Cons: + 1. The format is different from the other commands (eg. `add`, `update`) + and thus the user has to familiarise himself or herself with a more foreign command. +* Alternative 2: the user can add, update, delete or S/U modules in a specific semester +by stating the following input (eg. `add m/CS1101S g/A s/Y1S1`). + * Pros: + 1. The format is more similar to the other commands and thus the user will be more familiar with it. + * Cons: + 1. The user has to type in a much longer command which can be quite a hassle and inconvenient, + and it takes up more time which does not prioritise fast-typists. +* Justification for choosing alternative 1: + 1. It is more convenient, fuss-free and time-efficient for the user to key in a much shorter command and hence prioritises fast-typists. + It enables users to switch from one semester to another semester very quickly to edit the list of modules in + different semesters, as compared to having to key in a long command just to modify one module in a semester. + 2. Since the command is pretty intuitive, the fact that the format of the command is rather different from + the other commands is not a major problem and users will be able to pick it up quickly. -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. +[Back to top](#top) +
-![UndoRedoState4](images/UndoRedoState4.png) +### Show progress towards target CAP: -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. +#### Implementation -![UndoRedoState5](images/UndoRedoState5.png) +The progress feature works in conjunction with the goal-setting feature. +The user will first need to indicate their desired CAP using the `goal` command. +\ +\ +Users can then use the command `progress` to calculate the required average CAP +they have to obtain in their remaining modules in order to achieve their +target CAP. The user can include the string `ddp` to indicate if they are taking +a double degree programme (e.g. `progress ddp`). +\ +\ +A `ProgressCommand` class is added to commands under logic to execute the required +CAP calculation. The calculation process is done as shown below: -The following activity diagram summarizes what happens when a user executes a new command: + 1. User enters their target CAP using `goal` command + 2. Info about current CAP and MCs taken are retrieved from the `ModelManager` class + 3. Total MCs required is determined by whether user is in double degree programme + or not (e.g. user input is `progress ddp` or just `progress`) + 4. Target CAP is retrieved from the `ModelManager` class + 5. Required CAP from remaining modules is calculated. -![CommitActivityDiagram](images/CommitActivityDiagram.png) +The following activity diagram shows what happens when a user calls the `progress` command: -#### Design consideration: +![Activity diagram for progress command](images/ProgressActivityDiagram.png) -##### Aspect: How undo & redo executes +#### Design Considerations -* **Alternative 1 (current choice):** Saves the entire address book. - * Pros: Easy to implement. - * Cons: May have performance issues in terms of memory usage. +Aspect: how does the user input their desired CAP. -* **Alternative 2:** Individual command knows how to undo/redo by - itself. - * Pros: Will use less memory (e.g. for `delete`, just save the person being deleted). - * Cons: We must ensure that the implementation of each individual command are correct. +* Alternative 1: using a prefix such as `c/` followed by their desired CAP (e.g. `progress c/ 4.32`). + * Pros: + 1. Users can input the exact CAP number they want to achieve to get a more specific CAP requirement for their remaining modules. + * Cons: + 1. Users have to input their desired CAP everytime they use the `progress` command. + 2. User does repeated work, since they need to set their CAP target again to use other commands like `RecommendSU`. +* Alternative 2 (current choice): using the `goal` command (e.g. `goal set 2`). + * Pros: + 1. Length of progress command is reduced, users type lesser words. + 2. Users only need to input their target CAP once, unless they want to change it. + * Cons: + 1. CAP target is not as flexible as it is limited to the levels of goals (Highest Distinction, Distinction, Merit, Honours, Pass, Fail). +* Justification for choosing alternative 2: + 1. Firstly, a shorter command is more convenient for the user to quickly find out the required CAP for their remaining modules. + 2. Secondly, most users do not have an extremely specific CAP target they want to achieve (e.g. 4.32) but rather one of the goal levels (e.g. Distinction), hence using the `goal` command to set their target CAP is sufficient. + +
+ +[Back to top](#top) +
-_{more aspects and alternatives to be added}_ +-------------------------------------------------------------------------------------------------------------------- -### \[Proposed\] Data archiving +## Instructions for Manual Testing + +### Launch and shutdown + +1. Initial launch
+ a. Download the jar file and copy into an empty folder.

+ b. Double-click the jar file Expected: Shows the GUI. The window size may not be optimum.

+2. Saving window preferences
+ a. Resize the window to an optimum size. Move the window to a different location. Close the window.

+ b. Re-launch the app by double-clicking the jar file.
+ Expected: The most recent window size and location is retained.

+ +[Back to top](#top) + + +### Adding a module + +1. Adding a module while editing a semester
+ a. Prerequisites: Start editing a semester using the `start` command.
+ Currently editing a valid semester with no modules in the entire app added yet.

+ b. Test case: `add m/CS1231S g/A`
+ Expected: Module “CS1231S (4MCs)” is added to the current semester, with “Grade: A”. CAP in the status bar is updated.

+ c. Test case: `add m/CS1101S`
+ Expected: Module “CS1101S (4MCs)” is added to the current semester, with “Grade: NA”. CAP in the status bar is not updated.

+ d. Test case: `add m/GER1000 mc/8`
+ Expected : Module “GER1000 (8MCs)” is added to the current semester, with “Grade: NA”. CAP in the status bar is not updated.

+ e. Test case: `add m/GER1000 g/A`
+ Expected: Unable to add the module as it already exists in your module list.

+ f. Test case: `add GEQ1000 A+`
+ Expected: Invalid command format.

+ g. Other incorrect add commands to try: `add`, `add mod/GEQ1000`, `…`
+ Expected: Similar to previous.

+2. Adding a module while not editing any semesters
+ a. Prerequisites: Not editing any semesters. (The status bar shows “Currently editing: NA”)

+ b. Test case: `add m/GEQ1000`
+ Expected: Unable to add module as no semester is being edited, + command result prompts to start a semester before modifying the module list.

+ +[Back to top](#top) + +### Updating/SU-ing a module + +1. Updating a module while editing a semester
+ a. Prerequisites: Start editing a semester using the `start` command, and add the module “CS1101S”, with Grade “A”. + Currently editing a valid semester with the module “CS1101S (4MCs) Grade: A” added inside.

+ b. Test case: `update m/CS1101S g/B+`
+ Expected: Updates the module “CS1101S”, replacing the grade from “A” to “B+”.

+ c. Test case: `su CS1101S`
+ Expected: Successfully updates the grade of “CS1101S” to “SU”.

+ d. Test case: `update m/ST2334 g/B+`
+ Expected: Unable to update any module as the module name provided is invalid.

+ e. Other incorrect update commands to try: `update`, `update ST2334`, `...`
+ Expected: Invalid command format.

+2. Updating a module from another semester
+ a. Prerequisites: Currently editing the semester “Y2S1”. A module was previously added in another semester. + e.g. the module “CS1101S” was previously added in semester “Y1S1”.

+ b. Test case: `update m/CS1101S g/B+`
+ Expected: Unable to update module as the module you are trying to update is in another semester.

+3. Updating a module while not editing any semesters
+ a. Prerequisites: Not editing any semesters. (The status bar shows “Currently editing: NA”)

+ b. Test case: `update m/CS1101S g/B+`
+ Expected: Unable to update any module as no semester is being edited, + command result prompts to start a semester before modifying the module list.

+ c. Test case: `su CS1101S`
+ Expected: Similar to above.

+ +[Back to top](#top) + +### Recommending modules to SU + +1. Recommending modules to SU with valid modules to SU
+ a. Prerequisites: A goal has been previously set using `goal set`. For the purpose of the test cases below, + we would be assuming the current goal set is 1. (i.e. the command `goal set 1` was entered). + There are currently 2 modules added and listed, “CS1101S (4MCs), Grade: C+”, and “CS1231S (4MCs), Grade: A”.

+ b. Test case: `recommendSU`
+ Expected: The module CS1231S is recommended.

+ c. Test case: `recommendSU y2s1`
+ Expected: Invalid command format, as there should be no input after recommendSU.

+ d. Other incorrect recommendSU commands to try: `recommendSU all`, `recommendSU CAP5`, `…`
+ Expected: Similar to previous.

+2. Recommending modules to SU with no valid modules to SU
+ a. Prerequisites: A goal has been previously set using `goal set`. For the purpose of the test cases below, we would + be assuming the current goal set is 1. (i.e. the command `goal set 1` was entered). There are currently no modules added.

+ b. Test case: `recommendSU`
+ Expected: No modules would be recommended to S/U based on your goal.

+ +[Back to top](#top) +
-_{Explain here how the data archiving feature will be implemented}_ +-------------------------------------------------------------------------------------------------------------------- +## Effort + +### Difficulty level + +The overall difficulty level of our project is high as we were met with numerous challenges which required substantial effort to overcome. +Even though the features to be implemented are divided among our team, the features are often intertwined with each other +and we have to work closely with one another and make edits after implementing and testing. We have to continuously +update and improve on the features we have implemented even after we have successfully implemented the entire feature +and integrated it into the rest of the code base. Debugging is another area which introduced significantly challenging +obstacles - both locating bugs and solving them completely. + +### Challenges faced +As our project has a specific target audience, i.e. NUS students, we have to consider specific scenarios that will cater +to the various types of students and modules. For example, special terms semesters, double degree programme students, +modules that do not exist in our database are considerations that we will have to factor in despite the majority of NUS +students not needing to use it. There is a lot of research to be conducted to ensure that our project is up to date and +accurate. This includes calculation of CAP, rules and criteria that NUS allows a module to be S/U, maximum and minimum +modular credits (MCs) of a module in NUS. +
+
+Technical challenges aside, another challenge that we faced is inability to meet up physically due to the COVID-19 pandemic. +The process of all of our project development is discussed and implemented online. To overcome this challenge, our team +sets up weekly online meetings and we ensure that the tasks allocated to each individual are distributed evenly and are +done before the appointed deadline. Communications are made clear and transparent to avoid miscommunication. + +### Effort required +From conceptualizing our project to implementing and testing our product, there are a lot of considerations and work to +be done by each member of our team. We set our weekly online meeting every Sunday to discuss what needs to be done by +the end of the week and also on issues to set the direction of our project. Work is then divided into equal proportions +and allocated randomly. We then spend the next few days to complete our tasks and we will meet again before the deadline +for that week to consolidate everything. + +### Achievements of the project + +Our project is an innovative solution to the problem which many NUS students face: spending large pockets of time at the +start of every semester to do module planning and goal setting, and at the end of every semester to calculate their CAP +and decide on which modules to S/U so as to achieve their goal and track their progress towards it. With MyMods, NUS +students will spend significantly less time on such manual, mundane and repetitive tasks and can channel their precious +time and energy on more important tasks. Together with the aesthetically-pleasing and intuitive user interface of MyMods +ensures a fuss-free, seamless and enjoyable user experience. +
+Our application is capable of the following features: +1. Allows users to set a goal out of the 6 different goals MyMods offer with each covering a specific cap range. +2. Allows users to track their progress towards their goal as they will be informed with the average CAP needed for their remaining modules to achieve the goal they have set. +3. Provides users with personalised and accurate recommendations on which modules to S/U based on the individual’s specific goal, current grades and CAP. +4. Automatically and instantly calculates and updates the CAP after every modification the user makes - including adding, deleting, updating, and S/U-ing modules. +5. Allows users to start modifying the list of modules in a specific semester by adding, deleting, updating or S/U-ing module(s) and also stop making modifications. +6. Provides users with two different themes - light and dark mode which will be set automatically according to the time of the day. Light mode will be automatically set as default from 7am to 7pm, and it will be switched to dark mode automatically from 7pm to 7am. Users can manually select either light or dark mode at any particular time. +7. Allows users to find specific modules by their module codes. +8. Allows users to view the entire list of modules in all semesters at any point in time. +9. Allows users to navigate into a specific semester and view the list of modules in that particular semester. +10. Provide assistance to users who are lost amidst navigating MyMods with a summary of the commands available. + +[Back to top](#top) +
-------------------------------------------------------------------------------------------------------------------- -## **Documentation, logging, testing, configuration, dev-ops** +## **Documentation, logging, testing, configuration, dev-ops** * [Documentation guide](Documentation.md) -* [Testing guide](Testing.md) * [Logging guide](Logging.md) +* [Testing guide](Testing.md) * [Configuration guide](Configuration.md) * [DevOps guide](DevOps.md) --------------------------------------------------------------------------------------------------------------------- +[Back to top](#top) -## **Appendix: Requirements** +-------------------------------------------------------------------------------------------------------------------- +## **Product scope** -### Product scope +### Target user profile: -**Target user profile**: +* NUS students -* 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 +**Value proposition**: You type, We track. -**Value proposition**: manage contacts faster than a typical mouse/GUI driven app +Track and view your modules and grades efficiently, anytime anywhere. -### User stories +### User stories Priorities: High (must have) - `* * *`, Medium (nice to have) - `* *`, Low (unlikely to have) - `*` -| Priority | As a …​ | I want to …​ | So that I can…​ | -| -------- | ------------------------------------------ | ------------------------------ | ---------------------------------------------------------------------- | -| `* * *` | new user | see usage instructions | refer to instructions when I forget how to use the App | -| `* * *` | user | add a new person | | -| `* * *` | user | delete a person | remove entries that I no longer need | -| `* * *` | user | find a person by name | locate details of persons without having to go through the entire list | -| `* *` | user | hide private contact details | minimize chance of someone else seeing them by accident | -| `*` | user with many persons in the address book | sort persons by name | locate a person easily | - -*{More to be added}* -### Use cases + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Priority + As a …​ + I want to …​ + So that I can…​ +
* * * + NUS student + add the modules taken and grades attained + view them anytime anywhere. +
* * * + NUS student + add my modules taken to reflect my CAP, and be able to update those modules when I S/U it to reflect my updated CAP + I can view my new CAP. +
* * * + NUS student + view my current progress of my modules taken and my CAP + have a gauge of how I am doing in school. +
* * * + impatient NUS student + calculate my CAP as fast as possible without doing any calculations myself + use the time that will be spent on doing manual calculations more productively. +
* * + NUS student + delete a module taken or the grade attained in the event that I decide to drop the module + I am able to view an updated list of the modules I am currently taking and view my CAP without the grade from the dropped module. +
+ + +_{More to be added}_ + +### Use cases + +(For all use cases below, the **System** is the `MyMods` and the **Actor** is the `user`, unless specified otherwise) + +#### **Use case: Delete a module** -(For all use cases below, the **System** is the `AddressBook` and the **Actor** is the `user`, unless specified otherwise) +**MSS** -**Use case: Delete a person** -**MSS** -1. User requests to list persons -2. AddressBook shows a list of persons -3. User requests to delete a specific person in the list -4. AddressBook deletes the person +1. User requests to list modules +2. MyMods shows a list of modules he/she has taken +3. User requests to delete a specific module in the list +4. MyMods deletes the module \ +Use case ends. - Use case ends. **Extensions** -* 2a. The list is empty. - Use case ends. -* 3a. The given index is invalid. +* 2a. The list is empty. \ +Use case ends. +* 3a. The given index is invalid. + * 3a1. MyMods shows an error message. + * Use case resumes at step 3. - * 3a1. AddressBook shows an error message. +#### **Use case: Add a module** - Use case resumes at step 2. +**MSS** -*{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. +1. User enters academic semester to edit +2. MyMods shows the academic semester and a list of modules he/she has taken +3. User requests to add a specific module into the list +4. MyMods adds the module \ +Use case ends. -*{More to be added}* -### Glossary +**Extensions** -* **Mainstream OS**: Windows, Linux, Unix, OS-X -* **Private contact detail**: A contact detail that is not meant to be shared with others --------------------------------------------------------------------------------------------------------------------- -## **Appendix: Instructions for manual testing** +* 1a. Academic semester not found \ +Use case ends. +* 3a. Module moduleName already exists. + * 3a1. MyMods shows an error message. + * Use case resumes at step 3. -Given below are instructions to test the app manually. +#### **Use case: View CAP** -
:information_source: **Note:** These instructions only provide a starting point for testers to work on; -testers are expected to do more *exploratory* testing. - -
+**MSS** -### Launch and shutdown -1. Initial launch - 1. Download the jar file and copy into an empty folder +1. User requests to show CAP +2. MyMods shows CAP for the latest completed semester - 1. Double-click the jar file Expected: Shows the GUI with a set of sample contacts. The window size may not be optimum. +**Extensions** -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. +* 1a. No modules has been added, CAP is undefined + * 1a1. MyMods shows an error message suggesting user to add modules \ +Use case ends. -1. _{ more test cases …​ }_ +### Non-Functional Requirements -### 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. Should work on any _mainstream OS_ as long as it has Java `11` installed. +2. Should be able to hold up to 1000 modules 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. - 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. +_{More to be added}_ - 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. +### Glossary -1. _{ more test cases …​ }_ -### Saving data -1. Dealing with missing/corrupted data files +* **Mainstream OS**: Windows, Linux, Unix, OS-X - 1. _{explain how to simulate a missing/corrupted file, and the expected behavior}_ +
-1. _{ more test cases …​ }_ +[Back to top](#top) diff --git a/docs/SettingUp.md b/docs/SettingUp.md index b89b691fed9..2cabf7c7fea 100644 --- a/docs/SettingUp.md +++ b/docs/SettingUp.md @@ -23,7 +23,7 @@ If you plan to use Intellij IDEA (highly recommended): 1. **Import the project as a Gradle project**: Follow the guide [_[se-edu/guides] IDEA: Importing a Gradle project_](https://se-education.org/guides/tutorials/intellijImportGradleProject.html) to import the project into IDEA.
:exclamation: Note: Importing a Gradle project is slightly different from importing a normal Java project. 1. **Verify the setup**: - 1. Run the `seedu.address.Main` and try a few commands. + 1. Run the `seedu.grade.Main` and try a few commands. 1. [Run the tests](Testing.md) to ensure they all pass. -------------------------------------------------------------------------------------------------------------------- diff --git a/docs/Testing.md b/docs/Testing.md index 8a99e82438a..0814e1ae262 100644 --- a/docs/Testing.md +++ b/docs/Testing.md @@ -29,8 +29,8 @@ There are two ways to run tests. This project has three types of tests: 1. *Unit tests* targeting the lowest level methods/classes.
- e.g. `seedu.address.commons.StringUtilTest` + e.g. `seedu.grade.commons.StringUtilTest` 1. *Integration tests* that are checking the integration of multiple code units (those code units are assumed to be working).
- e.g. `seedu.address.storage.StorageManagerTest` + e.g. `seedu.grade.storage.StorageManagerTest` 1. Hybrids of unit and integration tests. These test are checking multiple code units as well as how the are connected together.
- e.g. `seedu.address.logic.LogicManagerTest` + e.g. `seedu.grade.logic.LogicManagerTest` diff --git a/docs/UserGuide.md b/docs/UserGuide.md index b91c3bab04d..239048a8621 100644 --- a/docs/UserGuide.md +++ b/docs/UserGuide.md @@ -2,177 +2,667 @@ layout: page title: User Guide --- + + +# 1. Product Overview +Welcome to **MyMods**:100:! Let us guide you through the overview of **MyMods**:100: in this section. + +### 1.1 Table of Contents + +* [1. Product Overview](#Product_Overview) + * [1.1 Table of Contents](#Table_of_Contents) + * [1.2 About](#About) + * [1.3 Introduction](#Introduction) + * [1.4 Glossaries](#Glossaries) + * [1.5 Getting Started](#Getting_Started) + +* [2. Key Features](#Key_Features) + * [2.1 Summary of Key Features](#Summary_of_Key_Features) + * [2.2 Edit Semester](#Edit_Semester) + * [2.3 Add Module](#Add_Module) + * [2.4 Update Module](#Update_Module) + * [2.5 List all Modules](#List_all_Modules) + * [2.6 Set Goals](#Set_Goals) + * [2.7 Recommend S/U](#Recommend_S/U) + * [2.8 S/U Module](#S/U_Module) + * [2.9 Delete Module](#Delete_Module) + * [2.10 Exit Semester](#Exit_Semester) + * [2.11 Find Module](#Find_Module) + * [2.12 Progress Report](#Progress_Report) + * [2.13 Clear All](#Clear_All) + * [2.14 Get Help](#Get_Help) + * [2.15 Exit Application](#Exit_Application) + +### 1.2 About + +Are you a NUS student who wants a clean Command Line Interface (CLI) to keep track of your modules and grades? +If yes, then this user guide is for you! + +Want to know the common use cases, how to get started or in-depth documentation of all of our 13 key features in **MyMods**:100:? +We got that all covered for you in this user guide. + +And yes, that is right! We have 14 key features in **MyMods**:100:: `start`, `add`, `update`, `list`, `goal`, `recommendSU`, +`su`, `delete`, `done`, `find`, `progress`, `clear`, `help` and `exit` commands. + +You do not need any prior technical knowledge to understand this document, however, you will need to know how to read +English though! + +**Navigating this user guide:** +* Tips will be shown in this box: +
+:bulb: This symbol indicates good-to-know tips. +
+ +* Important information will be shown in this box: +
+:warning: This symbol indicates important information. +
-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. +* `start`: A grey highlight (called a mark-up) indicates that this is a command that can be typed into the command line +and executed by the application. -* Table of Contents -{:toc} --------------------------------------------------------------------------------------------------------------------- +### 1.3 Introduction -## Quick start +So what exactly is **MyMods**:100:? It is a desktop app for tracking modules and grades, optimized for use for students who +prefer typing via a Command Line Interface (CLI) while still having the benefits of a Graphical User Interface (GUI). +With **MyMods**:100:, you are able to keep track of your module results efficiently, easily make S/U decisions, and view your +academic progress. **MyMods**:100: is available for the Linux, Unix, Windows XP and Mac OS X operating systems. -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.4 Glossaries -1. Copy the file to the folder you want to use as the _home folder_ for your AddressBook. +If you do not understand any of the terms or short forms that we used, you can refer to this table: -1. Double-click the file to start the app. The GUI similar to the below should appear in a few seconds. Note how the app contains some sample data.
- ![Ui](images/Ui.png) +Term | Description +-----|------------ +CAP | Cumulative Average Point +ddp | Double Degree Programme +mod | Module +S/U | Satisfactory / Unsatisfactory option in NUS -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.5 Getting Started - * **`list`** : Lists all contacts. +#### Installation - * **`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. Grab a cup of coffee :coffee:. +2. Ensure you have Java 11 or above installed in your computer :computer:. +3. Download the last MyMods.jar file from [here](https://github.com/AY2021S1-CS2103T-T17-1/tp/releases/tag/v1.3.1). +4. Place the file in any folder that you want to be the home folder for **MyMods**:100:. +5. Start the web application by double-clicking the file or run it with `java -jar +MyMods.jar`. The window (without any modules) similar to the interface shown below will appear. - * **`delete`**`3` : Deletes the 3rd contact shown in the current list. +
+:bulb: Check your Java version by typing java -version in the Command Prompt
- * **`clear`** : Deletes all contacts. + +
- * **`exit`** : Exits the app. +The data of all of your modules can be found on your local disk. It is located in the “data” folder found at the +home folder. -1. Refer to the [Features](#features) below for details of each command. +
--------------------------------------------------------------------------------------------------------------------- +#### The Interface + +This is what **MyMods**:100: looks like: \ + + +
+:bulb: Default colours looking different? Fret not! The theme of **MyMods**:100: is determined by the time of the day. +You can change the colours using the tab “Theme”. +
-## Features +
+ +[Back to top](#Product_Overview) + +--- +
+ +# 2. Key Features + +Below is information about the features and commands of **MyMods**:100:.
+:warning: Important information about the command format:

+ +* Words in UPPER_CASE are the parameters to be supplied by the user.
+ * e.g. in add `m/MODULE_CODE`, `MODULE_CODE` is a parameter which can be used as `add m/CS2100`.

-**:information_source: Notes about the command format:**
+* Items in SQUARE BRACKETS are optional input parameters.
+ * e.g `m/MODULE_CODE [g/GRADE]` can be used as `m/CS2100 g/A` or as `m/CS2100`.

+ +* Items in SQUARE BRACKETS with trailing ellipsis are optional input parameters (zero, one or multiple instances).
+ * e.g in `find KEYWORD [KEYWORD]...`, multiple instances of the KEYWORD parameter are accepted.

+ +* Words in lower_case are to be specified exactly.
+ * In add command format: `add m/MODULE_CODE [g/GRADE] [mc/MODULAR_CREDITS]`, `add`, `m/`, `g/` and `mc/` + are to be specified exactly.

+ +* Multiple instances of the same prefix/input field will not throw an error. However, + the app will only read the last valid instance in the input.
+ * e.g `add m/CS2100 m/CS2103` will add the module CS2103.
+ * e.g `goal set 1 set 2` will set the goal to 2. + * e.g `goal list list` will still list the goals' levels. + +* Parameters can be in any order.
+ * e.g `add m/CS2100 g/A` is the same as `add g/A m/CS2100`.

+ +* Command words are case-sensitive and must be in lower_case.
+ * `add` is not the same as `ADD`, `ADD` would not work as add command.

+ +* Prefixes(ending with `/`) are case-insensitive.
+ * `m/` is the same as `M/`.

+ +* Parameters(words in UPPER_CASE) are case-insensitive.
+ * `add m/CS2100` is the same as `add m/cs2100` and `add m/Cs2100`.
+ * `start Y1S1` is the same as `start y1s1` and `start y1S1`.
+ * `find cs` is the same as `find CS`.

+ +* Adding additional inputs (excluding whitespaces) after commands that do not require parameters will result in an invalid command.
+ * `list 123` will result in an invalid command. +
+ +### 2.1 Summary of Key Features + +Command | Format +--------|------- +`start` | `start SEMESTER` +`add` | `add m/MODULE_CODE [g/GRADE] [mc/MODULAR_CREDITS]` +`update` | `update m/MODULE_CODE [g/GRADE] [s/SEMESTER]` +`list` | `list` +`goal` | `goal set LEVEL` or `goal list` +`recommendSU` | `recommendSU` +`su` | `su MODULE_CODE` +`delete` | `delete MODULE_CODE` +`done` | `done` +`find` | `find KEYWORD [KEYWORD]...` +`progress` | `progress [ddp]` +`clear` | `clear` +`help` | `help` +`exit` | `exit` + +
+ +### 2.2 Edit Semester: `start` +Can’t wait to add your modules into **MyMods**:100:? You can start modifying the modules by starting a semester! \ +\ +Format: `start SEMESTER` \ +\ +Examples: +* `start Y2S1` +* `start y2S1` + +* Important information will be shown in a box: +
+:warning: You can only add, edit or delete modules after starting a particular semester. +Semesters available include: Y1S1, Y1S2, Y2S1, Y2S2, Y3S1, Y3S2, Y4S1, Y4S2, Y5S1, Y5S2. +Special Terms are not yet supported. +
+
+
+:bulb: You can check the current semester that you are editing beside the area displaying your CAP on the interface: +
+ +
+To edit a Semester (e.g. Y2S1): -* Words in `UPPER_CASE` are the parameters to be supplied by the user.
- e.g. in `add n/NAME`, `NAME` is a parameter which can be used as `add n/John Doe`. +1. Type `start Y2S1` into the command box, and press Enter to execute it. \ + -* 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`. +2. The result box will display the message: \ + -* 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. +
-* 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. +[Back to top](#Product_Overview) +
+### 2.3 Add Module: `add` +Yes! After starting a semester, we can now add a module to your list. \ +\ +Format: `add m/MODULE_CODE [g/GRADE] [mc/MODULAR_CREDITS]`\ +\ +Examples: +* `add m/CS1101S` +* `add m/CS1231 g/A` + +
+:warning: Use of parameter `[mc/MODULAR_CREDITS]` is to manually add modules that are not in our database. + This is not recommended. However, to add a module that is not recognised by + MyMods:100:, refer to the warning after the example usage below. +
+

+ +
+:warning: To simulate Completed Satisfactorily/Completed Unsatisfactorily (CS/CU) grades for CS/CU modules, +do not include parameter `[g/GRADE]` so that the grade will be reflected as NA. Don't worry, CS/CU modules will not be included +in your CAP calculations and, by NUS standards, S/U is not an option for CS/CU modules.
+
+To add a module (e.g. add CS1101S): -### Viewing help : `help` +1. Type `add m/CS1101S g/A+` into the command box, and press Enter to execute it.
+ -Shows a message explaning how to access the help page. +2. The result box will display the message:
+ -![help message](images/helpMessage.png) +3. You can check that the module is added in the list below:
+ -Format: `help` +
+:warning: Our database is **valid up to modules in AY19/20**. So if the modules you are adding is +new in AY20/21 and beyond, the following message will be shown:
+ +
+
+To add a module that is not in our database(e.g. CS0000): -### Adding a person: `add` +1. Type `add m/CS0000 mc/4` (with `mc/MODULAR_CREDITS`) into the command box, and press Enter to execute it. +
+(note: `MODULAR_CREDITS` is the number of modular credits of the module)
+ +2. The result box will display the message: +
+ -Adds a person to the address book. -Format: `add n/NAME p/PHONE_NUMBER e/EMAIL a/ADDRESS [t/TAG]…​` +
+:warning: Manually added modules will not be recommended to S/U for the command `recommendSU` and cannot be S/U-ed using +the command `su`. The number of MODULAR_CREDITS cannot be updated using the command `update` too. -
:bulb: **Tip:** -A person can have any number of tags (including 0)
+
+ +[Back to top](#Product_Overview) +
+ +### 2.4 Update Module: `update` +Oops, typed something wrong or want to change something? +Use this update feature to change the module’s grade or semester. +\ +Format: `update m/MODULE_CODE [g/GRADE] [s/SEMESTER]` \ +\ 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` +* `update m/CS1101S` +* `update m/CS1101S g/A+` +* `update M/cs1101s G/c s/y2s1` +* `update m/CS1101s S/y2S1` + +
+:bulb: Not including a grade parameter will remove the grade and assign the grade as ‘NA’. +

-### Listing all persons : `list` +To update a module (e.g. CS2030): -Shows a list of all persons in the address book. +1. Type `update m/CS2030 g/A s/Y1S2` into the command box, and press Enter to execute it. +
+ -Format: `list` +2. The result box will display the message: +
+ -### Editing a person : `edit` +3. Use the command `list` and you can check that the module's semester and grade are both updated from the list below: +
+ -Edits an existing person in the address book. +
-Format: `edit INDEX [n/NAME] [p/PHONE] [e/EMAIL] [a/ADDRESS] [t/TAG]…​` +[Back to top](#Product_Overview) +
-* 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. +### 2.5 List all Modules: `list` +If you want to see all the modules that you have keyed in, use this feature to display the list of your modules and + their respective grades (if any) for all semesters.\ + \ +Format: `list` \ + \ Examples: -* `edit 1 p/91234567 e/johndoe@example.com` Edits the phone number and email address of the 1st person to be `91234567` and `johndoe@example.com` respectively. -* `edit 2 n/Betsy Crower t/` Edits the name of the 2nd person to be `Betsy Crower` and clears all existing tags. +* `list` -### Locating persons by name: `find` +
+:warning: If you are editing a semester (e.g. Y2S1), +modules from other semestesr (e.g. Y4S1) will also be listed as the `list` command displays the modules in all semesters +regardless of which semester you are currently editing. +

-Finds persons whose names contain any of the given keywords. +
+:bulb: You can use this command after using `find` or `recommendSU` to list all the modules! +
+To view all the modules that you have taken: -Format: `find KEYWORD [MORE_KEYWORDS]` +1. Type `list` into the command box, and 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 box will display the message: +
+ +3. You can check that all the modules from all semesters are shown in the list below: +
+ + +
+ +[Back to top](#Product_Overview) +
+ +### 2.6 Set Goals: `goal` +Reach for the stars! Set your goal level according to NUS’ Honours Classification System +or list to show the corresponding levels. \ + \ +Format: `goal set LEVEL` or `goal list` \ + \ Examples: -* `find John` returns `john` and `John Doe` -* `find alex david` returns `Alex Yeoh`, `David Li`
- ![result for 'find alex david'](images/findAlexDavidResult.png) +* `goal set 2` +* `goal list` +

+
+:warning: `LEVEL` has to be an integer between 1-6. +The command `list` will be ignored if `set LEVEL` is present. +

+
+:bulb: Below is the NUS Honours Classification System with respect to the `LEVEL` available: +
+ +* `1`: Highest Distinction (CAP **4.50 ~ 5.00**) +* `2`: Distinction (CAP **4.00 ~ 4.49**) +* `3`: Merit (CAP **3.50 ~ 3.99**) +* `4`: Honours (CAP **3.00 ~ 3.49**) +* `5`: Pass (CAP **2.00 ~ 2.99**) +* `6`: Fail (CAP **< 2.00**)

+ +
+:bulb: You can also show the same list in **MyMods**:100: using `goal list`: +
+ +
-### Deleting a person : `delete` +To set your goal to 2 (CAP 4.00 ~ 4.49): -Deletes the specified person from the address book. +1. Type `goal set 2` into the command box, and press Enter to execute it.
+ -Format: `delete INDEX` +2. The result box will display the message:
+ +

+ +
+:bulb: You can check your current goal using the command `progress`: +
+ +
+ +
+ +[Back to top](#Product_Overview) +
+ +### 2.7 Recommend S/U: `recommendSU` +Having a headache on what module you should S/U? This feature will ease your headache by recommending which module(s) +from your list to S/U based on your goal, grades and if the module can be S/U-ed. \ + \ +Format: `recommendSU` \ + \ +Example: +* `recommendSU` + +To get recommendations on which modules to S/U: +1. Type `recommendSU` into the command box, and press Enter to execute it.
+ + +2. The result box will display the message (if there are suitable modules to recommend):
+ + +3. Check the module(s) that are recommended to S/U in the list below:
+ + +
+:warning: If there are no modules for us to recommend you to S/U, the result box will show:
+ +
+
+ +
+:warning: Manually added modules will not be recommended to S/U for the command `recommendSU` and cannot be S/U-ed +using the command `su`. +
-* 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, …​ +
+[Back to top](#Product_Overview) +
+ +### 2.8 S/U Module: `su` +Didn’t do very well for a module? S/U the module in your list using this feature! \ + \ +Format: `su MODULE_CODE` \ + \ 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. +* `su CS1101S` +* `su CS1231S` + +To S/U a module (e.g. CS1231): +1. Type `su CS1231` into the command box, and press Enter to execute it.
+ + +2. The result box will display the message (if the module can be S/U-ed):
+ + +3. The module’s grade has been changed to “SU” as shown in the list below:
+ + +
+:warning: If the module cannot be S/U-ed according to NUS’ guidelines or the module is manually added using parameter `mc/`, the command box will display: +
+ +
+ +
+ +[Back to top](#Product_Overview) +
+ +### 2.9 Delete Module: `delete` +If you want to remove a module from your list, use this feature to delete the module along with its grade +from your list of modules. \ + \ +Format: `delete MODULE_CODE` \ + \ +Examples: +* `delete CS1101S` + +To delete a module (e.g. CS1231) from the list:
+ + +1. Type `delete CS1231` into the command box, and press Enter to execute it.
+ + +2. The result box will display the message:
+ + +3. The module CS1231 will be deleted from the list as shown below:
+ + +
+ +[Back to top](#Product_Overview) +
+ +### 2.10 Exit Semester: `done` +Finally done with editing the semester? +Don’t forget that you won’t be able to change any modules until you start another semester +(the semester in which you want to edit the modules of)! +\ +\ +Format: `done` \ + \ +Example: +* `done` + +To stop editing a semester (e.g. Y1S1): + +1. Type `done` into the command box, and press Enter to execute it.
+ + +2. The result box will display the message:
+ + +
+:bulb: You can check the current semester that you are editing beside the area displaying your CAP on the interface: +
+ +
+
+ +[Back to top](#Product_Overview) +
+ +### 2.11 Find Module: `find` + +Too many modules in the list? Unable to find a module that you took? +Fret not! Locate it immediately using the find command. +\ +\ +Format: `find KEYWORD [KEYWORD]...`\ +\ +Examples: +* `find CS1101S` +* `find MA` +* `find cs ma` + +
+:warning: Note that `find` only applies to module codes and nothing else! Only the modules which have module + codes containing any of the keywords will be returned. The keywords are case-insensitive. +

+ +
+:bulb: Searching for part of the module code will work too. For example, you can `find CS1231` to find the +module CS1231S or `find CS` to find all modules that contain the word ‘CS’. +
+
+To search for a module (e.g. CS): + +1. Type `find CS` into the command box, and press Enter to execute it. +
+ + +2. The modules that contain the keyword ‘CS’ will be listed below: +
+ + +
+:bulb: If there is no module that matches the keyword, the following message will be shown: +
+ +
+ +
+ +[Back to top](#Product_Overview) +
+ +### 2.12 Progress Report: `progress` +Want to know how well you are doing relative to your goal? Use this feature for a progress report +that calculates the average CAP required for your remaining modules to achieve your target CAP. +\ +In case you have forgotten the current goal that you have set, it will be shown too! + +Format: `progress [ddp]` + +Examples: +* `progress` +* `progress ddp` + +
+:bulb: ddp here refers to NUS’s Double Degree Programme. Include it if you are in a ddp. +
+
+To calculate the CAP required to achieve your goal: + +1. Type `progress` into the command box, and press Enter to execute it.
+ + +2. The result box will display the message:
+ + +
+ +[Back to top](#Product_Overview) +
+ +### 2.13 Clear All: `clear` +Want to delete everything but too lazy to delete them one by one? +Here is a command to reset everything (deletes all modules)! + +Format: `clear` \ + \ +Example: +* `clear` + +
+:warning: This command will clear everything **regardless if you are editing a semester or not**. Use with Caution! +
+
+To clear everything: + +1. Type clear into the command box and press Enter to execute it.
+ +2. A confirmation window will pop up as shown:
+ +3. After clicking ‘Yes’, the command result will show:
+ + -### Clearing all entries : `clear` +
-Clears all entries from the address book. +[Back to top](#Product_Overview) +
-Format: `clear` +### 2.14 Get Help: `help` +If you are lost, this command will give you a summary of the command formats. -### Exiting the program : `exit` +Format: `help` \ + \ +Example: +* `help` -Exits the program. +To seek help: -Format: `exit` +1. Type `help` in the command box, and press Enter to execute it.
+ -### Saving the data +2. The result box will display the message with an additional pop-up window:
+ -AddressBook data are saved in the hard disk automatically after any command that changes the data. There is no need to save manually. +
-### Archiving data files `[coming in v2.0]` +[Back to top](#Product_Overview) +
-_{explain the feature here}_ +### 2.15 Exit Application: `exit` +Exits the application. --------------------------------------------------------------------------------------------------------------------- +Format: `exit` \ + \ +Example: +* `exit` -## FAQ +To exit the application: +1. Type `exit` into the command box, and press Enter to execute it.
+ -**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. +2. **MyMods**:100: will close and exit. +
--------------------------------------------------------------------------------------------------------------------- +[Back to top](#Product_Overview) -## 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` diff --git a/docs/_config.yml b/docs/_config.yml index 6bd245d8f4e..72395f68095 100644 --- a/docs/_config.yml +++ b/docs/_config.yml @@ -1,4 +1,4 @@ -title: "AB-3" +title: "MyMods" theme: minima header_pages: @@ -8,7 +8,7 @@ header_pages: markdown: kramdown -repository: "se-edu/addressbook-level3" +repository: "AY2021S1-CS2103T-T17-1/tp" github_icon: "images/github-icon.png" plugins: diff --git a/docs/_includes/head.html b/docs/_includes/head.html index 83ac5326933..92c3760e6e2 100644 --- a/docs/_includes/head.html +++ b/docs/_includes/head.html @@ -1,7 +1,7 @@ - + diff --git a/docs/diagrams/ArchitectureSequenceDiagram.puml b/docs/diagrams/ArchitectureSequenceDiagram.puml index ef81d18c337..080884670c9 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 CS1101S" activate ui UI_COLOR -ui -[UI_COLOR]> logic : execute("delete 1") +ui -[UI_COLOR]> logic : execute("delete CS1101S") activate logic LOGIC_COLOR -logic -[LOGIC_COLOR]> model : deletePerson(p) +logic -[LOGIC_COLOR]> model : deleteModule(p) activate model MODEL_COLOR model -[MODEL_COLOR]-> logic deactivate model -logic -[LOGIC_COLOR]> storage : saveAddressBook(addressBook) +logic -[LOGIC_COLOR]> storage : saveGradeBook(gradeBook, goalTarget) 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..0c9173eb22c 100644 --- a/docs/diagrams/BetterModelClassDiagram.puml +++ b/docs/diagrams/BetterModelClassDiagram.puml @@ -15,7 +15,6 @@ UniquePersonList o-right-> Person Person -up-> "*" Tag Person *--> Name -Person *--> Phone Person *--> Email Person *--> Address @enduml diff --git a/docs/diagrams/DeleteSequenceDiagram.puml b/docs/diagrams/DeleteSequenceDiagram.puml index 1dc2311b245..0a6b134f485 100644 --- a/docs/diagrams/DeleteSequenceDiagram.puml +++ b/docs/diagrams/DeleteSequenceDiagram.puml @@ -3,7 +3,7 @@ box Logic LOGIC_COLOR_T1 participant ":LogicManager" as LogicManager LOGIC_COLOR -participant ":AddressBookParser" as AddressBookParser LOGIC_COLOR +participant ":GradeBookParser" as GradeBookParser LOGIC_COLOR participant ":DeleteCommandParser" as DeleteCommandParser LOGIC_COLOR participant "d:DeleteCommand" as DeleteCommand LOGIC_COLOR participant ":CommandResult" as CommandResult LOGIC_COLOR @@ -13,20 +13,20 @@ 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 -> GradeBookParser : parseCommand("delete CS2103T") +activate GradeBookParser create DeleteCommandParser -AddressBookParser -> DeleteCommandParser +GradeBookParser -> DeleteCommandParser activate DeleteCommandParser -DeleteCommandParser --> AddressBookParser +DeleteCommandParser --> GradeBookParser deactivate DeleteCommandParser -AddressBookParser -> DeleteCommandParser : parse("1") +GradeBookParser -> DeleteCommandParser : parse("CS2103T") activate DeleteCommandParser create DeleteCommand @@ -36,19 +36,19 @@ activate DeleteCommand DeleteCommand --> DeleteCommandParser : d deactivate DeleteCommand -DeleteCommandParser --> AddressBookParser : d +DeleteCommandParser --> GradeBookParser : d deactivate DeleteCommandParser 'Hidden arrow to position the destroy marker below the end of the activation bar. -DeleteCommandParser -[hidden]-> AddressBookParser +DeleteCommandParser -[hidden]-> GradeBookParser destroy DeleteCommandParser -AddressBookParser --> LogicManager : d -deactivate AddressBookParser +GradeBookParser --> LogicManager : d +deactivate GradeBookParser LogicManager -> DeleteCommand : execute() activate DeleteCommand -DeleteCommand -> Model : deletePerson(1) +DeleteCommand -> Model : deleteModule(CS2103T) activate Model Model --> DeleteCommand diff --git a/docs/diagrams/LogicClassDiagram.puml b/docs/diagrams/LogicClassDiagram.puml index 016ef33e2e2..5b49c4e6b8e 100644 --- a/docs/diagrams/LogicClassDiagram.puml +++ b/docs/diagrams/LogicClassDiagram.puml @@ -8,7 +8,7 @@ package Logic { package Parser { Interface Parser <> -Class AddressBookParser +Class GradeBookParser 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" GradeBookParser +GradeBookParser .left.> XYZCommandParser: creates > XYZCommandParser ..> XYZCommand : creates > XYZCommandParser ..|> Parser diff --git a/docs/diagrams/ModeActivityDiagram.puml b/docs/diagrams/ModeActivityDiagram.puml new file mode 100644 index 00000000000..4270180f52d --- /dev/null +++ b/docs/diagrams/ModeActivityDiagram.puml @@ -0,0 +1,12 @@ +@startuml +start +:Users chooses which theme to be applied; +if () then([User choose Dark]) + :DarkTheme.css is applied to GUI; +else ([User choose Light]) + :LightTheme.css is applied to GUI; +endif +:Theme is applied; + +stop +@enduml diff --git a/docs/diagrams/ModeSequenceDiagram.puml b/docs/diagrams/ModeSequenceDiagram.puml new file mode 100644 index 00000000000..b8a6047fe4f --- /dev/null +++ b/docs/diagrams/ModeSequenceDiagram.puml @@ -0,0 +1,58 @@ +@startuml +!include style.puml + +box UI UI_COLOR_T1 +participant ":MainWindow" as MainWindow UI_COLOR_T4 +participant "scene:Scene" as Scene UI_COLOR_T4 +participant "listOfStylesheet:ObservableList" as list UI_COLOR_T4 +end box + +[-> MainWindow : handleLightThemeSelection() +activate MainWindow + +MainWindow -> MainWindow : setStyleSheet("LightTheme") +activate MainWindow + +create Scene +MainWindow -> Scene : primaryStage.getScene() +activate Scene + +Scene -> Scene +activate Scene + +create list +Scene -> list : getStylesheet() +activate list + +list -> list : clear() +activate list +deactivate list + +ref over list +self invocation +add(MainWindow.class +.getResource("/view/" + cssFileName + ".css") +.toExternalForm() +) +end ref + +list --> Scene +deactivate list +list -[hidden]-> Scene +destroy list + +Scene -> Scene +deactivate Scene + +Scene --> MainWindow +deactivate Scene +Scene -[hidden]-> MainWindow +destroy Scene + +MainWindow -> MainWindow +deactivate MainWindow + +[<-- MainWindow +deactivate MainWindow + +@enduml diff --git a/docs/diagrams/ModelClassDiagram.puml b/docs/diagrams/ModelClassDiagram.puml index e85a00d4107..25e8fc880b3 100644 --- a/docs/diagrams/ModelClassDiagram.puml +++ b/docs/diagrams/ModelClassDiagram.puml @@ -5,52 +5,55 @@ skinparam arrowColor MODEL_COLOR skinparam classBackgroundColor MODEL_COLOR Package Model <>{ -Interface ReadOnlyAddressBook <> -Interface Model <> -Interface ObservableList <> -Class AddressBook -Class ReadOnlyAddressBook -Class Model -Class ModelManager -Class UserPrefs -Class ReadOnlyUserPrefs - -Package Person { -Class Person -Class Address -Class Email -Class Name -Class Phone -Class UniquePersonList + Interface ReadOnlyGradeBook <> + Interface Model <> + Interface ObservableList <> + Class GradeBook + Class ReadOnlyGradeBook + Class Model + Class ModelManager + Class UserPrefs + Class ReadOnlyUserPrefs + +Package Module { + Class Module + Class ModuleName + Class ModularCredit + Class Grade + Class UniqueModuleList + Enum Cap <> } -Package Tag { -Class Tag +Package Semester { + Class SemesterManager + Enum Semester <> } + +SemesterManager --> Semester + +Package GoalTarget { + Class GoalTarget } Class HiddenOutside #FFFFFF HiddenOutside ..> Model -AddressBook .up.|> ReadOnlyAddressBook +GradeBook .up.|> ReadOnlyGradeBook ModelManager .up.|> Model Model .right.> ObservableList -ModelManager o--> "1" AddressBook +ModelManager o--> "1" GradeBook +ModelManager o--> "0..1" GoalTarget ModelManager o-left-> "1" UserPrefs UserPrefs .up.|> ReadOnlyUserPrefs -AddressBook *--> "1" UniquePersonList -UniquePersonList o--> "*" Person -Person *--> Name -Person *--> Phone -Person *--> Email -Person *--> Address -Person *--> "*" Tag - -Name -[hidden]right-> Phone -Phone -[hidden]right-> Address -Address -[hidden]right-> Email +GradeBook *--> "1" UniqueModuleList +UniqueModuleList o--> "*" Module +Module *--> ModuleName +Module *--> ModularCredit +Module *--> Grade +Grade --> Cap -ModelManager -->"1" Person : filtered list +ModelManager ---> "1" Module : filtered list +ModelManager ---> "1 " SemesterManager @enduml diff --git a/docs/diagrams/ObtainModuleInformation.puml b/docs/diagrams/ObtainModuleInformation.puml new file mode 100644 index 00000000000..a061349148c --- /dev/null +++ b/docs/diagrams/ObtainModuleInformation.puml @@ -0,0 +1,47 @@ +@startuml +!include style.puml + +box Logic LOGIC_COLOR_T1 +participant ":AddCommandParser" as AddCommandParser LOGIC_COLOR +participant ":AddCommand" as AddCommand LOGIC_COLOR +end box + +box Model MODEL_COLOR_T1 +participant ":ModularCredit" as ModularCredit MODEL_COLOR +participant ":Module" as Module MODEL_COLOR +participant ":ModuleInfoRetriever" as ModuleInfoRetriever MODEL_COLOR +end box + +[-> AddCommandParser : parse("m/CS1101S g/A") +activate AddCommandParser + +create ModularCredit +AddCommandParser -> ModularCredit : new ModularCredit("CS1101S") +activate ModularCredit + +ModularCredit -> ModuleInfoRetriever : retrieve("CS1101S") +activate ModuleInfoRetriever + +ModuleInfoRetriever --> ModularCredit : d +deactivate ModuleInfoRetriever + +ModularCredit --> AddCommandParser : d +deactivate ModularCredit + +create Module +AddCommandParser -> Module : new Module("CS1101S", "A", 4, "Y2S1") +activate Module + +Module --> AddCommandParser : d +deactivate Module + +create AddCommand +AddCommandParser -> AddCommand +activate AddCommand + +AddCommand --> AddCommandParser : d +deactivate AddCommand + +[<--AddCommandParser +deactivate AddCommandParser +@enduml diff --git a/docs/diagrams/ProgressActivityDiagram.puml b/docs/diagrams/ProgressActivityDiagram.puml new file mode 100644 index 00000000000..1f7f7641d2e --- /dev/null +++ b/docs/diagrams/ProgressActivityDiagram.puml @@ -0,0 +1,22 @@ +@startuml +start +: User executes command; +: Retrieve user's Goal; +'Since the beta syntax does not support placing the condition outside the +'diamond we place it as the true branch instead. +: Retrieve user's current CAP; +if () then ([user from ddp]) + : Set total MC required to 200; +else ([else]) + : Set total MC required to 160; +endif + : Calculates user's required CAP; + if () then ([required CAP is achievable]) + : Displays required CAP to user; + else ([else]) + : Inform users that their target CAP is not achievable; + endif + + +stop +@enduml diff --git a/docs/diagrams/RecommendSuActivityDiagram.puml b/docs/diagrams/RecommendSuActivityDiagram.puml new file mode 100644 index 00000000000..9da1ddd8dcc --- /dev/null +++ b/docs/diagrams/RecommendSuActivityDiagram.puml @@ -0,0 +1,25 @@ +@startuml +start +:User executes command; +:Retrieve user's Goal; +'Since the beta syntax does not support placing the condition outside the +'diamond we place it as the true branch instead. + +if () then ([Goal is set]) + :Get list of modules of user; + :Filter modules in the list; + if () then ([module is recommended to S/U]) + : keep in filteredModuleList; + else ([else]) + :remove from filteredModuleList; + endif + if () then ([filteredModuleList is empty]) + : Inform no modules to recommend; + else ([else]) + : List modules recommended to S/U; + endif +else ([else]) +: Warn user that goal is not set; +endif +stop +@enduml diff --git a/docs/diagrams/StartSemesterActivityDiagram.puml b/docs/diagrams/StartSemesterActivityDiagram.puml new file mode 100644 index 00000000000..29b59d4d329 --- /dev/null +++ b/docs/diagrams/StartSemesterActivityDiagram.puml @@ -0,0 +1,18 @@ +@startuml +start +:User executes start command; + +'Since the beta syntax does not support placing the condition outside the +'diamond we place it as the true branch instead. + + :Get instance of + SemesterManager; + :Set current semester + to the semester + specified by the user; + :Display success message + stating the semester the + user is currently editing; + +stop +@enduml diff --git a/docs/diagrams/StartSemesterSequenceDiagram.puml b/docs/diagrams/StartSemesterSequenceDiagram.puml new file mode 100644 index 00000000000..b6703eb8367 --- /dev/null +++ b/docs/diagrams/StartSemesterSequenceDiagram.puml @@ -0,0 +1,69 @@ +@startuml +!include style.puml + +box Logic LOGIC_COLOR_T1 +participant ":LogicManager" as LogicManager LOGIC_COLOR +participant ":GradeBookParser" as GradeBookParser LOGIC_COLOR +participant ":StartCommandParser" as StartCommandParser LOGIC_COLOR +participant "s:StartCommand" as StartCommand LOGIC_COLOR +participant ":CommandResult" as CommandResult LOGIC_COLOR +end box + +box Model MODEL_COLOR_T1 +participant ":SemesterManager" as SemesterManager MODEL_COLOR +end box + +[-> LogicManager : execute("start Y1S1") +activate LogicManager + +LogicManager -> GradeBookParser : parseCommand("start Y1S1") +activate GradeBookParser + +create StartCommandParser +GradeBookParser -> StartCommandParser +activate StartCommandParser + +StartCommandParser --> GradeBookParser +deactivate StartCommandParser + +GradeBookParser -> StartCommandParser : parse("Y1S1") +activate StartCommandParser + +create StartCommand +StartCommandParser -> StartCommand +activate StartCommand + +StartCommand --> StartCommandParser : s +deactivate StartCommand + +StartCommandParser --> GradeBookParser : s +deactivate StartCommandParser +'Hidden arrow to position the destroy marker below the end of the activation bar. +StartCommandParser -[hidden]-> GradeBookParser +destroy StartCommandParser + +GradeBookParser --> LogicManager : s +deactivate GradeBookParser + +LogicManager -> StartCommand : execute() +activate StartCommand + +StartCommand -> SemesterManager : setCurrentSemester("Y1S1") +activate SemesterManager + +SemesterManager --> StartCommand +deactivate SemesterManager + +create CommandResult +StartCommand -> CommandResult +activate CommandResult + +CommandResult --> StartCommand +deactivate CommandResult + +StartCommand --> LogicManager : result +deactivate StartCommand + +[<--LogicManager +deactivate LogicManager +@enduml diff --git a/docs/diagrams/StorageClassDiagram.puml b/docs/diagrams/StorageClassDiagram.puml index 6adb2e156bf..685b5c2d671 100644 --- a/docs/diagrams/StorageClassDiagram.puml +++ b/docs/diagrams/StorageClassDiagram.puml @@ -6,19 +6,18 @@ skinparam classBackgroundColor STORAGE_COLOR Interface Storage <> Interface UserPrefsStorage <> -Interface AddressBookStorage <> +Interface GradeBookStorage <> Class StorageManager Class JsonUserPrefsStorage -Class JsonAddressBookStorage +Class JsonGradeBookStorage StorageManager .left.|> Storage StorageManager o-right-> UserPrefsStorage -StorageManager o--> AddressBookStorage +StorageManager o--> GradeBookStorage JsonUserPrefsStorage .left.|> UserPrefsStorage -JsonAddressBookStorage .left.|> AddressBookStorage -JsonAddressBookStorage .down.> JsonSerializableAddressBookStorage -JsonSerializableAddressBookStorage .right.> JsonSerializablePerson -JsonSerializablePerson .right.> JsonAdaptedTag +JsonGradeBookStorage .left.|> GradeBookStorage +JsonGradeBookStorage .down.> JsonSerializableGradeBook +JsonSerializableGradeBook .right.> JsonAdaptedModule @enduml diff --git a/docs/diagrams/UiClassDiagram.puml b/docs/diagrams/UiClassDiagram.puml index 92746f9fcf7..8e7c2e10dbf 100644 --- a/docs/diagrams/UiClassDiagram.puml +++ b/docs/diagrams/UiClassDiagram.puml @@ -11,10 +11,12 @@ Class UiManager Class MainWindow Class HelpWindow Class ResultDisplay -Class PersonListPanel -Class PersonCard +Class ModuleListPanel +Class ModuleCard Class StatusBarFooter Class CommandBox +Class CapBox +Class SemBox } package Model <> { @@ -32,28 +34,34 @@ UiManager .left.|> Ui UiManager -down-> MainWindow MainWindow --> HelpWindow MainWindow *-down-> CommandBox +MainWindow *-down-> SemBox +MainWindow *-down-> CapBox 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 +CapBox --|> UiPart +SemBox --|> UiPart +ModuleListPanel --|> UiPart +ModuleCard --|> UiPart StatusBarFooter --|> UiPart HelpWindow -down-|> UiPart -PersonCard ..> Model +ModuleCard ..> Model UiManager -right-> Logic MainWindow -left-> Logic -PersonListPanel -[hidden]left- HelpWindow +ModuleListPanel -[hidden]left- HelpWindow HelpWindow -[hidden]left- CommandBox -CommandBox -[hidden]left- ResultDisplay +CommandBox -[hidden]left- SemBox +SemBox -[hidden]left- CapBox +CapBox -[hidden]left- ResultDisplay ResultDisplay -[hidden]left- StatusBarFooter MainWindow -[hidden]-|> UiPart diff --git a/docs/diagrams/tracing/LogicSequenceDiagram.puml b/docs/diagrams/tracing/LogicSequenceDiagram.puml index fdcbe1c0ccc..34486c88844 100644 --- a/docs/diagrams/tracing/LogicSequenceDiagram.puml +++ b/docs/diagrams/tracing/LogicSequenceDiagram.puml @@ -13,7 +13,7 @@ create ecp abp -> ecp abp -> ecp ++: parse(arguments) create ec -ecp -> ec ++: index, editPersonDescriptor +ecp -> ec ++: index, updateModNameDescriptor ec --> ecp -- ecp --> abp --: command abp --> logic --: command diff --git a/docs/images/ArchitectureSequenceDiagram.png b/docs/images/ArchitectureSequenceDiagram.png index 2f1346869d0..9ded6670d5c 100644 Binary files a/docs/images/ArchitectureSequenceDiagram.png and b/docs/images/ArchitectureSequenceDiagram.png differ diff --git a/docs/images/DeleteSequenceDiagram.png b/docs/images/DeleteSequenceDiagram.png index fa327b39618..9c62f55b1ec 100644 Binary files a/docs/images/DeleteSequenceDiagram.png and b/docs/images/DeleteSequenceDiagram.png differ diff --git a/docs/images/LogicClassDiagram.png b/docs/images/LogicClassDiagram.png index b9e853cef12..9cdf90e64c0 100644 Binary files a/docs/images/LogicClassDiagram.png and b/docs/images/LogicClassDiagram.png differ diff --git a/docs/images/ModeActivityDiagram.png b/docs/images/ModeActivityDiagram.png new file mode 100644 index 00000000000..5814af2f963 Binary files /dev/null and b/docs/images/ModeActivityDiagram.png differ diff --git a/docs/images/ModeSequenceDiagram.png b/docs/images/ModeSequenceDiagram.png new file mode 100644 index 00000000000..cdc848adfbd Binary files /dev/null and b/docs/images/ModeSequenceDiagram.png differ diff --git a/docs/images/ModelClassDiagram.png b/docs/images/ModelClassDiagram.png index 280064118cf..8ee9aa795c0 100644 Binary files a/docs/images/ModelClassDiagram.png and b/docs/images/ModelClassDiagram.png differ diff --git a/docs/images/MyMods-logo.png b/docs/images/MyMods-logo.png new file mode 100644 index 00000000000..f1cb7da586b Binary files /dev/null and b/docs/images/MyMods-logo.png differ diff --git a/docs/images/ObtainModuleInformation.png b/docs/images/ObtainModuleInformation.png new file mode 100644 index 00000000000..3d2bec8788a Binary files /dev/null and b/docs/images/ObtainModuleInformation.png differ diff --git a/docs/images/ProgressActivityDiagram.png b/docs/images/ProgressActivityDiagram.png new file mode 100644 index 00000000000..827f218a9bd Binary files /dev/null and b/docs/images/ProgressActivityDiagram.png differ diff --git a/docs/images/RecommendSuActivityDiagram.png b/docs/images/RecommendSuActivityDiagram.png new file mode 100644 index 00000000000..00ef998a504 Binary files /dev/null and b/docs/images/RecommendSuActivityDiagram.png differ diff --git a/docs/images/StartSemesterActivityDiagram.png b/docs/images/StartSemesterActivityDiagram.png new file mode 100644 index 00000000000..981f3c6254c Binary files /dev/null and b/docs/images/StartSemesterActivityDiagram.png differ diff --git a/docs/images/StartSemesterSequenceDiagram.png b/docs/images/StartSemesterSequenceDiagram.png new file mode 100644 index 00000000000..6964f25af98 Binary files /dev/null and b/docs/images/StartSemesterSequenceDiagram.png differ diff --git a/docs/images/StorageClassDiagram.png b/docs/images/StorageClassDiagram.png index d87c1216820..d318c61960a 100644 Binary files a/docs/images/StorageClassDiagram.png and b/docs/images/StorageClassDiagram.png differ diff --git a/docs/images/UG SS/1. Logo.png b/docs/images/UG SS/1. Logo.png new file mode 100644 index 00000000000..81dca475ce9 Binary files /dev/null and b/docs/images/UG SS/1. Logo.png differ diff --git a/docs/images/UG SS/1.5 Getting Started 1.png b/docs/images/UG SS/1.5 Getting Started 1.png new file mode 100644 index 00000000000..06941241481 Binary files /dev/null and b/docs/images/UG SS/1.5 Getting Started 1.png differ diff --git a/docs/images/UG SS/1.5 Getting Started 2.png b/docs/images/UG SS/1.5 Getting Started 2.png new file mode 100644 index 00000000000..7a192199799 Binary files /dev/null and b/docs/images/UG SS/1.5 Getting Started 2.png differ diff --git a/docs/images/UG SS/1.6 Common Use Cases 1.png b/docs/images/UG SS/1.6 Common Use Cases 1.png new file mode 100644 index 00000000000..875bff4b816 Binary files /dev/null and b/docs/images/UG SS/1.6 Common Use Cases 1.png differ diff --git a/docs/images/UG SS/1.6 Common Use Cases 2.png b/docs/images/UG SS/1.6 Common Use Cases 2.png new file mode 100644 index 00000000000..21e29b59d7e Binary files /dev/null and b/docs/images/UG SS/1.6 Common Use Cases 2.png differ diff --git a/docs/images/UG SS/1.6 Common Use Cases 3.png b/docs/images/UG SS/1.6 Common Use Cases 3.png new file mode 100644 index 00000000000..5a7c38cdde0 Binary files /dev/null and b/docs/images/UG SS/1.6 Common Use Cases 3.png differ diff --git a/docs/images/UG SS/1.6 Common Use Cases 4.png b/docs/images/UG SS/1.6 Common Use Cases 4.png new file mode 100644 index 00000000000..ea5491603e6 Binary files /dev/null and b/docs/images/UG SS/1.6 Common Use Cases 4.png differ diff --git a/docs/images/UG SS/1.6 Common Use Cases 5.png b/docs/images/UG SS/1.6 Common Use Cases 5.png new file mode 100644 index 00000000000..8ef88f40e45 Binary files /dev/null and b/docs/images/UG SS/1.6 Common Use Cases 5.png differ diff --git a/docs/images/UG SS/1.6 Common Use Cases 6.png b/docs/images/UG SS/1.6 Common Use Cases 6.png new file mode 100644 index 00000000000..67ccbd9c245 Binary files /dev/null and b/docs/images/UG SS/1.6 Common Use Cases 6.png differ diff --git a/docs/images/UG SS/2.10 Exit Semester 1.png b/docs/images/UG SS/2.10 Exit Semester 1.png new file mode 100644 index 00000000000..d43cc8a6ad1 Binary files /dev/null and b/docs/images/UG SS/2.10 Exit Semester 1.png differ diff --git a/docs/images/UG SS/2.10 Exit Semester 2.png b/docs/images/UG SS/2.10 Exit Semester 2.png new file mode 100644 index 00000000000..28ac3738a7f Binary files /dev/null and b/docs/images/UG SS/2.10 Exit Semester 2.png differ diff --git a/docs/images/UG SS/2.10 Exit Semester 3.png b/docs/images/UG SS/2.10 Exit Semester 3.png new file mode 100644 index 00000000000..ecd1f0223e0 Binary files /dev/null and b/docs/images/UG SS/2.10 Exit Semester 3.png differ diff --git a/docs/images/UG SS/2.11 Find Module 1.png b/docs/images/UG SS/2.11 Find Module 1.png new file mode 100644 index 00000000000..aa14d20165a Binary files /dev/null and b/docs/images/UG SS/2.11 Find Module 1.png differ diff --git a/docs/images/UG SS/2.11 Find Module 2.png b/docs/images/UG SS/2.11 Find Module 2.png new file mode 100644 index 00000000000..5e7557ee670 Binary files /dev/null and b/docs/images/UG SS/2.11 Find Module 2.png differ diff --git a/docs/images/UG SS/2.11 Find Module 3.png b/docs/images/UG SS/2.11 Find Module 3.png new file mode 100644 index 00000000000..80650e97656 Binary files /dev/null and b/docs/images/UG SS/2.11 Find Module 3.png differ diff --git a/docs/images/UG SS/2.12 Progress Report 1.png b/docs/images/UG SS/2.12 Progress Report 1.png new file mode 100644 index 00000000000..9b8299346f7 Binary files /dev/null and b/docs/images/UG SS/2.12 Progress Report 1.png differ diff --git a/docs/images/UG SS/2.12 Progress Report 2.png b/docs/images/UG SS/2.12 Progress Report 2.png new file mode 100644 index 00000000000..8bfba4c1a0d Binary files /dev/null and b/docs/images/UG SS/2.12 Progress Report 2.png differ diff --git a/docs/images/UG SS/2.13 Clear All 1.png b/docs/images/UG SS/2.13 Clear All 1.png new file mode 100644 index 00000000000..7c5cadc1f04 Binary files /dev/null and b/docs/images/UG SS/2.13 Clear All 1.png differ diff --git a/docs/images/UG SS/2.13 Clear All 2.png b/docs/images/UG SS/2.13 Clear All 2.png new file mode 100644 index 00000000000..c0d6a8afd0a Binary files /dev/null and b/docs/images/UG SS/2.13 Clear All 2.png differ diff --git a/docs/images/UG SS/2.13 Clear All 3.png b/docs/images/UG SS/2.13 Clear All 3.png new file mode 100644 index 00000000000..a057c56c082 Binary files /dev/null and b/docs/images/UG SS/2.13 Clear All 3.png differ diff --git a/docs/images/UG SS/2.14 Get Help 1.png b/docs/images/UG SS/2.14 Get Help 1.png new file mode 100644 index 00000000000..e2cc3ae765f Binary files /dev/null and b/docs/images/UG SS/2.14 Get Help 1.png differ diff --git a/docs/images/UG SS/2.14 Get Help 2.png b/docs/images/UG SS/2.14 Get Help 2.png new file mode 100644 index 00000000000..03e56d52036 Binary files /dev/null and b/docs/images/UG SS/2.14 Get Help 2.png differ diff --git a/docs/images/UG SS/2.15 Exit Application 1.png b/docs/images/UG SS/2.15 Exit Application 1.png new file mode 100644 index 00000000000..dd9c2b4e9db Binary files /dev/null and b/docs/images/UG SS/2.15 Exit Application 1.png differ diff --git a/docs/images/UG SS/2.2 Edit Semester 1.png b/docs/images/UG SS/2.2 Edit Semester 1.png new file mode 100644 index 00000000000..e17ce9ee3fe Binary files /dev/null and b/docs/images/UG SS/2.2 Edit Semester 1.png differ diff --git a/docs/images/UG SS/2.2 Edit Semester 2.png b/docs/images/UG SS/2.2 Edit Semester 2.png new file mode 100644 index 00000000000..30333e8ecbc Binary files /dev/null and b/docs/images/UG SS/2.2 Edit Semester 2.png differ diff --git a/docs/images/UG SS/2.2 Edit Semester 3.png b/docs/images/UG SS/2.2 Edit Semester 3.png new file mode 100644 index 00000000000..f0d8f184867 Binary files /dev/null and b/docs/images/UG SS/2.2 Edit Semester 3.png differ diff --git a/docs/images/UG SS/2.3 Add Module 1.png b/docs/images/UG SS/2.3 Add Module 1.png new file mode 100644 index 00000000000..a420b3de75c Binary files /dev/null and b/docs/images/UG SS/2.3 Add Module 1.png differ diff --git a/docs/images/UG SS/2.3 Add Module 2.png b/docs/images/UG SS/2.3 Add Module 2.png new file mode 100644 index 00000000000..a2b9d1e6b3e Binary files /dev/null and b/docs/images/UG SS/2.3 Add Module 2.png differ diff --git a/docs/images/UG SS/2.3 Add Module 3.png b/docs/images/UG SS/2.3 Add Module 3.png new file mode 100644 index 00000000000..3a5523203f0 Binary files /dev/null and b/docs/images/UG SS/2.3 Add Module 3.png differ diff --git a/docs/images/UG SS/2.3 Add Module 4.png b/docs/images/UG SS/2.3 Add Module 4.png new file mode 100644 index 00000000000..ae5a84b210f Binary files /dev/null and b/docs/images/UG SS/2.3 Add Module 4.png differ diff --git a/docs/images/UG SS/2.3 Add Module 5.png b/docs/images/UG SS/2.3 Add Module 5.png new file mode 100644 index 00000000000..2306fb9bd55 Binary files /dev/null and b/docs/images/UG SS/2.3 Add Module 5.png differ diff --git a/docs/images/UG SS/2.3 Add Module 6.png b/docs/images/UG SS/2.3 Add Module 6.png new file mode 100644 index 00000000000..d1e39edb5e1 Binary files /dev/null and b/docs/images/UG SS/2.3 Add Module 6.png differ diff --git a/docs/images/UG SS/2.4 Update Module 1.png b/docs/images/UG SS/2.4 Update Module 1.png new file mode 100644 index 00000000000..320f0c25690 Binary files /dev/null and b/docs/images/UG SS/2.4 Update Module 1.png differ diff --git a/docs/images/UG SS/2.4 Update Module 2.png b/docs/images/UG SS/2.4 Update Module 2.png new file mode 100644 index 00000000000..ccc4a971276 Binary files /dev/null and b/docs/images/UG SS/2.4 Update Module 2.png differ diff --git a/docs/images/UG SS/2.4 Update Module 3.png b/docs/images/UG SS/2.4 Update Module 3.png new file mode 100644 index 00000000000..b1b6e9a41fc Binary files /dev/null and b/docs/images/UG SS/2.4 Update Module 3.png differ diff --git a/docs/images/UG SS/2.5 List all Modules 1.png b/docs/images/UG SS/2.5 List all Modules 1.png new file mode 100644 index 00000000000..82c91a82b74 Binary files /dev/null and b/docs/images/UG SS/2.5 List all Modules 1.png differ diff --git a/docs/images/UG SS/2.5 List all Modules 2.png b/docs/images/UG SS/2.5 List all Modules 2.png new file mode 100644 index 00000000000..10f31686219 Binary files /dev/null and b/docs/images/UG SS/2.5 List all Modules 2.png differ diff --git a/docs/images/UG SS/2.5 List all Modules 3.png b/docs/images/UG SS/2.5 List all Modules 3.png new file mode 100644 index 00000000000..e8dfd5eb0a8 Binary files /dev/null and b/docs/images/UG SS/2.5 List all Modules 3.png differ diff --git a/docs/images/UG SS/2.6 Set Goals 1.png b/docs/images/UG SS/2.6 Set Goals 1.png new file mode 100644 index 00000000000..ab32a5fb0d9 Binary files /dev/null and b/docs/images/UG SS/2.6 Set Goals 1.png differ diff --git a/docs/images/UG SS/2.6 Set Goals 2.png b/docs/images/UG SS/2.6 Set Goals 2.png new file mode 100644 index 00000000000..08dbd5e1b87 Binary files /dev/null and b/docs/images/UG SS/2.6 Set Goals 2.png differ diff --git a/docs/images/UG SS/2.6 Set Goals 3.png b/docs/images/UG SS/2.6 Set Goals 3.png new file mode 100644 index 00000000000..caaa116d798 Binary files /dev/null and b/docs/images/UG SS/2.6 Set Goals 3.png differ diff --git a/docs/images/UG SS/2.6 Set Goals 4.png b/docs/images/UG SS/2.6 Set Goals 4.png new file mode 100644 index 00000000000..718e11bbf16 Binary files /dev/null and b/docs/images/UG SS/2.6 Set Goals 4.png differ diff --git a/docs/images/UG SS/2.7 Recommend SU 1.png b/docs/images/UG SS/2.7 Recommend SU 1.png new file mode 100644 index 00000000000..cd10e9ada88 Binary files /dev/null and b/docs/images/UG SS/2.7 Recommend SU 1.png differ diff --git a/docs/images/UG SS/2.7 Recommend SU 2.png b/docs/images/UG SS/2.7 Recommend SU 2.png new file mode 100644 index 00000000000..e1305a5220f Binary files /dev/null and b/docs/images/UG SS/2.7 Recommend SU 2.png differ diff --git a/docs/images/UG SS/2.7 Recommend SU 3.png b/docs/images/UG SS/2.7 Recommend SU 3.png new file mode 100644 index 00000000000..ddfe0b0131a Binary files /dev/null and b/docs/images/UG SS/2.7 Recommend SU 3.png differ diff --git a/docs/images/UG SS/2.7 Recommend SU 4.png b/docs/images/UG SS/2.7 Recommend SU 4.png new file mode 100644 index 00000000000..6f40c3156bb Binary files /dev/null and b/docs/images/UG SS/2.7 Recommend SU 4.png differ diff --git a/docs/images/UG SS/2.8 SU Module 1.png b/docs/images/UG SS/2.8 SU Module 1.png new file mode 100644 index 00000000000..ea1b7fdf37c Binary files /dev/null and b/docs/images/UG SS/2.8 SU Module 1.png differ diff --git a/docs/images/UG SS/2.8 SU Module 2.png b/docs/images/UG SS/2.8 SU Module 2.png new file mode 100644 index 00000000000..c3eb6fdfed8 Binary files /dev/null and b/docs/images/UG SS/2.8 SU Module 2.png differ diff --git a/docs/images/UG SS/2.8 SU Module 3.png b/docs/images/UG SS/2.8 SU Module 3.png new file mode 100644 index 00000000000..b7a899a70b1 Binary files /dev/null and b/docs/images/UG SS/2.8 SU Module 3.png differ diff --git a/docs/images/UG SS/2.8 SU Module 4.png b/docs/images/UG SS/2.8 SU Module 4.png new file mode 100644 index 00000000000..ca6ac8e5732 Binary files /dev/null and b/docs/images/UG SS/2.8 SU Module 4.png differ diff --git a/docs/images/UG SS/2.9 Delete Module 1.png b/docs/images/UG SS/2.9 Delete Module 1.png new file mode 100644 index 00000000000..0db9e457c6a Binary files /dev/null and b/docs/images/UG SS/2.9 Delete Module 1.png differ diff --git a/docs/images/UG SS/2.9 Delete Module 2.png b/docs/images/UG SS/2.9 Delete Module 2.png new file mode 100644 index 00000000000..86617ff0c95 Binary files /dev/null and b/docs/images/UG SS/2.9 Delete Module 2.png differ diff --git a/docs/images/UG SS/2.9 Delete Module 3.png b/docs/images/UG SS/2.9 Delete Module 3.png new file mode 100644 index 00000000000..ba3d3fc0a60 Binary files /dev/null and b/docs/images/UG SS/2.9 Delete Module 3.png differ diff --git a/docs/images/UG SS/2.9 Delete Module 4.png b/docs/images/UG SS/2.9 Delete Module 4.png new file mode 100644 index 00000000000..81e70d54fad Binary files /dev/null and b/docs/images/UG SS/2.9 Delete Module 4.png differ diff --git a/docs/images/Ui.png b/docs/images/Ui.png index 5bd77847aa2..f82db7c8aee 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..10201083a6d 100644 Binary files a/docs/images/UiClassDiagram.png and b/docs/images/UiClassDiagram.png differ diff --git a/docs/images/augustinekau.png b/docs/images/augustinekau.png new file mode 100644 index 00000000000..022c94cbbab Binary files /dev/null and b/docs/images/augustinekau.png differ diff --git a/docs/images/kunnan97.png b/docs/images/kunnan97.png new file mode 100644 index 00000000000..0c17f226797 Binary files /dev/null and b/docs/images/kunnan97.png differ diff --git a/docs/images/pongzers.png b/docs/images/pongzers.png new file mode 100644 index 00000000000..be407ba6bdf Binary files /dev/null and b/docs/images/pongzers.png differ diff --git a/docs/images/xyzhangg.png b/docs/images/xyzhangg.png new file mode 100644 index 00000000000..8106ebd0c18 Binary files /dev/null and b/docs/images/xyzhangg.png differ diff --git a/docs/images/zhaolingshan.png b/docs/images/zhaolingshan.png new file mode 100644 index 00000000000..1392af0fe81 Binary files /dev/null and b/docs/images/zhaolingshan.png differ diff --git a/docs/index.md b/docs/index.md index 7601dbaad0d..ca4d77e9d6a 100644 --- a/docs/index.md +++ b/docs/index.md @@ -1,17 +1,17 @@ --- layout: page -title: AddressBook Level-3 +title: MyMods --- -[![CI Status](https://github.com/se-edu/addressbook-level3/workflows/Java%20CI/badge.svg)](https://github.com/se-edu/addressbook-level3/actions) -[![codecov](https://codecov.io/gh/se-edu/addressbook-level3/branch/master/graph/badge.svg)](https://codecov.io/gh/se-edu/addressbook-level3) +[![CI Status](https://github.com/se-edu/addressbook-level3/workflows/Java%20CI/badge.svg)](https://github.com/AY2021S1-CS2103T-T17-1/tp/actions) +[![codecov](https://codecov.io/gh/AY2021S1-CS2103T-T17-1/tp/branch/master/graph/badge.svg)](https://codecov.io/gh/AY2021S1-CS2103T-T17-1/tp) ![Ui](images/Ui.png) -**AddressBook is a desktop application for managing your contact details.** While it has a GUI, most of the user interactions happen using a CLI (Command Line Interface). +**MyMods is a desktop application for managing your module results.** 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. +* If you are interested in using MyMods, head over to the [_Quick Start_ section of the **User Guide**](UserGuide.html#quick-start). +* If you are interested about developing MyMods, the [**Developer Guide**](DeveloperGuide.html) is a good place to start. **Acknowledgements** diff --git a/docs/team/augustinekau.md b/docs/team/augustinekau.md new file mode 100644 index 00000000000..d447d4a97a2 --- /dev/null +++ b/docs/team/augustinekau.md @@ -0,0 +1,43 @@ +--- +layout: page +title: Augustine Kau's Project Portfolio Page +--- + +## Project: MyMods + +MyMods is a desktop app for tracking modules and grades, optimized for use for students who prefer typing via a +Command Line Interface (CLI) while still having the benefits of a Graphical User Interface (GUI). + +With MyMods, you are able to keep track of your module results efficiently, easily make S/U decisions, +and view your academic progress. +It is written in Java. + +Given below are my contributions to the project. + +* **New Feature**: Added the ability for users to set their goal according to the university's Honours Classification System + * What it does: Allow the user to set their goals or view the list of goal available. + * Justification: This feature is needed for recommendSU and Progress report feature as it needs to take into account the user's desired goal. + * Highlights: This enhancement affects how the application saves and read from the json file. It required an in-depth analysis of design alternatives. The implementation too was challenging as it required changes to how the file is saved and read. + +* **New Feature**: Added the ability for MyMods to recommend modules to S/U for the user. + * What it does: Recommend S/U looks through the all the modules by the user and cross check with our data file on where the module can be S/U by NUS restrictions. It then compares that module's grade with the user's defined goal. + * Justification: This feature gives the user more purpose of using MyMods as it is a personalised list and it is useful as students (esp NUS freshmen) have difficulty deciding what modules they should S/U. + * Highlights: This enhancement affects existing commands (semester feature) and commands to be added in future. It required an in-depth analysis of design alternatives. The implementation too was challenging as it required consideration of OOP design principles. + + * **Code contributed**: [RepoSense link](https://nus-cs2103-ay2021s1.github.io/tp-dashboard/#breakdown=true&search=&sort=groupTitle&sortWithin=title&since=2020-08-14&timeframe=commit&mergegroup=&groupSelect=groupByRepos&checkedFileTypes=docs~functional-code~test-code~other&tabOpen=true&tabType=authorship&tabAuthor=augustinekau&tabRepo=AY2021S1-CS2103T-T17-1%2Ftp%5Bmaster%5D&authorshipIsMergeGroup=false&authorshipFileTypes=docs~functional-code~test-code) + +* **Enhancements to existing features**: + * Updated and refactored the code from the original AB3 code to fit MyMods functionality (Pull requests [\#46](https://github.com/AY2021S1-CS2103T-T17-1/tp/pull/46), [\#47](https://github.com/AY2021S1-CS2103T-T17-1/tp/pull/47)) + +* **Documentation**: + * User Guide: + * Added documentation for the features `Set Goal`, `Recommend S/U` and `Find` (No PR by me as we typed collectively in Google Docs and pushed by one person) + * Added documentation for Product Overview `Table of Contents`, `About`, `Glossaries` and `Getting Started` (No PR by me as we typed collectively in Google Docs and pushed by one person) + * Did cosmetic tweaks to existing documentation by including tips and all screenshot annotation (No PR by me as we typed collectively in Google Docs and pushed by one person) + * Developer Guide: + * Added implementation details of the `recommendSU` feature. + * Edited sections with diagrams on Architecture and Storage components under Design. + +* **Community**: + * Number of PRs reviewed (with trivial review comments): 58 + * Reported 13 bugs and suggestions for other teams in PE-D 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/kunnan97.md b/docs/team/kunnan97.md new file mode 100644 index 00000000000..1849ece69a5 --- /dev/null +++ b/docs/team/kunnan97.md @@ -0,0 +1,58 @@ +--- +layout: page +title: Hong Kunnan's Project Portfolio Page +--- + +## Project: MyMods + +MyMods is a desktop mod tracking application used for tracking mods in NUS. +The user interacts with it using a CLI, and it has a GUI created with JavaFX. It is written in Java. + +Given below are my contributions to the project. + +* **New Feature**: Added the ability to change themes of GUI. + * What it does: Allow user to switch between dark and light mode easily. + * Justification: The purpose of the dark and light mode is to let users use light mode in the day while dark mode at + night so users can adapt to the lighting of day. + * Credits: *{css file is adopted from AB3 from https://github.com/nus-cs2103-AY2021S1/tp wih light(newly created) and + dark(modified) themed css file suited to our application}* + +* **New Feature**: Added autocomplete suggestions for command box + * What it does: Allow command box to suggest command types. + * Credits *{Autocomplete is implemented from @Caleb Brinkman with modifications}* + +* **Code contributed**: [RepoSense link](https://nus-cs2103-ay2021s1.github.io/tp-dashboard/#breakdown=true&search=&sort=groupTitle&sortWithin=title&since=2020-08-14&timeframe=commit&mergegroup=&groupSelect=groupByRepos&checkedFileTypes=docs~functional-code~test-code~other&tabOpen=true&tabType=authorship&tabAuthor=kunnan97&tabRepo=AY2021S1-CS2103T-T17-1%2Ftp%5Bmaster%5D&authorshipIsMergeGroup=false&authorshipFileTypes=docs~functional-code~test-code~other) + +* **Project management**: + * Managed releases `v1.3(trial)` - `v1.4` (4 releases) on GitHub + +* **Enhancements to existing features**: + * Removed, `Phone`, `Tag` and `email` classes from original AB3. + [\#43](https://github.com/AY2021S1-CS2103T-T17-1/tp/pull/43) + [\#44](https://github.com/AY2021S1-CS2103T-T17-1/tp/pull/44) + [\#237](https://github.com/AY2021S1-CS2103T-T17-1/tp/pull/237) + * Updated the GUI color scheme, added option for user to switch between the two themes(Light and Dark) + [\#76](https://github.com/AY2021S1-CS2103T-T17-1/tp/pull/76) + * Added GUI box to display CAP + [\#58](https://github.com/AY2021S1-CS2103T-T17-1/tp/pull/58) + * Added command summary and hyperlinks to our User Guide in help window. + [\#2258](https://github.com/AY2021S1-CS2103T-T17-1/tp/pull/258) + * Added alert dialog to prompt confirmation to users for clear command + [\#238](https://github.com/AY2021S1-CS2103T-T17-1/tp/pull/238) + * Allow result display box to be resizable from the bottom + +* **Documentation**: + * User Guide: + * Converted the collaborative document to markdown plus cosmetic tweaks + (Refer to [Reposense link for documentation](https://nus-cs2103-ay2021s1.github.io/tp-dashboard/#breakdown=true&search=&sort=groupTitle&sortWithin=title&since=2020-08-14&until=2020-11-09&timeframe=commit&mergegroup=&groupSelect=groupByRepos&checkedFileTypes=docs~functional-code~test-code~other&tabOpen=true&tabType=authorship&tabAuthor=kunnan97&tabRepo=AY2021S1-CS2103T-T17-1%2Ftp%5Bmaster%5D&authorshipIsMergeGroup=false&authorshipFileTypes=docs)) + * Contributed documentation to the features [`goal`](https://ay2021s1-cs2103t-t17-1.github.io/tp/UserGuide.html#Set_Goals) and [`delete`](https://ay2021s1-cs2103t-t17-1.github.io/tp/UserGuide.html#Delete_Module) and [summary table](https://ay2021s1-cs2103t-t17-1.github.io/tp/UserGuide.html#Summary_of_Key_Features), work is done on Google Document collaboratively. + + * Developer Guide: + * Converted the collaborative document to markdown plus cosmetic tweaks + (Refer to [Reposense link for documentation](https://nus-cs2103-ay2021s1.github.io/tp-dashboard/#breakdown=true&search=&sort=groupTitle&sortWithin=title&since=2020-08-14&until=2020-11-09&timeframe=commit&mergegroup=&groupSelect=groupByRepos&checkedFileTypes=docs~functional-code~test-code~other&tabOpen=true&tabType=authorship&tabAuthor=kunnan97&tabRepo=AY2021S1-CS2103T-T17-1%2Ftp%5Bmaster%5D&authorshipIsMergeGroup=false&authorshipFileTypes=docs)) + * Contributed to [Logic component section](https://ay2021s1-cs2103t-t17-1.github.io/tp/DeveloperGuide.html#Logic_component) and Logic class diagram. + * Contributed to [Dark/Light Mode implementation](https://ay2021s1-cs2103t-t17-1.github.io/tp/DeveloperGuide.html#Dark/Light_Mode), sequence and activity diagram. + +* **Community**: + * Number of PRs reviewed (with trivial review comments): 42 + * Reported 4 bugs and suggestions for other teams in PE-D diff --git a/docs/team/pongzers.md b/docs/team/pongzers.md new file mode 100644 index 00000000000..8fac0e0e140 --- /dev/null +++ b/docs/team/pongzers.md @@ -0,0 +1,37 @@ +--- +layout: page +title: Li Xupeng's Project Portfolio Page +--- + +## Project: MyMods + +MyMod is a desktop mod tracking application used for tracking mods in NUS. +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 SU modules. + * What it does: allows the user to SU a module to not include the module in CAP calculation. + * Justification: This feature improves the product significantly because a user can now easily SU modules. + * Highlights: This command made use of an implementation with data extracted from NUSMods API. + +* **Code contributed**: [RepoSense link](https://nus-cs2103-ay2021s1.github.io/tp-dashboard/#breakdown=true&search=&sort=groupTitle&sortWithin=title&since=2020-08-14&timeframe=commit&mergegroup=&groupSelect=groupByRepos&checkedFileTypes=docs~functional-code~test-code~other&tabOpen=true&tabType=authorship&tabAuthor=pongzers&tabRepo=AY2021S1-CS2103T-T17-1%2Ftp%5Bmaster%5D&authorshipIsMergeGroup=false&authorshipFileTypes=docs~functional-code~test-code~other) + +* **Project management**: + * Contributed and aided debugging of releases `v1.2` - `v1.4` (3 releases) on GitHub + +* **Enhancements to existing features**: + * Updated the GUI to display the semester the user is currently editing (Pull request [\#205](https://github.com/AY2021S1-CS2103T-T17-1/tp/pull/205)) + * Wrote additional tests for existing features to increase coverage by 4% (Pull requests [\#276](https://github.com/AY2021S1-CS2103T-T17-1/tp/pull/276), [\#281](https://github.com/AY2021S1-CS2103T-T17-1/tp/pull/281)) + + +* **Documentation**: + * User Guide: + * Added documentation for the features `list` and `add`. (No PR by me as we typed collectively in Google Docs and pushed by one person) + * Developer Guide: + * Added implementation feature of obtaining module information automatically. (No PR by me as we typed collectively in Google Docs and pushed by one person) + * Generated the skeleton of developer guide for team members to use. (No PR by me as we typed collectively in Google Docs and pushed by one person) + + +* **Tools**: + * Integrated data from a third-party API NUSMods into our app ([\#182](https://github.com/AY2021S1-CS2103T-T17-1/tp/pull/182)) diff --git a/docs/team/xyzhangg.md b/docs/team/xyzhangg.md new file mode 100644 index 00000000000..bf7de8d2773 --- /dev/null +++ b/docs/team/xyzhangg.md @@ -0,0 +1,40 @@ +--- +layout: page +title: Zhang Xin Yue's Project Portfolio Page +--- + +## Project: MyMods + +MyMods is a desktop mod tracking application used for tracking mods in NUS. +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 Progress command. + * What it does: Allows the user to track their progress towards their target CAP by calculating and displaying the average CAP required for their remaining modules. + * Justification: This feature helps the user to set a clear goal for their remaining modules and keeps them informed about whether their target CAP is achievable. + * Highlights: This enhancement works together with our other new feature: the ability to set a goal or target CAP, and it required an in-depth analysis of design alternatives. A side feature to calculate the number of MCs taken was added to aid the implementation of this command. + +* **New Feature**: Added the functionality to change semesters to Update command. + * What it does: Allows the user to shift a module to a different semester. + * Justification: This feature allows the user to change the semester of a module directly without having to delete it and add it in again. + * Highlights: This enhancement affects existing features and commands that are related to semester and features to be added in the future for the update command, hence it required an in-depth analysis of design alternatives. + +* **Enhancements to existing features**: + * Renamed Edit to Update and allows user to delete the grade of a module by leaving the grade parameter out when updating a module. (Pull requests [\#54](https://github.com/AY2021S1-CS2103T-T17-1/tp/pull/54), [\#119](https://github.com/AY2021S1-CS2103T-T17-1/tp/pull/119)) + * Modified CAP display to ensure it reflects the CAP correctly whenever changes are made to the module list. (Pull requests [\#61](https://github.com/AY2021S1-CS2103T-T17-1/tp/pull/61)) + * Updated the UI to display the semester for each module. (Pull requests [\#132](https://github.com/AY2021S1-CS2103T-T17-1/tp/pull/132)) + * Renamed AddressBook to GradeBook. (Pull requests [\#221](https://github.com/AY2021S1-CS2103T-T17-1/tp/pull/221)) + +* **Code contributed**: [RepoSense link](https://nus-cs2103-ay2021s1.github.io/tp-dashboard/#breakdown=true&search=xyzhangg&sort=groupTitle&sortWithin=title&since=2020-08-14&timeframe=commit&mergegroup=&groupSelect=groupByRepos&checkedFileTypes=docs~functional-code~test-code~other&tabOpen=true&tabType=authorship&tabAuthor=xyzhangg&tabRepo=AY2021S1-CS2103T-T17-1%2Ftp%5Bmaster%5D&authorshipIsMergeGroup=false&authorshipFileTypes=docs~functional-code~test-code) + +* **Documentation**: + * User Guide: + * Added documentation for the features `progress`, `help` and `exit`(No PR by me as we typed collectively in Google Docs and pushed by one person) + * Developer Guide: + * Added implementation details of the `progress` feature. (Pull requests [\#93](https://github.com/AY2021S1-CS2103T-T17-1/tp/pull/93), [\#257](https://github.com/AY2021S1-CS2103T-T17-1/tp/pull/257)) + * Added sequence diagram for Logic component (Pull requests [\#257](https://github.com/AY2021S1-CS2103T-T17-1/tp/pull/257)) + +* **Community**: + * PRs reviewed: 29 + * Reported bugs and suggestions for other teams during PE-D: 7 issues diff --git a/docs/team/zhaolingshan.md b/docs/team/zhaolingshan.md new file mode 100644 index 00000000000..e5cbfb78971 --- /dev/null +++ b/docs/team/zhaolingshan.md @@ -0,0 +1,53 @@ +--- +layout: page +title: Zhao Lingshan's Project Portfolio Page +--- + +## Project: MyMods + +MyMods is a desktop mod tracking application used for tracking mods in NUS. +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 start editing a semester. + * What it does: allows the user to start editing a particular semester one at a time. + The user can add, delete, update the grade or semester, and S/U modules in a semester only after the user starts that specific semester. + * Justification: This feature improves the product significantly because a user can edit the modules in a specific semester and keep track of the modules + he is taking in a specific semester, and the changes he made to them. It provides a convenient way to segregate the modules in different semesters to keep it organised and enhance readability. + * Highlights: This enhancement affects existing commands and commands to be added in the future. It required an in-depth analysis of design alternatives. The implementation too was challenging as it required changes to existing commands. + +* **New Feature**: Added the ability to stop editing a semester. + * What it does: allows the user to stop editing a particular semester one at a time. + The user cannot add, delete, update the grade or semester, and S/U modules in a semester after the user exits that specific semester. + * Justification: This feature improves the product significantly because a user can stop editing the modules in a specific semester which allows the user to navigate to and make changes to the modules in a different semester. + This allows users to make changes to the modules in different semesters. It provides a convenient way to segregate the modules in different semesters to keep it organised and enhance readability. + Once the user is done editing a specific semester, he will be brought back to the main list of modules. + * Highlights: This enhancement affects existing commands and commands to be added in the future. It required an in-depth analysis of design alternatives. The implementation too was challenging as it required changes to existing commands. + +* **New Feature**: Added the ability to automatically and instantly calculate and display the current CAP. + * What it does: calculates the CAP automatically after every modification the user makes including adding a module, updating the grade of a module, deleting a module and S/U-ing a module. + * Justification: This feature improves the product significantly because a user can view how each change he makes will affect the CAP and see an instantaneous change in the CAP without having to do any manual calculations. + * Highlights: This enhancement required an in-depth analysis of design alternatives. The implementation too was challenging as it required changes to the UI. + +* **Code contributed**: [RepoSense link](https://nus-cs2103-ay2021s1.github.io/tp-dashboard/#breakdown=true&search=&sort=groupTitle&sortWithin=title&since=2020-08-14&timeframe=commit&mergegroup=&groupSelect=groupByRepos&checkedFileTypes=docs~functional-code~test-code~other&tabOpen=true&tabType=authorship&zFR=false&tabAuthor=zhaolingshan&tabRepo=AY2021S1-CS2103T-T17-1%2Ftp%5Bmaster%5D&authorshipIsMergeGroup=false&authorshipFileTypes=docs~functional-code~test-code) + +* **Project management**: + * Contributed and aided debugging of releases `v1.2` - `v1.4` (3 releases) on GitHub + +* **Enhancements to existing features**: + * Edited `add` command to add a module with several parameters only after the user has started a semester (Pull request [\#52](https://github.com/AY2021S1-CS2103T-T17-1/tp/pull/52)) + * Sorted the main list of modules according to semester (Pull request [\#87](https://github.com/AY2021S1-CS2103T-T17-1/tp/pull/87)) + * Edited `done` command to omit user input of semester to prioritise fast typists (Pull request [\#96](https://github.com/AY2021S1-CS2103T-T17-1/tp/pull/96)) + * Updated and shortened the prefixes used to prioritise fast typists (Pull request [\#193](https://github.com/AY2021S1-CS2103T-T17-1/tp/pull/193)) + +* **Documentation**: + * User Guide: + * Added documentation for the features `delete`, `done` and `find` (No PR by me as we typed collectively in Google Docs and pushed by one person) + * Developer Guide: + * Added implementation details of the `start semester` feature (No PR by me as we typed collectively in Google Docs and pushed by one person) + * Edited the description and diagrams for the UI component (No PR by me as we typed collectively in Google Docs and pushed by one person) + +* **Community**: + * Number of PRs reviewed: 35 + * Reported 9 bugs and suggestions with in-depth explanations and detailed annotated screenshots for other teams in PE-D diff --git a/docs/tutorials/AddRemark.md b/docs/tutorials/AddRemark.md index 6907e29456c..16975b08bc3 100644 --- a/docs/tutorials/AddRemark.md +++ b/docs/tutorials/AddRemark.md @@ -5,7 +5,7 @@ title: "Tutorial: Adding a command" Let's walk you through the implementation of a new command — `remark`. -This command allows users of the AddressBook application to add optional remarks to people in their address book and edit it if required. The command should have the following format: +This command allows users of the AddressBook application to add optional remarks to people in their grade book and edit it if required. The command should have the following format: `remark INDEX r/REMARK` (e.g., `remark 2 r/Likes baseball`) @@ -16,19 +16,19 @@ We’ll assume that you have already set up the development environment as outli Looking in the `logic.command` package, you will notice that each existing command have their own class. All the commands inherit from the abstract class `Command` which means that they must override `execute()`. Each `Command` returns an instance of `CommandResult` upon success and `CommandResult#feedbackToUser` is printed to the `ResultDisplay`. -Let’s start by creating a new `RemarkCommand` class in the `src/main/java/seedu/address/logic/command` directory. +Let’s start by creating a new `RemarkCommand` class in the `src/main/java/seedu/grade/logic/command` directory. For now, let’s keep `RemarkCommand` as simple as possible and print some output. We accomplish that by returning a `CommandResult` with an accompanying message. **`RemarkCommand.java`:** ``` java -package seedu.address.logic.commands; +package seedu.grade.logic.commands; -import seedu.address.model.Model; +import seedu.grade.model.Model; /** - * Changes the remark of an existing person in the address book. + * Changes the remark of an existing module in the grade book. */ public class RemarkCommand extends Command { @@ -64,8 +64,8 @@ Following the convention in other commands, we add relevant messages as constant **`RemarkCommand.java`:** ``` java - public static final String MESSAGE_USAGE = COMMAND_WORD + ": Edits the remark of the person identified " - + "by the index number used in the last person listing. " + public static final String MESSAGE_USAGE = COMMAND_WORD + ": Edits the remark of the module identified " + + "by the index number used in the last module listing. " + "Existing remark will be overwritten by the input.\n" + "Parameters: INDEX (must be a positive integer) " + "r/ [REMARK]\n" @@ -89,7 +89,7 @@ Let’s change `RemarkCommand` to parse input from the user. We start by modifying the constructor of `RemarkCommand` to accept an `Index` and a `String`. While we are at it, let’s change the error message to echo the values. While this is not a replacement for tests, it is an obvious way to tell if our code is functioning as intended. ``` java -import static seedu.address.commons.util.CollectionUtil.requireAllNonNull; +import static seedu.grade.commons.util.CollectionUtil.requireAllNonNull; //... public class RemarkCommand extends Command { //... @@ -99,8 +99,8 @@ public class RemarkCommand extends Command { private final String remark; /** - * @param index of the person in the filtered person list to edit the remark - * @param remark of the person to be updated to + * @param index of the module in the filtered module list to edit the remark + * @param remark of the module to be updated to */ public RemarkCommand(Index index, String remark) { requireAllNonNull(index, remark); @@ -139,7 +139,7 @@ Your code should look something like [this](https://github.com/se-edu/addressboo Now let’s move on to writing a parser that will extract the index and remark from the input provided by the user. -Create a `RemarkCommandParser` class in the `seedu.address.logic.parser` package. The class must extend the `Parser` interface. +Create a `RemarkCommandParser` class in the `seedu.grade.logic.parser` package. The class must extend the `Parser` interface. ![The relationship between Parser and RemarkCommandParser](../images/add-remark/ParserInterface.png) @@ -222,11 +222,11 @@ If you are stuck, check out the sample ## Add `Remark` to the model -Now that we have all the information that we need, let’s lay the groundwork for propagating the remarks added into the in-memory storage of person data. We achieve that by working with the `Person` model. Each field in a Person is implemented as a separate class (e.g. a `Name` object represents the person’s name). That means we should add a `Remark` class so that we can use a `Remark` object to represent a remark given to a person. +Now that we have all the information that we need, let’s lay the groundwork for propagating the remarks added into the in-memory storage of module data. We achieve that by working with the `Person` model. Each field in a Person is implemented as a separate class (e.g. a `Name` object represents the module’s moduleName). That means we should add a `Remark` class so that we can use a `Remark` object to represent a remark given to a module. ### Add a new `Remark` class -Create a new `Remark` in `seedu.address.model.person`. Since a `Remark` is a field that is similar to `Address`, we can reuse a significant bit of code. +Create a new `Remark` in `seedu.grade.model.module`. Since a `Remark` is a field that is similar to `Address`, we can reuse a significant bit of code. A copy-paste and search-replace later, you should have something like [this](https://github.com/se-edu/addressbook-level3/commit/4516e099699baa9e2d51801bd26f016d812dedcc#diff-af2f075d24dfcd333876f0fbce321f25). Note how `Remark` has no constrains and thus does not require input validation. @@ -237,9 +237,9 @@ Let’s change `RemarkCommand` and `RemarkCommandParser` to use the new `Remark` ## Add a placeholder element for remark to the UI -Without getting too deep into `fxml`, let’s go on a 5 minute adventure to get some placeholder text to show up for each person. +Without getting too deep into `fxml`, let’s go on a 5 minute adventure to get some placeholder text to show up for each module. -Simply add the following to [`seedu.address.ui.PersonCard`](https://github.com/se-edu/addressbook-level3/commit/850b78879582f38accb05dd20c245963c65ea599#diff-0c6b6abcfac8c205e075294f25e851fe). +Simply add the following to [`seedu.grade.ui.ModuleCard`](https://github.com/se-edu/addressbook-level3/commit/850b78879582f38accb05dd20c245963c65ea599#diff-0c6b6abcfac8c205e075294f25e851fe). **`PersonCard.java`:** @@ -292,7 +292,7 @@ While the changes to code may be minimal, the test data will have to be updated
-:exclamation: You must delete AddressBook’s storage file located at `/data/addressbook.json` before running it! Not doing so will cause AddressBook to default to an empty address book! +:exclamation: You must delete AddressBook’s storage file located at `/data/addressbook.json` before running it! Not doing so will cause AddressBook to default to an empty grade book!
@@ -308,9 +308,9 @@ Just add [this one line of code!](https://github.com/se-edu/addressbook-level3/c **`PersonCard.java`:** ``` java -public PersonCard(Person person, int displayedIndex) { +public PersonCard(Person module, int displayedIndex) { //... - remark.setText(person.getRemark().value); + remark.setText(module.getRemark().value); } ``` @@ -340,23 +340,23 @@ save it with `Model#setPerson()`. throw new CommandException(Messages.MESSAGE_INVALID_PERSON_DISPLAYED_INDEX); } - Person personToEdit = lastShownList.get(index.getZeroBased()); - Person editedPerson = new Person(personToEdit.getName(), personToEdit.getPhone(), personToEdit.getEmail(), - personToEdit.getAddress(), remark, personToEdit.getTags()); + Person moduleToEdit = lastShownList.get(index.getZeroBased()); + Person editedModule = new Person(moduleToEdit.getName(), moduleToEdit.getPhone(), moduleToEdit.getEmail(), + moduleToEdit.getAddress(), remark, moduleToEdit.getTags()); - model.setPerson(personToEdit, editedPerson); + model.setPerson(moduleToEdit, editedModule); model.updateFilteredPersonList(PREDICATE_SHOW_ALL_PERSONS); - return new CommandResult(generateSuccessMessage(editedPerson)); + return new CommandResult(generateSuccessMessage(editedModule)); } /** * Generates a command execution success message based on whether the remark is added to or removed from - * {@code personToEdit}. + * {@code moduleToEdit}. */ - private String generateSuccessMessage(Person personToEdit) { + private String generateSuccessMessage(Person moduleToEdit) { String message = !remark.value.isEmpty() ? MESSAGE_ADD_REMARK_SUCCESS : MESSAGE_DELETE_REMARK_SUCCESS; - return String.format(message, personToEdit); + return String.format(message, moduleToEdit); } ``` @@ -383,7 +383,7 @@ Then, create a test for the `execute` method. ![Creating a test for `execute`.](../images/add-remark/CreateTest.png) -Following convention, let’s change the name of the generated method to `execute_addRemarkUnfilteredList_success`. +Following convention, let’s change the moduleName of the generated method to `execute_addRemarkUnfilteredList_success`. Let’s use the utility functions provided in `CommandTestUtil`. The functions ensure that commands produce the expected `CommandResult` and output the correct message. In this case, `CommandTestUtil#assertCommandSuccess` is the best fit as we are testing that a `RemarkCommand` will successfully add a `Remark`. diff --git a/docs/tutorials/RemovingFields.md b/docs/tutorials/RemovingFields.md index aa8e0baaad9..d6cdbeb06d1 100644 --- a/docs/tutorials/RemovingFields.md +++ b/docs/tutorials/RemovingFields.md @@ -9,7 +9,7 @@ title: "Tutorial: Removing Fields" When working on AddressBook, you will most likely find that some features and fields that are no longer necessary. In scenarios like this, you can consider refactoring the existing `Person` model to suit your use case. -In this tutorial, we’ll do exactly just that and remove the `address` field from `Person`. +In this tutorial, we’ll do exactly just that and remove the `grade` field from `Person`. * Table of Contents {:toc} @@ -20,7 +20,7 @@ Fortunately, IntelliJ IDEA provides a robust refactoring tool that can identify ### Assisted refactoring -The `address` field in `Person` is actually an instance of the `seedu.address.model.person.Address` class. Since removing the `Address` class will break the application, we start by identifying `Address`'s usages. This allows us to see code that depends on `Address` to function properly and edit them on a case-by-case basis. Right-click the `Address` class and select `Refactor` \> `Safe Delete` through the menu. +The `grade` field in `Person` is actually an instance of the `seedu.address.model.module.Gradeclass. Since removing the `Address` class will break the application, we start by identifying `Address`'s usages. This allows us to see code that depends on `Address` to function properly and edit them on a case-by-case basis. Right-click the `Address` class and select `Refactor` \> `Safe Delete` through the menu. ![Usages detected](../images/remove/UnsafeDelete.png) @@ -32,18 +32,18 @@ Remove usages of `Address` by performing `Safe Delete`s on each entry. You will Let’s try removing references to `Address` in `EditPersonDescriptor`. -1. Safe delete the field `address` in `EditPersonDescriptor`. +1. Safe delete the field `grade` in `EditPersonDescriptor`. 1. Select `Yes` when prompted to remove getters and setters. 1. Select `View Usages` again.
![UnsafeDeleteOnField](../images/remove/UnsafeDeleteOnField.png) -1. Remove the usages of `address` and select `Do refactor` when you are done. +1. Remove the usages of `grade` and select `Do refactor` when you are done.
- :bulb: **Tip:** Removing usages may result in errors. Exercise discretion and fix them. For example, removing the `address` field from the `Person` class will require you to modify its constructor. + :bulb: **Tip:** Removing usages may result in errors. Exercise discretion and fix them. For example, removing the `grade` field from the `Person` class will require you to modify its constructor.
1. Repeat the steps for the remaining usages of `Address` @@ -52,11 +52,11 @@ After you are done, verify that the application still works by compiling and run ### Manual refactoring -Unfortunately, there are usages of `Address` that IntelliJ IDEA cannot identify. You can find them by searching for instances of the word `address` in your code (`Edit` \> `Find` \> `Find in path`). +Unfortunately, there are usages of `Address` that IntelliJ IDEA cannot identify. You can find them by searching for instances of the word `grade` in your code (`Edit` \> `Find` \> `Find in path`). -Places of interest to look out for would be resources used by the application. `main/resources` contains images and `fxml` files used by the application and `test/resources` contains test data. For example, there is a `$address` in each `PersonCard` that has not been removed nor identified. +Places of interest to look out for would be resources used by the application. `main/resources` contains images and `fxml` files used by the application and `test/resources` contains test data. For example, there is a `$grade` in each `PersonCard` that has not been removed nor identified. -![$address](../images/remove/$address.png) +![$grade](../images/remove/$grade.png) A quick look at the `PersonCard` class and its `fxml` file quickly reveals why it slipped past the automated refactoring. @@ -65,7 +65,7 @@ A quick look at the `PersonCard` class and its `fxml` file quickly reveals why i ``` java ... @FXML -private Label address; +private Label grade; ... ``` @@ -74,7 +74,7 @@ private Label address; ``` xml ...