PROJECT: U-Schedule


Overview

U-Schedule is a desktop scheduler application, that is targeted towards university students who want a way to manage their schedules. It allows users to manage 2 types of events: Calendar Events, which are events which one normally enters into a calendar, and ToDoListEvents, which are tasks that the user wants to keep track of. The primary interface is the command line, and the GUI is created with JavaFX. U-Scheduler is written in Java, and has about 10kLoC.

Summary of contributions

  • Major enhancement: Added the GUI to display calendar events in a calendar.

    • What it does: Allows the user to view calendar events graphically, as well as navigate around their timetable.

    • Justification: This feature is a critical addition to a scheduler product. Without a visual representation of a calendar, the user would be relying on date and time strings, which would be extremely non-user-friendly even when in standard format.

    • Highlights: I designed a class to contain the third-party library for rendering events as a calendar. The class acts as a wrapper around the calendar and contains the logic for controlling the calendar. I implemented the controls needed for navigating around the calendar GUI. I also implemented quality of life features such as automatically navigating to show events that the user selected, as well as opening a pop-up dialog when the user double clicks on events in the calendar.

    • Credits: Used jxtras.Agenda for rendering events visually.

  • Code contributed:

  • Other contributions:

    • Project management:

      • Helped with issue tracking.

    • Enhancements to existing features:

      • Prototyped fuzzy search for finding events. (#48)

        • Wrote an initial set of utility methods using the fuzzywuzzy library.

        • Modified the original find command to use fuzzy search.

      • Designed FsList (FilteredSortedList), a list that allows filtering by multiple predicates and sorting all in one. (#116)

      • Improved TestApp to support the improved Find command and the todo list. (#116, #130)

    • Documentation:

      • Updated class diagrams in the Developer Guide: (#117)

    • Community:

      • PRs reviewed (with non-trivial review comments): (#20, #39, #69, #131)

    • Tools:

      • Integrated a third party library (natty) to the project. (#48)

      • Integrated a third party library (fuzzywuzzy) into the project. (#48)

      • Integrated a third party library (jfxtras.Agenda) into the project. #58)

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.

Using the Calendar Display

Manual navigation:

Navigating the calendar to viewing the events:

  • : Display previous week

  • : Display next week

  • : Scroll up to events earlier in the day

  • : Scroll down to events later in the day

Scrolling with the mouse wheel is also possible.

The calendar display must be in focus in order to navigate with the arrow keys.

Automatic Navigation:

When selecting an event, either by the select command or clicking in the list of calendar events, the calendar display will navigate to that event and attempt to centralize it in the calendar.

Viewing Event Details

The compact display of the calendar does not allow all the information of the event to be displayed. To view full details of an event, double click on it to open a dialog box containing the details of the event.

FAQ

Q: How do I transfer my data to another Computer?
A: Install the app in the other computer and overwrite the empty data file it creates with the file that contains the data of your previous U-Schedule folder.

Q: Why is the calendar display not responding to the arrow keys?
A: The calendar display must be in focus in order for it to receive the arrow key events. Try clicking on the calendar display. If a blue highlight is present around the edges, the calendar display is in focus and will now receive the key presses.

Q: The date time parser is parsing dates unexpectedly!
A: The Natural Language Parser we used tries its best to parse a datetime out of any input. Hence, there are some inputs which even humans would not consider a valid date, but the parser would still try to find a best fit. Most of the time, if a human can understand the input, the parser will parse the input correctly.

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.

Calendar Display

Implementation

Overview

The Calendar Display is implemented using jfxtras.Agenda. jfxtras is a third-party library containing more feature-rich UI controls.

Agenda Summary

Agenda defines the Agenda.Appointment interface, which must be implemented for all events that it displays. Agenda also defines Agenda.AppointmentImplLocal, which is a bare-bones implementation of the Agenda.Appointment interface.

The full documentation for Agenda can be found here.

Integration with our Project

CalendarEvent extends Agenda.AppointmentImplLocal, so as to streamline the process of displaying CalendarEvent s.

The CalendarDisplay class acts as a wrapper around Agenda. CalendarDisplay will:

  • Initialize the Agenda UI with the desired settings.

  • Listen for changes in the list of calendar events in Model and update Agenda accordingly.

  • Respond to the user selecting calendar events by displaying the selected event to the user.

  • Extend the in-built UI controls of Agenda by including functionality to navigate the calendar.

Design Considerations

Updating the Calendar

Unlike a ListView, Agenda does not provide a way to directly set a list of Appointments to be displayed. Therefore, CalendarDisplay takes the list of calendar events to be displayed and adds them to Agenda. CalendarDisplay then listens for changes in changes in the Model and forwards the same changes to Agenda.

Trimming Excess Functionality

Agenda provides some default functionality for responding to user interactions with the UI, such as adding, editing and deleting Appointment s. This features could have been implemented by setting the appropriate callbacks in Agenda. Changes to the data in Agenda could then be updated in Model. However, these features would not be very useful for a product that is designed to be used with the command line. Their implementation would also make the data flow bi-directional, and increase coupling between Agenda and Model. Therefore, these functions have been disabled so as to make Agenda solely for displaying the user’s events as a calendar.

Calendar Display Navigation

Current Implementation

The navigation features available are:

  1. View a CalendarEvent in the calendar display by selecting the event. The calendar display will jump to the correct time period and attempt to centralize the selected event.

  2. View the next/previous week or using the left and right arrow keys.

  3. The user can scroll up and down the 24-hour timeline using the up and down arrow keys, or by using the mouse scroll wheel.

Implementation

  1. Implemented by having CalendarDisplay listen for JumpToDateTimeEvent. CalendarDisplay would then set Agenda to display the target date and time.

  2. Implemented using an EventFilter in CalendarDisplay. CalendarDisplay would then set Agenda to display the target date and time.

  3. In-built into Agenda.

Design considerations

Keyboard Navigation

Initially, the keyboard navigation features were implemented for ease of testing CalendarDisplay, with the intention to implement Command Line Interface commands in the future. This would agree with the project direction, since this application is intended to be controlled using the command line.

However, Agenda 's calendar display was implemented using a customized ScrollPane, which could be scrolled using the up and down arrow keys and the scroll wheel. Hence, using the left and right arrow keys for navigation felt very natural and user-friendly.

Furthermore, Agenda did not expose any way for the user to scroll the calendar display programmatically. So if the user wanted to interact with the UI, the user would still be forced to use either the up and down arrow keys or the scroll wheel to navigate.

Therefore, while this feature is not a CLI feature, it was retained as a fast and easy way to navigate around the calendar display.

Further Extensions

Command Line Navigation

To make the command line instruction set more complete, it would be good if users are able to navigate the calendar display using the command line as well. Some possible extensions could be:

View Next and Previous Week
  1. User executes view next.

  2. The command is parsed and the correct date to navigate to is calculated. A ChangePeriodCommand containing the target date is created.

  3. ChangePeriodCommand#execute raises a JumpToDateTimeEvent.

  4. CalendarDisplay responds by setting Agenda to display the specified date and time.

Jump to a Specified Date

One common use case for a calendar is when the user wants to check what events he/she has at a particular time. An example scenario would be:

  1. User executes view 20th nov.

  2. The command is parsed, creating a ChangePeriodCommand containing the target date.

  3. ChangePeriodCommand#execute raises a JumpToDateTimeEvent.

  4. CalendarDisplay responds by setting Agenda to display the specified date and time.