diff --git a/copyright.txt b/copyright.txt
index 93aa2a39ce2..0665ae12989 100644
--- a/copyright.txt
+++ b/copyright.txt
@@ -1,7 +1,7 @@
Some code adapted from http://code.makery.ch/library/javafx-8-tutorial/ by Marco Jakob
Copyright by Susumu Yoshida - http://www.mcdodesign.com/
-- address_book_32.png
+- staff_connect.png
- AddressApp.ico
Copyright by Jan Jan Kovařík - http://glyphicons.com/
diff --git a/docs/UserGuide.md b/docs/UserGuide.md
index 8b9b9cd93a3..19bb524cde0 100644
--- a/docs/UserGuide.md
+++ b/docs/UserGuide.md
@@ -19,7 +19,7 @@ StaffConnect (SC) is a **desktop app for managing contacts of Professors and Tut
3. Copy the file to the folder you want to use as the _home folder_ for your StaffConnect application.
4. Open a command terminal, `cd` into the folder you put the jar file in, and use the `java -jar StaffConnect.jar` command to run the application.
- A GUI similar to the below should appear in a few seconds. Note how the app contains some sample data.
+ A GUI similar to the below should appear in a few seconds. Note how the app contains some sample data.
__(The data in preview image below may not match with the sample data provided)__
![Ui](images/Ui.png)
5. Type the command in the command box and press Enter to execute it. e.g. typing **`help`** and pressing Enter will open the help window.
@@ -39,6 +39,44 @@ StaffConnect (SC) is a **desktop app for managing contacts of Professors and Tut
--------------------------------------------------------------------------------------------------------------------
+
+## Navigability
+
+### Mouse and Keyboard controls
+
+Before we get started StaffConnect offers a unique suite of UI controls for users to customise their own unique experience!
+
+1. Clicking any items on the left panel will allow you to select the person contact to display.
+
Alternatively, clicking anywhere in the list panel then using your arrow keys to navigate and hitting enter to select would give the same result.
+
![Region to select the person](images/personPanelRegion.png)
+
+2. There is a divider that is draggable up and down to hide and show details on the right side and to customise the look of your application.
+
![Region to select the divider](images/detailsDividerRegion.png)
+
+3. Each of the 3 display panes of information they are able to pan in all four directions to view the content:
+ - For mouse pad users, dragging around with two fingers the around would pan around the pane.
+ - For mouse users, __[mouse wheel]__ will scroll up and down while __[shift + mouse wheel]__ will scroll left and right.
+ - __[Left click + drag]__ would pan around in the details pane as well.
+ - Keyboard arrow keys are able to pan around as well, but the scroll speed may differ on different systems.
+ - There are scroll bars at the vertical and horizontal dividers of the window pane, dragging them in the respective direction will pan around as well.
+
+
+
+### Alternative UI arrangements
+
![first alternative ui](images/firstAlternative.png)
+
+
![second alternative ui](images/secondAlternative.png)
+
+**Intended Limitations**
+1. The divider position is not controllable by keyboard input, hence the only way to customise the look is mostly by mouse input.
+2. Pane switching by keyboard input, like a terminal is not supported.
+3. Font sizes does not automatically resize in this application, scroll bars will appear in smaller window variants of this application to help with the viewing of details.
+4. The UI will do a soft reset on its divider position every time the application is relaunched, as this is to allow users who wish to fall back to the default layout settings.
+
+
+--------------------------------------------------------------------------------------------------------------------
+
+
## Features
@@ -104,7 +142,7 @@ Format: `edit INDEX [n/NAME] [p/PHONE] [e/EMAIL] [m/MODULE] [f/FACULTY] [v/VENUE
* When editing tags, the existing tags of the person will be removed i.e adding of tags is not cumulative.
* You can remove all the person’s tags by typing `t/` without
specifying any tags after it.
-* When editing availabilities, the existing availabilites of the person will be removed i.e adding of availabilities is not cumulative.
+* When editing availabilities, the existing availabilities of the person will be removed i.e adding of availabilities is not cumulative.
* You can remove all the person’s availabilities by typing `a/` without
specifying any availabilities after it.
@@ -174,11 +212,11 @@ Examples:
* `sort p/` returns person by ascending phone numbers `87438807`, `91031282` followed by `92492021`
![result for 'sort p/'](images/sortByPhoneNumberResult.png)
-### Adding a meeting to a person: `meeting`
+### Adding a meeting to a person: `meeting-add`
Add a meeting to a person based on specified description and date.
-Format: `meeting INDEX [d/DESCRIPTION] [s/DATETIME]`
+Format: `meeting-add INDEX d/DESCRIPTION s/DATETIME`
* Adds a meeting to the person at the specified `INDEX`. The index refers to the index number shown in the displayed person list. The index **must be a positive integer** 1, 2, 3,… and tally within range index of the displayed list.
* Both of the fields must be provided and valid values.
@@ -209,9 +247,38 @@ Format: `meeting INDEX [d/DESCRIPTION] [s/DATETIME]`
* Duplicate meetings with the same `DESCRIPTION` and `DATETIME` in the same person is not allowed.
Examples:
-* `meeting 1 d/ Meet for finals preparation s/ 12/04/2024 18:00` adds a meeting to the first person with the description of `Meet for finals preparation` and the date and time of `12/04/2024 18:00`
-* `meeting 2 d/ Meet for practical exam s/ 20/04/2024 15:00` adds a meeting to the second person with the description of `Meet for practical exam` and the date and time of `20/04/2024 15:00`
- ![result for 'meeting 1 d/ Meet for finals preparation s/ 12/04/2024 18:00'](images/addMeetingResult.png)
+* `meeting-add 1 d/Meet for finals preparation s/12/04/2024 18:00` adds a meeting to the first person with the description of `Meet for finals preparation` and the date and time of `12/04/2024 18:00`
+* `meeting-add 2 d/Meet for practical exam s/20/04/2024 15:00` adds a meeting to the second person with the description of `Meet for practical exam` and the date and time of `20/04/2024 15:00`
+
+
**Result for add meeting:**
`meeting-add 1 d/Meet for finals preparation s/12/04/2024 18:00`
+ ![result for 'meeting-add 1 d/Meet for finals preparation s/12/04/2024 18:00'](images/addMeetingResult.png)
+
+### Deleting a meeting from a person: `meeting-delete`
+
+Deletes a meeting from person based on specified meeting index.
+
+Format: `meeting-delete INDEX i/MEETING-INDEX `
+
+* Deletes the meeting at specified `MEETING-INDEX` from the person at specified `INDEX`.
+* The index refers to the index number shown in the displayed person list.
+* The index **must be a positive integer** 1, 2, 3,… and tally within range index of the displayed person list.
+* The meeting-index refers to the index number shown in the displayed meeting list.
+* The index **must be a positive integer** 1, 2, 3,… and tally within range index of the displayed meeting list.
+* The meeting from the person must exist before it can be deleted otherwise an error will be displayed.
+Examples:
+* The following commands assumes that meetings have been added prior to the command. Otherwise, an error will be thrown.
**(Refer to the section above on how to add a meeting)**
+ * `list` followed by `meeting-delete 1 i/1` deletes the 1st meeting from the 1st person in the contacts.
+ * `find Bernice Yu` followed by `meeting-delete 1 i/2` deletes the 1st meeting form the 1st person in the results of the `find` command.
+
+
**Results for delete meeting:**
+The following command was applied: `find Bernice Yu` followed by `meeting-delete 1 i/2`.
+
__(Disclaimer: The content shown in the examples may not match what you have added to your own meetings within the contact book).__
+
+
**Before:**
+ ![result for before `find Bernice Yu` followed by `meeting-delete 1 i/2`](images/deleteMeetingResultBefore.png)
+
+
**After:**
+ ![result for after `find Bernice Yu` followed by `meeting-delete 1 i/2`](images/deleteMeetingResultAfter.png)
### Deleting a person : `delete`
@@ -225,7 +292,7 @@ Format: `delete INDEX`
Examples:
* `list` followed by `delete 2` deletes the 2nd person in the contacts.
-* `find Betsy` followed by `delete 1` deletes the 1st person in the results of the `find` command.
+* `find Bernice Yu` followed by `delete 1` deletes the 1st person in the results of the `find` command.
### Setting a person as favourite: `fav`
@@ -267,6 +334,25 @@ Format: `refresh`
Examples:
* If there is a meeting `French Revolution` that happened in `14/07/1789 12:00`, when the user types in `refresh`, it will be deleted.
* If there is a meeting `Future Meeting` that will happen in `31/12/2999 12:00`, when the user types in `refresh`, it will not be deleted.
+
+**Known limitations:**
+Refresh is only used when the user decides to remove clutter in the staff book, and wants to remove outdated meetings.
+This process is not done automatically as sometimes the user would like to retain old meetings for bookkeeping purposes.
+
+### Selecting the detailed contact to display: `select`
+
+Selects the person identified by the index number used in the displayed person list for display.
+
+Format: `select INDEX`
+
+* Select the person and loads its contact with meeting details for display at the specified **INDEX**
+* The index refers to the index number shown in the displayed person list.
+* The index **must be a positive integer** 1, 2, 3, …
+
+Examples:
+* `list` followed by `select 2`.
Selects the 2nd person in the staff book.
+* `filter t/tutor` followed by `select 1`
Selects the 1st person in the results of the `filter` command.
+
### Clearing all entries : `clear`
@@ -323,6 +409,8 @@ Furthermore, certain edits can cause the StaffConnect to behave in unexpected wa
- Faculty of Science; Science; FoS
- University Scholars Programme; USP
- Yale-NUS College; Yale-NUS
+
+
--------------------------------------------------------------------------------------------------------------------
## Command summary
@@ -336,8 +424,11 @@ Action | Format, Examples
**Filter** | `filter [m/MODULE] [f/FACULTY] [t/TAG]… [a/AVAILABILITY]…`
e.g., `filter m/CS2100 t/friends`
**Find** | `find KEYWORD [MORE_KEYWORDS]`
e.g., `find James Jake`
**Sort** | `sort [n/] [p/] [m/] [f/] [v/] [s/] [meet/]...`
e.g., `sort n/ p/ m/`
-**Add Meeting** | `meeting INDEX [d/DESCRIPTION] [s/DATETIME]`
e.g., `meeting 1 d/ Meet for finals preparation s/ 12/04/2024 18:00`
+**Add Meeting** | `meeting-add INDEX d/DESCRIPTION s/DATETIME`
e.g., `meeting-add 1 d/Meet for finals preparation s/12/04/2024 18:00`
+**Delete Meeting** | `meeting-delete INDEX i/MEETING-INDEX`
e.g., `meeting-delete 1 i/1 `
**Set as Favourite** | `fav INDEX`
e.g., `fav 3`
**Remove as Favourite** | `unfav INDEX`
e.g., `unfav 3`
+**Refresh** | `refresh`
e.g., `refresh`
+**Select** | `select INDEX`
e.g., `select 3`
**List** | `list`
**Help** | `help`
diff --git a/docs/images/Ui.png b/docs/images/Ui.png
index 10fb3719f71..d3bf85d768b 100644
Binary files a/docs/images/Ui.png and b/docs/images/Ui.png differ
diff --git a/docs/images/addMeetingResult.png b/docs/images/addMeetingResult.png
index 80acd71bcb4..11ab8f2ade0 100644
Binary files a/docs/images/addMeetingResult.png and b/docs/images/addMeetingResult.png differ
diff --git a/docs/images/deleteMeetinResultBefore.png b/docs/images/deleteMeetinResultBefore.png
new file mode 100644
index 00000000000..c6a2e55904c
Binary files /dev/null and b/docs/images/deleteMeetinResultBefore.png differ
diff --git a/docs/images/deleteMeetingResultAfter.png b/docs/images/deleteMeetingResultAfter.png
new file mode 100644
index 00000000000..958532786f8
Binary files /dev/null and b/docs/images/deleteMeetingResultAfter.png differ
diff --git a/docs/images/deleteMeetingResultBefore.png b/docs/images/deleteMeetingResultBefore.png
new file mode 100644
index 00000000000..2823977ecc2
Binary files /dev/null and b/docs/images/deleteMeetingResultBefore.png differ
diff --git a/docs/images/detailsDividerRegion.png b/docs/images/detailsDividerRegion.png
new file mode 100644
index 00000000000..29302a4e253
Binary files /dev/null and b/docs/images/detailsDividerRegion.png differ
diff --git a/docs/images/filterTutorTagResult.png b/docs/images/filterTutorTagResult.png
index 62ab51a4277..49d6a51cc15 100644
Binary files a/docs/images/filterTutorTagResult.png and b/docs/images/filterTutorTagResult.png differ
diff --git a/docs/images/findAlexDavidResult.png b/docs/images/findAlexDavidResult.png
index c9c844b5f27..cf6297ee32f 100644
Binary files a/docs/images/findAlexDavidResult.png and b/docs/images/findAlexDavidResult.png differ
diff --git a/docs/images/firstAlternative.png b/docs/images/firstAlternative.png
new file mode 100644
index 00000000000..7a478ed15ba
Binary files /dev/null and b/docs/images/firstAlternative.png differ
diff --git a/docs/images/helpMessage.png b/docs/images/helpMessage.png
index 1353a99096b..82f3ef17b6c 100644
Binary files a/docs/images/helpMessage.png and b/docs/images/helpMessage.png differ
diff --git a/docs/images/personPanelRegion.png b/docs/images/personPanelRegion.png
new file mode 100644
index 00000000000..485b8bfa1b4
Binary files /dev/null and b/docs/images/personPanelRegion.png differ
diff --git a/docs/images/secondAlternative.png b/docs/images/secondAlternative.png
new file mode 100644
index 00000000000..8aee84d780f
Binary files /dev/null and b/docs/images/secondAlternative.png differ
diff --git a/docs/images/sortByPhoneNumberResult.png b/docs/images/sortByPhoneNumberResult.png
index b6239f7c3a9..695d5320fa8 100644
Binary files a/docs/images/sortByPhoneNumberResult.png and b/docs/images/sortByPhoneNumberResult.png differ
diff --git a/src/main/java/staffconnect/ui/PersonCard.java b/src/main/java/staffconnect/ui/PersonCard.java
index 478af8784a8..3bbee41e9cc 100644
--- a/src/main/java/staffconnect/ui/PersonCard.java
+++ b/src/main/java/staffconnect/ui/PersonCard.java
@@ -160,6 +160,7 @@ private void setUpMeetingListView(ObservableList meetingsList) {
private void setUpScrollPane(VBox display, Region content, boolean enableHbar, boolean swap, Region swapRegion) {
ScrollPane scrollPane = new ScrollPane();
scrollPane.setContent(content);
+ scrollPane.setPannable(true);
//Custom vertical scroll bar on the left
// Inspired from:
// https://stackoverflow.com/questions/35134155/move-the-vertical-scroll-bar-of-a-scroll-panel-to-the-left-side
diff --git a/src/main/resources/view/MainWindow.fxml b/src/main/resources/view/MainWindow.fxml
index bc065f98741..d69ea9359be 100644
--- a/src/main/resources/view/MainWindow.fxml
+++ b/src/main/resources/view/MainWindow.fxml
@@ -11,7 +11,7 @@
-
+