diff --git a/docs/DeveloperGuide.md b/docs/DeveloperGuide.md index 1560a55d813..24f63649857 100644 --- a/docs/DeveloperGuide.md +++ b/docs/DeveloperGuide.md @@ -264,99 +264,6 @@ Step 1. The user launches the application, which is populated with a list of the Step 2. The user executes `grade 87654321 m/CS2103T g/A` command to assign an A `Grade` to Bernice's CS2103T `Module`. Bernice now has a CS2103T `Module` graded A in their list of modules. -### \[Proposed\] Undo/redo feature - -#### Proposed Implementation - -The proposed undo/redo mechanism is facilitated by `VersionedAddressBook`. It extends `AddressBook` with an undo/redo history, stored internally as an `addressBookStateList` and `currentStatePointer`. Additionally, it implements the following operations: - -* `VersionedAddressBook#commit()` — Saves the current address book state in its history. -* `VersionedAddressBook#undo()` — Restores the previous address book state from its history. -* `VersionedAddressBook#redo()` — Restores a previously undone address book state from its history. - -These operations are exposed in the `Model` interface as `Model#commitAddressBook()`, `Model#undoAddressBook()` and `Model#redoAddressBook()` respectively. - -Given below is an example usage scenario and how the undo/redo mechanism behaves at each step. - -Step 1. The user launches the application for the first time. The `VersionedAddressBook` will be initialized with the initial address book state, and the `currentStatePointer` pointing to that single address book state. - - - -Step 2. The user executes `delete 12345678` command to delete the person with Student ID of `12345678` in the address book. The `delete` command calls `Model#commitAddressBook()`, causing the modified state of the address book after the `delete 12345678` command executes to be saved in the `addressBookStateList`, and the `currentStatePointer` is shifted to the newly inserted address book state. - - - -Step 3. The user executes `add id/12345678 …​` to add a new person. The `add` command also calls `Model#commitAddressBook()`, causing another modified address book state to be saved into the `addressBookStateList`. - - - - - -**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`. - - - -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. - - - - - - -**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 sequence diagram shows how an undo operation goes through the `Logic` component: - - - - - -**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. - - - -Similarly, how an undo operation goes through the `Model` component is shown below: - - - -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. - - - -**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. - - - -Step 5. The user then decides to execute the command `list`. Commands that do not modify the address book, such as `list`, will usually not call `Model#commitAddressBook()`, `Model#undoAddressBook()` or `Model#redoAddressBook()`. Thus, the `addressBookStateList` remains unchanged. - - - -
- -Step 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. - - - -The following activity diagram summarizes what happens when a user executes a new command: - - - -#### Design considerations: - -**Aspect: How undo & redo executes:** - -* **Alternative 1 (current choice):** Saves the entire address book. - * Pros: Easy to implement. - * Cons: May have performance issues in terms of memory usage. - -* **Alternative 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. - -------------------------------------------------------------------------------------------------------------------- @@ -378,12 +285,13 @@ The following activity diagram summarizes what happens when a user executes a ne **Target user profile**: -* Tertiary Teacher/Educator -* has a need to manage a significant number of contacts -* requires a tool to keep communication organised across large groups -* requires support for efficient tracking of academic progress +* Teachers in tertiary institutions. +* Has a need to manage a significant number of contacts. +* Requires a tool to keep communication organised across large groups. +* Requires dedicated support for tracking of academic progress. +* Prefers typing and is familiar with command-line interfaces. -**Value proposition**: save important time through simplification of student-parent contact management, enhancement in communication tracking and integrated progress reports +**Value proposition**: Provides teachers comfortable with CLI-based interfaces an efficient platform for contact management and student academic progress tracking.
@@ -391,29 +299,27 @@ The following activity diagram summarizes what happens when a user executes a ne Priorities: High (must have) - `* * *`, Medium (nice to have) - `* *`, Low (unlikely to have) - `*` -| Priority | As a …​ | I want to …​ | So that I can…​ | -|----------|--------------------|------------------------------------------------|-----------------------------------------------------------------------------| -| `* * *` | new teacher | add a contact | keep track of them | -| `* * *` | teacher | delete a contact | remove contacts that I no longer need | -| `* * *` | teacher | add a grade to a contact | keep track of a student's grades | -| `* * *` | teacher | add a student's details | keep track of the students under me | -| `* *` | teacher | edit a contact | update contact information without having to delete it | -| `* *` | teacher | search for a contact | find the contact I am looking for without having to scroll through the list | -| `* *` | frequent teacher | add tags or labels to contacts | group the many contacts that are in the application by a commonality | -| `* *` | frequent teacher | filter contacts by labels or tags | filter out irrelevant contacts | -| `* *` | frequent teacher | mass add contacts | add multiple contacts without having to do so one by one | -| `* *` | frequent teacher | mass delete contacts | delete multiple contacts without having to do so one by one | -| `* *` | teacher | add next of kins' contacts | contact the relevant individual in case of emergencies | -| `*` | frequent teacher | do custom sorts for contacts | shift relevant contacts near the top of the list of contacts | -| `*` | new teacher | see guided tours and tooltips | familiarise myself with the application interface | -| `*` | long-time teacher | archive contacts | reduce clutter in the application without permanently deleting the contact | -| `*` | long-time teacher | refactor tags or labels | mass edit tags or labels if necessary | -| `*` | new teacher | see the application populated with sample data | see what the application interface looks like | -| `*` | frequent teacher | add descriptions to contacts | be reminded of various traits a particular individual might have | -| `*` | frequent teacher | undo previous action | undo a mistake without having to delete or edit any contacts | -| `*` | long-time teacher | export contact data | have a backup data file in case anything happens to the application | -| `*` | long-time teacher | import contact data | load data from a file to restore lost or missing data | -| `*` | long-time teacher | access communication history | be well-prepared for upcoming meetings | +| Priority | As a …​ | I want to …​ | So that I can…​ | +|----------|----------------------------|---------------------------------------------------------------------|--------------------------------------------------------------------------------------------------------| +| `* * *` | teacher | add a contact | have easy access to contacts | +| `* * *` | teacher | delete a contact | remove contacts that I no longer need | +| `* * *` | teacher | add contact details like email, address, phone number, modules etc. | keep track of my contacts' details | +| `* * *` | teacher | assign a grade to a module that my student is taking | keep track of a student's grades and academic progress | +| `* * *` | teacher | view contact information | have a clear visual reference for contact information | +| `* *` | teacher | edit a contact | update contact information without having to delete it | +| `* *` | teacher | search for a contact | find the contact I am looking for without having to scroll through the list | +| `* *` | teacher | add roles/tags to contacts | group the many contacts that are in the application by their type (e.g. student, tutor etc.) | +| `* *` | teacher | filter contacts by labels or tags | have an easy visual reference with irrelevant contacts filtered out | +| `* *` | new user | access a page that teaches me how to use the application | familiarise myself with the application interface | +| `* *` | efficient CLI user | navigate command history (like in other CLI-based applications) | easily load previously entered commands without having to re-type commands from scratch (to save time) | +| `*` | new user | see the application populated with sample data | see what the application interface looks like | +| `*` | mistake-prone user | undo previous action | undo a mistake without having to delete or edit any contacts | +| `*` | teacher with many contacts | perform mass operations on contacts | perform operations (add, edit, delete etc.) on multiple contacts without having to do so one by one | +| `*` | organised teacher | archive contacts | reduce clutter in the application without permanently deleting the contact | +| `*` | careful teacher | export contact data | have a backup data file in case anything happens to the application | +| `*` | careful teacher | import contact data | load data from a file to restore lost or missing data | + +
@@ -421,26 +327,30 @@ Priorities: High (must have) - `* * *`, Medium (nice to have) - `* *`, Low (unli (For all use cases below, the **System** is the `EduContacts` and the **Actor** is the `user`, unless specified otherwise) -**Use case: UC01 - Add a student** +--- + +#### UC01 - Add a contact **MSS** -1. User adds a student to the list of contacts. +1. User adds a contact to the list of contacts. 2. EduContacts updates the list of contacts. Use case ends. **Extensions** -* 1a. EduContacts detects an error in the given data. +* 1a. EduContacts detects an error in the user input. - * 1a1. EduContacts shows an error message. + * 1a1. EduContacts provides an appropriate error message as feedback to user. Use case ends. -**Use case: UC02 - Search for a student** +--- + +#### UC02 - Search for a student -**Preconditions: The list of contacts is not empty** +**Preconditions:** The list of contacts is not empty. **MSS** @@ -451,156 +361,116 @@ Priorities: High (must have) - `* * *`, Medium (nice to have) - `* *`, Low (unli **Extensions** -* 1a. EduContacts detects an error in the given data. +* 1a. EduContacts detects an error in the user input (command format, student does not exist etc.). - * 1a1. EduContacts shows an error message. + * 1a1. EduContacts provides an appropriate error message as feedback to user. Use case ends. -* 2a. EduContacts is unable to locate the student. - - Use case ends. +--- -**Use case: UC03 - Add a grade for a student** +#### UC03 - Add a module to a student** **MSS** -1. User searches for the student (UC02) they wish to add a grade for. -2. User adds a grade for the student. + +1. User searches for the student (UC02) they wish to add a module for. +2. User adds a module to the student in the list. 3. EduContacts updates the list of contacts. Use case ends. **Extensions** -* 1a. User is unable to locate the student. +* 1a. EduContacts detects an error in the user input (command format, student does not exist, duplicate module etc.). - Use case ends. + * 1a1. EduContacts provides an appropriate error message as feedback to user. -* 2a. EduContacts detects an error in the given data. + Use case ends. - * 2a1. EduContacts shows an error message. +--- - Use case ends. +#### UC04 - Add a grade for a student -**Use case: UC04 - Delete a student** +**Preconditions:** The student has a module already added (UC03). **MSS** - -1. User searches for the student (UC02) they wish to delete from the list. -2. User deletes the student in the list. +1. User searches for the student (UC02) they wish to add a grade for. +2. User adds a grade for the student. 3. EduContacts updates the list of contacts. Use case ends. **Extensions** -* 1a. User is unable to locate the student. - - Use case ends. +* 1a. EduContacts detects an error in the user input (command format, student or module does not exist etc.). -* 2a. EduContacts detects an error in the given data. - - * 2a1. EduContacts shows an error message. + * 1a1. EduContacts provides an appropriate error message as feedback to user. Use case ends. -**Use case: UC05 - Edit a student's details** - -**MSS** - -1. User searches for the student (UC02) they wish to edit. -2. User edits the details of the student in the list. -3. EduContacts updates the list of contacts. - - Use case ends. - -**Extensions** - -* 1a. User is unable to locate the student. - - Use case ends. -* 2a. EduContacts detects an error in the given data. +* 2a. The module is already graded. - * 2a1. EduContacts shows an error message. + * 2a1. EduContacts overwrites the old grade with the new grade. Use case ends. -**Use case: UC06 - Add a module to a student** +--- + +#### Use case: UC05 - Delete a student **MSS** -1. User searches for the student (UC02) they wish to add a module for. -2. User adds a module to the student in the list. +1. User searches for the student (UC02) they wish to delete from the list. +2. User deletes the student in the list. 3. EduContacts updates the list of contacts. Use case ends. **Extensions** -* 1a. User is unable to locate the student. - - Use case ends. +* 1a. EduContacts detects an error in the user input (command format, student does not exist etc.). -* 2a. EduContacts detects an error in the given data. - - * 2a1. EduContacts shows an error message. + * 1a1. EduContacts provides an appropriate error message as feedback to user. Use case ends. -* 2b. Student already has the module. - - * 2b1. EduContacts shows an error message. - - Use case ends. +--- -**Use case: UC07 - Grade a student** +#### Use case: UC06 - Edit a student's details **MSS** -1. User searches for the student (UC02) they wish to grade. -2. User grades a module the student is taking. +1. User searches for the student (UC02) they wish to edit. +2. User edits the details of the student in the list. 3. EduContacts updates the list of contacts. Use case ends. **Extensions** -* 1a. User is unable to locate the student. +* 1a. EduContacts detects an error in the user input (command format, student does not exist etc.). - Use case ends. - -* 2a. EduContacts detects an error in the given data. - - * 2a1. EduContacts shows an error message. + * 1a1. EduContacts provides an appropriate error message as feedback to user. Use case ends. -* 2b. The module is already graded. - - * 2b1. EduContacts overwrites the old grade with the new grade. - - Use case ends. +--- -**Use case: UC08 - Add contacts of next-of-kins of a student** +#### UC07 - Filter contacts based on properties **MSS** -1. User searches for the student (UC02) they wish to add contacts of next-of-kins for. -2. User adds contacts of next-of-kins of the student in the list. -3. EduContacts updates the list of contacts. +1. User provides a set of contact-related conditions. +2. EduContacts updates the list view to show contacts matching the provided conditions. Use case ends. **Extensions** -* 1a. User is unable to locate the student. - - Use case ends. +* 1a. EduContacts detects an error in the user input (command format etc.). -* 2a. EduContacts detects an error in the given data. - - * 2a1. EduContacts shows an error message. + * 1a1. EduContacts provides an appropriate error message as feedback to user. Use case ends. @@ -684,71 +554,196 @@ testers are expected to do more *exploratory* testing. ### Launch and shutdown -1. Initial launch +#### Initial launch + +1. Ensure you have Java `17` or above installed in your computer. + [Download Java here](https://www.oracle.com/sg/java/technologies/downloads/) if you haven't already. + + Note that Mac users should use the specific Azul JDK 17 distribution specified in [this guide](https://se-education.org/guides/tutorials/javaInstallationMac.html). - 1. Download the jar file and copy into an empty folder. +2. Download the latest `.jar` file from [here](https://github.com/AY2425S1-CS2103T-F15-2/tp/releases). - 2. Double-click the jar file.
- Expected: Shows the GUI with a set of sample contacts. The window size may not be optimum. +3. Copy the file to the folder you want to use as the home folder for your EduContacts. + +4. To run EduContacts, open a command terminal. + + To navigate to the folder where you placed the `.jar` file, use the `cd` command. For example, if you placed the file in a folder named `EduContacts` on your desktop, you would enter: + + ```bash + cd ~/Desktop/EduContacts + ``` + + and use the following command to run the application: + + ```bash + java -jar educontacts.jar + ``` + + A GUI similar to the screenshot below should appear in a few seconds. Note how the app contains some sample data.
+ + ![Ui](images/Ui.png) + +--- -2. Saving window preferences +#### Saving window preferences - 1. Resize the window to an optimum size. Move the window to a different location. Close the window. +1. Resize the window to an optimum size. Move the window to a different location. Close the window. - 2. Re-launch the app by double-clicking the jar file.
- Expected: The most recent window size and location is retained. +2. Re-launch the app by double-clicking the jar file.
+ Expected: The most recent window size and location is retained.
-### Deleting a person +### Commands Testing -1. Deleting a person while all persons are being shown +#### Help Command - 1. Prerequisites: List all persons using the `list` command. Multiple persons in the list. One person in the list has Student ID `12345678`. +**Opening the help window** +* **Test case:** `help` +* **Expected:** The help window opens, displaying a comprehensive list of available commands and their usage. - 2. Test case: `delete 12345678`
- Expected: Person with Student ID `12345678` is deleted. Details of the deleted contact shown in the status message. Timestamp in the status bar is updated. +**Using the help button** +* **Test case:** Click the "Help" button in the application GUI. +* **Expected:** The help window opens, displaying a comprehensive list of available commands and their usage. - 3. Test case: `delete 1234 5678`
- Expected: No person is deleted. Error details shown in the status message. Status bar remains the same. +#### Add Command - 4. Other incorrect delete commands to try: `delete`, `delete x`, `...` (where x is a Student ID that no student in the list has)
- Expected: Similar to previous. +**Adding a valid person** +* **Test case:** `add 12345678 n/John Doe p/91234567 e/johndoe@example.com a/123 Example Street c/Computer Science r/Student` +* **Expected:** A new contact is added with the specified details. The list now includes the new contact, and a success message is shown. -2. Deleting a person while only one person is being shown +**Adding a duplicate person** +* **Prerequisites:** The person to add already exists in the list with the same Student ID `12345678`. +* **Test case:** `add 12345678 n/John Doe p/91234567 e/johndoe@example.com a/123 Example Street c/Computer Science r/Student` +* **Expected:** The addition fails, and an error message about the duplicate Student ID is shown. - 1. Prerequisites: Filter persons using the `filter` command until only one person remains. Multiple persons in the list. Person that remains has Student ID `12345678`. One person in the list has Student ID `11111111` +--- + +#### Edit Command + +**Editing an existing person** +* **Prerequisites:** List contains a person with Student ID `12345678`. +* **Test case:** `edit 12345678 p/98765432` +* **Expected:** The contact's phone number is updated to `98765432`. The updated details are shown in the success message. + +**Editing a non-existing person** +* **Prerequisites:** List does not contain a person with Student ID `00000000` +* **Test case:** `edit 00000000 p/98765432` +* **Expected:** The edit fails, and an error message about the non-existent Student ID is shown. + +**Editing with invalid input** +* **Test case:** `edit 12345678 p/invalidPhoneNumber` +* **Expected:** The edit fails, and an error message about the invalid phone number format is shown. + +--- + +#### Filter Command + +**Filter by name** +* **Test case:** `filter n/John` +* **Expected:** The list shows all persons with "John" in their name. A success message is shown. + +**Filter by course** +* **Test case:** `filter c/Computer Science` +* **Expected:** The list shows all persons enrolled in "Computer Science." A success message is shown. + +**Filter by multiple attributes** +* **Test case:** `filter n/John c/Computer Science` +* **Expected:** An error message about invalid multiple filter conditions is shown. + +--- + +#### Module Command + +**Adding a module to an existing person** +* **Prerequisites:** List contains a person with Student ID `12345678`. +* **Test case:** `module 12345678 m/CS2103T` +* **Expected:** The module "CS2103T" is added to the person's module list. A success message is shown. + +**Adding a duplicate module** +* **Prerequisites:** The person already has "CS2103T" as a module. +* **Test case:** `module 12345678 m/CS2103T` +* **Expected:** The addition fails, and an error message about the duplicate module is shown. + +--- + +#### Grade Command - 2. Test case: `delete 12345678`
- Expected: Person with Student ID `12345678` is deleted. Details of the deleted contact shown in the status message. Timestamp in the status bar is updated. List of persons shown is now blank. +**Adding a grade to a module** +* **Prerequisites:** The person with Student ID `12345678` has "CS2103T" in their module list. +* **Test case:** `grade 12345678 m/CS2103T g/A` +* **Expected:** The grade "A" is assigned to "CS2103T." A success message is shown. - 3. Test case: `delete 11111111`
- Expected: No person is deleted. Error details shown in the status message. Status bar remains the same. +**Adding a grade to a non-existent module** +* **Test case:** `grade 12345678 m/CS9999 g/B` +* **Expected:** The addition fails, and an error message about the non-existent module is shown. -3. Deleting a person while no persons are in the list +**Adding an invalid grade** +* **Test case:** `grade 12345678 m/CS2103T g/Z` +* **Expected:** The addition fails, and an error message about the invalid grade is shown. - 1. Prerequisites: Delete all persons in the list using the `clear` command. +--- + +#### Find Command + +**Finding an existing person** +* **Test case:** `find 12345678` +* **Expected:** The contact details of the person with Student ID `12345678` are shown in the result panel. + +**Finding a non-existing person** +* **Test case:** `find 00000000` +* **Expected:** An error message about the non-existent Student ID is shown. + +--- + +#### Clear Command + +**Clearing all entries** +* **Test case:** `clear` +* **Expected:** All persons are removed from the list. A success message is shown. + +--- + +#### Exit Command + +**Exiting the application** +* **Test case:** `exit` +* **Expected:** The application closes successfully without errors. + +--- + +#### Navigating Command History +**Navigating to previous commands** +* **Test case:** Execute several successful commands (e.g., `list`, `add 12345678 n/John Doe p/91234567 e/johndoe@example.com a/123 Example Street c/Computer Science r/Student`, `filter n/John`). +Then, press the UP arrow key in the Command Box. +* **Expected:** Each press of the UP arrow key navigates backward through the previously executed commands, displaying them in the Command Box. + +**Navigating to next commands** +* **Prerequisites:** Use the UP arrow key to navigate to a previous command in the Command Box. +* **Test case:** Press the DOWN arrow key. +* **Expected:** Each press of the DOWN arrow key navigates forward through the command history until the most recent command is displayed. +If no newer commands exist, the Command Box becomes empty. - 2. Test case: `delete 12345678`
- Expected: No person is deleted. Error details shown in the status message. Status bar remains the same.
### Saving data -1. Dealing with missing data files +#### Dealing with missing data files + +1. To simulate a missing file, in the same folder as the jar file, navigate to the `data` folder and delete the `address.json` file in the folder. - 1. To simulate a missing file, in the same folder as the jar file, navigate to the `data` folder and delete the `address.json` file in the folder. +2. Launch EduContacts by double-clicking the jar file.
+ Expected: EduContacts is populated by a set of default list of persons. A new `address.json` file will be created in the `data` folder after closing the app or executing a command. - 2. Launch EduContacts by double-clicking the jar file.
- Expected: EduContacts is populated by a set of default list of persons. A new `address.json` file will be created in the `data` folder after closing the app or executing a command. +--- -2. Dealing with corrupted data files +#### Dealing with corrupted data files - 1. To simulate a corrupted file, navigate to the `data` folder and remove a curly brace at the end of the file. +1. To simulate a corrupted file, navigate to the `data` folder and remove a curly brace at the end of the file. - 2. Launch EduContacts by double-clicking the jar file.
- Expected: EduContacts has a blank list of persons. A new `address.json` file will be created in the `data` folder after closing the app or executing a command. +2. Launch EduContacts by double-clicking the jar file.
+ Expected: EduContacts has a blank list of persons. A new `address.json` file will be created in the `data` folder after closing the app or executing a command. -------------------------------------------------------------------------------------------------------------------- @@ -777,28 +772,211 @@ Our project requires a relative high level of understanding of the code base. Du ## **Appendix: Planned Enhancements** -### Data archiving - -* Description: Allow users to move inactive or irrelevant entries to an archive. -* Benefits: +### **Known Issues** + +The following are current known issues with the application that have been identified. The implementation for the fixes +for these issues have been deferred for future iterations due to certain considerations that will be elaborated +in further detail for each issue. + +#### Fix `help` command popup window issue +* **Known Issue:** On some platforms (especially MacOS), when using the application in full screen, +running the `help` command and closing the popup window repeatedly in quick succession may cause the application +to hang or crash. +* **Enhancement:** + * Improve the reliability and robustness of the help command by implementing + better resource management and concurrency handling. + * Note that the decision to move the help window away from being a popup and instead display it within the main window was + considered, but ultimately rejected as the team feels that the help page adds more value when it is outside of the + main application GUI, so that users can reference it easily. +* **Benefits:** + * Enhances the overall user experience by preventing application crashes, ensuring smooth and + uninterrupted usage of the application. + * Helps future iterations by laying the groundwork for robust window management, + potentially benefiting other UI-related commands. +* **Justification for Deferral:** + * The issue occurs only under specific conditions (repeated execution of the help command in quick succession + while in full screen), making it a relatively low-priority bug compared to other critical + functionalities of the application. + * Fixing this issue would require a significant amount of effort to implement comprehensive resource management and + concurrency controls, potentially diverting time and resources away from higher-priority enhancements. + * The current implementation is sufficient for most standard use cases, and addressing this issue can be deferred + to a future iteration when higher-priority tasks are completed. + +### **Current Feature Flaws** + +The following are current feature flaws related to the design of the application that have been identified. These +feature flaws are not critical to the usability of the application for its intended use case, but rather highlight +potential mis-steps in the design process of the application by the development team. + +The implementation for the planned enhancements required to improve these feature flaws have been deferred for future iterations as the +development team feels that the effort required to fix these feature flaws outweighs their value add +to the user at this current stage of development. + +More details are included for each feature flaw below. + +#### Overly general error message +* **Feature Flaw:** Certain error messages provided as feedback to the user could be more specific or helpful. +Examples include (non-exhaustive): + * "Invalid command format" should not be used so extensively, and instead serve as a catch-all. + * `edit edit xxx` can have error message "Duplicate command word: `edit`". + * `find ID ID` can have error message "Duplicate `ID` detected, only one allowed". + * `filter c/Computer Science n/Crowe` can have error message "Only one filter condition allowed". + * "Unknown Command" can be more helpful. + * `test` can have error message "Unknown Command: `test`. Type `help` for list of commands.". +* **Enhancement:** Introduce a more granular exception handling mechanism to differentiate error scenarios and +provide tailored error feedback. This includes categorizing command errors (e.g., syntax errors, duplicate arguments +etc.) and defining specific messages that clearly indicate the nature of the issue to users. +* **Benefits:** + * Improves user experience by providing clearer and more actionable error messages, reducing user confusion + and frustration when entering incorrect commands. + * Enhances usability for new users who may rely heavily on accurate feedback to + learn the application’s command syntax, reducing the learning curve. +* **Justification for Deferral:** + * Some of the error messages act as functional placeholders for future planned features that + have yet to be implemented, (e.g. multiple filter conditions). + * Since error messages are not necessarily "wrong", refining the current system can be safely deferred + to a future iteration when more critical features and enhancements have been implemented. + * Developing a granular exception handling system requires substantial effort, including analyzing all commands, + categorizing errors, and designing specific error messages. This would consume time better spent on higher-priority + features. Additionally, implementing this enhancement when the application’s core feature set is more stable would + ensure that the effort is more worthwhile, as it would reduce the need for constant repeated modifications to the + error-handling system each time core features are tweaked. + +#### StudentID as duplicate detection mechanism +* **Feature Flaw:** All contacts are currently identified by their StudentID (the development team only considers + student teaching assistants as tutors for now). +* **Enhancement:** Introduce a more robust identification mechanism outside of student ID, that distinguishes between students +and other contact types. +* **Benefits:** + * Enhances flexibility in the application, allowing it to accommodate a broader range of use cases, such as + saving contacts of full-time staff, external collaborators, or other non-student roles. + * Eliminates the reliance on workarounds like dummy `StudentID`s, ensuring data integrity and reducing confusion + for users who manage diverse types of contacts. + * Supports scalability by preparing the application for future features or expansions that require + differentiation between contact roles. +* **Justification for Deferral:** + * Implementing this enhancement requires a substantial refactoring of the `Model`, `Storage` and `Logic` components + to introduce a more flexible contact identification and classification mechanism. This involves significant + structural changes, including updating data representation and storage, parsing logic, as well as + validation processes. + * The current system, while not ideal, provides sufficient functionality for managing students and student tutors, + which is the primary use case. Functionality for extended use cases are also possible with workarounds. + +#### `filter` command +* **Feature Flaw:** + * `filter` command currently only supports one condition + * Partial/Full matching for `filter` command depends on the field to be filtered. +* **Enhancement:** + * Implement filtering for multiple conditions, with toggle feature to choose between AND (strict search) vs OR (broad search) constraints. + * Implement toggle feature to filter based on partial or full matching. +* **Benefits:** + * Allows users to perform more complex and precise searches, improving the overall utility of the filter command. + * The ability to toggle between AND and OR constraints enables users to adapt the search behavior based on their + specific needs, such as finding contacts matching all conditions (strict search) or any condition (broad search). + * Introducing a toggle for partial vs full matching ensures uniformity and clarity in how the filter command operates, + reducing user confusion and enhancing predictability. +* **Justification for Deferral:** + * The current implementation of the filter command, while limited, provides sufficient functionality for + basic searches, making this enhancement a lower-priority task. + * Implementing support for multiple conditions and toggle options would require significant non-trivial changes to the + `Logic` and `Parser` components to handle advanced search constraints efficiently. + * The effort required to implement these enhancements outweighs the immediate benefit, especially when + weighed against higher-priority improvements or bug fixes currently in scope. + +#### Index functionality +* **Feature Flaw:** The current utility for indexing contacts is mostly as a visual aid. Commands like `edit` and `delete` +could utilise contact indexes to perform operations, instead of just using ID. +* **Enhancement:** Implement index as an alternative form of contact referencing, apart from ID. +* **Benefits:** + * Reduces the likelihood of errors caused by manually entering long or complex IDs, streamlining the execution of commands like edit and delete. + * Provides an alternative method for referencing contacts, allowing users to choose between index and ID based on convenience or preference. +* **Justification for Deferral:** + * Implementing index-based referencing requires substantial changes to the command format and `Logic` component, + including updates to parsing and validation mechanisms to support both index and ID inputs seamlessly. + * The current ID-based referencing, while less flexible, is functional and sufficient for most use cases, + making this enhancement a lower-priority task. + +#### Fixed role types +* **Feature Flaw:** + * Currently, only 2 role types are supported (`Student` and `Tutor`). + * Only one role is allowed per contact, causing ambiguity in the case where a student in one class is a tutor in another class. +* **Enhancement:** + * Update the role types supported to include specific roles such as `Colleague`, as well as general role types that + are customizable by the user. + * Allow contacts to have multiple roles as long as it makes sense (e.g. `Student` and `Tutor` is possible with + part-time student teaching assistants, but not `Student` and `Colleague` etc.). +* **Benefits:** + * Users can organize and manage contacts more effectively by categorizing them into specific roles, reducing ambiguity and making the contact list more intuitive. + * Supporting additional roles prepares the application for future enhancements, such as role-specific features (e.g., parent notifications or colleague collaboration tools). + * Allowing users to define a generic “Other” role provides them with the freedom to handle unique or unforeseen scenarios, increasing user satisfaction and engagement. +* **Justification for Deferral:** + * Implementing support for multiple and customizable roles requires significant modifications to the + `Model`, `Logic`, and `Storage` components, as well as updates to validation and command parsing. + * The current implementation meets the needs of the majority of users by supporting essential roles + (`Student` and `Tutor`) and enabling basic role tagging functionality, making this a lower-priority enhancement. + + +#### Fixed grading system +* **Feature Flaw:** The application currently only supports a fixed, letter-based grading system. +* **Enhancement:** Introduce a customizable grading system, allowing users to define their own grading schemes +(e.g., Pass/Fail, numerical scores, or specific grading scales used in different institutions). +* **Benefits:** Enables users to tailor the grading system to suit the requirements of different institutions, courses, or unique assessment systems. +* **Justification for Deferral:** + * Implementing a customizable grading system involves significant changes across the `Model`, `Storage`, `UI` and `Logic` components to + allow flexible input validation, data storage, and display formatting for grades. + * The current fixed grading system covers the majority of standard use cases and is sufficient for most users, + making this a lower-priority enhancement compared to other core functionalities. + +#### Fixed `Module` utility +* **Feature Flaw:** + * `Module` utility only supports users tracking contacts from across various modules that they teach. + * This may not add value to a small subset of users who, for example, only teach a particular module. These users may + instead want to use this feature as a way to track student assignment grades or class attendance. +* **Enhancement:** + * Expand the Module utility to allow customization based on user needs, such as tracking individual student + assignment grades, attendance, or specific module-related details. + * Provide users with a flexible tagging or attribute system for modules to accommodate varying use cases. +* **Benefits:** + * Allows users to adapt the Module utility to suit specific workflows, such as managing assignment grades or monitoring attendance. + * Prepares the application for potential expansions, such as module-level analytics or reporting features. +* **Justification for Deferral:** + * Implementing this enhancement would require significant modifications across the `Model`, `Storage`, `UI` and `Logic` components, + including changes to data structures and input validation to accommodate the added flexibility. + * The current implementation, while less customizable, sufficiently covers the primary use case of + tracking multiple modules and is functional for the majority of users, making this enhancement a lower-priority task. + + +### **New Features** + +#### `Undo` command +* **Description:** Allows users to revert the most recent change made to the application’s data. +* **Benefits** + * Provides users with the flexibility to correct mistakes quickly without manually re-entering data or commands. + * Minimizes the impact of accidental commands (e.g., mistakenly deleting or editing a contact). + * Reduces frustration and saves time for users by eliminating the need to redo lengthy or complex data modifications. + +#### Data archiving + +* **Description:** Allow users to move inactive or irrelevant entries to an archive. +* **Benefits:** * Reduces clutter in the main data set, making it easier to manage and navigate active records without losing historical data. * Lower the load on real-time data processing by isolating inactive records. * Retain archived data for historical records or compliance requirements. * Provide a safe way to store inactive data without risking deletion or loss. -### Importing contact data +#### Importing contact data -* Description: Allow users to import contact data from multiple formats (e.g. CSV, vCard) -* Benefits: +* **Description:** Allow users to import contact data from multiple formats (e.g. CSV, vCard) +* **Benefits:** * Saves time and effort by allowing users to easily populate the app with data, eliminating the need for manual data entry. * Maintain consistent contact records across different applications and devices. * Simplify the process for new users by letting them import contacts directly. * Enable users to restore contacts from external files in case of data loss. -### Exporting contact data +#### Exporting contact data -* Description: Allow users to export contact data to multiple formats (e.g. CSV, vCard) -* Benefits: +* **Description:** Allow users to export contact data to multiple formats (e.g. CSV, vCard) +* **Benefits:** * Allow users to easily transfer their contact information to other applications or storage solutions. * Provide users with the ability to create backups of their contact data. * Enable users to share their contact lists with others.