diff --git a/docs/DeveloperGuide.md b/docs/DeveloperGuide.md
index ea352d0597b..d72288e59a8 100644
--- a/docs/DeveloperGuide.md
+++ b/docs/DeveloperGuide.md
@@ -334,7 +334,8 @@ This is to prevent `SortCommand` from taking on more responsibilities (Separatio
* Pros: Easy to implement, controlled and less likely to be used incorrectly. This increase ease of use for users.
* Cons: Limited sorting and lesser functionality.
-### Meeting feature
+
+### Meeting Feature
Meeting is feature that allows the user to keep track of any events they may have with the particular contact. It contains the description of the meeting event with the date and time it would occur.
@@ -346,7 +347,30 @@ is used to handle any valid date time values. Each of this meeting are stored in
contains each of the meetings related to each other stored in an ```ObservableList```. The ``` MeetingManager ``` is
used to manage any operations that require viewing or sorting of meetings from the ```MeetingList``` class.
-#### What designs were considered:
+The operations for adding and deleting meeting are handled by `AddMeetingCommand` and `DeleteMeetingCommand`, which are supported by `AddMeetingCommandParser` and `DeleteMeetingCommandParser` respectively.
+
+1. The user enters `meeting-add 2 d/Finals s/20/04/2024 15:00` to add a meeting or `meeting-delete 1 i/1` to delete a meeting.
+2. `Logic Manager` receives the user input which is parsed by `StaffConnectParser`.
+3. After splitting the user input into `commandWord` and `arguments` based on the regex pattern of the user input, the `StaffConnectParser` invokes the `AddMeetingCommandParser`or`DeleteMeetingCommandParser` based on the `commandWord`. Calling the method `parse` with `arguments` as the method arguments, and getting supported by parsing methods from `ParsedUtil`.
+4. `AddMeetingCommand` or `DeleteMeetingCommand` is created with the parsed values.
+5. `Logic Manager` executes the `AddMeetingCommand` or `DeleteMeetingCommand`, which handles adding/removing meeting from the `Person` respectively and updates the model with the new information.
+
+Below is the sequence diagram for parsing inputs with `AddMeetingCommandParser` executing `meeting-add 2 d/Finals s/20/04/2024 15:00`:
+
![AddMeetingCommandParser Sequence Diagram](images/AddMeetingParserSequenceDiagram.png)
+
Below in the in-depth reference of how `AddMeetingCommandParser` utilise `ParseUtil` to parse the arguments:
+
![Add Parser Reference Diagram](images/AddParserRefrenceDiagram.png)
+
Similarly, the sequence diagram for parsing inputs with `DeleteMeetingCommandParser` executing `meeting-delete 1 i/1`:
+
![DeleteMeetingCommandParser Sequence Diagram](images/DeleteMeetingParserSequenceDiagram.png)
+
+After parsing, the commands are executed by the logic manager as show below. (Execute in the diagrams below comes form the logic manager)
+
Below is the sequence diagram for adding meeting with `AddMeetingCommand`:
+
![AddMeetingCommand Sequence Diagram](images/AddMeetingSequenceDiagram.png)
+
Similarly the sequence diagram for deleting meeting with `DeleteMeetingCommand`:
+
![DeleteMeetingCommand Sequence Diagram](images/DeleteMeetingSequenceDiagram.png)
+
Below is the sequence diagram of how both `AddMeetingCommand` and `DeleteMeetingCommand` copies the selected person from the model for editing:
+
![Copy selectedPerson](images/MeetingCopyPerson.png)
+
+#### What are the design considered:
**Aspect: How the meetings are stored :**
@@ -463,6 +487,7 @@ The following activity diagram summarizes what happens when a user executes a ne
* Pros: Will use less memory (e.g. for `delete`, just save the person being deleted).
* Cons: We must ensure that the implementation of each individual command are correct.
+
--------------------------------------------------------------------------------------------------------------------
## **Documentation, logging, testing, configuration, dev-ops**
@@ -621,6 +646,63 @@ Priorities: High (must have) - `* * *`, Medium (nice to have) - `* *`, Low (unli
Use case resumes at step 1.
+
+**Use case: Add a meeting**
+
+**MSS**
+
+1. StaffConnect shows a list of persons
+2. User requests to add a meeting to the specific person in the list
+3. StaffConnect adds the meeting to the person with the provided details
+
+ Use case ends.
+
+**Extensions**
+
+* 1a. The list is empty.
+
+ Use case ends.
+
+* 2a. The given index is invalid.
+
+ * 2a1. StaffConnect shows an error message.
+
+ Use case resumes at step 1.
+
+* 3a. The given details for meeting is invalid.
+ * 3a1. StaffConnect shows an error message.
+ Use case resumes at step 1.
+
+
+**Use case: Delete a meeting**
+
+**Precondition:** The intended meeting to delete exists and has been added before.
+
+**MSS**
+
+1. StaffConnect shows a list of persons
+2. User requests to delete a meeting of a specific person in the list
+3. StaffConnect deletes the specified meeting
+
+ Use case ends.
+
+**Extensions**
+
+* 1a. The list is empty.
+
+ Use case ends.
+
+* 2a. The given index for person is invalid.
+
+ * 2a1. StaffConnect shows an error message.
+
+ Use case resumes at step 1.
+
+* 2a. The given index for meeting is invalid.
+ * 2a1. StaffConnect shows an error message.
+ Use case resumes at step 1.
+
+
### Non-Functional Requirements
1. The app should work on any _mainstream OS_ as long as it has Java `11` or above installed.
diff --git a/docs/diagrams/AddMeetingParserSequenceDiagram.puml b/docs/diagrams/AddMeetingParserSequenceDiagram.puml
new file mode 100644
index 00000000000..1a8ea87dd37
--- /dev/null
+++ b/docs/diagrams/AddMeetingParserSequenceDiagram.puml
@@ -0,0 +1,43 @@
+@startuml
+!include style.puml
+skinparam ArrowFontStyle plain
+
+box Logic LOGIC_COLOR_T1
+participant ":LogicManager" as LogicManager LOGIC_COLOR
+participant ":StaffConnectParser" as StaffConnectParser LOGIC_COLOR
+participant ":AddMeetingCommandParser" as AddMeetingCommandParser LOGIC_COLOR
+participant "m:AddMeetingCommand" as AddMeetingCommand LOGIC_COLOR
+
+
+end box
+
+
+[-> LogicManager : execute("meeting-add 2 d/Finals/20/04/2024 15:00")
+activate LogicManager
+
+LogicManager -> StaffConnectParser : parseCommand("2 d/Finals s/20/04/2024 15:00")
+activate StaffConnectParser
+
+create AddMeetingCommandParser
+StaffConnectParser -> AddMeetingCommandParser
+activate AddMeetingCommandParser
+
+AddMeetingCommandParser --> StaffConnectParser
+deactivate AddMeetingCommandParser
+
+
+StaffConnectParser -> AddMeetingCommandParser : parse(arguments)
+activate AddMeetingCommandParser
+ref over AddMeetingCommandParser : parse arguments for meeting-add
+
+
+create AddMeetingCommand
+AddMeetingCommandParser -> AddMeetingCommand++
+return
+
+return m
+destroy AddMeetingCommandParser
+return m
+return
+
+@enduml
diff --git a/docs/diagrams/AddMeetingSequenceDiagram.puml b/docs/diagrams/AddMeetingSequenceDiagram.puml
new file mode 100644
index 00000000000..2cc513335d2
--- /dev/null
+++ b/docs/diagrams/AddMeetingSequenceDiagram.puml
@@ -0,0 +1,44 @@
+@startuml
+!include style.puml
+skinparam ArrowFontStyle plain
+
+box Logic LOGIC_COLOR_T1
+participant "m:AddMeetingCommand" as AddMeetingCommand LOGIC_COLOR
+participant "r:CommandResult" as CommandResult LOGIC_COLOR
+participant "editedPerson:Person " as editedPerson LOGIC_COLOR
+end box
+
+box Model MODEL_COLOR_T1
+participant ":ModelManager" as Model MODEL_COLOR
+end box
+
+
+[-> AddMeetingCommand : execute(model)
+activate AddMeetingCommand
+
+AddMeetingCommand -> Model : getSortedFilteredPersonList()
+activate Model
+return
+
+ref over AddMeetingCommand : copy selectedPerson
+
+AddMeetingCommand -> editedPerson : addMeeting()
+activate editedPerson
+return
+
+AddMeetingCommand -> editedPerson : updateSortedMeetingList(MEETING_DATE_THEN_DESCRIPTION_COMPARATOR);
+activate editedPerson
+return
+
+AddMeetingCommand -> Model : setPerson(selectedPerson, editedPerson)
+activate Model
+return
+
+create CommandResult
+AddMeetingCommand -> CommandResult++
+return
+
+return r
+
+
+@enduml
diff --git a/docs/diagrams/AddParserRefrenceDiagram.puml b/docs/diagrams/AddParserRefrenceDiagram.puml
new file mode 100644
index 00000000000..61ec6d93738
--- /dev/null
+++ b/docs/diagrams/AddParserRefrenceDiagram.puml
@@ -0,0 +1,37 @@
+@startuml
+!include style.puml
+skinparam ArrowFontStyle plain
+
+mainframe **sd** parse arguments for meeting-add
+
+box Logic LOGIC_COLOR_T1
+participant ":AddMeetingCommandParser" as AddMeetingCommandParser LOGIC_COLOR
+participant "<>\nParserUtil" as ParserUtil LOGIC_COLOR
+participant ":MeetingDescription" as MeetingDescription LOGIC_COLOR
+participant ":MeetingDateTime" as MeetingDateTime LOGIC_COLOR
+end box
+
+
+
+AddMeetingCommandParser -> ParserUtil : parseIndex()
+activate AddMeetingCommandParser
+activate ParserUtil
+return
+
+AddMeetingCommandParser -> ParserUtil : parseDescription()
+activate ParserUtil
+
+create MeetingDescription
+ParserUtil -> MeetingDescription++
+return
+return
+
+AddMeetingCommandParser -> ParserUtil : parseDateTime()
+activate ParserUtil
+create MeetingDateTime
+ParserUtil -> MeetingDateTime++
+return
+return
+
+
+@enduml
diff --git a/docs/diagrams/DeleteMeetingParserSequenceDiagram.puml b/docs/diagrams/DeleteMeetingParserSequenceDiagram.puml
new file mode 100644
index 00000000000..14743451250
--- /dev/null
+++ b/docs/diagrams/DeleteMeetingParserSequenceDiagram.puml
@@ -0,0 +1,48 @@
+@startuml
+!include style.puml
+skinparam ArrowFontStyle plain
+
+box Logic LOGIC_COLOR_T1
+participant ":LogicManager" as LogicManager LOGIC_COLOR
+participant ":StaffConnectParser" as StaffConnectParser LOGIC_COLOR
+participant ":DeleteMeetingCommandParser" as deleteMeetingCommandParser LOGIC_COLOR
+participant "<>\nParserUtil" as ParserUtil LOGIC_COLOR
+participant "d:DeleteMeetingCommand" as AddMeetingCommand LOGIC_COLOR
+end box
+
+
+[-> LogicManager : execute("meeting-delete 1 i/1")
+activate LogicManager
+
+LogicManager -> StaffConnectParser : parseCommand("meeting-delete 1 i/1")
+activate StaffConnectParser
+
+create deleteMeetingCommandParser
+StaffConnectParser -> deleteMeetingCommandParser
+activate deleteMeetingCommandParser
+
+deleteMeetingCommandParser --> StaffConnectParser
+deactivate deleteMeetingCommandParser
+
+StaffConnectParser -> deleteMeetingCommandParser : parse("1 i/1")
+activate deleteMeetingCommandParser
+
+
+deleteMeetingCommandParser -> ParserUtil : parse person index
+activate ParserUtil
+return
+
+deleteMeetingCommandParser -> ParserUtil : parse meeting index
+activate ParserUtil
+return
+
+create AddMeetingCommand
+deleteMeetingCommandParser -> AddMeetingCommand++
+return
+
+return d
+destroy deleteMeetingCommandParser
+return d
+return
+
+@enduml
diff --git a/docs/diagrams/DeleteMeetingSequenceDiagram.puml b/docs/diagrams/DeleteMeetingSequenceDiagram.puml
new file mode 100644
index 00000000000..0904618b331
--- /dev/null
+++ b/docs/diagrams/DeleteMeetingSequenceDiagram.puml
@@ -0,0 +1,42 @@
+@startuml
+!include style.puml
+skinparam ArrowFontStyle plain
+
+box Logic LOGIC_COLOR_T1
+participant "d:DeleteMeetingCommand" as DeleteMeetingCommand LOGIC_COLOR
+participant "r:CommandResult" as CommandResult LOGIC_COLOR
+participant "editedPerson:Person " as editedPerson LOGIC_COLOR
+end box
+
+box Model MODEL_COLOR_T1
+participant ":ModelManager" as Model MODEL_COLOR
+end box
+
+[-> DeleteMeetingCommand : execute(model)
+activate DeleteMeetingCommand
+
+DeleteMeetingCommand -> Model : getSortedFilteredPersonList()
+activate Model
+return
+
+ref over DeleteMeetingCommand : copy selectedPerson
+
+DeleteMeetingCommand -> editedPerson : removeMeeting()
+activate editedPerson
+return
+
+DeleteMeetingCommand -> editedPerson : updateSortedMeetingList(MEETING_DATE_THEN_DESCRIPTION_COMPARATOR);
+activate editedPerson
+return
+
+DeleteMeetingCommand -> Model : setPerson(selectedPerson, editedPerson)
+activate Model
+return
+
+create CommandResult
+DeleteMeetingCommand -> CommandResult++
+return
+
+return r
+
+@enduml
diff --git a/docs/diagrams/MeetingCopyPerson.puml b/docs/diagrams/MeetingCopyPerson.puml
new file mode 100644
index 00000000000..4e88729b496
--- /dev/null
+++ b/docs/diagrams/MeetingCopyPerson.puml
@@ -0,0 +1,26 @@
+@startuml
+!include style.puml
+skinparam ArrowFontStyle plain
+
+mainframe **sd** copy selectedPerson
+
+box Logic LOGIC_COLOR_T1
+participant ":[Add/Delete]MeetingCommand" as MeetingCommand LOGIC_COLOR
+participant "<>\nPersonUtil" as PersonUtil LOGIC_COLOR
+end box
+
+box Model MODEL_COLOR_T1
+participant ":Person" as Person MODEL_COLOR
+end box
+
+activate MeetingCommand
+MeetingCommand -> PersonUtil : copyPerson(selectedPerson)
+activate PersonUtil
+
+create Person
+PersonUtil -> Person++
+return copiedPerson
+
+return copiedPerson
+
+@enduml
diff --git a/docs/images/AddMeetingParserSequenceDiagram.png b/docs/images/AddMeetingParserSequenceDiagram.png
new file mode 100644
index 00000000000..cf92f1c1dcf
Binary files /dev/null and b/docs/images/AddMeetingParserSequenceDiagram.png differ
diff --git a/docs/images/AddMeetingSequenceDiagram.png b/docs/images/AddMeetingSequenceDiagram.png
new file mode 100644
index 00000000000..6e9a22bb470
Binary files /dev/null and b/docs/images/AddMeetingSequenceDiagram.png differ
diff --git a/docs/images/AddParserRefrenceDiagram.png b/docs/images/AddParserRefrenceDiagram.png
new file mode 100644
index 00000000000..02df92151a8
Binary files /dev/null and b/docs/images/AddParserRefrenceDiagram.png differ
diff --git a/docs/images/DeleteMeetingParserSequenceDiagram.png b/docs/images/DeleteMeetingParserSequenceDiagram.png
new file mode 100644
index 00000000000..0ea10e6a3dc
Binary files /dev/null and b/docs/images/DeleteMeetingParserSequenceDiagram.png differ
diff --git a/docs/images/DeleteMeetingSequenceDiagram.png b/docs/images/DeleteMeetingSequenceDiagram.png
new file mode 100644
index 00000000000..6f9ae24c745
Binary files /dev/null and b/docs/images/DeleteMeetingSequenceDiagram.png differ
diff --git a/docs/images/MeetingCopyPerson.png b/docs/images/MeetingCopyPerson.png
new file mode 100644
index 00000000000..e4dbd8d2c06
Binary files /dev/null and b/docs/images/MeetingCopyPerson.png differ