{ list here sources of all reused/adapted ideas, code, documentation, and third-party libraries -- include links to the original source as well }
Refer to the guide Setting up and getting started.
The Architecture Diagram given above explains the high-level design of the App.
Given below is a quick overview of main components and how they interact with each other.
Main components of the architecture
Main
(consisting of classes Main
and MainApp
) is in charge of the app launch and shut down.
The bulk of the app's work is done by the following four components:
UI
: The UI of the App.Logic
: The command executor.Model
: Holds the data of the App in memory.Storage
: Reads data from, and writes data to, the hard disk.Commons
represents a collection of classes used by multiple other components.
How the architecture components interact with each other
The Sequence Diagram below shows how the components interact with each other for the scenario where the user issues the command delete 1
.
Each of the four main components (also shown in the diagram above),
interface
with the same name as the Component.{Component Name}Manager
class (which follows the corresponding API interface
mentioned in the previous point.For example, the Logic
component defines its API in the Logic.java
interface and implements its functionality using the LogicManager.java
class which follows the Logic
interface. Other components interact with a given component through its interface rather than the concrete class (reason: to prevent outside component's being coupled to the implementation of a component), as illustrated in the (partial) class diagram below.
The sections below give more details of each component.
The API of this component is specified in Ui.java
The UI consists of a MainWindow
that is made up of parts e.g.CommandBox
, ResultDisplay
, PersonListPanel
, StatusBarFooter
etc. All these, including the MainWindow
, inherit from the abstract UiPart
class which captures the commonalities between classes that represent parts of the visible GUI.
The UI
component uses the JavaFx UI framework. The layout of these UI parts are defined in matching .fxml
files that are in the src/main/resources/view
folder. For example, the layout of the MainWindow
is specified in MainWindow.fxml
The UI
component,
Logic
component.Model
data so that the UI can be updated with the modified data.Logic
component, because the UI
relies on the Logic
to execute commands.Model
component, as it displays Person
object residing in the Model
.API : Logic.java
Here's a (partial) class diagram of the Logic
component:
The sequence diagram below illustrates the interactions within the Logic
component, taking execute("delete 1")
API call as an example.
Note: The lifeline for DeleteCommandParser
should end at the destroy marker (X) but due to a limitation of PlantUML, the lifeline continues till the end of diagram.
How the Logic
component works:
Logic
is called upon to execute a command, it is passed to an AddressBookParser
object which in turn creates a parser that matches the command (e.g., DeleteCommandParser
) and uses it to parse the command.Command
object (more precisely, an object of one of its subclasses e.g., DeleteCommand
) which is executed by the LogicManager
.Model
when it is executed (e.g. to delete a person).Model
) to achieve.CommandResult
object which is returned back from Logic
.Here are the other classes in Logic
(omitted from the class diagram above) that are used for parsing a user command:
How the parsing works:
AddressBookParser
class creates an XYZCommandParser
(XYZ
is a placeholder for the specific command name e.g., AddCommandParser
) which uses the other classes shown above to parse the user command and create a XYZCommand
object (e.g., AddCommand
) which the AddressBookParser
returns back as a Command
object.XYZCommandParser
classes (e.g., AddCommandParser
, DeleteCommandParser
, ...) inherit from the Parser
interface so that they can be treated similarly where possible e.g, during testing.API : Model.java
The Model
component,
Person
and Group
objects (which are contained in a UniquePersonList
and UniqueGroupList
object, respectively).Person
objects (e.g., results of a search query) as a separate filtered list which is exposed to outsiders as an unmodifiable ObservableList<Person>
that can be 'observed' e.g. the UI can be bound to this list so that the UI automatically updates when the data in the list change.UserPref
object that represents the user’s preferences. This is exposed to the outside as a ReadOnlyUserPref
objects.Model
represents data entities of the domain, they should make sense on their own without depending on other components)Note: An alternative (arguably, a more OOP) model is given below. It has a Group
list in the AddressBook
, which Person
references. This allows AddressBook
to only require one Group
object per unique group, instead of each Person
needing their own Group
objects.
API : Storage.java
The Storage
component,
AddressBookStorage
and UserPrefStorage
, which means it can be treated as either one (if only the functionality of only one is needed).Model
component (because the Storage
component's job is to save/retrieve objects that belong to the Model
)Classes used by multiple components are in the seedu.addressbook.commons
package.
This section describes some noteworthy details on how certain features are implemented.
The delete student feature allows users to delete an existing student information from the student contact list
using the command delete INDEX
.
The delete
command mechanism is facilitated by the DeleteCommand
and the DeleteCommandParser
.
It allows users to delete a student contact from the student contact list.
It uses the AddressBook#removePerson(Person key)
which is exposed in the Model
interface as Model#deletePerson(Person personToDelete)
. Then, the remove(Person person)
is called on the UniquePersonList
in TutorsContactsPro
to delete the student contact from the list.
A modification from AB3 delete mechanism is that the delete
command also involves the facilitation of the AddressBook#deassignPerson(Person persontToDeassign, Group group)
which is exposed in the Model
interface as Model#deassignPerson(Person person, Group group)
, which result in the call of Group#deassign(Person person)
to
deassign the deleted student contact from all previously assigned groups.
The users inputs the delete
command.
The TutorsContactsPro
then preliminary process the input and creates a new DeleteCommandParser
.
The DeleteCommandParser
then calls the ParserUtil#parseIndex()
to check for the validity of the INDEX
. At this stage, if the INDEX is invalid or absent
, ParseException
would be thrown.
The DeleteCommandParser
then creates the DeleteCommand
based on the processed input.
The LogicManager
executes the DeleteCommand
.
The DeleteCommand
calls the Model#getFilteredPersonList()
to get the unmodifiable view of the filtered student list to get the target
student to delete based on the provided INDEX
.
At this stage, CommandException
would be thrown if the input INDEX
is invalid (i.e. INDEX
exceeds the size of the student contact list).
The DeleteCommand
then calls the Model#deletePerson(Person personToDelete)
to delete the target student contact from the
student contact list.
DeleteCommand
creates a CommandResult
with a success message and return it to the LogicManager
to complete the command execution.
The GUI would also be updated on this change in the student contact list accordingly.The following sequence diagram shows how the delete
mechanism works:
The following activity diagram summarizes what happens when a user executes the delete
command:
The find
command allows the search of a student using name via the command find KEYWORDS
where KEYWORDS
is the NAME
of the student.
The feature is made possible through introducing an AttributeContainsKeywordsPredicate
interface which is
implemented by all the Person
's attributes. Hence, there are more classes being introduced -
NameContainsKeywordsPredicate
, PhoneContainsKeywordsPredicate
and so on.
Given below is the example usage scenario and how the find
mechanism behaves at each step.
The user inputs the find
command and provide the input with the name of the student in which the user wants to find the contact.
The TutorsContactsPro
then does preliminary processing to the user input and creates a new FindCommandParser
.
The FindCommandParser
then parses the user input and checks whether the required KEYWORD
is present.
If the required KEYWORD
is present, FindCommandParser
will then call the ParserUtil#parseName()
to check for the validity of the input NAME
.
At this stage, ParseException
would be thrown if the
NAME
specified is invalid.
The FindCommandParser
then creates the FindCommand
based on the processed inputs.
LogicManager
executes the FindCommand
.FindCommand
calls the Model#updateFilteredPersonList()
to update the filtered person list based on the user input KEYWORD
.FindCommand
then calls the Model#getFilteredPersonList()#size()
to get the size of the person list. The size will correspond to the number of persons listed.FindCommand
creates a CommandResult
with a success message and return it to the LogicManager
to complete the command execution.
The GUI would also be updated on this change in the student list and update the display of student list accordingly.The following sequence diagram shows how the find
mechanism works:
The following activity diagram summarizes what happens when a user executes the find
command:
Alternative 1 (current choice): finds student contact without any prefixes.
find
command to search for students. User may be left confused and find difficult to remember that find search for students using their name without the n/
prefix.Alternative 2 (current choice): finds through partial search (eg. Dav
to find David
)
The filter students by group feature allows users to filter and list students in the address book whose group name matches the specified keywords. It helps users to quickly find students belonging to specific groups.
The filtering mechanism is facilitated by the FilterCommand
and the FilterCommandParser
.
It enables users to filter students based on the groups they belong to. It utilizes the Model
interface to interact with the student contact list.
The users inputs the filter
command along with the group keywords.
The TutorsContactsPro then preliminarily processes the input and creates a new FilterCommandParser
.
The FilterCommandParser
then checks for the validity of the provided group keywords. If the keywords are invalid or absent, a ParseException
is thrown.
The FilterCommandParser
creates the FilterCommand
based on the processed input, with a GroupContainsKeywordsPredicate
to filter students based on the specified groups.
The LogicManager
executes the FilterCommand
.
The FilterCommand
calls the Model#updateFilteredPersonList()
method to update the filtered person list according to the specified group keywords.
FilterCommand
creates a CommandResult with the list of students matching the specified groups, and returns it to the LogicManager to complete the command execution.
The GUI would also be updated accordingly to display the filtered list of students.The following sequence diagram illustrates how the filter
mechanism works:
The following activity diagram summarizes what happens when a user executes the filter
command:
Alternative 1 (current choice): filters student contact without any prefixes.
filter
command to search for students. User may confuse this command with the previous find
command.Alternative 2: filter only allows for a single GROUP_NAME
input
John
belongs to both TUT04
and LAB05
that is taught by the user. Filter student contacts separately for the two groups will result in John
contact to appear twice which can be inconvenient when the user wants to retrieve unique student contacts from the two groups.Alternative 3 (current choice): filter only allows for multiple GROUP_NAME
input
Results
tab wil already display all student contacts.Marks the student's attendance according to the group name and week number. This allows users to easily keep track of students' attendance details.
The mark attendance mechanism is facilitated by the MarkAttendanceCommand
and the MarkAttendanceCommandParser
.
It utilizes the Model
interface to interact with the student contact list.
The users inputs the mark
command along with the desired student index, group name, week number and the student's attendance (whether they are present, P
or absent A
)
The TutorsContactsPro then preliminarily processes the inputs and creates a new MarkAttendanceCommandParser
.
The MarkAttendanceCommandParser
then parses the user input and checks whether all the input attributes are present by checking the presence of the prefixes for group, week and attendance which are /g
, /w
and /a
respectively.
It also checks whether the command is in the correct format.
At this stage, if not all the prefixes are present,
ParseException
would be thrown.
The LogicManager
executes the MarkAttendanceCommand
.
The MarkAttendanceCommand
calls the Model#getFilteredPersonList()
to get the unmodifiable view of the filtered student list to get the target
student to mark attendance based on the provided INDEX
.
At this stage, CommandException
would be thrown if the input INDEX
is invalid (i.e. INDEX
exceeds the size of the student contact list).
MarkAttendanceCommand
it returns a CommandResult object indicating the success or failure of the operation.
The result message is then displayed to the user via the GUI. The attendance table of the particular studne will then be updated accordingly.The following sequence diagram illustrates how the mark
mechanism works:
The following activity diagram summarizes what happens when a user executes the mark
command:
The add group feature allows users users to create a new group in TutorsContactsPro.
addgroup g/GROUP_NAME
.
The addgroup
command mechanism is facilitated by the AddGroupCommand
and the AddGroupCommandParser
.
It allows TA users to add a not-already-existing-group to TutorsContactsPro.
It uses the AddressBook#addGroup(Group group)
which is exposed in the Model
interface as Model#addGroup(Group group)
. Then, the add(Group groupToAdd)
is called on the UniqueGroupList
in AddressBook
to add the group to the group list.
Given below is the example usage scenario and how the add group mechanism behaves at each step.
The users user inputs the addgroup
command and provides the GROUP_NAME
of the group in which the TA user wants to add.
The TutorsContactsPro
then does preliminary processing to the input and creates a new AddGroupCommandParser
.
The AddGroupCommandParser
then parses the user input and checks whether all the input attributes are present by checking the presence of the prefixes.
It also checks whether the command is in the correct format. In this case, the required prefix and attribute is g/GROUP_NAME
.
At this stage, if not all the prefixes are present,
ParseException
would be thrown.
If the required prefixes and attributes are present (i.e. g/GROUP_NAME
), AddGroupCommandParser
will then call the ParserUtil#parseGroupName()
method to check for the validity of the input GROUP_NAME
.
At this stage, ParseException
would be thrown if the
GROUP_NAME
specified is invalid.
The AddGroupCommandParser
then creates the AddGroupCommand
based on the processed input.
The LogicManager
executes the AddGroupCommand
.
The AddGroupCommand
calls the Model#hasGroup()
to check if the group with the same GROUP_NAME
has already existed in the group list.
CommandException
would be thrown if there already existed a group with the same group name.
The AddGroupCommand
then calls the Model#addGroup()
to add the input group to the list.
AddGroupCommand
creates a CommandResult
with a success message and return it to the LogicManager
to complete the command execution.
The GUI would also be updated on this change and created a new dedicated group tab for this new group added.The following sequence diagram shows how the addgroup
mechanism works:
The following activity diagram summarizes what happens when a user executes the addgroup
command:
The edit group feature allows users to add or edit the Telegram invite link assigned for each group.
editgroup g/GROUP_NAME tg/TELEGRAM_LINK
.
The editgroup
command mechanism is facilitated by the EditGroupCommand
and the EditGroupCommandParser
.
It allows TA users to edit an existing group in TutorsContactsPro.
It uses the AddressBook#addGroup(Group group)
which is exposed in the Model
Given below is the example usage scenario and how the add group mechanism behaves at each step.
The users user inputs the editgroup
command and provides the GROUP_NAME
of the group in which the user wants to add or edit using the new TELEGRAM_LINK
provided.
The TutorsContactsPro
then does preliminary processing to the input and creates a new EditGroupCommandParser
.
The EditGroupCommandParser
then parses the user input and checks whether all the input attributes are present by checking the presence of the prefixes.
It also checks whether the command is in the correct format. In this case, the required prefix and attribute is g/GROUP_NAME
and tg/TELEGRAM_LINK
.
At this stage, if not all the prefixes are present,
ParseException
would be thrown.
If the required prefixes and attributes are present (i.e. g/GROUP_NAME
), EditGroupCommandParser
will then call the ParserUtil#parseGroupName()
method to check for the validity of the input GROUP_NAME
and TELEGRAM_LINK
.
At this stage, ParseException
would be thrown if the
GROUP_NAME
or TELEGRAM_LINK
specified is invalid.
The EditGroupCommandParser
then creates the EditGroupCommand
based on the processed input.
The LogicManager
executes the EditGroupCommand
.
The EditGroupCommand
calls the Model#hasGroup()
to check if the group with the GROUP_NAME
already existed in the group list.
CommandException
would be thrown if there are no group present with the same group name.
The EditGroupCommand
then calls the Model#editroup()
to edit the input group's Telegram invite link.
EditGroupCommand
creates a CommandResult
with a success message and return it to the LogicManager
to complete the command execution.The following sequence diagram shows how the editgroup
mechanism works:
The following activity diagram summarizes what happens when a user executes the editgroup
command:
The delete group feature allows users to delete an existing student group in
the student group list via the command deletegroup g/GROUP_NAME
.
The deletegroup
command mechanism is facilitated by the DeleteGroupCommand
and the DeleteGroupCommandParser
.
It allows users to delete an already-existing-group from the ArchDuke student group list. It uses the AddressBook#removeGroup(Group key)
which is exposed in the Model
interface as Model#deleteGroup(Group target)
. Then, the remove(Group toRemove)
is called on the UniqueGroupList
to remove the group from the group list.
Given below is the example usage scenario and how the delete group mechanism behaves at each step.
The user inputs the deletegroup
command and provide the GROUP_NAME
of the group in which the user wants to remove.
The TutorsContactsPro
then does preliminary processing to the user input and creates a new DeleteGroupCommandParser
.
The DeleteGroupCommandParser
then parses the user input and check whether all the input attributes are present by checking the presence of the prefixes.
It also checks whether the command is in the correct format. In this case, the required prefix and attribute is g/GROUP_NAME
.
At this stage, if not all the prefixes are present,
ParseException
would be thrown.
If the required prefixes and attributes are present (i.e. g/GROUP_NAME
), DeleteGroupCommandParser
will then call the ParserUtil#parseGroupName()
method to check for the validity of the input GROUP_NAME
.
At this stage, ParseException
would be thrown if the
GROUP_NAME
specified is invalid.
The DeleteGroupCommandParser
then creates the DeleteGroupCommand
based on the processed input.
The LogicManager
executes the DeleteGroupCommand
.
The DeleteGroupCommand
calls the Model#getFilteredGroupList()
to get the current unmodifiable view of the filtered group list.
The DeleteGroupCommand
calls the contains()
method on the obtained filtered group list to check if the group with the same GROUP_NAME
existed in the group list.
CommandException
would be thrown if there exists no group with the same group name.
The DeleteGroupCommand
then calls the Model#deleteGroup()
to delete the input group to from the group list.
DeleteGroupCommand
creates a CommandResult
with a success message and return it to the LogicManager
to complete the command execution.
The GUI would also be updated on this change and remove the dedicated group tab for the group deleted.The following sequence diagram shows how the deletegroup
mechanism works:
The following activity diagram summarizes what happens when a user executes the deletegroup
command:
The Mail Command feature enables users to generate an email template prefilled with the email addresses of students filtered based on specified keywords. This command can be used to compose emails to these students directly from the user's default email client.
The Mail Command feature is implemented using the MailCommand
class and its corresponding parser, MailCommandParser
.
The user inputs the mail
command followed by optional keywords specifying groups of students they want to include in the email.
The MailCommandParser
parses the input arguments to extract the specified keywords.
If no keywords are provided, an empty MailCommand
is created, which results in the generation of a mailto link for all students.
If keywords are provided, the parser validates them to ensure they conform to the expected format. If any keyword is invalid, a ParseException
is thrown.
The MailCommand
with the appropriate predicate is then created using the GroupContainsKeywordsPredicate
, which filters the students based on the specified keywords.
When the MailCommand
is executed, it updates the filtered person list in the model based on the provided predicate.
It then extracts the email addresses of the filtered students from the model.
Using these email addresses, it generates a mailto link, concatenating them with semicolons to form a single string.
CommandResult
object and returned to the logic manager for further handling.The Mail Command feature provides an efficient way for users to compose emails to specific groups of students directly from the application. By leveraging the power of filtering, it allows for targeted communication while maintaining simplicity and ease of use.
The following sequence diagram illustrates how the mail
mechanism works:
The following activity diagram summarizes what happens when a user executes the mail
command:
The Mailtg Command feature enables users to generate an email template containing the Telegram link for a specific group and prefilled with the email addresses of students filtered based on specified keywords. This command can be used to compose emails to these students directly from the user's default email client.
The Mailtg Command feature is implemented using the MailTelegramCommand
class and its corresponding parser, MailTelegramCommandParser
.
The user inputs the mailtg
command followed by the /g
prefix and the keywords specifying groups of students they want to include in the email and the specific group's Telegram invite link.
The MailTelegramCommandParser
parses the input arguments to extract the specified keywords.
If keywords are provided, the parser validates them to ensure they conform to the expected format. If any keyword is invalid, a ParseException
is thrown.
The MailTelegramCommand
with the appropriate predicate is then created using the GroupContainsKeywordsPredicate
, which filters the students based on the specified keywords.
When the MailTelegramCommand
is executed, it updates the filtered person list in the model based on the provided predicate.
It then extracts the email addresses of the filtered students from the model and the Telegram invite link assigned to the specific group.
Using these email addresses and Telegram invite link, it generates a mailto link using the createMailtoUrl
function.
CommandResult
object and returned to the logic manager for further handling.The Mailtg Command feature provides an efficient way for users to compose emails to specific groups of students directly from the application. By leveraging the power of filtering, it allows for targeted communication while maintaining simplicity and ease of use.
The following sequence diagram illustrates how the mailtg
mechanism works:
The following activity diagram summarizes what happens when a user executes the mailtg
command:
The proposed undo/redo mechanism is facilitated by VersionedAddressBook
. It extends AddressBook
with an undo/redo history, stored internally as an addressBookStateList
and currentStatePointer
. Additionally, it implements the following operations:
VersionedAddressBook#commit()
— Saves the current major book state in its history.VersionedAddressBook#undo()
— Restores the previous major book state from its history.VersionedAddressBook#redo()
— Restores a previously undone major book state from its history.These operations are exposed in the Model
interface as Model#commitAddressBook()
, Model#undoAddressBook()
and Model#redoAddressBook()
respectively.
Given below is an example usage scenario and how the undo/redo mechanism behaves at each step.
Step 1. The user launches the application for the first time. The VersionedAddressBook
will be initialized with the initial major book state, and the currentStatePointer
pointing to that single major book state.
Step 2. The user executes delete 5
command to delete the 5th person in the major book. The delete
command calls Model#commitAddressBook()
, causing the modified state of the major book after the delete 5
command executes to be saved in the addressBookStateList
, and the currentStatePointer
is shifted to the newly inserted major book state.
Step 3. The user executes add n/David …
to add a new person. The add
command also calls Model#commitAddressBook()
, causing another modified major book state to be saved into the addressBookStateList
.
Note: If a command fails its execution, it will not call Model#commitAddressBook()
, so the major book state will not be saved into the addressBookStateList
.
Step 4. The user now decides that adding the person was a mistake, and decides to undo that action by executing the undo
command. The undo
command will call Model#undoAddressBook()
, which will shift the currentStatePointer
once to the left, pointing it to the previous major book state, and restores the major book to that state.
Note: If the currentStatePointer
is at index 0, pointing to the initial AddressBook state, then there are no previous AddressBook states to restore. The undo
command uses Model#canUndoAddressBook()
to check if this is the case. If so, it will return an error to the user rather
than attempting to perform the undo.
The following sequence diagram shows how an undo operation goes through the Logic
component:
Note: The lifeline for UndoCommand
should end at the destroy marker (X) but due to a limitation of PlantUML, the lifeline reaches the end of diagram.
Similarly, how an undo operation goes through the Model
component is shown below:
The redo
command does the opposite — it calls Model#redoAddressBook()
, which shifts the currentStatePointer
once to the right, pointing to the previously undone state, and restores the major book to that state.
Note: If the currentStatePointer
is at index addressBookStateList.size() - 1
, pointing to the latest major book state, then there are no undone AddressBook states to restore. The redo
command uses Model#canRedoAddressBook()
to check if this is the case. If so, it will return an error to the user rather than attempting to perform the redo.
Step 5. The user then decides to execute the command list
. Commands that do not modify the major book, such as list
, will usually not call Model#commitAddressBook()
, Model#undoAddressBook()
or Model#redoAddressBook()
. Thus, the addressBookStateList
remains unchanged.
Step 6. The user executes clear
, which calls Model#commitAddressBook()
. Since the currentStatePointer
is not pointing at the end of the addressBookStateList
, all major book states after the currentStatePointer
will be purged. Reason: It no longer makes sense to redo the add n/David …
command. This is the behavior that most modern desktop applications follow.
The following activity diagram summarizes what happens when a user executes a new command:
Aspect: How undo & redo executes:
Alternative 1 (current choice): Saves the entire major book.
Alternative 2: Individual command knows how to undo/redo by itself.
delete
, just save the person being deleted).Target user profile:
Value proposition: manage students faster than a typical GUI driven app
Priorities: High (must have) - * * *
, Medium (nice to have) - * *
, Low (unlikely to have) - *
Priority | As a … | I want to … | So that I can… |
---|---|---|---|
* * * | TA | add new students to the app | keep track of their information |
* * * | TA | edit student profiles | keep their information up to date. |
* * * | TA | delete students from my class | track the existing number of students in my tutorial class |
* * * | TA | list all students in my class(es) | view all of my students’ details at one glance |
* * * | TA | search for specific students using keywords | quickly find relevant information |
* * * | TA | filter students according to their group | quickly find relevant information |
* * * | TA | mark attendance for a specific student | keep track of each student's attendance details |
* * * | TA | add a new group | keep track of the groups that i teach |
* * * | TA | add a Telegram link to each group | keep track of the Telegram invite links for each group that i teach |
* * * | TA | delete an existing group | track the existing number of groups that i currently teach |
* * * | TA | generate an email template | conveniently sent an email to the student recipients desired |
* * * | TA | generate an email template containing the Telegram link | conveniently sent an email containing the Telegram invite link to the student recipients desired |
* * | new TA user | be able to access a help window | easily seek help for the errors encountered |
(For all use cases below, the System is the TutorsContactsPro
and the Actor is the Tutor
, unless specified otherwise)
Use case: UC01 - Add a student
MSS
TA requests to list students
System shows a list of students
TA requests to add a specific student to the list
System adds the student
Use case ends.
Extensions
2a. The list is empty.
Use case ends.
3a. The add command parameters are invalid or incomplete.
3a1. TutorsContactsPro shows an error message.
Use case resumes at step 2.
3b. TutorsContactsPro detects that the student already exists on the list.
3b1. TutorsContactsPro informs the TA that the student already exists on the list.
3b2. TA confirms cancellation of adding the student.
Use case ends.
Use case: UC02 - Edit a student
MSS
TA requests to list students
System shows a list of students
TA requests to edits the particulars of the student
System records the changes
Use case ends.
Extensions
2a. The list is empty.
Use case ends.
3a. The given index is invalid.
3a1. TutorsContactsPro shows an error message.
Use case resumes at step 2.
3b. The edit command parameters are invalid or incomplete.
3b1. TutorsContactsPro shows an error message.
Use case resumes at step 2.
Use case: UC03 - Delete a student
MSS
TA requests to list students
System shows a list of students
TA requests to delete a student
System records the changes
Use case ends.
Extensions
2a. The list is empty.
Use case ends.
3a. The given index is invalid.
3a1. TutorsContactsPro shows an error message.
Use case resumes at step 2.
Use case: UC04 - List all students
MSS
TA requests to list students
System shows a list of students
Use case ends.
Extensions
2a. The list is empty.
Use case ends.
Use case: UC05 - Find a student
MSS
TA requests to list students
System shows a list of students
TA finds student(s) by keyword
System shows a list of students matching the keyword
Use case ends.
Extensions
2a. The list is empty.
Use case ends.
3a. The given keyword is in an incorrect format (e.g., contains special characters not allowed, exceeds maximum length).
4a. The list of search results is empty.
Use case ends.
Use case: UC06 - Filter students according to their group
MSS
TA requests to list students
System shows a list of students
TA filters student(s) by keyword which is the group name desired
System shows a list of students that belong to the group
Use case ends.
Extensions
2a. The list is empty.
Use case ends.
3a. The given keyword is in an incorrect format (e.g., contains special characters not allowed, exceeds maximum length, incorrect group name format).
4a. The list of search results is empty.
Use case ends.
Use case: UC07 - Mark student's attendance
MSS
TA requests to list students
System shows a list of students
TA marks the attendance of a specific student from a particular group during a lesson week
System updates the attendance the student for that particular group accordingly
Use case ends.
Extensions
2a. The list is empty.
Use case ends.
3a. The given keyword is in an incorrect format (e.g., contains special characters not allowed, exceeds maximum length, incorrect group name format).
Use case: UC08 - Add a group
MSS
TA requests to add a specific group
System adds the group
Use case ends.
Extensions
1a. The addgroup command parameters are invalid or incomplete.
1a1. TutorsContactsPro shows an error message.
Use case resumes at step 2.
1b. TutorsContactsPro detects that the group already exists on the list.
1b1. TutorsContactsPro informs the tutor that the group already exists on the list.
1b2. Tutor confirms cancellation of adding the group.
Use case ends.
Use case: UC09 - Add a Telegram link
MSS
TA requests to add a specific Telegram link to a particular group
System adds the Telegram link to the group
Use case ends.
Extensions
1a. The given Telegram link is invalid or incomplete.
Use case resumes at step 1.
Use case: UC10 - Delete a group
MSS
TA requests to delete a student
System records the changes
Use case ends.
Extensions
1a. The given group name parameter is invalid or incomplete.
1a1. TutorsContactsPro shows an error message.
Use case resumes at step 1.
Use case: UC011 - Generate email template
MSS
TA requests generation of an email template for specific group(s)
System shows the email template prefilled with emails of specific students recipients
Use case ends.
Extensions
1a. The given group name parameter is invalid.
Use case resumes at step 1.
Use case: UC012 - Generate email template containing Telegram invite link
MSS
TA requests generation of an email template to send the Telegram invite link for a specific group
System shows the email template prefilled with emails of specific students recipients and the Telegram invite link for that particular group
Use case ends.
Extensions
1a. The given group name parameter is invalid.
Use case resumes at step 1.
11
or above installed.These are the list of prefixes used in the commands for manual testing.
Prefix | Representation |
---|---|
n/ | NAME |
p/ | PHONE_NUMBER |
e/ | EMAIL |
y/ | YEAR |
m/ | MAJOR |
tg/ | TELEGRAM_HANDLE |
r/ | REMARKS |
g/ | GROUP_NAME |
w/ | WEEK |
a/ | ATTENDANCE |
Given below are instructions to test the app manually.
Note: These instructions only provide a starting point for testers to work on; testers are expected to do more exploratory testing.
Initial launch
i. Download the jar file and copy into an empty folder
ii. Double-click the jar file Expected: Shows the GUI with a set of sample contacts. The window size may not be optimum.
Saving window preferences
i. Resize the window to an optimum size. Move the window to a different location. Close the window.
ii. Re-launch the app by double-clicking the jar file.
Expected: The most recent window size and location is retained.
Listing all students
i. Test case: list
Expected: All students will be returned from the list. The number of students listed is shown in the status message. Timestamp in the status bar is updated.
Clears all data in TutorsContactsPro
i. Test case: clear
Expected: All data is cleared from TutorsContactsPro.
Exits TutorsContactsPro
i. Test case: exit
Expected: Exits TutorsContactsPro, and all data is being saved.
Provides detailed information on how to use the different features in TutorsContactsPro
i. Test case: help
Expected: Help window pops up.
ii. Test case: Press the F1
key
Expected: Similar to previous.
Adding a student while student list is being shown
i. Prerequisites: List all students using the list
command.
ii. Test case: add n/John Doe p/98765432 e/johnd@example.com y/2 m/Computer Science tg/johndoe r/Very quiet student g/TUT04 g/LAB10
Expected: Adds a student with the name John Doe
and the following attributes to the list. Details of added student shown in the status message.
iii. Test case : add s/J@hn Doe m/A0123459G
Expected: No student is added. Error details are shown in the status message.
iv. Test case : add s/John Doe
Expected: Similar to previous.
Deleting a student while all students are being shown
i. Prerequisites: List all students using the list
command. There can be multiple students in the list.
ii. Test case: delete 1
Expected: First student is deleted from the list. Details of the deleted student is shown in the status message. Timestamp in the status bar is updated.
iii. Test case: delete 0
Expected: No student is deleted. Error details shown in the status message. Status bar remains the same.
iv. Other incorrect delete commands to try: delete
, delete x
, ...
(where x is larger than the list size)
Expected: Similar to previous.
Edit a student to change their name/phone number/email address/year of study/major/Telegram handle/remark/group
Prerequisites: List all students using the list
command. There must be at least one student in the list.
Test case: edit 1 n/John
Expected: First student's name is changed to John for all instances. Other attributes of the student remains the same. Details of the new student name is shown in the status message.
Test case: edit 0 n/John
Expected: No student's details is changed. Error details shown in the status message.
Other incorrect edit student commands to try: edit x n/John
, edit 1 n/John p/12345678,
...` (where x is larger than the list size)
Expected: Similar to previous.
Finding a student while all students are being shown
i. Prerequisites: List all students using the list
command. There can be multiple persons in the list.
ii. Test case: find Al Yu
Expected: Students who have any part of their names starting with Al
or Yu
like Alex Yeoh
and Bernice Yu
will be returned from the list. The number of contacts found is shown in the status message. Timestamp in the status bar is updated.
iii. Test case: find Zoe
, assuming that there is no contact who has any part of his/her name starting with Zoe
Expected: No student is found. Error details shown in the status message. Status bar remains the same.
iv. Other incorrect find commands to try: find
Expected: Similar to previous.
Filtering students while all students are being shown
i. Prerequisites: List all students using the list
command. There can be multiple persons in the list.
ii. Test case: filter TUT10
Expected: Students who belongs to the group TUT10
will be returned from the list. The number of contacts found is shown in the status message. Timestamp in the status bar is updated.
iii. Test case: filter TUT01
, assuming that there is no contact who belongs to the group TUT01
Expected: No student is found. Error details shown in the status message. Status bar remains the same.
iv. Test case: filter TU01
, where an invalid KEYWORD/GROUP_NAME
is provided
Expected: No student is found. Error details shown in the status message. Status bar remains the same.
v. Other incorrect find commands to try: filter
Expected: Similar to previous.
Marking attendance of students while all students are being shown
i. Prerequisites: List all students using the list
command. There can be multiple persons in the list.
ii. Test case: mark 1 g/TUT05 w/1 a/P
Expected: Marks the attendance of the 1st student in the list. Marks TUT05
week 1 attendance as present. Details updated in the status message. Timestamp in the status bar is updated.
iii. Test case: mark 1 g/TUT01 w/1 a/P
, assuming that there is no contact who belongs to the group TUT01
Expected: No student is found. Error details shown in the status message. Status bar remains the same.
iv. Test case: mark 1 g/T05 w/1 a/P
, where an invalid GROUP_NAME
is provided
Expected: Error details shown in the status message. Status bar remains the same.
v. Test case: mark 1 g/TUT05 w/0 a/P
, where an invalid week number is provided
Expected: Error details shown in the status message. Status bar remains the same.
vi. Test case: mark 1 g/TUT05 w/1 a/B
, where an invalid ATTENDANCE
field is provided
Expected: Error details shown in the status message. Status bar remains the same.
vii. Other incorrect find commands to try: mark
Expected: Similar to previous.
Adding a group that has yet to exist in TutorsContactsPro.
i. Prerequisites: List all lessons using the list
command.
ii. Test case: addgroup g/LAB12
where group LAB12
does not exist in TutorsContactsPro
Expected: Adds the group LAB12
to TutorContactsPro. A new group tab labelled LAB12
is added. Details of the studio added shown in status message.
iii. Test case: addgroup g/RE1
where an invalid GROUP_NAME
is provided
Expected: No group added. Error details shown in the error message.
iv. Test case: addgroup g/TUT05
where group TUT05
already exists in TutorsContactsPro
Expected: No group added because the group with the exact same name already exists.
Error details shown in the error message.
v. Other incorrect add studio commands to try: addgroup
, addgroup g/
, ...
Expected: Similar to previous.
Editing a group that exists in TutorsContactsPro.
i. Prerequisite: List all lessons using the list
command.
ii. Test case: editgroup g/TUT05 tg/https://t.me/abcdefg
where group TUT05
exists in TutorsContactsPro
Expected: The group with the name TUT05
is edited and the Telegram invite link https://t.me/abcdefg
is assigned to group TUT05
.
The details of the edited group is shown in the success message.
iii. Test case: editgroup g/RE1 tg/https://t.me/abcdefg
where an invalid GROUP_NAME
is provided
Expected: No group edited. Error details shown in the error message.
iv. Test case: editgroup g/TUT01 tg/https://t.me/abcdefg
where group TUT01
does not exist in TutorsContactsPro
Expected: No group edited because the group does not exist.
Error details shown in the error message.
iv. Test case: editgroup g/TUT05 tg/
where no telegram invite link is provided
Expected: No group edited. Error details shown in the error message.
v. Other incorrect add studio commands to try: editgroup
, editgroup g/ tg/
, ...
Expected: Similar to previous.
Deleting a group that exists in TutorsContactsPro.
i. Prerequisite: List all lessons using the list
command.
ii. Test case: deletegroup g/TUT05
where group TUT05
exists in TutorsContactsPro
Expected: The group with the name TUT05
is deleted from TutorsContactsPro.
The group tab TUT05
is removed. The details of the deleted group is shown in the success message.
iii. Test case: deletegroup g/RE1
where an invalid GROUP_NAME
is provided
Expected: No group deleted. Error details shown in the error message.
iv. Test case: deletegroup g/TUT01
where group TUT01
does not exist in TutorsContactsPro
Expected: No group deleted because the group does not exist.
Error details shown in the error message.
v. Other incorrect add studio commands to try: addgroup
, addgroup g/
, ...
Expected: Similar to previous.
Generating prefilled email template containing the email addresses of students based on specific GROUP NAME
entered.
i. Prerequisite: List all lessons using the list
command.
ii. Test case: mail TUT05
where group TUT05
exists in TutorsContactsPro
Expected: Generates a email template containing email addresses of all students belonging to LAB05
iii. Test case: mail RE1
where an invalid GROUP_NAME
is provided
Expected: No email template generated. Error details shown in the error message.
iv. Test case: mail TUT01
where group TUT01
does not exist in TutorsContactsPro
Expected: No email template generated. Error details shown in the error message.
v. Other incorrect add studio commands to try: mail
, ...
Expected: Similar to previous.
Generates a prefilled email template, including the Telegram link for that specific group and email addresses of student recipients from the specified group.
i. Prerequisite: List all lessons using the list
command.
ii. Test case: mailtg g/TUT05
where group TUT05
exists in TutorsContactsPro
Expected: Generates a email template containing the Telegram invite link for group TUT05
and email addresses of all students belonging to LAB05
iii. Test case: mailtg g/RE1
where an invalid GROUP_NAME
is provided
Expected: No email template generated. Error details shown in the error message.
iv. Test case: mailtg g/TUT01
where group TUT01
does not exist in TutorsContactsPro
Expected: No email template generated. Error details shown in the error message.
v. Other incorrect add studio commands to try: mailtg
, mailtg g/
, ...
Expected: Similar to previous.
Dealing with missing data file(s).
i. Prerequisites: If there exists any addressbook.json in the data folder at the root of the application directory, delete the file.
ii. Test case: Double-click on the jar file to run the application.
Expected: Application runs and loads the sample data from SampleStudentUtil#getSampleStudentBook
, SampleTaskUtil#getSampleTaskBook
and/or SampleLessonUtil#getSampleLessonBook
.
Dealing with corrupted data file(s).
i. Prerequisites: Modify the addressbook.json to be an illegal format, such as deleting the “name” field of a student, "name" of a group etc.
ii. Test case: Double-click on the jar file to run the application.
Expected: Application runs and has no data on initial load. Running the next command overwrites the current corrupted json file(s).
Given below are the planned enhancements for the application.
Team size: 4
Improve add feature: Currently, TutorContactsPro allows the addition of students with the same exact details and names but different case for names which can be misleading. This can result in addition of duplicate students instead. Hence, we plan to improve the add
feature to detect whether students added have completely similar details regardless of casing and throw a duplicate student added warning where appropriate.
Allow the display of Telegram invite link: TutorsContactsPro currently only allows the assignment of the Telegram invite link to a specific group via the editgroup
command which is not too informative. We plan to improve the interface to include a field to display the Telegram invite link assigned for each specific group.
Improve the group tabs: After marking the attendance in a particular group tab, TutorsContactsPro currently will automatically direct users to the results tab which can result in inconvenience for users. We plan to improve the group tabs interface such that users will still be able to remain on their selected group tab aftering executing any commands.
Improve add Telegram link feature: Currently, TutorsContactsPro only allows the assignment of a Telegram invite link to a specific group via the editgroup
command which may not be very intuitive for users. We plan to improve this feature by combining it with the addgroup
feature to allow addition of a group together with the Telegram invite link.
Add unmark attendance feature: TutorsContactsPro currently allows TA users to mark the attendance for a particular student which can be inconvenient when users make a mistake marking the attendance and they are unable to undo it. Therefore, in the future, we plan to include an additional unmark attendance feature for a specified student.
Improve generation of email template command: The current mail
command only takes in the GROUP_NAME
input with no prefixes whereas the mailtg
command takes in a g/
prefix with a GROUP_NAME
input. The difference in the command format for these two closely related commands can make it complex for users. Therefore, we plan to simplify and standardise the command input for mail
and mailtg
to be g/GROUP_NAME
.
Improve generation of email template command: When executing mail, mailtg command with an invalid group, including an non-existing group, empty group and group without Telegram invite link. TutorsContactsPro currently does not display a warning for users. We plan to improve them such that a warning message will be displayed when the input provided is invalid.
Make filter feature error message more specific: When filtered with a non-existing group, the current error message displays0 students listed!
which is too general. We plan to filter
command check whether the GROUP_NAME
provided is an existing group. The error message will then also mention the reason for failing to filter any students: Group does not exist, 0 students listed!
Developing TutorsContactsPro presented several challenges for our team, ranging from moderate to high difficulty. These obstacles arose due to various factors:
Group
, and subsequently implemented additional commands to facilitate the modification of group information and associated fields.person
model to suit the specific requirements of our application, which entailed modifying and augmenting certain fields.Despite these challenges, our team remained committed and ultimately succeeded in delivering TutorsContactsPro, a robust and feature-rich application.
We had encountered the following challenges during the process of building TutorsContactsPro:
Due to the above difficulties and challenges faced, in addition to our implementation of relatively complex features including generating email templates, marking student's attendance and generating group tabs for GUI, a considerable amount of effort was put in to manage the additional dependencies and conduct additional unit/integration testing.