Overview
TeaPet is a personal manager application for primary school form teachers. The user interacts with it via a Command Line Interface (CLI) along with a Graphical User Interface (GUI) created with JavaFX. The application is written in Java.
Summary of contributions
-
Major enhancement: Implemented the Student Academics Feature of TeaPet
-
What it does: Assist the user in storing and tracking information of the classes' academic progress. The user can create assessments, submit and mark students' work.
-
Justification: This feature is essential for the teacher to monitor the classes' progress and manage the submission and marking of assessments better. Whenever the user assigns an assessment to the class, he/she would want to track who has submitted their work, and also track which submission she has marked. The user can key in when a student has submitted work for a specific assessment, and store the scores when they have marked a submission. Teachers can now easily see which students have not submitted and chase them for their work without having to count one by one to find the missing submission. Furthermore, being able to store marks in academics can allow the user to see which submission has not been marked and each student’s academic progress. They can also view general statistics for each individual assessment and export them, so as to prepare for end-of-year teacher performance evaluation. This academics feature will manage all information about students' studies.
-
Highlights: This feature calculates some general statistics of the class such as average score and median score. Teachers can export the statistics and table of all assessments and student submissions into a csv file for reference and sharing. They are also able to filter the list of assessments to only homework or exam assessments.
-
-
Minor enhancement: Assisted in the development the UI/UX (User Interface / User Experience) of TeaPet
-
What it does: Enhances the view of TeaPet to be easier to process and the users' experience to be more intuitive.
-
Justification: An interface design that is easy on the eyes and intuitive to use is one of the key things to attract users to try the product and retain its users.
-
Highlights: This enhancement drastically improved the AddressBook3 interface. The colour palette of the whole interface is mostly monochrome so as to give TeaPet a more cohesive look. On the top header, the active panel will be highlighted with a bright orange to allow easy identification of which feature the user is using.
-
-
Minor enhancement:
-
Refactored the student related commands into a
student
command as a standalone feature.
-
-
Code contributed: [Functional code and Test code]
-
Other contributions:
-
Project management:
-
In charge of code quality of others' PR. Will comment on other’s PR if there are any improvements or suggestions to make.
-
Checks the documentation of the overall code and ensures that it is uniform.
-
Restructured many commands and model folders, improving the overall packaging of TeaPet.
-
-
Enhancements to existing features:
-
Edited existing tests for existing features to involve more features (Pull requests #110)
-
Improved code quality of existing features (Pull requests #110, #225, #261)
-
Major refactoring of certain commands and packaging (Pull requests #229)
-
Wrote additional tests for existing features to increase coverage by 9.3%(Pull requests #279, #283, #301)
-
-
Documentation:
-
Community:
-
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. |
Student Academics [Done by Lee Hui Ting]
TeaPet’s Class Progress Tracker is able to keep tabs on the class' academic progress. You will be able to store data of every student’s subject grades with this feature. Thereafter, there will be a csv file available for export displaying the progress of individual students as well as the entire class.
Display all Assessments and Academics Help: academics
Shows all assessments in the academics list and a guide for academic commands.
Format:
academics
Expected Outcome:
The Academics tracks all your assessments and student submissions. [HELP ON ACADEMICS COMMANDS] 1. Add assessment: academics add desc/ASSESSMENT_DESCRIPTION type/TYPE date/DATE 2. Edit assessment: academics edit INDEX [desc/ASSESSMENT_DESCRIPTION] [type/TYPE] [date/DATE] 3. Delete assessment: academics delete INDEX 4. Submit assessment: academics submit INDEX [stu/STUDENT_NAME]... 5. Mark assessment: academics mark INDEX [stu/STUDENT_NAME-SCORE]... 6. Filter assessment BY TYPE: academics ASSESSMENT_TYPE (only homework or exam) 7. View academics report: academics report 8. Export academics report: academics export Type the following commands for more info!
academics
commandAdd Assessment: academics add
Adds an assessment into the academics list.
Format:
academics add desc/ASSESSMENT_DESCRIPTION type/TYPE date/DATE
Adds a new assessment with the given attributes.
The assessment description cannot be empty. Date should be written in YYYY-MM-DD format. |
Example:
-
academics add desc/Math Graphs Homework type/homework date/2020-05-02
Adds an assessment "Math Graphs Homework" into the academics list along with its deadline.
Expected Outcome:
Added assessment: Homework: Math Graphs Homework Due by: 2020-05-02
Edit Assessment: academics edit
Edits an assessment from the academics list.
Format:
academics edit INDEX [desc/ASSESSMENT_DESCRIPTION] [type/TYPE] [date/DATE]
Edits the assessment with the given attributes.
The assessment description cannot be empty. Date should be written in YYYY-MM-DD format. |
Example:
-
academics edit 4 desc/Chemistry Compounds Assignment
Edits assessment in the academics list with the new description "Chemistry Compounds Assignment".
Expected Outcome:
Edited Assessment: Homework: Chemistry Compounds Assignment Due by: 2020-04-30
Delete Assessment: academics delete
Deletes an assessment from the academics list.
Format:
academics delete INDEX
-
Deletes the assessment with at the given index.
Index should be a positive integer and be a valid index.
Example:
-
academics delete 5
Deletes the student at index 5.
Expected Outcome:
Deleted Assessment: Homework: Chemistry Compounds Assignment Due by: 2020-04-30
Submit Assessment: academics submit
Submits student(s) work for a specific assessment.
Format:
academics submit INDEX [stu/STUDENT_NAME]...
Submits work for the assessment with at the given index.
Index should be a positive integer and be a valid index. |
Student whose work has already been submitted cannot be submitted again. |
Example:
-
academics submit 3 stu/Freddy Zhang
Submits "Freddy Zhang" for the assessment at index 3. -
academics submit 3 stu/Freddy Zhang stu/Gerren Seow
Submits "Freddy Zhang" and "Gerren Seow" for the assessment at index 3.
Expected Outcome:
Academics submitted following submissions: Freddy Zhang Gerren Seow
Mark Assessment: academics mark
Marks student(s) work for a specific assessment.
Format:
academics mark INDEX [stu/STUDENT_NAME-SCORE]...
Marks work for the assessment with at the given index.
Index should be a positive integer and be a valid index. |
Only the submissions of students whose work has already been submitted can be marked. |
Example:
-
academics mark 3 stu/Freddy Zhang
Marks "Freddy Zhang" for the assessment at index 3. -
academics mark 3 stu/Freddy Zhang-90 stu/Gerren Seow-80
Marks "Freddy Zhang" and "Gerren Seow" for the assessment at index 3.
Expected Outcome:
Academics marked following submissions: Gerren Seow: 80 Freddy Zhang: 90
Filter Assessments by type: academics homework/exam
Filters assessment list by either homework or exam.
Format:
academics ASSESSMENT_TYPE
Example:
-
academics homework
Expected Outcome:
Academics now displays all HOMEWORK assessments
Example:
-
academics exam
Expected Outcome:
Academics now displays all EXAM assessments
academics exam
commandView Academics Report: academics report
Generates an academic report for each assessment.
Format:
academics report
Expected Outcome:
Academics now displays the report of each assessment.
academics report
commandExport Academics Report: academics export
Exports the academic report into a csv file.
Format:
academics export
-
Academics report will be exported to a .csv file format, which is located in the data folder in the same directory. The file is named "studentAcademics.csv".
Expected Outcome:
Academics are exported to studentAcademics.csv in the data folder.
Student Academics Commands
Here are the commands to manage student academics. They require the prefix academics
.
Command |
Format |
Expected outcome |
|
|
Adds an assessment into the academics list |
|
|
Edits an assessment in the academics list |
|
|
Deletes the assessment at the given index |
|
|
Submits student(s) work for the assessment at the given index |
|
|
Marks student(s) work and stores the scores for the assessment at the given index |
|
|
Displays either all homework or exam assessments in the academics list |
|
|
Displays the report for all assessments |
|
|
Exports the academics report into a .csv file |
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. |
Student Academics feature
This student academics feature stores and tracks the class' academics progress.
The academics feature consists of the following commands namely,
-
AcademicsCommand
- Displays the most updated student academics details. -
AcademicsAddCommand
- Adds a new assessment to the academic list. -
AcademicsEditCommand
- Edits the details of a particular assessment. -
AcademicsDeleteCommand
- Deletes the specified assessment from academics. -
AcademicsSubmitCommand
- Submits students' work to the specified assessment. -
AcademicsMarkCommand
- Marks students' work of the specified assessment. -
AcademicsDisplayCommand
- Displays either homework, exam, or the report of student academics. -
AcademicsExportCommand
- Exports the academics information into a .csv file.
All academics commands share similar paths of execution. The commands when executed, will interface with the methods
exposed by the Model
interface to perform the related operations (See logic component for the general overview).
Class Overview
The class diagram below will depict the structure of the Academics Model Component.
Academics Add Command
Implementation
The following is a detailed explanation of the operations which AcademicsAddCommand
performs.
Step 1. The AcademicsAddCommand#execute(Model model)
method is executed which takes in a necessary assessment
description, type and date.
Format for adding an assessment is academics add desc/ASSESSMENT_DESCRIPTION type/TYPE date/DATE .
|
Step 2. As assessment names should be unique, the Model#hasAssessment(Assessment assessment)
method will check if
the assessment already exists in UniqueAssessmentList#assessments
. If a duplicate assessment is found, a
CommandException
will be thrown.
Step 3. Subsequently, the Model#getFilteredStudentList()
method will then be called, to set the student submission
tracker for the assessment.
Step 4. The method Model#addAssessment(Assessment assessment)
will then be called to add the assessment. The
command box will be reflected with the AcademicsAddCommand#MESSAGE_SUCCESS
constant and a new CommandResult
will be
returned with the message.
If the format or wording of AcademicsAddCommand contains error(s), an unknown command or wrong format error message
will be displayed.
|
The following sequence diagram summarizes what happens when a user executes an AcademicsAddCommand:
Academics Edit Command
Implementation
The following is a detailed explanation of the operations which AcademicsEditCommand
performs.
Step 1. The AcademicsEditCommand#execute(Model model)
method is executed which edits the details of the specified
assessment. The method checks if the index
defined when instantiating
AcademicsEditCommand(Index index, EditAssessmentDescriptor editAssessmentDescriptor)
is valid. Since it is optional
for users to input fields, the fields not entered will reuse the existing values that are currently stored and defined
in the Assessment
object.
User needs to input at least 1 field of assessment to edit. |
Step 2. A new Assessment
with the newly updated values will be created which replaces the existing Assessment
object using the Model#setAssessment(Assessment target, Assessment editedAssessment)
method. However, if new
assessment results in a duplicate assessment in UniqueAssessmentList#assessments
, a CommandException
will be thrown.
Step 4. The command box will be reflected with the AcademicsEditCommand#MESSAGE_SUCCESS
constant and a new
CommandResult
will be returned with the message.
Academics Delete Command
Implementation
The following is a detailed explanation of the operations which AcademicsDeleteCommand
performs.
Step 1. The AcademicsDeleteCommand#execute(Model model)
method is executed which deletes the assessment at the
specified index. It checks if the Index
is defined as an argument when instantiating the AcademicsDeleteCommand
constructor.
The Index must be within the bounds of UniqueAssessmentList#assessments .
|
Step 2. The Assessment
at the specified Index
is then removed from UniqueAssessmentList#assessments
observable
list using the Model#delete(Assessment assessment)
method.
Step 3. The command box will be reflected with the AcademicsDeleteCommand#MESSAGE_SUCCESS
constant and a new
CommandResult
will be returned with the message.
Academics Submit Command
Implementation
The following is a detailed explanation of the operations which AcademicsSubmitCommand
performs.
Step 1. The AcademicsSubmitCommand#execute(Model model)
method is executed which submits students' work for the
assessment at the specified index. The method checks if the Index
is defined as an argument when instantiating the
AcademicsSubmitCommand
constructor.
The Index must be within the bounds of UniqueAssessmentList#assessments .
|
Step 2. Subsequently, the Model#hasStudentName(String studentName)
method will then check if the given student
exists in UniqueStudentList#students
. Also, Model#hasStudentSubmitted(String studentName)
method checks if the
student has already submitted their work for the specified assessment. If the student does not exist or has already
submitted their work, a CommandException
will be thrown.
Step 3. The students' Submission
will then be submitted to the specified Assessment
using the method
Model#submitAssessment(Assessment assessment, List<String> students)
.
Step 4. The command box will be reflected with the AcademicsSubmitCommand#MESSAGE_SUCCESS
constant and a new
CommandResult
will be returned with the message.
The following activity diagram summarizes what happens when a user executes an AcademicsSubmitCommand:
Academics Mark Command
Implementation
The following is a detailed explanation of the operations which AcademicsMarkCommand
performs.
Step 1. The AcademicsMarkCommand#execute(Model model)
method is executed which marks students' work and stores the
students' scores for the assessment at the specified index. The method checks if the Index
is defined as an argument
when instantiating the AcademicsMarkCommand
constructor.
The Index must be within the bounds of UniqueAssessmentList#assessments .
|
Step 2. Subsequently, the Model#hasStudentName(String studentName)
method will then check if the given student
exists in UniqueStudentList#students
. Also, Model#hasStudentSubmitted(String studentName)
method checks if the
student has yet to submit their work for the specified assessment. If the student does not exist or has not submitted
their work, a CommandException
will be thrown. Furthermore, the score should be between 0 and 100 inclusive,
otherwise CommandException
will also be thrown.
Format for marking a students' work is academics mark INDEX stu/STUDENT_NAME-SCORE .
|
Step 3. The students' Submission
will then be marked and its score will be stored in the specified Assessment
using the method Model#markAssessment(Assessment assessment, List<String> students)
.
Step 4. The command box will be reflected with the AcademicsMarkCommand#MESSAGE_SUCCESS
constant and a new
CommandResult
will be returned with the message.
Aspect: Allow submission along with marking
-
Current Implementation: Marking a submission that has not be submitted is not allowed.
-
Pros: Clearer and prevents confusion in data.
-
Cons: Harder to implement and the user will have to submit students' work separately.
-
-
Alternatives Considered: Marking an unsubmitted work will also submit it for the assessment.
-
Pros: The user can just submit students work using the mark command, giving them less to type.
-
Cons: Prone to confusion of submitting and marking commands.
-
Aspect: Allow customizable total score of assessments
-
Current Implementation: Setting the total score for a submission is not allowed. (Total score for all submissions will be 100.)
-
Pros: Easy to implement and maintains uniformity of data.
-
Cons: User cannot set different total scores for assessments and have to grade it to a 100 weightage.
-
-
Alternatives Considered: Setting the total score for a submission is allowed.
-
Pros: User can make set different total scores to different assessments according to its requirements.
-
Cons: Hard to implement and could result in inconsistency of data.
-
Academics Display Command
Implementation
The following is a detailed explanation of the operations which AcademicsDisplayCommand
performs.
Step 1. The AcademicsDisplayCommand#execute(Model model)
method is executed which can either take in no arguments
or a 1 word argument indicating the type of display to show.
Other than the default display (no arguments needed), there are only 3 types of displays: homework , exam , and
report .Format: academics or academics DISPLAY_TYPE
|
Step 2. Depending on the display type, the command box will reflect its respective AcademicsDisplayCommand#MESSAGE_SUCCESS
constant and a new CommandResult
will be returned with the message.
Example. homework
type display will reflect AcademicsDisplayCommand#MESSAGE_HOMEWORK_SUCCESS
If the academics list is empty, a blank page will be shown. |
If the wording of the AcademicsDisplayCommand contains error(s), an unknown command message will be displayed.
|
Academics Export Command
Implementation
The following is a detailed explanation of the operations which AcademicsExportCommand
performs.
Step 1. The AcademicsExportCommand#execute(Model model)
method is executed which exports the content of Academics
into a csv file in the data folder.
Format of the command is: academics export .
|
Step 2. The command box will be reflected with the AcademicsExportCommand#MESSAGE_SUCCESS
constant and a new
CommandResult
will be returned with the message.
Step 3. Subsequently, the CommandResult
will be processed by the MainWindow
in the UI component and generate a
studentAcademics.csv in the data folder of the current directory
Appendix A: User Stories
Priorities: High (must have) - * * *
, Medium (nice to have) - * *
, Low (unlikely to have) - *
Priority | As a … | I want to … | So that I can… |
---|---|---|---|
|
new user |
see usage instructions |
refer to instructions when I forget how to use the App |
|
competent form teacher |
add students |
add new students to the class list |
|
form teacher |
delete a student |
remove students that I no longer need |
|
lazy form teacher |
find a student by name |
locate details of students without having to go through the entire list |
|
form teacher doing their job |
take the attendance of my students |
know who is present for my class |
|
organised form teacher |
have a schedule tracking my events |
know what I need to attend/do in a day |
|
diligent form teacher |
maintain of a list of students who have completed my homework |
know who has not submitted my homework |
|
caring form teacher |
take down notes for student’s behavior |
track the behaviour of my students |
|
hard working form teacher |
see the scores of my class |
track the academic progress of my class |
|
lazy form teacher |
sort students by alphabetical order |
locate a student easily |
|
form teacher |
update the details of my students |
make necessary changes to my student’s particulars |
|
well prepared form teacher |
maintain emergency contacts of my students |
know who to contact in case of emergency |
|
form teacher |
be able to view the available dates in chronological order that contains administrative information of the class |
know which are the available dates that I can view |
|
form teacher |
view the administrative information of the class on a specific date |
access the required administrative information |
|
form teacher |
be able to view my assessment list by the latest date |
know which are the more urgent or overdue assessments to monitor |
|
form teacher |
view the academic statistics of my class |
know the academic progress of my students |
|
form teacher |
set different colours to my events |
see clearer what type of events I have |
|
form teacher |
specify if a student is late or absent for class |
know why my student is absent |
|
form teacher |
hide private contact details by default |
minimize chance of someone else seeing them by accident |
|
caring form teacher |
export academic statistics into a printable file |
share and discuss the student’s academic progress with their parents |
|
caring form teacher |
export behavioural notes into a printable file |
share and discuss the student’s behaviour with their parents |
|
form teacher |
keep track of the sitting arrangement of the class |
students who change their seats unknowingly |
|
form teacher |
record the temperature of students |
track the health of my students |
|
form teacher |
get feedback from other teachers teaching the students of my class |
better understand the progress of the class |
Appendix B: Non Functional Requirements
-
Should work on any mainstream OS as long as it has Java
11
or above installed. -
Should be able to hold up to 500 students without a noticeable sluggishness in performance for typical usage.
-
A teacher with above average typing speed for regular English text (i.e. not code, not system admin commands) should be able to accomplish majority of the tasks faster using commands than using the mouse.
-
TeaPet should be used only for a teacher handling his/her own form class, not by any other teachers.
-
TeaPet should be able to work without internet access.
-
The teacher should be able to familiarise himself/herself within half an hour of usage.
{More to be added}
Use case: UC09 - Display students' academic progress
MSS
-
User enters the command to display academic progress of students.
-
TeaPet displays the academic progress in chronological order.
Use case ends.
Extensions
-
1a. Command is invalid.
-
1a1. TeaPet shows an error message.
Use case ends.
-
Use case: UC10 - Add assessment to academics
MSS
-
User enters command, together with an assessment description, type and date.
-
TeaPet adds the new assessment and its details to the academics list.
-
TeaPet displays feedback to the user that a new assessment to the academics list.
Use case ends.
Extensions
-
1a. Assessment is invalid.
-
1a1. TeaPet shows an error message.
-
-
1b. Assessment details keyed by user are invalid.
-
1b1. TeaPet shows an error message.
Use case ends.
-
Use case: UC11 - Edit assessment
MSS
-
User specifies which assessment, using its index in the academics list, and what details he/she wants to edit in the command line.
-
TeaPet edits the assessment’s details in the academics list as instructed by the commands.
-
TeaPet displays feedback to the user that the assessment has been edited, followed by the changes made.
Use case ends.
Extensions
-
1a. Edited assessment is invalid.
-
1a1. TeaPet shows an error message.
Use case ends.
-
-
1b. Assessment details keyed in by user are invalid.
-
1b1. TeaPet shows an error message.
Use case ends.
-
Use case: UC12 - Delete assessment
MSS
-
User specifies which assessment, using the index, he/she wants to remove.
-
TeaPet removes the assessment from the class list.
-
TeaPet displays feedback to the user that the assessment is being removed.
Use case ends.
Extensions
-
1a. Assessment index entered by user is invalid.
-
1a1. TeaPet shows an error message.
Use case ends.
-
Use case: UC13 - Submit student’s work for assessment
MSS
-
User specifies which assessment and student, using index and name respectively, that he/she wants to submit work to.
-
TeaPet submits the student’s work to the assessment from the academics list.
-
TeaPet displays feedback to the user that the following student’s work has been submitted to the assessment.
Use case ends.
Extensions
-
1a. Assessment index entered by user is invalid.
-
1a1. TeaPet shows an error message.
Use case ends.
-
-
1b. Student name is invalid.
-
1b1. TeaPet shows an error message.
Use case ends.
-
-
1c. Student has already submitted their work.
-
1c1. TeaPet shows an error message.
Use case ends.
-
Use case: UC14 - Marks student’s work for assessment
MSS
-
User specifies which assessment and student, using index and name respectively, that he/she wants to mark.
-
TeaPet marks and stores the submission’s score to the assessment from the academics list.
-
TeaPet displays feedback to the user that the following student’s work has been marked and stored to the assessment.
Use case ends.
Extensions
-
1a. Assessment index entered by user is invalid.
-
1a1. TeaPet shows an error message.
Use case ends.
-
-
1b. Student name is invalid.
-
1b1. TeaPet shows an error message.
Use case ends.
-
-
1c. Student has yet to submit their work.
-
1c1. TeaPet shows an error message.
Use case ends.
-
Manual Test: Class Academics
-
Adding an assessment to academics
-
Prerequisites: The scheduler already contain an assessment with description "Math Differentiation Homework", type "homework", date "2020-03-23".
-
Test case:
academics add desc/Math Integration Homework type/homework date/2020-03-23
Expected: An assessment with the description Math Integration Homework is added to academics. -
Test case: `academics add desc/ `
Expected: An error message is shown due to invalid command. -
Test case:
academics add desc/Math Integration Homework type/ date/2020-03-23
Expected: An error message is shown due to invalid assessment type. -
Test case:
academics add desc/Math Integration Homework type/homework date/
Expected: An error message is shown due to invalid assessment date. -
Test case:
academics add desc/Math Integration Homework type/homework date/2020/03/04
Expected: An error message is shown due to invalid assessment date.
-
-
Editing an assessment in academics.
-
Test case:
academics edit 1 desc/Chinese Spelling Practice
Expected: First assessment in the academics list is updated with new description. Only the description should be modified. -
Test case:
academics edit 1 desc/Chinese Spelling Practice type/exam date/2020-03-04
Expected: First assessment in the academics list is updated with new description, type and date. -
Test case:
academics edit 1 desc/
Expected: An error message is shown due to invalid assessment description. -
Test case:
academics edit 1 desc/Chinese Spelling Practice type/assignment
Expected: An error message is shown due to invalid assessment type. -
Test case:
academics edit 1 date/2020/03/04
Expected: An error message is shown due to invalid assessment date.
-
-
Deleting an assessment
-
Test case:
academics delete INDEX
where INDEX is a valid index.
Expected: Assessment will be deleted if the given index is valid. The status message either displays that the specified assessment has been deleted or show that the index given is invalid. -
Other incorrect delete commands to try:
academics delete
Expected: Status bar displays invalid command and incorrect command format message.
-
-
Submitting a student’s work for an assessment
-
Test case:
academics submit INDEX stu/Simon_Lam
where INDEX is a valid index and Simon Lam is an existing student in TeaPet.
Expected: Simon Lam’s work will be submitted to the specified assessment if the given index is valid. The status message either displays that the student’s work has been submitted or show that the index given is invalid. -
Other incorrect submission commands to try:
academics submit
Expected: Status bar displays invalid command and incorrect command format message.
-
-
Marking a student’s work for an assessment
-
Test case:
academics mark INDEX stu/Simon_Lam-90
where INDEX is a valid index and Simon Lam is an existing student in TeaPet who scored 90 for the given assessment.
Expected: Simon Lam’s work will be marked and his score of 90 will be stored in the specified assessment if the given index is valid. The status message either displays that the student’s work has been marked or show that the index given is invalid. -
Other incorrect marking commands to try:
academics mark
Expected: Status bar displays invalid command and incorrect command format message.
-
-
Exporting academic statistics into .csv file.
-
Test case:
academics export
Expected: A file named studentAcademics.csv should be created in the data folder of the same directory in which TeaPet is installed.
-
PROJECT: PowerPointLabs
{Optionally, you may include other projects in your portfolio.}