Authors: <Jonathan Darius> <Jerry Li> <Subhon Ghosh> <Riyana Dutta>
The idea of having an efficient way to track your tasks is for some people the cornerstone of their productivity, that’s why we see this project as an important contribution. The goal of our task manager is to provide users with an efficent way to list their tasks in a prioritized manner, store a student's courses and their respective assignments, and keep track of the events they need to attend. Another thing to note about our project is that it is a free and open source project, which isn’t very common amongst many productivity applications.
We plan on developing our project in the terminal using C++. Our project will have a terminal interface that allows the user to input their choices through input streams.
The input of our project include user input prompts that allow the user to specify and edit details regarding their tasks, courses, and events. This includes the date, location, description, and priority of an item. Additional input includes the duration of an event, course instructor and the occuring days of a course.
The output of our project is a full display of the to-do list which includes all tasks, events, and courses. It can also display a list of all the users courses and the tasks assigned for that specific course. There is also an option to display the monthly calendar and the user can choose a day in that month to add tasks or view the to-do list for that day.
This application enables users to organize and document their tasks, courses, and events in a way that is efficient to them. The course list feature allows students to add all their courses to their schedule and input assignments for that specific course. When they view the course, it display all the tasks for that specific course. Another important feature is that they can pick the time of the day and priority they would like to allocate on the specific tasks and it will show up on their calendar and to-do list. Our project also stores all the tasks in a json file to save the tasks once the applications stop executing.
This navigation diagram depicts how a user would navigate through the terminal to use our program. Our project is divided into four main sections for the user to navigate through: the home screen, course list, calendar, and task list.
This is the home menu selection screen which allows users to go into the calendar, task list, or course list.
If a user chooses to open the calendar screen this is the calendar that appear. The user will also be given the option to go to a specific day.
If a user chooses to open the course list this is what is displayed. Each item that is a couse type is only displayed with the name of the course, the date, and its prioirty compared to other classes.
If a user chooses to open the task list this is the task list that appears. The list shows what tasks they have including its date, description, and prioirty, and if its finished or not.

S: We separate our classes based on responsibilities. For example, we have distinct classes for tasks, courses, and events. We also have separate classes for data management, user interaction, and data display.
O: We establish friend relationships instead of inheritance to access the data stored in inherited variables. We also made the item class into a pure virtual class, so that we can create new instances of the Item class and add additional functions of that instance without modifying the functions of the item class, ensuring the open closed principle.
L: We made the edit and display function in the item class pure virtual to ensure abstraction of the different implementations of the edit and display functions throughout items’ derived classes.
I: We create different friend or derived classes for different needs. Each class focuses on specific actions and does not share unnecessary functions with others.
D: Our abstract "item" class forms the foundation for constructing various data sets and classes. Child and friend classes implement specific behaviors based on the described behavior in the item class.
Opening prompt of PriorityFlow!
We can interact with our primary to do list.
Here is how we add tasks.
We can go back to our monthly view.
We can view what assignments and courses we have on specific days within the current month.
This is how we mark our to do items as complete.

Here are the instructions for installing or running our application:
- Open a terminal on your local machine
- Navigate to a directory where you would like to clone the repository using cd.
- To recursively clone the repo, run the command: git clone --recursive https://github.com/cs100/final-project-sghos026-jli793-rdutt010-jdari003.git
- Once you have the cloned repository on local machine run cmake .
- Then run make
- The bin file contains all of the runnable executables for Priority Flow. Run the command: ./bin/PriorityFlow
- The program should now be running and the user should prompted with the Main Menu!
Our project utilized the Google Test framework to test each of our .cpp files from src folder. We had tested the functionality and the non-functionality part of our program to get a wide range of testing throughout our project.

