PROJECT: Mod Manager

Overview

Mod Manager is a desktop application that assists NUS students in managing tasks, schedules, and contacts for their modules in a semester. Our team, which consists of five software developers, took over an existing desktop Java application Address Book (Level 3) with about 6 KLoC and evolve it into our Mod Manager with more than 10 KLoC. The project spans over a period of eight weeks, where each of us idealise and design the product, utilise CI/CD for weekly project enhancements, implement features and functionality, write documentation (User Guide & Developer Guide), and take part in Quality Assurance.

Technologies: Java, JavaFx, GitHub, Intellij IDEA

The following sections document all the contributions that I have made to Mod Manager.

Summary of contributions

  • Code contributed: I personally contributed almost 4 KLoC to Mod Manager. All my code contributions can be found here.

  • Major enhancement: idealise and design the Task component of Mod Manager. The Task component allows NUS students to manage their tasks, such as programming assignments, homework, tutorials, reviewing lecture content, exam revision for their respective modules in a semester. Implement most of the commands available for the Task component of Mod Manager.

    • What it does: every Task has a description, a time frame (for example, 13/04/2020 23:59), and a Module it belongs to. It allows users to organise and manage their tasks easier, with commands such as CRUD, mark the task as completed, view uncompleted tasks, view tasks by Module, find Task by its description, and search for a Task by its date, month, or year.

    • Justification: This feature improves the product significantly because every NUS student has a lot of things to do in the semester, and Task management offers a way for them to plan, and manage their tasks better. The Task component blends in well with Mod Manager and its other components, for example, every Task is allocated to an academic Module .

    • Highlights: The implementation of the project is tedious. It required a great amount of effort to understand the original AddressBook (Level 3) code given in order to morph and build upon this original project. Every small increment in the Task features require changes to multiple existing parts of the code, which requires using debugging tools and tracing the code to understand the code execution sequence. For example, with a small change in the Task class design, multiple JUnit test cases and data Storage design need to be changed. The Task component also has some dependencies on other components, as well as multiple other components have dependencies on the Task component. This requires good communication skills between the team to notify each other every time the high-level design of Task or other components change, even with just a slight change. The Task component also required an in-depth analysis of design alternatives, which lead to incremental changes over the period of the project. For the commands implemented, input validation and data formatting is critical to avoid unexpected behaviours to our application.

    • Credits: The idea is adapted from AddressBook (Level 3) and the Duke project. Huge thanks to my teammates who have gave feedback and improved on the design of the Task, which includes making it more OOP to integrate it better with the rest of the application, and adding the taskId feature to support the identification of tasks in our Task commands.

  • Minor enhancement: design and implement the UI to represent a Task. The design is useful for the value proposition of the product, as it helps you to recognise what tasks are completed and what are not easily.

Dark red color indicates a task that is not yet done.

TaskCardNotDone

Green color indicates a task that is already completed.

TaskCardDone
  • Other contributions:

    • Project management: mainly responsible for managing deadlines and deliverables for our team.

      • Ensure that all milestone progress are reached (which includes team-based and individual-based tasks). We managed to achieve more than 90% of the recommended milestone tasks, much higher than the minimum requirement of 60% of the class.

      • Managed releases v1.2 and v1.2.1 on GitHub

      • Maintained the issue tracker and milestones for team repo

    • Enhancements to existing features:

      • Design and update the UI color scheme for a Task (PR #128)

      • Wrote extensive tests for Task component, maintaining test coverage of around 90% for my components as shown here and here for a command.

    • Documentation:

      • Initiate the "Command Summary" section of the User Guide, and cosmetic tweaks to existing contents of the User Guide, PR #13

      • Revise sections of the Developer Guide, PRs #204, #212

    • Community:

      • Reported bugs and suggestions for other teams in the class (1, 2, and 3)

      • Resolved multiple merge conflicts when integrating code with upstream repo (PRs #204, #192, #128, #111, #107, #81, #44 )

Contributions to the User Guide

Given below are some sections I contributed to the User Guide. They comprise some of the commands for the Task component. They showcase my ability to write documentation targeting end-users.

For your easier understanding of the content below, every Task in a Module has an ID, which uniquely identifies the task in the module. The ID is important for us to differentiate a task from the others in the Module, since two Task s may have the same description and time frame. The Task component uses Singapore’s standard date format (dd/MM/yyyy).

Marking a task as done (Bao)

You can mark the task as done in the module in Mod Manager.

A newly added task will be not done by default.
Editing a task will not change the done/not done status of the task.
Tasks that are already marked as done cannot be re-marked as done.

Format:

  • task done /code MOD_CODE /id ID_NUMBER

Command properties:

  • MOD_CODE should belong to a valid and existing module in Mod Manager.

  • ID_NUMBER should belong to a valid task for the module above.

Example:

You can mark a task as done in the module. To mark the task with task ID ID_NUMBER in module MOD_CODE to be done, you can type in the following command:

task done /code CS2105 /id 224 and hit Enter

TaskDoneBeforeCloseUp
Figure 1. Before task done /code CS2105 /id 224
TaskDoneAfterCloseUp
Figure 2. After task done /code CS2105 /id 224

The task card has changed to green; which means our task has been marked as done. Hooray! We just completed a task.

Finding tasks by description (Bao)

You are browsing through the task list. But there are too many tasks! You suddenly remember a specific task that you want to do, but you can only vaguely remember its description, e.g. something related to assignment.

This command is exactly what you need. In your case, you can find all tasks that contain the word assignment, which may include Programming Assignment, written assignment, Take-home Lab Assignment (note that it can be case-insensitive). If you remember multiple words in your wanted tasks, you may also type in multiple words as you want. Tasks that meet at least one of the keywords you provided will be shown to you.

Format:

  • task find DESCRIPTION [MORE_DESCRIPTIONS]…​

Command properties:

  • The find works across modules, so no /code command are required. For example, you may want to find all the assignment currently due.

  • Searching for description is case insensitive. e.g programming will match Programming.

  • The order of the descriptions does not matter. e.g. Programming Assignment will match Assignment Programming.

  • Tasks are only searched in the description.

  • Words can be partially matched e.g. assign will match assignment.

  • Tasks matching at least one description will be returned (i.e. OR search). e.g. assign home will return both Programming Assignment 2 and Homework 3.

Examples:

To find tasks that contain the word oral, assign, or tut in their description, you can type in the following command:

task find oral assign tut and press Enter

TaskFindAfter
Figure 3. After task find oral assign tut, all matching tasks are displayed

Explanation:
- Oral Presentation 2 contains Oral which matches oral (case-insensitive).
- Programming Assignment 2 contains Assignment which matches assign (case-insensitive, and words can be partial match)
- Similarly, Assignment 3 will match assign, and Tutorial will match tut
- As long as a task’s description matches one of the keywords provided, it will be shown.

You can try typing in task find assign tut oral and press Enter. This will return the same list of tasks, since the ordering of the keywords does not matter.

Other examples:

  • task find homework
    Finds all tasks that contain the word homework in their description

  • task find math coding
    Finds all tasks that contain the word math or coding in their description

Contributions to the Developer Guide

I idealised and designed the Task component, and then implemented most of the commands for this component.

Given below are some sections I contributed to the Developer Guide. They showcase my ability to write technical documentation and the technical depth of my contributions to the project._

Implementation, Task Component

Marking a task as done (Bao)

The marking a task as done command allows users to mark a certain Task in a Module as done, based on its task ID called taskNum. This feature is facilitated by TaskCommandParser, TaskMarkAsDoneCommandParser and TaskMarkAsDoneCommand. The operation is exposed in the Model interface as Model#setTask().

Given below is an example usage scenario and how the marking task as done mechanism behaves at each step.

  1. The user executes the task mark as done command and provides the moduleCode and the taskNum of the task to be marked as done.

  2. TaskMarkAsDoneCommandParser creates a new TaskMarkAsDoneCommand based on the moduleCode and taskNum.

  3. LogicManager executes the TaskMarkAsDoneCommand.

  4. TaskMarkAsDoneCommand retrieves the moduleCode and taskNum of the task to be marked as done, and then retrieves the currently existing Task from ModManager.

  5. TaskMarkAsDoneCommand creates a clone of the retrieved Task, then mark this new Task as done.

  6. ModManager sets the existing task to the new task, marked as done in the UniqueTaskList.

  7. ModelManager updates the filteredTasks in ModelManager.

The following sequence diagram shows how the task mark as done command works:

TaskMarkAsDoneSequenceDiagram
Figure 4. Sequence Diagram for task done /code CS2103T /id 986 Command
The lifeline for TaskCommandParser, TaskMarkAsDoneCommandParser, and TaskMarkAsDoneCommand should end at the destroy marker (X) but due to a limitation of PlantUML, the lifeline reaches the end of the diagram.

The following activity diagram summarizes what happens when a user executes the task mark as done command:

TaskMarkAsDoneActivityDiagram
Figure 5. Activity Diagram for task done Command
Finding tasks by description (Bao)

The find task feature allows users to find a task by its description in Mod Manager. This feature is facilitated by TaskCommandParser, TaskFindCommandParser and TaskFindCommand. The operation is exposed in the Model interface as Model#updateFilteredTaskList().

Given below is an example usage scenario and how the task find mechanism behaves at each step:

  1. The user executes the task find command and provides the descriptions of the tasks to search for.

  2. TaskFindCommandParser creates a new TaskFindCommand based on the descriptions.

  3. LogicManager executes the TaskFindCommand.

  4. ModelManager updates the filteredTasks in ModelManager.

The following sequence diagram shows how the task find command works:

TaskFindSequenceDiagram
Figure 6. Sequence Diagram for task find assignment homework Command
The lifeline for TaskCommandParser, TaskFindCommandParser, TaskFindCommand and TaskContainsKeywordsPredicate should end at the destroy marker (X) but due to a limitation of PlantUML, the lifeline reaches the end of the diagram.

The following activity diagram summarizes what happens when a user executes a task find command:

TaskFindActivityDiagram
Figure 7. Activity Diagram for task find Command

PROJECT: PowerPointLabs