## Quick start
1. Ensure you have Java `11` or above installed in your Computer.
-1. Download the latest `addressbook.jar` from [here](https://github.com/se-edu/addressbook-level3/releases).
+2. Download the latest `TAB.jar` from [here](https://github.com/AY2223S1-CS2103T-T17-1/tp/releases).
-1. Copy the file to the folder you want to use as the _home folder_ for your AddressBook.
+3. Copy the file to the folder you want to use as the _home folder_ for your TAB.
-1. Double-click the file to start the app. The GUI similar to the below should appear in a few seconds. Note how the app contains some sample data.
+4. Double-click the file to start the app. The GUI similar to the below should appear in a few seconds. Note how the app contains some sample data.
![Ui](images/Ui.png)
-1. 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.
+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.
Some example commands you can try:
* **`list`** : Lists all contacts.
- * **`add`**`n/John Doe p/98765432 e/johnd@example.com a/John street, block 123, #01-01` : Adds a contact named `John Doe` to the Address Book.
+ * **`add`**`n/John Doe p/98765432 e/johnd@example.com pos/Student a/John street, block 123, #01-01 t/CS2103T-T17` : Adds a contact named `John Doe` to TAB.
* **`delete`**`3` : Deletes the 3rd contact shown in the current list.
@@ -34,7 +36,11 @@ AddressBook Level 3 (AB3) is a **desktop app for managing contacts, optimized fo
* **`exit`** : Exits the app.
-1. Refer to the [Features](#features) below for details of each command.
+6. Refer to the [Features](#features) below for details of each command.
+
+
:bulb: **Tip:**
+For teachers who are teaching more than one module, please use one TAB for each module. Refer to relevant commands to see how you can create new TAB and swap between existing TABs.
+
--------------------------------------------------------------------------------------------------------------------
@@ -44,19 +50,18 @@ AddressBook Level 3 (AB3) is a **desktop app for managing contacts, optimized fo
**:information_source: Notes about the command format:**
+* All commands are **case sensitive**
+* All tokenizers are **case sensitive**
* Words in `UPPER_CASE` are the parameters to be supplied by the user.
e.g. in `add n/NAME`, `NAME` is a parameter which can be used as `add n/John Doe`.
* Items in square brackets are optional.
- e.g `n/NAME [t/TAG]` can be used as `n/John Doe t/friend` or as `n/John Doe`.
-
-* Items with `…` after them can be used multiple times including zero times.
- e.g. `[t/TAG]…` can be used as ` ` (i.e. 0 times), `t/friend`, `t/friend t/family` etc.
+ e.g. `edit INDEX [n/NAME] [p/PHONE] [e/EMAIL]` can be used as `edit 1 n/John Doe a/Jurong` or as `n/John Doe`.
* Parameters can be in any order.
e.g. if the command specifies `n/NAME p/PHONE_NUMBER`, `p/PHONE_NUMBER n/NAME` is also acceptable.
-* If a parameter is expected only once in the command but you specified it multiple times, only the last occurrence of the parameter will be taken.
+* If a parameter is expected only once in the command, but you specified it multiple times, only the last occurrence of the parameter will be taken.
e.g. if you specify `p/12341234 p/56785678`, only `p/56785678` will be taken.
* Extraneous parameters for commands that do not take in parameters (such as `help`, `list`, `exit` and `clear`) will be ignored.
@@ -66,49 +71,192 @@ AddressBook Level 3 (AB3) is a **desktop app for managing contacts, optimized fo
### Viewing help : `help`
-Shows a message explaning how to access the help page.
+Launches the user guide in a browser window.
-![help message](images/helpMessage.png)
+![User Guide](images/userGuideWindow.png)
Format: `help`
+
:bulb: **Tip:**
+This can also be done by clicking Help or pressing F1 on the keyboard.
+
### Adding a person: `add`
-Adds a person to the address book.
-
-Format: `add n/NAME p/PHONE_NUMBER e/EMAIL a/ADDRESS [t/TAG]…`
-
-
:bulb: **Tip:**
-A person can have any number of tags (including 0)
+Adds a person to TAB.
+
+Format: `add n/NAME p/PHONE_NUMBER e/EMAIL pos/POSITION a/ADDRESS t/MODULE-GROUP`
+
+
:bulb: **Tip:**
+A teaching assistant or professor can have more than one tag. A student can only have one tag.
+Format of parameters:
+* `NAME`: Alphanumerical
+* `PHONE_NUMBER`: Numerical
+* `Email`: local-part@domain
+ * local-part: Alphanumerical and the following special characters, excluding the parentheses, (+_.-)
+ * domain: The domain name must:
+ * end with a domain label at least 2 characters long
+ * have each domain label start and end with alphanumeric characters
+ * have each domain label consist of alphanumeric characters, separated only by hyphens, if any.
+* `Position`: `Student`, `TA`, or `Professor` (case-insensitive)
+* `Address`: Any value, but cannot be blank
+* `Tags`: {Alphanumeric Module}-{Alphanumeric Tutorial group}
+Adds a new contact with the provided details. Required fields include name, phone number, address, email, position, and tag. Tags represent the module and tutorial group a person is associated with and must be in the format of module-tutorial group.
+
Examples:
-* `add n/John Doe p/98765432 e/johnd@example.com a/John street, block 123, #01-01`
-* `add n/Betsy Crowe t/friend e/betsycrowe@example.com a/Newgate Prison p/1234567 t/criminal`
+* `add n/Alex Yeoh p/87438807 e/alexyeoh@example.com pos/Student a/Blk 30 Geylang Street 29, #06-40 t/CS2103T-T17`
+* `add n/Betsy Crowe p/92498754 e/betsycrowe@example.com pos/TA a/Blk 30 Lorong 3 Serangoon Gardens, #07-18 t/CS2103T-T17`
### Listing all persons : `list`
-Shows a list of all persons in the address book.
+Shows a list of all persons in TAB.
Format: `list`
+### Displaying the details of a person : `show`
+
+Shows the detailed information of a person.
+
+General displayed information are:
+* Name
+* Position
+* Phone
+* Email
+* Tags
+* Address
+* Remarks
+
+There are also additional information unique to each role
+
+Professors:
+* Roles: `Coordinator`, `Tutor`, `Lecturer`, `Advisor` or `Unassigned`
+
+TA:
+* Availability: `Available` or `Unavailable`
+
+Student
+* Attendance: represented as a fraction _e.g. 9/10_
+* Grade: represented as a fraction. This grade is the overall grade calculated from the list of already graded Assignments.
+* Graph containing each Assignment and their scores(only if their grade has been updated)
+Format: `show INDEX`
+
+* Shows the detailed information of 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, …
+
+
:bulb: **Tip:**
+If you cannot see all the added assignments in the graph, simply enlarge your tab!
+
+
+Examples:
+* `show 3` shows the detailed information of the 3rd person in TAB.
+
+
:bulb: **Tip:**
+This can also be done by clicking on the person.
+
+
### Editing a person : `edit`
-Edits an existing person in the address book.
+Edits an existing person in TAB.
+
+Format: `edit INDEX [n/NAME] [p/PHONE] [e/EMAIL]`
-Format: `edit INDEX [n/NAME] [p/PHONE] [e/EMAIL] [a/ADDRESS] [t/TAG]…`
-* Edits 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, …
+Edits 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, …
* At least one of the optional fields must be provided.
* Existing values will be updated to the input values.
-* 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.
+* Editing of Tags and Position are not allowed.
+
+Examples:
+* `edit 1 p/91234567 e/johndoe@example.com` edits the phone number and email address of the 1st person to be `91234567` and `johndoe@example.com` respectively.
+* `edit 2 n/Betsy Crower` edits the name of the 2nd person to be `Betsy Crower`
+
+### Adding a remark : `remark`
+
+Adds or edits a remark of an existing person in TAB.
+
+Format: `remark INDEX r/REMARK`
+
+Modifies a remark of a 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, …
+* A person can have at most 1 remark.
+* When editing remark, the existing remark of the person will be removed i.e. adding of remarks is not cumulative.
+* You can remove the person's remark field by typing `r/` without
+ specifying any message after it.
+
+Examples:
+* `remark 1 r/Interested to be a TA` edits the remark field of the 1st person to be `Interested to be a TA`.
+* `remark 2 r/remark_one r/remark_two` edits the remark field of the 2nd person to be `remark_two` and not `remark_one`.
+* `remark 3 r/` clears the remark field of the 3rd person.
+
+### Editing the attendance of a student : `attendance`
+
+Edits the attendance of an existing student in TAB.
+
+Format: `attendance INDEX attendance/ATTENDANCE`
+
+Edits the attendance of the person (whose position must be student) 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:
+* `attendance 1 attendance/10/13` edits the attendance of the 1st person to be `10/13`.
+
+### Adding assignments to all students : `assignments`
+
+Adds assignments to all students in the TAB.
+
+Format: `assignments assignments/ ASSIGNMENT_1 w/ASSIGNMENT_1_WEIGHTAGE, ASSIGNMENT_2 w/ASSIGNMENT_2_WEIGHTAGE…`
+
+* The assignments are added to all students in the TAB. Students that are added to the TAB afterwards will automatically be instantiated with the assignments.
+* There must at least be one student inside TAB when running this command. The command will fail otherwise.
+* The weightage of the assignments must be integers that add up to 100%. The command will fail otherwise.
+* At most 10 assignments can be added.
+
+Examples:
+* `assignments assignments/ Assignment 1 w/15, Assignment 2 w/15, Midterms w/30, Finals w/40` adds Assignment 1: 15% weightage, Assignment 2: 15% weightage, Midterms: 30% weightage, and Finals: 40% weightage to all students in the TAB.
+* `assignments assignments/ Assignment 1 w/20 Finals w/15` will fail as the weightage does not add up to 100%.
+
+### Editing the grade of a student : `grade`
+
+Edits a student's grade of an assignment of in TAB.
+
+Format: `grade INDEX assignment/INDEX grade/GRADE`
+
+Edits the grade of an assignment of the person (whose position must be student) at the specified `INDEX`. The first index refers to the index number shown in the displayed person list. The second index refers to the index of the assignment to be edited as shown in the assignment list of the specified student. Grade must follow the format [integer]/[integer]
+
+The indices **must be positive integers** 1, 2, 3, …
+* The grade shown on the detail page of a student represent the overall grade that the student has achieved, calculated based on the grade and weightage of each assignment.
+
+Examples:
+* `grade 2 assignment/1 grade/68/80` edits the grade of the 1st assignment of the 2nd person (whose position is student) to be `68/80`.
+* `grade 1 assignment/1 grade/68/80` will fail if the position of the 1st person in the displayed person list is not a student.
+
+### Editing the availability of a TA : `avail`
+
+Edits the availability of an existing TA in TAB.
+Availabilities are case-insensitive.
+
+Format: `avail INDEX avail/AVAILABILITY`
+
+Edits the availability of the person (whose position must be TA) 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:
-* `edit 1 p/91234567 e/johndoe@example.com` Edits the phone number and email address of the 1st person to be `91234567` and `johndoe@example.com` respectively.
-* `edit 2 n/Betsy Crower t/` Edits the name of the 2nd person to be `Betsy Crower` and clears all existing tags.
+* `avail 1 avail/Available` edits the availability of the 1st person to be `Available`.
+
+### Editing the roles of a Professor : `roles`
+
+Edits the roles of an existing professor in TAB.
+
+Format: `roles INDEX roles/ROLE`
+
+Edits the roles of the person (whose position must be professor) 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, …
+Roles are case-insensitive
+* Each professor may only have 1 role
+
+
+Examples:
+* `roles 1 roles/Coordinator` edits the roles of the 1st person(must be a professor) to be `Coordinator`.
+
### Locating persons by name: `find`
@@ -116,7 +264,7 @@ Finds persons whose names contain any of the given keywords.
Format: `find KEYWORD [MORE_KEYWORDS]`
-* The search is case-insensitive. e.g `hans` will match `Hans`
+* The search is case-insensitive. e.g. `hans` will match `Hans`
* The order of the keywords does not matter. e.g. `Hans Bo` will match `Bo Hans`
* Only the name is searched.
* Only full words will be matched e.g. `Han` will not match `Hans`
@@ -128,9 +276,22 @@ Examples:
* `find alex david` returns `Alex Yeoh`, `David Li`
![result for 'find alex david'](images/findAlexDavidResult.png)
+### Filtering persons by tag: `filter`
+
+Filters persons with the specified tag.
+
+Format: `filter TAG`
+
+* The search is case-insensitive. e.g. `cs2103t-t17` will match `CS2103T-T17`
+* Only full word will be matched. e.g. `CS2103T` will not match `CS2103T-T17`
+
+Examples:
+* `filter CS2103T-T17` returns persons with the tag `CS2103T-T17`
+* `filter CS2103T` returns no result.
+
### Deleting a person : `delete`
-Deletes the specified person from the address book.
+Deletes the specified person from the TAB.
Format: `delete INDEX`
@@ -139,43 +300,141 @@ Format: `delete INDEX`
* The index **must be a positive integer** 1, 2, 3, …
Examples:
-* `list` followed by `delete 2` deletes the 2nd person in the address book.
+* `list` followed by `delete 2` deletes the 2nd person in the TAB.
* `find Betsy` followed by `delete 1` deletes the 1st person in the results of the `find` command.
### Clearing all entries : `clear`
-Clears all entries from the address book.
+Clears all entries from the TAB.
Format: `clear`
-### Exiting the program : `exit`
+### Creating new TAB : `new`
-Exits the program.
+Creates a new TAB and automatically swaps to the newly created data file.
+There can be a maximum of 5 books.
+Format: `new`
-Format: `exit`
+
:bulb: **Tip:**
+This can also be done by clicking `File` - `New Book`
+
+
+### Swapping between TABs : `swap`
+
+Swaps between existing TABs.
+
+Format: `swap`
+
+
:bulb: **Tip:**
+This can also be done by clicking `File` - `Swap Book`
+
+
+### Renaming the data file : `rename`
+
+Renames the current data file.
+
+Format: `rename {NEW_NAME}`
+
+Renames the current data file as the `NEW_NAME` in lowercase
+* `NEW_NAME` only accepts alphanumeric, '-' and '_' characters.
+
+Example:
+* `rename cs2103t` renames the current data file as `cs2103t.json`
### Saving the data
-AddressBook data are saved in the hard disk automatically after any command that changes the data. There is no need to save manually.
+TAB data is saved in the hard disk automatically after any command that changes the data. There is no need to save manually.
### Editing the data file
-AddressBook data are saved as a JSON file `[JAR file location]/data/addressbook.json`. Advanced users are welcome to update data directly by editing that data file.
+TAB data is saved as a JSON file `[JAR file location]/data/addressbook.json`. Advanced users are welcome to update data directly by editing that data file.
:exclamation: **Caution:**
-If your changes to the data file makes its format invalid, AddressBook will discard all data and start with an empty data file at the next run.
+If your changes to the data file makes its format invalid, TAB will discard all data and start with an empty data file at the next run.
-### Archiving data files `[coming in v2.0]`
+### Exiting the program : `exit`
+
+Exits the program.
+
+Format: `exit`
-_Details coming soon ..._
+
:bulb: **Tip:**
+This can also be done by clicking File - Exit.
+
--------------------------------------------------------------------------------------------------------------------
## FAQ
**Q**: How do I transfer my data to another Computer?
-**A**: Install the app in the other computer and overwrite the empty data file it creates with the file that contains the data of your previous AddressBook home folder.
+**A**: Install the app in the other computer and overwrite the empty data file it creates with the file that contains the data of your previous TAB home folder.
+
+**Q**: Why is editing of Position restricted?
+**A**: TAB depicts the addressbook of a certain module at a certain period of time. Positions within TAB should be consistent in that time frame. For example, it would not make sense for a Student to become a Professor.
+
+**Q**: Why is editing of Tags restricted?
+**A**: AB depicts the addressbook of a certain module at a certain period of time. Tags represent the module and tutorial group of a students. If a student were to drop the module halfway, he should be removed from TAB instead using the delete feature.
+
+**Q**: Why should there be only Persons from one module in each addressbook? This is a big limitation!
+**A**: Not really. By only allowing Persons from one module in each addressbook, it ensures that your TAB is neat and streamlined. If you want to keep contacts across modules, please create a new TAB by using our `new` and `swap` features.
+
+**Q**: I just created a new book and nothing changed?
+**A**: The new TAB's name appears at the bottom left corner.
+
+![FAQ_Identify_New_Book](images/FAQ_Identify_New_Book.png)
+
+**Q**: How do I properly delete a TAB once I created it?
+**A**: To delete a created TAB here are the steps to follow:
+
:exclamation: **Caution:**
+If there is only one TAB, do not follow the steps below! Use the `clear` command instead!
+
+
+- Step 1:
+ - From the `data` directory, delete the `.json` file you like to remove
+- Step 2:
+ - From the `preferences.json`, delete the **same** `.json` file from the `allAddressBookFilePath` parameter.
+
+**Case By Case Basis:**
+- Step 3: (**Only if** `"addressBookFilePath"` has the same name as the TAB you want to delete)
+ - If the `.json` file is also `addressBookFilePath`, swap it for the first TAB under `allAddressBookFilePath`
+ and set `addressBookIndex` to 0
+
+
:information_source: **Example:**
+
+Here I would like to delete a TAB named `addressbook`
+
+* Step 1:
+Go into `data` folder and delete `addressbook.json`
+ Before:
+ ![delete_step_1a.png](images/delete_step_1a.png)
+ After:
+ ![delete_step_1b.png](images/delete_step_1b.png)
+
+Step 2:
+* Open `preferences.json`
+* Remove `, "data\\addressbook.json"` from `"allAddressBookFilePath"`
+ Before:
+ ![delete_step_2a.png](images/delete_step_2a.png)
+ After:
+ ![delete_step_2b.png](images/delete_step_2b.png)
+ **Save the file and you are done!**
+
+**Case By Case Basis:**
+Step 3: (if `"addressBookFilePath"` has the same name as the TAB you want to delete):
+* Remove both `addressbook.json`
+ Before:
+ ![delete_step_3a.png](images/delete_step_3a.png)
+ After:
+ ![delete_step_3b.png](images/delete_step_3b.png)
+* Copy the first TAB name from `"allAddressBookFilePath"`, paste into `"addressBookFilePath"` and change `"addressBookIndex"` to 0.
+ It should look something like this. (Note the changes in green)
+ ![delete_step_3c.png](images/delete_step_3c.png)
+ **Save the file and you are done!**
+
+
+
+
--------------------------------------------------------------------------------------------------------------------
@@ -183,10 +442,24 @@ _Details coming soon ..._
Action | Format, Examples
--------|------------------
-**Add** | `add n/NAME p/PHONE_NUMBER e/EMAIL a/ADDRESS [t/TAG]…`
e.g., `add n/James Ho p/22224444 e/jamesho@example.com a/123, Clementi Rd, 1234665 t/friend t/colleague`
-**Clear** | `clear`
-**Delete** | `delete INDEX`
e.g., `delete 3`
-**Edit** | `edit INDEX [n/NAME] [p/PHONE_NUMBER] [e/EMAIL] [a/ADDRESS] [t/TAG]…`
e.g.,`edit 2 n/James Lee e/jameslee@example.com`
-**Find** | `find KEYWORD [MORE_KEYWORDS]`
e.g., `find James Jake`
-**List** | `list`
**Help** | `help`
+**Add** | `add n/NAME p/PHONE_NUMBER e/EMAIL a/ADDRESS pos/ POSITION [t/TAG]…`
e.g., `add n/Alex Yeoh p/87438807 e/alexyeoh@example.com pos/Student a/Blk 30 Geylang Street 29, #06-40 t/CS2103T-T17`
+**List** | `list`
+**Show** | `show INDEX`
e.g., `show 2`
+**Edit** | `edit INDEX [n/NAME] [p/PHONE_NUMBER] [e/EMAIL] [a/ADDRESS]…`
e.g.,`edit 2 n/James Lee e/jameslee@example.com`
+**Remark** | `remark INDEX r/REMARK`
e.g., `remark 1 r/Interested to be a TA`
+**Attendance** | `attendance INDEX attendance/ATTENDANCE`
e.g., `attendance 1 attendance/10/13`
+**Assignments** | `assignments assignments/ASSIGNMENT_1 w/ASSIGNMENT_1_WEIGHTAGE, ASSIGNMENT_2 w/ASSIGNMENT_2_WEIGHTAGE…`
e.g., `assignments assignments/Assignment 1 w/15, Assignment 2 w/15, Midterms w/30, Finals w/40`
+**Grade** | `grade INDEX assignment/INDEX grade/GRADE`
e.g., `grade 2 assignment/1 grade/68/80`
+**Availability** | `avail INDEX avail/AVAILABILITY`
e.g., `avail 1 avail/Available`
+**Roles** | `roles INDEX roles/ROLE`
e.g., `roles 1 roles/Coordinator`
+**Find** | `find KEYWORD [MORE_KEYWORDS]`
e.g., `find James Jake`
+**Filter** | `filter TAG`
e.g., `filter CS2103T-T17`
+**Delete** | `delete INDEX`
e.g., `delete 3`
+**Clear** | `clear`
+**New** | `new`
+**Swap** | `swap`
+**Rename** | `rename {NEW_NAME}`
e.g., `rename CS2103T`
+**Exit** | `exit`
+
+
diff --git a/docs/_config.yml b/docs/_config.yml
index 6bd245d8f4e..093e66fdbda 100644
--- a/docs/_config.yml
+++ b/docs/_config.yml
@@ -1,4 +1,4 @@
-title: "AB-3"
+title: "TAB"
theme: minima
header_pages:
@@ -8,7 +8,7 @@ header_pages:
markdown: kramdown
-repository: "se-edu/addressbook-level3"
+repository: "AY2223S1-CS2103T-T17-1/tp"
github_icon: "images/github-icon.png"
plugins:
diff --git a/docs/_sass/minima/_base.scss b/docs/_sass/minima/_base.scss
index 0d3f6e80ced..3bcf61a51ce 100644
--- a/docs/_sass/minima/_base.scss
+++ b/docs/_sass/minima/_base.scss
@@ -288,7 +288,7 @@ table {
text-align: center;
}
.site-header:before {
- content: "AB-3";
+ content: "TAB";
font-size: 32px;
}
}
diff --git a/docs/assets/css/style.scss b/docs/assets/css/style.scss
index b5ec6976efa..58836b73244 100644
--- a/docs/assets/css/style.scss
+++ b/docs/assets/css/style.scss
@@ -10,3 +10,76 @@
height: 21px;
width: 21px
}
+
+/* Adapted from : https://www.w3schools.com/csSref/pr_gen_counter-reset.php */
+/* Adapted from: https://github.com/shd101wyy/markdown-preview-enhanced/issues/1034 */
+/* Recommended by: AY2223S1-CS2103T-T17-2 */
+
+body {
+ counter-reset: h2;
+}
+
+.index h2 {
+ counter-reset: h3;
+}
+
+.index h3 {
+ counter-reset: h4;
+}
+
+.index h4 {
+ counter-reset: h5;
+}
+
+.index h5 {
+ counter-reset: h6;
+}
+
+.index h2:before {
+ counter-increment: h2;
+ content: counter(h2) ". ";
+}
+
+.index h3:before {
+ counter-increment: h3;
+ content: counter(h2) "." counter(h3) ". ";
+}
+
+.index h4:before {
+ counter-increment: h4;
+ content: counter(h2) "." counter(h3) "." counter(h4) ". ";
+}
+
+.index h5:before {
+ counter-increment: h5;
+ content: counter(h2) "." counter(h3) "." counter(h4) "." counter(h5) ". ";
+}
+
+.index h6:before {
+ counter-increment: h6;
+ content: counter(h2) "." counter(h3) "." counter(h4) "." counter(h5) "." counter(h6) ". ";
+}
+
+/* Adapted from: https://dev.to/adamlombard/css-automatically-number-nested-lists-59ei */
+
+#markdown-toc, #markdown-toc ul {
+ list-style-type: none;
+ counter-reset: item;
+}
+
+#markdown-toc li {
+ display: block
+}
+
+#markdown-toc li:before {
+ counter-increment: item;
+ content: counters(item, ".") ". ";
+ color: #2a7ae2;;
+ font-weight: bold;
+}
+
+// hide the first h2 from toc
+
+#markdown-toc > li:first-child {
+ display: none;
+}
diff --git a/docs/diagrams/AddAssignmentsDiagram1.puml b/docs/diagrams/AddAssignmentsDiagram1.puml
new file mode 100644
index 00000000000..4013595ca7e
--- /dev/null
+++ b/docs/diagrams/AddAssignmentsDiagram1.puml
@@ -0,0 +1,24 @@
+@startuml
+object "__alpha:Person__" as alpha {
+role = Student
+}
+
+object "__bravo:Person__" as bravo {
+role = Student
+}
+
+object "__charlie:Person__" as charlie {
+role = Professor
+}
+
+object "__delta:Person__" as delta {
+role = TA
+}
+
+map "__:TAB__" as Tab {
+