PROJECT: CAPTracker


Overview

CapTracker is a desktop application. The user interacts with it using a CLI, and it has a GUI created with JavaFX. It is written in Java, and has about 10 kLoC.

Summary of contributions

  • Major enhancement: Transcript file storage feature.

    • What it does: Automatically saves and updates all of user’s transcript data into a file, and loads this file.

    • Justification: Users should be able to access previously created modules when opening the app again, otherwise they would have to re-enter all their modules again. They can also load their data in another computer or share it with other users if desired, simply by sharing the file itself.

    • Highlights:

      • By using the Jackson library to store the Transcript data as a JSON file instead of an XML file, we avoid having to write XMLSerializableTranscript and XMLAdaptedModule classes.

  • Minor enhancement: Display and updating of current CAP and CAP Goal.

    • What it does: Displays current CAP, immediately updates whenever completed modules are edited. Displays CAP Goal if set, else displays NIL; immediately updates whenever incomplete modules are changed or adjusted.

    • Justification: Users should be able to view their current CAP and CAP Goal as they are updated, without having to request for them through a command.

  • Code contributed: https://nus-cs2103-ay1819s1.github.io/cs2103-dashboard/#=undefined&search=jeremyyew

  • Other contributions:

    • Project management:

      • Guided planning of early project timeline and milestone setting.

      • Managed release v1.1 (1 release) on GitHub.

    • Enhancements to existing features:

      • Enabled app to load initial sample module data (See PR #27).

      • Set up initial GUI layout (See PR #52).

    • Documentation:

      • Updated existing content of the Storage Section of Developer Guide.

      • Added feature overview and updated "Saving your module data" section of User Guide.

    • Community:

      • PRs reviewed (with non-trivial review comments): #23, #37, #121

Contributions to the User Guide

Note: Since my main feature is non-interactive, there are less things I could write for the user guide.

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

Feature overview

In the CAPTracker app, you can add modules that you’ve completed and it will display your current CAP. A module consists of a code, year, semester, number of credits, and an associated grade.
You may also add incomplete modules (i.e. modules that you are currently enrolled in, or plan to enroll in eventually, but you have not received your grade yet) simply by adding that module and omitting the grade.+ You may also set a CAP goal, and the app will automatically generate the target grades necessary for your incomplete modules so that you can achieve your goal. The app will also let you know if your goal is too high based on the number of incomplete credits you have and your current CAP.
Lastly, you can also adjust the target grade of a particular incomplete module (for example, a module you know you can get an A in) and the app will automatically recalculate the required grades for the rest of the modules (so you can afford to score lower on those modules).
Happy tracking!

Saving your module data

Your module information and CAP goal are automatically saved on the hard disk as a JSON file (by default data/transcript.json) whenever there are changes to the modules or CAP goal. The data is automatically loaded into the app again upon startup.+ You may manually change the location to store your data by changing the value of transcriptFilePath in the file data/preferences.json (found in the same directory as the CapTracker jar file).
You may load your module data in the CAPTracker app on another computer or share it with other users if desired, simply by sharing the module data file generated by your instance of the app. The value of transcriptFilePath in the preferences file will have to be changed to the location of your own data file. Note: Do not modify the JSON module data file manually, or you may lose your data.

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.

Transcript Storage: Reading and Writing

Whenever the in-memory Transcript object is changed, the transcript data file is updated. When the app initializes, it will look for an existing data file from which to load the transcript.+ If the file is not found, the app will initialize with an empty Transcript.+ If the file is found but the data is an incorrect format or there is some problem reading from the file, the app will initialize with an empty Transcript as well.+

When the app initializes, it looks for the file name provided by data/preferences.json under the transcriptFilePath key - by default this is data/transcript_demo.json. This file stores all transcript data including modules data and cap Goal information, such as its value, whether it is set, and whether it is impossible. The transcriptFilePath may be changed manually by the user.+

By using the Jackson library to store the Transcript data as a JSON file instead of an XML file, we avoid having to write XMLSerializableTranscript and XMLAdaptedModule classes. Instead, we simply register a custom JSONTranscriptDeserializer on the ReadOnlyTranscript class so that when we read from the JSON file, Jackson’s ObjectMapper is able to use the values to reconstruct the saved object.

Storage component

StorageClassDiagram
Figure 1. Structure of the Storage Component

API : Storage.java

The Storage interface defines a component which

  • can save UserPref objects in JSON format and read it back.

  • can save Transcript data in JSON format and read it back.

The StorageManager implements the Storage interface, and updates the transcript JSON file when the TranscriptChangedEvent is fired (see Figure 4). It also logs the reading and saving of transcript data.

Launch and Shutdown

  1. Initial launch

    1. Download the jar file and copy into an empty folder

    2. Double-click the jar file
      Expected: Shows the GUI with a set of sample contacts. The window size may not be optimum.

  2. Saving window preferences

    1. Resize the window to an optimum size. Move the window to a different location. Close the window.

    2. Re-launch the app by double-clicking the jar file.
      Expected: The most recent window size and location is retained.

  3. Saving transcript data

    1. Add some modules, set a CAP goal, and close the app.

    2. Re-launch the app by double-clicking the jar file.
      Expected: The added modules and CAP goal are retained.

  4. Changing the transcript data file path

    1. Add some modules, set a CAP goal, and close the app.

    2. Change the value of transcriptFilePath in the file data/preferences.json (found in the same directory as the jar file) to some non-existent file such as data/transcript_test.json.

    3. Re-launch the app by double-clicking the jar file.+ Expected: The app will initialize with an empty transcript (no modules or CAP goal). On further change, the app will save the transcript data to the new file data/transcript_test..json.

  5. Importing transcript data

    1. Add some modules, set a CAP goal, and close the app.

    2. Save another copy of the jar file in another directory and open and close this second app.

    3. Replace the data/transcript.json of the second app with the data/transcript.json from the first app.

    4. Relaunch the new app.
      Expected: The app will initialize with the added modules and CAP goal from the first app.+