Overview
JelphaBot is a desktop Task Manager that aids NUS students in tracking tasks efficiently. The user interacts with it using a CLI, but it has a GUI created with JavaFX. It is written in Java, and has about 13 kLoC.
Summary of contributions
-
Code contributed: [View on RepoSense]
-
Major enhancement: Added the start and stop a timer feature for tasks as well as a viewing panel for the user’s overall productivity for the day.
-
What it does:
start <index>
command allows the user to start a timer for the task specified by the index provided. The user may stop this timer withstop <index>
command. The productivity panel will show the total time spent on as well as the number of tasks completed that are due today. -
Justification: If the user wants to gauge the amount of time spent on their tasks and how many tasks they have completed or an overview of their productivity in that day, it is easy to view all this information in one tab.
-
Highlights: This enhancement works with existing as well as future commands. An in-depth analysis of design alternatives was necessary to decide the layout of the productivity panel and how effective it was in improving overall user experience. The implementation was also challenging as it was difficult to decide how much data to present to users.
-
Credits: Stop and Start command classes were adapted from existing commands such as Edit command.
-
-
Minor enhancement: Added a command history that allows the user to navigate to previous commands using up/down keys.
Other contributions:
-
Issues management:
-
User stories management:
-
There was a total of 30 user stories, for versions 1.0 to 1.4. I managed 10 of them.
-
-
Documentation:
-
Developer Guide:
-
Section 3.1, Delete Sequence diagram, whole section of 3.3, 4.1, 4.4, 4.7
-
Appendix C, Use Case diagram, whole section of appendix C8, C9, D, E, F7, F8, F9, F10
-
-
Replaced existing UML diagrams to ones that corresponds with our final product: PR #198, #326
-
Added Use Case diagram and Activity diagrams for start command: PR #326
-
Added Sequence diagram for stop command: PR #328
-
-
Enhancement to existing features:
-
Added DateTime model to Task model to integrate deadlines.
-
Added
-
-
Community:
-
Tools:
-
Integrated CI/CD tools (Appveyor and Coveralls) to the team repository.
-
Contributions to User Guide (Extracts)
Below are sections I contributed to the User Guide. They showcase my ability to write documentation targeting end-users. |
Productivity Tracking (Jel)
JelphaBot automatically tracks your productivity within the day, and displays a progress bar which allows you to track the completion progress of the tasks which are due in the coming week. You can see the progress bar fill up as you complete more tasks.
JelphaBot also dynamically provides feedback in response to your achievements and task completion rate. Hopefully, this would make you even more productive by encouraging you to get more done!
Tracking your productivity : productivity
You can enter the productivity
command or its shortcuts :P
or :p
to manually switch to the productivity tab.
The productivity panel will then show you your productivity for the day.
Format: productivity
Shortcut: :P
or :p
productivity
The progress bar and the text following it only shows tasks that are due within the week JelphaBot is running. |
Starting the timer for a task : start
You can start a timer for your task.
Format: start INDEX
start 1
Stopping the timer for a task : stop
You can stop a running timer for your task.
Format: stop INDEX
stop 1
Exiting the application before stopping any running timer wil cause all recorded time since the timer was started to be lost. |
Contributions to Developer Guide (Extracts)
Below are sections I contributed to the User Guide. They showcase my ability to write documentation targeting end-users. |
Productivity feature (Jel)
JelphaBot has a productivity panel of this feature which provides an overarching view of user’s overall productivity.
The view of this panel is facilitated by the productivity package that extracts the relevant data and displays them as a cohesive view.
The productivity package supports the creation of TimeSpentToday
, RunningTimers
and TasksCompleted
instances.
Each of these classes iterate through the tasks contained within the task list.
Below is a class diagram of the related productivity classes:
Productivity
, ProductivityPanel
and their components.This feature offers two main functions and one panel for visualisation:
-
Start timer for a task.
-
Stop running timer for a task.
-
Productivity panel under Productivity tab.
Implementation
Text rendered onto the productivity panel is retrieved from the Productivity
class.
A Productivity
object is a container for the objects responsible for the sub-parts of the panel, namely TimeSpentToday
, RunningTimers
and TasksCompleted
.
Each of these have their respective String representations which will be used in rendering the panel.
TimeSpentToday
implements the following operations:
-
An iterator method
getTimeSpent()
which iterates through a list ofObservableList<Task>
.-
This iterator will extract the duration field of each task.
-
-
A
toString()
method which returns the sum of duration (i.e. time spent) of tasks under 3 different categories: "due today", "due in next 6 days" and "due after 6 days".
Each time toString() is called, getTimeSpent() is called thrice; once each for the 3 categories.
|
RunningTimers
implements the following operations:
-
An iterator method
getTasksWithTimers()
which iterates through a list ofObservableList<Task>
.-
This iterator will extract the description and deadline of tasks with timers that have been started.
-
-
A
toString()
method which returns the tasks with running timers.
TasksCompleted
implements the following operations:
-
An iterator method
getCompletionStatus()
which iterates through a list ofObservableList<Task>
.-
This iterator will extract the number of tasks completed under the "due today" category.
-
-
An iterator method
getOverdueStatus()
which iterates through a list ofObservableList<Task>
.-
This iterator will extract the number of tasks that are incomplete and past their due date.
-
-
A getter method which returns the percentage of tasks completed that are under the "due today" category.
-
A
toStringArray()
method which returns the task completion status, JelphaBot’s response to the user’s productivity, as well as number of overdue tasks.
Information from all three objects are subsequently rendered onto the panel through ProductivityCard
and ProductivityPanel
.
Assuming that the task list is not empty, the following describe the flow of start 1 and stop 1 which modify the currently shown productivity panel:
Function 1: Starts timer for a specified task
In order to start timing a task, the user enters start INDEX command (e.g. start 1).
Upon successful execution of the command, the productivity tab displays the task being timed under the Running Timer(s) header. The following diagram shows the flow of start 1 which modifies the current view of the productivity panel:
Productivity
in the ProductivityList
To update the productivity panel to reflect the changes, a new Productivity
object will first be created, replacing the existing Productivity
object in the ProductivityList
.
Each time a new Productivity
object is created, its corresponding booleans will dictate whether the sub-parts (i.e. TimeSpentToday
, RunningTimers
and TasksCompleted
) are to be replaced with new objects.
As the command executed is start, a new RunningTimers
object is created.
As detailed above, the iterator method in RunningTimers
will be called and a new String
representation to be displayed onto the productivity panel will be created.
This String
is subsequently rendered onto the panel under the Running Timer(s) header.
The following diagram shows the flow which updates the Running Timer(s) section in the productivity panel:
Function 2: Stops timer for a specified task
In order to stop timing a task, the user enters stop INDEX command (e.g. stop 1)
Upon successful execution of the command, the productivity tab removes the task being timed under the Running Timer(s) header. Removing a task from the Running Timer(s) header is similar to adding it, as illustrated by the Activity Diagram above. Under the Time Spent header, the total time spent will be increased in the respective subheaders depending on the date that the task is due.
Attempting to start a timer for a task which is marked as completed or stop a task with no active timer results in the command execution failing and an exception thrown. |