PROJECT: TAble

Overview

TAble is your handy desktop app, optimized for TAs who prefer to work with a Command Line Interface (CLI) while still having the benefits of a Graphical User Interface (GUI)! Mark attendance, arrange consults, add module notes, set reminders and more with TAble! It has a GUI created with JavaFX and written in Java, and has about 20 kLoC.

Summary of contributions

  • Major enhancement: Enabled support for Reminders

    • What it does: The user is able to add/edit/delete/done/snooze/find/list all Reminders which he has set in TAble.

    • Justification: Teaching Assistants have many tasks to keep track of when managing a tutorial class (e.g. sending of administrative information to students, uploading of materials/attendance, keeping professor up to date etc). Therefore, it is important for the Teaching Assistants to have a way to keep track of their ongoing tasks so that they are not missed out.

    • Highlights: Reminders are auto sorted according to their due date and time with different panel colors to distinguish tasks that are due, in progress or done. Reminders that are due on the current day also shows the number of hours and minutes left in real time.

  • Minor enhancements:

    • Added a feature that allows the user to navigate to previous commands using up/down keys

      • Eliminates the need for user to retype repetitive commands (e.g. adding students to a tutorial).

    • Added an autocomplete feature that provides user with suggestions according to their current input

      • Eliminates the need to type out long commands/prefixes which increases the user’s experience and productivity.

      • Credits: ControlsFX

  • Code contributed: [RepoSense - Code Report]

  • Other contributions:

    • Project management:

      • Maintained Graphical User Interface for the Main Window of the application #110 #138

      • Managed Graphical User Interface for ReminderListPanel of the application #105

    • Enhancements to existing features:

      • Added the functionality for list/find commands to open the corresponding tab in GUI.

    • Documentation:

      • Updated User Guide and Developer Guide for Reminder features, including adding relevant PlantUML diagrams in the Developer Guide to enhance comprehensibility of the codebase and the structure of the feature.

    • Tools:

      • Setting up of github’s issue tracker.

    • Summary of contributions:

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.

Reminder Feature (Written by Cranston Yeo)

Adding a reminder: addReminder

Adds a reminder to the reminder list.
Format: addReminder desc/DESCRIPTION date/DATE time/TIME

Reminders will be automatically sorted according to their date and time, with the earliest at the top of the list.
  • The description provided should be any valid string that is not blank or exceeds 80 characters.

  • The date provided must be in YYYY-MM-DD format.

  • The time provided must be in HH:MM format, i.e: 24-hour format.

  • The reminder must be in the future.

Examples:

  • addReminder desc/Mark midterms papers date/2020-10-05 time/14:00

Editing a reminder: editReminder

Edits an existing reminder in the reminder list.
Format: editReminder INDEX [desc/DESCRIPTION] [date/DATE] [time/TIME]

  • Edits the reminder at the specified INDEX. The index refers to the index number shown in the displayed reminder list. The 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.

Examples:

  • editReminder 1 desc/Return midterms papers
    Edits the description of the 1st reminder to "Return midterms paper".

  • editReminder 3 date/2020-05-20 time/18:00
    Edits the date of the 3rd reminder to 20th May 2020 18:00 hours i.e. 6.00 p.m.

Finding reminders by their descriptions or date: findReminder

Finds reminders matching with the given descriptions or date. Format: findReminder [desc/DESCRIPTION] [MORE_DESCRIPTIONS] [date/DATE]

  • The search is case insensitive. e.g Mark will match mark.

  • The order of the descriptions does not matter. e.g. Mark papers will match Papers mark

  • Only full words will be matched e.g. Mar will not match Mark

  • Reminders matching at least one description will be returned (i.e. OR search). e.g. Mark midterms will return Mark papers, Midterms exam

  • At least one of the optional fields must be provided.

  • If both optional fields are provided, only reminders matching both criteria will be displayed.

Examples:

  • findReminder desc/mark
    Returns reminders containing the keyword 'mark'.

  • findReminder date/2020-05-05
    Returns all reminders on 05 May 2020.

List all reminders: listReminder

Lists all the reminders that the TA have added on TAble.
Format: listReminder

Marking a reminder as done: doneReminder

Marks the reminder from the reminder list as done.
Format: doneReminder INDEX

Reminders marked as done will automatically be sorted to the bottom of the list and will no longer appears in the calendar.
  • Marks the reminder at the specified INDEX as done.

  • The index refers to the index number shown in the displayed reminder list.

  • The index must be a positive integer 1, 2, 3, …​

Examples:

  • listReminder
    doneReminder 3
    Mark the 3rd reminder in TAble as done.

Deleting a reminder: deleteReminder

Deletes the specified reminder from the reminder list.
Format: deleteReminder INDEX

  • Deletes the reminder at the specified INDEX.

  • The index refers to the index number shown in the displayed reminder list.

  • The index must be a positive integer 1, 2, 3, …​

Examples:

  • listReminder
    deleteReminder 3
    Deletes the 3rd reminder in TAble.

Snoozing a reminder: snoozeReminder

Snoozes a reminder in the reminder list.
Format: snoozeReminder INDEX [day/DAY] [hour/HOUR] [minute/MINUTE]

  • Snooze the reminder at the specified INDEX. The index refers to the index number shown in the displayed reminder list. The index must be a positive integer 1, 2, 3, …​

  • At least one of the optional fields must be provided.

  • Number of days, hours or minutes provided must be a positive whole number.

  • Reminder to be snoozed must not be done.

Examples:

  • snoozeReminder 2 day/3 hour/2
    Postpone the second reminder to 3 days and 2 hours later.

  • snoozeReminder 4 minute/30
    Postpone the fourth reminder to 30 minutes later.

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.

Reminder feature (Written by Cranston Yeo)

TAble allows NUS SoC teaching assistants to create reminders to help them in keeping track of their ongoing or upcoming tasks.

Implementation

A reminder is made up of a description, date and time which uniquely identify each reminder. Each reminder has a boolean attribute to indicate if the task is done.

To find a reminder in the reminder list, user must key in at least one of the optional predicates, DescriptionContainsKeywordsPredicate or DatePredicate. DescriptionContainsKeywordsPredicate contains a list of strings entered by the user while DatePredicate contains the input LocalDate.

The list of strings are matched against the description of the reminders in the reminder list while the LocalDate is matched against the date field. The reminder list is then updated with the list of matching reminders via updatedFilteredReminderList in Model. Below shows a sequence diagram of the execution.

FindReminderSequenceDiagram
Figure 1. Sequence diagram for finding reminders

A snooze reminder feature is also implemented for the users to easily postpone a reminder. It’s implementation is similar to the editReminderCommand where it creates a new reminder to replace the specified reminder instead of editing the current reminder directly. This is to ensure the reminders are immutable which improves the stability of the application.

User can choose to snooze the reminder in any/all of the following time units: days, hours and/or minutes. Only positive integer are allowed as the user are not supposed to snooze the reminders backwards or snooze it by zero duration. Reminders that are done are also not allowed to be snoozed. Following is an activity diagram for the command.

SnoozeReminderActivityDiagram
Figure 2. Activity diagram for the command snoozeReminder in the reminder feature

Design Considerations

Sorting the reminders

Alternative 1 (Current Choice): Automatically sorts the reminder list whenever a reminder is added

Alternative 2 : Sorts the reminder list only when user enters a sort command

Pros

It is intuitive for the reminder list to be sorted according to their done status and deadline.

User can decide how they want the list to be sorted (e.g. in alphabetical order).

Cons

User are not able to sort the list according to their preferences.

User have to type the sort command each time a new task is added.

Reason for choosing Alternative 1: We believe that automatically sorting the list provide with a better user experience as they could immediately see the most urgent tasks in the reminder’s list upon startup without first typing a sort command.

Ways to inform user about their upcoming tasks

Alternative 1: (Current Choice) Each reminder displays the duration left before the task is due

Alternative 2 : A pop-up notification when a reminder is due or about to due

Pros

User could see clearly the duration left for each task at a glance.

User are notified of upcoming tasks without having to look through the list of reminders.

Cons

Reminders that are about to due could be missed out.

Multiple pop-up notifications from the reminders could cause annoyance for the user.

Reason for choosing Alternative 1: Pop-up notifications can be intrusive and potentially cause lag to the program which negatively impacts user’s experience. Furthermore, they are hard to test due to their volatile nature and including them might decrease the stability of the application.

Use Cases

Use case: Add reminder (U19)

MSS

  1. User requests to add reminder with description, date and time of reminder included

  2. System saves the new reminder into the database

    Use case ends.

Extensions

  • 1a. The description, date or time of reminder is not included.

    • 1a1. System shows an error message that description, date and time must all be included.

      Use case ends.

Use case: Mark reminder as done (U20)

MSS

  1. User requests to mark an existing reminder as done

  2. System updates the existing reminder according to the User’s request

    Use case ends.

Extensions

  • 1a. The reminder does not exist.

    • 1a1. System shows an error message that the reminder does not exist.

      Use case ends.

  • 1b. The reminder is already done.

    • 1b1. System shows an error message that the reminder is already done.

      Use case ends.

Use case: Update reminder (U21)

MSS

  1. User requests to update either the description, date or time of an existing reminder

  2. System updates the existing reminder according to the User’s request

    Use case ends.

Extensions

  • 1a. The reminder does not exist.

    • 1a1. System shows an error message that the reminder does not exist.

      Use case ends.

  • 1b. The description, date and time of reminder are not included.

    • 1b1. System shows an error message that at least one of description, date or time must be included.

      Use case ends.

Use case: Delete reminder (U22)

MSS

  1. User requests to delete an existing reminder

  2. System removes the existing reminder from the database

    Use case ends.

Extensions

  • 1a. The reminder does not exist.

    • 1a1. System shows an error message that the reminder does not exist.

      Use case ends.

Use case: List reminders (U23)

MSS

  1. User requests to list all existing reminders

  2. System returns all the existing reminders from the database

    Use case ends.

Extensions

  • 2a. The list is empty.

    Use case ends.

Use case: Find reminders (U24)

MSS

  1. User requests to find all reminders matching with some keywords and/or date.

  2. System returns a list with all the matching reminders from the database

    Use case ends.

Extensions

  • 1a. The keyword and date are not included.

    • 1a1. System shows an error message that at least a keyword or date must be included.

      Use case ends.

  • 2a. The list is empty.

    Use case ends.

Use case: Snooze reminder (U25)

MSS

  1. User requests to snooze an existing reminder by a certain number of day, hour or minute

  2. System updates the existing reminder according to the User’s request

    Use case ends.

Extensions

  • 1a. The reminder does not exist.

    • 1a1. System shows an error message that the reminder does not exist.

      Use case ends.

  • 1b. The day, hour and minute of reminder to be snoozed by are not included.

    • 1b1. System shows an error message that at least one of day, hour or minute must be included.

      Use case ends.

  • 1c. The reminder is already done.

    • 1c1. System shows an error message that the reminder is already done.

      Use case ends.