Overview
ProManage is a professional desktop application for companies that specialises in handling and executing projects. ProManage allow Manager and Employees of project teams to manage their team members and events easily. ProManage is optimized for those who prefer to work with a Command Line Interface (CLI) while still having the benefits of a Graphical User Interface (GUI).
This project portfolio documents my contributions to the development of the CS2113 project, as part of my team T16-2.
Summary of contributions
-
Major enhancement: added the ability to manage and view employees' events via the
invite,removeandselectcommands-
What it does: allows the user to invite employees to events, remove employees from events, and select and view an employee’s event schedule on the indicated date, month or year which is displayed on the event list panel.
-
Justification: This feature facilitates managing and scheduling of events among teams of employees who have different work schedules, and allow managers and employees to monitor and handle their event schedules easily. Schedule conflicts can be avoided and resolved easily with this enhancement.
-
Highlights: This feature considers whether the event an employee is invited to clashes with the particular employee’s work schedule, and guarantees that schedule conflict will not occur. The underlying
Eventmodel structure implemented for this enhancement is carefully designed and allows extension commandsviewmineandselectEventto be easily implemented.
-
-
Minor enhancement:
-
set up the event list panel to display the events for the UI
-
added the
addEventcommand, which also warns the user when the planned event clashes or coincides with other existing events at the same location and time -
improved the
editEventcommand, which warns the user when the changed time or date of the edited event leads to schedule conflicts with any of the event’s attendees
-
-
Code contributed: [Functional and Test code]
-
Other contributions:
-
Project management:
-
Managed releases
v1.1-v1.4(6 releases) on GitHub -
Managed the issue tracker and project dashboard on GitHub
-
-
Enhancements to existing features:
-
Documentation:
-
Updated the User Guide to include
addEvent,editEvent,invite,removeandselectcommand -
Updated the Developer Guide to include implementation details, use case, user stories and instructions for manual testing for
inviteandselectcommand. -
Updated the
Model,UIandLogicclass diagram in Developer Guide
-
-
Community:
-
Tools:
-
Integrated GitHub Plugins (Coveralls, Travis CI, AppVeyor)
-
Automated team documentation build on GitHub pages
-
-
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. |
Inviting employee to event: invite
Priority level: all
Invites an employee to an event.
Format: invite PERSON_INDEX to/EVENT_INDEX
Example:
-
invite 1 to/3
Invite 1st employee on employee list to 3rd event on event list
Removing employee from event: remove
Priority level: default,manager
Removes an employee from the an event.
Format/Prompts: remove PERSON_INDEX from/EVENT_INDEX
Example:
-
remove 2 from/4
Remove 2nd employee at employee list from 4th event at event list
Selecting a person: select
Priority level: all
Selects an employee and view the selected employee’s events at the indicated time on the event list panel.
Format/Prompts:
Enter a command: select PERSON_INDEX [date/DATE] [m/MONTH] [y/YEAR]
Examples:
-
select 1: view all events of employee at index 1 -
select 1 date/2018-10-31: view all events of employee at index 1 at 2018-10-31 -
select 1 m/08: view all events of employee at index 1 in August -
select 1 y/2018: view all events of employee at index 1 in 2018 -
select 1 y/2018 m/08: view all events of employee at index 1 in August 2018
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. |
Storage component
Model component
Invite feature
Current Implementation
The invite command allows users to add attendees to an existing event, which is represented by an Event object.
The command currently only allows users to add a single person to an event at a time, based on the indices on the UI.
This command adds the to-be-invited Person 's email, which is unique, to the chosen Event, so that the attendees of a particular event is recorded.
The adding of attendees is facilitated by the class: Attendees, which consists of a list of emails of type String.
The following is a more detailed description of the Attendee class:
-
Attendees-
Each
Eventobject consist of anAttendeesobject, which is a list of the emails of the differentPersonattending the event. -
This class is a wrapper class around the internal representation of a
Setof emails. -
Only the email of the
Personis recorded in anEvent, as the email should be unique and uneditable.
-
Storing only the email of Person in the Attendees object of Event saves memory storage and facilitates the select, viewmine and selectEvent feature.
As we select a person, we can simply iterate through the event list and check whether the person’s email is in the attendees list.
Similarly, as we select an event, we can first obtain the list of emails from the Attendees, and filter the employee list accordingly.
This command only executes successfully if the event does not not clash with the person’s schedule.
Given below is an illustration to describe the detection of whether two events clash, which is facilitated by the method hasClash in Event:
Event#hasClashThus, to check whether the event clashes with an employee’s schedule, we iterate through the ObservableList<Event> and check whether the Event 1) contains the employee’s email in the Attendee and 2) clashes with the selected event.
Implementation of RemoveCommand is similar to InviteCommand, but removes persons from Attendees of events instead.
Execution of Command
Given below is an example usage scenario and how the invite mechanism works.
For example, the user inputs invite 1 to/1 to invite the 1st person in the address book to the 1st event in the event list.
Step 1. The command text is passed to an instance of the LogicManager class.
Step 2. The LogicManager instance calls ProManageParser#parseCommand, which parses the invite command phrase.
Step 3. InviteCommandParser#parse parses the person and event index. An instance of the InviteCommand encapsulating the two indices information is then returned after parsing.
Step 4. Logic Manager then executes this InviteCommand by calling InviteCommand#execute.
Step 5. The filtered person list and event list is first obtained by calling PersonModel#getFilteredPersonList and EventModel#getFilteredEventList. Based on the indices, the Person and Event is selected. Then, the Person object’s email is obtained by calling Person#getEmail
Step 6. Two steps of verification is required before the person is invited to the event.
-
First,
Event#hasAttendeechecks whether the person is already invited to the event. -
Second,
Model#hasClashchecks whether the event clashes with the person’s schedule.
Step 7. After successful verification, the person’s email is added to the obtained Attendees object. The new Attendees object is then added to a new copy of the Event object.
Step 8. The new Event object is updated to the model by calling Model#updateEvent.
Step 9. The InviteCommand#execute finally returns a CommandResult with a success message.
The sequence diagram below illustrates the execution of the invite command.
Design Consideration
Aspect: How to link Person and Event
-
Alternative 1 (current choice): Saves only the emails of the Persons in the Attendees of Events.
-
Pros: Saves space. Able to filter EventList easily.
-
Cons: Requires going through the entire list of EventList to obtain details of events attended by the person.
-
-
Alternative 2: Saves the entire information of Events for each Persons.
-
Pros: Fast access to information of Events attended by any Persons.
-
Cons: Takes up a lot of storage space and memory. Many repeated items within the storage files.
-
Aspect: Data structure to support invite command
-
Alternative 1 (current choice): Use
HashSetto store persons emails.-
Pros: Easier and faster to retrieve or validate names stored. Able to handle duplicates easily.
-
Cons: Sequence of persons added is lost. Currently, this feature is not important for the project.
-
-
Alternative 2: Use
ArrayListto store persons emails.-
Pros: Emails are stored in order of addition.
-
Cons: Inefficient when handling data.
-
Future Improvements
Adding entire department or multiple persons to an event
The current invite command only invites one person to a chosen event based on the index chosen. This feature can be further extended to enable inviting more than one person or an entire department to an event.
One possible way to to implement this is to have the user
-
input a certain range (2-5) or
-
multiple indices (1,3,6,7,8) or
-
input the department name
The same concept can also be applied to events, being able to invite one person to multiple events with one single command.
Implementation of this additional feature would require changes to both InviteCommandParser and InviteCommand#execute. Additionally, handling of clashing events needs to be considered as it now involves more than one participant and event.
Similar improvements can be made to remove command, being able to remove a person from a number of events with one single command.