diff --git a/LICENSE b/LICENSE index 39b3478982c..3ee16000e96 100644 --- a/LICENSE +++ b/LICENSE @@ -2,11 +2,11 @@ MIT License Copyright (c) 2016 Software Engineering Education - FOSS Resources -Permission is hereby granted, free of charge, to any person obtaining a copy +Permission is hereby granted, free of charge, to any student obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell -copies of the Software, and to permit persons to whom the Software is +copies of the Software, and to permit students to whom the Software is furnished to do so, subject to the following conditions: The above copyright notice and this permission notice shall be included in all diff --git a/README.md b/README.md index 13f5c77403f..6e1abc5d9ba 100644 --- a/README.md +++ b/README.md @@ -1,14 +1,13 @@ -[![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/AY2021S1-CS2103T-W15-2/tp/workflows/Java%20CI/badge.svg)](https://github.com/AY2021S1-CS2103T-W15-2/tp/actions) +## Reeve ![Ui](docs/images/Ui.png) -* This is **a sample project for Software Engineering (SE) students**.
- Example usages: - * as a starting point of a course project (as opposed to writing everything from scratch) - * as a case study -* The project simulates an ongoing software project for a desktop application (called _AddressBook_) used for managing contact details. - * It is **written in OOP fashion**. It provides a **reasonably well-written** code base **bigger** (around 6 KLoC) than what students usually write in beginner-level SE modules, without being overwhelmingly big. - * It comes with a **reasonable level of user and developer documentation**. -* It is named `AddressBook Level 3` (`AB3` for short) because it was initially created as a part of a series of `AddressBook` projects (`Level 1`, `Level 2`, `Level 3` ...). -* For the detailed documentation of this project, see the **[Address Book Product Website](https://se-education.org/addressbook-level3)**. -* This project is a **part of the se-education.org** initiative. If you would like to contribute code to this project, see [se-education.org](https://se-education.org#https://se-education.org/#contributing) for more info. +**Reeve** is a desktop application for **private tutors to better manage both administrative and academic details of their students**, optimised for use via a **Command Line Interface (CLI)** for receiving inputs while still having the benefits of a **Graphical User Interface (GUI)** for displaying information. + +* Interested in using Reeve? Head over to the [_Quick Start_ section of the **User Guide**](https://github.com/AY2021S1-CS2103T-W15-2/tp/blob/master/docs/UserGuide.md#2-quick-start)! +* Interested in developing Reeve? The [**Developer Guide**](https://github.com/AY2021S1-CS2103T-W15-2/tp/blob/master/docs/DeveloperGuide.md) 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), [jfxtras-agenda](https://jfxtras.org/doc/8.0/jfxtras-agenda/index.html), [jfxtras-icalendarfx](https://jfxtras.org/doc/8.0/jfxtras-icalendarfx/index.html), [jfxtras-icalendaragenda](https://jfxtras.org/doc/8.0/jfxtras-icalendaragenda/index.html) +* This project is based on the AddressBook-Level3 project created by the [SE-EDU initiative](https://se-education.org). diff --git a/build.gradle b/build.gradle index be2d2905dde..724827fc476 100644 --- a/build.gradle +++ b/build.gradle @@ -60,13 +60,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.jfxtras:jfxtras-icalendarfx:10.0-r1' + implementation 'org.jfxtras:jfxtras-icalendaragenda:10.0-r1' + implementation 'org.jfxtras:jfxtras-agenda:10.0-r1' + testImplementation group: 'org.junit.jupiter', name: 'junit-jupiter-api', version: jUnitVersion testRuntimeOnly group: 'org.junit.jupiter', name: 'junit-jupiter-engine', version: jUnitVersion } +run { + enableAssertions = true +} + shadowJar { - archiveName = 'addressbook.jar' + archiveName = 'Reeve.jar' } defaultTasks 'clean', 'test' diff --git a/docs/AboutUs.md b/docs/AboutUs.md index 1c9514e966a..6fe34203c7e 100644 --- a/docs/AboutUs.md +++ b/docs/AboutUs.md @@ -9,51 +9,42 @@ You can reach us at the email `seer[at]comp.nus.edu.sg` ## Project team -### John Doe +### Ong Ying Gao - + -[[homepage](http://www.comp.nus.edu.sg/~damithch)] -[[github](https://github.com/johndoe)] -[[portfolio](team/johndoe.md)] +[[github](https://github.com/StopTakingAllTheNames)] -* Role: Project Advisor +* Role: Developer -### Jane Doe +### Vaishak Anand - + -[[github](http://github.com/johndoe)] -[[portfolio](team/johndoe.md)] +[[github](http://github.com/VaishakAnand)] -* Role: Team Lead -* Responsibilities: UI +* Role: Developer -### Johnny Doe +### Alex Chua - + -[[github](http://github.com/johndoe)] [[portfolio](team/johndoe.md)] +[[github](https://github.com/AlexCQY)] * Role: Developer -* Responsibilities: Data -### Jean Doe +### Ng Choon Siong - + -[[github](http://github.com/johndoe)] -[[portfolio](team/johndoe.md)] +[[github](http://github.com/csiongn)] * Role: Developer -* Responsibilities: Dev Ops + Threading -### James Doe +### Hogan Tan - + -[[github](http://github.com/johndoe)] -[[portfolio](team/johndoe.md)] +[[github](http://github.com/hogantan)] * Role: Developer -* Responsibilities: UI diff --git a/docs/DeveloperGuide.md b/docs/DeveloperGuide.md index 4829fe43011..c50af803cdf 100644 --- a/docs/DeveloperGuide.md +++ b/docs/DeveloperGuide.md @@ -1,70 +1,172 @@ ---- -layout: page -title: Developer Guide ---- -* Table of Contents -{:toc} - --------------------------------------------------------------------------------------------------------------------- - -## **Setting up, getting started** +## **Reeve** - Developer Guide + +**Table of Contents** +- [1. Introduction](#1-introduction) +- [2. About](#2-about) +- [3. Understanding the guide](#3-understanding-the-guide) +- [4. Getting started](#4-getting-started) +- [5. Design](#5-design) + * [5.1 Architecture](#51-architecture) + * [5.2 UI component](#52-ui-component) + * [5.3 Logic component](#53-logic-component) + * [5.4 Model component](#54-model-component) + * [5.5 Storage component](#55-storage-component) + * [5.6 Common classes](#56-common-classes) +- [6. Implementation](#6-implementation) + * [6.1 General features](#61-general-features) + * [6.1.1 Help Command](#611-help-command) + * [6.1.2 Toggle Command](#612-toggle-command) + * [6.1.3 Exit Command](#613-exit-command) + * [6.2 Student administrative details features](#62-student-administrative-details-features) + * [6.2.1 Add student command](#621-add-student-command) + * [6.2.2 Edit student command](#622-edit-student-command) + * [6.2.3 Delete student command](#623-delete-student-command) + * [6.2.4 Find student command](#624-find-student-command) + * [6.2.5 Overdue command](#625-overdue-command) + * [6.2.6 Detail commands](#626-detail-commands) + * [6.2.6.1 Add detail command](#6261-add-detail-command) + * [6.2.6.2 Edit detail command](#6262-edit-detail-command) + * [6.2.6.3 Delete detail command](#6263-delete-detail-command) + * [6.2.7 Sort command](#627-sort-command) + * [6.3 Student academic details features](#63-student-academic-details-features) + * [6.3.1 Question commands](#631-question-commands) + * [6.3.1.1 Add question command](#6311-add-question-command) + * [6.3.1.2 Solve question command](#6312-solve-question-command) + * [6.3.1.3 Delete question command](#6313-delete-question-command) + * [6.3.1.4 Design considerations](#6314-design-considerations) + * [6.3.2 Exam Commands](#632-exam-commands) + * [6.3.2.1 Add exam command](#6321-add-exam-command) + * [6.3.2.2 Delete exam command](#6322-delete-exam-command) + * [6.3.2.3 Exam Stats command](#6323-exam-stats-command) + * [6.3.3 Attendance commands](#633-attendance-commands) + * [6.3.3.1 Add attendance command](#6331-add-attendance-command) + * [6.3.3.2 Delete attendance command](#6332-delete-attendance-command) + * [6.4 Schedule command](#64-schedule-command) + * [6.5 Notebook feature](#65-notebook-feature) + * [6.5.1 Add note command](#651-add-note-command) + * [6.5.2 Edit note command](#652-edit-note-command) + * [6.5.3 Delete note command](#653-delete-note-command) +- [7. Documentation](#7-documentation) +- [8. Logging](#8-logging) +- [9. Testing](#9-testing) +- [10. Configuration](#10-configuration) +- [11. DevOps](#11-devops) +- [Appendix A: Product Scope](#appendix-a-product-scope) +- [Appendix B: User Stories](#appendix-b-user-stories) +- [Appendix C: Use Cases](#appendix-c-use-cases) +- [Appendix D: Non-Functional Requirements](#appendix-d-non-functional-requirements) +- [Appendix E: Glossary](#appendix-e-glossary) +- [Appendix F: Instructions for Manual Testing](#appendix-f-instructions-for-manual-testing) + * [F.1 Launch and Shutdown](#f1-launching-reeve) + * [F.2 General Features](#f2-general-features) + * [F.3 Administrative Features](#f3-student-administrative-features) + * [F.4 Academic Features](#f4-student-academic-features) + * [F.5 Notebook Features](#f5-notebook-feature) + * [F.6 Saving Data](#f6-saving-data) + + +## 1. Introduction +Welcome to **Reeve**! + +**Reeve** is a desktop application for **private tutors to better manage both administrative and academic details of their students**, optimised for use via a +**Command Line Interface (CLI)** for receiving inputs while still having the benefits of a **Graphical User Interface (GUI)** for displaying information. +In addition, **Reeve** comes with a customisable personal scheduler to assist users to keep track of their classes. **Reeve** also allows users to set timely reminders for themselves. + +**Reeve** is optimized for users that are very comfortable with typing as it works on a Command Line Interface (CLI). + +Students' details are displayed in a neat and organized manner through the use of a Graphical User Interface (GUI). + +## 2. About + +This developer guide will provide you the details of the software architecture and implementation of **Reeve**. +It is made for developers who wish to understand the internal and external workings of the application. + +All developers are warmly welcome to contribute your ideas and improve **Reeve**! +To contribute, simply head over to [our github](https://github.com/AY2021S1-CS2103T-W15-2/tp) and raise an issue. + +## 3. Understanding the Guide + +This section will share with you how should you go about understanding this guide in order to best understand **Reeve**. + +We have adopted the "top-down" approach into the structure of this guide where we will first look at the high-level structure of our application +before going into the implementation details of each feature. + +We highly encourage you to read the guide from top to bottom in order to have the best understanding of **Reeve**. + +Here is a summary (Table 1) of the symbols that are used in this Developer Guide: + +Table 1: Summary of symbols + +Symbol | Meaning +:-----:|:------- +`code` | Code snippets +:information_source: | Important information +:bulb: | Tips + +
+ +## 4. **Getting Started** Refer to the guide [_Setting up and getting started_](SettingUp.md). --------------------------------------------------------------------------------------------------------------------- +## 5. **Design** + +### 5.1 Architecture -## **Design** +

+
Figure 1: Architecture Diagram

-### Architecture - - +
The ***Architecture Diagram*** given above explains the high-level design of the App. Given below is a quick overview of each component.
-:bulb: **Tip:** The `.puml` files used to create diagrams in this document can be found in the [diagrams](https://github.com/se-edu/addressbook-level3/tree/master/docs/diagrams/) folder. Refer to the [_PlantUML Tutorial_ at se-edu/guides](https://se-education.org/guides/tutorials/plantUml.html) to learn how to create and edit diagrams. +:bulb: The `.puml` files used to create diagrams in this document can be found in the [diagrams](https://github.com/AY2021S1-CS2103T-W15-2/tp/tree/master/docs/diagrams/) folder. Refer to the [_PlantUML Tutorial_ at se-edu/guides](https://se-education.org/guides/tutorials/plantUml.html) to learn how to create and edit diagrams.
-**`Main`** has two classes called [`Main`](https://github.com/se-edu/addressbook-level3/tree/master/src/main/java/seedu/address/Main.java) and [`MainApp`](https://github.com/se-edu/addressbook-level3/tree/master/src/main/java/seedu/address/MainApp.java). It is responsible for, +**`Main`** has two classes called [`Main`](https://github.com/AY2021S1-CS2103T-W15-2/tp/blob/master/src/main/java/seedu/address/Main.java) and [`MainApp`](https://github.com/AY2021S1-CS2103T-W15-2/tp/blob/master/src/main/java/seedu/address/MainApp.java). It is responsible for, * At app launch: Initializes the components in the correct sequence, and connects them up with each other. * At shut down: Shuts down the components and invokes cleanup methods where necessary. -[**`Commons`**](#common-classes) represents a collection of classes used by multiple other components. +[**`Commons`**](#56-common-classes) represents a collection of classes used by multiple other components. The rest of the App consists of four components. -* [**`UI`**](#ui-component): The UI of the App. -* [**`Logic`**](#logic-component): The command executor. -* [**`Model`**](#model-component): Holds the data of the App in memory. -* [**`Storage`**](#storage-component): Reads data from, and writes data to, the hard disk. +* [**`UI`**](#52-ui-component): The UI of the App. +* [**`Logic`**](#53-logic-component): The command executor. +* [**`Model`**](#54-model-component): Holds the data of the App in memory. +* [**`Storage`**](#55-storage-component): Reads data from, and writes data to, the hard disk. Each of the four components, -* defines its *API* in an `interface` with the same name as the Component. +* defines its API in an `interface` with the same name as the Component. * exposes its functionality using a concrete `{Component Name}Manager` class (which implements the corresponding API `interface` mentioned in the previous point. -For example, the `Logic` component (see the class diagram given below) defines its API in the `Logic.java` interface and exposes its functionality using the `LogicManager.java` class which implements the `Logic` interface. +For example, the `Logic` component (in the diagram below) defines its API in the `Logic.java` interface and exposes its functionality using the `LogicManager.java` class which implements the `Logic` interface. -![Class Diagram of the Logic Component](images/LogicClassDiagram.png) +

+
Figure 2: Logic Component Class Diagram

**How the architecture components interact with each other** The *Sequence Diagram* below shows how the components interact with each other for the scenario where the user issues the command `delete 1`. - +

+
Figure 3: Architecture Sequence Diagram

The sections below give more details of each component. -### UI component +### 5.2 UI component -![Structure of the UI Component](images/UiClassDiagram.png) +

+
Figure 4: Ui Component Class Diagram

**API** : -[`Ui.java`](https://github.com/se-edu/addressbook-level3/tree/master/src/main/java/seedu/address/ui/Ui.java) +[`Ui.java`](https://github.com/AY2021S1-CS2103T-W15-2/tp/tree/master/src/main/java/seedu/address/ui) -The UI consists of a `MainWindow` that is made up of parts e.g.`CommandBox`, `ResultDisplay`, `PersonListPanel`, `StatusBarFooter` etc. All these, including the `MainWindow`, inherit from the abstract `UiPart` class. +The UI consists of a `MainWindow` that is made up of parts e.g.`CommandBox`, `ResultDisplay`, `StudentListPanel`, `Notebook` etc. All these, including the `MainWindow`, inherit from the abstract `UiPart` class. The `UI` component uses JavaFx UI framework. The layout of these UI parts are defined in matching `.fxml` files that are in the `src/main/resources/view` folder. For example, the layout of the [`MainWindow`](https://github.com/se-edu/addressbook-level3/tree/master/src/main/java/seedu/address/ui/MainWindow.java) is specified in [`MainWindow.fxml`](https://github.com/se-edu/addressbook-level3/tree/master/src/main/resources/view/MainWindow.fxml) @@ -73,284 +175,1654 @@ The `UI` component, * Executes user commands using the `Logic` component. * Listens for changes to `Model` data so that the UI can be updated with the modified data. -### Logic component +### 5.3 Logic component -![Structure of the Logic Component](images/LogicClassDiagram.png) +

+
Figure 5: Logic Component Class Diagram

**API** : -[`Logic.java`](https://github.com/se-edu/addressbook-level3/tree/master/src/main/java/seedu/address/logic/Logic.java) +[`Logic.java`](https://github.com/AY2021S1-CS2103T-W15-2/tp/blob/master/src/main/java/seedu/address/logic/Logic.java) -1. `Logic` uses the `AddressBookParser` class to parse the user command. +1. `Logic` uses the `ReeveParser` class to parse the user command. 1. This results in a `Command` object which is executed by the `LogicManager`. -1. The command execution can affect the `Model` (e.g. adding a person). +1. The command execution can affect the `Model` (e.g. adding a student). 1. The result of the command execution is encapsulated as a `CommandResult` object which is passed back to the `Ui`. 1. In addition, the `CommandResult` object can also instruct the `Ui` to perform certain actions, such as displaying help to the user. Given below is the Sequence Diagram for interactions within the `Logic` component for the `execute("delete 1")` API call. -![Interactions Inside the Logic Component for the `delete 1` Command](images/DeleteSequenceDiagram.png) +

+
Figure 6: Delete Sequence Diagram

-
: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. +
+:information_source: The lifeline for `DeleteCommandParser` should end at the destroy marker (X) but due to a limitation of PlantUML, the lifeline reaches the end of diagram.
-### Model component +### 5.4 Model component + +

+
Figure 7: Model Component Class Diagram

-![Structure of the Model Component](images/ModelClassDiagram.png) +

+
Figure 8: Admin Class Diagram

-**API** : [`Model.java`](https://github.com/se-edu/addressbook-level3/tree/master/src/main/java/seedu/address/model/Model.java) +

+
Figure 9: Academic Class Diagram

+ +**API** : [`Model.java`](https://github.com/AY2021S1-CS2103T-W15-2/tp/blob/master/src/main/java/seedu/address/model/Model.java) The `Model`, * stores a `UserPref` object that represents the user’s preferences. -* stores the address book data. -* exposes an unmodifiable `ObservableList` that can be 'observed' e.g. the UI can be bound to this list so that the UI automatically updates when the data in the list change. +* holds the data of **Reeve** in memory. +* exposes an unmodifiable `ObservableList` that can be 'observed' e.g. the UI can be bound to this list so that the UI automatically updates when the data in the list change. * does not depend on any of the other three components. +### 5.5 Storage component -
:information_source: **Note:** An alternative (arguably, a more OOP) model is given below. It has a `Tag` list in the `AddressBook`, which `Person` references. This allows `AddressBook` to only require one `Tag` object per unique `Tag`, instead of each `Person` needing their own `Tag` object.
-![BetterModelClassDiagram](images/BetterModelClassDiagram.png) +

+
Figure 10: Storage Class Diagram

-
+**API** : [`Storage.java`](https://github.com/AY2021S1-CS2103T-W15-2/tp/blob/master/src/main/java/seedu/address/storage/Storage.java) +From the diagram above, the `Storage` component, +* can save `UserPref` objects in json format and read it back. +* can save `Reeve` data in json format and read it back. +* stores `Student` and `Note` data from the `Model` component in `JsonSerializableReeve` and `JsonSerializableNotebook` objects respectively. -### Storage component +The `JsonSerializableReeve` component stores `JsonAdaptedStudent` objects converted from the `Student` objects in the `Model` component. +Each `JsonAdaptedStudent` object also contains json-friendly versions of `Student` data as shown in the class diagram below. -![Structure of the Storage Component](images/StorageClassDiagram.png) +

+
Figure 11: JsonSerializableReeve Class Diagram

-**API** : [`Storage.java`](https://github.com/se-edu/addressbook-level3/tree/master/src/main/java/seedu/address/storage/Storage.java) +The `JsonSerializableNotebook` component stores `JsonAdaptedNote` objects converted from `Note` objects in the `Model` component, as shown in the class diagram below. -The `Storage` component, -* can save `UserPref` objects in json format and read it back. -* can save the address book data in json format and read it back. +

+
Figure 12: JsonSerializableNotebook Class Diagram

-### Common classes +### 5.6 Common classes Classes used by multiple components are in the `seedu.addressbook.commons` package. --------------------------------------------------------------------------------------------------------------------- - -## **Implementation** +## 6. **Implementation** This section describes some noteworthy details on how certain features are implemented. -### \[Proposed\] Undo/redo feature +### 6.1 General features -#### Proposed Implementation +This section describes some key details on how general features are implemented. -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: +#### 6.1.1 Help Command -* `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. +The following describes the flow of how `HelpCommand` is performed. -These operations are exposed in the `Model` interface as `Model#commitAddressBook()`, `Model#undoAddressBook()` and `Model#redoAddressBook()` respectively. +1. Upon successfully parsing the user input, the `HelpCommand#execute(Model model)` is called. +2. A `CommandResult` with the `shouldShowHelp` field set to true is returned and `MainWindow#handleHelp()` is called. +3. A Help display window will be opened showing a link to the User Guide. -Given below is an example usage scenario and how the undo/redo mechanism behaves at each step. +
-Step 1. The user launches the application for the first time. The `VersionedAddressBook` will be initialized with the initial address book state, and the `currentStatePointer` pointing to that single address book state. +:information_source: If there is already a Help window already opened, and `HelpCommand` is executed, `HelpWindow#focus()` will be called to focus on the already opened window. -![UndoRedoState0](images/UndoRedoState0.png) +
-Step 2. The user executes `delete 5` command to delete the 5th person in the address book. The `delete` command calls `Model#commitAddressBook()`, causing the modified state of the address book after the `delete 5` command executes to be saved in the `addressBookStateList`, and the `currentStatePointer` is shifted to the newly inserted address book state. +#### 6.1.2 Toggle Command -![UndoRedoState1](images/UndoRedoState1.png) +The following describes the flow of how `ToggleStudentCardCommand` is performed. -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`. +1. Upon successfully parsing the user input, the `ToggleStudentCardCommand#execute(Model model)` is called. +2. A `CommandResult` with the `toggleStudentCard` field set to true is returned and `MainWindow#handleAcademicPanel()` is called. +3. Student cards in `StudentListPanel` will be switched. -![UndoRedoState2](images/UndoRedoState2.png) +
-
:information_source: **Note:** If a command fails its execution, it will not call `Model#commitAddressBook()`, so the address book state will not be saved into the `addressBookStateList`. +:information_source: By default, `StudentListPanel` uses the `StudentAcademicCard`. -
+

-Step 4. The user now decides that adding the person was a mistake, and decides to undo that action by executing the `undo` command. The `undo` command will call `Model#undoAddressBook()`, which will shift the `currentStatePointer` once to the left, pointing it to the previous address book state, and restores the address book to that state. +The following sequence diagram shows how the `ToggleStudentCardCommand` execution works. -![UndoRedoState3](images/UndoRedoState3.png) +

+
Figure 13: ToggleStudentCard Sequence Diagram

-
: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. +The following explains the design considerations of the `toggle` command. -
+**Aspect: How the GUI responds when toggle is executed** + +* **Alternative 1 (current choice)**: Switch between two types of student cards, student academic card and student admin card for the cards used in the student list panel. + * Pros: Easy to implement, reduces cluttering of information, allows for better focus on different information,. + * Cons: Can take a long time to execute finish or introduce unfinished toggling if student list is large. + +* **Alternative 2**: Introduce two tabs, one for admin details and the other for academic details and toggling switches between these two tabs. + * Pros: Student list size does not slow down execution of command. + * Cons: Double the work when executing commands such as `find` because there are now two lists to update, repeat of basic information such as student's name, phone, school and academic level, harder to implement. + +#### 6.1.3 Exit Command + +The following describes the flow of how `ExitCommand` is performed. + +1. Upon successfully parsing the user input, the `ExitCommand#execute(Model model)` is called. +2. A `CommandResult` with the `shouldExit` field set to true is returned and `MainWindow#handleExit()` is called. +3. **Reeve** shuts down. + +### 6.2 Student administrative details features + +This section describes some key details on how administrative details features are implemented. + +#### 6.2.1 Add Student Command + +The following describes the flow of how `AddCommand` is performed. + +1. Upon successfully parsing the user input, the `AddCommand#execute(Model model)` is called which checks whether +the added student already exists in the `UniqueStudentList` using the `Model#hasStudent(Student toAdd)`. +2. A unique student is defined by `Name`, `Phone`, `School` and `Year`. If a duplicate student is defined, +a `CommandException` is thrown and the student will not be added. +3. The `AddCommand#execute(Model model)` also checks if the student to be added has clashing `ClassTime` with other students already in the `UniqueStudentList`. +4. Two student's `ClassTime` are considered clashing if they overlap either partially or fully. A `CommandException` will be thrown if there are other students with clashing class time. +5. If the added student is not a duplicate and there are no clashes in class time, then the `Model#addStudent(Student toAdd)` is called to add the student. +A new `CommandResult` is returned with a success message and the added student. +6. The student is be added into `UniqueStudentList` and a success message is shown in the result display. + +The following sequence diagram summarizes the execution of the `AddCommand`: + +

+
Figure 14: Add Student Sequence Diagram

+ +The following activity diagram summarizes the flow of events when the `AddCommand` is being executed: + +

+
Figure 15: Add Student Activity Diagram

+ +#### 6.2.2 Edit Student Command + +The following describes the flow of how `EditCommand` is executed. + +1. Upon successfully parsing the user input, the `EditCommand#execute(Model model)` is called which checks if the student at the specified position exists. +2. If there is no student at the specified position, a `CommandException` is thrown and the student is not edited. +3. If there is such a student, the `EditCommand#execute(Model model)` then creates the edited student, and checks to see if the edited student already exists in the `UniqueStudentList` using the `Model#hasStudent(Student toAdd)`. +4. If it is a duplicate student, a `CommandException` is thrown and the edited student will not be added. +5. The `EditCommand#execute(Model model)` also checks if the edited student has clashing `ClassTime` with other students already in the `UniqueStudentList`. +6. Two student's `ClassTime` are considered clashing if they overlap either partially or fully. A `CommandException` will be thrown if there are other students with clashing class time. +7. If the edited student is not a duplicate and there are no clashes in class time, then the`Model#setStudent(Student target, Student editedStudent)` is called to replace the outdated student with the edited copy. A new `CommandResult` is returned with a success message showing the newly edited student. +8. The edited student replaces the outdated student in the `UniqueStudentList` and a success message is shown in the result display. + +The following sequence diagram shows how the `EditCommand` execution works. + +

+
Figure 16: Edit Student Sequence Diagram

+ +The following activity diagram summarizes the flow of events when the `EditCommand` is executed. + +

+
Figure 17: Edit Student Activity Diagram

+ +#### 6.2.3 Delete Student Command -The following sequence diagram shows how the undo operation works: +The following describes the flow of how `DeleteCommand` is performed. -![UndoSequenceDiagram](images/UndoSequenceDiagram.png) +1. Upon successfully parsing the user input, the `DeleteCommand#execute(Model model)` is called which checks whether +the specified `Index` is a valid index based on the `UniqueStudentList`, in the case where it is invalid, a `CommandException` is thrown and no student will be deleted. +2. Otherwise, the `Student` at the specified valid `Index` is then removed from the `UniqueStudentList` using the `Model#deleteStudent(Student target)` method. +3. The specified student is deleted from the `UniqueStudentList` and a success message is shown in the result display. -
:information_source: **Note:** The lifeline for `UndoCommand` should end at the destroy marker (X) but due to a limitation of PlantUML, the lifeline reaches the end of diagram. +
+ +:information_source: A valid `Index` is one that is within the bounds of the `UniqueStudentList`.
-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. +#### 6.2.4 Find Student Command + +The following describes the flow of how `FindCommand` is performed. + +1. After the `FindCommand` is created by parsing user input, `FindCommand::execute` is called. +2. The method then calls `getPredicates()` of the `FindStudentDescriptor` stored within `FindCommand` to obtain a `List` to search with. +3. The predicates within `List`are then combined into `consolidatedPredicate`. +4. The `FilteredList` within the `Model` is then updated using `Model#updateFilteredPersonList(Predicate predicate)` for display. +5. A new `CommandResult` will be returned with the success message. + +The following sequence diagram shows how the `FindCommand` execution works. + +

+
Figure 18: Find Student Sequence Diagram

+ +The following activity diagram summarizes the flow of events when the `FindCommand` is executed. + +

+
Figure 19: Find Student Activity Diagram

+ +#### 6.2.5 Overdue Command + +The overdue payment filter feature allows the tutor to find all students who have not paid their tuition fees in the past month. It is handled by the `OverdueCommand`. + +The following describes the flow of how `OverdueCommand` is executed. + +1. Upon successfully parsing the user input, `OverdueCommand#execute(Model model)` is called to filter all students in **Reeve** whose last date of payment was more than a month ago. +2. `Model#updateFilteredStudentsList(Predicate predicate)` is called to find only students that match the above condition. A new `CommandResult` is returned with a successful message indicating the number of matching students. +3. The filtered student list replaces the displayed list on the GUI and a success message is shown in the result display. + +The following sequence diagram shows how the `OverdueCommand` execution works. + +

+
Figure 20: Overdue Sequence Diagram

+ +The following activity diagram summarises the flow of events when `OverdueCommand` is executed. + +

+
Figure 21: Overdue Activity Diagram

+ +#### 6.2.6 Detail Commands + +The Detail commands keep track of any additional details a tutor wants to add to a student. They comprise of the following commands: + +* `AddDetailCommand` - Adds a detail to a specified student. +* `EditDetailCommand` - Edits a specified detail in a specified student. +* `DeleteDetailCommand` - Deletes a specified detail from a specified student. + +##### 6.2.6.1 Add Detail Command + +The following describes the flow of how `AddDetailCommand` is performed. + +1. Upon successfully parsing the user input, `AddDetailCommand#execute(Model model)`, and it checks if the student at the specified position exists. +2. If there is no student at the specified position, a `CommandException` is thrown and the detail will not be added. +3. If the student exists, the detail is added to the student's list of details, and `DetailCommand#updateStudentDetail(Student studentToAddDetail, List details)` is called to create a modified copy of the student with the new detail. +4. `Model#setStudent(Student target, Student editedStudent)` is called to replace the student with the modified copy. A new `CommandResult` is returned with a success message showing the affected student and the detail added. +5. The modified student replaces the outdated student in the `UniqueStudentList` and a success message is shown in the result display. + +The following sequence diagram shows how the detail adding operation works. + +

+
Figure 22: Add detail Sequence Diagram

+ +The following activity diagram summarises the flow of events when `AddDetailCommand` is executed. + +

+
Figure 23: Add detail activity Diagram

+ +##### 6.2.6.2 Edit Detail Command + +The following describes the flow of how `EditDetailCommand` is performed. + +1. Upon successfully parsing the user input, `EditDetailCommand#execute(Model model)`, and it checks if the student at the specified position exists. +2. If there is no student at the specified position, a `CommandException` is thrown and the detail will not be edited. +3. If the student exists, `EditDetailCommand#execute(Model model)` then checks if the detail at the specified position exists. +4. If there is no detail at the specified position, a `CommandException` is thrown and the detail will not be edited. +5. If the detail exists, the newly updated detail is added to the student's list of details, and `DetailCommand#updateStudentDetail(Student studentToEditDetail, List details)` is called to create a modified copy of the student with the new detail. +6. `Student#addQuestion(Question question)` is called to create a modified copy of the student with a newly added question. +7. `Model#setStudent(Student target, Student editedStudent)` is called to replace the student with the modified copy. A new `CommandResult` is returned with a success message showing the affected student and the detail added. +8. The modified student replaces the outdated student in the `UniqueStudentList` and a success message is shown in the result display. + +The following sequence diagram shows how the detail editing operation works. + +

+
Figure 24: Edit detail Sequence Diagram

+ +The following activity diagram summarises the flow of events when `EditDetailCommand` is executed. + +

+
Figure 25: Edit detail Activity Diagram

+ +##### 6.2.6.3 Delete Detail Command + +The following describes the flow of how `DeleteDetailCommand` is performed. + +1. Upon successfully parsing the user input, `DeleteDetailCommand#execute(Model model)`, and it checks if the student at the specified position exists. +2. If there is no student at the specified position, a `CommandException` is thrown and the detail will not be deleted. +3. If the student exists, `DeleteDetailCommand#execute(Model model)` then checks if the detail at the specified position exists. +4. If there is no detail at the specified position, a `CommandException` is thrown and the detail will not be deleted. +5. If the detail exists, the detail is removed from the student's list of details, and `DetailCommand#updateStudentDetail(Student studentToDeleteDetail, List details)` is called to create a modified copy of the student with detail removed. +6. `Student#addQuestion(Question question)` is called to create a modified copy of the student with a newly added question. +7. `Model#setStudent(Student target, Student editedStudent)` is called to replace the student with the modified copy. A new `CommandResult` is returned with a success message showing the affected student and the removed detail. +8. The modified student replaces the outdated student in the `UniqueStudentList` and a success message is shown in the result display. + +The following sequence diagram shows how the detail deleting operation works. + +

+
Figure 26: Delete detail Sequence Diagram

+ +The following activity diagram summarises the flow of events when `DeleteDetailCommand` is executed. + +

+
Figure 27: Delete detail Activity Diagram

+ +#### 6.2.7 Sort Command + +This is an explanation of how `SortCommand` works. + +1. After the `SortCommand` is successfully parsed, `SortCommand#execute(Model model)` is called to execute the command. +2. The `comparisonMeans` stored within the `SortCommand` is checked against `NameComparator.COMPARISON_MEANS`, `ClassTimeComparator.COMPARISON_MEANS` and `YearComparator.COMPARISON_MEANS`. +3. If `comparisonMeans` matches the comparison means of `NameComparator`, `NameComparator.COMPARISON_MEANS`, a new `NameComparator` is created and `Model#updateSortedStudentList(Comparator comparator)` called. +4. Step 3 is repeated similarly for `ClassTimeComparator` and `YearComparator`. +5. If `comparisonMeans` matches no comparison means in steps 3 and 4, a `CommandException` is thrown. +6. The student list is sorted and a `CommandResult` with the success message is returned. + +The following sequence diagram shows how the `SortCommand` execution works. + +

+
Figure 28: Sort Command Sequence Diagram

+ +The following activity diagram summarises the flow of events when `SortCommand` is executed. + +

+
Figure 29: Sort Command Activity Diagram

+ +### 6.3 Student academic details features + +This section describes some key details on how academic details features are implemented. + +#### 6.3.1 Question Commands + +The Question commmands keep track of questions raised by a student to his tutor. They comprise of the following commands: + +* `AddQuestionCommand` - Adds a question to a specified student. +* `SolveQuestionCommand` - Marks a specified question from a specified student as solved. +* `DeleteQuestionCommand` - Deletes a specified question from a specified student. + +##### 6.3.1.1 Add Question Command + +The following describes the flow of how `AddQuestionCommand` is performed. + +1. Upon successfully parsing the user input, `AddQuestionCommand#execute(Model model)` is called to check if the student at the specified position exists. +2. If there is no student at the specified position, a `CommandException` is thrown and the question will not be added. +3. If the student exists, `AddQuestionCommand#execute(Model model)` checks if the student already has a similar question recorded. +4. A unique question is defined solely by its `question` and does not take into account if the question has been solved. If a duplicate question is found, a `CommandException` is thrown and the question will not be added. +5. If the question is not a duplicate, `Student#addQuestion(Question question)` is called to create a modified copy of the student with a newly added question. +6. `Model#setStudent(Student target, Student editedStudent)` is called to replace the student with the modified copy. A new `CommandResult` is returned with a success message showing the affected student and the question added. +7. The modified student replaces the outdated student in the `UniqueStudentList` and a success message is shown in the result display. + +The following sequence diagram shows how the question adding operation works. + +

+
Figure 30: Add Question Sequence Diagram

+ +The following activity diagram summarises the flow of events when `AddQuestionCommand` is executed. + +

+
Figure 31: Add Question Activity Diagram

+ +##### 6.3.1.2 Solve Question Command + +The following describes the flow of how `SolveQuestionCommand` is performed. + +1. Upon successfully parsing the user input, `SolveQuestionCommand#execute(Model model)` is called to check if the student at the specified position exists. +2. If there is no student at the specified position, a `CommandException` is thrown and the question will not be added. +3. If the student exists, `SolveQuestionCommand#execute(Model model)` checks if there is a question at the specified position. +4. If the question does not exist, a `CommandException` is thrown and the question will not be resolved. +5. If the question exists, `Student#setQuestion(Question target, Question newQuestion)` is called to create a modified copy of the student where the specified question has been replaced with a solved version. +6. `Model#setStudent(Student target, Student editedStudent)` is called to replace the student with the modified copy. A new `CommandResult` is returned with a success message showing the affected student and the question solved. +7. The modified student replaces the outdated student in the `UniqueStudentList` and a success message is shown in the result display. + +The following sequence diagram shows how the question solving operation works. + +

+
Figure 32: Solve Question Sequence Diagram

+ +The following activity diagram summarises the flow of events when `SolveQuestionCommand` is executed. + +

+
Figure 33: Solve Question Activity Diagram

+ +##### 6.3.1.3 Delete Question Command + +The following describes the flow of how `DeleteQuestionCommand` is performed. + +1. Upon successfully parsing the user input, `DeleteQuestionCommand#execute(Model model)` is called to check if the student at the specified position exists. +2. If there is no student at the specified position, a `CommandException` is thrown and the question will not be added. +3. If the student exists, `DeleteQuestionCommand#execute(Model model)` checks if there is a question at the specified position. +4. If the question does not exist, a `CommandException` is thrown and the question will not be resolved. +5. If the question exists, `Student#deleteQuestion(Question target)` is called to create a modified copy of the student without the specified question. +6. `Model#setStudent(Student target, Student editedStudent)` is called to replace the student with the modified copy. A new `CommandResult` is returned with a success message showing the affected student and the question removed. +7. The modified student replaces the outdated student in the `UniqueStudentList` and a success message is shown in the result display. + +The following sequence diagram shows how the question deletion operation works. + +

+
Figure 34: Delete Question Sequence Diagram

+ +The following activity diagram summarises the flow of events when `DeleteQuestionCommand` is executed. + +

+
Figure 35: Delete Question Activity Diagram

+ +##### 6.3.1.4 Design considerations + +The `Student` class guarantees immutability, including its list of `Question` objects. As such, any operation must return a modified copy instead of directly modifying the base list. + +The pros of doing so is that it becomes easier to test and debug as there are fewer mutations to worry about. + +The downside, however, that this approach is more memory-intensive and possibly slower, since changing a single question involves recreating the entire list of questions attached to the student. + +Having considered that our target audience (one-to-one private tutors) are unlikely to have so much data that this would severely impact performance, we believe that this is worth the trade-off. + +#### 6.3.2 Exam Commands + +The Exam commands keep track of exam records of a student. They comprise of the following commands: + +* `AddExamCommand` - Adds a exam record to a specified student. +* `DeleteExamCommand` - Deletes a specified exam record from a specified student. +* `ExamStatsCommand` - Displays the exam statistics of a specified student in the form of a line graph. + +The structure of exam commands is as shown below: + +

+
Figure 36: Exam Command Class Diagram

+ +##### 6.3.2.1 Add exam command + +The following describes the flow of how `AddExamCommand` is performed. + +1. Upon successfully parsing the user input, `AddExamCommand#execute(Model model)` is called to check if the student at the specified position exists. +2. If there is no student at the specified position, a `CommandException` is thrown and the exam will not be added. +3. If the student exists, `AddExamCommand#execute(Model model)` checks if the student already has a similar exam recorded. +4. A unique exam is defined solely by its `examName`. If a duplicate exam is found, a `CommandException` is thrown and the exam will not be added. +5. If the exam is not a duplicate, `Student#getExams()` is called get the current list of exams of the specified student. +6. The new exam is added into this current list and a new updated `Student` is created which has exactly the same characteristics as the specified student but with the updated exam list. +7. `Model#setStudent(Student selectedStudent, Student updatedStudent)` is called to replace the student with the updated copy. A new `CommandResult` is returned with a success message showing the affected student and the exam added. +8. The updated student replaces the outdated student in the `UniqueStudentList` and a success message is shown in the result display. + +The sequence and activity diagrams are very similar to those of the [detail adding command](#6261-add-detail-command) + +##### 6.3.2.2 Delete exam command + +The following describes the flow of how `DeleteExamCommand` is performed. + +1. Upon successfully parsing the user input, `DeleteExamCommand#execute(Model model)` is called to check if the student at the specified position exists. +2. If there is no student at the specified position, a `CommandException` is thrown. +3. If the student exists, `DeleteExamCommand#execute(Model model)` checks if there is a exam at the specified position. +4. If the exam does not exist, a `CommandException` is thrown. +5. If the exam exists, `Student#getExams()` is called get the current list of exams of the specified student. +6. `Model#setStudent(Student selectedStudent, Student updatedStudent)` is called to replace the student with the modified copy. A new `CommandResult` is returned with a success message showing the affected student and the exam removed. +7. The modified student replaces the outdated student in the `UniqueStudentList` and a success message is shown in the result display. + +
+ +:information_source: Exams are specified based on the indexes of the list of exams shown on the academic view of student details. + +

+ +The sequence and activity diagrams are very similar to those of the [detail deleting command](#6263-delete-detail-command) + +##### 6.3.2.3 Exam Stats command + +The following describes the flow of how `ExamStatsCommand` is performed. + +1. Upon successfully parsing the user input, `ExamStatsCommand#execute(Model model)` is called to check if the student at the specified position exists. +2. If there is no student at the specified position, a `CommandException` is thrown and no exam statistics window will be shown. +3. If the student exists, `ExamStatsCommand#execute(Model model)` gets the specified student from `sortedStudentList`. +4. A `CommandResult` with a non-null student input is returned and `MainWindow#handleExamStats(Student student)` is called. +5. A new ExamStats display window will be opened showing a line graph representing the exam scores of the specified student. -
: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. +The following sequence diagram shows how the exam stats operation works. + +

+
Figure 37: Exam Stats Sequence Diagram

+ +The following activity diagram summarises the flow of events when `ExamStatsCommand` is executed. + +

+
Figure 38: Exam Stats Activity Diagram

+ +The following explains the design considerations of the `exam stats` command. + +**Aspect: How the GUI responds when exam stats is executed** + +* **Alternative 1 (current choice)**: Open new window that displays exam statistics. + * Pros: Easy to implement, allows for comparison and reference with student data, allows for multiple students' exam statistics to be opened, easy for users to understand. + * Cons: Can be more taxing on processor if many windows are opened simultaneously + +* **Alternative 2**: Switch from the displayed student list panel to an exam statistics panel. + * Pros: Only one window open at all time. + * Cons: Unable to compare and reference with student data, harder to implement, can introduce confusion when trying to switch back to the student list panel. + +#### 6.3.3 Attendance Commands + +The Attendance commands keep track of the attendance for a student. They comprise of the following commands: + +* `AddAttendanceCommand` - Adds an attendance to a specified student. +* `DeleteAttendanceCommand` - Deletes a specified attendance from a specified student. + +##### 6.3.3.1 Add Attendance Command + +The following describes the flow of how `AddAttendanceCommand` is performed. + +1. Upon successfully parsing the user input, `AddAttendanceCommand#execute(Model model)`, and it checks if the student at the specified position exists. +2. If there is no student at the specified position, a `CommandException` is thrown and the attendance will not be added. +3. If the student exists, `AddAttendanceCommand#execute(Model model)` then checks if the student has an existing attendance with the input attendance date. +4. If there is such an attendance, a `CommandException` is thrown and the attendance will not be added. +5. If there is no such attendance, the attendance is added to the student's list of attendances, and `AttendanceCommand#updateStudentAttendance(Student studentToAddAttendance, List attendances)` is called to create a modified copy of the student with the new attendance. +4. `Model#setStudent(Student target, Student editedStudent)` is called to replace the student with the modified copy. A new `CommandResult` is returned with a success message showing the affected student and the attendance added. +5. The modified student replaces the outdated student in the `UniqueStudentList` and a success message is shown in the result display. + +The following sequence diagram shows how the attendance adding operation works. + +

+
Figure 39: Add Attendance Sequence Diagram

+ +The following activity diagram summarises the flow of events when `AddAttendanceCommand` is executed. + +

+
Figure 40: Add Attendance Activity Diagram

+ +##### 6.3.3.2 Delete Attendance Command + +The following describes the flow of how `DeleteAttendanceCommand` is performed. + +1. Upon successfully parsing the user input, `DeleteAttendanceCommand#execute(Model model)`, and it checks if the student at the specified position exists. +2. If there is no student at the specified position, a `CommandException` is thrown and the attendance will not be deleted. +3. If the student exists, `DeleteAttendanceCommand#execute(Model model)` then checks if the student has an existing attendance with the input attendance date. +4. If there is no such attendance, a `CommandException` is thrown and the attendance will not be deleted. +5. If there is such an attendance, the attendance is deleted from the student's list of attendances, and `AttendanceCommand#updateStudentAttendance(Student studentToDeleteAttendance, List attendances)` is called to create a modified copy of the student with attendance removed. +4. `Model#setStudent(Student target, Student editedStudent)` is called to replace the student with the modified copy. A new `CommandResult` is returned with a success message showing the affected student and the attendance deleted. +5. The modified student replaces the outdated student in the `UniqueStudentList` and a success message is shown in the result display. + +The following sequence diagram shows how the attendance deleting operation works. + +

+
Figure 41: Delete Attendance Sequence Diagram

+ +The following activity diagram summarises the flow of events when `DeleteAttendanceCommand` is executed. + +

+
Figure 42: Delete Attendance Activity Diagram

+ +### 6.4 Schedule Command + +This section describes the operations that `ScheduleViewCommand` performs. + +1. Upon successful parsing of the user input, the `ScheduleViewCommand#execute(Model)` method is called. +2. The method `Model#setViewDate(LocalDate)` is then called to set the viewing date of the user in `SchedulePrefs` +3. Similarly, the method `ModelsetViewMode(ScheduleViewMode)` is called next to set the viewing mode (weekly/daily) of the user in `SchedulePrefs`. +4. After which, the method `updateFilteredStudentList(Predicate)` is called to get all the students. +The `Predicate` argument will be `PREDICATE_SHOW_ALL_STUDENTS` which is a reusable final predicate variable. +5. Thereafter, the method `Model#updateClassTimesToEvent()` will be called to translate all student's `ClassTime` to `LessonEvent` +6. The `Scheduler` then calls the method `resetData(List)` with the updated `LessonEvent` objects. +7. The `CommandResult` is then returned. + +The following sequence diagram illustrates to execution of the `ScheduleViewCommand`: + +

+
Figure 43: Schedule Sequence Diagram

+ +The following activity diagram summarizes the flow of events when the `ScheduleViewCommand` is being executed: + +

+
Figure 44: Schedule Activity Diagram

+ +
+ +:information_source: Figure 43 and 44 illustrates the `ScheduleCommand` execution within the `Logic` and `Model` Component.
-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. +For the `Ui` component, a calendar using [jfxtras-icalendarfx](https://jfxtras.org/doc/8.0/jfxtras-icalendarfx/index.html) will be updated with the `LessonEvent` after the `CommandResult` is returned. +The `'LessonEvent` is provided to the `Ui` by the `LogicManager` through the `Model` component. +The `Model` in turns gets the `LessonEvent` from the `Scheduler` which keeps a list of updated events. +The calendar with `LessonEvent` is then displayed to the user through the interface. This is assuming that no exception arises. -![UndoRedoState4](images/UndoRedoState4.png) +The following are the various design choices made regarding the feature and alternatives that were considered prior to implementation. -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. +* Current Implementation: + * The current implementation creates `LessonEvent` from the `studentList` and update to the `Ui` whenever the `ScheduleViewCommand` is called. -![UndoRedoState5](images/UndoRedoState5.png) +* Alternatives Considered: + * Creating a `Event` storage component that stores `LessonEvent` based on `Student`'s `ClassTime`. + This would violate the data integrity of the `Student` we currently have and introduce additional complexity in + maintaining both data structures. -The following activity diagram summarizes what happens when a user executes a new command: +### 6.5 Notebook feature -![CommitActivityDiagram](images/CommitActivityDiagram.png) +This section describes the implementation of the notebook feature and the various commands relating to notebook. -#### Design consideration: +The notebook feature comprises three specific commands extending `NoteCommand`: -##### Aspect: How undo & redo executes +* `AddNoteCommand` – Adds a note to the notebook. +* `EditNoteCommand` – Edits a note in the notebook. +* `DeleteNoteCommand` – Deletes a note from the notebook -* **Alternative 1 (current choice):** Saves the entire address book. - * Pros: Easy to implement. - * Cons: May have performance issues in terms of memory usage. +The following class diagram shows how the various commands relate to each other. (refer to [5.3 Logic Component](#53-logic-component) for higher-level details about the design) -* **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. +

+
Figure 45: Note Command Class Diagram

-_{more aspects and alternatives to be added}_ +#### 6.5.1 Add note command -### \[Proposed\] Data archiving +This section describes how `AddNoteCommand` is performed. -_{Explain here how the data archiving feature will be implemented}_ +1. Upon successful parsing of the user input, `AddNoteCommand#execute(Model model)` is called which checks whether there is already a note with the same title in `NotesList` using `Model#hasNote(Note toAdd)`. +2. If a duplicate note is found, a `CommandException` is thrown, and the note will not be added. +3. Otherwise, `Model#addNote(Note toAdd)` will be called, and the note will be added. +4. A `CommandResult` will be returned with the success message. +#### 6.5.2 Edit note command --------------------------------------------------------------------------------------------------------------------- +This section describes how `EditNoteCommand` is performed. -## **Documentation, logging, testing, configuration, dev-ops** +1. Upon successful parsing of the user input, `EditNoteCommand#execute(Model model)` is called. +2. During the execution, `Model#getNotebook()` is called to retrieve the notebook in **Reeve** and `ReadOnlyNotebook#getNotesList()` is called from the notebook to retrieve the list of notes. +3. The `Index` is checked to ensure that it is valid; if it is not, a `CommandException` is thrown, and no note will be edited. +4. The note at `index` is retrieved, and a new note, `editedNote` is created based on this note and the `EditNoteDescriptor` stored within the `EditNoteCommand`. +5. `editedNote` is checked to ensure that it is not the same as the original note retrieved. A `CommandException` is thrown if it is the same note. +6. `Model#setNote(Note notetoEdit, Note editedNote)` is called to edit `noteToEdit` to `editedNote` in `model`. +7. A `CommandResult` will be returned with the success message. -* [Documentation guide](Documentation.md) -* [Testing guide](Testing.md) -* [Logging guide](Logging.md) -* [Configuration guide](Configuration.md) -* [DevOps guide](DevOps.md) +#### 6.5.3 Delete note command --------------------------------------------------------------------------------------------------------------------- +This section describes how `DeleteNoteCommand` is performed. -## **Appendix: Requirements** +1. Upon successful parsing of the user input, `DeleteNoteCommand#execute(Model model)` is called. +2. During the execution, `Model#getNotebook()` is called to retrieve the `ReadOnlyNotebook` in **Reeve** and `ReadOnlyNotebook#getNotesList()` is called to retrieve the `List`. +3. The `Index` is checked to ensure that it is valid; if it is not, a `CommandException` is thrown, and no note will be deleted. +4. The `Note` at `Index` is removed from the notebook using `Model#deleteNote(Note noteToDelete)`. +5. A `CommandResult` will be returned with the success message. -### Product scope +## 7. **Documentation** +Refer to the [Documentation guide](Documentation.md). + +## 8. **Logging** +Refer to the [Logging guide](Logging.md). + +## 9. **Testing** +Refer to the [Testing guide](Testing.md). + +## 10. **Configuration** +Refer to the [Configuration guide](Configuration.md). + +## 11. **DevOps** +Refer to the [DevOps guide](DevOps.md). + +## **Appendix A: Product Scope** **Target user profile**: -* has a need to manage a significant number of contacts +* is a Singapore primary/secondary/junior college 1 to 1 private tutors +* has a need to manage a significant number of student contacts +* has a need to manage administrative details of students +* has a need to manage academic details of students * prefer desktop apps over other types * can type fast * prefers typing to mouse interactions * is reasonably comfortable using CLI apps -**Value proposition**: manage contacts faster than a typical mouse/GUI driven app - +**Value proposition**: Helps tutors organise administrative and academic details of their students with ease and manage student needs better. -### User stories +## **Appendix B: User Stories** Priorities: High (must have) - `* * *`, Medium (nice to have) - `* *`, Low (unlikely to have) - `*` + +| Priority | As a …​ | I want to …​ | So that I can…​ | +| -------- | ----------------------------------------------------------| ------------------------------------------------------- | ---------------------------------------------------------------------- | +| `* * *` | private tutor ready to use **Reeve** | view a list of commands and how to use them | learn how the application works or in case I forgot how some of the commands work | +| `* * *` | private tutor ready to use **Reeve** | add my students' details | store them and retrieve them whenever I need | +| `* * *` | private tutor | view my students' preferred tutoring location | figure out how to get that location | +| `* * *` | private tutor | edit my students' personal details | update outdated data | +| `* * *` | private tutor | view my student's details | refer to them when needed | +| `* * *` | private tutor | add additional details to each student | add other miscellaneous details which can allow me to better cater to student needs | +| `* * *` | private tutor with many students | find a student's record | retrieve students' data with ease | +| `* * *` | private tutor | find students who have not paid their fees | remind students who have yet to pay me for my services | +| `* * *` | private tutor who is a long-term user | delete students' data | remove irrelevant data of students who are no longer my tutees | +| `* *` | private tutor | record questions that my students raised | find the answers to them after the lesson | +| `* *` | private tutor | record solutions to the questions raised | use them as reference for answering future similar questions | +| `* *` | private tutor | delete questions I do not need anymore | focus on the questions I need to pay attention to | +| `* *` | private tutor | input my student’s school test scores | keep track of their progress | +| `* *` | private tutor | track my students' attendance | keep track of students' lesson records | +| `* *` | private tutor | input feedback to specific lessons | improve my capabilities as a tutor | +| `* *` | private tutor | keep track of notes | store small pieces of information in case I forget | +| `* *` | private tutor | view my tutoring schedule for a particular day | plan ahead of my lessons for that day | +| `* *` | private tutor | be able to view students in alphabetical order | look for students easily | +| `* *` | private tutor | be able to my view my students in lesson time order | know which students to prioritise when preparing lessons | +| `* *` | private tutor | be able to group my students by their year of study | look at questions and queries together for one cohort together | +| `* *` | private tutor | view my tutoring schedule for a week | plan for the week ahead | +| `*` | private tutor | view my students' academic progress | know which students need more help | +| `*` | private tutor ready to use **Reeve** | view the type of student details that are displayed | focus on the details that I am currently concerned with | +| `*` | private tutor that is impatient | be able to get the command results in a reasonable time | save time | +| `*` | private tutor that is using **Reeve** for the first time | view **Reeve** with sample data | visualize how **Reeve** looks like when I use it | + +## **Appendix C: Use Cases** + +For all use cases below, the **System** is `Reeve` and the **Actor** is the `Tutor (User)`, unless specified otherwise. +Use cases also assume that whenever an invalid command is entered by the user, **Reeve** displays an error message. + +**UC01: Displaying help menu** + +**MSS** + +1. User enters a command to open help menu. +2. **Reeve** displays a success message and the help menu. + + Use case ends. + +**UC02: Toggling displays between administrative and academic details of students** + +**MSS** + +1. User enters a command to toggle display students details. +2. **Reeve** displays a success message and the toggled display of students details. + + Use case ends. + +**UC03: Exiting the application** -| 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 | +**MSS** -*{More to be added}* +1. User enters a command to exit the application. +2. All processes of **Reeve** ends. -### Use cases + Use case ends. -(For all use cases below, the **System** is the `AddressBook` and the **Actor** is the `user`, unless specified otherwise) -**Use case: Delete a person** +**UC04: Adding a student** **MSS** -1. User requests to list persons -2. AddressBook shows a list of persons -3. User requests to delete a specific person in the list -4. AddressBook deletes the person +1. User enters a command to add a student with student details. +2. **Reeve** saves student data into the students list and displays a success message. Use case ends. **Extensions** -* 2a. The list is empty. +* 1a. User provides input with missing compulsory fields. + * 1a1. **Reeve** displays an error message. + + Use case resumes from step 1. + +* 1b. User provides input with invalid format. + * 1b1. **Reeve** displays an error message. + + Use case resumes from step 1. + +**UC05: Listing all students** + +**MSS** + +1. User enters a command to list students. +2. **Reeve** displays the students list with student details. + + Use case ends. + +**UC06: Editing a student's admin details** + +**MSS** + +1. User enters a command to list students. +2. **Reeve** shows the list of students. +3. User enters command to edit a specific student in the list and provides needed parameters. +4. **Reeve** updates the specified student with the input parameters and displays a success message. + + Use case ends. + +**Extensions** +* 1a. The list is empty. Use case ends. -* 3a. The given index is invalid. +* 3a. User provides input with invalid index. + * 3a1. **Reeve** requests for input with valid index. - * 3a1. AddressBook shows an error message. + Use case resumes at step 2. +* 3b. User provides input without any parameters. + * 3b1. **Reeve** requests for input with parameters. Use case resumes at step 2. +* 3c. User provides input with invalid format. + * 3c1. **Reeve** requests for input with valid format. -*{More to be added}* + Use case resumes at step 2. -### Non-Functional Requirements +**UC07: Deleting a student** -1. Should work on any _mainstream OS_ as long as it has Java `11` or above installed. -2. Should be able to hold up to 1000 persons without a noticeable sluggishness in performance for typical usage. -3. A user with above average typing speed for regular English text (i.e. not code, not system admin commands) should be able to accomplish most of the tasks faster using commands than using the mouse. +**MSS** -*{More to be added}* +1. User enters a command to list students. +2. **Reeve** displays a list of students. +3. User enters a command to delete a specific student in the list. +4. **Reeve** deletes the student and displays a success message. -### Glossary + Use case ends. -* **Mainstream OS**: Windows, Linux, Unix, OS-X -* **Private contact detail**: A contact detail that is not meant to be shared with others +**Extensions** --------------------------------------------------------------------------------------------------------------------- +* 1a. The list is empty. -## **Appendix: Instructions for manual testing** + Use case ends. -Given below are instructions to test the app manually. +* 3a. User provides input with invalid index. + * 3a1. **Reeve** displays an error message. -
:information_source: **Note:** These instructions only provide a starting point for testers to work on; -testers are expected to do more *exploratory* testing. + Use case resumes at step 2. -
+**UC08: Searching for a student** + +**MSS** -### Launch and shutdown +1. User enters a command to find all students that match the given search parameter (name, school, year). +2. **Reeve** displays all students matching the criteria. -1. Initial launch + Use case ends. - 1. Download the jar file and copy into an empty folder +**Extensions** - 1. Double-click the jar file Expected: Shows the GUI with a set of sample contacts. The window size may not be optimum. +* 1a. User provides input with invalid data into the search parameter. + * 1a1. **Reeve** displays erroneous field and expected format. -1. Saving window preferences + Use case resumes at step 1. +* 1b. User provides input without a search parameter. + * 1a1. **Reeve** displays a message indicating a search parameter was not provided. - 1. Resize the window to an optimum size. Move the window to a different location. Close the window. + Use case resumes at step 1. +* 1c. No students match the given criteria. + * 1c1. **Reeve** displays a message indicating no match found. - 1. Re-launch the app by double-clicking the jar file.
- Expected: The most recent window size and location is retained. + Use case ends. -1. _{ more test cases …​ }_ +**UC09: Clearing all student records** -### Deleting a person +**MSS** -1. Deleting a person while all persons are being shown +1. User enters a command to clear the students list. +2. **Reeve** displays a success message. - 1. Prerequisites: List all persons using the `list` command. Multiple persons in the list. + Use case ends. + +**UC10: Sorting the list of students** - 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. +**MSS** - 1. Test case: `delete 0`
- Expected: No person is deleted. Error details shown in the status message. Status bar remains the same. +1. User enters a command to sort students by a given method (name, class time, year). +2. **Reeve** sorts the list of students by the method. +3. **Reeve** displays the student list in the new order - 1. Other incorrect delete commands to try: `delete`, `delete x`, `...` (where x is larger than the list size)
- Expected: Similar to previous. + Use case ends. + +**Extensions** + +* 1a. User provides input with invalid format. + * 1a1. **Reeve** displays expected format. + + Use case resumes at step 1. +* 1b. User provides input without a search parameter. + * 1a1. **Reeve** displays a message indicating a search parameter was not provided. + + Use case resumes at step 1. +* 1c. User provides invalid means to sort students. + * 1c1. **Reeve** displays a message indicating that sorting means in valid and valid sorting means. + + Use case resumes at step 1. + +**UC11: Adding an additional detail to a student** -1. _{ more test cases …​ }_ +**MSS** + +1. User enters a command to list students. +2. **Reeve** displays a list of students. +3. User enters a command to add a detail to a specific student in the list. +4. **Reeve** updates the specified student in the list with the newly added detail. +5. **Reeve** displays a success message. + + Use case ends. + +**Extensions** + +* 1a. The list is empty. + + Use case ends. + +* 3a. User provides input with an invalid student index. + * 3a1. **Reeve** displays an error message. + + Use case resumes at step 2. + +* 3b. User inputs a detail in an invalid format. + * 3b1. **Reeve** displays an error message. + + Use case resumes at step 2. + +**UC12: Editing an additional detail in a student** + +**MSS** + +1. User enters a command to list students. +2. **Reeve** displays a list of students. +3. User enters a command to edit a detail from a specific student in the list. +4. **Reeve** updates the specified student in the list with the edited detail. +5. **Reeve** displays a success message. + + Use case ends. + +**Extensions** + +* 1a. The list is empty. + + Use case ends. -### Saving data +* 3a. User provides input with an invalid student. + * 3a1. **Reeve** displays an error message. + + Use case resumes at step 2. + +* 3b. User provides input with an invalid detail. + * 3b1. **Reeve** displays an error message. + + Use case resumes at step 2. + +**UC13: Deleting an additional detail from a student** + +**MSS** -1. Dealing with missing/corrupted data files +1. User enters a command to list students. +2. **Reeve** displays a list of students. +3. User enters a command to delete a detail from a specific student in the list. +4. **Reeve** updates the specified student in the list with the removed detail. +5. **Reeve** displays a success message. - 1. _{explain how to simulate a missing/corrupted file, and the expected behavior}_ + Use case ends. -1. _{ more test cases …​ }_ +**Extensions** + +* 1a. The list is empty. + + Use case ends. + +* 3a. User provides input with an invalid student. + * 3a1. **Reeve** displays an error message. + + Use case resumes at step 2. + +* 3b. User provides input with an invalid detail. + * 3b1. **Reeve** displays an error message. + + Use case resumes at step 2. + +**UC14: Adding a question to a student** + +**MSS** + +1. User enters a command to list students. +2. **Reeve** displays a list of students. +3. User enters a command to add an unresolved question to a specific student in the list. +4. **Reeve** updates the specified student in the list with the newly added question. +5. **Reeve** displays a success message. + + Use case ends. + +**Extensions** + +* 1a. The list is empty. + + Use case ends. + +* 3a. User provides input with an invalid student index. + * 3a1. **Reeve** displays an error message. + + Use case resumes at step 2. + +* 3b. User inputs a question in an invalid format. + * 3b1. **Reeve** displays an error message. + + Use case resumes at step 2. + +**UC15: Resolving a question from a student** + +**MSS** + +1. User enters a command to list students. +2. **Reeve** displays a list of students. +3. User enters a command to resolve a question from a specific student in the list with a solution. +4. **Reeve** updates the specified student in the list with the updated question. +5. **Reeve** displays a success message. + + Use case ends. + +**Extensions** + +* 1a. The list is empty. + + Use case ends. + +* 3a. User provides input with an invalid student. + * 3a1. **Reeve** displays an error message. + + Use case resumes at step 2. + +* 3b. User provides input with an invalid question. + * 3b1. **Reeve** displays an error message. + + Use case resumes at step 2. + +* 3c. User inputs the solution in an invalid format. + * 3c1. **Reeve** displays an error message. + + Use case resumes at step 2. + +* 3d. User specifies a question that has already been solved. + * 3d1. **Reeve** displays an error message. + + Use case resumes at step 2. + + +**UC16: Deleting a question from a student** + +**MSS** + +1. User enters a command to list students. +2. **Reeve** displays a list of students. +3. User enters a command to delete a question from a specific student in the list. +4. **Reeve** updates the specified student in the list with the removed question. +5. **Reeve** displays a success message. + + Use case ends. + +**Extensions** + +* 1a. The list is empty. + + Use case ends. + +* 3a. User provides input with an invalid student. + * 3a1. **Reeve** displays an error message. + + Use case resumes at step 2. + +* 3b. User provides input with an invalid question. + * 3b1. **Reeve** displays an error message. + + Use case resumes at step 2. + +**UC17: Finding all students with overdue tuition fees** + +**MSS** + +1. User enter command to filter all students by those who have not paid their fees in the past month. +2. **Reeve** displays all students that match the above criteria. + + Use case ends. + +**Extensions** + +* 1a. The list is empty. + + Use case ends. + +* 1b. All students have paid their fees in the past month. + + * 1b1. **Reeve** displays an empty list. + + Use case ends. + +**UC18: Adding an exam record to a student** + +**MSS** + +1. User enters a command to list students. +2. **Reeve** displays a list of students. +3. User enters a command to add an exam record to a specific student in the list. +4. **Reeve** updates the specified student in the list with the newly added exam record. +5. **Reeve** displays a success message. + + Use case ends. + +**Extensions** + +* 1a. The list is empty. + + Use case ends. + +* 3a. User provides input with an invalid student index. + * 3a1. **Reeve** displays an error message. + + Use case resumes at step 2. + +* 3b. User inputs an exam record in an invalid format. + * 3b1. **Reeve** displays an error message. + + Use case resumes at step 2. + +**UC19: Deleting an exam record from a student** + +**MSS** + +1. User enters a command to list students. +2. **Reeve** displays a list of students. +3. User enters a command to delete a specific exam record from a specific student in the list. +4. **Reeve** updates the specified student in the list with the removed question. +5. **Reeve** displays a success message. + + Use case ends. + +**Extensions** + +* 1a. The list is empty. + + Use case ends. + +* 3a. User provides input with an invalid student. + * 3a1. **Reeve** displays an error message. + + Use case resumes at step 2. + +* 3b. User provides input with an invalid exam record. + * 3b1. **Reeve** displays an error message. + + Use case resumes at step 2. + +**UC20: Displaying exam statistics of a student** + +**MSS** + +1. User enters a command to list students. +2. **Reeve** displays a list of students. +3. User enters a command to view the exam statistics on a specific student. +4. **Reeve** displays a success message and the exam statistics. + + Use case ends. + +**Extensions** + +* 1a. The list is empty. + + Use case ends. + +* 3a. User provides input with an invalid student. + * 3a1. **Reeve** displays an error message. + + Use case resumes at step 2. + +**UC21**: View class schedule. + +**MSS** + +1. User enters command to view schedule. +2. **Reeve** shows the schedule of the user's classes. + + Use case ends. + +**Extensions** + +* 1a. User enters command in an incorrect format. + 1a1. **Reeve** displays error message. + 1a2. User corrects command input. + + Use case resumes at step 2. + +* 1b. There are no student in **Reeve**. + 1b1. Schedule is shown with no classes. + + Use case ends. + +**UC22: Adding an attendance record to a student** + +**MSS** + +1. User enters a command to list students. +2. **Reeve** displays a list of students. +3. User enters a command to add an attendance record to a specific student in the list. +4. **Reeve** updates the specified student in the list with the newly added attendance record. +5. **Reeve** displays a success message. + + Use case ends. + +**Extensions** + +* 1a. The list is empty. + + Use case ends. + +* 3a. User provides input with an invalid student index. + * 3a1. **Reeve** displays an error message. + + Use case resumes at step 2. + +* 3b. User inputs attendance with an invalid format. + * 3b1. **Reeve** displays an error message. + + Use case resumes at step 2. + +**UC23: Deleting an attendance record from a student** + +**MSS** + +1. User enters a command to list students. +2. **Reeve** displays a list of students. +3. User enters a command to delete an attendance record from a specific student in the list. +4. **Reeve** updates the specified student in the list with the removed attendance record. +5. **Reeve** displays a success message. + + Use case ends. + +**Extensions** + +* 1a. The list is empty. + + Use case ends. + +* 3a. User provides input with an invalid student. + * 3a1. **Reeve** displays an error message. + + Use case resumes at step 2. + +* 3b. User provides input with an invalid attendance record. + * 3b1. **Reeve** displays an error message. + + Use case resumes at step 2. + +**UC24: Adding a note to the notebook** + +**MSS** + +1. User enters a command to add a note to the notebook. +2. **Reeve** saves the note into the notebook and displays a success message + +* 1a. User provides input with missing fields. + * 1a1. **Reeve** displays an error message. + + Use case resumes at step 1. + +* 1b. User provides invalid input. + * 1b1. **Reeve** displays an error message and input constraints. + + Use case resumes at step 1. + +**UC25: Editing a note in the notebook** + +**MSS** + +1. User enters command to edit a specific note in the notebook and provides needed parameters. +2. **Reeve** updates the specified note with the input parameters and displays a success message. + + Use case ends. + +**Extensions** + +* 1a. User provides input with invalid index. + * 1a1. **Reeve** displays an error message and requests for input with valid index. + + Use case resumes at step 1. +* 1b. User provides input without any parameters. + * 1b1. **Reeve** requests for input with parameters. + + Use case resumes at step 1. +* 1c. User provides input with invalid format. + * 1c1. **Reeve** requests for input with valid format. + + Use case resumes at step 1. + +**UC26: Editing a note in the notebook** + +**MSS** + +1. User enters command to edit a specific note in the notebook and provides needed parameters. +2. **Reeve** updates the specified note with the input parameters and displays a success message. + + Use case ends. + +**Extensions** + +* 1a. User provides input with invalid index. + * 1a1. **Reeve** displays an error message and requests for input with valid index. + + Use case resumes at step 1. +* 1b. User provides input without any parameters. + * 1b1. **Reeve** requests for input with parameters. + + Use case resumes at step 1. +* 1c. User provides input with invalid format. + * 1c1. **Reeve** requests for input with valid format. + + Use case resumes at step 1. + +## **Appendix D: Non-Functional Requirements** + +1. Should work on any _mainstream OS_ as long as it has Java `11` or above installed. +2. The response to any use action should become visible within 5 seconds. +3. The program should be able to handle at least 100 students (in practice, our target audience should not require as high a capacity, but this is a buffer to ensure it will not fail). +4. The graphical user interface should be easy to use for non-IT savvy users. +5. The program should be able to run even without internet connection. + +## **Appendix E: Glossary** + +The following table provides the definitions of the various terms used in this Developer Guide. + +Term | Definition +--------|------------------ +Mainstream OS | Refers to Windows, Linux, Unix, OS-X +Private contact detail | A contact detail that is not meant to be shared with others + +## **Appendix F: Instructions for Manual Testing** + +Given below are instructions to test the app manually. + +
+:information_source: These instructions only provide a starting point for testers to work on; +testers are expected to do more *exploratory* testing. + +
+ +### F.1 Launching **Reeve** + +1. Initial launch + + 1. Download the jar file and copy into an empty folder + + 1. Double-click the jar file Expected: Shows the GUI with a set of sample students. The window size may not be optimum. + +2. Saving window preferences + + 1. Resize the window to an optimum size. Move the window to a different location. Close the window. + + 1. Re-launch the app by double-clicking the jar file.
+ Expected: The most recent window size and location is retained. + +### F.2 General Features + +1. Opening help window. + + 1. Test case: `help` when no help window is opened. +
Expected: Expected: Help window opens. + + 1. Test case: `help` when help window is already opened. +
Expected: Expected: Brings up already opened help window. + +2. Toggling between student details. + + 1. Test case: `toggle` when students display administrative details. +
Expected: Expected: Students switch to display academic details. + + 1. Test case: `toggle` when students display academic details. +
Expected: Expected: Students switch to display administrative details. + +3. Exiting **Reeve**. + 1. Test case: `exit`. +
Expected: **Reeve** shuts down. + +### F.3 Student Administrative Features + +1. Adding a student with administrative details to the students list. + + 1. Test case: `add n/Brendan Tan p/93211234 s/Commonwealth Secondary School y/pri 6 v/Blk 33 West Coast Rd #21-214 t/5 1430-1630 f/25 d/10/10/2020` +
Expected: Expected: Student Brendan Tan has been added to the students list. + + 1. Test case: `add n/Brendan Tan p/93211234 s/Commonwealth Secondary School v/Blk 33 West Coast Rd #21-214 t/5 1430-1630 f/25 d/50/50/2020 a/Likes Algebra` +
Expected: Expected: No student is added as due to invalid payment date. Error details displayed in the result display. + + 1. Test case: `add n/Brendan Tan p/93211234 s/Commonwealth Secondary School v/Blk 33 West Coast Rd #21-214 t/15 1430-1630 f/25 d/10/10/2020 a/Likes Algebra` +
Expected: Expected: No student is added as due to invalid class time. Error details displayed in the result display. + +1. Deleting a student while all students are being shown. + + 1. Prerequisites: At least one student in the students list. + + 1. Test case: `delete 1` +
Expected: First student is deleted from the students list. Details of the deleted student shown in the result display. + + 1. Test case: `delete 0` +
Expected: No student is deleted. Error details shown in the result display. + + 1. Other incorrect delete commands to try: `delete`, `delete x`, `...` (where x is larger than the list size)
+ Expected: Similar to previous. + +1. Finding students with overdue fees (i.e last payment date is more than one month ago) while all students are shown. + + 1. Prerequisite: Set at least one student's last payment date to within one month of the current date with `edit` command. Multiple students in the list. + + 1. Test case: `overdue`
+ Expected: All students except those whose payment date is within one month from the current date are listed. The number of students found is displayed. + +1. Finding students with overdue fees while some students are hidden. + + 1. Prerequisite: Hide some students with overdue fees with `find` command. + + 1. Test case: `overdue`
+ Expected: All students except those whose payment date is within one month from the current date are displayed again. The number of students found is displayed. + +1. Viewing schedule of classes + + 1. Prerequisites: There are students stored in **Reeve** currently with non-overlapping class times. + + 1. Test case: `schedule m/weekly d/02/11/2020` + Expected: Shows the schedule of classes in the whole week of 02/11/2020. + + 1. Test case: `schedule m/daily d/02/11/2020` + Expected: Shows the schedule of classes in the day of 02/11/2020. + + 1. Test case: `schedule m/dAiLy d/02/11/2020` + Expected: Shows the schedule successfully as the case letters of the view mode does not matter. + + 1. Test case: `schedule m/day d/02/11/2020` + Expected: Displays error message indicating invalid view mode. + + 1. Test case: `schedule m/weekly d/02-11-2020` + Expected: Displays error message indicating invalid date format. + +1. Finding a student while all students are being shown with several matching students + + 1. Prerequisites: List all students using the `list` command. Two students in the list. One student has name _Samuel_ and has school _yishun secondary_. Another student has name _Sam_ and has school _yishun sec school_. + + 1. Test case: `find n/samuel`
+ Expected: Only the student with name _Samuel_ and school _yishun secondary_ shows up in the list. + + 2. Test case: `find n/sam`
+ Expected: Only the student with name _Sam_ and school _yishun sec school_ showsinp on the list. + + 3. Test case: `find s/yishun sec`
+ Expected: Both students show up in the list. + + 4. Incorrect find commands to try: `find`, `find samuel`, `find yishun sec` + Expected: No changes show up on the list. Error details shown in the status message. + +1. Adding details to a student. + + 1. Prerequisite: List all students using `list` command. Multiple students present. + + 1. Test case: `detail add 1 t/DETAIL_TEXT` + Expected: New detail that matches your input `DETAIL_TEXT` added to first student. + + 1. Test case: `detail add 0 t/DETAIL_TEXT` + Expected: No detail added. Error details shown in status message. List stays the same. + + 1. Test case: `detail add 1 t/` + Expected: Similar to previous. + + 1. Test case: `detail add t/DETAIL_TEXT` + Expected: Similar to previous. + +1. Editing details for a student. + + 1. Prerequisite: List all students using `list` command. Multiple students present. Student to be edited has at least one detail. + + 1. Test case: `detail edit 1 i/1 t/DETAIL_TEXT` + Expected: New detail that matches your input `DETAIL_TEXT` replaces the first detail for first student. + + 1. Test case: `detail edit 0 i/1 t/DETAIL_TEXT` + Expected: No detail edited. Error details shown in status message. List stays the same. + + 1. Test case: `detail edit 1 i/1 t/` + Expected: Similar to previous. + + 1. Test case: `detail edit 1 i/ t/DETAIL_TEXT` + Expected: Similar to previous. + + 1. Test case: `detail edit i/1 t/DETAIL_TEXT` + Expected: Similar to previous. + +1. Deleting details from a student. + + 1. Prerequisite: List all students using `list` command. Multiple students present. Student to be edited has at least one detail. + + 1. Test case: `detail delete 1 i/1` + Expected: First detail in first student is deleted. + + 1. Test case: `detail delete 0 i/1` + Expected: No detail deleted. Error details shown in status message. + + 1. Test case: `detail delete i/1` + Expected: Similar to previous. + + 1. Test case: `detail delete` + Expected: Similar to previous. + +### F.4 Student Academic Features + +1. Adding an exam record to a student. + + 1. Prerequisites: At least one student in the students list. + + 1. Test case: `exam add 1 n/Mid Year 2020 d/08/12/2020 s/40/60` +
Expected: Mid Year 2020 exam record is added to the exams list of the first student in the displayed students list. + + 1. Test case: `exam add 1 n/Mid Year 2020 d/08/12/2020 s/50/10` +
Expected: No exam record is added due to invalid score as numerator is larger than denominator. + + 1. Test case: `exam add 1 n/Mid Year 2020 d/30/30/2020 s/50/100` +
Expected: No exam record is added due to invalid exam date. + +1. Deleting an exam record from a student. + + 1. Prerequisites: At least one student in the students list. At least one exam record in the student's exams list. + + 1. Test case: `exam delete 1 i/1` +
Expected: First exam record of the exam list of the first student in the displayed students list is deleted. Details of deleted exam record shown in the result display. + + 1. Test case: `exam delete 1 i/0` +
Expected: No exam is deleted due to invalid exam index. Error details shown in the result display. + +1. Displaying exam statistics of a student + + 1. Prerequisites: At least one student in the students list. + + 1. Test case: `exam stats 1` +
Expected: Opens the exam statistics window of the first student in the displayed students list. + +1. Adding attendance to a student. + + 1. Prerequisite: List all students using `list` command. Multiple students present. + + 1. Test case: `attendance add 1 d/12/02/2020 a/present` + Expected: New attendance that matches the input date and status is added to the first student. + + 1. Test case: `attendance add 1 d/12/02/2020 a/present f/attentive` + Expected: New attendance that matches the input date, status and feedback is added to the first student. + + 1. Test case: `attendance add 1 d/12/02/2020 a/pre` + Expected: No attendance added. Error details shown in status message. List stays the same. + + 1. Test case: `attendance add 1 d/12/02 a/present` + Expected: Similar to previous. + +1. Deleting attendance record from a student. + + 1. Prerequisite: List all students using `list` command. Multiple students present. Student to be edited has at least one attendance record. + + 1. Test case: `attendance delete 1 d/12/02/2020` + Expected: Attendance record that has the input date in the first student is deleted. + + 1. Test case: `attendance delete 1 d/12/02` + Expected: No attendance deleted. Error details shown in status message. + + 1. Test case: `attendance delete d/12/02/2020` + Expected: Similar to previous. + +1. Adding questions to a student. + + 1. Prerequisite: List all students using `list` command. View academic data with `toggle` command. Multiple students present. + + 1. Test case: `question add 1 t/RANDOM_QUESTION` + Expected: New unresolved (cross symbol) question whose description matches your input added to first student. + + 1. Test case: `question add 0 t/RANDOM_QUESTION` + Expected: No question added. Error details shown in status message. List stays the same. + + 1. Test case: `question add 1 t/ ` + Expected: Similar to previous. + + 1. Test case: `question add 1 t/SAME_QUESTION_IN_TEST_CASE_2` + Expected: Similar to previous. + +1. Resolving questions from a student. + + 1. Prerequisite: List all students using `list` command. View academic data with `toggle` command. First student on the list must have at least one unresolved question. + + 1. Test case: `question solve 1 i/UNSOLVED_QUESTION_INDEX t/ ` + Expected: No question resolved. Error details shown in status message. + + 1. Test case: `question solve 1 i/UNSOLVED_QUESTION_INDEX t/RANDOM_SOLUTION` + Expected: Status of question at `UNSOLVED_QUESTION_INDEX` changed to a tick, `RANDOM_SOLUTION` added next to the question text in square brackets (`[]`). + Details of the question resolved and student's name included in status message. + + 1. Test case: `question solve 0 i/1 t/RANDOM_SOLUTION` + Expected: No question resolved. Error details shown in status message. + + 1. Test case: `question solve 1 i/0 t/RANDOM_SOLUTION` + Expected: Similar to previous. + + 1. Test case: `question solve 1 i/INDEX_OF_QUESTION_SOLVED_IN_TEST_CASE_2 t/RANDOM_SOLUTION` + Expected: Similar to previous. + +1. Deleting questions from a student. + + 1. Prerequisite: List all students using `list` command. View academic data with `toggle` command. First student on the list must have at least one question. + + 1. Test case: `question delete 0 i/1` + Expected: No question deleted. Error details shown in status message. + + 1. Test case: `question delete 1 i/0` + Expected: Similar to previous. + + 1. Test case: `question delete 1 i/QUESTION_INDEX` + Expected: Question at `QUESTION_INDEX` is removed. Details of deleted question included in status message. + +### F.5 Notebook Feature + +1. Adding a note to the notebook. + + 1. Test case: `note add t/things to do d/mark practice papers` +
Expected: Note with title things to do is added and details shown in the results display. + + 1. Test case: `note add t/things to finish by tomorrow d/mark practice papers` +
Expected: No note is added due to a title that is too long. Error details shown in the results display. + +1. Deleting a note. + + 1. Prerequisites: At least one note in the notebook. + + 1. Test case: `note delete 1` +
Expected: First note is deleted from the notebook. Details of the deleted note shown in the result display. + + 1. Test case: `note delete 0` +
Expected: No note is deleted. Error details shown in the result display. + +### F.6 Saving Data + +1. Dealing with missing data files + + 1. Test case: `data/addressbook.json` missing or deleted
+ Expected: **Reeve** initialises with sample student data, notebook data is intact. + + 1. Test case: `data/notebook.json` missing or deleted
+ Expected: **Reeve** initialises with sample notebook data, student data is intact. + +1. Dealing with corrupted data files (Student data) + + 1. Prerequisite: Ensure `data/addressbook.json` is present. Modify the data using `edit` or `delete` to create `data/addressbook.json` if absent. + + 1. Test case: delete a random field from a random student in `addressbook.json`
+ Expected: **Reeve** initialises with an empty student list. + + 1. Test case: duplicate a student's record again in `addressbook.json`
+ Expected: Similar to previous. + + 1. Test case: invalid data in `addressbook.json` (e.g add special characters to the "name" field)
+ Expected: Similar to previous. + +1. Dealing with corrupted data files (Notebook data) + + 1. Prerequisite: Ensure `data/notebook.json` is present. Modify the data using note commands to create `data/notebook.json` if absent. + + 1. Test case: "description" field has more than 80 characters
+ Expected: **Reeve** initialises with an empty notebook. + + 1. Test case: "title" field has more than 15 characters
+ Expected: **Reeve** initialises with an empty notebook. + + 1. Test case: duplicate note in `notebook.json`
+ Expected: Similar to previous. diff --git a/docs/SettingUp.md b/docs/SettingUp.md index b89b691fed9..eab2933275a 100644 --- a/docs/SettingUp.md +++ b/docs/SettingUp.md @@ -23,7 +23,7 @@ If you plan to use Intellij IDEA (highly recommended): 1. **Import the project as a Gradle project**: Follow the guide [_[se-edu/guides] IDEA: Importing a Gradle project_](https://se-education.org/guides/tutorials/intellijImportGradleProject.html) to import the project into IDEA.
:exclamation: Note: Importing a Gradle project is slightly different from importing a normal Java project. 1. **Verify the setup**: - 1. Run the `seedu.address.Main` and try a few commands. + 1. Run the `seedu.classVenue.Main` and try a few commands. 1. [Run the tests](Testing.md) to ensure they all pass. -------------------------------------------------------------------------------------------------------------------- diff --git a/docs/Testing.md b/docs/Testing.md index 8a99e82438a..bac481d47f7 100644 --- a/docs/Testing.md +++ b/docs/Testing.md @@ -29,8 +29,8 @@ There are two ways to run tests. This project has three types of tests: 1. *Unit tests* targeting the lowest level methods/classes.
- e.g. `seedu.address.commons.StringUtilTest` + e.g. `seedu.classVenue.commons.StringUtilTest` 1. *Integration tests* that are checking the integration of multiple code units (those code units are assumed to be working).
- e.g. `seedu.address.storage.StorageManagerTest` + e.g. `seedu.classVenue.storage.StorageManagerTest` 1. Hybrids of unit and integration tests. These test are checking multiple code units as well as how the are connected together.
- e.g. `seedu.address.logic.LogicManagerTest` + e.g. `seedu.classVenue.logic.LogicManagerTest` diff --git a/docs/UserGuide.md b/docs/UserGuide.md index b91c3bab04d..faf32efd3b0 100644 --- a/docs/UserGuide.md +++ b/docs/UserGuide.md @@ -1,178 +1,920 @@ ---- -layout: page -title: User Guide ---- +## Reeve - User Guide + +**Table of Contents** +- [1. Introduction](#1-introduction) + * [1.1 About Reeve](#11-about-reeve) + * [1.2 Understanding the User Guide](#12-understanding-the-user-guide) +- [2. Quick start](#2-quick-start) + * [2.1 Setting up Reeve](#21-setting-up-reeve) + * [2.2 Making sense of Reeve's layout (By: Alex Chua)](#22-making-sense-of-reeves-layout-by-alex-chua) +- [3. Features](#3-features) + * [3.1 Understanding the command format](#31-understanding-the-command-format) + * [3.2 General features](#32-general-features) + + [3.2.1 Viewing help: `help`](#321-viewing-help-help) + + [3.2.2 Toggling between academic and administrative details: `toggle` (By: Hogan)](#322-toggling-between-academic-and-administrative-details-toggle-by-hogan) + + [3.2.3 Exiting the program: `exit`](#323-exiting-the-program-exit) + * [3.3 Features for managing student administrative details](#33-features-for-managing-student-administrative-details) + + [3.3.1 Adding a student: `add` (By: Hogan)](#331-adding-a-student-add-by-hogan) + + [3.3.2 Listing all students: `list`](#332-listing-all-students-list) + + [3.3.3 Editing a student: `edit` (By: Vaishak)](#333-editing-a-student-edit-by-vaishak) + + [3.3.4 Locating students: `find` (By: Choon Siong)](#334-locating-students-find-by-choon-siong) + + [3.3.5 Deleting a student: `delete`](#335-deleting-a-student-delete) + + [3.3.6 Sorting the list of students: `sort` (By: Choon Siong)](#336-sorting-the-list-of-students-sort-by-choon-siong) + + [3.3.7 Finding students with overdue fees: `overdue` (By: Ying Gao)](#337-finding-students-with-overdue-fees-overdue-by-ying-gao) + + [3.3.8 Managing details for a student: `detail` (By: Vaishak)](#338-managing-details-for-a-student-detail-by-vaishak) + + [3.3.8.1 Adding a detail: `detail add`](#3381-adding-a-detail-detail-add) + + [3.3.8.2 Editing a detail: `detail edit`](#3382-editing-a-detail-detail-edit) + + [3.3.8.3 Deleting a detail: `detail delete`](#3383-deleting-a-detail-detail-delete) + + [3.3.9 Viewing lesson schedule: `schedule` (By: Alex Chua)](#339-viewing-lesson-schedule-schedule-by-alex-chua) + + [3.3.10 Clearing all entries: `clear`](#3310-clearing-all-entries-clear) + * [3.4 Features for managing student academic details](#34-features-for-managing-student-academic-details) + + [3.4.1 Recording questions from a student: `question` (By: Ying Gao)](#341-recording-questions-from-a-student-question-by-ying-gao) + + [3.4.1.1 Adding a question: `question add`](#3411-adding-a-question-question-add) + + [3.4.1.2 Resolving a question: `question solve`](#3412-resolving-a-question-question-solve) + + [3.4.1.3 Deleting a question: `question delete`](#3413-deleting-a-question-question-delete) + + [3.4.2 Recording exams of a student: `exam` (By: Hogan)](#342-recording-exams-of-a-student-exam-by-hogan) + + [3.4.2.1 Adding an exam record to a student: `exam add`](#3421-adding-an-exam-record-to-a-student-exam-add) + + [3.4.2.2 Deleting an exam record for a student: `exam delete`](#3422-deleting-an-exam-record-for-a-student-exam-delete) + + [3.4.2.3 Viewing exam statistics of a student: `exam stats`](#3423-viewing-exam-statistics-of-a-student-exam-stats) + + [3.4.3 Recording attendance of a student: `attendance` (By: Vaishak)](#343-recording-attendance-of-a-student-attendance-by-vaishak) + + [3.4.3.1 Adding an attendance record to a student: `attendance add`](#3431-adding-an-attendance-record-to-a-student-attendance-add) + + [3.4.3.2 Deleting an attendance record for a student: `attendance delete`](#3432-deleting-an-attendance-record-for-a-student-attendance-delete) + * [3.5 Notebook feature (By: Choon Siong)](#35-notebook-feature-by-choon-siong) + + [3.5.1 Adding a note: `note add`](#351-adding-a-note-note-add) + + [3.5.2 Editing a note: `note edit`](#352-editing-a-note-note-edit) + + [3.5.3 Deleting a note: `note delete`](#353-deleting-a-note-note-delete) +- [4. Command summary](#4-command-summary) +- [5. Glossary](#5-glossary) +- [6. FAQ](#6-faq) + +## 1. Introduction +**Welcome to Reeve!** + +### 1.1 About Reeve +Are you looking for a one-stop application that can handle all your private tutoring needs? Then you are in luck! + +**Reeve** is a desktop application for **private tutors to better manage both administrative and academic details of their students**, optimised for use via a +**Command Line Interface (CLI)** for receiving inputs while still having the benefits of a **Graphical User Interface (GUI)** for displaying information. In addition, **Reeve** comes with a customisable personal scheduler to assist you in keeping track of your classes. **Reeve** also allows you to set timely reminders for yourself. + +Get to experience all the above without even having to move your mouse at all! + +Also, did we mention that you are able to achieve all the above **without internet access at all**? + +If you are a private tutor that wants to not only manage your students' administrative and academic details with ease but to also better meet their needs, then **Reeve** is made for you! + +Let's dive into the User Guide to find out more! + +
+ +### 1.2 Understanding the User Guide +The goal of this User Guide is to provide you with the information on how to utilise **Reeve** to its fullest. + +For those who are unfamiliar with what a CLI is, no worries! This User Guide will ensure that you will be able to understand how to use a CLI by the end of it. + +Here is a summary (Table 1) of the symbols that are used in this User Guide: + +Table 1: Summary of symbols + +Symbol | Meaning +:-----:|:------- +`USER_INPUT` | User input into the CLI +:information_source: | Important information +:warning: | Warnings + +
+ +## 2. Quick start +This section serves to explain how to set up **Reeve** on your computer and how to make sense of the visual layout of the application. + +### 2.1 Setting up Reeve +1. Ensure you have Java 11 or above installed in your Computer. + +1. Download the latest .jar file from [here](https://github.com/AY2021S1-CS2103T-W15-2/tp/releases). + +1. Copy the file to the folder you want to use as the _home folder_ for **Reeve**. + +1. Double-click the file to start the app. The GUI similar to the below figure (Figure 1) should appear in a few seconds. Note how the app contains some sample data. -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. +1. Type the command in the command box and press Enter to execute it. e.g. typing **`help`** and pressing Enter will open the help window.
+ Some example commands you can try: -* Table of Contents -{:toc} + * **`list`** : Lists all students. --------------------------------------------------------------------------------------------------------------------- + * **`add`**`n/Alex p/93211234 s/Commonwealth Secondary School y/Primary 6 v/Blk 33 West Coast Rd #21-214 + t/1 1430-1630 f/25 d/12/12/2020` : Adds a student named `Alex` to **Reeve**. -## Quick start + * **`delete`**`3` : Deletes the 3rd student shown in the current list. -1. Ensure you have Java `11` or above installed in your Computer. + * **`clear`** : Deletes all students. -1. Download the latest `addressbook.jar` from [here](https://github.com/se-edu/addressbook-level3/releases). + * **`exit`** : Exits **Reeve**. -1. Copy the file to the folder you want to use as the _home folder_ for your AddressBook. +1. Refer to the [Features](#3-features) section below for details of each command. -1. Double-click the file to start the app. The GUI similar to the below should appear in a few seconds. Note how the app contains some sample data.
- ![Ui](images/Ui.png) +![Ui](images/Ui.png) +
Figure 1: Reeve GUI

-1. Type the command in the command box and press Enter to execute it. e.g. typing **`help`** and pressing Enter will open the help window.
- Some example commands you can try: +### 2.2 Making sense of Reeve's layout (By: Alex Chua) - * **`list`** : Lists all contacts. +This section serves to help you understand the layout of **Reeve**. Please refer to the figure below (Figure 2) for help. - * **`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. +![Reeve's Layout](images/ReeveLayout.png) +
Figure 2: Reeve's Layout

- * **`delete`**`3` : Deletes the 3rd contact shown in the current list. +1. **Menu** - * **`clear`** : Deletes all contacts. + These tabs allows you to simply click on them and get what is needed. - * **`exit`** : Exits the app. +2. **Main Panel** -1. Refer to the [Features](#features) below for details of each command. + The main panel shows your list of students for easy reference. You could also view your schedule in this panel. --------------------------------------------------------------------------------------------------------------------- +3. **Result Display** -## Features + The result display is where **Reeve** provides responses to your commands. -
+4. **Notes Panel** + + The notes panel displays all your notes that you have added. + +5. **Command Box** + + The command box allows you to type any commands that is accepted in **Reeve**. + +
+ +## 3. Features -**:information_source: Notes about the command format:**
+This section serves to provide you a detailed explanation of how the various features of **Reeve** work and how to use these features. + +### 3.1 Understanding the command format + +The following points explain how to make sense of the command format: * Words in `UPPER_CASE` are the parameters to be supplied by the user.
e.g. in `add n/NAME`, `NAME` is a parameter which can be used as `add n/John Doe`. * Items in square brackets are optional.
- e.g `n/NAME [t/TAG]` can be used as `n/John Doe t/friend` or as `n/John Doe`. + e.g `n/NAME [a/DETAIL_TEXT]` can be used as `n/John Doe a/Likes to read books` 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. `[a/DETAIL_TEXT]…​` can be used as ` ` (i.e. 0 times), `a/Likes to read books`, `a/Likes sweets a/Needs help with Algebra` 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. -
+### 3.2 General features -### Viewing help : `help` +This section serves to provide you a detailed explanation of the general features which will help you to maximise the potential of **Reeve**. -Shows a message explaning how to access the help page. +#### 3.2.1 Viewing help: `help` -![help message](images/helpMessage.png) +If you are unsure of any of the commands, this command will direct you to the help page. Format: `help` +Expected outcome: + +The following figure (Figure 3) shows the help window entering the command `help`. + +

+
Figure 3: Help window
+ +#### 3.2.2 Toggling between academic and administrative details: `toggle` (By: Hogan) + +Since each student contains some administrative and academic details, this command allows you to +toggle between viewing these details to allow you to focus on the type of details that you are currently interested in. +By default, the administrative details of students are shown upon starting the application. + +Format: `toggle` + +Example: +* By default, you should see the administrative details of your students. + * If you have not entered the `toggle` command, you should see a screen similar to the one below (Figure 4). -### Adding a person: `add` + ![ToggleCommandExpectedOutcomeBeforeUG](images/ToggleCommandExpectedOutcomeBeforeUG.png) +
Figure 4: Before entering toggle command

-Adds a person to the address book. + * After entering the `toggle` command, you will switch to displaying academic details of students as shown below (Figure 5). + + ![ToggleCommandExpectedOutcomeAfterUG](images/ToggleCommandExpectedOutcomeAfterUG.png) +
Figure 5: After entering toggle command

+ +#### 3.2.3 Exiting the program: `exit` + +You can exit the program with the `exit` command. Any changes you have made to **Reeve** is automatically saved to your drive, so do not have to worry about losing data. + +Format: `exit` + +
+ +### 3.3 Features for managing student administrative details + +**Reeve's** student administrative features allows you to keep track of key administrative details of each of your students such as phone number, class venue, tuition fee, etc. +Thereafter, you will be able to view, edit find or delete these students. + +#### 3.3.1 Adding a student: `add` (By: Hogan) + +You can add a student together with his/her administrative details into **Reeve's** student list. + +Format: `add n/NAME p/PHONE s/SCHOOL y/YEAR v/CLASS_VENUE t/CLASS_TIME [f/FEE] [d/LAST_PAYMENT_DATE] [a/ADDITIONAL_DETAILS]…​` + +* The format of `YEAR` is as follows: + * `TYPE_OF_SCHOOL LEVEL` (e.g. y/primary 2 and y/p 2 are the same and both acceptable). + * `TYPE_OF_SCHOOL` accepts Primary (Pri/P), Secondary (Sec/S) or JC (J), and is case-insensitive. + * `LEVEL` has to be valid for the `TYPE_OF_SCHOOL` (i.e. Primary 1 - Primary 6, Secondary 1 - Secondary 5, JC 1 - JC 2) +* The format of `CLASS_TIME` is as follows: + * `DAY_OF_WEEK START_TIME-END_TIME` + * `DAY_OF_WEEK` is any integer from 1 to 7, where 1 refers to Monday while 7 refers to Sunday. + * `START_TIME` and `END_TIME` follows the 24-hr clock format (e.g. 1300 refers to 1pm). +* The format of `LAST_PAYMENT_DATE` is `dd/mm/yy or dd/mm/yyyy` (e.g. both 3/2/20 and 3/2/2020 are acceptable). +* `FEE` defaults to $0.00 if not included. +* `LAST_PAYMENT_DATE` defaults to today's date if not included. + +
+ +:information_source: You **cannot** add duplicates of a student. Each student is uniquely identified by his/her `NAME`, `PHONE`, `SCHOOL` and `YEAR`. + +
+ +
-Format: `add n/NAME p/PHONE_NUMBER e/EMAIL a/ADDRESS [t/TAG]…​` +:information_source: `LAST_PAYMENT_DATE` **cannot** be a future date (i.e. cannot be later than the current date) + +
+ +
+ +:information_source: The specified `END_TIME` for the `CLASS_TIME` field **should not** be before the `START_TIME` (e.g. `1300-1200` is invalid). -
:bulb: **Tip:** -A person can have any number of tags (including 0)
Examples: -* `add n/John Doe p/98765432 e/johnd@example.com a/John street, block 123, #01-01` -* `add n/Betsy Crowe t/friend e/betsycrowe@example.com a/Newgate Prison p/1234567 t/criminal` +* Suppose you want to add a student without any additional details. + * You can use something like `add n/Brendan Tan p/93211234 s/Commonwealth Secondary School y/pri 6 v/Blk 33 West Coast Rd #21-214 t/5 1430-1630 f/25 d/10/10/2020`. + * You should see a screen similar to the one shown below (Figure 6). -### Listing all persons : `list` + ![AddCommandExpectedOutcomeUG](images/AddCommandExpectedOutcomeUG.png) +
Figure 6: After entering add command

-Shows a list of all persons in the address book. +* Also, if you want to add a student with multiple additional details. + * You can use something like `add n/John Doe p/98765432 s/Woodlands Secondary School y/s 2 v/347 Woodlands Ave 3, Singapore 730347 t/1 1200-1400 f/30 d/24/09/2020 a/Likes chocolates a/Needs help with Algebra` + +#### 3.3.2 Listing all students: `list` + +You can view the list of all students in **Reeve** sorted by name. Format: `list` -### Editing a person : `edit` +
+ +:information_source: You will need to use this if you wish to view the full student list after using commands such as `find`, `overdue` and `schedule`. -Edits an existing person in the address book. +
+ +#### 3.3.3 Editing a student: `edit` (By: Vaishak) + +You can edit an existing student in **Reeve** if you need to update his/her particulars. -Format: `edit INDEX [n/NAME] [p/PHONE] [e/EMAIL] [a/ADDRESS] [t/TAG]…​` +Format: `edit STUDENT_INDEX [n/NAME] [p/PHONE] [s/SCHOOL] [y/YEAR] [v/CLASS_VENUE] [t/CLASS_TIME] [f/FEE] [d/LAST_PAYMENT_DATE]` -* 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 the student at the specified `STUDENT_INDEX`. The `STUDENT_INDEX` refers to the index number shown in the displayed student list. The `STUDENT_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. +* The format of `CLASS_TIME`, `YEAR` and `LAST_PAYMENT_DATE` follows that as stated in the [add command section](#331-adding-a-student-add-by-hogan). + +
+ +:information_source: If using this command after `find`, the edited student may no longer satisfy the search criteria depending on the field changed. +In that case the student will be hidden from view and can be viewed again using `list` or `find`.
+ +E.g. `edit 1 n/Amy Choo` after `find n/Bob` will cause the student to be hidden since her name no longer contains "Bob". +You can use `list` or `find` (e.g `find n/Amy`) to display her information again. + +
+ +
+ +:warning: You cannot add / edit additional details with this command. + +
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. +* `edit 1 n/Arthur p/98727030 s/Meridian Junior College` edits the name, phone number and school of the 1st student to be `Arthur`, `98727030` and `Meridian Junior College` respectively. + +Expected outcome: +The following figure (Figure 7) shows the expected outcome after executing the above example. -### Locating persons by name: `find` +![EditCommandExpectedOutcome](images/EditCommandExpectedOutcome.png) +
Figure 7: After entering edit command

-Finds persons whose names contain any of the given keywords. +#### 3.3.4 Locating students: `find` (By: Choon Siong) -Format: `find KEYWORD [MORE_KEYWORDS]` +You can search for students who satisfy the given search criteria. + +Format: `find [n/NAME] [s/SCHOOL] [y/YEAR]` * The search is case-insensitive. e.g `hans` will match `Hans` -* The order of the keywords does not matter. e.g. `Hans Bo` will match `Bo Hans` -* Only the name is searched. -* Only full words will be matched e.g. `Han` will not match `Hans` -* Persons matching at least one keyword will be returned (i.e. `OR` search). - e.g. `Hans Bo` will return `Hans Gruber`, `Bo Yang` +* At least one of the optional fields must be provided. +* The order of the optional fields do not matter. e.g `n/Hans s/River Valley` is the same as `s/River Valley n/Hans` +* For the name criteria, only students with a name that contains **any full keyword** specified will be matched. +* For the school criteria, only students with a school that contains **all keywords** specified will be matched. +* For the year criteria, only students with the **same year** will be matched. (See below for more elaboration for format of year) +* Only students matching all criteria specified will be returned (i.e `AND` search). + +Examples: +* `find n/Alex david` matches `Alex David`, `alex david` and `Alex david`. +* `find n/Alex david` does not match `Alexis Davinder`. +* `find s/yishun sec` matches `Yishun Secondary School`, `Yishun Town Secondary School` and `Yishun Sec`. +* `find s/yishun secondary` matches `Yishun Secondary School` and `Yishun Town Secondary School` but not `Yishun Sec`. +* `find n/alex s/yishun y/sec 3` searches for all students who match all of `n/alex`, `s/yishun` and `y/sec 3`. + +#### 3.3.5 Deleting a student: `delete` + +You can delete a specified student from **Reeve** to allow you to get rid of any unwanted student data. + +Format: `delete STUDENT_INDEX` + +* Deletes the student at the specified `STUDENT_INDEX`. +* `STUDENT_INDEX` refers to the index number shown in the displayed students list. + +
+ +:information_source: `STUDENT_INDEX` **must be a positive integer** 1, 2, 3, …​ + +
Examples: -* `find John` returns `john` and `John Doe` -* `find alex david` returns `Alex Yeoh`, `David Li`
- ![result for 'find alex david'](images/findAlexDavidResult.png) +* `list` followed by `delete 2` deletes the 2nd student in **Reeve**. +* `find n/Betsy` followed by `delete 1` deletes the 1st student in the results of the `find` command. -### Deleting a person : `delete` +#### 3.3.6 Sorting the list of students: `sort` (By: Choon Siong) -Deletes the specified person from the address book. +You can sort your student list by a specified means of comparison. The means of comparison must be the student's name, class time or year. +This is useful in situations where you want to look at your student list differently for various reasons. -Format: `delete INDEX` +Format: `sort COMPARISON_MEANS` -* Deletes the person at the specified `INDEX`. -* The index refers to the index number shown in the displayed person list. -* The index **must be a positive integer** 1, 2, 3, …​ +* The valid options for `COMPARISON_MEANS` are `name`, `classTime` or `year`. +* Only one option for the means of comparison can be specified. +* The means of comparison is case-sensitive when being specified +* means of comparison: + * `name`: Sorts students by their name in case-insensitive alphabetical order. This is useful when you want to search through your student list easily. + * `classTime`: Sorts students by the day of their class followed by its time. This is useful when you want to look at your student list in order of upcoming classes. + * `year` Sorts students by their year with `Primary 1` coming first and `JC 2` last. This is useful when you want to group students by their year. 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. +* `sort name` to sort students by their name in alphabetical order -### Clearing all entries : `clear` +#### 3.3.7 Finding students with overdue fees: `overdue` (By: Ying Gao) -Clears all entries from the address book. +You can find all students whose date of last payment is more than a month ago. + +Format: `overdue` + +* Students tutored for free (i.e. `FEE` = $0.00) will not be displayed. +* If all students have paid their fees within the past month, no students will be displayed. + +
+ +:warning: If you use `edit` to update a student's last payment date to within a month from now, the student will be hidden from the list as his payment is no longer outstanding. +You can always view his particulars again using `list` or `find`. The same also applies if you edit his fee to $0.00. + +
+ +Expected outcome: + +The following figure (Figure 8) shows the expected result after entering the command `overdue`. + +![OverdueExpectedOutcome](images/OverdueExpectedOutcome.png) +
Figure 8: After entering overdue command

+ +#### 3.3.8 Managing details for a student: `detail` (By: Vaishak) + +You can add, edit or delete a detail for a specified student. + +General Format: `detail COMMAND_WORD STUDENT_INDEX PARAMETERS` + +* The `COMMAND_WORD` field accepts either `add`, `edit` or `delete`. +* The command affects the student at the specified `STUDENT_INDEX`. +* The format of `PARAMETERS` varies with each `COMMAND_WORD` as explained below. + +
+ +:information_source: `STUDENT_INDEX` **must be a positive integer** 1, 2, 3, …​ + +
+ +#### 3.3.8.1 Adding a detail: `detail add` + +You can add a detail to a specified student in **Reeve**. + +Format: `detail add STUDENT_INDEX t/DETAIL_TEXT` + +* Adds the detail to the student at the specified `STUDENT_INDEX`. + +Examples: +* `detail add 1 t/Smart` adds the "Smart" detail to the 1st student in **Reeve**. + +Expected outcome: +The following figure (Figure 9) shows the expected outcome after executing the above example. + +![AddDetailExpectedOutcome](images/AddDetailExpectedOutcome.png) +
Figure 9: After entering add detail command

+ +#### 3.3.8.2 Editing a detail: `detail edit` + +You can edit an existing detail for a specified student in **Reeve**. + +Format: `detail edit STUDENT_INDEX i/DETAIL_INDEX t/DETAIL_TEXT` + +* Edits the detail at the specified `DETAIL_INDEX` for the student at the specified `STUDENT_INDEX`. +* `DETAIL_INDEX` refers to the index of the detail to edit, within the detail field of the student. +* There has to be a valid detail at the `DETAIL_INDEX` provided. + +Examples: +* `detail edit 1 i/2 t/Handsome` edits the 2nd detail for the 1st student in **Reeve**, to "Handsome". + +Expected outcome: +The following figure (Figure 10) shows the expected outcome after executing the above example. + +![EditDetailExpectedOutcome](images/EditDetailExpectedOutcome.png) +
Figure 10: After entering edit detail command

+ +#### 3.3.8.3 Deleting a detail: `detail delete` + +You can delete an existing detail to a specified student in **Reeve**. + +Format: `detail delete STUDENT_INDEX i/DETAIL_INDEX` + +* Deletes the detail at the specified `DETAIL_INDEX` for the student at the specified `STUDENT_INDEX`. +* `DETAIL_INDEX` refers to the index of the detail to delete, within the detail field of the student. +* There has to be a valid detail at the `DETAIL_INDEX` provided. + +Examples: +* `detail delete 1 i/1` deletes the 1st detail for the 1st student in **Reeve**. + +Expected outcome: +The following figure (Figure 11) shows the expected outcome after executing the above example. + +![DeleteDetailExpectedOutcome](images/DeleteDetailExpectedOutcome.png) +
Figure 11: After entering delete detail command

+ +#### 3.3.9 Viewing lesson schedule: `schedule` (By: Alex Chua) + +You can view your classes on a timetable in either a daily or weekly format. + +Format: `schedule m/VIEW_MODE d/DATE_TO_VIEW` + +* Displays a timetable view of your classes with the corresponding student's name tagged to it. +* `DATE_TO_VIEW` refers to the date you wish to view the lesson schedule of. +* The format of `DATE_TO_VIEW` is `dd/mm/yy or dd/mm/yyyy` (e.g. both 3/2/20 and 3/2/2020 are acceptable). +* `VIEW_MODE` refers to the mode where you would like the schedule to be rendered on screen. + It accepts either `weekly` or `daily` as inputs and is case-insensitive. + +Example: + +Suppose you have multiple classes in the coming week of 2nd November 2020 and you want to plan for them ahead. + +Instead of scrolling through your student details to find out who you have classes with, +you can simply type `schedule m/weekly d/02/11/2020` to view them in a visual interface. + +To view schedule: + +1. Type `schedule m/weekly d/02/11/2020` into the command box as shown in Figure 12 . Press `Enter` to execute the command. + + ![Schedule Step 1](images/ScheduleStep1.png) +
Figure 12: Shows the schedule command input keyed into the command box

+ +2. The schedule panel, as labelled in Figure 13, will appear with all your classes for the week of 2nd November 2020 populated. + + ![Schedule Step 2](images/ScheduleStep2.png) +
Figure 13: Shows the schedule panel in the weekly format

+ +3. You can easily view your classes for the week. The Date bar labelled in Figure 14 below shows the day of the week as well as the date for your reference. + The Time bar in Figure 14 shows the time in 24-hour clock format with 1-hour intervals. + The Classes labelled in Figure 14 are colored brown to match the color of **Reeve** for a better visual experience. + Furthermore, the name of the student that you are tutoring during that slot will be labelled for you to identify classes easily. + The red bar in Figure 14 indicates your current time. + With the date, time and name of student shown in one view, you could plan your classes without a hassle. + + ![Schedule Step 3](images/ScheduleStep3.png) +
Figure 14: Shows various component of your schedule

+ +
+:information_source: You could also click on the **Schedule** tab in the **Menu** to open or close the schedule. +Viewing it this way would open up your schedule of the current week in the weekly format. +You could use this as quick way to open up schedule for the current week. +
+ +
+:warning: A class duration of less than an hour may not be shown fully on the schedule. +
+ +#### 3.3.10 Clearing all entries: `clear` + +If you ever need to clear all existing data in **Reeve**, you can do so using this command. Format: `clear` -### Exiting the program : `exit` +
-Exits the program. +### 3.4 Features for Managing Student Academic Details -Format: `exit` +**Reeve's** student academics features allows you to keep track of key academic details of each of your students such as questions, exams and etc. +Thereafter, you will be able to view, edit or delete these details of each student. + +#### 3.4.1 Recording questions from a student: `question` (By: Ying Gao) + +You can add, resolve or remove questions to/from a specified student in **Reeve**. + +General Format: `question COMMAND_WORD STUDENT_INDEX DETAILS` + +* The `COMMAND_WORD` field accepts either `add`, `solve` or `delete`. +* The command affects the student at the specified `STUDENT_INDEX`, which is his/her position on the list. +* The format of `DETAILS` varies with each command word as explained below. + +
+ +:information_source: `STUDENT_INDEX` **must be a positive integer** 1, 2, 3, …​ + +
+ +##### 3.4.1.1 Adding a question: `question add` + +If a student asks you a difficult question, you can record it in **Reeve** and find the answer to it after the lesson. + +Format: `question add STUDENT_INDEX t/QUESTION_TEXT` + +* This records a new unresolved question to the student at the specified `STUDENT_INDEX`. +* The `QUESTION_TEXT` field refers to the question the student raised, and can be a full sentence. + +
+ +:information_source: `QUESTION_TEXT` must not be empty. + +
-### Saving the data +Example: +* `question add 1 t/How do birds fly?` records "How do birds fly?" as a question from the 1st student in **Reeve**. -AddressBook data are saved in the hard disk automatically after any command that changes the data. There is no need to save manually. +Expected outcome: + +The following figure (Figure 15) shows the result of recording "How do I pass CS2101?" as a new question from Bernice Yu. + +![QuestionAddExpectedOutcome](images/QuestionAddExpectedOutcome.png) +
Figure 15: After entering add question command

+ +##### 3.4.1.2 Resolving a question: `question solve` + +After finding the solution to the question, you can mark the student's question as resolved. + +Format: `question solve STUDENT_INDEX i/QUESTION_INDEX t/SOLUTION_TEXT` + +* This resolves the question from the student at the specified `STUDENT_INDEX` +* This resolves the question at the `QUESTION_INDEX`. The `QUESTION_INDEX` refers to the position of the question in the student's list of questions. + +
+:information_source: `QUESTION_INDEX` **must be a positive integer** 1, 2, 3, …​ +
-### Archiving data files `[coming in v2.0]` +
+:information_source: `SOLUTION_TEXT` must not be empty. +
+ +
+:information_source: You can only resolve unanswered questions (i.e. questions with a cross symbol next to it). +
+ +Example: +* `question solve 1 i/1 t/Read a book.` marks the 1st question of the 1st student in **Reeve** as answered. + +Expected outcome: + +The following figure (Figure 16) shows the result of resolving Bernice's second question. + +![QuestionSolveExpectedOutcome](images/QuestionSolveExpectedOutcome.png) +
Figure 16: After entering solve question command

+ +##### 3.4.1.3 Deleting a question: `question delete` + +If you do not need a student's question anymore, you can delete it. + +Format: `question delete STUDENT_INDEX i/QUESTION_INDEX` + +* This deletes the question at the specified `QUESTION_INDEX`. + +
+ +:information_source: `QUESTION_INDEX` **must be a positive integer** 1, 2, 3, …​ + +
+ +Example: +* `question delete 1 i/1` deletes the 1st question of the 1st student in **Reeve**. + +Expected outcome: + +The following figure (Figure 17) shows the result of deleting Bernice's second question. + +![QuestionDeleteExpectedOutcome](images/QuestionDeleteExpectedOutcome.png) +
Figure 17: After entering delete question command

+ +#### 3.4.2 Recording exams of a student: `exam` (By: Hogan) + +You can add or delete an exam record to/from a specified student. You can then view the exam statistics of a student in the form of a +score percentage to exam date line graph. This helps you to keep track of your students academic progress allowing you to take note of those who are +not doing too well. + +General Format: `exam COMMAND_WORD_EXAM STUDENT_INDEX PARAMETERS` + +* The `COMMAND_WORD_EXAM` field accepts either `add`, `delete` or `stats`. +* The command can affect the student at the specified `STUDENT_INDEX`. +* `STUDENT_INDEX` refers to the index number shown in the displayed students list. +* The format of `PARAMETERS` varies with each command word as explained in the following subsections. + +
+ +:information_source: `STUDENT_INDEX` **must be a positive integer** 1, 2, 3, …​ + +
+ +##### 3.4.2.1 Adding an exam record to a student: `exam add` + +You can add an exam record to a specified student in **Reeve** to keep track of your students' academic progress. + +Format: `exam add STUDENT_INDEX n/EXAM_NAME d/EXAM_DATE s/EXAM_SCORE` + +* Adds the given exam record to the student at the specified `STUDENT_INDEX`. +* The format of `EXAM_DATE` is `dd/mm/yy or dd/mm/yyyy` (e.g. both 3/2/20 and 3/2/2020 are acceptable). +* The format of `EXAM_SCORE` is as follows: + * `MARKS/TOTAL_SCORE` where `MARKS` and `TOTAL_SCORE` are non-negative numbers. + * `MARKS` has to be less than or equal to `TOTAL_SCORE` (e.g. 30/50). + +
+ +:information_source: Scores and score percentages will be rounded off to two decimal places. + +
+ +
+ +:warning: You **cannot** add duplicates of an exam record to a student. Each exam record is uniquely identified by its `EXAM_NAME`. + +
+ +Example: +* Suppose you want to add an exam record to a student to monitor his academic progress. + * You can use `exam add 1 n/Mid Year 2020 d/08/12/2020 s/40/60` to add a new exam record to the first student in the displayed student list on the main panel + with exam name `Mid Year 2020`, exam date `08/12/2020` and score `40/60` so that you can keep track of this particular exam record. + * You should see a screen similar to the one below (Figure 18) after entering the above command. + + ![AddExamCommandExpectedOutcomeUG](images/AddExamCommandExpectedOutcomeUG.png) +
Figure 18: After entering add exam command

+ +##### 3.4.2.2 Deleting an exam record for a student: `exam delete` + +You can delete a specific exam record from a specified student in **Reeve** to remove any unwanted exam record data. + +Format: `exam delete STUDENT_INDEX i/EXAM_INDEX` + +* Deletes the exam at `EXAM_INDEX` in the specified student's exam records list. +* The specified exam record is chosen based on `EXAM_INDEX`. +* The `EXAM_INDEX` refers to the index number shown in the displayed student's exam records list. + +
+ +:information_source: `EXAM_INDEX` **must be a positive integer** 1, 2, 3, …​ + +
-_{explain the feature here}_ +Example: +* Suppose you have an outdated exam record or an exam record with wrong details such as the exam date or score and you wish to remove this exam record. + * For instance, if your current list looks similar to the figure below (Figure 19). --------------------------------------------------------------------------------------------------------------------- + ![DeleteExamExpectedOutcomeBefore](images/DeleteExamExpectedOutcomeBefore.png) +
Figure 19: Before entering delete exam command

-## FAQ + * You can use `exam delete 1 i/1` to delete the first exam record of the first student in the displayed student list on the main panel. + * You should see that you have successfully deleted the first exam record of the first student as shown below (Figure 20) after entering the above command. -**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. + ![DeleteExamExpectedOutcomeAfter](images/DeleteExamExpectedOutcomeAfter.png) +
Figure 20: After entering delete exam command

--------------------------------------------------------------------------------------------------------------------- +##### 3.4.2.3 Viewing exam statistics of a student: `exam stats` -## Command summary +To gauge how any of your students are doing with their examinations, this command allows you to view a graphical +representation of all recorded examinations of a student in the form of a exam score percentage to exam date line graph. + +Format: `exam stats STUDENT_INDEX` + +* Views exam statistics of the student at the specified `INDEX`. + +
+ +:information_source: Exam records are arranged in order of increasing date. + +
+ +Examples: +* Suppose you are trying to view the exam statistics of a particular student to view his academic progress so far in terms of his exam scores. + * You can use `exam stats 1` to view the exam statistics of the first student in the displayed student list on the main panel. + * You should see a screen similar to the one below (Figure 21) when the above command is entered. + + ![ExamStatsCommandExpectedOutcomeUG](images/ExamStatsCommandExpectedOutcomeUG.png) +
Figure 21: Before entering exam stats command

+ +
+ +:information_source: If you are editing the exams of a student, you will have to enter the `exam stats` command again to get the updated statistics. + +
+ +#### 3.4.3 Recording attendance of a student: `attendance` (By: Vaishak) + +You can add or delete an attendance record to/from a specified student. + +General Format: `attendance COMMAND_WORD STUDENT_INDEX PARAMETERS` + +* The `COMMAND_WORD` field accepts either `add` or `delete`. +* The command affects the student at the specified `STUDENT_INDEX`. +* `STUDENT_INDEX` **must be a positive integer** 1, 2, 3, …​ +* The format of `PARAMETERS` varies with each command word as explained below. + +##### 3.4.3.1 Adding an attendance record to a student: `attendance add` + +You can add an attendance record to a specified student in **Reeve**. + +Format: `attendance add STUDENT_INDEX d/LESSON_DATE a/ATTENDANCE_STATUS [f/FEEDBACK]` + +* Adds the given attendance record to the student at the specified `STUDENT_INDEX`. +* There can only be one attendance record for every `LESSON_DATE`. +* The format of `LESSON_DATE` is `dd/mm/yy or dd/mm/yyyy` (e.g. both 3/2/20 and 3/2/2020 are acceptable). +* `ATTENDANCE_STATUS` can only be either "present" or "absent". + +Examples: +* `attendance add 1 d/31/10/2020 a/absent` adds to the 1st student in **Reeve** a new attendance record for a +lesson on 31 Oct 2020, where he was absent, and the tutor has no feedback for him. + +Expected outcome: +The following figure (Figure 22) shows the expected outcome after executing the above example. + +![AddAttendanceExpectedOutcome](images/AddAttendanceExpectedOutcome.png) +
Figure 22: After entering add attendance command

+ +##### 3.4.3.2 Deleting an attendance record for a student: `attendance delete` + +You can delete a specific attendance record from a specified student in **Reeve**. + +Format: `attendance delete STUDENT_INDEX d/ATTENDANCE_DATE` + +* Deletes the attendance record with the given `ATTENDANCE_DATE` in the specified student. +* The specified student is chosen based on `STUDENT_INDEX` of **Reeve**. + +Example: +* `attendance delete 1 d/06/05/2010` deletes the attendance with the date 6 Apr 2020 from the 1st student in the displayed students list in **Reeve**. + +Expected outcome: +The following figure (Figure 23) shows the expected outcome after executing the above example. + +![DeleteAttendanceExpectedOutcome](images/DeleteAttendanceExpectedOutcome.png) +
Figure 23: After entering delete attendance command

+ +
+ +### 3.5 Notebook feature (By: Choon Siong) + +You can store notes containing small amounts of information inside the notebook. This is useful when you want to store information or details that is not related to any student and cannot do so anywhere else in **Reeve**. +You should see the notes on the bottom right hand side of **Reeve** similar to the display shown below (Figure 24). + +![Location of notes panel](images/screenshots/Notes.png) +
Figure 24: Location of notes panel

+ +#### 3.5.1 Adding a note `note add` + +You can add a note to the notebook for the information you want to store. + +Format: `note add t/TITLE d/DESCRIPTION` + +* `TITLE` is any string of up to 15 characters. +* `DESCRIPTION` is any string of up to 80 characters. + +Example: +* You have just collected a stack of practice papers from your students and want to do something else before marking them but are scared you might forget. + + * You can use `note add t/things to do d/mark practice papers` to add a new note with title `things to do` and description `mark practice papers` so that you can remind yourself later. + + * You should see a screen similar to the screen below (Figure 25) when the above command is entered. + + ![Adding a note](images/screenshots/AddingNote.png) +
Figure 25: After entering add note command

+ +#### 3.5.2 Editing a note `note edit` + +You can edit a note that is inside the notebook to update the information inside. + +Format: `note edit NOTE_INDEX [t/TITLE] [d/DESCRIPTION]` + +* Edits the note at the specified `NOTE_INDEX` + +Example: +* You left a note to mark practice papers earlier and have just finished marking them. Now, before you take a break, + you want to remind yourself to review the marking before you can give it back to your students. + * Assuming the previous note was the first note, you can use `note edit 1 d/review marking` + to change the note to remind yourself to review the marking. + +#### 3.5.3 Deleting a note `note delete` + +You can delete a note from the notebook when the information is no longer needed. + +Format: `note delete NOTE_INDEX` + +* Deletes the note at the specified `NOTE_INDEX` + +Example: +* Your first note was to remind yourself to grab a cup of coffee. Now that you have bought your cup of coffee, the note is no longer needed. + * You can use `note delete 1` to delete the note. + +
+ +## 4. Command summary + +This following table (Table 2) provides a summary of all the commands in **Reeve**. + +Table 2: Summary of commands in **Reeve** 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` +**Add Student** | `add n/NAME p/PHONE s/SCHOOL y/YEAR v/CLASS_VENUE t/CLASS_TIME f/FEE d/LAST_PAYMENT_DATE [a/ADDITIONAL_DETAILS]...​`
e.g. `add n/John Doe p/98765432 s/Woodlands Secondary School y/Secondary 2 v/347 Woodlands Ave 3, Singapore 730347 t/1 1200-1400 f/30 d/24/09/2020 a/Likes chocolates a/Needs help with Algebra` +**Edit Student** | `edit STUDENT_INDEX [n/NAME] [p/PHONE] [s/SCHOOL] [y/YEAR] [v/CLASS_VENUE] [t/CLASS_TIME] [f/FEE] [d/LAST_PAYMENT_DATE]`
e.g. `edit 1 n/Arthur p/98727030 s/Meridian Junior College` +**Find Student** | `find [n/NAME] [s/SCHOOL] [y/YEAR]`
e.g. `find n/alex s/yishun` +**List Students** | `list` +**Delete Student** | `delete STUDENT_INDEX`
e.g. `delete 3` +**Sort Students** | `sort COMPARISON_MEANS`
e.g. `sort year` +**Overdue** | `overdue unpaid` +**Add Detail** | `detail add STUDENT_INDEX t/DETAIL_TEXT`
e.g. `detail add 1 t/Smart` +**Edit Detail** | `detail edit STUDENT_INDEX i/DETAIL_INDEX t/DETAIL_TEXT`
e.g. `detail edit 1 i/2 t/Handsome` +**Delete Detail** | `detail delete STUDENT_INDEX i/DETAIL_INDEX`
e.g. `detail delete 1 i/3` **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` +**Add Question** | `question add STUDENT_INDEX t/QUESTION`
e.g. `question add 1 t/How do birds fly?` +**Resolve Question** | `question solve STUDENT_INDEX i/QUESTION_INDEX t/SOLUTION`
e.g. `question solve 1 i/1 t/Read a book.` +**Delete Question** | `question delete STUDENT_INDEX i/QUESTION_INDEX`
e.g. `question delete 1 i/1` +**Add Exam** | `exam add STUDENT_INDEX n/EXAM_NAME d/EXAM_DATE s/EXAM_SCORE`
e.g. `exam add 1 n/Mid Year 2020 d/08/12/2020 s/40/60` +**Delete Exam** | `exam delete STUDENT_INDEX i/EXAM_INDEX`
e.g. `exam delete 2 i/5` +**Exam Stats** | `exam stats STUDENT_INDEX`
e.g. `exam stats 1` +**Add Attendance** | `attendance add STUDENT_INDEX d/LESSON_DATE a/ATTENDANCE_STATUS [f/FEEDBACK]`
e.g. `attendance add 2 d/08/12/2020 a/present f/attentive` +**Delete Attendance** | `attendance delete STUDENT_INDEX d/ATTENDANCE_DATE`
e.g. `attendance delete 1 d/19/04/2020` +**Schedule View** | `schedule m/VIEW_MODE d/DATE_TO_VIEW`
e.g. `schedule m/weekly d/02/11/2020` +**Toggle View** | `toggle` +**Add Note** | `note add t/TITLE d/DESCRIPTION`
e.g. `note add t/things to do d/buy coffee` +**Edit Note** | `note edit NOTE_INDEX [t/title] [d/DESCRIPTION]`
e.g. `note edit 1 d/mark practice papers` +**Delete Note** | `note delete NOTE_INDEX`
e.g. `note delete 1` **Help** | `help` +**Exit** | `exit` + +
+ +## 5. Glossary + +The following table (Table 3) provides the definitions of the various terms used in this User Guide. + +Table 3: Glossary of terms + +Term | Definition +--------|------------------ +Administrative Details | Details such as class venue, class time, tuition fee, last payment date and other details +Academic Details | Details such as questions, exam records and attendance records +Detail | Any miscellaneous information regarding a student +Exam Record | A record of an exam which includes its name, date and the student's score +Index | Position of an item in a list (1, 2 3 etc) + +
+ +## 6. FAQ +This section provides the answers to Frequently Asked Questions (FAQ) by users. + +1. How do I transfer my data to another Computer?
+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 **Reeve** home folder. + +2. Do I have to manually save my data?
+**Reeve** automatically saves data in the hard disk automatically after any command that changes the data. There is no need to save manually. + +3. How do I view the full details of my student?
+Type `toggle` and press `Enter`, your student's full details will be displayed. +To hide the full details of students, type `toggle` and press `Enter` again. + +4. Where can I find the file that contains my student's data?
+Your student's data file can be found in the same file as the application. + +5. How can I set the application window to a fix size whenever I open it?
+**Reeve** automatically save your preferred window size when you close it. +Hence, you could adjust the window size to your preferred one before closing **Reeve**. +**Reeve** will automatically open according to this size. + +6. I forgot what are the various commands and their format, where can I find the list of commands?
+Simply enter the `help` command, and you will be directed the list of commands. + +7. I accidentally deleted all my data, is there a way to recover my past data?
+Unfortunately, **Reeve** currently does not support a backup feature and is unable to recover any deleted data. The backup feature will be coming soon. +In the meantime, we advise you to refrain from accidentally clearing all data, you could perhaps create a backup `json` from time to time. + diff --git a/docs/_config.yml b/docs/_config.yml index 6bd245d8f4e..b80bfc4490f 100644 --- a/docs/_config.yml +++ b/docs/_config.yml @@ -1,4 +1,4 @@ -title: "AB-3" +title: "Reeve" theme: minima header_pages: @@ -8,7 +8,7 @@ header_pages: markdown: kramdown -repository: "se-edu/addressbook-level3" +repository: "AY2021S1-CS2103T-W15-2/tp" github_icon: "images/github-icon.png" plugins: diff --git a/docs/diagrams/AcademicClassDiagram.puml b/docs/diagrams/AcademicClassDiagram.puml new file mode 100644 index 00000000000..6ccdcf64651 --- /dev/null +++ b/docs/diagrams/AcademicClassDiagram.puml @@ -0,0 +1,24 @@ +@startuml +!include style.puml +skinparam arrowThickness 1.1 +skinparam arrowColor MODEL_COLOR +skinparam classBackgroundColor MODEL_COLOR + +Package Academic { +Class Academic +abstract Class Question +Class UnsolvedQuestion +Class SolvedQuestion +Class Exam +Class Attendance +} + + +Academic *--> "*" Question +Academic *--> "*" Exam +Academic *--> "*" Attendance +Question <|-- UnsolvedQuestion +Question <|-down- SolvedQuestion + +Question -[hidden]left- Attendance +@enduml diff --git a/docs/diagrams/AddAttendanceActivityDiagram.puml b/docs/diagrams/AddAttendanceActivityDiagram.puml new file mode 100644 index 00000000000..9e221edb885 --- /dev/null +++ b/docs/diagrams/AddAttendanceActivityDiagram.puml @@ -0,0 +1,29 @@ +@startuml +!include style.puml + +start +:User executes add Attendance command; +:Parses the command; +if() then([command is valid]) + if() then([student index is valid]) + :Add Attendance to Student <$rake>; + else([student index is invalid]) + :Display invalid student index error message; + endif +else ([command is invalid - missing or invalid parameters]) + :Display parse error message; +endif +stop + +partition "Activity: Add Attendance to Student" { + start + if() then([valid attendance date]) + :Create student copy with added attendance; + :Replace student with modified copy; + :Display success message; + else([duplicate attendance date]) + :Display duplicate attendance date error; + endif + stop +} +@enduml diff --git a/docs/diagrams/AddAttendanceSequenceDiagram.puml b/docs/diagrams/AddAttendanceSequenceDiagram.puml new file mode 100644 index 00000000000..7be7d80d181 --- /dev/null +++ b/docs/diagrams/AddAttendanceSequenceDiagram.puml @@ -0,0 +1,78 @@ +@startuml +!include style.puml + +box Logic LOGIC_COLOR_T1 +participant ":LogicManager" as LogicManager LOGIC_COLOR +participant ":ReeveParser" as ReeveParser LOGIC_COLOR +participant ":AttendanceCommandParser" as AttendanceCommandParser LOGIC_COLOR +participant "a:AddAttendanceCommand" as AddAttendanceCommand LOGIC_COLOR +end box + +box Model MODEL_COLOR_T1 +participant "updatedStudent:Student" as Student MODEL_COLOR +participant ":Model" as Model MODEL_COLOR +end box + +[-> LogicManager : execute(...) +activate LogicManager + +LogicManager -> ReeveParser : parseCommand(...) +activate ReeveParser + +create AttendanceCommandParser +ReeveParser -> AttendanceCommandParser : AttendanceCommandParser() +activate AttendanceCommandParser + +AttendanceCommandParser --> ReeveParser +deactivate AttendanceCommandParser + +ReeveParser -> AttendanceCommandParser : parse(...) +activate AttendanceCommandParser + +create AddAttendanceCommand +AttendanceCommandParser -> AddAttendanceCommand : AddAttendanceCommand(...) +activate AddAttendanceCommand + +AddAttendanceCommand --> AttendanceCommandParser : a +deactivate AddAttendanceCommand + +AttendanceCommandParser --> ReeveParser : a +deactivate AttendanceCommandParser + +AttendanceCommandParser -[hidden]> ReeveParser +destroy AttendanceCommandParser + +ReeveParser --> LogicManager : a +deactivate ReeveParser + +LogicManager -> AddAttendanceCommand : execute(...) +activate AddAttendanceCommand + +AddAttendanceCommand -> AddAttendanceCommand : updateStudentAttendance(...) +activate AddAttendanceCommand + +create Student +AddAttendanceCommand -> Student : Student(...) +activate Student + +Student --> AddAttendanceCommand : updatedStudent +deactivate Student + +AddAttendanceCommand --> AddAttendanceCommand : updatedStudent +deactivate AddAttendanceCommand + +AddAttendanceCommand -> Model : setStudent(student, updatedStudent) +activate Model + +Model --> AddAttendanceCommand +deactivate Model + +AddAttendanceCommand --> LogicManager : result +deactivate AddAttendanceCommand + +AddAttendanceCommand -[hidden]> LogicManager +destroy AddAttendanceCommand + +[<-- LogicManager : result +deactivate LogicManager +@enduml diff --git a/docs/diagrams/AddDetailActivityDiagram.puml b/docs/diagrams/AddDetailActivityDiagram.puml new file mode 100644 index 00000000000..64d17862ae0 --- /dev/null +++ b/docs/diagrams/AddDetailActivityDiagram.puml @@ -0,0 +1,17 @@ +@startuml +start +:User executes add detail command; +:Parses the command; +if() then([command is valid]) + if() then([student index is valid]) + :Create student copy with added detail; + :Replace student with modified copy; + :Display success message; + else([student index is invalid]) + :Display invalid student index error message; + endif +else ([command is invalid - missing or invalid parameters]) + :Display parse error message; +endif +stop +@enduml diff --git a/docs/diagrams/AddDetailSequenceDiagram.puml b/docs/diagrams/AddDetailSequenceDiagram.puml new file mode 100644 index 00000000000..a786aeda1ba --- /dev/null +++ b/docs/diagrams/AddDetailSequenceDiagram.puml @@ -0,0 +1,78 @@ +@startuml +!include style.puml + +box Logic LOGIC_COLOR_T1 +participant ":LogicManager" as LogicManager LOGIC_COLOR +participant ":ReeveParser" as ReeveParser LOGIC_COLOR +participant ":DetailCommandParser" as DetailCommandParser LOGIC_COLOR +participant "a:AddDetailCommand" as AddDetailCommand LOGIC_COLOR +end box + +box Model MODEL_COLOR_T1 +participant "updatedStudent:Student" as Student MODEL_COLOR +participant ":Model" as Model MODEL_COLOR +end box + +[-> LogicManager : execute(...) +activate LogicManager + +LogicManager -> ReeveParser : parseCommand(...) +activate ReeveParser + +create DetailCommandParser +ReeveParser -> DetailCommandParser : DetailCommandParser() +activate DetailCommandParser + +DetailCommandParser --> ReeveParser +deactivate DetailCommandParser + +ReeveParser -> DetailCommandParser : parse(...) +activate DetailCommandParser + +create AddDetailCommand +DetailCommandParser -> AddDetailCommand : AddDetailCommand(...) +activate AddDetailCommand + +AddDetailCommand --> DetailCommandParser : a +deactivate AddDetailCommand + +DetailCommandParser --> ReeveParser : a +deactivate DetailCommandParser + +DetailCommandParser -[hidden]> ReeveParser +destroy DetailCommandParser + +ReeveParser --> LogicManager : a +deactivate ReeveParser + +LogicManager -> AddDetailCommand : execute(...) +activate AddDetailCommand + +AddDetailCommand -> AddDetailCommand : updateStudentDetail(...) +activate AddDetailCommand + +create Student +AddDetailCommand -> Student : Student(...) +activate Student + +Student --> AddDetailCommand : updatedStudent +deactivate Student + +AddDetailCommand --> AddDetailCommand : updatedStudent +deactivate AddDetailCommand + +AddDetailCommand -> Model : setStudent(student, updatedStudent) +activate Model + +Model --> AddDetailCommand +deactivate Model + +AddDetailCommand --> LogicManager : result +deactivate AddDetailCommand + +AddDetailCommand -[hidden]> LogicManager +destroy AddDetailCommand + +[<-- LogicManager : result +deactivate LogicManager +@enduml diff --git a/docs/diagrams/AddQuestionActivityDiagram.puml b/docs/diagrams/AddQuestionActivityDiagram.puml new file mode 100644 index 00000000000..758d694668c --- /dev/null +++ b/docs/diagrams/AddQuestionActivityDiagram.puml @@ -0,0 +1,33 @@ +@startuml +!include style.puml + +start +:User executes add question command; +:Parses the command; +if () then ([command is valid]) + :Execute AddQuestionCommand; + if () then ([student exists]) + :Add question to student <$rake>; + else ([else]) + :Display invalid student error message; + endif +else ([else]) + :Display parse error message; +endif +stop + + +partition "Activity: Add question to student" { + start + if () then ([else]) + :Create student copy; + :Add question to student copy; + :Replace student with modified copy; + :Display success message; + else ([has duplicate question]) + :Display duplicate question error message; + endif + stop +} + +@enduml diff --git a/docs/diagrams/AddQuestionSequenceDiagram.puml b/docs/diagrams/AddQuestionSequenceDiagram.puml new file mode 100644 index 00000000000..295f58fef85 --- /dev/null +++ b/docs/diagrams/AddQuestionSequenceDiagram.puml @@ -0,0 +1,74 @@ +@startuml +!include style.puml + +box Logic LOGIC_COLOR_T1 +participant ":LogicManager" as LogicManager LOGIC_COLOR +participant ":ReeveParser" as ReeveParser LOGIC_COLOR +participant ":QuestionCommandParser" as QuestionCommandParser LOGIC_COLOR +participant "a:AddQuestionCommand" as AddQuestionCommand LOGIC_COLOR +end box + +box Model MODEL_COLOR_T1 +participant ":Model" as Model MODEL_COLOR +participant "student:Student" as Student MODEL_COLOR +end box + +[-> LogicManager : execute(...) +activate LogicManager + +LogicManager -> ReeveParser : parseCommand(...) +activate ReeveParser + +create QuestionCommandParser +ReeveParser -> QuestionCommandParser +activate QuestionCommandParser + +QuestionCommandParser --> ReeveParser +deactivate QuestionCommandParser + +ReeveParser -> QuestionCommandParser : parse(...) +activate QuestionCommandParser + +create AddQuestionCommand +QuestionCommandParser -> AddQuestionCommand +activate AddQuestionCommand + +AddQuestionCommand --> QuestionCommandParser : a +deactivate AddQuestionCommand + +QuestionCommandParser --> ReeveParser : a +deactivate QuestionCommandParser + +QuestionCommandParser -[hidden]-> ReeveParser +destroy QuestionCommandParser + +ReeveParser --> LogicManager : a +deactivate ReeveParser + +LogicManager -> AddQuestionCommand : execute() +activate AddQuestionCommand + +AddQuestionCommand -> Student : addQuestion(q) +activate Student + +Student --> AddQuestionCommand : copy +deactivate Student + +AddQuestionCommand -> Model : setStudent(student, copy) +activate Model + +Model --> AddQuestionCommand +deactivate Model + +Student -[hidden]-> Model +destroy Student + +AddQuestionCommand --> LogicManager : result +deactivate AddQuestionCommand + +AddQuestionCommand -[hidden]-> LogicManager +destroy AddQuestionCommand + +[<-- LogicManager +deactivate LogicManager +@enduml diff --git a/docs/diagrams/AddStudentActivityDiagram.puml b/docs/diagrams/AddStudentActivityDiagram.puml new file mode 100644 index 00000000000..a521dabea0c --- /dev/null +++ b/docs/diagrams/AddStudentActivityDiagram.puml @@ -0,0 +1,21 @@ +@startuml +start +:User executes add student command; +:Parses the command; +if () then ([command is valid]) + :Add command is executed; + if() then ([student already exists]) + :Display duplicate student error message; + else ([student is unique]) + if() then ([Student's class time clashes]) + :Display class time clash error message; + else ([Student's class time does not clash]) + :Add student into student list; + :Display add student success message; + endif + endif +else ([command is invalid - missing or invalid arguments]) + :Display parse error message; +endif +stop +@enduml diff --git a/docs/diagrams/AddStudentSequenceDiagram.puml b/docs/diagrams/AddStudentSequenceDiagram.puml new file mode 100644 index 00000000000..e0315e3534a --- /dev/null +++ b/docs/diagrams/AddStudentSequenceDiagram.puml @@ -0,0 +1,70 @@ +@startuml +!include style.puml + +box Logic LOGIC_COLOR_T1 +participant ":LogicManager" as LogicManager LOGIC_COLOR +participant ":ReeveParser" as ReeveParser LOGIC_COLOR +participant ":AddCommandParser" as AddCommandParser LOGIC_COLOR +participant "a:AddCommand" as AddCommand LOGIC_COLOR +end box + +box Model MODEL_COLOR_T1 +participant ":Model" as Model MODEL_COLOR +end box + +[-> LogicManager : execute(input) +activate LogicManager + +LogicManager -> ReeveParser : parseCommand(input) +activate ReeveParser + +create AddCommandParser +ReeveParser -> AddCommandParser +activate AddCommandParser +AddCommandParser --> ReeveParser +deactivate AddCommandParser + +ReeveParser -> AddCommandParser : parse(input) +activate AddCommandParser +create AddCommand +AddCommandParser -> AddCommand +activate AddCommand + +AddCommand --> AddCommandParser : a +deactivate AddCommand + +AddCommandParser --> ReeveParser : a +deactivate AddCommandParser +AddCommandParser -[hidden]-> ReeveParser +destroy AddCommandParser + +ReeveParser --> LogicManager : a +deactivate ReeveParser + +LogicManager -> AddCommand : execute(model) +activate AddCommand + +AddCommand -> Model : hasStudent(toAdd) +activate Model + +Model --> AddCommand +deactivate Model + +AddCommand -> Model : isClashingClassTime(toAdd) +activate Model + +Model --> AddCommand +deactivate Model + +AddCommand -> Model : addStudent(toAdd) + +AddCommand --> LogicManager : result +deactivate AddCommand + +AddCommand -[hidden]-> LogicManager +destroy AddCommand + +[<-- LogicManager +deactivate LogicManager + +@enduml diff --git a/docs/diagrams/AdminClassDiagram.puml b/docs/diagrams/AdminClassDiagram.puml new file mode 100644 index 00000000000..d8d0bcc8c55 --- /dev/null +++ b/docs/diagrams/AdminClassDiagram.puml @@ -0,0 +1,22 @@ +@startuml +!include style.puml +skinparam arrowThickness 1.1 +skinparam arrowColor MODEL_COLOR +skinparam classBackgroundColor MODEL_COLOR + +Package Admin { +Class Admin +Class ClassVenue +Class ClassTime +Class Fee +Class PaymentDate +Class Details +} + +Admin *--> ClassVenue +Admin *--> ClassTime +Admin *--> Fee +Admin *--> PaymentDate +Admin *--> "*" Details + +@enduml diff --git a/docs/diagrams/ArchitectureSequenceDiagram.puml b/docs/diagrams/ArchitectureSequenceDiagram.puml index ef81d18c337..3918305f6c7 100644 --- a/docs/diagrams/ArchitectureSequenceDiagram.puml +++ b/docs/diagrams/ArchitectureSequenceDiagram.puml @@ -19,7 +19,7 @@ activate model MODEL_COLOR model -[MODEL_COLOR]-> logic deactivate model -logic -[LOGIC_COLOR]> storage : saveAddressBook(addressBook) +logic -[LOGIC_COLOR]> storage : saveAddressBook(reeve) activate storage STORAGE_COLOR storage -[STORAGE_COLOR]> storage : Save to file diff --git a/docs/diagrams/DeleteAttendanceActivityDiagram.puml b/docs/diagrams/DeleteAttendanceActivityDiagram.puml new file mode 100644 index 00000000000..72a8b93a215 --- /dev/null +++ b/docs/diagrams/DeleteAttendanceActivityDiagram.puml @@ -0,0 +1,29 @@ +@startuml +!include style.puml + +start +:User executes delete Attendance command; +:Parses the command; +if() then([command is valid]) + if() then([student index is valid]) + :Delete Attendance from Student <$rake>; + else([student index is invalid]) + :Display invalid student index error message; + endif +else ([command is invalid - missing or invalid parameters]) + :Display parse error message; +endif +stop + +partition "Activity: Delete Attendance from Student" { + start + if() then([valid attendance date]) + :Create student copy with deleted attendance; + :Replace student with modified copy; + :Display success message; + else([invalid attendance date]) + :Display invalid attendance date error; + endif + stop +} +@enduml diff --git a/docs/diagrams/DeleteAttendanceSequenceDiagram.puml b/docs/diagrams/DeleteAttendanceSequenceDiagram.puml new file mode 100644 index 00000000000..3d24d315a30 --- /dev/null +++ b/docs/diagrams/DeleteAttendanceSequenceDiagram.puml @@ -0,0 +1,78 @@ +@startuml +!include style.puml + +box Logic LOGIC_COLOR_T1 +participant ":LogicManager" as LogicManager LOGIC_COLOR +participant ":ReeveParser" as ReeveParser LOGIC_COLOR +participant ":AttendanceCommandParser" as AttendanceCommandParser LOGIC_COLOR +participant "d:DeleteAttendanceCommand" as DeleteAttendanceCommand LOGIC_COLOR +end box + +box Model MODEL_COLOR_T1 +participant "updatedStudent:Student" as Student MODEL_COLOR +participant ":Model" as Model MODEL_COLOR +end box + +[-> LogicManager : execute(...) +activate LogicManager + +LogicManager -> ReeveParser : parseCommand(...) +activate ReeveParser + +create AttendanceCommandParser +ReeveParser -> AttendanceCommandParser : AttendanceCommandParser() +activate AttendanceCommandParser + +AttendanceCommandParser --> ReeveParser +deactivate AttendanceCommandParser + +ReeveParser -> AttendanceCommandParser : parse(...) +activate AttendanceCommandParser + +create DeleteAttendanceCommand +AttendanceCommandParser -> DeleteAttendanceCommand : DeleteAttendanceCommand(...) +activate DeleteAttendanceCommand + +DeleteAttendanceCommand --> AttendanceCommandParser : d +deactivate DeleteAttendanceCommand + +AttendanceCommandParser --> ReeveParser : d +deactivate AttendanceCommandParser + +AttendanceCommandParser -[hidden]> ReeveParser +destroy AttendanceCommandParser + +ReeveParser --> LogicManager : d +deactivate ReeveParser + +LogicManager -> DeleteAttendanceCommand : execute(...) +activate DeleteAttendanceCommand + +DeleteAttendanceCommand -> DeleteAttendanceCommand : updateStudentAttendance(...) +activate DeleteAttendanceCommand + +create Student +DeleteAttendanceCommand -> Student : Student(...) +activate Student + +Student --> DeleteAttendanceCommand : updatedStudent +deactivate Student + +DeleteAttendanceCommand --> DeleteAttendanceCommand : updatedStudent +deactivate DeleteAttendanceCommand + +DeleteAttendanceCommand -> Model : setStudent(student, updatedStudent) +activate Model + +Model --> DeleteAttendanceCommand +deactivate Model + +DeleteAttendanceCommand --> LogicManager : result +deactivate DeleteAttendanceCommand + +DeleteAttendanceCommand -[hidden]> LogicManager +destroy DeleteAttendanceCommand + +[<-- LogicManager : result +deactivate LogicManager +@enduml diff --git a/docs/diagrams/DeleteDetailActivityDiagram.puml b/docs/diagrams/DeleteDetailActivityDiagram.puml new file mode 100644 index 00000000000..49e4ceb38a9 --- /dev/null +++ b/docs/diagrams/DeleteDetailActivityDiagram.puml @@ -0,0 +1,30 @@ +@startuml +!include style.puml + +start +:User executes delete detail command; +:Parses the command; +if() then([command is valid]) + if() then([student index is valid]) + :Delete Detail from Student <$rake>; + else([student index is invalid]) + :Display invalid student index error message; + endif +else ([command is invalid - missing or invalid parameters]) + :Display parse error message; +endif +stop + +partition "Activity: Delete Detail from Student" { + start + if() then([detail index is valid]) + :Create student copy with removed detail; + :Replace student with modified copy; + :Display success message; + else([detail index is invalid]) + :Display invalid detail index error message; + endif + stop + +} +@enduml diff --git a/docs/diagrams/DeleteDetailSequenceDiagram.puml b/docs/diagrams/DeleteDetailSequenceDiagram.puml new file mode 100644 index 00000000000..d46eebc60cb --- /dev/null +++ b/docs/diagrams/DeleteDetailSequenceDiagram.puml @@ -0,0 +1,78 @@ +@startuml +!include style.puml + +box Logic LOGIC_COLOR_T1 +participant ":LogicManager" as LogicManager LOGIC_COLOR +participant ":ReeveParser" as ReeveParser LOGIC_COLOR +participant ":DetailCommandParser" as DetailCommandParser LOGIC_COLOR +participant "d:DeleteDetailCommand" as DeleteDetailCommand LOGIC_COLOR +end box + +box Model MODEL_COLOR_T1 +participant "updatedStudent:Student" as Student MODEL_COLOR +participant ":Model" as Model MODEL_COLOR +end box + +[-> LogicManager : execute(...) +activate LogicManager + +LogicManager -> ReeveParser : parseCommand(...) +activate ReeveParser + +create DetailCommandParser +ReeveParser -> DetailCommandParser : DetailCommandParser() +activate DetailCommandParser + +DetailCommandParser --> ReeveParser +deactivate DetailCommandParser + +ReeveParser -> DetailCommandParser : parse(...) +activate DetailCommandParser + +create DeleteDetailCommand +DetailCommandParser -> DeleteDetailCommand : DeleteDetailCommand(...) +activate DeleteDetailCommand + +DeleteDetailCommand --> DetailCommandParser : d +deactivate DeleteDetailCommand + +DetailCommandParser --> ReeveParser : d +deactivate DetailCommandParser + +DetailCommandParser -[hidden]> ReeveParser +destroy DetailCommandParser + +ReeveParser --> LogicManager : d +deactivate ReeveParser + +LogicManager -> DeleteDetailCommand : execute(...) +activate DeleteDetailCommand + +DeleteDetailCommand -> DeleteDetailCommand : updateStudentDetail(...) +activate DeleteDetailCommand + +create Student +DeleteDetailCommand -> Student : Student(...) +activate Student + +Student --> DeleteDetailCommand : updatedStudent +deactivate Student + +DeleteDetailCommand --> DeleteDetailCommand : updatedStudent +deactivate DeleteDetailCommand + +DeleteDetailCommand -> Model : setStudent(student, updatedStudent) +activate Model + +Model --> DeleteDetailCommand +deactivate Model + +DeleteDetailCommand --> LogicManager : result +deactivate DeleteDetailCommand + +DeleteDetailCommand -[hidden]> LogicManager +destroy DeleteDetailCommand + +[<-- LogicManager : result +deactivate LogicManager +@enduml diff --git a/docs/diagrams/DeleteQuestionActivityDiagram.puml b/docs/diagrams/DeleteQuestionActivityDiagram.puml new file mode 100644 index 00000000000..93671b18c88 --- /dev/null +++ b/docs/diagrams/DeleteQuestionActivityDiagram.puml @@ -0,0 +1,33 @@ +@startuml +!include style.puml + +start +:User executes delete question command; +:Parses the command; +if () then ([command is valid]) + :Execute DeleteQuestionCommand; + if () then ([student exists]) + :Delete question from student <$rake>; + + else ([else]) + :Display invalid student error message; + endif +else ([command is invalid]) + :Display parse error message; +endif +stop + +partition "Activitiy: Delete question from student" { +start +if () then ([question exists]) + :Create student copy; + :Delete question from student copy; + :Replace student with modified copy; + :Display success message; +else ([else]) + :Display invalid question error message; +endif +stop +} + +@enduml diff --git a/docs/diagrams/DeleteQuestionSequenceDiagram.puml b/docs/diagrams/DeleteQuestionSequenceDiagram.puml new file mode 100644 index 00000000000..7cde0f6c883 --- /dev/null +++ b/docs/diagrams/DeleteQuestionSequenceDiagram.puml @@ -0,0 +1,74 @@ +@startuml +!include style.puml + +box Logic LOGIC_COLOR_T1 +participant ":LogicManager" as LogicManager LOGIC_COLOR +participant ":ReeveParser" as ReeveParser LOGIC_COLOR +participant ":QuestionCommandParser" as QuestionCommandParser LOGIC_COLOR +participant "d:DeleteQuestionCommand" as DeleteQuestionCommand LOGIC_COLOR +end box + +box Model MODEL_COLOR_T1 +participant ":Model" as Model MODEL_COLOR +participant "student:Student" as Student MODEL_COLOR +end box + +[-> LogicManager : execute(...) +activate LogicManager + +LogicManager -> ReeveParser : parseCommand(...) +activate ReeveParser + +create QuestionCommandParser +ReeveParser -> QuestionCommandParser +activate QuestionCommandParser + +QuestionCommandParser --> ReeveParser +deactivate QuestionCommandParser + +ReeveParser -> QuestionCommandParser : parse(...) +activate QuestionCommandParser + +create DeleteQuestionCommand +QuestionCommandParser -> DeleteQuestionCommand +activate DeleteQuestionCommand + +DeleteQuestionCommand --> QuestionCommandParser : s +deactivate DeleteQuestionCommand + +QuestionCommandParser --> ReeveParser : s +deactivate QuestionCommandParser + +QuestionCommandParser -[hidden]-> ReeveParser +destroy QuestionCommandParser + +ReeveParser --> LogicManager : s +deactivate ReeveParser + +LogicManager -> DeleteQuestionCommand : execute() +activate DeleteQuestionCommand + +DeleteQuestionCommand -> Student : deleteQuestion(...) +activate Student + +Student --> DeleteQuestionCommand : copy +deactivate Student + +DeleteQuestionCommand -> Model : setStudent(student, copy) +activate Model + +Model --> DeleteQuestionCommand +deactivate Model + +Student -[hidden]-> Model +destroy Student + +DeleteQuestionCommand --> LogicManager : result +deactivate DeleteQuestionCommand + +DeleteQuestionCommand -[hidden]-> LogicManager +destroy DeleteQuestionCommand + +[<-- LogicManager +deactivate LogicManager +@enduml diff --git a/docs/diagrams/DeleteSequenceDiagram.puml b/docs/diagrams/DeleteSequenceDiagram.puml index 1dc2311b245..7aae9b9c00e 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 ":ReeveParser" as ReeveParser 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 -> ReeveParser : parseCommand("delete 1") +activate ReeveParser create DeleteCommandParser -AddressBookParser -> DeleteCommandParser +ReeveParser -> DeleteCommandParser activate DeleteCommandParser -DeleteCommandParser --> AddressBookParser +DeleteCommandParser --> ReeveParser deactivate DeleteCommandParser -AddressBookParser -> DeleteCommandParser : parse("1") +ReeveParser -> DeleteCommandParser : parse("1") activate DeleteCommandParser create DeleteCommand @@ -36,19 +36,19 @@ activate DeleteCommand DeleteCommand --> DeleteCommandParser : d deactivate DeleteCommand -DeleteCommandParser --> AddressBookParser : d +DeleteCommandParser --> ReeveParser : d deactivate DeleteCommandParser 'Hidden arrow to position the destroy marker below the end of the activation bar. -DeleteCommandParser -[hidden]-> AddressBookParser +DeleteCommandParser -[hidden]-> ReeveParser destroy DeleteCommandParser -AddressBookParser --> LogicManager : d -deactivate AddressBookParser +ReeveParser --> LogicManager : d +deactivate ReeveParser LogicManager -> DeleteCommand : execute() activate DeleteCommand -DeleteCommand -> Model : deletePerson(1) +DeleteCommand -> Model : deleteStudent(1) activate Model Model --> DeleteCommand diff --git a/docs/diagrams/EditDetailActivityDiagram.puml b/docs/diagrams/EditDetailActivityDiagram.puml new file mode 100644 index 00000000000..b23104a81ed --- /dev/null +++ b/docs/diagrams/EditDetailActivityDiagram.puml @@ -0,0 +1,29 @@ +@startuml +!include style.puml + +start +:User executes edit detail command; +:Parses the command; +if() then([command is valid]) + if() then([student index is valid]) + :Edit Detail in Student <$rake>; + else([student index is invalid]) + :Display invalid student index error message; + endif +else ([command is invalid - missing or invalid parameters]) + :Display parse error message; +endif +stop + +partition "Activity: Edit Detail in Student" { + start + if() then([detail index is valid]) + :Create student copy with updated detail; + :Replace student with modified copy; + :Display success message; + else([detail index is invalid]) + :Display invalid detail index error message; + endif + stop +} +@enduml diff --git a/docs/diagrams/EditDetailSequenceDiagram.puml b/docs/diagrams/EditDetailSequenceDiagram.puml new file mode 100644 index 00000000000..6caa7dc1de0 --- /dev/null +++ b/docs/diagrams/EditDetailSequenceDiagram.puml @@ -0,0 +1,78 @@ +@startuml +!include style.puml + +box Logic LOGIC_COLOR_T1 +participant ":LogicManager" as LogicManager LOGIC_COLOR +participant ":ReeveParser" as ReeveParser LOGIC_COLOR +participant ":DetailCommandParser" as DetailCommandParser LOGIC_COLOR +participant "e:EditDetailCommand" as EditDetailCommand LOGIC_COLOR +end box + +box Model MODEL_COLOR_T1 +participant "updatedStudent:Student" as Student MODEL_COLOR +participant ":Model" as Model MODEL_COLOR +end box + +[-> LogicManager : execute(...) +activate LogicManager + +LogicManager -> ReeveParser : parseCommand(...) +activate ReeveParser + +create DetailCommandParser +ReeveParser -> DetailCommandParser : DetailCommandParser() +activate DetailCommandParser + +DetailCommandParser --> ReeveParser +deactivate DetailCommandParser + +ReeveParser -> DetailCommandParser : parse(...) +activate DetailCommandParser + +create EditDetailCommand +DetailCommandParser -> EditDetailCommand : EditDetailCommand(...) +activate EditDetailCommand + +EditDetailCommand --> DetailCommandParser : e +deactivate EditDetailCommand + +DetailCommandParser --> ReeveParser : e +deactivate DetailCommandParser + +DetailCommandParser -[hidden]> ReeveParser +destroy DetailCommandParser + +ReeveParser --> LogicManager : e +deactivate ReeveParser + +LogicManager -> EditDetailCommand : execute(...) +activate EditDetailCommand + +EditDetailCommand -> EditDetailCommand : updateStudentDetail(...) +activate EditDetailCommand + +create Student +EditDetailCommand -> Student : Student(...) +activate Student + +Student --> EditDetailCommand : updatedStudent +deactivate Student + +EditDetailCommand --> EditDetailCommand : updatedStudent +deactivate EditDetailCommand + +EditDetailCommand -> Model : setStudent(student, updatedStudent) +activate Model + +Model --> EditDetailCommand +deactivate Model + +EditDetailCommand --> LogicManager : result +deactivate EditDetailCommand + +EditDetailCommand -[hidden]> LogicManager +destroy EditDetailCommand + +[<-- LogicManager : result +deactivate LogicManager +@enduml diff --git a/docs/diagrams/EditStudentActivityDiagram.puml b/docs/diagrams/EditStudentActivityDiagram.puml new file mode 100644 index 00000000000..48b149b9c6e --- /dev/null +++ b/docs/diagrams/EditStudentActivityDiagram.puml @@ -0,0 +1,36 @@ +@startuml +!include style.puml + +start +:User executes edit student command; +:Parses the command; +if() then ([command is valid]) + if() then ([there are edited student fields]) + :Edit command is executed <$rake>; + else ([else]) + :Display no edits made message; + endif +else ([command is invalid - missing or invalid parameters]) + :Display parse error message; +endif +stop + +partition "Activity: Edit command is executed" { + start + if() then ([student index is invalid]) + :Display invalid student index error message; + else ([student index is valid]) + if() then ([edited student is unique]) + if() then ([class time is new and clashes]) + :Display invalid class time error; + else ([else]) + :Replace student with edited student in student list; + :Display success message; + endif + else ([edited student already exists]) + :Display duplicate student error message; + endif + endif + stop +} +@enduml diff --git a/docs/diagrams/EditStudentSequenceDiagram.puml b/docs/diagrams/EditStudentSequenceDiagram.puml new file mode 100644 index 00000000000..8ab5b6bdc5a --- /dev/null +++ b/docs/diagrams/EditStudentSequenceDiagram.puml @@ -0,0 +1,78 @@ +@startuml +!include style.puml + +box Logic LOGIC_COLOR_T1 +participant ":LogicManager" as LogicManager LOGIC_COLOR +participant ":ReeveParser" as ReeveParser LOGIC_COLOR +participant ":EditCommandParser" as EditCommandParser LOGIC_COLOR +participant "command:EditCommand" as Command LOGIC_COLOR +end box + +box Model MODEL_COLOR_T1 +participant ":Model" as Model MODEL_COLOR +participant "editedStudent:Student" as Student MODEL_COLOR +end box + +[-> LogicManager : execute(...) +activate LogicManager + +LogicManager -> ReeveParser : parseCommand(...) +activate ReeveParser + +create EditCommandParser +ReeveParser -> EditCommandParser : EditCommandParser() +activate EditCommandParser + +EditCommandParser --> ReeveParser +deactivate EditCommandParser + +ReeveParser -> EditCommandParser : parse(...) +activate EditCommandParser + +create Command +EditCommandParser -> Command : EditCommand(...) +activate Command + +Command --> EditCommandParser : command +deactivate Command + +EditCommandParser --> ReeveParser : command +deactivate EditCommandParser + +EditCommandParser -[hidden]> ReeveParser +destroy EditCommandParser + +ReeveParser --> LogicManager : command +deactivate ReeveParser + +LogicManager -> Command : execute(...) +activate Command + +Command -> Command : createEditedStudent(...) +activate Command + +create Student +Command -> Student : Student(...) +activate Student + +Student --> Command : editedStudent +deactivate Student + +Command --> Command : editedStudent +deactivate Command + +Command -> Model : setStudent(studentToEdit, editedStudent) +activate Model + +Model --> Command +deactivate Model + +Command --> LogicManager : result +deactivate Command + +Command -[hidden]-> LogicManager +destroy Command + +[<-- LogicManager : result +deactivate LogicManager +@enduml diff --git a/docs/diagrams/ExamCommandClassDiagram.puml b/docs/diagrams/ExamCommandClassDiagram.puml new file mode 100644 index 00000000000..ae20ef87686 --- /dev/null +++ b/docs/diagrams/ExamCommandClassDiagram.puml @@ -0,0 +1,27 @@ +@startuml +!include style.puml +skinparam arrowThickness 1.1 +skinparam arrowColor UI_COLOR_T4 +skinparam classBackgroundColor UI_COLOR + +abstract class "{abstract}\nCommand" { +} + +abstract class "{abstract}\nExamCommand" { +} + +class AddExamCommand { +} + +class DeleteExamCommand { +} + +class ExamStatsCommand { +} + +AddExamCommand --up|> "{abstract}\nExamCommand" +DeleteExamCommand --up|> "{abstract}\nExamCommand" +ExamStatsCommand --up|> "{abstract}\nExamCommand" +"{abstract}\nExamCommand" --up|> "{abstract}\nCommand" + +@enduml diff --git a/docs/diagrams/ExamStatsActivityDiagram.puml b/docs/diagrams/ExamStatsActivityDiagram.puml new file mode 100644 index 00000000000..3c754bfef58 --- /dev/null +++ b/docs/diagrams/ExamStatsActivityDiagram.puml @@ -0,0 +1,18 @@ +@startuml +start +:User executes exam stats command; +:Parses the command; +if () then ([command is valid]) + :Exam stats command is executed; + if() then ([student index exceeds student list]) + :Display index out of bounds error message; + else ([student index within student list]) + :Get student from student list; + :Get exams from student; + :Display exam statistics window of student; + endif +else ([command is invalid - missing or invalid arguments]) + :Display parse error message; +endif +stop +@enduml diff --git a/docs/diagrams/ExamStatsSequenceDiagram.puml b/docs/diagrams/ExamStatsSequenceDiagram.puml new file mode 100644 index 00000000000..21eba327e03 --- /dev/null +++ b/docs/diagrams/ExamStatsSequenceDiagram.puml @@ -0,0 +1,71 @@ +@startuml +!include style.puml +box Logic LOGIC_COLOR_T1 +participant ":LogicManager" as LogicManager LOGIC_COLOR +participant ":ReeveParser" as ReeveParser LOGIC_COLOR +participant ":ExamCommandParser" as ExamCommandParser LOGIC_COLOR +participant "a:ExamStatsCommand" as ExamStatsCommand LOGIC_COLOR +end box + +box Model MODEL_COLOR_T1 +participant ":Model" as Model MODEL_COLOR +participant "sortedStudents:SortedList" as SortedList MODEL_COLOR +end box + +[-> LogicManager : execute("exam stats 1") +activate LogicManager + +LogicManager -> ReeveParser : parseCommand("exam stats 1") +activate ReeveParser + +create ExamCommandParser +ReeveParser -> ExamCommandParser +activate ExamCommandParser + +ExamCommandParser --> ReeveParser +deactivate ExamCommandParser + +ReeveParser -> ExamCommandParser : parse("stats 1") +activate ExamCommandParser + + +create ExamStatsCommand +ExamCommandParser -> ExamStatsCommand +activate ExamStatsCommand + +ExamStatsCommand --> ExamCommandParser : a +deactivate ExamStatsCommand + +ExamCommandParser --> ReeveParser : a +deactivate ExamCommandParser + +ExamCommandParser -[hidden]-> ReeveParser +destroy ExamCommandParser + +ReeveParser --> LogicManager : a +deactivate ReeveParser + +LogicManager -> ExamStatsCommand : execute() +activate ExamStatsCommand + +ExamStatsCommand -> Model : getSortedStudentList() +activate Model + +Model -> SortedList : get(1) +activate SortedList + +SortedList -> Model +deactivate SortedList + +Model -> ExamStatsCommand +deactivate Model + +ExamStatsCommand --> LogicManager : result +deactivate ExamStatsCommand + +ExamStatsCommand -[hidden]-> LogicManager +destroy ExamStatsCommand + +[<-- LogicManager +deactivate LogicManager +@enduml diff --git a/docs/diagrams/FindCommandActivityDiagram.puml b/docs/diagrams/FindCommandActivityDiagram.puml new file mode 100644 index 00000000000..043d39e888b --- /dev/null +++ b/docs/diagrams/FindCommandActivityDiagram.puml @@ -0,0 +1,15 @@ +@startuml +start +:User executes find command; +:Parses the command; +if () then ([command is valid]) + :Obtain list of predicates; + :Combines predicates; + :Update Reeve model; + +else ([command has no or invalid parameters]) + :Show parse error message; + +endif +stop +@enduml diff --git a/docs/diagrams/FindCommandPartialSequenceDiagram.puml b/docs/diagrams/FindCommandPartialSequenceDiagram.puml new file mode 100644 index 00000000000..bfede03b47f --- /dev/null +++ b/docs/diagrams/FindCommandPartialSequenceDiagram.puml @@ -0,0 +1,34 @@ +@startuml +!include ./style.puml + +box "Logic" LOGIC_COLOR_T1 + +Participant "command:FindCommand" as fc LOGIC_COLOR +Participant ":FindStudentDescriptor" as fcd LOGIC_COLOR +Participant "result:CommandResult" as res LOGIC_COLOR + + +[-> fc : execute(model) +activate fc +fc -> fcd++: getPredicates() +fcd -> fcd: getNamePredicate() +fcd -> fcd: getSchoolPredicate() +fcd -> fcd: getYearPredicate() +return consolidatedPredicates + +end box + +box "Model" MODEL_COLOR_T1 +Participant "model:Model" as model MODEL_COLOR + +fc -> model: updateFilteredPersonList(consolidatedPredicates) + +fc -> model: getFilteredPersonList() +create res +fc -> res ++ +return result +return result + +end box + +@enduml diff --git a/docs/diagrams/FindCommandSequenceDiagram.puml b/docs/diagrams/FindCommandSequenceDiagram.puml new file mode 100644 index 00000000000..37d64bc118e --- /dev/null +++ b/docs/diagrams/FindCommandSequenceDiagram.puml @@ -0,0 +1,50 @@ +@startuml +!include ./style.puml + +box "Logic" LOGIC_COLOR_T1 + +Participant ":LogicManager" as logic LOGIC_COLOR +Participant ":ReeveParser" as rp LOGIC_COLOR +Participant ":FindCommandParser" as fcp LOGIC_COLOR +Participant "d:FindStudentDescriptor" as fcd LOGIC_COLOR +Participant "command:FindCommand" as fc LOGIC_COLOR + + +[-> logic : execute() +activate logic +logic -> rp ++: parseCommand(commandText) +create fcp +rp -> fcp ++: +return +rp -> fcp ++: parse(args) +create fcd +fcp -> fcd ++: +return d + +create fc +fcp -> fc ++: new FindCommand(d) +return command +return command +return command +destroy fcp + +logic -> fc ++: execute(model) +fc -> fcd++: getPredicates() +return predicates + +end box + +box "Model" MODEL_COLOR_T1 + +Participant ":Model" as model MODEL_COLOR + +fc -> model++: updateFilteredStudentList(predicates) +return +return result +return +destroy fc +destroy fcd + +end box + +@enduml diff --git a/docs/diagrams/JsonSerializableNotebookClassDiagram.puml b/docs/diagrams/JsonSerializableNotebookClassDiagram.puml new file mode 100644 index 00000000000..4af4ad44228 --- /dev/null +++ b/docs/diagrams/JsonSerializableNotebookClassDiagram.puml @@ -0,0 +1,9 @@ +@startuml +!include style.puml +skinparam arrowThickness 1.1 +skinparam arrowColor STORAGE_COLOR +skinparam classBackgroundColor STORAGE_COLOR + +JsonSerializableNotebook *-down-> "*" JsonAdaptedNote + +@enduml diff --git a/docs/diagrams/JsonSerializableReeveClassDiagram.puml b/docs/diagrams/JsonSerializableReeveClassDiagram.puml new file mode 100644 index 00000000000..9863667464b --- /dev/null +++ b/docs/diagrams/JsonSerializableReeveClassDiagram.puml @@ -0,0 +1,15 @@ +@startuml +!include style.puml +skinparam arrowThickness 1.1 +skinparam arrowColor STORAGE_COLOR +skinparam classBackgroundColor STORAGE_COLOR + +JsonSerializableReeve *-down-> "*" JsonAdaptedStudent +JsonAdaptedStudent -down-> "1" JsonAdaptedAcademic +JsonAdaptedStudent -right-> "1" JsonAdaptedAdmin +JsonAdaptedAdmin -down-> "*" JsonAdaptedDetail +JsonAdaptedAcademic -down-> "*" JsonAdaptedQuestion +JsonAdaptedAcademic -down-> "*" JsonAdaptedExam +JsonAdaptedAcademic -down-> "*" JsonAdaptedAttendance + +@enduml diff --git a/docs/diagrams/LogicClassDiagram.puml b/docs/diagrams/LogicClassDiagram.puml index 016ef33e2e2..d12d69d48e7 100644 --- a/docs/diagrams/LogicClassDiagram.puml +++ b/docs/diagrams/LogicClassDiagram.puml @@ -8,7 +8,7 @@ package Logic { package Parser { Interface Parser <> -Class AddressBookParser +Class ReeveParser Class XYZCommandParser Class CliSyntax Class ParserUtil @@ -35,8 +35,8 @@ Class HiddenOutside #FFFFFF HiddenOutside ..> Logic LogicManager .up.|> Logic -LogicManager -->"1" AddressBookParser -AddressBookParser .left.> XYZCommandParser: creates > +LogicManager -->"1" ReeveParser +ReeveParser .left.> XYZCommandParser: creates > XYZCommandParser ..> XYZCommand : creates > XYZCommandParser ..|> Parser diff --git a/docs/diagrams/ModelClassDiagram.puml b/docs/diagrams/ModelClassDiagram.puml index e85a00d4107..367eda694af 100644 --- a/docs/diagrams/ModelClassDiagram.puml +++ b/docs/diagrams/ModelClassDiagram.puml @@ -4,53 +4,77 @@ skinparam arrowThickness 1.1 skinparam arrowColor MODEL_COLOR skinparam classBackgroundColor MODEL_COLOR -Package Model <>{ -Interface ReadOnlyAddressBook <> +Package Model <> { + +Interface ReadOnlyReeve <> Interface Model <> Interface ObservableList <> -Class AddressBook -Class ReadOnlyAddressBook +Class Reeve +Class ReadOnlyReeve Class Model Class ModelManager Class UserPrefs Class ReadOnlyUserPrefs -Package Person { -Class Person -Class Address -Class Email -Class Name -Class Phone -Class UniquePersonList + +Package Notes <> { +Class Notebook +Class Note +Class NotesList +Class ReadOnlyNotebook +} + +Package Schedule <> { +Class Scheduler +Class SchedulePrefs } -Package Tag { -Class Tag +Package Student { +Class Student +Class School +Class Year +Class Name +Class Phone +Class UniqueStudentList +Class Academic +Class Admin } } Class HiddenOutside #FFFFFF HiddenOutside ..> Model -AddressBook .up.|> ReadOnlyAddressBook +Reeve .right.|> ReadOnlyReeve ModelManager .up.|> Model -Model .right.> ObservableList -ModelManager o--> "1" AddressBook -ModelManager o-left-> "1" UserPrefs -UserPrefs .up.|> ReadOnlyUserPrefs - -AddressBook *--> "1" UniquePersonList -UniquePersonList o--> "*" Person -Person *--> Name -Person *--> Phone -Person *--> Email -Person *--> Address -Person *--> "*" Tag +Model .left.> ObservableList +ModelManager o-down-> "1" Reeve +ModelManager o-up-> "1" UserPrefs +UserPrefs .left.|> ReadOnlyUserPrefs + +ModelManager o--> "1" Notebook +ModelManager ..> Note + +Notebook *--> "1" NotesList +Notebook .left.|> ReadOnlyNotebook +NotesList o--> "*" Note + +ModelManager o-up------> "1" Scheduler +ModelManager o-right-> "1" SchedulePrefs +Scheduler ..> Student + +Reeve *--> "1" UniqueStudentList +UniqueStudentList o--> "*" Student +Student *--> "1" Name +Student *--> "1" Phone +Student *--> "1" School +Student *--> "1" Year +Student *--> "1" Admin +Student *--> "1" Academic Name -[hidden]right-> Phone -Phone -[hidden]right-> Address -Address -[hidden]right-> Email +Phone -[hidden]right-> School +School -[hidden]right-> Year +ModelManager-[hidden]- UniqueStudentList -ModelManager -->"1" Person : filtered list @enduml diff --git a/docs/diagrams/NoteCommandClassDiagram.puml b/docs/diagrams/NoteCommandClassDiagram.puml new file mode 100644 index 00000000000..10fdde74994 --- /dev/null +++ b/docs/diagrams/NoteCommandClassDiagram.puml @@ -0,0 +1,27 @@ +@startuml +!include style.puml +skinparam arrowThickness 1.1 +skinparam arrowColor UI_COLOR_T4 +skinparam classBackgroundColor UI_COLOR + +abstract class "{abstract}\nCommand" { +} + +abstract class "{abstract}\nNoteCommand" { +} + +class AddNoteCommand { +} + +class EditNoteCommand { +} + +class DeleteNoteCommand { +} + +AddNoteCommand --up|> "{abstract}\nNoteCommand" +EditNoteCommand --up|> "{abstract}\nNoteCommand" +DeleteNoteCommand --up|> "{abstract}\nNoteCommand" +"{abstract}\nNoteCommand" --up|> "{abstract}\nCommand" + +@enduml diff --git a/docs/diagrams/OverdueActivityDiagram.puml b/docs/diagrams/OverdueActivityDiagram.puml new file mode 100644 index 00000000000..65136d45619 --- /dev/null +++ b/docs/diagrams/OverdueActivityDiagram.puml @@ -0,0 +1,8 @@ +@startuml +start +:User executes overdue command; +:Parse the command; +:Filter list of students by those who have not paid their fees in the past month; +:Display filtered list; +stop +@enduml diff --git a/docs/diagrams/OverdueSequenceDiagram.puml b/docs/diagrams/OverdueSequenceDiagram.puml new file mode 100644 index 00000000000..053b22852e1 --- /dev/null +++ b/docs/diagrams/OverdueSequenceDiagram.puml @@ -0,0 +1,47 @@ +@startuml +!include style.puml + +box Logic LOGIC_COLOR_T1 +participant ":LogicManager" as LogicManager LOGIC_COLOR +participant ":ReeveParser" as ReeveParser LOGIC_COLOR +participant "o:OverdueCommand" as Command LOGIC_COLOR +end box + +box Model MODEL_COLOR_T1 +participant ":Model" as Model MODEL_COLOR +end box + +[-> LogicManager : execute("overdue") +activate LogicManager + +LogicManager -> ReeveParser : parseCommand("overdue") +activate ReeveParser + +create Command +ReeveParser -> Command +activate Command + +Command --> ReeveParser : o +deactivate Command + +ReeveParser --> LogicManager : o +deactivate ReeveParser + +LogicManager -> Command : execute() +activate Command + +Command -> Model : updateFilteredStudentList() +activate Model + +Model --> Command +deactivate Model + +Command --> LogicManager : result +deactivate Command + +Command -[hidden]-> LogicManager +destroy Command + +[<-- LogicManager +deactivate LogicManager +@enduml diff --git a/docs/diagrams/ScheduleActivityDiagram.puml b/docs/diagrams/ScheduleActivityDiagram.puml new file mode 100644 index 00000000000..b0bc2d2a34e --- /dev/null +++ b/docs/diagrams/ScheduleActivityDiagram.puml @@ -0,0 +1,17 @@ +@startuml +start +:User executes ScheduleViewCommand; +:Parses the command; +if () then ([command is valid]) + :ScheduleViewCommand executed; + : set the schedule view date; + : set the schedule view mode; + : get student data; + : translate student's class time to events; + +else ([command is invalid - missing or invalid arguments]) + :Display parse error message; +endif +:Return result to user; +stop +@enduml diff --git a/docs/diagrams/ScheduleSequenceDiagram.puml b/docs/diagrams/ScheduleSequenceDiagram.puml new file mode 100644 index 00000000000..413a4fe8fa1 --- /dev/null +++ b/docs/diagrams/ScheduleSequenceDiagram.puml @@ -0,0 +1,54 @@ +@startuml +!include style.puml + +box Logic LOGIC_COLOR_T1 +participant ":LogicManager" as LogicManager LOGIC_COLOR +participant ":ScheduleViewCommand" as ScheduleCommand LOGIC_COLOR +participant ":CommandResult" as CommandResult LOGIC_COLOR +end box + +box Model MODEL_COLOR_T1 +participant ":Model" as Model MODEL_COLOR +participant ":SchedulePrefs" as SchedulePrefs MODEL_COLOR +participant ":Scheduler" as Scheduler MODEL_COLOR +end box + +LogicManager -> ScheduleCommand : execute(Model) +activate ScheduleCommand + +ScheduleCommand -> Model : setViewDate(LocalDate) + +Model -> SchedulePrefs : setViewDate(LocalDate) + +ScheduleCommand -> Model : setViewMode(ScheduleViewMode) +Model -> SchedulePrefs : setViewMode(ScheduleViewMode) + +ScheduleCommand -> Model : updateFilteredStudentList(Predicate) + +ScheduleCommand -> Model : updateClassTimesToEvent() +activate Model + +Model -> Scheduler : mapClassTimesToLessonEvent(List) +activate Scheduler + +Scheduler -> Scheduler : resetData(List) +Scheduler -[hidden]-> Scheduler +Scheduler --> Model +deactivate Scheduler + +Model --> ScheduleCommand +deactivate Model + +create CommandResult +ScheduleCommand -> CommandResult +activate CommandResult +CommandResult --> ScheduleCommand : result +deactivate CommandResult + +ScheduleCommand --> LogicManager : result +deactivate ScheduleCommand + +LogicManager -[hidden]-> ScheduleCommand +destroy ScheduleCommand + +@enduml diff --git a/docs/diagrams/SolveQuestionActivityDiagram.puml b/docs/diagrams/SolveQuestionActivityDiagram.puml new file mode 100644 index 00000000000..afb90a55be2 --- /dev/null +++ b/docs/diagrams/SolveQuestionActivityDiagram.puml @@ -0,0 +1,32 @@ +@startuml +!include style.puml + +start +:User executes solve question command; +:Parses the command; +if () then ([command is valid]) + :Execute SolveQuestionCommand; + if () then ([student exists]) + :Solve question from student <$rake>; + else ([else]) + :Display invalid student error message; + endif +else ([command is invalid]) + :Display parse error message; +endif +stop + +partition "Activity: Solve question from student" { + start + if () then ([question exists]) + :Create student copy; + :Create solved version of question; + :Set the student copy's question to the solved version; + :Replace student with modified copy; + :Display success message; + else ([else]) + :Display invalid question error message; + endif + stop +} +@enduml diff --git a/docs/diagrams/SolveQuestionSequenceDiagram.puml b/docs/diagrams/SolveQuestionSequenceDiagram.puml new file mode 100644 index 00000000000..7b1bf175e71 --- /dev/null +++ b/docs/diagrams/SolveQuestionSequenceDiagram.puml @@ -0,0 +1,74 @@ +@startuml +!include style.puml + +box Logic LOGIC_COLOR_T1 +participant ":LogicManager" as LogicManager LOGIC_COLOR +participant ":ReeveParser" as ReeveParser LOGIC_COLOR +participant ":QuestionCommandParser" as QuestionCommandParser LOGIC_COLOR +participant "s:SolveQuestionCommand" as SolveQuestionCommand LOGIC_COLOR +end box + +box Model MODEL_COLOR_T1 +participant ":Model" as Model MODEL_COLOR +participant "student:Student" as Student MODEL_COLOR +end box + +[-> LogicManager : execute(...) +activate LogicManager + +LogicManager -> ReeveParser : parseCommand(...) +activate ReeveParser + +create QuestionCommandParser +ReeveParser -> QuestionCommandParser +activate QuestionCommandParser + +QuestionCommandParser --> ReeveParser +deactivate QuestionCommandParser + +ReeveParser -> QuestionCommandParser : parse(...) +activate QuestionCommandParser + +create SolveQuestionCommand +QuestionCommandParser -> SolveQuestionCommand +activate SolveQuestionCommand + +SolveQuestionCommand --> QuestionCommandParser : s +deactivate SolveQuestionCommand + +QuestionCommandParser --> ReeveParser : s +deactivate QuestionCommandParser + +QuestionCommandParser -[hidden]-> ReeveParser +destroy QuestionCommandParser + +ReeveParser --> LogicManager : s +deactivate ReeveParser + +LogicManager -> SolveQuestionCommand : execute() +activate SolveQuestionCommand + +SolveQuestionCommand -> Student : setQuestion(q) +activate Student + +Student --> SolveQuestionCommand : copy +deactivate Student + +SolveQuestionCommand -> Model : setStudent(student, copy) +activate Model + +Model --> SolveQuestionCommand +deactivate Model + +Student -[hidden]-> Model +destroy Student + +SolveQuestionCommand --> LogicManager : result +deactivate SolveQuestionCommand + +SolveQuestionCommand -[hidden]-> LogicManager +destroy SolveQuestionCommand + +[<-- LogicManager +deactivate LogicManager +@enduml diff --git a/docs/diagrams/SortCommandActivityDiagram.puml b/docs/diagrams/SortCommandActivityDiagram.puml new file mode 100644 index 00000000000..f4485d43de5 --- /dev/null +++ b/docs/diagrams/SortCommandActivityDiagram.puml @@ -0,0 +1,18 @@ +@startuml +start +:User executes sort command; +:Parses the command; +if () then ([command is valid]) + :Check the comparison means against the supported comparison means of comparators; + if () then ([comparison means matches a supported means]) + :Create a new comparator based on matched comparison means; + :Update Reeve model with the comparator given; + :Display sort success message; + else ([comparison means does not match any supported means]) + : Throw CommandException; + endif +else ([command has no or invalid parameters]) + :Show parse error message; +endif +stop +@enduml diff --git a/docs/diagrams/SortCommandSequenceDiagram.puml b/docs/diagrams/SortCommandSequenceDiagram.puml new file mode 100644 index 00000000000..c9ac9450b98 --- /dev/null +++ b/docs/diagrams/SortCommandSequenceDiagram.puml @@ -0,0 +1,38 @@ +@startuml +!include ./style.puml + +box "Logic" LOGIC_COLOR_T1 + +Participant ":LogicManager" as logic LOGIC_COLOR +Participant ":ReeveParser" as parser LOGIC_COLOR +Participant ":SortCommandParser" as commandParser LOGIC_COLOR +Participant "command:SortCommand" as command LOGIC_COLOR + +[-> logic : execute() +activate logic +logic -> parser ++: parseCommand(commandText) +create commandParser +parser -> commandParser ++: +return +parser -> commandParser ++: parse(args) +create command +commandParser -> command ++: args +return command +return command +return command +destroy commandParser + + +logic -> command ++: execute(model) + +endbox +box "Model" MODEL_COLOR_T1 +Participant "model:Model" as model MODEL_COLOR + command -> model++: updateSortedStudentList(comparator) + return +return +return +destroy command +end box + +@enduml diff --git a/docs/diagrams/StorageClassDiagram.puml b/docs/diagrams/StorageClassDiagram.puml index 6adb2e156bf..a78ec9a1d38 100644 --- a/docs/diagrams/StorageClassDiagram.puml +++ b/docs/diagrams/StorageClassDiagram.puml @@ -6,19 +6,22 @@ skinparam classBackgroundColor STORAGE_COLOR Interface Storage <> Interface UserPrefsStorage <> -Interface AddressBookStorage <> +Interface ReeveStorage <> +Interface NotebookStorage <> Class StorageManager Class JsonUserPrefsStorage -Class JsonAddressBookStorage +Class JsonReeveStorage +Class JsonNotebookStorage StorageManager .left.|> Storage -StorageManager o-right-> UserPrefsStorage -StorageManager o--> AddressBookStorage +StorageManager o--> ReeveStorage +StorageManager o--> NotebookStorage +StorageManager o-down-> UserPrefsStorage -JsonUserPrefsStorage .left.|> UserPrefsStorage -JsonAddressBookStorage .left.|> AddressBookStorage -JsonAddressBookStorage .down.> JsonSerializableAddressBookStorage -JsonSerializableAddressBookStorage .right.> JsonSerializablePerson -JsonSerializablePerson .right.> JsonAdaptedTag +JsonUserPrefsStorage .up.|> UserPrefsStorage +JsonReeveStorage .up.|> ReeveStorage +JsonReeveStorage .down.> JsonSerializableReeve +JsonNotebookStorage .up.|> NotebookStorage +JsonNotebookStorage .down.> JsonSerializableNotebook @enduml diff --git a/docs/diagrams/ToggleStudentCardSequenceDiagram.puml b/docs/diagrams/ToggleStudentCardSequenceDiagram.puml new file mode 100644 index 00000000000..c23be3a3a6d --- /dev/null +++ b/docs/diagrams/ToggleStudentCardSequenceDiagram.puml @@ -0,0 +1,43 @@ +@startuml +!include style.puml + +box UI UI_COLOR_T1 +participant ":MainWindow" as MainWindow UI_COLOR +end box + +box Logic LOGIC_COLOR_T1 +participant ":LogicManager" as LogicManager LOGIC_COLOR +participant ":ReeveParser" as ReeveParser LOGIC_COLOR +participant "a:ToggleStudentCardCommand" as ToggleStudentCardCommand LOGIC_COLOR +end box + +[-> MainWindow : executeCommand("toggle") +activate MainWindow + +MainWindow -> LogicManager : execute("toggle") +activate LogicManager + +LogicManager -> ReeveParser : parseCommand("toggle") +activate ReeveParser + +create ToggleStudentCardCommand +ReeveParser -> ToggleStudentCardCommand +activate ToggleStudentCardCommand + +ToggleStudentCardCommand --> ReeveParser +deactivate ToggleStudentCardCommand + +ReeveParser --> LogicManager +deactivate ReeveParser + +LogicManager --> MainWindow +deactivate LogicManager + +MainWindow -> MainWindow : handleAcademicPanel() +activate MainWindow +deactivate MainWindow + +[<-- MainWindow +deactivate MainWindow + +@enduml diff --git a/docs/diagrams/UiClassDiagram.puml b/docs/diagrams/UiClassDiagram.puml index 92746f9fcf7..c1cc5ee6a61 100644 --- a/docs/diagrams/UiClassDiagram.puml +++ b/docs/diagrams/UiClassDiagram.puml @@ -11,10 +11,14 @@ Class UiManager Class MainWindow Class HelpWindow Class ResultDisplay -Class PersonListPanel -Class PersonCard +Class StudentListPanel +Class StudentAdminCard +Class StudentAcademicCard Class StatusBarFooter Class CommandBox +Class NoteBook +Class NoteTile +Class ExamStatsWindow } package Model <> { @@ -30,31 +34,41 @@ HiddenOutside ..> Ui UiManager .left.|> Ui UiManager -down-> MainWindow + MainWindow --> HelpWindow MainWindow *-down-> CommandBox MainWindow *-down-> ResultDisplay -MainWindow *-down-> PersonListPanel +MainWindow *-down-> StudentListPanel MainWindow *-down-> StatusBarFooter +MainWindow *-down-> NoteBook +MainWindow ..> ExamStatsWindow + +StudentListPanel --> StudentAdminCard +StudentListPanel --> StudentAcademicCard -PersonListPanel -down-> PersonCard +NoteBook --> NoteTile -MainWindow -left-|> UiPart +NoteBook -right-|> UiPart ResultDisplay --|> UiPart CommandBox --|> UiPart -PersonListPanel --|> UiPart -PersonCard --|> UiPart +StudentListPanel --|> UiPart +StudentAdminCard --|> UiPart +StudentAcademicCard --|> UiPart StatusBarFooter --|> UiPart HelpWindow -down-|> UiPart +MainWindow -|> UiPart +NoteTile--|> UiPart + +NoteTile ..> Model +StudentAcademicCard ..> Model +StudentAdminCard ..> Model -PersonCard ..> Model UiManager -right-> Logic MainWindow -left-> Logic -PersonListPanel -[hidden]left- HelpWindow HelpWindow -[hidden]left- CommandBox CommandBox -[hidden]left- ResultDisplay -ResultDisplay -[hidden]left- StatusBarFooter +StatusBarFooter -[hidden]left- ResultDisplay -MainWindow -[hidden]-|> UiPart @enduml diff --git a/docs/diagrams/style.puml b/docs/diagrams/style.puml index fad8b0adeaa..bd83a44b0ac 100644 --- a/docs/diagrams/style.puml +++ b/docs/diagrams/style.puml @@ -70,6 +70,25 @@ skinparam Shadowing false skinparam DefaultTextAlignment center skinparam packageStyle Rectangle +sprite $rake { + 0000000000000000 + 0000000FF0000000 + 0000000FF0000000 + 0000000FF0000000 + 0000000FF0000000 + 0000000FF0000000 + 0000000FF0000000 + 000FFFFFFFFFF000 + 000FFEEFFFFFF000 + 000FF00FF00FF000 + 000FF00FF00FF000 + 000FF00FF00FF000 + 000FF00FF00FF000 + 000FF00FF00FF000 + 000FF00FF00FF000 + 0000000000000000 +} + hide footbox hide members hide circle diff --git a/docs/diagrams/tracing/LogicSequenceDiagram.puml b/docs/diagrams/tracing/LogicSequenceDiagram.puml index fdcbe1c0ccc..56fc24eadcd 100644 --- a/docs/diagrams/tracing/LogicSequenceDiagram.puml +++ b/docs/diagrams/tracing/LogicSequenceDiagram.puml @@ -13,7 +13,7 @@ create ecp abp -> ecp abp -> ecp ++: parse(arguments) create ec -ecp -> ec ++: index, editPersonDescriptor +ecp -> ec ++: index, editStudentDescriptor ec --> ecp -- ecp --> abp --: command abp --> logic --: command diff --git a/docs/images/AcademicClassDiagram.png b/docs/images/AcademicClassDiagram.png new file mode 100644 index 00000000000..f62ef35b70a Binary files /dev/null and b/docs/images/AcademicClassDiagram.png differ diff --git a/docs/images/AddAttendanceActivityDiagram.png b/docs/images/AddAttendanceActivityDiagram.png new file mode 100644 index 00000000000..60042e3358e Binary files /dev/null and b/docs/images/AddAttendanceActivityDiagram.png differ diff --git a/docs/images/AddAttendanceExpectedOutcome.png b/docs/images/AddAttendanceExpectedOutcome.png new file mode 100644 index 00000000000..1c4df947ecf Binary files /dev/null and b/docs/images/AddAttendanceExpectedOutcome.png differ diff --git a/docs/images/AddAttendanceSequenceDiagram.png b/docs/images/AddAttendanceSequenceDiagram.png new file mode 100644 index 00000000000..5a0e5b665b0 Binary files /dev/null and b/docs/images/AddAttendanceSequenceDiagram.png differ diff --git a/docs/images/AddCommandExpectedOutcomeUG.png b/docs/images/AddCommandExpectedOutcomeUG.png new file mode 100644 index 00000000000..517b16321e8 Binary files /dev/null and b/docs/images/AddCommandExpectedOutcomeUG.png differ diff --git a/docs/images/AddDetailActivityDiagram.png b/docs/images/AddDetailActivityDiagram.png new file mode 100644 index 00000000000..66b956e0eb9 Binary files /dev/null and b/docs/images/AddDetailActivityDiagram.png differ diff --git a/docs/images/AddDetailExpectedOutcome.png b/docs/images/AddDetailExpectedOutcome.png new file mode 100644 index 00000000000..4d525416ae3 Binary files /dev/null and b/docs/images/AddDetailExpectedOutcome.png differ diff --git a/docs/images/AddDetailSequenceDiagram.png b/docs/images/AddDetailSequenceDiagram.png new file mode 100644 index 00000000000..102fd3c7b34 Binary files /dev/null and b/docs/images/AddDetailSequenceDiagram.png differ diff --git a/docs/images/AddExamCommandExpectedOutcomeUG.png b/docs/images/AddExamCommandExpectedOutcomeUG.png new file mode 100644 index 00000000000..b56c04f6bef Binary files /dev/null and b/docs/images/AddExamCommandExpectedOutcomeUG.png differ diff --git a/docs/images/AddQuestionActivityDiagram.png b/docs/images/AddQuestionActivityDiagram.png new file mode 100644 index 00000000000..7003ba50f3d Binary files /dev/null and b/docs/images/AddQuestionActivityDiagram.png differ diff --git a/docs/images/AddQuestionSequenceDiagram.png b/docs/images/AddQuestionSequenceDiagram.png new file mode 100644 index 00000000000..d9da60030fb Binary files /dev/null and b/docs/images/AddQuestionSequenceDiagram.png differ diff --git a/docs/images/AddStudentActivityDiagram.png b/docs/images/AddStudentActivityDiagram.png new file mode 100644 index 00000000000..9b284460f8c Binary files /dev/null and b/docs/images/AddStudentActivityDiagram.png differ diff --git a/docs/images/AddStudentSequenceDiagram.png b/docs/images/AddStudentSequenceDiagram.png new file mode 100644 index 00000000000..b701235a665 Binary files /dev/null and b/docs/images/AddStudentSequenceDiagram.png differ diff --git a/docs/images/AdminClassDiagram.png b/docs/images/AdminClassDiagram.png new file mode 100644 index 00000000000..c58320da0e6 Binary files /dev/null and b/docs/images/AdminClassDiagram.png differ diff --git a/docs/images/DeleteAttendanceActivityDiagram.png b/docs/images/DeleteAttendanceActivityDiagram.png new file mode 100644 index 00000000000..52323c52e3f Binary files /dev/null and b/docs/images/DeleteAttendanceActivityDiagram.png differ diff --git a/docs/images/DeleteAttendanceExpectedOutcome.png b/docs/images/DeleteAttendanceExpectedOutcome.png new file mode 100644 index 00000000000..f46b3d72fa2 Binary files /dev/null and b/docs/images/DeleteAttendanceExpectedOutcome.png differ diff --git a/docs/images/DeleteAttendanceSequenceDiagram.png b/docs/images/DeleteAttendanceSequenceDiagram.png new file mode 100644 index 00000000000..6736ccc68ed Binary files /dev/null and b/docs/images/DeleteAttendanceSequenceDiagram.png differ diff --git a/docs/images/DeleteDetailActivityDiagram.png b/docs/images/DeleteDetailActivityDiagram.png new file mode 100644 index 00000000000..69a0e74f225 Binary files /dev/null and b/docs/images/DeleteDetailActivityDiagram.png differ diff --git a/docs/images/DeleteDetailExpectedOutcome.png b/docs/images/DeleteDetailExpectedOutcome.png new file mode 100644 index 00000000000..130ccae7c19 Binary files /dev/null and b/docs/images/DeleteDetailExpectedOutcome.png differ diff --git a/docs/images/DeleteDetailSequenceDiagram.png b/docs/images/DeleteDetailSequenceDiagram.png new file mode 100644 index 00000000000..e9c99e52bfd Binary files /dev/null and b/docs/images/DeleteDetailSequenceDiagram.png differ diff --git a/docs/images/DeleteExamExpectedOutcomeAfter.png b/docs/images/DeleteExamExpectedOutcomeAfter.png new file mode 100644 index 00000000000..a337b80a816 Binary files /dev/null and b/docs/images/DeleteExamExpectedOutcomeAfter.png differ diff --git a/docs/images/DeleteExamExpectedOutcomeBefore.png b/docs/images/DeleteExamExpectedOutcomeBefore.png new file mode 100644 index 00000000000..e12104ffbf2 Binary files /dev/null and b/docs/images/DeleteExamExpectedOutcomeBefore.png differ diff --git a/docs/images/DeleteQuestionActivityDiagram.png b/docs/images/DeleteQuestionActivityDiagram.png new file mode 100644 index 00000000000..fc9331cd560 Binary files /dev/null and b/docs/images/DeleteQuestionActivityDiagram.png differ diff --git a/docs/images/DeleteQuestionSequenceDiagram.png b/docs/images/DeleteQuestionSequenceDiagram.png new file mode 100644 index 00000000000..746a4ac55c7 Binary files /dev/null and b/docs/images/DeleteQuestionSequenceDiagram.png differ diff --git a/docs/images/EditCommandExpectedOutcome.png b/docs/images/EditCommandExpectedOutcome.png new file mode 100644 index 00000000000..31c13a8d836 Binary files /dev/null and b/docs/images/EditCommandExpectedOutcome.png differ diff --git a/docs/images/EditDetailActivityDiagram.png b/docs/images/EditDetailActivityDiagram.png new file mode 100644 index 00000000000..91a99ae33bc Binary files /dev/null and b/docs/images/EditDetailActivityDiagram.png differ diff --git a/docs/images/EditDetailExpectedOutcome.png b/docs/images/EditDetailExpectedOutcome.png new file mode 100644 index 00000000000..e7d779189f7 Binary files /dev/null and b/docs/images/EditDetailExpectedOutcome.png differ diff --git a/docs/images/EditDetailSequenceDiagram.png b/docs/images/EditDetailSequenceDiagram.png new file mode 100644 index 00000000000..607e3c87263 Binary files /dev/null and b/docs/images/EditDetailSequenceDiagram.png differ diff --git a/docs/images/EditStudentActivityDiagram.png b/docs/images/EditStudentActivityDiagram.png new file mode 100644 index 00000000000..fdca3c7b98d Binary files /dev/null and b/docs/images/EditStudentActivityDiagram.png differ diff --git a/docs/images/EditStudentSequenceDiagram.png b/docs/images/EditStudentSequenceDiagram.png new file mode 100644 index 00000000000..126b70274dd Binary files /dev/null and b/docs/images/EditStudentSequenceDiagram.png differ diff --git a/docs/images/ExamCommandClassDiagram.png b/docs/images/ExamCommandClassDiagram.png new file mode 100644 index 00000000000..a71bedeca1f Binary files /dev/null and b/docs/images/ExamCommandClassDiagram.png differ diff --git a/docs/images/ExamStatsActivityDiagram.png b/docs/images/ExamStatsActivityDiagram.png new file mode 100644 index 00000000000..6d76fdd4668 Binary files /dev/null and b/docs/images/ExamStatsActivityDiagram.png differ diff --git a/docs/images/ExamStatsCommandExpectedOutcomeUG.png b/docs/images/ExamStatsCommandExpectedOutcomeUG.png new file mode 100644 index 00000000000..68425915c39 Binary files /dev/null and b/docs/images/ExamStatsCommandExpectedOutcomeUG.png differ diff --git a/docs/images/ExamStatsSequenceDiagram.png b/docs/images/ExamStatsSequenceDiagram.png new file mode 100644 index 00000000000..f7768830fd0 Binary files /dev/null and b/docs/images/ExamStatsSequenceDiagram.png differ diff --git a/docs/images/FindCommandActivityDiagram.png b/docs/images/FindCommandActivityDiagram.png new file mode 100644 index 00000000000..7cf0f7175de Binary files /dev/null and b/docs/images/FindCommandActivityDiagram.png differ diff --git a/docs/images/FindCommandSequenceDiagram.png b/docs/images/FindCommandSequenceDiagram.png new file mode 100644 index 00000000000..bde57a5c2d8 Binary files /dev/null and b/docs/images/FindCommandSequenceDiagram.png differ diff --git a/docs/images/JsonSerializableNotebookClassDiagram.png b/docs/images/JsonSerializableNotebookClassDiagram.png new file mode 100644 index 00000000000..37ee825f59e Binary files /dev/null and b/docs/images/JsonSerializableNotebookClassDiagram.png differ diff --git a/docs/images/JsonSerializableReeveClassDiagram.png b/docs/images/JsonSerializableReeveClassDiagram.png new file mode 100644 index 00000000000..6f3768b17f3 Binary files /dev/null and b/docs/images/JsonSerializableReeveClassDiagram.png differ diff --git a/docs/images/LogicClassDiagram.png b/docs/images/LogicClassDiagram.png index b9e853cef12..34cb82b819e 100644 Binary files a/docs/images/LogicClassDiagram.png and b/docs/images/LogicClassDiagram.png differ diff --git a/docs/images/ModelClassDiagram.png b/docs/images/ModelClassDiagram.png index 280064118cf..68affcb4689 100644 Binary files a/docs/images/ModelClassDiagram.png and b/docs/images/ModelClassDiagram.png differ diff --git a/docs/images/NoteCommandClassDiagram.png b/docs/images/NoteCommandClassDiagram.png new file mode 100644 index 00000000000..5b1c70b80ac Binary files /dev/null and b/docs/images/NoteCommandClassDiagram.png differ diff --git a/docs/images/OverdueActivityDiagram.png b/docs/images/OverdueActivityDiagram.png new file mode 100644 index 00000000000..d4f75857d89 Binary files /dev/null and b/docs/images/OverdueActivityDiagram.png differ diff --git a/docs/images/OverdueExpectedOutcome.png b/docs/images/OverdueExpectedOutcome.png new file mode 100644 index 00000000000..a188977c6a3 Binary files /dev/null and b/docs/images/OverdueExpectedOutcome.png differ diff --git a/docs/images/OverdueSequenceDiagram.png b/docs/images/OverdueSequenceDiagram.png new file mode 100644 index 00000000000..ca6316e3795 Binary files /dev/null and b/docs/images/OverdueSequenceDiagram.png differ diff --git a/docs/images/QuestionAddExpectedOutcome.png b/docs/images/QuestionAddExpectedOutcome.png new file mode 100644 index 00000000000..3bee401febc Binary files /dev/null and b/docs/images/QuestionAddExpectedOutcome.png differ diff --git a/docs/images/QuestionDeleteExpectedOutcome.png b/docs/images/QuestionDeleteExpectedOutcome.png new file mode 100644 index 00000000000..656b0341179 Binary files /dev/null and b/docs/images/QuestionDeleteExpectedOutcome.png differ diff --git a/docs/images/QuestionSolveExpectedOutcome.png b/docs/images/QuestionSolveExpectedOutcome.png new file mode 100644 index 00000000000..17dc49cca87 Binary files /dev/null and b/docs/images/QuestionSolveExpectedOutcome.png differ diff --git a/docs/images/ReeveLayout.png b/docs/images/ReeveLayout.png new file mode 100644 index 00000000000..59e3a0da751 Binary files /dev/null and b/docs/images/ReeveLayout.png differ diff --git a/docs/images/ScheduleActivityDiagram.png b/docs/images/ScheduleActivityDiagram.png new file mode 100644 index 00000000000..b5c115dd916 Binary files /dev/null and b/docs/images/ScheduleActivityDiagram.png differ diff --git a/docs/images/ScheduleSequenceDiagram.png b/docs/images/ScheduleSequenceDiagram.png new file mode 100644 index 00000000000..d4c594cb32f Binary files /dev/null and b/docs/images/ScheduleSequenceDiagram.png differ diff --git a/docs/images/ScheduleStep1.png b/docs/images/ScheduleStep1.png new file mode 100644 index 00000000000..27ecfc873a3 Binary files /dev/null and b/docs/images/ScheduleStep1.png differ diff --git a/docs/images/ScheduleStep2.png b/docs/images/ScheduleStep2.png new file mode 100644 index 00000000000..64ad635de07 Binary files /dev/null and b/docs/images/ScheduleStep2.png differ diff --git a/docs/images/ScheduleStep3.png b/docs/images/ScheduleStep3.png new file mode 100644 index 00000000000..f77be387beb Binary files /dev/null and b/docs/images/ScheduleStep3.png differ diff --git a/docs/images/SolveQuestionActivityDiagram.png b/docs/images/SolveQuestionActivityDiagram.png new file mode 100644 index 00000000000..26152f2fffa Binary files /dev/null and b/docs/images/SolveQuestionActivityDiagram.png differ diff --git a/docs/images/SolveQuestionSequenceDiagram.png b/docs/images/SolveQuestionSequenceDiagram.png new file mode 100644 index 00000000000..b4875dd3d89 Binary files /dev/null and b/docs/images/SolveQuestionSequenceDiagram.png differ diff --git a/docs/images/SortCommandActivityDiagram.png b/docs/images/SortCommandActivityDiagram.png new file mode 100644 index 00000000000..7a6e2c599d9 Binary files /dev/null and b/docs/images/SortCommandActivityDiagram.png differ diff --git a/docs/images/SortCommandSequenceDiagram.png b/docs/images/SortCommandSequenceDiagram.png new file mode 100644 index 00000000000..d57b0ac2769 Binary files /dev/null and b/docs/images/SortCommandSequenceDiagram.png differ diff --git a/docs/images/StorageClassDiagram.png b/docs/images/StorageClassDiagram.png index d87c1216820..b3dd2452fe1 100644 Binary files a/docs/images/StorageClassDiagram.png and b/docs/images/StorageClassDiagram.png differ diff --git a/docs/images/ToggleCommandExpectedOutcomeAfterUG.png b/docs/images/ToggleCommandExpectedOutcomeAfterUG.png new file mode 100644 index 00000000000..a43e64f5710 Binary files /dev/null and b/docs/images/ToggleCommandExpectedOutcomeAfterUG.png differ diff --git a/docs/images/ToggleCommandExpectedOutcomeBeforeUG.png b/docs/images/ToggleCommandExpectedOutcomeBeforeUG.png new file mode 100644 index 00000000000..e3bde7997d0 Binary files /dev/null and b/docs/images/ToggleCommandExpectedOutcomeBeforeUG.png differ diff --git a/docs/images/ToggleStudentCardSequenceDiagram.png b/docs/images/ToggleStudentCardSequenceDiagram.png new file mode 100644 index 00000000000..e74b4791651 Binary files /dev/null and b/docs/images/ToggleStudentCardSequenceDiagram.png differ diff --git a/docs/images/Ui.png b/docs/images/Ui.png index 5bd77847aa2..4a92bf8851a 100644 Binary files a/docs/images/Ui.png and b/docs/images/Ui.png differ diff --git a/docs/images/UiClassDiagram.png b/docs/images/UiClassDiagram.png index 7b4b3dbea45..b9921e94abb 100644 Binary files a/docs/images/UiClassDiagram.png and b/docs/images/UiClassDiagram.png differ diff --git a/docs/images/alexcqy.png b/docs/images/alexcqy.png new file mode 100644 index 00000000000..92c2ccbe9d2 Binary files /dev/null and b/docs/images/alexcqy.png differ diff --git a/docs/images/csiongn.png b/docs/images/csiongn.png new file mode 100644 index 00000000000..44ded74e87c Binary files /dev/null and b/docs/images/csiongn.png differ diff --git a/docs/images/helpMessage.png b/docs/images/helpMessage.png index b1f70470137..7fc57af18c0 100644 Binary files a/docs/images/helpMessage.png and b/docs/images/helpMessage.png differ diff --git a/docs/images/hogantan.png b/docs/images/hogantan.png new file mode 100644 index 00000000000..f43b16a1898 Binary files /dev/null and b/docs/images/hogantan.png differ diff --git a/docs/images/screenshots/AddingNote.png b/docs/images/screenshots/AddingNote.png new file mode 100644 index 00000000000..e8001c49d88 Binary files /dev/null and b/docs/images/screenshots/AddingNote.png differ diff --git a/docs/images/screenshots/Notes.png b/docs/images/screenshots/Notes.png new file mode 100644 index 00000000000..0afdd4e3d1b Binary files /dev/null and b/docs/images/screenshots/Notes.png differ diff --git a/docs/images/stoptakingallthenames.png b/docs/images/stoptakingallthenames.png new file mode 100644 index 00000000000..7d41739d9b0 Binary files /dev/null and b/docs/images/stoptakingallthenames.png differ diff --git a/docs/images/vaishakanand.png b/docs/images/vaishakanand.png new file mode 100644 index 00000000000..df235c9a285 Binary files /dev/null and b/docs/images/vaishakanand.png differ diff --git a/docs/index.md b/docs/index.md index 7601dbaad0d..e5338c410b5 100644 --- a/docs/index.md +++ b/docs/index.md @@ -1,19 +1,20 @@ --- layout: page -title: AddressBook Level-3 +title: Reeve --- -[![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/AY2021S1-CS2103T-W15-2/tp/workflows/Java%20CI/badge.svg)](https://github.com/AY2021S1-CS2103T-W15-2/tp) +[![codecov](https://codecov.io/gh/AY2021S1-CS2103T-W15-2/tp/branch/master/graph/badge.svg)](https://codecov.io/gh/AY2021S1-CS2103T-W15-2/tp) ![Ui](images/Ui.png) -**AddressBook is a desktop application for managing your contact details.** While it has a GUI, most of the user interactions happen using a CLI (Command Line Interface). +**Reeve** is a desktop application for **private tutors to better manage both administrative and academic details of their students**, optimised for use via a **Command Line Interface (CLI)** for receiving inputs while still having the benefits of a **Graphical User Interface (GUI)** for displaying information. -* 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. +* Interested in using Reeve? Head over to the [_Quick Start_ section of the **User Guide**](UserGuide.html#2-quick-start)! +* Interested in developing Reeve? 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). diff --git a/docs/team/alexcqy.md b/docs/team/alexcqy.md new file mode 100644 index 00000000000..28c4d270d42 --- /dev/null +++ b/docs/team/alexcqy.md @@ -0,0 +1,43 @@ +--- +layout: page +title: Alex's Project Portfolio Page +--- + +## Project: Reeve + +Reeve is a desktop companion application for one-on-one private tutors designed to help them better manage their students' academic and administrative needs. +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. + +* **Feature added**: Added the **schedule** feature to **Reeve**. + * What it does: Allows user to view classes on a timetable, rendered as a graphical user interface, either weekly or daily based on a date given. + * Justification: This feature helps tutor to plan for their schedule and lessons either for the week or day. As is gives a whole view of the lessons ahead. + * Highlights: This enhancement uses the current data and maps them to an entity that allows meaningful information to be shown. + The implementation was challenging as it required integration of an external library with the current structure of the project. + Care have also been given to maintain the data integrity of the current system. + * Credits: This feature uses the **[JFXtras](https://jfxtras.org/)** library which includes , [jfxtras-agenda](https://jfxtras.org/doc/8.0/jfxtras-agenda/index.html), [jfxtras-icalendarfx](https://jfxtras.org/doc/8.0/jfxtras-icalendarfx/index.html), [jfxtras-icalendaragenda](https://jfxtras.org/doc/8.0/jfxtras-icalendaragenda/index.html). + +* **Other enhancements**: + * Added the `Name` and `Year` fields in the `Student` class. + * Updated json storage to be compatible with `Student` object. + * Updated the `add` command for users to add `Student` object. This allows user to add a `Student`'s academic and admin fields. + +* **Code contribution**: [RepoSense link](https://nus-cs2103-ay2021s1.github.io/tp-dashboard/#breakdown=true&search=alexcqy) + +* **Project management**: + * Helped to plan project base structure. + * Laid out plans for `Student`, `Academic` and `Admin`. + +* **Documentation**: + * User Guide: + * Added description for the feature `schedule` ([\#205](https://github.com/AY2021S1-CS2103T-W15-2/tp/pull/205)). + * Added a visuals and description for users to understand the application interface. + * Developer Guide: + * Added implementation details of the `schedule`. + * Updated design section for `Model` and `Ui` component. + +* **Community**: + * PRs reviewed (with non-trivial review comments): ([#62](https://github.com/AY2021S1-CS2103T-W15-2/tp/pull/62), [#68](https://github.com/AY2021S1-CS2103T-W15-2/tp/pull/68)) + * Reported bugs and suggestions for other teams in the class (examples: [#1](https://github.com/AlexCQY/ped/issues/1), [#2](https://github.com/AlexCQY/ped/issues/2), ) + diff --git a/docs/team/csiongn.md b/docs/team/csiongn.md new file mode 100644 index 00000000000..5277353bef8 --- /dev/null +++ b/docs/team/csiongn.md @@ -0,0 +1,41 @@ +--- +layout: page +title: Ng Choon Siong's Project Portfolio Page +--- + +## PROJECT: Reeve + +Reeve is a desktop companion application for one-on-one private tutors designed to help them better manage their students' academic and administrative needs. +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. + +## Summary of Contributions + +* **Major enhancement implemented**: + * Developed the **notebook** feature of **Reeve**. + + * What it does: **Reeve's notebook** allows tutors to keep track of notes containing small amounts of information unrelated to students . + * Justification: This feature is important for a private tutor as there are times when there is information relating to tutoring that needs to be stored but it is not related to any student. This helps to make Reeve a one stop location for storing all kinds of information. + * Highlights: This involved substantial work integrating with the existing modified GUI as the notes panel needed to be of a fixed size after resizing while not overlapping with any other sections. The code, while adapted from address book code, also needed integration with Reeve to ensure proper reading and writing to storage when the program is run. +* **Other enhancements implemented**: + * **Created `sort` command** to allow sorting of the student list by name, class time or year of study. ([\#112](https://github.com/AY2021S1-CS2103T-W15-2/tp/pull/112)) + * Justification: This feature is important as it allows private tutors to navigate through the list of students better depending on the needs of the tutor. + * **Enhanced `find` command** to allow searching by multiple criteria and **added support** for searching by name, school and year of study. ([\#60](https://github.com/AY2021S1-CS2103T-W15-2/tp/pull/60)) +* **Code contribution**: [RepoSense link](https://nus-cs2103-ay2021s1.github.io/tp-dashboard/#breakdown=true&search=csiongn) +* **Other contributions**: + * **Substantially reworked the structure of `Year` class** for better input validation and management. ([\#96](https://github.com/AY2021S1-CS2103T-W15-2/tp/pull/96)) + * Helped to **rename Address Book references to Reeve** ([\#67](https://github.com/AY2021S1-CS2103T-W15-2/tp/pull/67)) +* **Project management**: + * Reminded team of deliverables. + +* **Documentation**: + * User Guide: + * Updated documentation for the command `find` ([\#38](https://github.com/AY2021S1-CS2103T-W15-2/tp/pull/38) and [\#60](https://github.com/AY2021S1-CS2103T-W15-2/tp/pull/60)) + * Added documentation for the command `sort` ([\#130](https://github.com/AY2021S1-CS2103T-W15-2/tp/pull/130)) + * Added documentation for notebook feature ([\#228](https://github.com/AY2021S1-CS2103T-W15-2/tp/pull/228)) + * Developer Guide: + * Added implementation details of the `find` and `sort` and command ([\#250](https://github.com/AY2021S1-CS2103T-W15-2/tp/pull/250)) + * Added implementation details of the notebook ([\#250](https://github.com/AY2021S1-CS2103T-W15-2/tp/pull/250)) + * Added use cases and user stories ([\#250](https://github.com/AY2021S1-CS2103T-W15-2/tp/pull/250)) +* **Community**: + * PRs reviewed (with non-trivial review comments): [\#194](https://github.com/AY2021S1-CS2103T-W15-2/tp/pull/194) + * Reported bugs and suggestions for other teams in the class (examples: [1](https://github.com/csiongn/ped/issues/1), [2](https://github.com/csiongn/ped/issues/2), [3](https://github.com/csiongn/ped/issues/3)) diff --git a/docs/team/hogantan.md b/docs/team/hogantan.md new file mode 100644 index 00000000000..69564ee6310 --- /dev/null +++ b/docs/team/hogantan.md @@ -0,0 +1,69 @@ +--- +layout: page +title: Hogan Tan Shao Han's Project Portfolio Page +--- + +## Project: Reeve + +## Overview + +Reeve is a desktop companion application for one-on-one private tutors designed to help them better manage their students' academic and administrative needs. +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. + +## Summary of Contributions + +* **Major enhancement implemented**: developed the **exam feature** of **Reeve** under academic features. + * What it does: Allows the user to add/delete examination records to a particular student. It also allows users to view the exam statistics of a particular student. + + * Justification: This feature is crucial for a private tutor as it allows the private tutor to monitor his/her students' academic progress. + In other words, his/she will be able to track each individual students' academic performance. As a result, the private tutor will be able to not only keep track of which students need more help while also gauging his/her capability as a teacher. + + * Highlights: Since this is a new feature with its own set of commands, the implementation required modifying the base student class which was quite tricky given that most other + commands were tied to the base student class. Also the addition of opening a new window via a GUI also brings in many considerations to take into account when implementing such as + design considerations. + +* **Major enhancement implemented**: developed the **GUI** of **Reeve**. + * What it does: This feature provides a pleasant interaction between User and **Reeve** by strategically deciding how to display information to users. + + * Justification: In most products, a well-developed UI/UX is imperative in not only landing a good first impression from potential users but it also keeps users interested in using the product. + + * Highlights: This enhancement saw a big change from the original AddressBook3 interface in terms of color choice, placement of the various UI components, etc. + Colours of each component in the application were carefully chosen to create a visually pleasing interface. Arrangement of UI components had to be arranged in a way + that would be easy and intuitive for users to understand and get used to. + +* **Major enhancement implemented**: developed the **toggle feature** of **Reeve**. + * What it does: Allows the user to toggle in between displaying administrative and academic details of students. + + * Justification: As aforementioned above, a well-developed UI/UX is imperative to users, hence this feature ensures that the + display of student inform is kept clean and neat without much cluttering. + + * Highlights: This enhancement saw a need to consider various UI/UX considerations as well in order to make the feature + intuitive and convenient for users as well as easy to understand. + +* **Minor enhancement implemented**: + * Updated `add` command which allows users to add students along with their administrative details. + +* **Code contribution**: [RepoSense link](https://nus-cs2103-ay2021s1.github.io/tp-dashboard/#breakdown=true&search=W15-2&sort=groupTitle&sortWithin=title&since=2020-08-14&timeframe=commit&mergegroup=&groupSelect=groupByRepos&checkedFileTypes=docs~functional-code~test-code~other&tabOpen=true&tabType=authorship&tabAuthor=StopTakingAllTheNames&tabRepo=AY2021S1-CS2103T-W15-2%2Ftp%5Bmaster%5D&authorshipIsMergeGroup=false&authorshipFileTypes=docs~functional-code~test-code~other) + +* **Project management**: + * Set soft and hard deadlines for milestones `v1.1` - `v1.4`. + * Reminded team of deliverables for each week. + * Maintained issue tracker. + * Maintained product website and README. ([\#63](https://github.com/AY2021S1-CS2103T-W15-2/tp/pull/63))([\#108](https://github.com/AY2021S1-CS2103T-W15-2/tp/pull/108)) + +* **Enhancements to existing features**: + * Laid down the structure of the student class. ([\#42](https://github.com/AY2021S1-CS2103T-W15-2/tp/pull/42)) + * Updated the add command to accommodate student class. ([\#62](https://github.com/AY2021S1-CS2103T-W15-2/tp/pull/62)) + * Updated the GUI color scheme and layout. ([\#76](https://github.com/AY2021S1-CS2103T-W15-2/tp/pull/76), [\#81](https://github.com/AY2021S1-CS2103T-W15-2/tp/pull/81) and [\#233](https://github.com/AY2021S1-CS2103T-W15-2/tp/pull/233)) + * Updated UG and DG structure and flow. ([\#126](https://github.com/AY2021S1-CS2103T-W15-2/tp/pull/126) and [\#231](https://github.com/AY2021S1-CS2103T-W15-2/tp/pull/231)) + +* **Documentation**: + * User Guide: + * Added documentation for the features `add` ([\#82](https://github.com/AY2021S1-CS2103T-W15-2/tp/pull/82)), `exam` ([\#117](https://github.com/AY2021S1-CS2103T-W15-2/tp/pull/117) and [\#141](https://github.com/AY2021S1-CS2103T-W15-2/tp/pull/141)) and `toggle` ([\#134](https://github.com/AY2021S1-CS2103T-W15-2/tp/pull/134)). + * Added introduction and prefaces to various sections ([\#126](https://github.com/AY2021S1-CS2103T-W15-2/tp/pull/126)) + * Developer Guide: + * Added implementation details of the `add` ([\#100](https://github.com/AY2021S1-CS2103T-W15-2/tp/pull/100)), `exam` ([\#225](https://github.com/AY2021S1-CS2103T-W15-2/tp/pull/225)) `toggle` ([\#225](https://github.com/AY2021S1-CS2103T-W15-2/tp/pull/225)) features. + +* **Community**: + * PRs reviewed (with non-trivial review comments): [\#77](https://github.com/AY2021S1-CS2103T-W15-2/tp/pull/77), [\#79](https://github.com/AY2021S1-CS2103T-W15-2/tp/pull/79), [\#102](https://github.com/AY2021S1-CS2103T-W15-2/tp/pull/102) + * Reported bugs and suggestions for other teams in the class (examples: [1](https://github.com/hogantan/ped/issues/3), [2](https://github.com/hogantan/ped/issues/4), [3](https://github.com/hogantan/ped/issues/10)) diff --git a/docs/team/stoptakingallthenames.md b/docs/team/stoptakingallthenames.md new file mode 100644 index 00000000000..2a158e9c3bc --- /dev/null +++ b/docs/team/stoptakingallthenames.md @@ -0,0 +1,53 @@ +--- +layout: page +title: Ong Ying Gao's Project Portfolio Page +--- + +## Project: Reeve + +Reeve is a desktop companion application for one-on-one private tutors designed to help them better manage their students' academic and administrative needs. +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. + +* **Feature Addition**: Added the ability to record and manage questions from students. + * What it does: Allows the user to log questions from students, resolve them and delete them when no longer needed. + * Justification: This helps tutors significantly as it allows them to keep track of questions from their students and gives them time to resolve them. + Furthermore, the ability to record the solution allows tutors to use it to answer future similar questions from students. + * Highlights: Since this is a new feature with its own set of commands, the implementation required modifying almost every module. Some existing commands had to be altered as well. + Almost all new functional code had accompanying test cases, resulting in 1697 new lines of code with 84.50% coverage. + +* **Feature Addition**: Added the ability to store tuition fee payment data and find all students with overdue fees. + * Highlights: In order to implement monitoring of payment dates, I had to create a more manual approach to parsing strings into dates + as the `parse()` method in the LocalDate API was too lenient (allowing inputs such as `31/2/2020`). + +* **Code contribution**: [RepoSense link](https://nus-cs2103-ay2021s1.github.io/tp-dashboard/#breakdown=true&search=stoptakingallthenames) + +* **Project management**: + * Managed releases `v1.2` to `v1.4` (3 releases) on GitHub. + * Set up Github repo and issue tracker. + * Maintained issue tracker. + +
+ +* **Enhancements to existing features**: + * Wrote additional tests for existing and new features to increase coverage ([\#75](https://github.com/AY2021S1-CS2103T-W15-2/tp/pull/75)). + * Enhanced code quality to ensure adherence to abstraction levels, improve defensiveness and reduce coupling ([\#103](https://github.com/AY2021S1-CS2103T-W15-2/tp/pull/103) + and [\#194](https://github.com/AY2021S1-CS2103T-W15-2/tp/pull/194)). + * Added utility and classes methods to minimise code duplication ([\#211](https://github.com/AY2021S1-CS2103T-W15-2/tp/pull/211) and [\#213](https://github.com/AY2021S1-CS2103T-W15-2/tp/pull/213)). + +* **Documentation**: + * User Guide: + * Documented the `overdue` ([\#79](https://github.com/AY2021S1-CS2103T-W15-2/tp/pull/79)) and `question` ([\#71](https://github.com/AY2021S1-CS2103T-W15-2/tp/pull/71)) features. + * Did cosmetic tweaks to existing documentation of features: ([\#140](https://github.com/AY2021S1-CS2103T-W15-2/tp/pull/140) and [\#212](https://github.com/AY2021S1-CS2103T-W15-2/tp/pull/212)). + * Developer Guide: + * Added implementation details of the `overdue` ([\#105](https://github.com/AY2021S1-CS2103T-W15-2/tp/pull/105)) and `question` ([\#103](https://github.com/AY2021S1-CS2103T-W15-2/tp/pull/103)) + features. + * Included sequence and activity diagrams for the above features. + +* **Community**: + * Reviewed PRs (with non-trivial review comments): [\#60](https://github.com/AY2021S1-CS2103T-W15-2/tp/pull/60), [\#62](https://github.com/AY2021S1-CS2103T-W15-2/tp/pull/62), + [\#68](https://github.com/AY2021S1-CS2103T-W15-2/tp/pull/68), [\#214](https://github.com/AY2021S1-CS2103T-W15-2/tp/pull/214) + * Reported bugs and suggestions for other teams in the class (examples: [1](https://github.com/StopTakingAllTheNames/ped/issues/1), + [2](https://github.com/StopTakingAllTheNames/ped/issues/5), [3](https://github.com/StopTakingAllTheNames/ped/issues/2)) + * Contributed to forum discussions (examples: [1](https://github.com/nus-cs2103-AY2021S1/forum/issues/390), [2](https://github.com/nus-cs2103-AY2021S1/forum/issues/393)) diff --git a/docs/team/vaishakanand.md b/docs/team/vaishakanand.md new file mode 100644 index 00000000000..59572c11d0b --- /dev/null +++ b/docs/team/vaishakanand.md @@ -0,0 +1,47 @@ +--- +layout: page +title: Vaishak's Project Portfolio Page +--- + +## Project: Reeve + +Reeve is a desktop companion application for one-on-one private tutors designed to help them better manage their students' academic and administrative needs. +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. + +## Summary of Contributions + +* **New Feature implemented**: Added the **details** feature to **Reeve**. + * What it does: Allows the user to add, edit or delete any additional details to a student. + * Justification: This feature would help tutors significantly as it allows them to add details that have not been + covered by the other fields, to students. This gives the tutor some flexibility to customise each student as he / she + sees fit. + +* **New Feature implemented**: Added the **attendance** feature to **Reeve**. + * What it does: Allows the user to track (add or delete) the attendance of students in lessons. + * Justification: An attendance tracking feature helps to ease one of a tutor's many required tasks. This is helps them + by greatly simplifying the process of taking and storing the attendance of the tutor's many students. + +* **Other Enhancements implemented**: + * Added the `Academic` class to restructure `Student`. + * Added the `ClassTime` and `ClassVenue` that are required fields in `Student`. + * Adapted the `edit` command to work with the new structure of `Student` in **Reeve**. + +* **Code contribution**: [RepoSense link](https://nus-cs2103-ay2021s1.github.io/tp-dashboard/#breakdown=true&search=vaishakanand) + +* **Project management**: + * Managed releases `v1.1` - `v1.4` on GitHub + * Helped to remind team of various deliverables + +* **Documentation**: + * User Guide: + * Added documentation for the features `edit` ([\#37](https://github.com/AY2021S1-CS2103T-W15-2/tp/pull/37)) , `detail` ([\#102](https://github.com/AY2021S1-CS2103T-W15-2/tp/pull/102)) and `attendance` ([\#129](https://github.com/AY2021S1-CS2103T-W15-2/tp/pull/129)). + * Added Table of Contents ([\#129](https://github.com/AY2021S1-CS2103T-W15-2/tp/pull/129)). + * Updated the order, and content of Command summary ([\#147](https://github.com/AY2021S1-CS2103T-W15-2/tp/pull/147)) + * Added Figure numbering, and image centering to make User Guide look nicer ([\#262](https://github.com/AY2021S1-CS2103T-W15-2/tp/pull/262)) + * Developer Guide: + * Added implementation details of the `edit` ([\#113](https://github.com/AY2021S1-CS2103T-W15-2/tp/pull/113)), `detail` ([\#229](https://github.com/AY2021S1-CS2103T-W15-2/tp/pull/229)) and `attendance` ([\#229](https://github.com/AY2021S1-CS2103T-W15-2/tp/pull/229)) features. + * Added Figure numbering, and image centering ([\#268](https://github.com/AY2021S1-CS2103T-W15-2/tp/pull/268)) + +* **Community**: + * Reviewed PRs (with non-trivial review comments): [\#71](https://github.com/AY2021S1-CS2103T-W15-2/tp/pull/71), [\#77](https://github.com/AY2021S1-CS2103T-W15-2/tp/pull/77), [\#56](https://github.com/AY2021S1-CS2103T-W15-2/tp/pull/56) + * Reported bugs and suggestions for other teams in the class (examples: [1](https://github.com/VaishakAnand/ped/issues/5), [2](https://github.com/VaishakAnand/ped/issues/2), [3](https://github.com/VaishakAnand/ped/issues/3)) diff --git a/docs/tutorials/AddRemark.md b/docs/tutorials/AddRemark.md index 6907e29456c..fdf5b89881b 100644 --- a/docs/tutorials/AddRemark.md +++ b/docs/tutorials/AddRemark.md @@ -28,7 +28,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 { @@ -64,8 +64,8 @@ Following the convention in other commands, we add relevant messages as constant **`RemarkCommand.java`:** ``` java - public static final String MESSAGE_USAGE = COMMAND_WORD + ": Edits the remark of the person identified " - + "by the index number used in the last person listing. " + public static final String MESSAGE_USAGE = COMMAND_WORD + ": Edits the remark of the 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" @@ -99,8 +99,8 @@ public class RemarkCommand extends Command { private final String remark; /** - * @param index of the person in the filtered person list to edit the remark - * @param remark of the person to be updated to + * @param index of the 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); @@ -222,11 +222,11 @@ If you are stuck, check out the sample ## Add `Remark` to the model -Now that we have all the information that we need, let’s lay the groundwork for propagating the remarks added into the in-memory storage of person data. We achieve that by working with the `Person` model. Each field in a Person is implemented as a separate class (e.g. a `Name` object represents the person’s name). That means we should add a `Remark` class so that we can use a `Remark` object to represent a remark given to a person. +Now that we have all the information that we need, let’s lay the groundwork for propagating the remarks added into the in-memory storage of student 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 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-af2f075d24dfcd333876f0fbce321f25). Note how `Remark` has no constrains and thus does not require input validation. @@ -237,7 +237,7 @@ 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-0c6b6abcfac8c205e075294f25e851fe). @@ -308,9 +308,9 @@ Just add [this one line of code!](https://github.com/se-edu/addressbook-level3/c **`PersonCard.java`:** ``` java -public PersonCard(Person person, int displayedIndex) { +public PersonCard(Person student, int displayedIndex) { //... - remark.setText(person.getRemark().value); + remark.setText(student.getRemark().value); } ``` @@ -340,23 +340,23 @@ save it with `Model#setPerson()`. throw new CommandException(Messages.MESSAGE_INVALID_PERSON_DISPLAYED_INDEX); } - Person personToEdit = lastShownList.get(index.getZeroBased()); - Person editedPerson = new Person(personToEdit.getName(), personToEdit.getPhone(), personToEdit.getEmail(), - personToEdit.getAddress(), remark, personToEdit.getTags()); + Person studentToEdit = lastShownList.get(index.getZeroBased()); + Person editedStudent = new Person(studentToEdit.getName(), studentToEdit.getPhone(), studentToEdit.getEmail(), + studentToEdit.getAddress(), remark, studentToEdit.getTags()); - model.setPerson(personToEdit, editedPerson); + model.setPerson(studentToEdit, editedStudent); model.updateFilteredPersonList(PREDICATE_SHOW_ALL_PERSONS); - return new CommandResult(generateSuccessMessage(editedPerson)); + return new CommandResult(generateSuccessMessage(editedStudent)); } /** * Generates a command execution success message based on whether the remark is added to or removed from - * {@code personToEdit}. + * {@code studentToEdit}. */ - private String generateSuccessMessage(Person personToEdit) { + private String generateSuccessMessage(Person studentToEdit) { String message = !remark.value.isEmpty() ? MESSAGE_ADD_REMARK_SUCCESS : MESSAGE_DELETE_REMARK_SUCCESS; - return String.format(message, personToEdit); + return String.format(message, studentToEdit); } ``` diff --git a/docs/tutorials/RemovingFields.md b/docs/tutorials/RemovingFields.md index aa8e0baaad9..41b18f0512c 100644 --- a/docs/tutorials/RemovingFields.md +++ b/docs/tutorials/RemovingFields.md @@ -20,7 +20,7 @@ Fortunately, IntelliJ IDEA provides a robust refactoring tool that can identify ### Assisted refactoring -The `address` field in `Person` is actually an instance of the `seedu.address.model.person.Address` class. Since removing the `Address` class will break the application, we start by identifying `Address`'s usages. This allows us to see code that depends on `Address` to function properly and edit them on a case-by-case basis. Right-click the `Address` class and select `Refactor` \> `Safe Delete` through the menu. +The `address` field in `Person` is actually an instance of the `seedu.address.model.student.Address` class. Since removing the `Address` class will break the application, we start by identifying `Address`'s usages. This allows us to see code that depends on `Address` to function properly and edit them on a case-by-case basis. Right-click the `Address` class and select `Refactor` \> `Safe Delete` through the menu. ![Usages detected](../images/remove/UnsafeDelete.png) @@ -75,7 +75,7 @@ private Label address; ...