PROJECT: PrioriTask


Overview

PrioriTask is a desktop task manager application written in Java (10~20kLOC). It helps users manage their tasks and priorities through automatic priority updating and sorting. The application also features a calendar which provides users with a chronological overview of upcoming deadlines. The user interacts with PrioriTask by using a Command Line Interface (CLI), and has a Graphical User Interface (GUI) created with JavaFX.

PrioriTask used AddressBook-Level 4 as a base for development.

Summary of contributions

  • Major enhancement: added the Subtask management system

    • What it does: It allows users to split and manage their task separately. Support Adding, removing, editing, and setting status for each subtask.

    • Justification: This feature improves the product significantly because users will be able to better manage big tasks (epic) becuase they will be able to split those into smaller, more independent task.

    • Highlights: This enhancement affected four components : Model, Storage, Logic, and UI. UI component is touch only becuase we need to show the subtask somewhere on the ui. Most of the changes happened in the other three components. The most challenging part is to decide how the sutbask data structure will be implemented. Even though it is possible to use faster and more efficient data structure, limited time and the bug-prone nature of the algorithm pushed me to do a compromise between speed and code correctness.

  • Minor enhancement: added a Status parameter, and its corresponding toggle function.

    • What it does: It gives user ability to mark their task/subtask as completed or not completed

    • Justification: It helps user to differentiate completed task without actually deleting them.

    • Highlights: Mainly highlights the immutability of the task. Since I have to preserve the task immutability.

  • Code contributed: [Functional code] [Test code]

  • Other contributions:

    • Project initialization:

      • Refactor (renaming) 1669LOC before team starts development (Pull request #17).

    • Community:

      • Helped team member with git (Cleaning PR #67)

      • Reviewed some PRs on GitHub (with comments when required).

      • Reported bugs and suggestions for other teams in the class (Issues #113, #131, #130 and others).

Contributions to the User Guide

Given below are sections I contributed to the User Guide. They showcase my ability to write documentation targeting end-users.

Subtask Features

Subtask Management Features

This section explains what a Subtask is, and the commands to manage them.

Subtask Parameters

  • NAME

    • A name can only be alphanumeric characters and spaces, and should not be blank.

    • It is compulsory to set a name.

  • STATUS

    • A state can only be one of two values : Done or Not Done.

    • By default, every new task is marked as Not Done.

Adding a subtask to a task : adds or as [since v1.2]

Add a subtask to an existing task.

Format: adds INDEX [n/NAME]

  • Adds the subtask at the specified INDEX. The index refers to the index number shown in the last subtask listing. The index must be a positive integer (i.e. 1, 2, 3, …​).

Example:

  • adds 1 n/Submit report
    Adds a subtask with name Submit report to the 1st task.

Deleting a subtask from a task: delete-subtask or ds [since v1.3]

Delete the specified subtask from PrioriTask.

Format: delete-subtask TASK_INDEX SUBTASK_INDEX

  • Delete the SUBTASK_INDEX-th subtask of task at the specified by SUBTASK_INDEX.

  • The index refers to the index number shown in the most recent listing.

  • The index must be a positive integer (i.e. 1, 2, 3, …​).

Examples:

  • list
    delete-subtask 1 1
    Deletes the first subtask of the first task in PrioriTask.

  • find cleaning
    delete-subtask 2 4
    Deletes the fourth subtask of the second task in th result of find cleaning command.

Editing a subtask: edits or es [since v1.5]

Edit name of a subtask.

Format: edits TASK_INDEX SUBTASK_INDEX n/NAME

  • Edit the SUBTASK_INDEX-th subtask of task at the specified by SUBTASK_INDEX.

  • The index refers to the index number shown in the most recent listing.

  • The index must be a positive integer (i.e. 1, 2, 3, …​).

Examples:

  • list
    delete-subtask 1 1 n/Do some research
    Changes the first subtask of the first task name to Do some research.

  • find cleaning
    delete-subtask 2 4 n/Run for 7.87 Km
    Change the fourth subtask of the second task in the result of find cleaning command name to Run for 7.87 Km.

Marking subtask as complete: toggle-subtask or ts [since v1.3]

Toggle the status of the subtask identified by the index number used in the last subtask listing between Completed and Not Completed.

Format: toggle-subtask TASK_INDEX SUBTASK_INDEX

  • Toggle the status of the SUBTASK_INDEX-th subtask of task at the specified by TASK_INDEX.

  • The index refers to the index number shown in the most recent listing.

  • The index must be a positive integer (i.e. 1, 2, 3, …​).

Examples:

  • list
    toggle-subtask 1 1
    Toggles the first subtask of the first task in PrioriTask.

  • find homework
    toggle-subtask 2 4
    Toggles the fourth subtask of the second task in th result of find homework command.

Reordering subtask [coming in v2.0]

Reorder subtasks using a given condition.

Contributions to the Developer Guide

Given below are 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.

Subtask Implementation

Subtask

Current Implementation

Subtask feature allows users to split their tasks into multiple subtasks. This feature allows users to better manage their task. It is implemented using Subtask class and UniqueSubtaskList class as shown by Subtask UML Class Diagram below:

SubtaskComponentDiagram
Figure 1. Subtask UML Class Diagram

UniqueSubtaskList is created to ensure that no task has a duplicated subtask.

Subtask management

To manage the subtasks (Add, edit, etc), a copy of the Task object is created, since Task is immutable.

Design Considerations

Aspect: Implementation of Subtask
  • Alternative 1 (current implementation): Add a new class Subtask

    • Pros: There is better isolation, and allows for easier modification to Subtask if needed.

    • Cons: It restricts the possibility of having a subtask that has subtasks.

  • Alternative 2: Use current Task class

    • Pros: It is easier to implement and subtask will share the same properties with Task.

    • Cons: There is a ossibility of having a cyclic subtask (a task that is also a subtask of it self) if not handled carefully.

Aspect: Implementation of UniqueSubtaskList
  • Alternative 1 (current implementation): Use List to store subtasks.

    • Pros: It is easier to implement.

    • Cons: There will be performance issues when data is large, since most operations in UniqueSubtaskList is O(n).

  • Alternative 2 (Planned for implementation): Use a combination of BBST and LinkedList to store subtasks.

    • Pros: If is faster than the first alternative since each operation is O(log n).

    • Cons: It is harder to implement and more robust testing is required since it is more bug prone.