diff --git a/.github/workflows/gradle.yml b/.github/workflows/gradle.yml index 81267b247eb..458bb3bff75 100644 --- a/.github/workflows/gradle.yml +++ b/.github/workflows/gradle.yml @@ -44,3 +44,8 @@ jobs: directory: ${{ github.workspace }}/build/reports/jacoco/coverage files: coverage.xml fail_ci_if_error: false + + - name: Upload coverage reports to Codecov + uses: codecov/codecov-action@v3 + with: + token: ${{ secrets.CODECOV_TOKEN }} diff --git a/.gitignore b/.gitignore index 71c9194e8bd..ebb70b53e84 100644 --- a/.gitignore +++ b/.gitignore @@ -20,3 +20,10 @@ src/test/data/sandbox/ # MacOS custom attributes files created by Finder .DS_Store docs/_site/ + +# Bin files +bin/ + +# Local Gemfile +docs/Gemfile +docs/Gemfile.lock diff --git a/Alice Pauline's Progress Report.pdf b/Alice Pauline's Progress Report.pdf new file mode 100644 index 00000000000..7109611b016 Binary files /dev/null and b/Alice Pauline's Progress Report.pdf differ diff --git a/George Best's Progress Report.pdf b/George Best's Progress Report.pdf new file mode 100644 index 00000000000..5da4941730b Binary files /dev/null and b/George Best's Progress Report.pdf differ diff --git a/README.md b/README.md index 13f5c77403f..0a3ea9f4681 100644 --- a/README.md +++ b/README.md @@ -1,14 +1,15 @@ -[![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/AY2223S2-CS2103-W17-1/tp/workflows/Java%20CI/badge.svg)](https://github.com/AY2223S2-CS2103-W17-1/tp/actions) +[![codecov](https://codecov.io/gh/AY2223S2-CS2103-W17-1/tp/branch/master/graph/badge.svg?token=XXJ15FVPPS)](https://codecov.io/gh/AY2223S2-CS2103-W17-1/tp) ![Ui](docs/images/Ui.png) -* This is **a sample project for Software Engineering (SE) students**.
+* This is **a product for private Math tuition teachers**.
Example usages: - * as a starting point of a course project (as opposed to writing everything from scratch) - * as a case study -* The project simulates an ongoing software project for a desktop application (called _AddressBook_) used for managing contact details. - * It is **written in OOP fashion**. It provides a **reasonably well-written** code base **bigger** (around 6 KLoC) than what students usually write in beginner-level SE modules, without being overwhelmingly big. + * as an application to manage their student contact details and performance. +* The project simulates an ongoing software project for a desktop application (called _MATHUTORING_) used for managing student contact details and performance. + * It is **written in OOP fashion**. It provides a **reasonably well-written** code base based on the original project **AB3**. * It comes with a **reasonable level of user and developer documentation**. -* It is named `AddressBook Level 3` (`AB3` for short) because it was initially created as a part of a series of `AddressBook` projects (`Level 1`, `Level 2`, `Level 3` ...). -* For the detailed documentation of this project, see the **[Address Book Product Website](https://se-education.org/addressbook-level3)**. -* This project is a **part of the se-education.org** initiative. If you would like to contribute code to this project, see [se-education.org](https://se-education.org#https://se-education.org/#contributing) for more info. +* It is named `MATHUTORING v1.4` because it was initially created as a part of a series of `MATHUTORING` projects (`v1.1`, `v1.2`, `v1.3` ...). +* For the detailed documentation of this project, see the **[MATHUTORING Product Website](https://github.com/AY2223S2-CS2103-W17-1/tp)**. +* This project is based on the AddressBook-Level3 project created by the [SE-EDU initiative](https://se-education.org). + diff --git a/build.gradle b/build.gradle index 108397716bd..934bb046b3a 100644 --- a/build.gradle +++ b/build.gradle @@ -40,6 +40,10 @@ task coverage(type: JacocoReport) { } } +run { + enableAssertions = true +} + dependencies { String jUnitVersion = '5.4.0' String javaFxVersion = '11' @@ -60,13 +64,21 @@ dependencies { implementation group: 'com.fasterxml.jackson.core', name: 'jackson-databind', version: '2.7.0' implementation group: 'com.fasterxml.jackson.datatype', name: 'jackson-datatype-jsr310', version: '2.7.4' + implementation 'org.apache.pdfbox:pdfbox:2.0.27' + testImplementation group: 'org.junit.jupiter', name: 'junit-jupiter-api', version: jUnitVersion + testImplementation "org.mockito:mockito-core:3.+" + testImplementation "org.mockito:mockito-inline:4.2.0" testRuntimeOnly group: 'org.junit.jupiter', name: 'junit-jupiter-engine', version: jUnitVersion } shadowJar { - archiveFileName = 'addressbook.jar' + archiveFileName = 'mathutoring.jar' +} + +run { + enableAssertions = true } defaultTasks 'clean', 'test' diff --git a/data.json b/data.json new file mode 100644 index 00000000000..716dd8c6408 --- /dev/null +++ b/data.json @@ -0,0 +1,29 @@ +{ + "persons" : [ { + "name" : "Bernice Yu", + "phone" : "99272758", + "email" : "berniceyu@example.com", + "address" : "Blk 30 Lorong 3 Serangoon Gardens, #07-18", + "parentPhone" : "94597742", + "tagged" : [ "colleagues", "friends" ], + "taskList" : [ ], + "scores" : [ { + "label" : "midterm", + "value" : "99.8", + "date" : "2019-09-09" + }, { + "label" : "midterm", + "value" : "85.5", + "date" : "2020-02-01" + } ] + }, { + "name" : "Irfan Ibrahim", + "phone" : "92492021", + "email" : "irfan@example.com", + "address" : "Blk 47 Tampines Street 20, #17-35", + "parentPhone" : "88814569", + "tagged" : [ "classmates" ], + "taskList" : [ ], + "scores" : [ ] + } ] +} diff --git a/docs/AboutUs.md b/docs/AboutUs.md index 1c9514e966a..13fe2c58bb1 100644 --- a/docs/AboutUs.md +++ b/docs/AboutUs.md @@ -9,51 +9,52 @@ You can reach us at the email `seer[at]comp.nus.edu.sg` ## Project team -### John Doe +### Toh Xin Yi - + -[[homepage](http://www.comp.nus.edu.sg/~damithch)] -[[github](https://github.com/johndoe)] -[[portfolio](team/johndoe.md)] +[[github](https://github.com/toh-xinyi)] +[[portfolio](team/toh-xinyi.md)] -* Role: Project Advisor +* Role: Developer +* Responsibilities: In charge of Storage -### Jane Doe +### Gwyneth Guo Bai Ling - + -[[github](http://github.com/johndoe)] -[[portfolio](team/johndoe.md)] +[[github](http://github.com/gwynethguo)] +[[portfolio](team/gwynethguo.md)] -* Role: Team Lead -* Responsibilities: UI +* Role: Developer +* Responsibilities: In charge of Model -### Johnny Doe +### Li Yuxuan - + -[[github](http://github.com/johndoe)] [[portfolio](team/johndoe.md)] +[[github](http://github.com/carrieli1015)] +[[portfolio](team/carrieli1015.md)] * Role: Developer -* Responsibilities: Data +* Responsibilities: In charge of UI -### Jean Doe +### Qiu Qianhui - + -[[github](http://github.com/johndoe)] -[[portfolio](team/johndoe.md)] +[[github](http://github.com/qqh0828)] +[[portfolio](team/qqh0828.md)] * Role: Developer -* Responsibilities: Dev Ops + Threading +* Responsibilities: In charge of Logic -### James Doe +### Quek Jing Ling, Brian - + -[[github](http://github.com/johndoe)] -[[portfolio](team/johndoe.md)] +[[github](http://github.com/astraxq)] +[[portfolio](team/astraxq.md)] * Role: Developer -* Responsibilities: UI +* Responsibilities: In charge of UI diff --git a/docs/DevOps.md b/docs/DevOps.md index d2fd91a6001..b652b90b7fe 100644 --- a/docs/DevOps.md +++ b/docs/DevOps.md @@ -3,8 +3,12 @@ layout: page title: DevOps guide --- -* Table of Contents -{:toc} +## Table of Contents +* **[Build automation](#build-automation)** +* **[Continuous integration (CI)](#continuous-integration-ci)** +* **[Code coverage](#code-coverage)** +* **[Repository-wide checks](#repository-wide-checks)** +* **[Making a release](#making-a-release)** -------------------------------------------------------------------------------------------------------------------- diff --git a/docs/DeveloperGuide.md b/docs/DeveloperGuide.md index 46eae8ee565..533768af4a2 100644 --- a/docs/DeveloperGuide.md +++ b/docs/DeveloperGuide.md @@ -2,14 +2,34 @@ layout: page title: Developer Guide --- -* Table of Contents -{:toc} +## Table of Contents +* **[Acknowledgements](#acknowledgements)** +* **[Setting up, getting started](#setting-up-getting-started)** +* **[Design](#design)** + * **[Architecture](#architecture)** + * **[UI component](#ui-component)** + * **[Logic component](#logic-component)** + * **[Model component](#model-component)** + * [Task Model](#task-model) + * [UniqueScoreList Model](#uniquescorelist-model) + * **[Storage component](#storage-component)** + * **[Common classes](#common-classes)** +* **[Appendix: Requirements](#appendix-requirements)** + * **[Product scope](#product-scope)** + * **[User stories](#user-stories)** + * **[User cases](#use-cases)** + * **[Non-Functional Requirements](#non-functional-requirements)** + * **[Glossary](#glossary)** +* **[Appendix: Instructions for manual testing](#appendix-instructions-for-manual-testing)** +* **[Appendix: Effort](#appendix-effort)** +* **[Appendix: Planned Enhancements](#appendix-planned-enhancements)** -------------------------------------------------------------------------------------------------------------------- ## **Acknowledgements** -* {list here sources of all reused/adapted ideas, code, documentation, and third-party libraries -- include links to the original source as well} +* This project is based on the AddressBook-Level3 project created by the [SE-EDU initiative](https://se-education.org). +* Libraries used: [JavaFX](https://openjfx.io/), [Jackson](https://github.com/FasterXML/jackson), [JUnit5](https://github.com/junit-team/junit5), [Mockito](https://site.mockito.org/), [Apache PDFBox](https://pdfbox.apache.org/) -------------------------------------------------------------------------------------------------------------------- @@ -21,22 +41,16 @@ Refer to the guide [_Setting up and getting started_](SettingUp.md). ## **Design** -
- -:bulb: **Tip:** The `.puml` files used to create diagrams in this document can be found in the [diagrams](https://github.com/se-edu/addressbook-level3/tree/master/docs/diagrams/) folder. Refer to the [_PlantUML Tutorial_ at se-edu/guides](https://se-education.org/guides/tutorials/plantUml.html) to learn how to create and edit diagrams. -
- ### Architecture + - - -The ***Architecture Diagram*** given above explains the high-level design of the App. +The ***Architecture Diagram*** given above explains the high-level design of MATHUTORING. Given below is a quick overview of main components and how they interact with each other. **Main components of the architecture** -**`Main`** has two classes called [`Main`](https://github.com/se-edu/addressbook-level3/tree/master/src/main/java/seedu/address/Main.java) and [`MainApp`](https://github.com/se-edu/addressbook-level3/tree/master/src/main/java/seedu/address/MainApp.java). It is responsible for, +**`Main`** has two classes called [`Main`](https://github.com/AY2223S2-CS2103-W17-1/tp/blob/master/src/main/java/seedu/address/Main.java) and [`MainApp`](https://github.com/AY2223S2-CS2103-W17-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. @@ -54,274 +68,633 @@ The rest of the App consists of four components. The *Sequence Diagram* below shows how the components interact with each other for the scenario where the user issues the command `delete 1`. - + Each of the four main components (also shown in the diagram above), * defines its *API* in an `interface` with the same name as the Component. -* implements its functionality using a concrete `{Component Name}Manager` class (which follows the corresponding API `interface` mentioned in the previous point. +* implements its functionality using a concrete `{Component Name} Manager` class (which follows the corresponding API `interface` mentioned in the previous point. For example, the `Logic` component defines its API in the `Logic.java` interface and implements its functionality using the `LogicManager.java` class which follows the `Logic` interface. Other components interact with a given component through its interface rather than the concrete class (reason: to prevent outside component's being coupled to the implementation of a component), as illustrated in the (partial) class diagram below. - + The sections below give more details of each component. ### UI component -The **API** of this component is specified in [`Ui.java`](https://github.com/se-edu/addressbook-level3/tree/master/src/main/java/seedu/address/ui/Ui.java) +**API** : [`Ui.java`](https://github.com/AY2223S2-CS2103-W17-1/tp/blob/master/src/main/java/seedu/address/ui/Ui.java) + + -![Structure of the UI Component](images/UiClassDiagram.png) +More detailed Class diagram for Ui component: -The UI consists of a `MainWindow` that is made up of parts e.g.`CommandBox`, `ResultDisplay`, `PersonListPanel`, `StatusBarFooter` etc. All these, including the `MainWindow`, inherit from the abstract `UiPart` class which captures the commonalities between classes that represent parts of the visible GUI. + -The `UI` component uses the JavaFx UI framework. The layout of these UI parts are defined in matching `.fxml` files that are in the `src/main/resources/view` folder. For example, the layout of the [`MainWindow`](https://github.com/se-edu/addressbook-level3/tree/master/src/main/java/seedu/address/ui/MainWindow.java) is specified in [`MainWindow.fxml`](https://github.com/se-edu/addressbook-level3/tree/master/src/main/resources/view/MainWindow.fxml) +The UI consists of a MainWindow that is made up of different parts. +For instance, `CommandBox`, `ResultDisplay`, `StudentListPanel`, `ScoreListPanel`, +`TaskListPanel`, `StatusBarFooter`, `HelpWindow`, `ImportWindow`, `ExportWindow` and `ExportProgressWindow` etc. All theses, including the MainWindow, +inherit from the abstract UiPart class which captures the commonalities between +classes that represent parts of visible GUI. -The `UI` component, +The UI component uses the JavaFx UI framework. The layout of these UI +parts are defined in matching `.fxml` files that are in the `src/main/resources/view` +folder. For example, the layout of the `MainWindow` is specified in `MainWindow.fxml`. +The UI component, * executes user commands using the `Logic` component. -* listens for changes to `Model` data so that the UI can be updated with the modified data. -* keeps a reference to the `Logic` component, because the `UI` relies on the `Logic` to execute commands. -* depends on some classes in the `Model` component, as it displays `Person` object residing in the `Model`. +* listens for changes to `Model` data so that the UI can be +updated with the modified data. +* keeps a reference to the `Logic` component, because the UI relies on the `Logic` +to execute the commands. +* depends on some classes in the `Model` component, as it displays `Student` object +residing in the `Model`. ### Logic component -**API** : [`Logic.java`](https://github.com/se-edu/addressbook-level3/tree/master/src/main/java/seedu/address/logic/Logic.java) +**API** : [`Logic.java`](https://github.com/AY2223S2-CS2103-W17-1/tp/blob/master/src/main/java/seedu/address/logic/Logic.java) Here's a (partial) class diagram of the `Logic` component: - + How the `Logic` component works: -1. When `Logic` is called upon to execute a command, it uses the `AddressBookParser` class to parse the user command. -1. This results in a `Command` object (more precisely, an object of one of its subclasses e.g., `AddCommand`) which is executed by the `LogicManager`. -1. The command can communicate with the `Model` when it is executed (e.g. to add a person). -1. The result of the command execution is encapsulated as a `CommandResult` object which is returned back from `Logic`. +1. When `Logic` is called upon to execute a command, it uses the `MathutoringParser` class to parse the user command. +2. This results in a `Command` object (more precisely, an object of one of its subclasses e.g., `AddCommand`) which is executed by the `LogicManager`. +3. The command can communicate with the `Model` when it is executed (e.g. to add a student). +4. The result of the command execution is encapsulated as a `CommandResult` object which is returned back from `Logic`. The Sequence Diagram below illustrates the interactions within the `Logic` component for the `execute("delete 1")` API call. -![Interactions Inside the Logic Component for the `delete 1` Command](images/DeleteSequenceDiagram.png) +![Interactions Inside the Logic Component for the `delete 1` Command](images/DG-images/DeleteSequenceDiagram.png) -
:information_source: **Note:** The lifeline for `DeleteCommandParser` should end at the destroy marker (X) but due to a limitation of PlantUML, the lifeline reaches the end of diagram. +
+ +**Note:** The lifeline for `DeleteCommandParser` should end at the destroy marker (X) but due to a limitation of PlantUML, the lifeline reaches the end of diagram.
Here are the other classes in `Logic` (omitted from the class diagram above) that are used for parsing a user command: - + How the parsing works: -* When called upon to parse a user command, the `AddressBookParser` class creates an `XYZCommandParser` (`XYZ` is a placeholder for the specific command name e.g., `AddCommandParser`) which uses the other classes shown above to parse the user command and create a `XYZCommand` object (e.g., `AddCommand`) which the `AddressBookParser` returns back as a `Command` object. +* When called upon to parse a user command, the `MathutoringParser` class creates an `XYZCommandParser` (`XYZ` is a placeholder for the specific command name e.g., `AddCommandParser`) which uses the other classes shown above to parse the user command and create a `XYZCommand` object (e.g., `AddCommand`) which the `MathutoringParser` returns back as a `Command` object. * All `XYZCommandParser` classes (e.g., `AddCommandParser`, `DeleteCommandParser`, ...) inherit from the `Parser` interface so that they can be treated similarly where possible e.g, during testing. ### Model component -**API** : [`Model.java`](https://github.com/se-edu/addressbook-level3/tree/master/src/main/java/seedu/address/model/Model.java) - +**API** : [`Model.java`](https://github.com/AY2223S2-CS2103-W17-1/tp/blob/master/src/main/java/seedu/address/model/Model.java) + + The `Model` component, -* stores the address book data i.e., all `Person` objects (which are contained in a `UniquePersonList` object). -* stores the currently 'selected' `Person` objects (e.g., results of a search query) as a separate _filtered_ list which is exposed to outsiders as an unmodifiable `ObservableList` that can be 'observed' e.g. the UI can be bound to this list so that the UI automatically updates when the data in the list change. +* stores the mathutoring data i.e., all `Student` objects (which are contained in a `UniqueStudentList` object). +* stores the currently 'selected' `Student` objects (e.g., results of a search query) as a separate _filtered_ list which is exposed to outsiders as an unmodifiable `ObservableList` that can be 'observed' e.g. the UI can be bound to this list so that the UI automatically updates when the data in the list change. * stores a `UserPref` object that represents the user’s preferences. This is exposed to the outside as a `ReadOnlyUserPref` objects. * does not depend on any of the other three components (as the `Model` represents data entities of the domain, they should make sense on their own without depending on other components) -
:information_source: **Note:** An alternative (arguably, a more OOP) model is given below. It has a `Tag` list in the `AddressBook`, which `Person` references. This allows `AddressBook` to only require one `Tag` object per unique tag, instead of each `Person` needing their own `Tag` objects.
+
- +**Note:** An alternative (arguably, a more OOP) model is given below. It has a `Tag` list in the `Mathutoring`, which `Student` references. This allows `Mathutoring` to only require one `Tag` object per unique tag, instead of each `Student` needing their own `Tag` objects.
+ + +#### Task model +**API** : [`Task.java`](https://github.com/AY2223S2-CS2103-W17-1/tp/blob/master/src/main/java/seedu/address/model/task/Task.java) + + + +* A `Student` has a `UniqueTaskList` object which holds all their `Task` objects. +* Each `Task` object has a `TaskStatus` assigned to it and can be any of `INPROGRESS`, `LATE` or `COMPLETE`. +* The `creationDate` will be hidden from the user and only be used for sorting the `UniqueTaskList`. +* The `UniqueTaskList` is sorted according to `TaskStatus`, and if two tasks have the same `TaskStatus`, they will be compared using their `creationDate`. + +#### UniqueScoreList model +**API** : [`UniqueScoreList.java`](https://github.com/AY2223S2-CS2103-W17-1/tp/blob/master/src/main/java/seedu/address/model/score/UniqueScoreList.java) + + + +* A `Student` has only one `UniqueScoreList` object which holds all their `Score` objects. +* `UniqueScoreList` is a separate filtered list with recent score at front which is exposed to outsiders as an unmodifiable ObservableList that can be 'observed' e.g. the UI can be bound to this list so that the UI automatically updates when the data in the list change. +* There is an inner class `ScoreSummary` inside `UniqueScoreList` class which holds the summary of recent five scores. ### Storage component -**API** : [`Storage.java`](https://github.com/se-edu/addressbook-level3/tree/master/src/main/java/seedu/address/storage/Storage.java) +**API** : [`Storage.java`](https://github.com/AY2223S2-CS2103-W17-1/tp/blob/master/src/main/java/seedu/address/storage/Storage.java) - + The `Storage` component, -* can save both address book data and user preference data in json format, and read them back into corresponding objects. -* inherits from both `AddressBookStorage` and `UserPrefStorage`, which means it can be treated as either one (if only the functionality of only one is needed). +* can save both mathutoring data and user preference data in json format, and read them back into corresponding objects. +* inherits from both `MathutoringStorage` and `UserPrefStorage`, which means it can be treated as either one (if only the functionality of only one is needed). * depends on some classes in the `Model` component (because the `Storage` component's job is to save/retrieve objects that belong to the `Model`) ### Common classes -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** +## **Documentation, logging, testing, configuration, dev-ops** + +* [Documentation guide](Documentation.md) +* [Testing guide](Testing.md) +* [Logging guide](Logging.md) +* [Configuration guide](Configuration.md) +* [DevOps guide](DevOps.md) -This section describes some noteworthy details on how certain features are implemented. +-------------------------------------------------------------------------------------------------------------------- -### \[Proposed\] Undo/redo feature +## **Appendix: Requirements** -#### Proposed Implementation +### Product scope -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: +**Target user profile**: -* `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. +* Private Math tuition teachers +* Has a need to manage a number of students' contacts and performance +* Prefer desktop apps over other types +* Prefers typing to mouse interactions +* Is reasonably comfortable using CLI apps -These operations are exposed in the `Model` interface as `Model#commitAddressBook()`, `Model#undoAddressBook()` and `Model#redoAddressBook()` respectively. +**Value proposition**: -Given below is an example usage scenario and how the undo/redo mechanism behaves at each step. +Tutors tend to use multiple applications to keep track of their student's contact details and performance. MATHUTORING comes into a centralised desktop application with a contact management system to track students' contact details and performance by keeping student contact details, tasks, and scores which subsequently allows the tutors to plan their lesson plan for future lessons and overall view of their schedule for ease of planning. -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. -![UndoRedoState0](images/UndoRedoState0.png) +### User stories -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. +Priorities: High (must have) - `* * *`, Medium (nice to have) - `* *`, Low (unlikely to have) - `*` -![UndoRedoState1](images/UndoRedoState1.png) +| Priority | As a …​ | I want to …​ | So that I can…​ | +|----------|---------|-------------------------------------------------------------|------------------------------------------------------------------------------------------| +| `* * *` | user | see a list of my students | know who my students are and how many students I have | +| `* * *` | user | purge all current data | get rid of sample/experimental data I used for exploring the app | +| `* * *` | user | create my student contacts | add new students into my contact list | +| `* * *` | user | edit my student contacts | my contact list is more extensive/flexible | +| `* * *` | user | delete my student contacts | remove contacts of students that I don't teach anymore | +| `* * *` | user | use the help section | learn the available commands in the application | +| `* * *` | user | import my data | backup data and open in another device | +| `* * *` | user | export my data | load data into a new device | +| `* * *` | user | add / delete / mark student’s tasking(s) | keep track of the task(s) that assign to a student and identify what taskings are done/in progress/overdue | +| `* * *` | user | add / delete student’s score(s) | record down the student's score(s) | +| `* * *` | user | check the student’s taskings | understand how good the student is doing | +| `* * *` | user | check the student’s score(s) | understand the student's performance in school | +| `* * ` | user | filter my student contacts | easily find a group of students based on the tag given | +| `* * ` | user | generate a progress chart | keep track of the student's progress | +| `* * ` | user | extract students' progress report | show the parents their kids' performance | -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`. +### Use cases -![UndoRedoState2](images/UndoRedoState2.png) +(For all use cases below, the **System** is the `MATHUTORING` and the **Actor** is the `Tutor`, unless specified otherwise) -
: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`. +**1. Use case: Add a task** -
+**MSS** -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. +1. Tutor requests to list students. +2. MATHUTORING shows a list of students. +3. Tutor requests to add a task with a task name to a specific student in the list. +4. MATHUTORING creates the task with given task name, task status and creation date. -![UndoRedoState3](images/UndoRedoState3.png) + Use case ends. -
: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. +**Extensions** -
+* 2a. The list is empty. -The following sequence diagram shows how the undo operation works: + Use case ends. -![UndoSequenceDiagram](images/UndoSequenceDiagram.png) +* 3a. The given student index or task name is missing. -
: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. + * 3a1. MATHUTORING shows an error message. -
+ Use case resumes at step 2. -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. +* 3b. The given student index is invalid. -
: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. + * 3b1. MATHUTORING shows an error message. -
+ Use case ends. -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. +* 3c. The given command argument is invalid. -![UndoRedoState4](images/UndoRedoState4.png) + * 3c1. MATHUTORING shows an error message. -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. + Use case ends. -![UndoRedoState5](images/UndoRedoState5.png) +* 3d. The given task is a duplicate of a task already in the task list of the specific student. -The following activity diagram summarizes what happens when a user executes a new command: + * 3d1. MATHUTORING shows an error message. - + Use case ends. -#### Design considerations: +**2. Use case: Delete a task** -**Aspect: How undo & redo executes:** +**MSS** -* **Alternative 1 (current choice):** Saves the entire address book. - * Pros: Easy to implement. - * Cons: May have performance issues in terms of memory usage. +1. Tutor requests to list students. +2. MATHUTORING shows a list of students. +3. Tutor requests to delete a specific task from a specific student in the list. +4. MATHUTORING deletes the task from the task list of the specific student. -* **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. +Use case ends. -_{more aspects and alternatives to be added}_ +**Extensions** -### \[Proposed\] Data archiving +* 2a. The list is empty. -_{Explain here how the data archiving feature will be implemented}_ + Use case ends. +* 3a. The given student index or task index is missing. --------------------------------------------------------------------------------------------------------------------- + * 3a1. MATHUTORING shows an error message. -## **Documentation, logging, testing, configuration, dev-ops** + Use case resumes at step 2. -* [Documentation guide](Documentation.md) -* [Testing guide](Testing.md) -* [Logging guide](Logging.md) -* [Configuration guide](Configuration.md) -* [DevOps guide](DevOps.md) +* 3b. The given student index is invalid. --------------------------------------------------------------------------------------------------------------------- + * 3b1. MATHUTORING shows an error message. -## **Appendix: Requirements** + Use case ends. -### Product scope +* 3c. The given task index is invalid. -**Target user profile**: + * 3c1. MATHUTORING shows an error message. -* 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 + Use case ends. -**Value proposition**: manage contacts faster than a typical mouse/GUI driven app +**3. Use case: Mark a task as late** +**MSS** -### User stories +1. Tutor requests to list students. +2. MATHUTORING shows a list of students. +3. Tutor requests to mark a specific task from a specific student in the list as late. +4. MATHUTORING marks the task from the task list of the specific student as late. -Priorities: High (must have) - `* * *`, Medium (nice to have) - `* *`, Low (unlikely to have) - `*` +Use case ends. -| 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 | +**Extensions** -*{More to be added}* +* 2a. The list is empty. -### Use cases + Use case ends. + +* 3a. The given student index or task index is missing. + + * 3a1. MATHUTORING shows an error message. + + Use case resumes at step 2. -(For all use cases below, the **System** is the `AddressBook` and the **Actor** is the `user`, unless specified otherwise) +* 3b. The given student index is invalid. -**Use case: Delete a person** + * 3b1. MATHUTORING shows an error message. + + Use case ends. + +* 3c. The given task index is invalid. + + * 3c1. MATHUTORING shows an error message. + + Use case ends. + +**4. Use case: Add a score** **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. Tutor requests to add a score. +2. MATHUTORING creates the score with score label, score value and score date. +3. MATHUTORING stores the score to the score list storage. Use case ends. **Extensions** +* 1a. MATHUTORING detects that the score label, score value or score date is missing. + + * 1a1. MATHUTORING informs the tutor that there is missing element. + + Use case resumes at step 2. + +* 1b. MATHUTORING detects that score label, score value or score date has an invalid format. + + * 1b1. MATHUTORING informs the tutor that the form of new score is invalid. + + Use case ends. + +* 1c. MATHUTORING detects that the score has already exited. + + * 1c1. MATHUTORING informs the tutor that the score already exists. + + Use case ends. + +**5. Use case: Delete a score** + +**MSS** + +1. Tutor requests to list students. +2. MATHUTORING shows a list of students. +3. Tutor requests to check specific student. +4. MATHUTORING shows a list of scores for that student. +5. Tutor requests to delete a specific score of a specific student. +6. MATHUTORING deletes the score. + + Use case ends. + +**Extensions** + * 2a. The list is empty. Use case ends. -* 3a. The given index is invalid. +* 3a. The given student's index is invalid. - * 3a1. AddressBook shows an error message. + * 3a1. MATHUTORING informs the tutor that the index is invalid. Use case resumes at step 2. -*{More to be added}* +* 4a. The score list is empty. + + Use case ends. + +* 5a. The given student's index is invalid. + + * 5a1. MATHUTORING informs the tutor that the index is invalid. + + Use case resumes at step 1. + +* 5b. The given score's index is invalid. + + * 5b1. MATHUTORING informs the tutor that the index is invalid. + + Use case resumes at step 3. + +**6. Use case: Export a student's progress** + +**MSS** + +1. Tutor requests to export a student's progress. +2. MATHUTORING shows an export progress window. +3. Tutor requests to save the student's progress. +4. MATHUTORING shows a browse files window. +5. Tutor requests the directory and file name of the student's progress file. +6. MATHUTORING saves the file. + + Use case ends. + +**Extensions** + +* 5a. The given file name is invalid. + + * 5a1. File manager informs the tutor that the file name is invalid. + + Use case resumes at step 5. + +* 5b. A file with the exact same name and type exists and is currently being opened. + + * 5b1. MATHUTORING informs the tutor that the file cannot be saved because the file with the same name exists and is + currently being opened. + + Use case resumes at step 5. + +**7. Use case: Import application data via CLI** + +**MSS** + +1. Tutor requests to import application data. +2. MATHUTORING loads the data into the application. + + Use case ends. + +**Extensions** +* 1a. MATHUTORING detects a command format error. + + Use case resumes at step 1. + +* 1b. MATHUTORING detects the file does not follow the parsing format. + + Use case resumes at step 1. + +**8. Use case: Import application data via GUI** + +**MSS** + +1. Tutor requests to import application data. +2. MATHUTORING opens Import GUI window. +3. Tutor request to upload file. +4. MATHUTORING opens the OS file explorer. +5. Tutor selects a directory to upload the data. +6. MATHUTORING saves the file. +7. MATHUTORING loads the data into the application. + + Use case ends. + +**Extensions** +* 6a. MATHUTORING detects the file does not follow the parsing format. + + Use case resumes at step 3. + +**9. Use case: Export application data via CLI** + +**MSS** + +1. Tutor requests to export application data. +2. MATHUTORING saves the file. + + Use case ends. + +**Extensions** +* 1a. MATHUTORING detects a command format error. + + Use case resumes at step 1. + +**10. Use case: Export application data via GUI** + +**MSS** + +1. Tutor requests to export application data. +2. MATHUTORING opens the OS file explorer. +3. Tutor selects a directory to save the data. +4. MATHUTORING saves the file. + + Use case ends. + +**Extensions** +* 2a. File explorer closed by Tutor by mistake. + + Use case resumes at step 1. + +* 2b. File explorer closed by Tutor. + + Use case ends. + +**11. Use case: Export student's progress via CLI** + +**MSS** + +1. Tutor requests to export student's progress. +2. MATHUTORING saves the file. + + Use case ends. + +**Extensions** +* 1a. MATHUTORING detects a command format error. + + Use case resumes at step 1. + +* 1b. MATHUTORING detects that a file with the exact same name and type exists in the selected directory and is currently being opened. + + Use case ends. + +**12. Use case: Export student's progress via GUI** + +**MSS** + +1. Tutor requests to export student's progress. +2. MATHUTORING shows an export progress window. +3. MATHUTORING opens the OS file explorer. +4. Tutor selects a directory and specifies the file name to save the PDF file. +5. MATHUTORING saves the file. + + Use case ends. + +**Extensions** +* 2a. Export progress window closed by Tutor by mistake. + + Use case ends. + +* 2b. Export progress window closed by Tutor by mistake. + + Use case ends. + +* 3a. File explorer closed by Tutor by mistake. + + Use case resumes at step 2. + +* 3b. File explorer closed by Tutor. + + Use case resumes at step 2. + +* 4a. File name specified is invalid. + + * 4a1. File explorer informs the tutor that the file name is invalid. + + Use case resumes at step 2. +* 4b. A file with the exact same name and type exists in the selected directory and is currently being opened. + + * 4b1. MATHUTORING informs the tutor that the file cannot be saved due to a file with the same name and type in the same directory is being opened. + + Use case ends. + +**13. Use case: Switch panel via CLI** + +**MSS** + +1. Tutor requests to switch panel. +2. MATHUTORING switch the panel. + + Use case ends. + +**Extensions** +* 1a. The given command is invalid. + + * 1a1. MATHUTORING shows an error message. + + Use case resumes at step 1. + +**14. Use case: Switch panel via GUI** + +**MSS** + +1. Tutor requests to switch panel. + + Use case ends. + +**Extensions** +* 1a. GUI not able to render. + + Use case ends. + +**15. Use case: Filter student list by student tag/s** + +**MSS** + +1. Tutor requests to filter the student/s by student tag/s. +2. MATHUTORING shows the filtered result. + + Use case ends. + +**Extensions** + +* 1a. The given command is invalid. + + * 1a1. MATHUTORING shows an error message. + + Use case resumes at step 1. + +* 1b. The given command argument(s) are invalid. + + * 1b1. MATHUTORING shows an error message. + + Tutor case resumes at step 1. + +**16. Use case: Check a student** + +**MSS** + +1. Tutor requests to list students. + +2. MATHUTORING shows a list of students. + +3. Tutor requests to check a student. + +2. MATHUTORING shows the repsective student's task list and score list. + + Use case ends. + +**Extensions** +* 2a. The student list is empty. + + Use case ends. + +* 3a. The given command is invalid. + + * 3a1. MATHUTORING shows an error message. + + Use case resumes at step 2. + +* 3b. The given index is invalid. + + * 3b1. MATHUTORING shows an error message. + + Use case resumes at step 2. + ### 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. +2. Should be able to hold up to 1000 students' information without a noticeable sluggishness in performance for typical usage. 3. A user with above average typing speed for regular English text (i.e. not code, not system admin commands) should be able to accomplish most of the tasks faster using commands than using the mouse. - -*{More to be added}* +4. The application should work on both 32-bit and 64-bit environments. +5. The application should respond within 3 seconds. +6. The user interface should be intuitive enough for users who are not IT-savvy. +7. The product is free of charge. ### Glossary * **Mainstream OS**: Windows, Linux, Unix, OS-X -* **Private contact detail**: A contact detail that is not meant to be shared with others +* **Tutors**: Private math tuition teachers that will be using the application +* **Students' progress**: For our current version, the progress of a student is tracked through +the number of tasks the student has completed +* **Students' performance**: For our current version, the performance of a student is tracked through a view +of the student's scores as well as a progress chart of the latest 5 scores. +* **Index**: The number of the item shown beside its name, on the list being referred to (e.g. "index of student" refers to the index number of the student (shown beside the student's name) + in the student list shown in the application) -------------------------------------------------------------------------------------------------------------------- @@ -329,7 +702,7 @@ Priorities: High (must have) - `* * *`, Medium (nice to have) - `* *`, Low (unli Given below are instructions to test the app manually. -
:information_source: **Note:** These instructions only provide a starting point for testers to work on; +
:information_source: Note: These instructions only provide a starting point for testers to work on; testers are expected to do more *exploratory* testing.
@@ -339,39 +712,383 @@ testers are expected to do more *exploratory* testing. 1. Initial launch 1. Download the jar file and copy into an empty folder + 2. Double-click the jar file
+ Expected: Shows the GUI with a set of sample students. The window size may not be optimum. - 1. Double-click the jar file Expected: Shows the GUI with a set of sample contacts. The window size may not be optimum. - -1. Saving window preferences +2. Saving window preferences 1. Resize the window to an optimum size. Move the window to a different location. Close the window. + 2. Re-launch the app by double-clicking the jar file.
+ Expected: The most recent window size and location is retained. + +3. Typing `exit` into the command box + 1. Type `exit` in the command box.
+ Expected: The application window closes + +### Adding a task for a student + +1. Adding a task for a student in the student list when the student is being checked + + 1. Prerequisites: Check a student using `check` command. + + 2. Test case: `addtask x t/Complete Math Exercise` (where x is the index of the student being checked)
+ Expected: The task is added to the task list of the student. Student's name and details of the added task shown in the status message. + The displayed task list of the checked student is updated with the added task. + +2. Adding a task for a student in the student list when the student is not being checked + + 1. Prerequisites: Student with index x is not being checked. + + 2. Test case: `addtask x t/Complete Math Exercise` (where x is the index of student not being checked)
+ Expected: The task in added to the task list of the student. Student's name and details of the added task shown in the status message. + The displayed task list is not updated since the student is not being checked. + +### Deleting a task for a student - 1. Re-launch the app by double-clicking the jar file.
- Expected: The most recent window size and location is retained. +1. Deleting a task for a student in the student list when the student is being checked -1. _{ more test cases …​ }_ + 1. Prerequisites: Check a student with index x using `check` command. Checked student have one or more tasks. + + 2. Test case: `deletetask x 1`
+ Expected: The first task is deleted from the task list of the checked student. Student's name and details of the deleted task shown in the status message. + The deleted task is removed from the displayed task list of the checked student. + + 3. Test case: `deletetask x 0` + Expected: No task is deleted from the task list of the checked student. Error details shown in the status message. + + 4. Test case: Other incorrect delete commands to try:`deletetask`, `deletetask x`, `deletetask x y`, `...` (where y is larger than the checked student's task list size)
+ Expected: Similar to previous. -### Deleting a person +### Marking a task of a student -1. Deleting a person while all persons are being shown +1. Marking a task of a student as late, in progress or complete - 1. Prerequisites: List all persons using the `list` command. Multiple persons in the list. + 1. Prerequisites: Check a student with index x using `check` command. Checked student have one or more tasks. + + 2. Test case: `markinprogress x 1`
+ Expected: The first task in the task list of the checked student is marked as in progress. Student's name and details of the marked task shown in the status message. + The symbol representing the status of the task selected to be marked is yellow. - 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. + 3. Test case: `marklate x 1`
+ Expected: The first task in the task list of the checked student is marked as late. Student's name and details of the marked task shown in the status message. + The symbol representing the status of the task selected to be marked is red. - 1. Test case: `delete 0`
- Expected: No person is deleted. Error details shown in the status message. Status bar remains the same. + 4. Test case: `markcomplete x 1`
+ Expected: The first task in the task list of the checked student is marked as complete. Student's name and details of the marked task shown in the status message. + The symbol representing the status of the task selected to be marked is green. - 1. Other incorrect delete commands to try: `delete`, `delete x`, `...` (where x is larger than the list size)
+ 5. Test case: `markinprogress x 0`, `marklate x 0` or `markcomplete x 0` + Expected: No task in the task list of the checked student is marked. Error details shown in the status message. + + 6. Test case: Other incorrect delete commands to try:`markinprogress`, `marklate x`, `markcomplete x y`, `...` (where y is larger than the checked student's task list size)
+ Expected: Similar to previous. + +### Adding a score for a student + +1. Adding a score which is one of the recent five scores for a student in the student list when the student is being checked + + 1. Prerequisites: Check a student using `check` command. + + 2. Test case: `addscore x l/Math Miderm Paper v/96 d/2022-12-07` (where x is the index of the student being checked)
+ Expected: The score is added to the score list of the student and is being placed by date. + If it is a recent score, it will be shown at the front, otherwise, in the middle based on the date. + Score chart and score table statistic summary will be updated accordingly. + Student's name and details of the added score shown in the status message. + The displayed score list of the checked student is updated with the added score. + +2. Adding a score which is not one of the recent five scores for a student in the student list when the student is being checked + + 1. Prerequisites: Check a student using `check` command. + + 2. Test case: `addscore x l/Math Miderm Paper v/96 d/2022-12-07` (where x is the index of the student being checked)
+ Expected: The score is added to the score list of the student and is being placed by date. + Since it is not a recent five scores, it will be shown in the middle or at back based on the date. + Score chart and score table statistic summary will remain the same. + Student's name and details of the added score shown in the status message. + The displayed score list of the checked student is updated with the added score. + +3. Adding a score for a student in the student list when the student is not being checked. + + 1. Prerequisites: Student with index x is not being checked. + + 2. Test case: `addscore x l/Math Miderm Paper v/96 d/2022-12-07` (where x is the index of student not being checked)
+ Expected: The score in added to the score list of the student and is being placed by date. + Student's name and details of the added score shown in the status message. + The displayed score list is not updated since the student is not being checked. + +### Deleting a score for a student + +1. Deleting a score which is one of the recent five scores for a student in the student list when the student is being checked + + 1. Prerequisites: Check a student with index x using `check` command. Checked student have one or more scores. + + 2. Test case: `deletescore x 1` (where x is the index of the student being checked)
+ Expected: The first score is deleted from the score list of the checked student. + Since it is one of the five recent scores, score chart and score table statistic summary will be updated accordingly. + Student's name and details of the deleted score shown in the status message. + The deleted score is removed from the displayed score list of the checked student. + + 3. Test case: `deletescore x 0` + Expected: No score is deleted from the score list of the checked student. Error details shown in the status message. + + 4. Test case: Other incorrect delete commands to try: `deletescore`, `deletescore x`, `deletescore x y`, `...` (where y is larger than the checked student's score list size)
Expected: Similar to previous. -1. _{ more test cases …​ }_ +2. Deleting a score which is not one of the recent five scores for a student in the student list when the student is being checked + + 1. Prerequisites: Check a student with index x using `check` command. Checked student have one or more scores. + + 2. Test case: `deletescore x 6` (where x is the index of the student being checked)
+ Expected: The sixth score is deleted from the score list of the checked student. + Since it is not one of the five recent scores, score chart and score table statistic summary will remain the same. + Student's name and details of the deleted score shown in the status message. + The deleted score is removed from the displayed score list of the checked student. + +### Checking a student + +1. Checking a student for his/her task list and score list + + 1. Test case: `check x 1`
+ Expected: The first student in the student list will be checked. Student's task list and score list will then be displayed on the right side of the windows. + + 2. Test case: `check x 0`
+ Expected: No student will be checked, the task list and score list will not be updated. Error details shown in the status message. + + 3. Test case: `check x -10`
+ Expected: No student will be checked, the task list and score list will not be updated. Error details shown in the status message. + + 4. Test case: Other incorrect check commands to try: `check`, `check x`, `check x y`, `...` (where y is larger than the checked student's task list size)
+ Expected: Similar to previous. + +2. Check a student for his/her task list and score list after filter + + 1. Prerequisites: Filter the student list with one or more keywords k using `filter` command. + Expected: Similar to checking a student for his/her task list and score list, just that the check command is now working on the filtered student list produced by the filter command. + +3. Check a student for his/her task list and score list after find + + 1. Prerequisites: Check a student with index x using `check` command. Checked student have one or more tasks. + Expected: Similar to checking a student for his/her task list and score list, just that the check command is now working on the filtered student list prodcued by the find command. + +### Filtering student list + +1. Filtering out a group of students based on the keyword/s given + + 1. Test case: `filter x primary`
+ Expected: All students that has `primary` tag will be filtered out. + + 2. Test case: `filter x primary secondary`
+ Expected: All students that has `primary` or `secondary` or both tag will be filtered out. + + 3. Test case: Other incorrect check commands to try: `filter`, `filter x`, `...` + Expected: The student list will not be filtered. Error details shown in the status message. + +### Switching between score text panel and score chart panel + +1. Switching between score text panel and score chart panel using CLI + + 1. Test case: `switch`
+ Expected: The panel will be switched. + +2. Switching between score text panel and score chart panel through mouse click + + 1. Test case: Click on either the "text" or "chart" tab under score list
+ Expected: The panel will be switched. + +### Exporting out student(s) data + +1. Exporting student data using CLI + 1. Test case (Windows): `export p/data` + Expected: `data` directory stored in the home folder containing the `data.json` file. + + 2. Test case (Mac): `export p/data` + Expected: `data` directory stored in the home folder containing the `data.json` file. + +2. Exporting student data using GUI + + 1. Test case: Click on the `File` Menu on the top left, followed by `Export`. Subsequently select a folder directory to export on then after click the export button. + Expected: `data.json` should appear in the folder you have selected. + +### Importing in student(s) data + +1. Importing student data using CLI + 1. Test case (Windows): `import p/data\data.json` + Expected: New dataset should be reflected in the application under Student List. Tasklist and Scorelist panels should be resetted as well. + + 2. Test case (Mac): `import p/data/data.json` + Expected: New dataset should be reflected in the application under Student List. Tasklist and Scorelist panels should be resetted as well. + +2. Importing student data using GUI + + 1. Test case: Click on the `File` Menu on the top left, followed by `Import`. Subsequently select the `data.json` from the file explorer **OR** drag and drop the file used to import in then after click the import button. + Expected: New dataset should be reflected in the application under Student List. Tasklist and Scorelist panels should be resetted as well. + +### Exporting a student's progress + +1. Exporting a student's progress using CLI + + 1. Test case: `exportp x` (where x is the index of the student being checked)
+ Expected: The student's progress will be exported into a PDF file in the default directory: + `/data`. + + 2. Test case: `exportp x p/` (where x is the index of the student being checked)
+ Expected: The student's progress will be exported into a PDF file in the ``. + + 3. Test case: Other incorrect check commands to try: `exportp`, `...`
+ Expected: The student's progress will not be exported. Error details shown in the status message of export progress window. + +2. Exporting a student's progress through mouse click + + 1. Test case: Click on the "Export Student's Progress" button in the student card. An export progress window will pop up. Click the "Click to select folder" button to select a folder to export the PDF file. Click the "Save" button to save the file.
+ Expected: The student's progress will be exported in the selected folder using the default file name `'s Progress Report.pdf`. + + 2. Test case: Click on the "Export Student's Progress" button in the student card. An export progress window will pop up. Click the "Click to select folder" button to select a folder to export the PDF file. Change the file name. Click the "Save" button to save the file.
+ Expected: The student's progress will be exported in the selected folder using the specified file name. + + 3. Test case: Click on the "Export Student's Progress" button in the student card. An export progress window will pop up. Click the "Click to select folder" button to select a folder to export the PDF file. Change to an invalid file name. Click the "Save" button to save the file.
+ Expected: The student's progress will not be exported. Error details shown in the status message of export progress window. ### Saving data +The data will be automatically saved by MATHUTORING. + +-------------------------------------------------------------------------------------------------------------------- + +## **Appendix: Effort** + +### Difficulty level + +This is the first time our team has worked on a Brownfield project where the AB3 codebase was the largest we have encountered in our careers. At the beginning, everyone was overwhelmed by the sudden increase in the number of classes compared to our previous projects, including our most recent project (referred to as "IP"). It took us quite a while to slowly digest the purpose of each class. Additionally, for most of us, this is one of the first projects where we have had to collaborate with team members using version control tools such as Github or SourceTree. + +### Challenges faced + +We faced several challenges when we were working on this application, the following are some examples and not limited to: + +* As we lack experience in working with the pre-existing codebase, and AB3 is a relatively large project that we did not encounter before, +we had to take some time to learn from how AB3 works, such as how the user input is handled by AB3. +* Since we are relatively new to JavaFx, we also had to spend quite some time looking at the JavaFx library and learning how to use some +specific structures when designing the GUI. +* We also had to spend time searching CSS format in order to tweak the GUI to meet our requirements. +* Thinking how to design the structure of our application based on existing AB3 structure to make it follow Object-oriented programming. +* Making use of a new library to export PDF files. + +### Effort required + +As a result, the development of this application required a significant amount of effort due to the challenges mentioned above where we have to: + +* Debugging and looking up on both Java and JavaFX documentations. +* Researching on the usage of the new library (PDFBox). +* Reading on guides such as tweaking the GUI to fulfil our requirements and an overall better user experience (Drag-and-Drop/CSS). + +### Achievements + +We were able to produce a complete application that fulfills our user requirements as well as overcame the challenges we have faced. With MATHUTORING, private Math tuition teachers can: + +* Manage student contact details and track their performance with task and score records. +* View score charts and statistics to easily evaluate student progress. +* Generate PDF reports containing a student's tasks and scores for easy sharing. +* Export and import data to easily transfer to a new device. + +-------------------------------------------------------------------------------------------------------------------- + +## **Appendix: Planned Enhancements** + +### Solutions proposed for known feature flaws + +Listed are some feature flaws that were found in the current implementation of MATHUTORING. To improve the features of +future implementations, some solutions have been provided. + +#### 1. Students with the same name are not allowed + +The reason why we do not allow any student to have the same name is to avoid potential confusion. Although the user will +still be able to distinguish them by checking their personal information (e.g. their email, their address etc.), it would +be more straight forward to see a difference in name, i.e. Jason 1 and Jason 2.
+Nevertheless, we should consider to allow student to have the same name. + +**Solution proposed:** + +* Instead of not allowing students to have the same name, we do not allow any students to have both the same name and the + same email. + + +#### 2. Numeric student names are allowed + +Currently, student names can be numeric. i.e. student name can be "1". After some research we found out that most countries in the world do not allow for purely numeric name. + +**Solution proposed:** + +* Alter the behavior to only accept alphanumeric or alphabetic names +* Change the name regex to `[\\p{Alnum}]*[a-zA-Z][\\p{Alnum} ]*` + + +#### 3. Window does not reopen after it is minimized + +After help/export/import window is minimized, clicking help/export/import on the top menu will not automatically show +the window again. + +**Solution proposed:** + +* Similarly to how ```getRoot().isShowing()``` is used to check if the window is shown, there is also a function called +```getRoot().isIconified()``` to check whether the window is minimised (returns ```true``` if minimised). +We can then return ```getRoot().setIconified(false)``` to restore the window to its previous state. + + +#### 4. Exams are not allowed to be on the same date + +The aim of the score list is to keep track of a student's recent performance trend (especially the chart). +If the majority of the exams are conducted on the same date, it defeats our purpose of having the score records.
+However, it is a reasonable assumption that more than one exam is conducted on the same date. + +**Solution proposed:** + +* Allow at most five exams on the same date. + + +#### 5. Score table being cut after resizing the application window + +This problem might happen after user resizes the application window, which can result in the horizontal scroll bar covering +part of the displayed score table.
+**Suggestion to be able to view the entire table:** Try to enlarge the window size, or click on the table and scroll up and down. + +**Solution proposed:** + +* Although the entire table should be able to be seen by the user after following the above suggestion, it may still hinder the user. +* The main reason the table is cut is due to the usage of JavaFX TableView. By default, it comes with a scrollbar and is relatively hard to customize. +* To resolve the feature flaw, JavaFX label will be used to construct the table with CSS instead of using the JavaFX TableView. + + +#### 6. Edit the tags will overwrite the whole list of tags + +* Currently, if the user wants to add tags to students in the list, they can only use `edit` command and will need to input all existing tags along with the new tag. +* Also, if the user wants to edit a specific tag, they will also be required to input all existing tags along with the one they want to edit. +* There are currently no delete operations for tags. +* Without these operations, it is very hard to manage tags since the only way to do it is by using the `edit` command which is deteriorates the user experience. + +**Solution proposed:** + +* To solve this issue, at least two more commands can be created which are `addtag` and `deletetag`. +* With these new commands, the user will no longer be required to input the existing tags when adding a new tag. + +#### 7. Inconsistency in score color in Score Chart and PDF file + +There is an inconsistency for score color between score chart and PDF: +* Score chart: + * Green color is used to indicate score values that are greater than or equal to 80. + * Yellow color is used to indicate score values that are greater than or equal to 50. + * Red color is used to indicate score values that are smaller than 50. +* PDF: + * Green color is used to indicate score values of 100. + * Yellow color is used to indicate score values that are smaller than 80. + * Red color is used to indicate score values that are smaller than 50. + +**Solution proposed:** + +* To solve this issue, the criteria for the score color in the PDF file can be changed to follow the criteria of score color in the score chart. + + +#### 8. Change the tags of the sample data -1. Dealing with missing/corrupted data files +Currently, the sample data contains tags, like `colleagues` and `friends`, that do not really fit the purpose of our application. - 1. _{explain how to simulate a missing/corrupted file, and the expected behavior}_ +**Solution proposed:** -1. _{ more test cases …​ }_ +* To solve this issue, the tag can be changed to grade (primary, secondary, etc.) and gender. diff --git a/docs/Gemfile.lock b/docs/Gemfile.lock index 72767f00fd9..6c05accd779 100644 --- a/docs/Gemfile.lock +++ b/docs/Gemfile.lock @@ -242,6 +242,7 @@ GEM tzinfo (1.2.10) thread_safe (~> 0.1) unicode-display_width (1.8.0) + wdm (0.1.1) zeitwerk (2.6.1) PLATFORMS @@ -251,6 +252,7 @@ PLATFORMS DEPENDENCIES github-pages jekyll + wdm (~> 0.1.0) BUNDLED WITH 2.1.4 diff --git a/docs/SettingUp.md b/docs/SettingUp.md index 275445bd551..840e705af15 100644 --- a/docs/SettingUp.md +++ b/docs/SettingUp.md @@ -3,15 +3,15 @@ layout: page title: Setting up and getting started --- -* Table of Contents -{:toc} - +## Table of Contents +* **[Setting up the project in your computer](#setting-up-the-project-in-your-computer)** +* **[Before writing code](#before-writing-code)** -------------------------------------------------------------------------------------------------------------------- ## Setting up the project in your computer -
:exclamation: **Caution:** +**:exclamation: Caution:**
Follow the steps in the following guide precisely. Things will not work out if you deviate in some steps.
@@ -34,22 +34,15 @@ If you plan to use Intellij IDEA (highly recommended): If using IDEA, follow the guide [_[se-edu/guides] IDEA: Configuring the code style_](https://se-education.org/guides/tutorials/intellijCodeStyle.html) to set up IDEA's coding style to match ours. -
:bulb: **Tip:** + **:bulb: Tips:**
Optionally, you can follow the guide [_[se-edu/guides] Using Checkstyle_](https://se-education.org/guides/tutorials/checkstyle.html) to find how to use the CheckStyle within IDEA e.g., to report problems _as_ you write code.
-1. **Set up CI** +2. **Set up CI** This project comes with a GitHub Actions config files (in `.github/workflows` folder). When GitHub detects those files, it will run the CI for your project automatically at each push to the `master` branch or to any PR. No set up required. -1. **Learn the design** - - When you are ready to start coding, we recommend that you get some sense of the overall design by reading about [AddressBook’s architecture](DeveloperGuide.md#architecture). - -1. **Do the tutorials** - These tutorials will help you get acquainted with the codebase. +3. **Learn the design** - * [Tracing code](tutorials/TracingCode.md) - * [Adding a new command](tutorials/AddRemark.md) - * [Removing fields](tutorials/RemovingFields.md) + When you are ready to start coding, we recommend that you get some sense of the overall design by reading about [MATHUTORING’s architecture](DeveloperGuide.md#architecture). diff --git a/docs/Testing.md b/docs/Testing.md index 8a99e82438a..f907ea0c444 100644 --- a/docs/Testing.md +++ b/docs/Testing.md @@ -3,8 +3,9 @@ layout: page title: Testing guide --- -* Table of Contents -{:toc} +## Table of Contents +* **[Running tests](#running-tests)** +* **[Types of tests](#types-of-tests)** -------------------------------------------------------------------------------------------------------------------- @@ -19,7 +20,7 @@ There are two ways to run tests. * **Method 2: Using Gradle** * Open a console and run the command `gradlew clean test` (Mac/Linux: `./gradlew clean test`) -
:link: **Link**: Read [this Gradle Tutorial from the se-edu/guides](https://se-education.org/guides/tutorials/gradle.html) to learn more about using Gradle. +**:link: Link:** Read [_[se-edu/guides] Gradle Tutorial_](https://se-education.org/guides/tutorials/gradle.html) to learn more about using Gradle.
-------------------------------------------------------------------------------------------------------------------- @@ -32,5 +33,5 @@ This project has three types of tests: e.g. `seedu.address.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` -1. Hybrids of unit and integration tests. These test are checking multiple code units as well as how the are connected together.
+1. Hybrids of unit and integration tests. These test are checking multiple code units as well as how they are connected together.
e.g. `seedu.address.logic.LogicManagerTest` diff --git a/docs/UserGuide.md b/docs/UserGuide.md index e7df68b01ea..9b70893a8e5 100644 --- a/docs/UserGuide.md +++ b/docs/UserGuide.md @@ -3,42 +3,242 @@ layout: page title: User Guide --- -AddressBook Level 3 (AB3) is a **desktop app for managing contacts, optimized for use via a Command Line Interface** (CLI) while still having the benefits of a Graphical User Interface (GUI). If you can type fast, AB3 can get your contact management tasks done faster than traditional GUI apps. +## Table of Contents +* **[Overview](#overview)** +* **[Quick start](#quick-start)** +* **[User interface layout](#user-interface-layout)** +* **[User input restrictions](#user-input-restrictions)** + * **[Student contact](#student-contact)** + * [Name](#name) + * [Phone/Contact Number](#phonecontact-number) + * [Email](#email) + * [Address](#address) + * [Tags](#tags) + * **[Task](#task)** + * [Name/Title](#nametitle) + * **[Score](#score)** + * [Label](#label) + * [Value](#value) + * [Date](#date) + * **[General fields](#general-fields)** + * [Index](#index) + * [File path for export](#file-path-for-export) + * [File path for import](#file-path-for-import) +* **[Features](#features)** + * **[Managing student contact](#managing-student-contact)** + * [Adding a student: `add`](#1-adding-a-student-add) + * [Deleting a student: `delete`](#2-deleting-a-student-delete) + * [Editing a student: `edit`](#3-editing-a-student-edit) + * [Checking a student: `check`](#4-checking-a-student-check) + * [Finding a student: `find`](#5-finding-a-student-find) + * [Filtering students: `filter`](#6-filtering-students-filter) + * [Listing all students: `list`](#7-listing-all-students-list) + * **[Managing task list of a student](#managing-task-list-of-a-student)** + * [Adding a task for a student: `addtask`](#1-adding-a-task-for-a-student-addtask) + * [Deleting a task of a student: `deletetask`](#2-deleting-a-task-of-a-student-deletetask) + * [Marking a task of a student: `markcomplete`, `markinprogress`, `marklate`](#3-marking-a-task-of-a-student-markcomplete-markinprogress-marklate) + * **[Managing score list of a student](#managing-score-list-of-a-student)** + * [Adding a score for a student: `addscore`](#1-adding-a-score-for-a-student-addscore) + * [Deleting a score of a student: `deletescore`](#2-deleting-a-score-of-a-student-deletescore) + * [Switching between score tabs: `switch`](#3-switching-between-score-tabs-switch) + * **[Managing the data of the students](#managing-the-data-of-the-students)** + * [Exporting the data of the students: `export`](#1-exporting-the-data-of-the-students-export) + * [Importing the data of the students: `import`](#2-importing-the-data-of-the-students-import) + * [Exporting the progress of a student: `exportp`](#3-exporting-the-progress-of-a-student-exportp) + * **[General commands](#general-commands)** + * [Viewing help: `help`](#1-viewing-help-help) + * [Clearing all entries: `clear`](#2-clearing-all-entries-clear) + * [Exiting the program: `exit`](#3-exiting-the-program-exit) + * **[Saving the data](#saving-the-data)** + * **[Editing the data file](#editing-the-data-file)** +* **[GUI display restrictions](#gui-display-restrictions)** +* **[FAQ](#faq)** +* **[Command summary](#command-summary)** -* Table of Contents -{:toc} +-------------------------------------------------------------------------------------------------------------------- + +
+ +## Overview + +Finding it hard to manage your student contact details and keep track of their progress? + +Finding it a hassle to keep a list of student tasks and scores? + +**MATHUTORING** helps you solve these problems! + +**MATHUTORING**, a centralised desktop application targeted to **private Math tuition teachers**, helps you manage student contact details and performance by keeping student contact details, tasks, and scores. +You can also see score charts and statistics! + +What's more, you can generate a PDF report of your student containing the student's tasks and scores. +If you need to switch to a new device, you can also export and import your previous data into the application! + +**MATHUTORING** is optimised for use via a Command Line Interface (CLI) while still having the benefits of a Graphical User Interface (GUI). If you can type fast, **MATHUTORING** can get your contact management tasks done faster than traditional GUI apps. + +[Back to top](#table-of-contents) -------------------------------------------------------------------------------------------------------------------- +
+ ## Quick start -1. Ensure you have Java `11` or above installed in your Computer. +1. Ensure you have `Java 11` or above installed in your Computer. -1. Download the latest `addressbook.jar` from [here](https://github.com/se-edu/addressbook-level3/releases). +2. Download the latest `mathutoring.jar`. -1. Copy the file to the folder you want to use as the _home folder_ for your AddressBook. +3. Copy the file to the folder you want to use as the _home folder_ for your MATHUTORING app. -1. Open a command terminal, `cd` into the folder you put the jar file in, and use the `java -jar addressbook.jar` command to run the application.
- A GUI similar to the below should appear in a few seconds. Note how the app contains some sample data.
- ![Ui](images/Ui.png) +4. Open a command terminal, `cd` into the folder you put the jar file in, and use the `java -jar mathutoring.jar` command to run the application.
+
+ The initial GUI below should appear in a few seconds. Note how the app contains some sample data for your reference, you are free to delete the sample data after you get familiar with the MATHUTORING.
-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.
+ ![InitialUi](images/UG-images/InitialUi.png) + +5. 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: - * `list` : Lists all contacts. + * `list` : Lists all students in the student list. - * `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. + * `add n/John Doe p/98765432 e/johnd@example.com a/311, Clementi Ave 2, #02-25 c/87849999 t/female t/primary` : Adds a student named `John Doe` to the student list in MATHUTORING with two tags attached. - * `delete 3` : Deletes the 3rd contact shown in the current list. + * `delete 3` : Deletes the 3rd student (if the student exists) shown in the current list. - * `clear` : Deletes all contacts. + * `clear` : Deletes all students. * `exit` : Exits the app. -1. Refer to the [Features](#features) below for details of each command. +6. Recommended minimum screen size: 740x700. + +7. Refer to the [Features](#features) below for details of each command. + +[Back to top](#table-of-contents) + +-------------------------------------------------------------------------------------------------------------------- + +
+ +## User interface layout + +There are two options to display a student's scores (__score list__ and __score chart__) by clicking the *Text* and *Chart* buttons (referred as Switch Display Button below) respectively. + +[Back to top](#table-of-contents) + +### Layout with score list + +![Layout with Score List](images/UG-images/Layout.png) + +[Back to top](#table-of-contents) + +
+ +### Layout with score chart + +![Layout with Score Chart](images/UG-images/Layout2.png) + +[Back to top](#table-of-contents) + +-------------------------------------------------------------------------------------------------------------------- + +
+ +## User input restrictions +To achieve the best performance, we have set **restrictions** for the user command input.

+Here is the **summary** for input restrictions. Users are advised to skim through all the restrictions to avoid command input mistakes. + +[Back to top](#table-of-contents) + +### Student contact + +#### Name +A **name** can only contain **alphanumeric** characters and **spaces** (Blanks are not allowed). + +[Back to top](#table-of-contents) + +#### Phone/Contact number +* A **phone/contact number** must have at least **3 digits** and no more than **15 digits**. + +[Back to top](#table-of-contents) + +#### Email +An **email** should be of the format `local-part@domain` and adheres to the following constraints: +1. The **local-part** should only contain **alphanumeric characters** and **these special characters**, excluding the parentheses, (+_.-).
+ The **local-part** may not start or end with any special characters. +2. This is followed by a **'@'** and then a domain name. The domain name is made up of domain labels separated by periods. + The **domain name** must: + - end with a domain label at least **2 characters** long + - have each domain label start and end with **alphanumeric** characters + - have each domain label consist of alphanumeric characters, separated only by **hyphens**, if any. + +[Back to top](#table-of-contents) + +#### Address +No restrictions. + +[Back to top](#table-of-contents) + +#### Tags +A **tag** can only contain **alphanumeric** characters and should not contain more than **20 characters**. + +[Back to top](#table-of-contents) + +-------------------------------------------------------------------------------------------------------------------- + +### Task + +#### Name/Title +A **name** can only contain **alphanumeric** characters and **spaces** (Blanks are not allowed). + +[Back to top](#table-of-contents) + +-------------------------------------------------------------------------------------------------------------------- + +### Score + +#### Label +A **label** can only contain **alphanumeric** characters and **spaces** (Blanks are not allowed). + +[Back to top](#table-of-contents) + +#### Value +A **value** can be any integer or a number with one decimal place from **0 to 100 (inclusive)**. + +[Back to top](#table-of-contents) + +#### Date +The format of a **date** must be in **`yyyy-MM-DD`**, and must not be in the future. + +[Back to top](#table-of-contents) + +-------------------------------------------------------------------------------------------------------------------- + +### General fields + +#### Index +An index must be a **positive integer** 1, 2, 3, ... (one-based index). +Note if the index given is too large and exceed the integer limit, the command will be deemed as invalid. + +[Back to top](#table-of-contents) + +#### File path for export +* File path separator (e.g. backward/forward slash) should **follow user's operating system**. + * e.g. Windows uses backward slash and Mac uses forward slash +* Export path should be a **directory**, not a file! +* The directory cannot be a write-protected folder! + +[Back to top](#table-of-contents) + +#### File path for import +* File path separator (e.g. backward/forward slash) should **follow user's operating system**. + * e.g. Windows uses backward slash and Mac uses forward slash +* Import path should be a **file**, not a directory! + +[Back to top](#table-of-contents) -------------------------------------------------------------------------------------------------------------------- +
+ ## Features
@@ -49,145 +249,630 @@ AddressBook Level 3 (AB3) is a **desktop app for managing contacts, optimized fo e.g. in `add n/NAME`, `NAME` is a parameter which can be used as `add n/John Doe`. * Items in square brackets are optional.
- e.g `n/NAME [t/TAG]` can be used as `n/John Doe t/friend` or as `n/John Doe`. + e.g. `n/NAME [t/TAG]` can be used as `n/John Doe t/primary` or as `n/John Doe`. * Items with `…`​ after them can be used multiple times including zero times.
- e.g. `[t/TAG]…​` can be used as ` ` (i.e. 0 times), `t/friend`, `t/friend t/family` etc. + e.g. `[t/TAG]…​` can be used as ` ` (i.e. 0 times), `t/secondary`, `t/secondary4 t/secondary` 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. -* If a parameter is expected only once in the command but you specified it multiple times, only the last occurrence of the parameter will be taken.
- e.g. if you specify `p/12341234 p/56785678`, only `p/56785678` will be taken. +* If a parameter is expected only once in the command, but the user specified it multiple times, only the last occurrence of the parameter will be taken.
+ e.g. if the user specify `p/12341234 p/56785678`, only `p/56785678` will be taken. -* Extraneous parameters for commands that do not take in parameters (such as `help`, `list`, `exit` and `clear`) will be ignored.
+* __Extraneous parameters for commands that do not take in parameters (including `help`, `list`, `exit`, `clear`, and `switch`) will be ignored.
__ e.g. if the command specifies `help 123`, it will be interpreted as `help`. +* Command words are case-insensitive.
+ e.g. if the command specifies such as `help`, `HELP`, `Help`..., it will be interpreted as `help`. +
-### Viewing help : `help` +[Back to top](#table-of-contents) -Shows a message explaning how to access the help page. +
-![help message](images/helpMessage.png) +### Managing student contact -Format: `help` +### 1. Adding a student: `add` +Adds a student to the student list. -### Adding a person: `add` +Format: `add n/NAME p/PHONE_NUMBER e/EMAIL a/ADDRESS c/CONTACT_PARENT [t/TAG]…​` -Adds a person to the address book. +
-Format: `add n/NAME p/PHONE_NUMBER e/EMAIL a/ADDRESS [t/TAG]…​` +**:bulb: Tips:**
+* A student is allowed to have alphanumeric or numeric names, however, special characters (e.g. `à`, `_`) are not allowed. +* If a student does not have a phone number, their parent's contact number can be used as the student's phone number. +* A student can have any number of tags (including 0) +
-
:bulb: **Tip:** -A person can have any number of tags (including 0) +
+ +**:exclamation: Caution:**
+* In order to avoid potential confusion, we do not allow any student to have the same name regardless of the letter cases (e.g. Harry, HARRY, harry are deemed as same name). +* If the user wishes to add in a student who has the same name as an existing student in the student list, consider adding a number after the student's name to distinguish them. e.g. Emily and Emily 2 are acceptable names.
+
+ +**:information_source: Note about the avatars (profile pictures):**
+* The avatar will change if the student has a "gender" tag. +* The "gender" tag include male and female (case-insensitive). If a student does not have any gender tag or have both gender tags (male and female), the avatar will stay as default. +
+ +
+ 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` +* `add n/John Doe p/98765432 e/johnd@example.com a/John street, block 123, #01-01 c/948372948` +* `add n/Betsy Crowe t/primary c/83927482 e/betsycrowe@example.com a/Downtown p/1234567 t/primary3` + ![Add a student](images/UG-images/Add%20a%20student.png) -### Listing all persons : `list` +[Back to top](#table-of-contents) -Shows a list of all persons in the address book. +
-Format: `list` +### 2. Deleting a student: `delete` + +Deletes the specified student from the student list. + +Format: `delete INDEX` + +* Deletes the student at the specified `INDEX`. +* The index refers to the index number shown in the displayed student list. +* The index **must be a positive integer** 1, 2, 3, …​ + +Examples: +* `list` followed by `delete 2` deletes the 2nd student (if the student exists) in the student list.
+ Before `delete 2` is executed, the student `Bernice Yu` is shown in the Student List. + ![Delete a student (before)](images/UG-images/Delete%20a%20student%20(before).png) + After `delete 2` is executed, the student `Bernice Yu` is deleted from the Student List. + ![Delete a student (after)](images/UG-images/Delete%20a%20student%20(after).png) +* `find Betsy` followed by `delete 1` deletes the 1st student (if the student exists) in the results of the `find` command. +* `filter female` followed by `delete 3` deletes the 3rd student (if the student exists) in the results of the `filter` command. -### Editing a person : `edit` +[Back to top](#table-of-contents) -Edits an existing person in the address book. +
-Format: `edit INDEX [n/NAME] [p/PHONE] [e/EMAIL] [a/ADDRESS] [t/TAG]…​` +### 3. Editing a student: `edit` -* 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, …​ +Edits an existing student in the student list. + +Format: `edit INDEX [n/NAME] [p/PHONE] [e/EMAIL] [a/ADDRESS] [c/CONTACT_PARENT] [t/TAG]…​` + +* Edits the student at the specified `INDEX`. The index refers to the index number shown in the displayed student 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. +* When editing tags, all the existing tags of the student will be removed. i.e. adding of tags is not cumulative. +* The user can remove all the student’s tags by typing `t/` without specifying any tags after it. +* We allow the user to edit the `PHONE_NUMBER` and `CONTACT_PARENT` to be the same. +* The user is not allowed to change the name of a student to be the same as any existing student in the list. + +Examples: +* `edit 1 p/91234567 e/johndoe@example.com` Edits the phone number and email address of the 1st student to be `91234567` and `johndoe@example.com` respectively. +* `edit 2 n/Betsy Crower t/` Edits the name of the 2nd student to be `Betsy Crower` and clears all existing tags.
+ Before command execution: + ![Edit a student (before)](images/UG-images/Edit%20a%20student%20(before).png) + After command execution: + ![Edit a student (after)](images/UG-images/Edit%20a%20student%20(after).png) + +[Back to top](#table-of-contents) + +
+ +### 4. Checking a student: `check` + +Displays the information of the student being checked, including their task list and score list. + +Format: `check INDEX` + +* Checks the student at the specified `INDEX` and displays the task list and score list of the student. +* The index refers to the index number shown in the displayed student list. +* The index **must be a positive integer** 1, 2, 3, …​ + +
+ +**:information_source: Note:**
+After the user checked a student, the respective student's task list and score list will continue to be displayed, unless: + * The respective student (the latest checked student) is being deleted. + * The respective student (the latest checked student) is being edited. + * The student list being cleared. + * New student data (.json file) is being imported. + +**Any of the above actions will alter the status to no student being checked now.** +
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. +* `check 2` checks the 2nd student in the student list, the respective task list and score list will show on the right side of the application window.
-### Locating persons by name: `find` +
+ + Before command execution: + ![Check a student (before)](images/UG-images/Check%20a%20student%20(before).png) + After command execution:
+ * Student has no tasks and scores: + ![Check a student with no tasks and scores](images/UG-images/Check%20a%20student%20Empty%20Lists.png) + * Student has tasks and scores: + ![Check a student with tasks and scores](images/UG-images/Check%20a%20student.png) -Finds persons whose names contain any of the given keywords. +[Back to top](#table-of-contents) + +
+ +### 5. Finding a student: `find` + +Finds students whose names contain any of the given keywords. Format: `find KEYWORD [MORE_KEYWORDS]` -* The search is case-insensitive. e.g `hans` will match `Hans` +* 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). +* Students matching at least one keyword will be returned (i.e. `OR` search). e.g. `Hans Bo` will return `Hans Gruber`, `Bo Yang` Examples: * `find John` returns `john` and `John Doe` * `find alex david` returns `Alex Yeoh`, `David Li`
- ![result for 'find alex david'](images/findAlexDavidResult.png) + ![Find a student](images/UG-images/Find%20a%20student.png) -### Deleting a person : `delete` +[Back to top](#table-of-contents) -Deletes the specified person from the address book. +
-Format: `delete INDEX` +### 6. Filtering students: `filter` + +Filters students whose tags match with any of the given keywords. + +Format: `filter KEYWORD [MORE_KEYWORDS]` + +* The filter is case-insensitive. e.g. `primary` will match `Primary` +* The order of the keywords does not matter. e.g. `primary primary4` and `primary4 primary` have the same filter results. +* Only the tag is searched. +* Only full words will be matched e.g. `primary` will not match `primary4` +* Students whose tag matches at least one keyword will be returned (i.e. `OR` search). + e.g. `primary primary4` will return students with tags of either `primary`, `primary4`, or both. + +Examples: +* `filter primary` returns tag `primary`, `Primary`. +* `filter secondary secondary2` returns students with tags of either `secondary`, `secondary2`, or both. + ![Filter students](images/UG-images/Filter%20students.png) + +[Back to top](#table-of-contents) + +
+ +### 7. Listing all students: `list` + +Lists all the students in the student list. + +Format: `list` + +![List all students](images/UG-images/List%20all%20students.png) + +[Back to top](#table-of-contents) + +-------------------------------------------------------------------------------------------------------------------- + +
+ +### Managing task list of a student + +### 1. Adding a task for a student: `addtask` + +Adds a task to a specific student. + +Format: `addtask INDEX t/TASK_TITLE` + +* Adds the given task to the student at the specified `INDEX`. +* The index refers to the index number shown in the displayed student list. +* The index **must be a positive integer** 1, 2, 3, …​ +* A task can have alphanumeric or numeric names, however, special characters (e.g. `à`, `_`) are not allowed. +* A task with the same name as a task already in the task list cannot be added to the task list. +* The name of a task is case-insensitive. e.g. `do homework` is the same as `Do Homework` + +Examples: + +* `list` followed by `addtask 2 t/finish Math Paper 1` adds the task `finish Math Paper 1` to the 2nd student of the + student list.
+ The following result assumes that the user has [checked](#4-checking-a-student-check) the student before.
+ ![Add a task](images/UG-images/Add%20a%20task.png) +* `check 2` followed by `addtask 1 t/Complete A Math Exercise` adds the task `Complete A Math Exercise` to the student + being checked. + +[Back to top](#table-of-contents) + +
+ +### 2. Deleting a task of a student: `deletetask` -* Deletes the person at the specified `INDEX`. -* The index refers to the index number shown in the displayed person list. +Deletes the specified task from the task list of a student. + +Format: `deletetask INDEX_OF_STUDENT INDEX_OF_TASK` + +* Deletes the task at the specified `INDEX_OF_TASK` of a specified student (`INDEX_OF_STUDENT`). +* The first index refers to the index number shown in the displayed student list and + the second index refers to the index of the task in the displayed task list of the student. +* Both indexes **must be positive integers** 1, 2, 3, …​ + +Examples: + +* `list` followed by `deletetask 2 3` deletes the third task of the 2nd student in the student list.
+ The following result assumes that the user has [checked](#4-checking-a-student-check) the student before.
+ Before command execution: + ![Delete a task (before)](images/UG-images/Delete%20a%20task%20(before).png) + After command execution: + ![Delete a task (after)](images/UG-images/Delete%20a%20task%20(after).png) +* `find Betsy` followed by `deletetask 1 6` deletes the sixth task of the 1st student in the results of the `find` command. + +[Back to top](#table-of-contents) + +
+ +### 3. Marking a task of a student: `markcomplete`, `markinprogress`, `marklate` + +Marks the specified task from the task list of a student as complete, in progress, or late. + +Format: +
Mark task as complete: `markcomplete INDEX_OF_STUDENT INDEX_OF_TASK` +
Mark task as in progress: `markinprogress INDEX_OF_STUDENT INDEX_OF_TASK` +
Mark task as late: `marklate INDEX_OF_STUDENT INDEX_OF_TASK` + +* Marks the task at the specified `INDEX_OF_TASK` of a specified student (`INDEX_OF_STUDENT`) as complete, in progress or late, depending on the command called. +* The first index refers to the index number shown in the displayed student list and + the second index refers to the index of the task in the displayed task list of the student. +* Both indexes **must be positive integers** 1, 2, 3, …​ +* The default status for a newly added task is in progress. + +Examples: + +* `list` followed by `markcomplete 2 3` marks the third task of the 2nd student in the student list as complete.
+ +
+ + The following result assumes that the user has [checked](#4-checking-a-student-check) the student before.
+ Before command execution: + ![Mark a task (before)](images/UG-images/Mark%20a%20task%20(before).png) + After command execution: + ![Mark a task complete (after)](images/UG-images/Mark%20a%20task%20complete%20(after)png) +* `list` followed by `marklate 2 3` marks the third task of the 2nd student in the student list as late.
+ The following result assumes that the user has [checked](#4-checking-a-student-check) the student before.
+ Before command execution: + ![Mark a task late (before)](images/UG-images/Mark%20a%20task%20late%20(before).png) + After command execution: + ![Mark a task late (after)](images/UG-images/Mark%20a%20task%20late%20(after).png) +* `find Betsy` followed by `marklate 1 6` marks the sixth task of the 1st student in the results of the + `find` command as late. + +[Back to top](#table-of-contents) + +-------------------------------------------------------------------------------------------------------------------- + +
+ +### Managing score list of a student + +### 1. Adding a score for a student: `addscore` + +Adds a score to a specific student. + +Format: `addscore INDEX l/LABEL v/VALUE_OF_SCORE d/DATE` + +* Adds the given score to the student at the specified `INDEX`. +* The index refers to the index number shown in the displayed student list. * The index **must be a positive integer** 1, 2, 3, …​ +* A score can have alphanumeric or numeric labels, however, special characters (e.g. `à`, `_`) are not allowed. +* The given `VALUE_OF_SCORE` can be **any number from 0 to 100**. +* The given `VALUE_OF_SCORE` can either be **an integer or a number with one decimal place** +* Exams on different dates can have the same `Label`. +* No two exams can have the same `Date`. + +
+ +**:information_source: Note about format of `DATE`:**
+* The format of `DATE` must be `yyyy-MM-DD`. For example, `2022-02-20` represents 20 February 2022. +* If the `DATE` entered by the user is in the future, will not be allowed. + +
+ +
+ +**:exclamation: Caution:**
+* In order to avoid potential confusion, we only allow one score per day and the full marks of each score is 100. +* If there are two exams in one day, e.g. `Midterm Math Paper 1` and `Midterm Math Paper 2`, the user can either combine these two exams to one score with label `Midterm Math` or add them in separate dates. +* If the full score of a test is not 100, please convert the score value to a percentage value before entering. +
Examples: -* `list` followed by `delete 2` deletes the 2nd person in the address book. -* `find Betsy` followed by `delete 1` deletes the 1st person in the results of the `find` command. -### Clearing all entries : `clear` +* `list` followed by `addscore 2 l/Midterm Math Paper v/99.5 d/2023-03-02` adds a `Midterm Math Paper` score with a + value of `99.5` and dated `2022-03-02` to the 2nd student in the student list.
+ The following result assumes that the user has [checked](#4-checking-a-student-check) the student before.
+ * Current display for score tab is using score list. + ![Add a score Score List](images/UG-images/Add%20a%20score%20Score%20List.png) + * Current display for score tab is using score chart. + ![Add a score Score Chart](images/UG-images/Add%20a%20score%20Score%20Chart.png) +* `check 5` followed by `addscore 5 l/CA2 A Math v/50 d/2021-09-09` adds a `CA2 A Math` score with a + value of `50` and dated `2021-09-09` to the student being checked. -Clears all entries from the address book. +[Back to top](#table-of-contents) + +
+ +### 2. Deleting a score of a student: `deletescore` + +Deletes the specified score from the score list of a student. + +Format: `deletescore INDEX_OF_STUDENT INDEX_OF_SCORE ` + +* Deletes the score at the specified `INDEX_OF_SCORE` of a specified student (`INDEX_OF_STUDENT`). +* The first index refers to the index number shown in the displayed student list and + the second index refers to the index of the score in the displayed score list of the student. +* Both indexes **must be positive integers** 1, 2, 3, …​ + +Examples: + +* `list` followed by `deletescore 2 1` deletes first score of the 2nd student in the student list. + The following result assumes that the user has [checked](#4-checking-a-student-check) the student before.
+ * Current display for score tab is using score list.
+ Before command execution: + ![Delete a score Score List (before)](images/UG-images/Delete%20a%20score%20Score%20List%20(before).png) + After command execution: + ![Delete a score Score List (after)](images/UG-images/Delete%20a%20score%20Score%20List%20(after).png) +* `find Betsy` followed by `deletescore 1 2` deletes second score of the 1st student in the results of the `find` command. + +[Back to top](#table-of-contents) + +
+ +### 3. Switching between score tabs: `switch` + +Switches between the score list and score chart tabs. + +Format: CLI and GUI supported. + +**CLI**
`switch` + +**GUI**
Click the **Text** or **Chart** button to switch between score list and score chart tabs respectively. +![Switch between Score Tabs](images/UG-images/Switch%20between%20Score%20Tabs.png) + +[Back to top](#table-of-contents) + +-------------------------------------------------------------------------------------------------------------------- + +
+ +### Managing the data of the students + +### 1. Exporting the data of the students: `export` + +Exports all the student's data out. Users can export with or without specifying the path. `export p/` is also allowed. +The default exported position for CLI will be in the _data folder_ under the _home folder_ (the folder that contains the "mathutoring.jar" file). +The exported file name is `data.json`. + +Format: CLI and GUI supported. + +**CLI**
`export [p/FILE_PATH]` + +**GUI**
+Click the "File" on the top menu, then choose "Export" under the drop-down list. + +An export window will pop up, the user is required to specify which folder to store the exported file. + +![Export the data of the students.png](images/UG-images/Export%20the%20data%20of%20the%20students.png) + +Examples: +* `export` will export the file as a JSON file `[JAR file location]/data/data.json` +* For Windows users + * `export` p/C:\bin export `data.json` to bin folder under C disk. +* For Mac users + * `export` p//Users/username/Desktop export `data.json` to desktop. + +
+ +**:information_source: Note about the format of `FILE_PATH`:**
+* For Windows users, the format of `FILE_PATH` must be `p/C:\Users\username\Downloads`. +* For Mac users, the format of `FILE_PATH` must be `p//Users/username/Desktop`. + +
+ +[Back to top](#table-of-contents) + +
+ +### 2. Importing the data of the students: `import` + +Imports student data into the application. Users can import the file by dragging the file in or choosing the file path. +The imported file must be in `.json` format. + +Format: CLI and GUI supported. + +**CLI**
`import p/FILE_PATH` + +**GUI**
Click the "File" on the top menu, then choose "Import" under the drop-down list. An import window will pop up, the user can choose to either drag the file in or choose a specific file path. + +![Import the data of the students.png](images/UG-images/Import%20the%20data%20of%20the%20students.png) + +Examples: +* For Windows users + * `import` p/C:\bin\data.json. +* For Mac users + * `import` p//Users/username/Desktop/data.json. + +
+ +**:information_source: Note about the format of `FILE_PATH`:**
+* For Windows users, the format of `FILE_PATH` must be `p/C:\bin\FILE_NAME`. +* For Mac users, the format of `FILE_PATH` must be `p//Users/username/Desktop/FILE_NAME`. + +
+ +[Back to top](#table-of-contents) + +
+ +### 3. Exporting the progress of a student: `exportp` + +Exports the specified student progress into a PDF file. Users can export without specifying the path. `exportp p/` is not allowed. The default +exported position for CLI will be under the _home folder_. + +Format: CLI and GUI supported. + +**CLI**
`exportp INDEX [p/FILE_PATH]` + +**GUI**
Click the "Export Progress Report" button of a student in the student list. An export progress window will pop +up, the user is required to specify which folder to store the exported file. + +* Exports the score list and task list of the specified student `INDEX` in the form of a PDF file. +* The `INDEX` **must be a positive integer** 1, 2, 3, ... +* If `FILE_PATH` is not specified, file will be exported as a JSON file in `/data` +* `FILE_PATH` should be a valid path to a **directory**. +* The exported file name is `'s Progress Report.pdf`, e.g. `Alex Yeoh's Progress Report.pdf` +* Sample PDF output file: [Alex Yeoh's Progress Report.pdf](pdfs/Alex Yeoh's Progress Report.pdf) + +![Exporting the progress of a student](images/UG-images/Exporting%20the%20progress%20of%20a%20student.png) + +Examples: + +* `exportp 1` will export the file as a PDF file `/data/'s Progress Report.pdf` +* For Windows users + * `exportp 1 p/C:\Users\John Doe\Downloads` +* For Mac users + * `exportp 1 p//Users/johndoe/Documents` + +
+ +**:information_source: Note about the format of `FILE_PATH`:**
+* For Windows users, the format of `FILE_PATH` must be `p/C:\Users\username\Downloads`. +* For Mac users, the format of `FILE_PATH` must be `p//Users/username/Desktop`. + +
+ +[Back to top](#table-of-contents) + +-------------------------------------------------------------------------------------------------------------------- + +
+ +### General commands + +### 1. Viewing help: `help` + +Prompts the help page link together with a brief user guide that explain what commands are provided in MATHUTORING. +For more detailed information such as how to use the syntax, please refer to the help page. + +Format: CLI and GUI supported. + +**CLI**
`help` + +**GUI**
+Click the "Help" on the top menu, then choose "Help" again under the drop-down list. + +![Viewing help](images/UG-images/Viewing%20help.png) + +[Back to top](#table-of-contents) + +
+ +### 2. Clearing all entries: `clear` + +Clears all entries from the MATHUTORING. Format: `clear` -### Exiting the program : `exit` +![Clear all entries](images/UG-images/Clear%20all%20entries.png) + +[Back to top](#table-of-contents) -Exits the program. +
+ +### 3. Exiting the program: `exit` + +Exits from MATHUTORING. Format: `exit` +[Back to top](#table-of-contents) + +-------------------------------------------------------------------------------------------------------------------- + +
+ ### Saving the data -AddressBook data are saved in the hard disk automatically after any command that changes the data. There is no need to save manually. +* MATHUTORING data is saved in the hard disk automatically after any command. There is no need to save manually. +* If the user would like to save the MATHUTORING data in a different location, they can use the [`export`](#1-exporting-the-data-of-the-students-export) +command. + +[Back to top](#table-of-contents) ### Editing the data file -AddressBook data are saved as a JSON file `[JAR file location]/data/addressbook.json`. Advanced users are welcome to update data directly by editing that data file. +MATHUTORING data are saved as a JSON file `/data/mathutoring.json`. Advanced users are welcome to update data directly by editing that data file. -
:exclamation: **Caution:** -If your changes to the data file makes its format invalid, AddressBook will discard all data and start with an empty data file at the next run. +
:exclamation: Caution: +If the changes to the data file make its format invalid, MATHUTORING will discard all data and start with an empty data file at the next run.
-### Archiving data files `[coming in v2.0]` +[Back to top](#table-of-contents) + +-------------------------------------------------------------------------------------------------------------------- + +
+ +## GUI display restrictions +We have set up a few GUI display restrictions in order to avoid the GUI being affect by extreme inputs (e.g. super long name) or small screen size, and thus hinder the user experience. +* If the student name is more than 29 letters, the full student name will be displayed in the student list. However, the +task list will only display the first 29 letters, with the remaining letters shown as ellipsis. + +* If the score label is more than 11 letters, the full score label will be displayed in the score list, text panel. +However, the chart tooltip will only display the first 11 letters, with the remaining letters shown as ellipsis. -_Details coming soon ..._ +* When you try to open external windows (Import, Export, Export Progress, and Help Windows), you might notice that it doesn't open if it is minimized. The proposed solution is in the developer guide. -------------------------------------------------------------------------------------------------------------------- +
+ ## FAQ **Q**: How do I transfer my data to another Computer?
-**A**: Install the app in the other computer and overwrite the empty data file it creates with the file that contains the data of your previous AddressBook home folder. +**A**: 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 MATHUTORING home folder. + +**Q**: I can't find the `mathutoring.json` file and the files exported for `export` and `exportp`. What should I do?
+**A**: Open the application using `java -jar mathutoring.jar` instead of opening the application by clicking the JAR file. More details can be found in the [Quick start](#quick-start) section. + +[Back to top](#table-of-contents) -------------------------------------------------------------------------------------------------------------------- +
+ ## Command summary -Action | Format, Examples ---------|------------------ -**Add** | `add n/NAME p/PHONE_NUMBER e/EMAIL a/ADDRESS [t/TAG]…​`
e.g., `add n/James Ho p/22224444 e/jamesho@example.com a/123, Clementi Rd, 1234665 t/friend t/colleague` -**Clear** | `clear` -**Delete** | `delete INDEX`
e.g., `delete 3` -**Edit** | `edit INDEX [n/NAME] [p/PHONE_NUMBER] [e/EMAIL] [a/ADDRESS] [t/TAG]…​`
e.g.,`edit 2 n/James Lee e/jameslee@example.com` -**Find** | `find KEYWORD [MORE_KEYWORDS]`
e.g., `find James Jake` -**List** | `list` -**Help** | `help` +| Action | Format, Examples | +|----------------------------------------------------------------------------------------|-----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------| +| [**Add a Student**](#1-adding-a-student-add) | `add n/NAME p/PHONE_NUMBER e/EMAIL a/ADDRESS c/PARENT_PHONE [t/TAG]…​`
e.g., `add n/James Ho p/22224444 e/jamesho@example.com a/123, Clementi Rd, 1234665 c/11112222 t/friend t/primary` | +| [**Delete a Student**](#2-deleting-a-student-delete) | `delete INDEX`
e.g., `delete 1` | +| [**Edit a Student**](#3-editing-a-student-edit) | `edit INDEX [n/NAME] [p/PHONE_NUMBER] [e/EMAIL] [a/ADDRESS] [c/PARENT_PHONE] [t/TAG]…​`
e.g.,`edit 2 n/James Lee e/jameslee@example.com c/12348888` | +| [**Check a Student**](#4-checking-a-student-check) | `check INDEX`
e.g. `check 1` | +| [**Find a Student**](#5-finding-a-student-find) | `find KEYWORD [MORE_KEYWORDS]`
e.g., `find James Jake` | +| [**Filter Students**](#6-filtering-students-filter) | `filter KEYWORD [MORE_KEYWORDS]`
e.g., `filter primary secondary` | +| [**List Students**](#7-listing-all-students-list) | `list` | +| [**Add a Task**](#1-adding-a-task-for-a-student-addtask) | `addtask INDEX t/TITLE`
e.g `addtask 2 t/Homework Assignment 1` | +| [**Delete a Task**](#2-deleting-a-task-of-a-student-deletetask) | `deletetask INDEX_OF_STUDENT INDEX_OF_TASK`
e.g `deletetask 2 1` | +| [**Mark a Task**](#3-marking-a-task-of-a-student-markcomplete-markinprogress-marklate) | `mark(STATUS) INDEX_OF_STUDENT INDEX_OF_TASK` (`mark(STATUS)` can be either `markcomplete`, `marklate` or `markinprogress`)
e.g. `markComplete 1 2`
| +| [**Add a Score**](#1-adding-a-score-for-a-student-addscore) | `addscore INDEX_OF_STUDENT l/LABEL v/VALUE_OF_SCORE d/DATE`
e.g `addscore 1 l/CA2 A Math v/70 d/2022-03-03` | +| [**Delete a Score**](#2-deleting-a-score-of-a-student-deletescore) | `deletescore INDEX_OF_STUDENT INDEX_OF_SCORE`
e.g. `deletescore 3 4` | +| [**Switch Score Tab**](#3-switching-between-score-tabs-switch) | `switch` | +| [**Export Data**](#1-exporting-the-data-of-the-students-export) | `export [p/FILE_PATH]`
e.g. `export p//Users/John` | +| [**Import Data**](#2-importing-the-data-of-the-students-import) | `import p/FILE_PATH`
e.g. `import p//Users/John/data.json` | +| [**Export a Student's Progress**](#3-exporting-the-progress-of-a-student-exportp) | `exportp INDEX [p/FILE_PATH]`
e.g. `export 1 p//Users/John` | +| [**Help**](#1-viewing-help-help) | `help` | +| [**Clear**](#2-clearing-all-entries-clear) | `clear` | +| [**Exit**](#3-exiting-the-program-exit) | `exit` | + +[Back to top](#table-of-contents) diff --git a/docs/_config.yml b/docs/_config.yml index 6bd245d8f4e..c7791d0deac 100644 --- a/docs/_config.yml +++ b/docs/_config.yml @@ -1,4 +1,4 @@ -title: "AB-3" +title: "MATHUTORING" theme: minima header_pages: @@ -8,7 +8,7 @@ header_pages: markdown: kramdown -repository: "se-edu/addressbook-level3" +repository: "AY2223S2-CS2103-W17-1/tp" github_icon: "images/github-icon.png" plugins: diff --git a/docs/_sass/minima/_base.scss b/docs/_sass/minima/_base.scss index 0d3f6e80ced..82bec051a48 100644 --- a/docs/_sass/minima/_base.scss +++ b/docs/_sass/minima/_base.scss @@ -103,7 +103,7 @@ li { * Headings */ h1, h2, h3, h4, h5, h6 { - font-weight: $base-font-weight; + font-weight: $bold-font-weight; } @@ -253,7 +253,7 @@ table { } } th, td { - padding: ($spacing-unit / 3) ($spacing-unit / 2); + padding: ($spacing-unit / 4) ($spacing-unit / 3); } th { background-color: $table-header-bg-color; @@ -288,7 +288,7 @@ table { text-align: center; } .site-header:before { - content: "AB-3"; + content: "MATHUTORING"; font-size: 32px; } } diff --git a/docs/_sass/minima/custom-styles.scss b/docs/_sass/minima/custom-styles.scss index 56b5d56b430..c280c819ee9 100644 --- a/docs/_sass/minima/custom-styles.scss +++ b/docs/_sass/minima/custom-styles.scss @@ -1,7 +1,7 @@ // Placeholder to allow defining custom styles that override everything else. // (Use `_sass/minima/custom-variables.scss` to override variable defaults) h2, h3, h4, h5, h6 { - color: #e46c0a; + color: #605BF1; } // Bootstrap style alerts diff --git a/docs/_sass/minima/initialize.scss b/docs/_sass/minima/initialize.scss index 30288811151..778a53d1c51 100644 --- a/docs/_sass/minima/initialize.scss +++ b/docs/_sass/minima/initialize.scss @@ -6,6 +6,7 @@ $base-font-family: -apple-system, BlinkMacSystemFont, "Segoe UI", "Segoe UI Symb $code-font-family: "Menlo", "Inconsolata", "Consolas", "Roboto Mono", "Ubuntu Mono", "Liberation Mono", "Courier New", monospace; $base-font-size: 16px !default; $base-font-weight: 400 !default; +$bold-font-weight: $base-font-weight * 1.75 !default; $small-font-size: $base-font-size * 0.875 !default; $base-line-height: 1.5 !default; @@ -14,7 +15,7 @@ $spacing-unit: 30px !default; $table-text-align: left !default; // Width of the content area -$content-width: 800px !default; +$content-width: 2000px !default; $on-palm: 600px !default; $on-laptop: 800px !default; diff --git a/docs/diagrams/ArchitectureSequenceDiagram.puml b/docs/diagrams/ArchitectureSequenceDiagram.puml index ef81d18c337..d2bcb2e8458 100644 --- a/docs/diagrams/ArchitectureSequenceDiagram.puml +++ b/docs/diagrams/ArchitectureSequenceDiagram.puml @@ -13,13 +13,13 @@ activate ui UI_COLOR ui -[UI_COLOR]> logic : execute("delete 1") activate logic LOGIC_COLOR -logic -[LOGIC_COLOR]> model : deletePerson(p) +logic -[LOGIC_COLOR]> model : deleteStudent(s) activate model MODEL_COLOR model -[MODEL_COLOR]-> logic deactivate model -logic -[LOGIC_COLOR]> storage : saveAddressBook(addressBook) +logic -[LOGIC_COLOR]> storage : saveMathutoring(mathutoring) activate storage STORAGE_COLOR storage -[STORAGE_COLOR]> storage : Save to file diff --git a/docs/diagrams/BetterModelClassDiagram.puml b/docs/diagrams/BetterModelClassDiagram.puml index 598474a5c82..06c46a94d85 100644 --- a/docs/diagrams/BetterModelClassDiagram.puml +++ b/docs/diagrams/BetterModelClassDiagram.puml @@ -4,18 +4,21 @@ skinparam arrowThickness 1.1 skinparam arrowColor MODEL_COLOR skinparam classBackgroundColor MODEL_COLOR -AddressBook *-right-> "1" UniquePersonList -AddressBook *-right-> "1" UniqueTagList -UniqueTagList -[hidden]down- UniquePersonList -UniqueTagList -[hidden]down- UniquePersonList +Mathutoring *-right-> "1" UniqueStudentList +Mathutoring *-right-> "1" UniqueTagList +UniqueTagList -[hidden]down- UniqueStudentList +UniqueTagList -[hidden]down- UniqueStudentList UniqueTagList -right-> "*" Tag -UniquePersonList -right-> Person +UniqueStudentList -right-> Student -Person -up-> "*" Tag +Student -up-> "*" Tag + +Student *--> Name +Student *--> Phone +Student *--> Email +Student *--> Address +Student *--> UniqueScoreList +Student *--> UniqueTaskList -Person *--> Name -Person *--> Phone -Person *--> Email -Person *--> Address @enduml diff --git a/docs/diagrams/BetterUiClassDiagram.puml b/docs/diagrams/BetterUiClassDiagram.puml new file mode 100644 index 00000000000..3bf7ec5c1f7 --- /dev/null +++ b/docs/diagrams/BetterUiClassDiagram.puml @@ -0,0 +1,47 @@ +@startuml +!include style.puml +skinparam arrowThickness 1.1 +skinparam arrowColor UI_COLOR_T4 +skinparam classBackgroundColor UI_COLOR + +package UI <> { +Class MainWindow +Class HelpWindow +Class ExportProgressWindow +Class ExportWindow +Class ImportWindow +Class ResultDisplay +Class StudentListPanel +Class StudentCard +Class TaskListPanel +Class TaskCard +Class ScoreListPanel +Class ScoreCard +Class StatusBarFooter +Class CommandBox +} + +package Model <> { +Class HiddenModel #FFFFFF +} + +MainWindow *-up-> "1" CommandBox +MainWindow *-up-> "1" ResultDisplay +MainWindow *-down-> "1" StudentListPanel +MainWindow *-down-> "1" TaskListPanel +MainWindow *-down-> "1" ScoreListPanel +MainWindow *-up-> "1" StatusBarFooter +MainWindow --> "0..1" HelpWindow +MainWindow -up-> "0..1" ExportProgressWindow +MainWindow -up-> "0..1" ExportWindow +MainWindow --> "0..1" ImportWindow + +StudentListPanel -down-> "*" StudentCard +TaskListPanel -down-> "*" TaskCard +ScoreListPanel -down-> "*" ScoreCard + +StudentCard ..> Model +TaskCard ..> Model +ScoreCard ..> Model + +@enduml diff --git a/docs/diagrams/DeleteSequenceDiagram.puml b/docs/diagrams/DeleteSequenceDiagram.puml index 1dc2311b245..153ee123675 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 ":MathutoringParser" as MathutoringParser LOGIC_COLOR participant ":DeleteCommandParser" as DeleteCommandParser LOGIC_COLOR participant "d:DeleteCommand" as DeleteCommand LOGIC_COLOR participant ":CommandResult" as CommandResult LOGIC_COLOR @@ -16,17 +16,17 @@ end box [-> LogicManager : execute("delete 1") activate LogicManager -LogicManager -> AddressBookParser : parseCommand("delete 1") -activate AddressBookParser +LogicManager -> MathutoringParser : parseCommand("delete 1") +activate MathutoringParser create DeleteCommandParser -AddressBookParser -> DeleteCommandParser +MathutoringParser -> DeleteCommandParser activate DeleteCommandParser -DeleteCommandParser --> AddressBookParser +DeleteCommandParser --> MathutoringParser deactivate DeleteCommandParser -AddressBookParser -> DeleteCommandParser : parse("1") +MathutoringParser -> DeleteCommandParser : parse("1") activate DeleteCommandParser create DeleteCommand @@ -36,19 +36,19 @@ activate DeleteCommand DeleteCommand --> DeleteCommandParser : d deactivate DeleteCommand -DeleteCommandParser --> AddressBookParser : d +DeleteCommandParser --> MathutoringParser : d deactivate DeleteCommandParser 'Hidden arrow to position the destroy marker below the end of the activation bar. -DeleteCommandParser -[hidden]-> AddressBookParser +DeleteCommandParser -[hidden]-> MathutoringParser destroy DeleteCommandParser -AddressBookParser --> LogicManager : d -deactivate AddressBookParser +MathutoringParser --> LogicManager : d +deactivate MathutoringParser LogicManager -> DeleteCommand : execute() activate DeleteCommand -DeleteCommand -> Model : deletePerson(1) +DeleteCommand -> Model : deleteStudent(1) activate Model Model --> DeleteCommand diff --git a/docs/diagrams/DeleteTaskSequenceDiagram.puml b/docs/diagrams/DeleteTaskSequenceDiagram.puml new file mode 100644 index 00000000000..3c80e833dac --- /dev/null +++ b/docs/diagrams/DeleteTaskSequenceDiagram.puml @@ -0,0 +1,56 @@ +@startuml +!include style.puml + +box Logic LOGIC_COLOR_T1 +participant ":LogicManager" as LogicManager LOGIC_COLOR +participant ":MathutoringParser" as AddressBookParser LOGIC_COLOR +participant ":DeleteTaskCommandParser" as DeleteTaskCommandParser LOGIC_COLOR +participant "d:DeleteTaskCommand" as DeleteTaskCommand LOGIC_COLOR +end box + +[-> LogicManager : execute("deleteTask 1 2") +activate LogicManager + +LogicManager -> AddressBookParser : parseCommand("deleteTask 1 2") +activate AddressBookParser + +create DeleteTaskCommandParser +AddressBookParser -> DeleteTaskCommandParser +activate DeleteTaskCommandParser + +DeleteTaskCommandParser --> AddressBookParser +deactivate DeleteTaskCommandParser + +AddressBookParser -> DeleteTaskCommandParser : parse("1 2") +activate DeleteTaskCommandParser + +create DeleteTaskCommand +DeleteTaskCommandParser -> DeleteTaskCommand +activate DeleteTaskCommand + +DeleteTaskCommand --> DeleteTaskCommandParser : d +deactivate DeleteTaskCommand + +DeleteTaskCommandParser --> AddressBookParser : d +deactivate DeleteTaskCommandParser +'Hidden arrow to position the destroy marker below the end of the activation bar. +DeleteTaskCommandParser -[hidden]-> AddressBookParser +destroy DeleteTaskCommandParser + +AddressBookParser --> LogicManager : d +deactivate AddressBookParser + +LogicManager -> DeleteTaskCommand : execute() +activate DeleteTaskCommand + +LogicManager -[hidden]-> DeleteTaskCommand : execute() +DeleteTaskCommand -[hidden]-> LogicManager : result +LogicManager -[hidden]-> DeleteTaskCommand : execute() +DeleteTaskCommand -[hidden]-> LogicManager : result + +DeleteTaskCommand --> LogicManager : result +deactivate DeleteTaskCommand + +[<--LogicManager +deactivate LogicManager +@enduml diff --git a/docs/diagrams/LogicClassDiagram.puml b/docs/diagrams/LogicClassDiagram.puml index d4193173e18..2341d51d3f8 100644 --- a/docs/diagrams/LogicClassDiagram.puml +++ b/docs/diagrams/LogicClassDiagram.puml @@ -6,7 +6,7 @@ skinparam classBackgroundColor LOGIC_COLOR package Logic { -Class AddressBookParser +Class MathutoringParser Class XYZCommand Class CommandResult Class "{abstract}\nCommand" as Command @@ -27,8 +27,8 @@ Class HiddenOutside #FFFFFF HiddenOutside ..> Logic LogicManager .right.|> Logic -LogicManager -right->"1" AddressBookParser -AddressBookParser ..> XYZCommand : creates > +LogicManager -right->"1" MathutoringParser +MathutoringParser ..> XYZCommand : creates > XYZCommand -up-|> Command LogicManager .left.> Command : executes > diff --git a/docs/diagrams/ModelClassDiagram.puml b/docs/diagrams/ModelClassDiagram.puml index 4439108973a..e88609dcf80 100644 --- a/docs/diagrams/ModelClassDiagram.puml +++ b/docs/diagrams/ModelClassDiagram.puml @@ -5,46 +5,52 @@ skinparam arrowColor MODEL_COLOR skinparam classBackgroundColor MODEL_COLOR Package Model <>{ -Class "<>\nReadOnlyAddressBook" as ReadOnlyAddressBook +Class "<>\nReadOnlyMathutoring" as ReadOnlyMathutoring Class "<>\nReadOnlyUserPrefs" as ReadOnlyUserPrefs Class "<>\nModel" as Model -Class AddressBook +Class Mathutoring Class ModelManager Class UserPrefs -Class UniquePersonList -Class Person +Class UniqueStudentList +Class Student Class Address Class Email Class Name Class Phone Class Tag +Class UniqueScoreList +Class UniqueTaskList } Class HiddenOutside #FFFFFF HiddenOutside ..> Model -AddressBook .up.|> ReadOnlyAddressBook +Mathutoring .up.|> ReadOnlyMathutoring ModelManager .up.|> Model Model .right.> ReadOnlyUserPrefs -Model .left.> ReadOnlyAddressBook -ModelManager -left-> "1" AddressBook +Model .left.> ReadOnlyMathutoring +ModelManager -left-> "1" Mathutoring ModelManager -right-> "1" UserPrefs UserPrefs .up.|> ReadOnlyUserPrefs -AddressBook *--> "1" UniquePersonList -UniquePersonList --> "~* all" Person -Person *--> Name -Person *--> Phone -Person *--> Email -Person *--> Address -Person *--> "*" Tag +Mathutoring *---> "1" UniqueStudentList +UniqueStudentList ---> "~* all" Student -Name -[hidden]right-> Phone +Student *--> Name +Student *--> "2" Phone +Student *--> Email +Student *--> Address +Student *--> "*" Tag +Student *--> "1" UniqueTaskList +Student *--> "1" UniqueScoreList + +Name -[hidden]right-> "2" Phone Phone -[hidden]right-> Address Address -[hidden]right-> Email +Name -[hidden]up-> UniqueStudentList -ModelManager -->"~* filtered" Person +ModelManager --> "~* filtered" Student @enduml diff --git a/docs/diagrams/ParserClasses.puml b/docs/diagrams/ParserClasses.puml index 0c7424de6e0..6697cfe3900 100644 --- a/docs/diagrams/ParserClasses.puml +++ b/docs/diagrams/ParserClasses.puml @@ -9,7 +9,7 @@ Class XYZCommand package "Parser classes"{ Class "<>\nParser" as Parser -Class AddressBookParser +Class MathutoringParser Class XYZCommandParser Class CliSyntax Class ParserUtil @@ -19,12 +19,12 @@ Class Prefix } Class HiddenOutside #FFFFFF -HiddenOutside ..> AddressBookParser +HiddenOutside ..> MathutoringParser -AddressBookParser .down.> XYZCommandParser: creates > +MathutoringParser .down.> XYZCommandParser: creates > XYZCommandParser ..> XYZCommand : creates > -AddressBookParser ..> Command : returns > +MathutoringParser ..> Command : returns > XYZCommandParser .up.|> Parser XYZCommandParser ..> ArgumentMultimap XYZCommandParser ..> ArgumentTokenizer diff --git a/docs/diagrams/ScoreClassDiagram.puml b/docs/diagrams/ScoreClassDiagram.puml new file mode 100644 index 00000000000..e8787f5128b --- /dev/null +++ b/docs/diagrams/ScoreClassDiagram.puml @@ -0,0 +1,31 @@ +@startuml +!include style.puml +skinparam arrowThickness 1.1 +skinparam arrowColor SCORE_MODEL_COLOR +skinparam classBackgroundColor SCORE_MODEL_COLOR + +Class Date +Class ScoreValue +Class Label +Class Student +Class UniqueScoreList +Class Score +Class ScoreSummary + +class ScoreSummary { + - maxScore: Double + - minScore: Double + - average: Double + - percentage: Double +} + +Student *--> UniqueScoreList + +UniqueScoreList --> "~* " Score +UniqueScoreList +-- "1" ScoreSummary + +Score *--> "1" Date +Score *--> "1" Label +Score *--> "1" ScoreValue + +@enduml diff --git a/docs/diagrams/StorageClassDiagram.puml b/docs/diagrams/StorageClassDiagram.puml index 760305e0e58..c971bd9059d 100644 --- a/docs/diagrams/StorageClassDiagram.puml +++ b/docs/diagrams/StorageClassDiagram.puml @@ -14,11 +14,11 @@ Class JsonUserPrefsStorage Class "<>\nStorage" as Storage Class StorageManager -package "AddressBook Storage" #F4F6F6{ -Class "<>\nAddressBookStorage" as AddressBookStorage -Class JsonAddressBookStorage -Class JsonSerializableAddressBook -Class JsonAdaptedPerson +package "Mathutoring Storage" #F4F6F6{ +Class "<>\nMathutoringStorage" as MathutoringStorage +Class JsonMathutoringStorage +Class JsonSerializableMathutoring +Class JsonAdaptedStudent Class JsonAdaptedTag } @@ -29,15 +29,15 @@ HiddenOutside ..> Storage StorageManager .up.|> Storage StorageManager -up-> "1" UserPrefsStorage -StorageManager -up-> "1" AddressBookStorage +StorageManager -up-> "1" MathutoringStorage Storage -left-|> UserPrefsStorage -Storage -right-|> AddressBookStorage +Storage -right-|> MathutoringStorage JsonUserPrefsStorage .up.|> UserPrefsStorage -JsonAddressBookStorage .up.|> AddressBookStorage -JsonAddressBookStorage ..> JsonSerializableAddressBook -JsonSerializableAddressBook --> "*" JsonAdaptedPerson -JsonAdaptedPerson --> "*" JsonAdaptedTag +JsonMathutoringStorage .up.|> MathutoringStorage +JsonMathutoringStorage ..> JsonSerializableMathutoring +JsonSerializableMathutoring --> "*" JsonAdaptedStudent +JsonAdaptedStudent --> "*" JsonAdaptedTag @enduml diff --git a/docs/diagrams/TaskClassDiagram.puml b/docs/diagrams/TaskClassDiagram.puml new file mode 100644 index 00000000000..5e61c1cc906 --- /dev/null +++ b/docs/diagrams/TaskClassDiagram.puml @@ -0,0 +1,27 @@ +@startuml +!include style.puml +skinparam arrowThickness 1.1 +skinparam arrowColor TASK_MODEL_COLOR +skinparam classBackgroundColor TASK_MODEL_COLOR + +Class LocalDateTime +Class Name +Class Student +Class UniqueTaskList +Class Task + +Enum "<>\n TaskStatus" as TaskStatus { +INPROGRESS +LATE +COMPLETE +} + +Student *--> UniqueTaskList + +UniqueTaskList --> "~* " Task + +Task *--> "creationDate" LocalDateTime +Task *--> Name +Task *--> "1" TaskStatus + +@enduml diff --git a/docs/diagrams/UiClassDiagram.puml b/docs/diagrams/UiClassDiagram.puml index 95473d5aa19..4d150d0589e 100644 --- a/docs/diagrams/UiClassDiagram.puml +++ b/docs/diagrams/UiClassDiagram.puml @@ -9,16 +9,6 @@ Class "<>\nUi" as Ui Class "{abstract}\nUiPart" as UiPart Class UiManager Class MainWindow -Class HelpWindow -Class ResultDisplay -Class PersonListPanel -Class PersonCard -Class StatusBarFooter -Class CommandBox -} - -package Model <> { -Class HiddenModel #FFFFFF } package Logic <> { @@ -30,31 +20,10 @@ HiddenOutside ..> Ui UiManager .left.|> Ui UiManager -down-> "1" MainWindow -MainWindow *-down-> "1" CommandBox -MainWindow *-down-> "1" ResultDisplay -MainWindow *-down-> "1" PersonListPanel -MainWindow *-down-> "1" StatusBarFooter -MainWindow --> "0..1" HelpWindow - -PersonListPanel -down-> "*" PersonCard -MainWindow -left-|> UiPart +MainWindow -down-|> UiPart -ResultDisplay --|> UiPart -CommandBox --|> UiPart -PersonListPanel --|> UiPart -PersonCard --|> UiPart -StatusBarFooter --|> UiPart -HelpWindow --|> UiPart - -PersonCard ..> Model UiManager -right-> Logic -MainWindow -left-> Logic - -PersonListPanel -[hidden]left- HelpWindow -HelpWindow -[hidden]left- CommandBox -CommandBox -[hidden]left- ResultDisplay -ResultDisplay -[hidden]left- StatusBarFooter +MainWindow -right-> Logic -MainWindow -[hidden]-|> UiPart @enduml diff --git a/docs/diagrams/style.puml b/docs/diagrams/style.puml index fad8b0adeaa..a1ff4f05edd 100644 --- a/docs/diagrams/style.puml +++ b/docs/diagrams/style.puml @@ -25,6 +25,18 @@ !define MODEL_COLOR_T3 #7B000E !define MODEL_COLOR_T4 #51000A +!define TASK_MODEL_COLOR #D60055 +!define TASK_MODEL_COLOR_T1 #FF0568 +!define TASK_MODEL_COLOR_T2 #FF247B +!define TASK_MODEL_COLOR_T3 #FF75AC +!define TASK_MODEL_COLOR_T4 #FFBDD7 + +!define SCORE_MODEL_COLOR #69A92C +!define SCORE_MODEL_COLOR_T1 #69AB2A +!define SCORE_MODEL_COLOR_T2 #599C19 +!define SCORE_MODEL_COLOR_T3 #FF75AC +!define SCORE_MODEL_COLOR_T4 #FFBDD7 + !define STORAGE_COLOR #A38300 !define STORAGE_COLOR_T1 #FFE374 !define STORAGE_COLOR_T2 #EDC520 @@ -45,6 +57,14 @@ skinparam Class { FontName Arial } +skinparam Enum { + FontColor #FFFFFF + BorderThickness 1 + BorderColor #FFFFFF + StereotypeFontColor #FFFFFF + FontName Arial +} + skinparam Actor { BorderColor USER_COLOR Color USER_COLOR @@ -71,5 +91,5 @@ skinparam DefaultTextAlignment center skinparam packageStyle Rectangle hide footbox -hide members +hide empty members hide circle diff --git a/docs/diagrams/tracing/LogicSequenceDiagram.puml b/docs/diagrams/tracing/LogicSequenceDiagram.puml index fdcbe1c0ccc..ed19a8dc32d 100644 --- a/docs/diagrams/tracing/LogicSequenceDiagram.puml +++ b/docs/diagrams/tracing/LogicSequenceDiagram.puml @@ -2,7 +2,7 @@ !include ../style.puml Participant ":LogicManager" as logic LOGIC_COLOR -Participant ":AddressBookParser" as abp LOGIC_COLOR +Participant ":MathutoringParser" as abp LOGIC_COLOR Participant ":EditCommandParser" as ecp LOGIC_COLOR Participant "command:EditCommand" as ec LOGIC_COLOR @@ -13,7 +13,7 @@ create ecp abp -> ecp abp -> ecp ++: parse(arguments) create ec -ecp -> ec ++: index, editPersonDescriptor +ecp -> ec ++: index, editStudentDescriptor ec --> ecp -- ecp --> abp --: command abp --> logic --: command diff --git a/docs/images/ArchitectureSequenceDiagram.png b/docs/images/ArchitectureSequenceDiagram.png deleted file mode 100644 index 2f1346869d0..00000000000 Binary files a/docs/images/ArchitectureSequenceDiagram.png and /dev/null differ diff --git a/docs/images/BetterModelClassDiagram.png b/docs/images/BetterModelClassDiagram.png deleted file mode 100644 index 94440f0ac4a..00000000000 Binary files a/docs/images/BetterModelClassDiagram.png and /dev/null differ diff --git a/docs/images/ArchitectureDiagram.png b/docs/images/DG-images/ArchitectureDiagram.png similarity index 100% rename from docs/images/ArchitectureDiagram.png rename to docs/images/DG-images/ArchitectureDiagram.png diff --git a/docs/images/DG-images/ArchitectureSequenceDiagram.png b/docs/images/DG-images/ArchitectureSequenceDiagram.png new file mode 100644 index 00000000000..ce77be93b6d Binary files /dev/null and b/docs/images/DG-images/ArchitectureSequenceDiagram.png differ diff --git a/docs/images/DG-images/BetterModelClassDiagram.png b/docs/images/DG-images/BetterModelClassDiagram.png new file mode 100644 index 00000000000..9657235bd21 Binary files /dev/null and b/docs/images/DG-images/BetterModelClassDiagram.png differ diff --git a/docs/images/DG-images/BetterUiClassDiagram.png b/docs/images/DG-images/BetterUiClassDiagram.png new file mode 100644 index 00000000000..d11c61dd4d0 Binary files /dev/null and b/docs/images/DG-images/BetterUiClassDiagram.png differ diff --git a/docs/images/CommitActivityDiagram.png b/docs/images/DG-images/CommitActivityDiagram.png similarity index 100% rename from docs/images/CommitActivityDiagram.png rename to docs/images/DG-images/CommitActivityDiagram.png diff --git a/docs/images/ComponentManagers.png b/docs/images/DG-images/ComponentManagers.png similarity index 100% rename from docs/images/ComponentManagers.png rename to docs/images/DG-images/ComponentManagers.png diff --git a/docs/images/DG-images/DeleteSequenceDiagram.png b/docs/images/DG-images/DeleteSequenceDiagram.png new file mode 100644 index 00000000000..0bb497b8e36 Binary files /dev/null and b/docs/images/DG-images/DeleteSequenceDiagram.png differ diff --git a/docs/images/DG-images/LogicClassDiagram.png b/docs/images/DG-images/LogicClassDiagram.png new file mode 100644 index 00000000000..8a39f1aaa99 Binary files /dev/null and b/docs/images/DG-images/LogicClassDiagram.png differ diff --git a/docs/images/LogicStorageDIP.png b/docs/images/DG-images/LogicStorageDIP.png similarity index 100% rename from docs/images/LogicStorageDIP.png rename to docs/images/DG-images/LogicStorageDIP.png diff --git a/docs/images/DG-images/ModelClassDiagram.png b/docs/images/DG-images/ModelClassDiagram.png new file mode 100644 index 00000000000..73b581d2920 Binary files /dev/null and b/docs/images/DG-images/ModelClassDiagram.png differ diff --git a/docs/images/DG-images/ParserClasses.png b/docs/images/DG-images/ParserClasses.png new file mode 100644 index 00000000000..2f583c3f0c1 Binary files /dev/null and b/docs/images/DG-images/ParserClasses.png differ diff --git a/docs/images/DG-images/ScoreClassDiagram.png b/docs/images/DG-images/ScoreClassDiagram.png new file mode 100644 index 00000000000..9a95f640530 Binary files /dev/null and b/docs/images/DG-images/ScoreClassDiagram.png differ diff --git a/docs/images/DG-images/StorageClassDiagram.png b/docs/images/DG-images/StorageClassDiagram.png new file mode 100644 index 00000000000..8bb59f18f9e Binary files /dev/null and b/docs/images/DG-images/StorageClassDiagram.png differ diff --git a/docs/images/DG-images/TaskClassDiagram.png b/docs/images/DG-images/TaskClassDiagram.png new file mode 100644 index 00000000000..8296d578ccd Binary files /dev/null and b/docs/images/DG-images/TaskClassDiagram.png differ diff --git a/docs/images/DG-images/UiClassDiagram.png b/docs/images/DG-images/UiClassDiagram.png new file mode 100644 index 00000000000..3126b75ec67 Binary files /dev/null and b/docs/images/DG-images/UiClassDiagram.png differ diff --git a/docs/images/UndoRedoState0.png b/docs/images/DG-images/UndoRedoState0.png similarity index 100% rename from docs/images/UndoRedoState0.png rename to docs/images/DG-images/UndoRedoState0.png diff --git a/docs/images/UndoRedoState1.png b/docs/images/DG-images/UndoRedoState1.png similarity index 100% rename from docs/images/UndoRedoState1.png rename to docs/images/DG-images/UndoRedoState1.png diff --git a/docs/images/UndoRedoState2.png b/docs/images/DG-images/UndoRedoState2.png similarity index 100% rename from docs/images/UndoRedoState2.png rename to docs/images/DG-images/UndoRedoState2.png diff --git a/docs/images/UndoRedoState3.png b/docs/images/DG-images/UndoRedoState3.png similarity index 100% rename from docs/images/UndoRedoState3.png rename to docs/images/DG-images/UndoRedoState3.png diff --git a/docs/images/UndoRedoState4.png b/docs/images/DG-images/UndoRedoState4.png similarity index 100% rename from docs/images/UndoRedoState4.png rename to docs/images/DG-images/UndoRedoState4.png diff --git a/docs/images/UndoRedoState5.png b/docs/images/DG-images/UndoRedoState5.png similarity index 100% rename from docs/images/UndoRedoState5.png rename to docs/images/DG-images/UndoRedoState5.png diff --git a/docs/images/UndoSequenceDiagram.png b/docs/images/DG-images/UndoSequenceDiagram.png similarity index 100% rename from docs/images/UndoSequenceDiagram.png rename to docs/images/DG-images/UndoSequenceDiagram.png diff --git a/docs/images/DeleteSequenceDiagram.png b/docs/images/DeleteSequenceDiagram.png deleted file mode 100644 index fa327b39618..00000000000 Binary files a/docs/images/DeleteSequenceDiagram.png and /dev/null differ diff --git a/docs/images/LogicClassDiagram.png b/docs/images/LogicClassDiagram.png deleted file mode 100644 index 9e9ba9f79e5..00000000000 Binary files a/docs/images/LogicClassDiagram.png and /dev/null differ diff --git a/docs/images/ModelClassDiagram.png b/docs/images/ModelClassDiagram.png deleted file mode 100644 index 04070af60d8..00000000000 Binary files a/docs/images/ModelClassDiagram.png and /dev/null differ diff --git a/docs/images/ParserClasses.png b/docs/images/ParserClasses.png deleted file mode 100644 index e7b4c8880cd..00000000000 Binary files a/docs/images/ParserClasses.png and /dev/null differ diff --git a/docs/images/StorageClassDiagram.png b/docs/images/StorageClassDiagram.png deleted file mode 100644 index 2533a5c1af0..00000000000 Binary files a/docs/images/StorageClassDiagram.png and /dev/null differ diff --git a/docs/images/UG-images/Add a score Score Chart.png b/docs/images/UG-images/Add a score Score Chart.png new file mode 100644 index 00000000000..c2bd435e9e7 Binary files /dev/null and b/docs/images/UG-images/Add a score Score Chart.png differ diff --git a/docs/images/UG-images/Add a score Score List.png b/docs/images/UG-images/Add a score Score List.png new file mode 100644 index 00000000000..1992923b8fe Binary files /dev/null and b/docs/images/UG-images/Add a score Score List.png differ diff --git a/docs/images/UG-images/Add a student.png b/docs/images/UG-images/Add a student.png new file mode 100644 index 00000000000..d8db6a32425 Binary files /dev/null and b/docs/images/UG-images/Add a student.png differ diff --git a/docs/images/UG-images/Add a task.png b/docs/images/UG-images/Add a task.png new file mode 100644 index 00000000000..7c482bcddb2 Binary files /dev/null and b/docs/images/UG-images/Add a task.png differ diff --git a/docs/images/UG-images/Check a student (before).png b/docs/images/UG-images/Check a student (before).png new file mode 100644 index 00000000000..8f280b18a95 Binary files /dev/null and b/docs/images/UG-images/Check a student (before).png differ diff --git a/docs/images/UG-images/Check a student Empty Lists.png b/docs/images/UG-images/Check a student Empty Lists.png new file mode 100644 index 00000000000..16b1f06ce79 Binary files /dev/null and b/docs/images/UG-images/Check a student Empty Lists.png differ diff --git a/docs/images/UG-images/Check a student.png b/docs/images/UG-images/Check a student.png new file mode 100644 index 00000000000..c086043e372 Binary files /dev/null and b/docs/images/UG-images/Check a student.png differ diff --git a/docs/images/UG-images/Clear all entries.png b/docs/images/UG-images/Clear all entries.png new file mode 100644 index 00000000000..2e0e954022b Binary files /dev/null and b/docs/images/UG-images/Clear all entries.png differ diff --git a/docs/images/UG-images/Delete a score Score Chart (after).png b/docs/images/UG-images/Delete a score Score Chart (after).png new file mode 100644 index 00000000000..e9083d16ff5 Binary files /dev/null and b/docs/images/UG-images/Delete a score Score Chart (after).png differ diff --git a/docs/images/UG-images/Delete a score Score Chart (before).png b/docs/images/UG-images/Delete a score Score Chart (before).png new file mode 100644 index 00000000000..531b7543355 Binary files /dev/null and b/docs/images/UG-images/Delete a score Score Chart (before).png differ diff --git a/docs/images/UG-images/Delete a score Score List (after).png b/docs/images/UG-images/Delete a score Score List (after).png new file mode 100644 index 00000000000..c0abdef10d9 Binary files /dev/null and b/docs/images/UG-images/Delete a score Score List (after).png differ diff --git a/docs/images/UG-images/Delete a score Score List (before).png b/docs/images/UG-images/Delete a score Score List (before).png new file mode 100644 index 00000000000..41e08c61bf6 Binary files /dev/null and b/docs/images/UG-images/Delete a score Score List (before).png differ diff --git a/docs/images/UG-images/Delete a student (after).png b/docs/images/UG-images/Delete a student (after).png new file mode 100644 index 00000000000..cd926baa7df Binary files /dev/null and b/docs/images/UG-images/Delete a student (after).png differ diff --git a/docs/images/UG-images/Delete a student (before).png b/docs/images/UG-images/Delete a student (before).png new file mode 100644 index 00000000000..3412fcc63d3 Binary files /dev/null and b/docs/images/UG-images/Delete a student (before).png differ diff --git a/docs/images/UG-images/Delete a task (after).png b/docs/images/UG-images/Delete a task (after).png new file mode 100644 index 00000000000..37dd89101e8 Binary files /dev/null and b/docs/images/UG-images/Delete a task (after).png differ diff --git a/docs/images/UG-images/Delete a task (before).png b/docs/images/UG-images/Delete a task (before).png new file mode 100644 index 00000000000..2f250d41054 Binary files /dev/null and b/docs/images/UG-images/Delete a task (before).png differ diff --git a/docs/images/UG-images/Edit a student (after).png b/docs/images/UG-images/Edit a student (after).png new file mode 100644 index 00000000000..6b9d266e971 Binary files /dev/null and b/docs/images/UG-images/Edit a student (after).png differ diff --git a/docs/images/UG-images/Edit a student (before).png b/docs/images/UG-images/Edit a student (before).png new file mode 100644 index 00000000000..97f79500cec Binary files /dev/null and b/docs/images/UG-images/Edit a student (before).png differ diff --git a/docs/images/UG-images/Export the data of the students.png b/docs/images/UG-images/Export the data of the students.png new file mode 100644 index 00000000000..f398c4cc801 Binary files /dev/null and b/docs/images/UG-images/Export the data of the students.png differ diff --git a/docs/images/UG-images/Exporting the progress of a student.png b/docs/images/UG-images/Exporting the progress of a student.png new file mode 100644 index 00000000000..7818b217cf7 Binary files /dev/null and b/docs/images/UG-images/Exporting the progress of a student.png differ diff --git a/docs/images/UG-images/Filter students.png b/docs/images/UG-images/Filter students.png new file mode 100644 index 00000000000..5e2c81ae9b5 Binary files /dev/null and b/docs/images/UG-images/Filter students.png differ diff --git a/docs/images/UG-images/Find a student.png b/docs/images/UG-images/Find a student.png new file mode 100644 index 00000000000..e8686d0cde4 Binary files /dev/null and b/docs/images/UG-images/Find a student.png differ diff --git a/docs/images/UG-images/Import the data of the students.png b/docs/images/UG-images/Import the data of the students.png new file mode 100644 index 00000000000..387fdc76933 Binary files /dev/null and b/docs/images/UG-images/Import the data of the students.png differ diff --git a/docs/images/UG-images/InitialUi.png b/docs/images/UG-images/InitialUi.png new file mode 100644 index 00000000000..fa11179d255 Binary files /dev/null and b/docs/images/UG-images/InitialUi.png differ diff --git a/docs/images/UG-images/Layout.png b/docs/images/UG-images/Layout.png new file mode 100644 index 00000000000..1f3e4e5a70c Binary files /dev/null and b/docs/images/UG-images/Layout.png differ diff --git a/docs/images/UG-images/Layout2.png b/docs/images/UG-images/Layout2.png new file mode 100644 index 00000000000..1f8c58e5472 Binary files /dev/null and b/docs/images/UG-images/Layout2.png differ diff --git a/docs/images/UG-images/List all students.png b/docs/images/UG-images/List all students.png new file mode 100644 index 00000000000..e46450a04c6 Binary files /dev/null and b/docs/images/UG-images/List all students.png differ diff --git a/docs/images/UG-images/Mark a task (before).png b/docs/images/UG-images/Mark a task (before).png new file mode 100644 index 00000000000..8cf841ed3c6 Binary files /dev/null and b/docs/images/UG-images/Mark a task (before).png differ diff --git a/docs/images/UG-images/Mark a task complete (after)png b/docs/images/UG-images/Mark a task complete (after)png new file mode 100644 index 00000000000..516c35d7b09 Binary files /dev/null and b/docs/images/UG-images/Mark a task complete (after)png differ diff --git a/docs/images/UG-images/Mark a task late (after).png b/docs/images/UG-images/Mark a task late (after).png new file mode 100644 index 00000000000..5e8fe939734 Binary files /dev/null and b/docs/images/UG-images/Mark a task late (after).png differ diff --git a/docs/images/UG-images/Mark a task late (before).png b/docs/images/UG-images/Mark a task late (before).png new file mode 100644 index 00000000000..ad7ab5acfe6 Binary files /dev/null and b/docs/images/UG-images/Mark a task late (before).png differ diff --git a/docs/images/UG-images/Switch between Score Tabs.png b/docs/images/UG-images/Switch between Score Tabs.png new file mode 100644 index 00000000000..71e174a2e4e Binary files /dev/null and b/docs/images/UG-images/Switch between Score Tabs.png differ diff --git a/docs/images/UG-images/Ui.png b/docs/images/UG-images/Ui.png new file mode 100644 index 00000000000..3f997a50182 Binary files /dev/null and b/docs/images/UG-images/Ui.png differ diff --git a/docs/images/UG-images/Viewing help.png b/docs/images/UG-images/Viewing help.png new file mode 100644 index 00000000000..d8df341e3fb Binary files /dev/null and b/docs/images/UG-images/Viewing help.png differ diff --git a/docs/images/UG-images/findAlexDavidResult.png b/docs/images/UG-images/findAlexDavidResult.png new file mode 100644 index 00000000000..b804a2d4eab Binary files /dev/null and b/docs/images/UG-images/findAlexDavidResult.png differ diff --git a/docs/images/UG-images/helpMessage.png b/docs/images/UG-images/helpMessage.png new file mode 100644 index 00000000000..f76385d5473 Binary files /dev/null and b/docs/images/UG-images/helpMessage.png differ diff --git a/docs/images/request_access.png b/docs/images/UG-images/request_access.png similarity index 100% rename from docs/images/request_access.png rename to docs/images/UG-images/request_access.png diff --git a/docs/images/Ui.png b/docs/images/Ui.png deleted file mode 100644 index 5bd77847aa2..00000000000 Binary files a/docs/images/Ui.png and /dev/null differ diff --git a/docs/images/UiClassDiagram.png b/docs/images/UiClassDiagram.png deleted file mode 100644 index 785e04dbab4..00000000000 Binary files a/docs/images/UiClassDiagram.png and /dev/null differ diff --git a/docs/images/astraxq.png b/docs/images/astraxq.png new file mode 100644 index 00000000000..a459f896576 Binary files /dev/null and b/docs/images/astraxq.png differ diff --git a/docs/images/carrieli1015.png b/docs/images/carrieli1015.png new file mode 100644 index 00000000000..fc6dfc61105 Binary files /dev/null and b/docs/images/carrieli1015.png differ diff --git a/docs/images/findAlexDavidResult.png b/docs/images/findAlexDavidResult.png deleted file mode 100644 index 235da1c273e..00000000000 Binary files a/docs/images/findAlexDavidResult.png and /dev/null differ diff --git a/docs/images/gwynethguo.png b/docs/images/gwynethguo.png new file mode 100644 index 00000000000..da693890d07 Binary files /dev/null and b/docs/images/gwynethguo.png differ diff --git a/docs/images/helpMessage.png b/docs/images/helpMessage.png deleted file mode 100644 index b1f70470137..00000000000 Binary files a/docs/images/helpMessage.png and /dev/null differ diff --git a/docs/images/qqh0828.png b/docs/images/qqh0828.png new file mode 100644 index 00000000000..4b2d296062c Binary files /dev/null and b/docs/images/qqh0828.png differ diff --git a/docs/images/toh-xinyi.png b/docs/images/toh-xinyi.png new file mode 100644 index 00000000000..c3a13f766de Binary files /dev/null and b/docs/images/toh-xinyi.png differ diff --git a/docs/index.md b/docs/index.md index 7601dbaad0d..ad3dff14add 100644 --- a/docs/index.md +++ b/docs/index.md @@ -1,19 +1,20 @@ --- layout: page -title: AddressBook Level-3 +title: MATHUTORING --- -[![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/AY2223S2-CS2103-W17-1/tp/workflows/Java%20CI/badge.svg)](https://github.com/AY2223S2-CS2103-W17-1/tp/actions) +[![codecov](https://codecov.io/gh/AY2223S2-CS2103-W17-1/tp/branch/master/graph/badge.svg?token=XXJ15FVPPS)](https://codecov.io/gh/AY2223S2-CS2103-W17-1/tp) -![Ui](images/Ui.png) +![Ui](images/UG-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). +**MATHUTORING is a desktop application for private Math tuition teachers to manage their student contact details and performance.** 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 MATHUTORING, head over to the [_Quick Start_ section of the **User Guide**](UserGuide.html#quick-start). +* If you are interested about developing MATHUTORING, the [**Developer Guide**](DeveloperGuide.html) is a good place to start. **Acknowledgements** -* Libraries used: [JavaFX](https://openjfx.io/), [Jackson](https://github.com/FasterXML/jackson), [JUnit5](https://github.com/junit-team/junit5) +* This project is based on the AddressBook-Level3 project created by the [SE-EDU initiative](https://se-education.org). +* Libraries used: [JavaFX](https://openjfx.io/), [Jackson](https://github.com/FasterXML/jackson), [JUnit5](https://github.com/junit-team/junit5), [Mockito](https://site.mockito.org/), [Apache PDFBox](https://pdfbox.apache.org/) diff --git a/docs/pdfs/Alex Yeoh's Progress Report.pdf b/docs/pdfs/Alex Yeoh's Progress Report.pdf new file mode 100644 index 00000000000..d421bd2cc96 Binary files /dev/null and b/docs/pdfs/Alex Yeoh's Progress Report.pdf differ diff --git a/docs/team/astraxq.md b/docs/team/astraxq.md new file mode 100644 index 00000000000..ecbcf41e6ed --- /dev/null +++ b/docs/team/astraxq.md @@ -0,0 +1,40 @@ +--- +layout: page +title: Quek Jing Ling, Brian's Project Portfolio Page +--- + +### Project: MATHUTORING + +MATHUTORING is a desktop application used for private Math tuition teachers to manage their students' contacts and performances. 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**: + * Implemented `export` and `import` functionality. + * Created the GUI functionality for both import and export. + +* **Code contributed**: [RepoSense link](https://nus-cs2103-ay2223s2.github.io/tp-dashboard/?search=astraxq&breakdown=true&sort=groupTitle&sortWithin=title&since=2023-02-17&timeframe=commit&mergegroup=&groupSelect=groupByRepos&checkedFileTypes=docs~functional-code~test-code~other) + +* **Project management**: + * Handled and finalised `v1.3` release. + +* **Enhancements to existing features**: + * Added Person.java to take in an additional attribute `parentPhone`. + * Created the `Task`, `TaskList`, `Score`, `ScoreList` Model. + * Added JUnit Testing for new features. + +* **Documentation**: + * Updated AboutUs page and README page. + * Updated UG for Export and Import. + * Contributed into Use Cases, Manual Testing and Effort sections of the DG. + +* **Contributions to team-based tasks**: + * Conceptualized the ideas and came up with v1.1 UI design. + * Added several GitHub issues and helped manage the issues through adding labels and milestones. + +* **Contributions beyond the project team**: + * Handled a multi responsibility PR by breaking it to smaller PRs (cherry picking) to resolve conflicts in `v1.3`. + +* **Community**: + * Contributed to forum discussions (examples: [1](https://github.com/nus-cs2103-AY2223S2/forum/issues/171)) + diff --git a/docs/team/carrieli1015.md b/docs/team/carrieli1015.md new file mode 100644 index 00000000000..2276703c328 --- /dev/null +++ b/docs/team/carrieli1015.md @@ -0,0 +1,69 @@ +--- +layout: page +title: Li Yuxuan's Project Portfolio Page +--- + +### Project: MATHUTORING + +MATHUTORING is a desktop application used for private Math tuition teachers to manage their students' contacts and performances. 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 Features**: + 1. Switch command
+ * What it does: Help the user to easily switch between score text panel and score chart panel. Support both CLI and mouse click. + * Justification: This feature is convenient for the user to switch between score text panel and score chart panel. + * Highlights: Since the switch support both CLI and mouse click. It is important to make the behaviour consistence, so the application need to remember the panel status and switch based on it. + 2. Check command
+ * What it does: For the user to check a specific student's task/s and score/s information. + * Justification: This feature is important as it indicates which student the user want to check and display the selected student's information. + * Highlights: The check result is normally continue to display. The panel will reset to no student being checked when the currently checked student is being deleted/edited, or the entire student list is cleared, or a new student list is being imported in. + 3. Filter command
+ * What it does: To filter out student/s from the existing list. Filter key is the tag/s. + * Justification: This feature help the user to quickly filter out a group of students based on their given tag/s. + * Highlights: To allow more flexibility, when filter by tag, it is fully case-insensitive. + 4. Score list chart
+ * What it does: Created the score list chart to track the student's performance. + * Justification: The chart can clearly show the trend of a student's recent performance, whether his/her grade is improving or decreasing. + * Highlights: The user can hover over the chart node to see tooltip that contains score label and score value. + +* **Code contributed**: [RepoSense link](https://nus-cs2103-ay2223s2.github.io/tp-dashboard/?search=carrieli1015&breakdown=true&sort=groupTitle%20dsc&sortWithin=title&since=2023-02-17&timeframe=commit&mergegroup=&groupSelect=groupByRepos&checkedFileTypes=docs~functional-code~test-code~other) + +* **Project management**: + * Individual + * Completed weekly requirements on time. + * Created several GitHub branches for different increments. + * Group + * Met the milestone deadlines. + * Used GitHub for progress tracking. + +* **Enhancements to existing features**: + * Revamped the existing student list UI. (Pull requests [#71](https://github.com/AY2223S2-CS2103-W17-1/tp/pull/71) [#72](https://github.com/AY2223S2-CS2103-W17-1/tp/pull/72)) + * UI integration. (Pull requests [#81](https://github.com/AY2223S2-CS2103-W17-1/tp/pull/81)) + * Revamped the overall UI layout and make it more responsive (Pull requests [#117](https://github.com/AY2223S2-CS2103-W17-1/tp/pull/117)) + * Wrote additional tests for existing features and improve the Codecov. (Pull requests [#170](https://github.com/AY2223S2-CS2103-W17-1/tp/pull/170)) + +* **Documentation**: + * Updated AboutUs page and README page. + * Added a quick user guide inside the help window. + * User Guide (Pull requests [#116](https://github.com/AY2223S2-CS2103-W17-1/tp/pull/166) [#176](https://github.com/AY2223S2-CS2103-W17-1/tp/pull/176)) + * Added in missing items. + * Updated UG with more details. + * Developer Guide (Pull requests [#176](https://github.com/AY2223S2-CS2103-W17-1/tp/pull/176)) + * Helped with generate the UML diagram. + * Tweaked relevant guides, add in several User case, manual testing, Non-Functional Requirement, and planned enhancements. + +* **Contributions to team-based tasks**: + * Conceptualized the ideas and came up with the overall UI design. + * Added several GitHub issues and helped manage the issues through adding labels and milestones. + * Organized target user stories. + * Created illustrations. Including the avatars, student list icons, task list icons, and import/export window icons. + +* **Review/mentoring contributions**: + * Reviewed other teammates' pull requests. (Pull requests [#119](https://github.com/AY2223S2-CS2103-W17-1/tp/pull/119) [#76](https://github.com/AY2223S2-CS2103-W17-1/tp/pull/76)) + +* **Community**: + * Shared idea and gave suggestions to another group. + * Contributed to forum discussions + * [#206](https://github.com/nus-cs2103-AY2223S2/forum/issues/206) + * [#290](https://github.com/nus-cs2103-AY2223S2/forum/issues/290) diff --git a/docs/team/gwynethguo.md b/docs/team/gwynethguo.md new file mode 100644 index 00000000000..f2856700624 --- /dev/null +++ b/docs/team/gwynethguo.md @@ -0,0 +1,66 @@ +--- +layout: page +title: Gwyneth Guo Bai Ling's Project Portfolio Page +--- + +### Project: MATHUTORING + +MATHUTORING is a desktop application used for private Math tuition teachers to manage their students contact details and performance. 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 export a student's progress using Command Line Interface (CLI) `exportp` and Graphical User Interface (GUI). + * What it does: allows the user to export a student's progress into a PDF file using CLI or GUI. The PDF file consists of the student's name, date created, score list, and task list. + * Justification: + * This feature improves the product significantly because a user can directly export a student's progress to send it to the student or parent. + * This feature can also solve the problem where labels are not fully displayed in the application's User Interface. + * Highlights: + * The implementation was too challenging as it required writing to PDF files using coordinates. + * Manual wrapping must also be implemented to ensure texts do not overflow in the PDF file. + * Algorithms are needed to create lines and texts for task list and score list. + * A new command is also needed for CLI, involving user directory paths, which creates a lot of possible bugs for user with different OSes. + * Credits: Used a third-party library [Apache PDFBox](https://pdfbox.apache.org/) + +* **Code contributed**: [RepoSense link](https://nus-cs2103-ay2223s2.github.io/tp-dashboard/?search=gwynethguo&breakdown=true&sort=groupTitle%20dsc&sortWithin=title&since=2023-02-17&timeframe=commit&mergegroup=&groupSelect=groupByRepos&checkedFileTypes=docs~functional-code~test-code~other&tabOpen=true&tabType=authorship&tabAuthor=gwynethguo&tabRepo=AY2223S2-CS2103-W17-1%2Ftp%5Bmaster%5D&authorshipIsMergeGroup=false&authorshipFileTypes=docs~functional-code~test-code~other&authorshipIsBinaryFileTypeChecked=false&authorshipIsIgnoredFilesChecked=false) + +* **Project management**: + * Managed a release `v1.3.1` on GitHub + +* **Enhancements to existing features**: + * Added GUI for Task List and Score List panels ([#78](https://github.com/AY2223S2-CS2103-W17-1/tp/pull/78)) + * Added unit and integration tests for `exportp` command involving Stubs and Mocks ([#103](https://github.com/AY2223S2-CS2103-W17-1/tp/pull/103), [#179](https://github.com/AY2223S2-CS2103-W17-1/tp/pull/179)) + * Enhanced code quality for `PdfConverter.java` ([#171](https://github.com/AY2223S2-CS2103-W17-1/tp/pull/171)) + +* **Documentation**: + * User Guide: ([#132](https://github.com/AY2223S2-CS2103-W17-1/tp/pull/132), [#133](https://github.com/AY2223S2-CS2103-W17-1/tp/pull/133), [#176](https://github.com/AY2223S2-CS2103-W17-1/tp/pull/176)) + * Added screenshots to User Guide + * Rearranged User Guide to ensure good flow + * Added table of contents, user interface layout, user input restrictions, added links to sections. + * Developer Guide: ([#176](https://github.com/AY2223S2-CS2103-W17-1/tp/pull/176)) + * Added manual testing for exporting a student's progress feature + * Arranged some parts of the Developer Guide + +* **Contributions to team-based tasks**: + * Setup tP Team Organization + * Created a [GitHub Organization](https://github.com/AY2223S2-CS2103-W17-1) for the team. + * Add members to the organization and created a `developers` team. + * Setup tP Team Repository + * Forked the [repo](https://github.com/nus-cs2103-AY2223S2/tp) to the team organization. + * Enabled the issue tracker and GitHub Actions. + * Setup CodeCov. + * Added members to the repository and managed access of the team members. + * Added GitHub issues and helped manage the issues by adding labels and milestones. + * Updated site-wide settings ([#26](https://github.com/AY2223S2-CS2103-W17-1/tp/pull/26), [#28](https://github.com/AY2223S2-CS2103-W17-1/tp/pull/28), [#176](https://github.com/AY2223S2-CS2103-W17-1/tp/pull/176)) + * Changed project name, title, and badges. + * Changed site header to ensure that the details are correct when converting the documentation to the `.pdf` format. + * Changed site settings to change fonts and colors of the sites. + +* **Community**: + * PRs reviewed (with non-trivial review comments): ([#30](https://github.com/AY2223S2-CS2103-W17-1/tp/pull/30), [#119](https://github.com/AY2223S2-CS2103-W17-1/tp/pull/119), [#70](https://github.com/AY2223S2-CS2103-W17-1/tp/pull/70)) + * Reported bugs and suggestions for other teams in the class ([#16](https://github.com/gwynethguo/ped/issues/16), [#3](https://github.com/gwynethguo/ped/issues/3), [#6](https://github.com/gwynethguo/ped/issues/6)) + * Assist a group in git branching and fixing JUnit tests. + +* **Tools**: + * Integrated Code Coverage ([CodeCov](https://app.codecov.io/gh/AY2223S2-CS2103-W17-1/tp)) to the project. + * Integrated a third party library ([Apache PDFBox](https://pdfbox.apache.org/)) + * Integrated a mocking framework ([Mockito](https://site.mockito.org/)) diff --git a/docs/team/qqh0828.md b/docs/team/qqh0828.md new file mode 100644 index 00000000000..b0af6d5c0e9 --- /dev/null +++ b/docs/team/qqh0828.md @@ -0,0 +1,72 @@ +--- +layout: page +title: Qiu Qianhui's Project Portfolio Page +--- + +### Project: MATHUTORING + +MATHUTORING is a centralised desktop application targeted to private Math tuition teachers, helps them manage student contact details and performance by keeping student contact details, tasks, and scores. + +Given below are my contributions to the project. + +* **New Feature**: + 1. Add a score to a student [#75](https://github.com/AY2223S2-CS2103-W17-1/tp/pull/75) + * What it does: With this new feature, user can add a score to a student. + * Justification: This feature is important as users can keep track of the student's performance by adding their exam scores. + * Highlights: User can add new scores at any time. After adding a new score, it will be automatically saved in the student's unique score list. + When scores are checked by 'check' command, they will be automatically displayed with sorted order that nearest score shown at front. + + 2. Delete a score to a student [#75](https://github.com/AY2223S2-CS2103-W17-1/tp/pull/75) + * What it does: With this new feature, user can delete a score from a student. + * Justification: This feature is important as a use may add a wrong score and want to delete or edit it. + * Highlights: User can delete an existing scores at any time. After deleting an existing score, it will be automatically updated in the student's unique score list. + + 3. Score list chart and table statistic summary of recent five scores [#101](https://github.com/AY2223S2-CS2103-W17-1/tp/pull/101) [#106](https://github.com/AY2223S2-CS2103-W17-1/tp/pull/106) + * What it does: With ths new feature, user can view student's performance easily. + * Justification: The chart and the table statistic summary can easily show the student's recent performance, hence the user can plan their future sessions easily to suit the student's needs. + * Highlights: There are three colours to represent the different level of exam scores, e.g. red colour in percentage table column represents the decreasing grades. + +* **Code contributed**: [RepoSense link](https://nus-cs2103-ay2223s2.github.io/tp-dashboard/?search=qqh&sort=groupTitle&sortWithin=title&timeframe=commit&mergegroup=&groupSelect=groupByRepos&breakdown=true&checkedFileTypes=docs~functional-code~test-code~other&since=2023-02-17) + +* **Project management**: +* Individual + * Completed weekly requirements on time + * Created several GitHub branches for different increments +* Group + * Met the milestone deadlines + * Used GitHub for progress tracking + +* **Enhancements to existing features**: + * Refactor the whole AB3 to suit our project [#119](https://github.com/AY2223S2-CS2103-W17-1/tp/pull/119) + * Fixed some bugs on existing AB3 codes [#119](https://github.com/AY2223S2-CS2103-W17-1/tp/pull/119) + * Wrote some tests to increase the coverage [#186](https://github.com/AY2223S2-CS2103-W17-1/tp/pull/186) + * Bug fixing received from PE-D + +* **Documentation**: + * User Guide: + * Updated user guide with 'Managing score list of student' part + * Updated 'Command summary' part + * Developer Guide: + * Updated the target user profile, value proposition and user stories + * Updated the table of contents + * Updated most UML diagrams with puml files except task model diagram + * Added UniqueScoreList model in the Design Model section + * Added use cases that are related to score such as 'Add a score' and 'Delete a score' + * Added 'Instructions for manual testing' that are related to score such as 'Adding a score for a student' and 'Deleting a score for a student' + * Added 'Challenges faced' inside 'Effort' section + * Contributed in Planned Enhancements, such as 'Edit the tags will overwrite the whole list of tags' + * Update Other Documentations: AboutUs.md, README.md and documentations are inside tutorial folder + +* **Contributions to team-based tasks**: + * Added several GitHub issues and helped manage the issues through adding labels and milestones + * Contributed to conceptualize the Score List Chart panel design + +* **Community**: + * Reviewed PRs of peers (with non-trivial review comments) and helped to merge to the master + * Contributed to forum discussions (examples: [#320](https://github.com/nus-cs2103-AY2223S2/forum/issues/320) + [#296](https://github.com/nus-cs2103-AY2223S2/forum/issues/296) [#291](https://github.com/nus-cs2103-AY2223S2/forum/issues/291)) + * Contributed to help with smoke testing (examples:[#236](https://github.com/nus-cs2103-AY2223S2/forum/issues/236#issuecomment-1453378705)) + * Reported bugs and suggestions for other teams in the class (examples: [PE-D](https://github.com/QQH0828/ped/issues)) + +* **Tools**: + * Java 11, JavaFX, CSS diff --git a/docs/team/toh-xinyi.md b/docs/team/toh-xinyi.md new file mode 100644 index 00000000000..95e9cbb41d0 --- /dev/null +++ b/docs/team/toh-xinyi.md @@ -0,0 +1,42 @@ +--- +layout: page +title: Toh Xin Yi's Project Portfolio Page +--- + +MATHUTORING is a desktop application for private math tuition teachers to manage their students' contact as well as +their progress. It allows these tutors to track their students’ progress report which subsequently allows them to plan +future lessons and have an overall view of their schedule for ease of planning. + +Given below are my contributions to the project. + +* **Enhancements added**: + * Added task model and related commands to the original model + * [`addtask`](https://ay2223s2-cs2103-w17-1.github.io/tp/UserGuide.html#1-adding-a-task-for-a-student-addtask) + * [`deletetask`](https://ay2223s2-cs2103-w17-1.github.io/tp/UserGuide.html#2-deleting-a-task-of-a-student-deletetask) + * [`markcomplete`, `marklate`, `markinprogress`](https://ay2223s2-cs2103-w17-1.github.io/tp/UserGuide.html#3-marking-a-task-of-a-student-markcomplete-markinprogress-marklate) + +* **Code contributed**: [RepoSense link](https://nus-cs2103-ay2223s2.github.io/tp-dashboard/?search=&sort=groupTitle&sortWithin=title&timeframe=commit&mergegroup=&groupSelect=groupByRepos&breakdown=true&checkedFileTypes=docs~functional-code~test-code~other&since=2023-02-17) + +* **Contributions to team-based tasks**: + * Created issues during weekly team meeting to keep track of what needs to be done in detail each week and by who + * Upload screenshots of product demo during multiple milestones + +* **Project management**: + * Managed releases `v1.1` - `current release` on GitHub + +* **Contributions to documentation**: + * User Guide: + * Added documentation for the features `delete`, `add` and `listStudents` [\#48](https://github.com/AY2223S2-CS2103-W17-1/tp/pull/48) + * Did tweaks to existing documentation of command format notes: [\#47](https://github.com/AY2223S2-CS2103-W17-1/tp/pull/47) + * Developer Guide: + * Tweaked and added terminologies to glossary + * Added UML diagram for Task model + * Added instructions for manual testing of adding students, deleting students, adding tasks, deleting tasks and marking tasks + +* **Community**: + * PRs reviewed (with non-trivial review comments): [\#52](https://github.com/AY2223S2-CS2103-W17-1/tp/pull/52), +[\#49](https://github.com/AY2223S2-CS2103-W17-1/tp/pull/49), [\#19](https://github.com/AY2223S2-CS2103-W17-1/tp/pull/19), +[\#20](https://github.com/AY2223S2-CS2103-W17-1/tp/pull/20) + * PRs reviewed (with thorough comments and suggestions): [\#119](https://github.com/AY2223S2-CS2103-W17-1/tp/pull/119), [\#166](https://github.com/AY2223S2-CS2103-W17-1/tp/pull/166) + * Contributed to forum discussions (examples: [Issue regarding tweaking GUI for better user experience](https://github.com/nus-cs2103-AY2223S2/forum/issues/161#issuecomment-1427028125)) + * Reported bugs and suggestions for other teams in the class (examples: [PE-D](https://github.com/toh-xinyi/ped/issues)) diff --git a/docs/tutorials/AddRemark.md b/docs/tutorials/AddRemark.md index 880c701042f..962780ca198 100644 --- a/docs/tutorials/AddRemark.md +++ b/docs/tutorials/AddRemark.md @@ -5,7 +5,16 @@ 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: +
+ +**:exclamation: Caution:**
+* In order to avoid potential confusion, you many find some classes' name are different from the commit link provided. +* This is because you will be doing this tutorial based on `Mathutoring` application which is based on pre-existing codebase `AB3`. +* Some examples are and are not limited to: `Person` to `Student`, `AddressBook` to `Mathutoring`. +* Please change your codes accordingly when you are going through this tutorial. +
+ +This command allows users of the Mathutoring application to add optional remarks to people in their mathutoring and edit it if required. The command should have the following format: `remark INDEX r/REMARK` (e.g., `remark 2 r/Likes baseball`) @@ -28,7 +37,7 @@ package seedu.address.logic.commands; import seedu.address.model.Model; /** - * Changes the remark of an existing person in the address book. + * Changes the remark of an existing student in the address book. */ public class RemarkCommand extends Command { @@ -43,7 +52,7 @@ public class RemarkCommand extends Command { ### Hook `RemarkCommand` into the application -Now that we have our `RemarkCommand` ready to be executed, we need to update `AddressBookParser#parseCommand()` to recognize the `remark` keyword. Add the new command to the `switch` block by creating a new `case` that returns a new instance of `RemarkCommand`. +Now that we have our `RemarkCommand` ready to be executed, we need to update `MathutoringParser#parseCommand()` to recognize the `remark` keyword. Add the new command to the `switch` block by creating a new `case` that returns a new instance of `RemarkCommand`. You can refer to the changes in this [diff](https://github.com/se-edu/addressbook-level3/commit/35eb7286f18a029d39cb7a29df8f172a001e4fd8#diff-399c284cb892c20b7c04a69116fcff6ccc0666c5230a1db8e4a9145def8fa4ee). @@ -65,8 +74,8 @@ Following the convention in other commands, we add relevant messages as constant ``` 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. " + + ": Edits the remark of the student identified " + + "by the index number used in the last student listing. " + "Existing remark will be overwritten by the input.\n" + "Parameters: INDEX (must be a positive integer) " + "r/ [REMARK]\n" @@ -101,8 +110,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 student in the filtered student list to edit the remark + * @param remark of the student to be updated to */ public RemarkCommand(Index index, String remark) { requireAllNonNull(index, remark); @@ -216,7 +225,7 @@ public RemarkCommand parse(String args) throws ParseException {
-:information_source: Don’t forget to update `AddressBookParser` to use our new `RemarkCommandParser`! +:information_source: Don’t forget to update `MathutoringParser` to use our new `RemarkCommandParser`!
@@ -225,11 +234,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 student data. We achieve that by working with the `Student` model. Each field in a Student is implemented as a separate class (e.g. a `Name` object represents the student’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 student. ### 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.address.model.student`. 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-41bb13c581e280c686198251ad6cc337cd5e27032772f06ed9bf7f1440995ece). Note how `Remark` has no constrains and thus does not require input validation. @@ -240,9 +249,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 student. -Simply add the following to [`seedu.address.ui.PersonCard`](https://github.com/se-edu/addressbook-level3/commit/850b78879582f38accb05dd20c245963c65ea599#diff-639834f1e05afe2276a86372adf0fe5f69314642c2d93cfa543d614ce5a76688). +Simply add the following to [`seedu.address.ui.StudentCard`](https://github.com/se-edu/addressbook-level3/commit/850b78879582f38accb05dd20c245963c65ea599#diff-639834f1e05afe2276a86372adf0fe5f69314642c2d93cfa543d614ce5a76688). **`PersonCard.java`:** @@ -254,9 +263,9 @@ private Label remark; `@FXML` is an annotation that marks a private or protected field and makes it accessible to FXML. It might sound like Greek to you right now, don’t worry — we will get back to it later. -Then insert the following into [`main/resources/view/PersonListCard.fxml`](https://github.com/se-edu/addressbook-level3/commit/850b78879582f38accb05dd20c245963c65ea599#diff-d44c4f51c24f6253c277a2bb9bc440b8064d9c15ad7cb7ceda280bca032efce9). +Then insert the following into [`main/resources/view/StudentListCard.fxml`](https://github.com/se-edu/addressbook-level3/commit/850b78879582f38accb05dd20c245963c65ea599#diff-d44c4f51c24f6253c277a2bb9bc440b8064d9c15ad7cb7ceda280bca032efce9). -**`PersonListCard.fxml`:** +**`StudentListCard.fxml`:** ``` xml