diff --git a/docs/DeveloperGuide.md b/docs/DeveloperGuide.md
index c4b4be27ce1..96358b3fe01 100644
--- a/docs/DeveloperGuide.md
+++ b/docs/DeveloperGuide.md
@@ -9,11 +9,19 @@ title: Developer Guide
## **Acknowledgements**
-* {list here sources of all reused/adapted ideas, code, documentation, and third-party libraries -- include links to the original source as well}
+* UI rendering via: [JavaFX](https://openjfx.io/)
+* Testing suite via: [JUnit5](https://github.com/junit-team/junit5)
+* JSON data saving and loading via: [Jackson](https://github.com/FasterXML/jackson)
+
+* Jobby base UI adapted from: [AddressBook Level-3](https://se-education.org/addressbook-level3/)
+* Autocompletion base UI adapted from: [@floralvikings's AutoCompleteTextBox.java](https://gist.github.com/floralvikings/10290131)
+
+* New user tutorial structure inspired from: [AY2324S1-CS2103T-T17-03](https://ay2324s1-cs2103t-t17-3.github.io/tp/UserGuide.html)
--------------------------------------------------------------------------------------------------------------------
## **Setting up, getting started**
+{: .reset-page-break-defaults}
Refer to the guide [_Setting up and getting started_](SettingUp.md).
@@ -21,9 +29,10 @@ Refer to the guide [_Setting up and getting started_](SettingUp.md).
## **Design**
-
@@ -644,19 +652,19 @@ Sorts contacts or job applications for you by the specified flag.
| Command | Reason |
|-----------------------------|------------------------------------------------------------------------------------------------------------|
-| `sort --title --ascending` | Sort **job applications** by title, in ascending alphabetical order. |
-| `sort --url` | Sort **contacts** by url, in the default order - ascending alphabetical. |
-| `sort --stale --descending` | Sort **job applications** by last updated time, in reverse chronological order, from most recent to least. |
-| `sort --none` | Reset the sorting order of **contacts** and **job applications**. |
+| `sort --title --ascending`{:.language-sh} | Sort **job applications** by title, in ascending alphabetical order. |
+| `sort --url`{:.language-sh} | Sort **contacts** by url, in the default order - ascending alphabetical. |
+| `sort --stale --descending`{:.language-sh} | Sort **job applications** by last updated time, in reverse chronological order, from most recent to least. |
+| `sort --none`{:.language-sh} | Reset the sorting order of **contacts** and **job applications**. |
##### Invalid examples
| Command | Reason |
|----------------------------|---------------------------------------------|
| `sort` | No field provided. |
-| `sort --org` | Invalid field. |
-| `sort --none --descending` | `--none` and `--descending` both specified. |
-| `sort --title --name` | More than 1 field specified. |
+| `sort --org`{:.language-sh} | Invalid field. |
+| `sort --none --descending`{:.language-sh} | `--none`{:.language-sh} and `--descending`{:.language-sh} both specified. |
+| `sort --title --name`{:.language-sh} | More than 1 field specified. |
### Reminding about deadlines - `remind`
@@ -672,7 +680,7 @@ remind --earliest / --latest
Reminds you of upcoming deadlines for job applications.
##### Sample demonstration
-* To see your application deadlines from the earliest to latest, use the command `remind --earliest`.
+* To see your application deadlines from the earliest to latest, use the command `remind --earliest`{:.language-sh}.
![Remind Earliest](images/starter-guide/remind-earliest.jpg)
@@ -680,8 +688,8 @@ Reminds you of upcoming deadlines for job applications.
| Command | Reason |
|---------------------|--------------------------------------------------------------------------------------|
-| `remind --earliest` | List the application deadlines in order of urgency, from earliest to latest. |
-| `remind --latest` | List the application deadlines in order of reverse urgency, from latest to earliest. |
+| `remind --earliest`{:.language-sh} | List the application deadlines in order of urgency, from earliest to latest. |
+| `remind --latest`{:.language-sh} | List the application deadlines in order of reverse urgency, from latest to earliest. |
##### Invalid examples
@@ -707,10 +715,9 @@ Shows a message explaining how to access the help page.
### Clearing all data - `clear`
Organization Recruiter Job Application
+
:trophy: How to clear all contacts and job applications in Jobby Intermediate
:warning: The deletion of all data is permanent and there is no way to undo it.
-
:trophy: How to clear all contacts and job applications in Jobby Intermediate
-
##### Format
```sh
clear
@@ -730,6 +737,17 @@ exit
Exits the program.
+### Saving the data
+
+Jobby's data are saved in the hard disk automatically after any command that changes the data. There is no need to save manually.
+
+### Editing the data file
+
+Jobby's data are saved automatically as a JSON file `[JAR file location]/data/jobby.json`. Advanced users are welcome to update data directly by editing that data file.
+
+
+:warning: **Caution:** If your changes to the data file makes its format invalid, Jobby will discard all data and start with an empty data file at the next run. Hence, it is recommended to take a backup of the file before editing it.
+
--------------------------------------------------------------------------------------------------------------------
@@ -739,13 +757,13 @@ Exits the program.
| Action | Format, Examples |
|----------------------|--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------|
-| **Add Organization** | `add --org --name NAME [--id ID] [--phone NUMBER] [--email EMAIL] [--url URL] [--address ADDRESS] [--tag TAG]...`
e.g., `add --org --name NUS --phone 0123456789 --email example@nus.edu.sg --url https://www.nus.edu.sg/` |
-| **Add Recruiter** | `add --rec --name NAME [--id ID] [--oid ORG_ID] [--phone NUMBER] [--email EMAIL] [--url URL] [--address ADDRESS] [--tag TAG]...`
e.g., `add --rec --name John Doe --oid paypal-sg` |
-| **Delete Contact** | `delete INDEX/ID [--recursive]`
e.g., `delete 3`, `delete id-55tg` |
-| **Edit Contact** | `edit INDEX/ID [--name NAME] [--id ID] [--phone PHONE] [--email EMAIL] [--url URL] [--address ADDRESS] [--tag TAG]...` |
+| **Add Organization** | `add --org --name NAME [--id ID] [--phone NUMBER] [--email EMAIL] [--url URL] [--address ADDRESS] [--tag TAG]...`{:.language-sh}
e.g., `add --org --name NUS --phone 0123456789 --email example@nus.edu.sg --url https://www.nus.edu.sg/`{:.language-sh} |
+| **Add Recruiter** | `add --rec --name NAME [--id ID] [--oid ORG_ID] [--phone NUMBER] [--email EMAIL] [--url URL] [--address ADDRESS] [--tag TAG]...`{:.language-sh}
e.g., `add --rec --name John Doe --oid paypal-sg`{:.language-sh} |
+| **Delete Contact** | `delete INDEX/ID [--recursive]`{:.language-sh}
e.g., `delete 3`, `delete id-55tg` |
+| **Edit Contact** | `edit INDEX/ID [--name NAME] [--id ID] [--phone PHONE] [--email EMAIL] [--url URL] [--address ADDRESS] [--tag TAG]...`{:.language-sh} |
| **Find** | `find KEYWORD [MORE_KEYWORDS]`
e.g., `find James Jake` |
-| **List** | `list [--org/--rec/--toapply]` |
-| **Sort Contacts** | `sort --address/--email/--id/--name/--phone/--url [--ascending/--descending]` |
+| **List** | `list [--org / --rec / --toapply]`{:.language-sh} |
+| **Sort Contacts** | `sort --address / --email / --id / --name / --phone / --url [--ascending / --descending]`{:.language-sh} |
### Commands for Handling Job Applications
@@ -754,10 +772,10 @@ Exits the program.
| Action | Format, Examples |
|------------------------|----------------------------------------------------------------------------------------------------------------------------------------------------------------------------|
-| **Delete Application** | `delete --application INDEX`
e.g., `delete --application 2` |
-| **Edit Application** | `edit --application INDEX [--title TITLE] [--description DESCRIPTION] [--by DEADLINE] [--status STATUS] [--stage STAGE]`
e.g., `edit --application 2 --title Analyst` |
-| **Apply** | `apply INDEX/ID --title TITLE [--description DESCRIPTION] [--by DEADLINE] [--stage STAGE] [--status STATUS]` |
-| **Sort Applications** | `sort --by/--stage/--stale/--status/--title [--ascending/--descending]` |
+| **Delete Application** | `delete --application INDEX`{:.language-sh}
e.g., `delete --application 2`{:.language-sh} |
+| **Edit Application** | `edit --application INDEX [--title TITLE] [--description DESCRIPTION] [--by DEADLINE] [--status STATUS] [--stage STAGE]`{:.language-sh}
e.g., `edit --application 2 --title Analyst`{:.language-sh} |
+| **Apply** | `apply INDEX/ID --title TITLE [--description DESCRIPTION] [--by DEADLINE] [--stage STAGE] [--status STATUS]`{:.language-sh} |
+| **Sort Applications** | `sort --by / --stage / --stale / --status / --title [--ascending / --descending]`{:.language-sh} |
### Other Commands
@@ -772,13 +790,14 @@ Exits the program.
## Glossary
-| Term | Definition |
-|------|------------|
-| **Top Level Domain** | A Top Level Domain (TLD) is the part of the website address where it comes after the last dot (i.e. ".com", ".org", ".net") and before the first slash. (E.g. www.example.**com**/path). |
-| **Whitespace** | In the context of this application, a whitespace is any number of spaces or tabs that is in the input. |
-| **Contact** | A contact in Jobby is can be an **organization** or a **recruiter**. |
-| **Substring** | A substring is a contiguous sequence of characters within a string.
e.g. "pp" is a substring of "apple", "mac" is a substring of "macDonald" and "intimacy" |
-
+| Term | Definition |
+|----------------------|-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------|
+| **Index** | An index is a number that is used to identify a contact or job application in a list.
(e.g. `2` would be the index of the contact labelled **2.** in the contacts list). |
+| **Whitespace** | In the context of this application, a whitespace is any number of spaces that is in the input. |
+| **Contact** | A contact in Jobby can be an
Organization or a
Recruiter. |
+| **Substring** | A substring is a contiguous sequence of characters within a string
(e.g. "pp" is a substring of "apple", "mac" is a substring of "macDonald" and "intimacy"). |
+| **Subsequence** | A subsequence is a sequence obtainable from another sequence by deleting some or no elements without changing the order of the remaining elements
(e.g. "abc", "1b2", "123" are all subsequences of "a1b2c3"). |
+| **Top Level Domain** | A Top Level Domain (TLD) is the part of the website address where it comes after the last dot (i.e. ".com", ".org", ".net") and before the first slash
(e.g. www.example.**com**/path). |
## Appendices
@@ -786,20 +805,20 @@ Exits the program.
| Parameter | Used by | Requirements | Examples |
|-----------|---------|--------------|----------|
-| `INDEX` | [`edit`](#editing-contacts---edit)
[`apply`](#applying-to-organizations---apply)
[`edit --application`](#editing-job-applications---edit---application)
[`delete`](#deleting-contacts---delete)
[`delete --application`](#deleting-job-applications---delete---application) | A valid index can accept any positive integer up to the number of items displayed in the contact or job application list where applicable. | `1`
`10` |
-| `NAME` | [`add --org`](#adding-organizations---add---org)
[`add --rec`](#adding-recruiters---add---rec)
[`edit`](#editing-contacts---edit) | A valid name can accept any non-empty value. | `Ryan Koh`
`小明` |
-| `ID` | [`add --org`](#adding-organizations---add---org)
[`add --rec`](#adding-recruiters---add---rec)
[`edit`](#editing-contacts---edit)
[`apply`](#applying-to-organizations---apply)
[`delete`](#deleting-contacts---delete) | A valid ID has to start with a letter.
It can consist of alphanumeric and basic symbols (i.e. `a-z`, `A-Z`, `0-9`, `-`, `_`) | `woogle123`
`ryan_soc-rec` |
-| `NUMBER` | [`add --org`](#adding-organizations---add---org)
[`add --rec`](#adding-recruiters---add---rec)
[`edit`](#editing-contacts---edit) | A valid phone number can consist of only numbers with no whitespace.
It must be at least 3 digits. | `999`
`91824137` |
-| `EMAIL` | [`add --org`](#adding-organizations---add---org)
[`add --rec`](#adding-recruiters---add---rec)
[`edit`](#editing-contacts---edit) | A valid email should be in the form of `local-part@domain` where the `local-part` and `domain` must be separated by a single **@**.
The `local-part` can consist of any character except whitespace.
The `domain` name can comprise of one or more labels separated by periods, and each label can include any character except whitespace. The last `domain` label must be a minimum of two characters long. | `ryankoh@nus`
`ryan-koh@nus.edu.sg` |
-| `URL` | [`add --org`](#adding-organizations---add---org)
[`add --rec`](#adding-recruiters---add---rec)
[`edit`](#editing-contacts---edit) | A valid url should include a part in the form of `domain.tld` where the `domain` and the `tld` (top level domain) must be separated by a period. | `example.com`
`example.more.com`
`https://example.com`
`example.com/more` |
-| `ADDRESS`| [`add --org`](#adding-organizations---add---org)
[`add --rec`](#adding-recruiters---add---rec)
[`edit`](#editing-contacts---edit) | A valid address can accept any non-empty value.
For a contact, it designates its physical address. | `21 Lower Kent Ridge Rd` |
-| `TAG` | [`add --org`](#adding-organizations---add---org)
[`add --rec`](#adding-recruiters---add---rec)
[`edit`](#editing-contacts---edit) | A valid tag can consist of only alphanumeric characters. | `internship`
`network`
`parttime`
`jobPortal` |
-| `ORG_ID` | [`add --rec`](#adding-recruiters---add---rec) | A valid organization ID is subject to the same requirements as the ID parameter.
It must belong to an
Organization contact in the address book. | `woogle123`
`meta_sg-1` |
-| `TITLE` | [`apply`](#applying-to-organizations---apply)
[`edit --application`](#editing-job-applications---edit---application) | A valid title can accept multiple words separated with spaces, as long as the characters are alphanumeric. | `Software Engineer`
`Level 3 Engineer` |
-| `DESCRIPTION` | [`apply`](#applying-to-organizations---apply)
[`edit --application`](#editing-job-applications---edit---application) | A valid description can accept any non-empty value. | `Senior Role`
`Hourly rate: $25` |
-| `DEADLINE` | [`apply`](#applying-to-organizations---apply)
[`edit --application`](#editing-job-applications---edit---application) | A valid deadline should be a date in the form of `DD-MM-YYYY`.
The day (`DD`) and month (`MM`) can be either single or double digits. | `09-02-2022`
`9-2-2022`
`19-11-2022` |
-| `STAGE` | [`apply`](#applying-to-organizations---apply)
[`edit --application`](#editing-job-applications---edit---application) | A valid job application stage can accept only one of the three values: `resume`, `online assessment`, `interview`.
The values are ranked in the order shown. | `resume`
`online assessment`
`interview` |
-| `STATUS` | [`apply`](#applying-to-organizations---apply)
[`edit --application`](#editing-job-applications---edit---application) | A valid job application status can accept only one of the four values: `pending`, `offered`, `accepted`, `turned down`.
The values are ranked in the order shown. | `pending`
`offered`
`accepted`
`turned down` |
+| `INDEX` | [`edit`](#editing-contacts---edit)
[`apply`](#applying-to-organizations---apply)
[`edit --application`{:.language-sh}](#editing-job-applications---edit---application)
[`delete`](#deleting-contacts---delete)
[`delete --application`{:.language-sh}](#deleting-job-applications---delete---application) | A valid index can accept any positive integer up to the number of items displayed in the contact or job application list where applicable. | `1`
`10` |
+| `NAME` | [`add --org`{:.language-sh}](#adding-organizations---add---org)
[`add --rec`{:.language-sh}](#adding-recruiters---add---rec)
[`edit`](#editing-contacts---edit) | A valid name can accept any non-empty value. | `Ryan Koh`
`小明` |
+| `ID` | [`add --org`{:.language-sh}](#adding-organizations---add---org)
[`add --rec`{:.language-sh}](#adding-recruiters---add---rec)
[`edit`](#editing-contacts---edit)
[`apply`](#applying-to-organizations---apply)
[`delete`](#deleting-contacts---delete) | A valid ID has to start with a letter.
It can consist of alphanumeric and basic symbols (i.e. `a-z`, `A-Z`, `0-9`, `-`, `_`) | `woogle123`
`ryan_soc-rec` |
+| `NUMBER` | [`add --org`{:.language-sh}](#adding-organizations---add---org)
[`add --rec`{:.language-sh}](#adding-recruiters---add---rec)
[`edit`](#editing-contacts---edit) | A valid phone number can consist of only numbers with no whitespace.
It must be at least 3 digits. | `999`
`91824137` |
+| `EMAIL` | [`add --org`{:.language-sh}](#adding-organizations---add---org)
[`add --rec`{:.language-sh}](#adding-recruiters---add---rec)
[`edit`](#editing-contacts---edit) | A valid email should be in the form of `local-part@domain` where the `local-part` and `domain` must be separated by a single **@**.
The `local-part` can consist of any character except whitespace.
The `domain` name can comprise of one or more labels separated by periods, and each label can include any character except whitespace. The last `domain` label must be a minimum of two characters long. | `ryankoh@nus`
`ryan-koh@nus.edu.sg` |
+| `URL` | [`add --org`{:.language-sh}](#adding-organizations---add---org)
[`add --rec`{:.language-sh}](#adding-recruiters---add---rec)
[`edit`](#editing-contacts---edit) | A valid url should include a part in the form of `domain.tld` where the `domain` and the `tld` (top level domain) must be separated by a period. | `example.com`
`example.more.com`
`https://example.com`
`example.com/more` |
+| `ADDRESS`| [`add --org`{:.language-sh}](#adding-organizations---add---org)
[`add --rec`{:.language-sh}](#adding-recruiters---add---rec)
[`edit`](#editing-contacts---edit) | A valid address can accept any non-empty value.
For a contact, it designates its physical address. | `21 Lower Kent Ridge Rd` |
+| `TAG` | [`add --org`{:.language-sh}](#adding-organizations---add---org)
[`add --rec`{:.language-sh}](#adding-recruiters---add---rec)
[`edit`](#editing-contacts---edit) | A valid tag can consist of only alphanumeric characters. | `internship`
`network`
`parttime`
`jobPortal` |
+| `ORG_ID` | [`add --rec`{:.language-sh}](#adding-recruiters---add---rec) | A valid organization ID is subject to the same requirements as the ID parameter.
It must belong to an
Organization contact in the address book. | `woogle123`
`meta_sg-1` |
+| `TITLE` | [`apply`](#applying-to-organizations---apply)
[`edit --application`{:.language-sh}](#editing-job-applications---edit---application) | A valid title can accept multiple words separated with spaces, as long as the characters are alphanumeric. | `Software Engineer`
`Level 3 Engineer` |
+| `DESCRIPTION` | [`apply`](#applying-to-organizations---apply)
[`edit --application`{:.language-sh}](#editing-job-applications---edit---application) | A valid description can accept any non-empty value. | `Senior Role`
`Hourly rate: $25` |
+| `DEADLINE` | [`apply`](#applying-to-organizations---apply)
[`edit --application`{:.language-sh}](#editing-job-applications---edit---application) | A valid deadline should be a date in the form of `DD-MM-YYYY`.
The day (`DD`) and month (`MM`) can be either single or double digits. | `09-02-2022`
`9-2-2022`
`19-11-2022` |
+| `STAGE` | [`apply`](#applying-to-organizations---apply)
[`edit --application`{:.language-sh}](#editing-job-applications---edit---application) | A valid job application stage can accept only one of the three values: `resume`, `online assessment`, `interview`.
The values are ranked in the order shown. | `resume`
`online assessment`
`interview` |
+| `STATUS` | [`apply`](#applying-to-organizations---apply)
[`edit --application`{:.language-sh}](#editing-job-applications---edit---application) | A valid job application status can accept only one of the four values: `pending`, `offered`, `accepted`, `turned down`.
The values are ranked in the order shown. | `pending`
`offered`
`accepted`
`turned down` |
| `KEYWORD` | [`find`](#searching-contacts---find) | A valid keyword is a single word that can accept any non-empty value. | `software`
`Ryan` |
@@ -829,6 +848,6 @@ Exits the program.
1. **When using multiple screens**, if you move the application to a secondary screen, and later switch to using only the primary screen, the GUI will open off-screen. The remedy is to delete the _preferences.json_ file created by the application before running the application again.
-2. **When requesting to sort applications after a call to `list --rec`**, the command will succeed but display nothing, since no organizations are currently listed, and so no linked applications will display. The remedy is to call `list` before sorting applications and calling the sort command once more.
+2. **When requesting to sort applications after a call to `list --rec`{:.language-sh}**, the command will succeed but display nothing, since no organizations are currently listed, and so no linked applications will display. The remedy is to call `list` before sorting applications and calling the sort command once more.
-3. Parameter names use either the `-` or `--` prefix, but **all commands as of the current version only use the `--` prefix.** The `-` prefix is currently unused, but in future updates it may become relevant.
+3. Parameter names use either the `-` or `--` prefix, but **all commands as of the current version only use the `--` prefix.** While the `-` prefix is currently unused, it is reserved (so user input cannot take that format), and it will be relevant in future updates.
diff --git a/docs/_sass/minima/_layout.scss b/docs/_sass/minima/_layout.scss
index 0052216d00f..7e3ffb77e6c 100644
--- a/docs/_sass/minima/_layout.scss
+++ b/docs/_sass/minima/_layout.scss
@@ -370,6 +370,8 @@
page-break-before: always !important;
}
-
+ tr {
+ page-break-inside: avoid;
+ }
}
diff --git a/docs/_sass/minima/custom-styles.scss b/docs/_sass/minima/custom-styles.scss
index 43f754305e7..1da9573ec20 100644
--- a/docs/_sass/minima/custom-styles.scss
+++ b/docs/_sass/minima/custom-styles.scss
@@ -56,6 +56,7 @@ img.emoji {
}
// Syntax highlighting term overrides
+// - Multiline
.language-sh, .language-bash, .language-shell {
.highlight code {
.nb {
@@ -68,6 +69,13 @@ img.emoji {
}
}
}
+// - Inline
+code.language-plaintext, code.language-sh, code.language-bash, code.language-shell {
+ .nt {
+ /* do not wrap --flags */
+ white-space: nowrap;
+ }
+}
// Pill styles
.pill {
@@ -83,6 +91,8 @@ img.emoji {
font-size: 75%;
vertical-align: text-bottom;
+ display: inline-block;
+
.pill {
/* so nesting pills will look the same */
font-size: 100%;
@@ -139,10 +149,8 @@ img.emoji {
border-color: #e8e6e5;
color: #444444;
- padding: 4px 12px;
padding-right: 2px;
margin: 4px 2px;
- display: inline-block;
&.jobby-data-class:not(:first-child) {
margin-left: 0;
diff --git a/docs/diagrams/AutocompleteClasses.puml b/docs/diagrams/AutocompleteClasses.puml
new file mode 100644
index 00000000000..dfed450f38b
--- /dev/null
+++ b/docs/diagrams/AutocompleteClasses.puml
@@ -0,0 +1,61 @@
+@startuml
+!include style.puml
+skinparam arrowThickness 1.2
+skinparam arrowColor LOGIC_COLOR_T4
+skinparam classBackgroundColor LOGIC_COLOR
+
+skinparam class {
+ 'workaround to render generics properly without breaking the rest
+ BorderColor LOGIC_COLOR
+ BorderThickness 0
+
+ StereotypeFontColor LOGIC_COLOR_T2
+ StereotypeFontSize 14
+}
+
+'hidden boxes
+class " " as HiddenOutside1 <
>
+class " " as HiddenOutside2 <>
+skinparam class {
+ BorderColor<> #FFFFFF
+ BackgroundColor<> #FFFFFF
+ StereotypeFontColor<> #FFFFFF
+ StereotypeFontSize<> 1
+}
+
+'packages
+package Autocomplete as AutocompletePackage <> {
+ class AutocompleteGenerator
+ class AutocompleteSupplier
+
+ class "AutocompleteItemSet" as AutocompleteItemSet
+ class "<>\nAutocompleteConstraint" as AutocompleteConstraint
+
+ class "<>\nFlagValueSupplier" as FlagValueSupplier
+ class PartitionedCommand
+}
+
+package Model as ModelPackage {
+}
+package "Parser classes" <> {
+ class Flag
+}
+
+'relationships
+HiddenOutside1 .down.> AutocompleteGenerator
+HiddenOutside2 .right.> AutocompleteSupplier
+
+AutocompleteGenerator -down-> "1" AutocompleteSupplier : uses >
+
+AutocompleteSupplier --> "1" AutocompleteItemSet
+AutocompleteSupplier --> "*" FlagValueSupplier
+AutocompleteSupplier ..> Flag
+
+AutocompleteItemSet --> "*" AutocompleteConstraint : contains >
+
+AutocompleteGenerator ..> PartitionedCommand : creates >
+FlagValueSupplier .right.> PartitionedCommand : uses >
+
+FlagValueSupplier ..down.> ModelPackage : uses >
+PartitionedCommand ..down.> Flag
+@enduml
diff --git a/docs/diagrams/LogicClassDiagram.puml b/docs/diagrams/LogicClassDiagram.puml
index a57720890ee..920760fde92 100644
--- a/docs/diagrams/LogicClassDiagram.puml
+++ b/docs/diagrams/LogicClassDiagram.puml
@@ -6,7 +6,7 @@ skinparam classBackgroundColor LOGIC_COLOR
package Logic as LogicPackage {
-Class AddressBookParser
+Class AppParser
Class XYZCommand
Class CommandResult
Class "{abstract}\nCommand" as Command
@@ -27,8 +27,8 @@ Class HiddenOutside #FFFFFF
HiddenOutside ..> Logic
LogicManager .right.|> Logic
-LogicManager -right->"1" AddressBookParser
-AddressBookParser ..> XYZCommand : creates >
+LogicManager -right->"1" AppParser
+AppParser ..> XYZCommand : creates >
XYZCommand -up-|> Command
LogicManager .left.> Command : executes >
diff --git a/docs/diagrams/style.puml b/docs/diagrams/style.puml
index f7d7347ae84..7770580f0b7 100644
--- a/docs/diagrams/style.puml
+++ b/docs/diagrams/style.puml
@@ -31,6 +31,12 @@
!define STORAGE_COLOR_T3 #806600
!define STORAGE_COLOR_T2 #544400
+!define AUTOCOMPLETE_COLOR #3333C4
+!define AUTOCOMPLETE_COLOR_T1 #C8C8FA
+!define AUTOCOMPLETE_COLOR_T2 #6A6ADC
+!define AUTOCOMPLETE_COLOR_T3 #1616B0
+!define AUTOCOMPLETE_COLOR_T4 #101086
+
!define USER_COLOR #000000
skinparam Package {
diff --git a/docs/images/AutocompleteClasses.png b/docs/images/AutocompleteClasses.png
new file mode 100644
index 00000000000..28787acc40c
Binary files /dev/null and b/docs/images/AutocompleteClasses.png differ
diff --git a/docs/images/LogicClassDiagram.png b/docs/images/LogicClassDiagram.png
index e3b784310fe..d27e6627eb1 100644
Binary files a/docs/images/LogicClassDiagram.png and b/docs/images/LogicClassDiagram.png differ
diff --git a/docs/index.md b/docs/index.md
index 6cc225a49e5..16bbf079408 100644
--- a/docs/index.md
+++ b/docs/index.md
@@ -20,4 +20,4 @@ title: Jobby
**Acknowledgements**
-* Libraries used: [JavaFX](https://openjfx.io/), [Jackson](https://github.com/FasterXML/jackson), [JUnit5](https://github.com/junit-team/junit5)
+Refer to the [Developer Guide's Acknowledgements section](DeveloperGuide.html#acknowledgements).
diff --git a/docs/team/wxwern.md b/docs/team/wxwern.md
index 3b06e43a731..24a0d84732a 100644
--- a/docs/team/wxwern.md
+++ b/docs/team/wxwern.md
@@ -7,103 +7,64 @@ title: Wern's Project Portfolio Page
### Project: Jobby
-Jobby is a desktop application used for tracking job applications.
+Jobby is a desktop application used for managing your job applications and associated organization and recruiter contacts.
Given below are my contributions to the project.
-* **New Feature**:
+* **New Feature**: Command Autocompletion ([PR #63](https://github.com/AY2324S1-CS2103T-W08-3/tp/pull/63))
- * **Command Autocompletion**
-
- * This allows users to autocomplete their commands, just like command terminals or programming IDEs, such as by pressing **TAB**.
+ * This allows users to autocomplete their commands, just like command terminals or programming IDEs, such as by pressing **TAB**, and even undo when you **BACKSPACE**.
* Like an IDE, it does a _subsequence_ match, so typing `-dsp` then **TAB** can select `--description`, allowing for fast disambiguation from another similar term like `--descending`.
- * As a bonus, it also supports undoing with **BACKSPACE**. It keeps a complete undo history, so you can do multiple undos for the same command as long if you did not move your text cursor from the end point.
-
- * **Rationale:**
-
- * When developing Jobby, we started having too many command parameters with clashing prefixes, so it no longer make sense to offer single letter parameter names.
-
- * Memorizing multi-letter abbreviations for a bunch of parameter is more difficult than a full name.
-
- * However, a full parameter name takes much longer to type, which means it's no longer optimized for fast typists.
-
- * Hence, autocompletion was implemented to resolve all of these concerns.
-
- * **Implementation:** The internal implementation is written completely from scratch. This allows it to:
-
- * specifically parse our custom command structure, and
-
- * dynamically determine what should or should not be suggested next based on a given set of rules, or available data in the app.
-
- * **UI:** The autocompletion UI is adapted from [@floralvikings's AutoCompleteTextBox.java](https://gist.github.com/floralvikings/10290131) with significant enhancements. These include:
+ * **Rationale:** It allows for faster command input, and reduces command syntax memorization.
- * overhauling the implementation in modern Java syntax and JavaFX method calls,
+ * **Implementation:** The internal implementation is written completely from scratch to support our custom formats - more information available in the Developer Guide.
- * modified the implementation idea to support for our custom `Stream`-based autocompletion result suppliers,
-
- * integrating it directly within FXML,
-
- * improved the UI to support adding indicators for invoking the best (first-in-list) autocomplete result,
-
- * added support for auto-highlighting only the postfix term that is suggested for improved glancability,
-
- * added support for external parties to invoke autocompletion (e.g., via preferred key events or UI buttons), and
-
- * added support for undoing autocompleted results (and similarly for external parties to invoke undo).
+ * **UI:** The autocompletion UI is adapted from [@floralvikings's AutoCompleteTextBox.java](https://gist.github.com/floralvikings/10290131). The reference text box only has a barebones context menu, but significant enhancements has been made to the styling and behavior to improve readability and UX (like partial term highlighting and undo support), which can be seen when using Jobby.
* **Code contributed**: [RepoSense link](https://nus-cs2103-ay2324s1.github.io/tp-dashboard/?search=AY2324S1-CS2103T-W08-3&sort=groupTitle&sortWithin=title&timeframe=commit&mergegroup=&groupSelect=groupByRepos&breakdown=true&checkedFileTypes=docs~functional-code~test-code~other&since=2023-09-22&tabOpen=true&tabType=authorship&tabAuthor=wxwern&tabRepo=AY2324S1-CS2103T-W08-3%2Ftp%5Bmaster%5D&authorshipIsMergeGroup=false&authorshipFileTypes=docs~other~functional-code~test-code&authorshipIsBinaryFileTypeChecked=false&authorshipIsIgnoredFilesChecked=false)
* **Project management**:
- * To be added...
+ * Configuring the Issue Tracker Tags and Milestones for the project.
+ * Setting up GitHub Actions for the project, including Java CI, CodeCov, GitHub Pages, PR Checks.
+ * Managed releases [v1.2 and v1.3](https://github.com/AY2324S1-CS2103T-W08-3/tp/releases).
+ * Styling the website for optimal readability and print formatting, including:
-* **Enhancements to existing features**:
+ * Styling headers with improved spacing, typography and color for increased readability.
- * Revamped the parameter syntax to use a prefix of `--param`.
+ * Tweaking the page-break rules for different elements, such as preventing page breaks on crucial boxes or enforcing page breaks immediately after certain headers.
- * This allows for improved autocompletion UX as compared to `param/`, since we can immediately determine if the user intends to type it based on the first character.
+ * Styling custom unified UG elements, like the following:
+ * :trophy: How to perform a task :information_source: An info pill :warning: A warning pill :warning: A danger pill
+ * Organization Recruiter Job Application
+ * Beginner Intermediate Expert
- * It is also much less likely to clash with an existing user input.
+* **Enhancements to existing features**:
+ * Revamped the parameter syntax to use a prefix of `--param`.
+ * This allows for improved autocompletion UX as compared to `param/`, since we can immediately determine if the user intends to type a parameter based on the first character.
+ * It is also much less likely to clash with an existing user input.
* Swapped out random ID generation with an implementation to derive IDs from an input name.
-
* This allows for improved UX when editing details that require an ID, combined with autocomplete integration.
-
- * Previously, it was implemented by another team member by generating random RFC 4122 UUIDs instead.
-
- * Now, random IDs are derived from the name, e.g., `google-sg-a8b3fe` from an input of `Google SG`.
+ * e.g., `google-sg-a8b3fe` can be derived from an input of `Google SG`.
* **Documentation**:
* User Guide:
-
- * Added a simpler command syntax introduction.
-
- * Improved explanation of command symbols used in the guide.
-
+ * Added a structured command syntax introduction, and instructions to interpret command formats.
* Added usage guides for command autocompletion.
-
- * Styling the website for improved overall glancability and support for fully-automated print formatting, including:
-
- * Styling headers with improved spacing, typography and color for increased readability.
-
- * Tweaking the page-break rules for different elements, such as preventing page breaks on crucial boxes or enforcing page breaks immediately after certain headers.
-
- * Styling custom unified UG elements for readability, like the following:
- * :trophy: How to perform a task :information_source: An info message pill
- * :warning: A warning message pill :warning: A danger message pill
- * Beginner Intermediate Expert
- * Organization Recruiter Job Application
-
+ * Styling the website for improved overall readability and automated print formatting (see above in Project Management).
* Developer Guide:
-
- * Added a quick explanation of how "Parser classes" may obtain the properties of our custom `Flag`s (like `--name`) from a command via `ArgumentMultimap` and `ArgumentTokenizer`.
-
- * Added a high-level end-to-end explanation of Jobby's internal autocomplete implementation and interactions.
+ * Integrated explanations of how "Autocomplete classes" work in the context of the `Logic` package.
+ * Updated how `AppParser` (formerly `AddressBookParser`) operates in the context of our app, since we now dynamically look up details and also support autocompletion.
+ * Added a complete high-level explanation of Jobby's internal autocomplete implementation.
+ * Added use cases for autocompletion.
* **Community**:
- * To be added...
+ * Detailed PR Reviews (e.g., [#32](https://github.com/AY2324S1-CS2103T-W08-3/tp/pull/32), [#34](https://github.com/AY2324S1-CS2103T-W08-3/tp/pull/34), [#39](https://github.com/AY2324S1-CS2103T-W08-3/tp/pull/39), [#69](https://github.com/AY2324S1-CS2103T-W08-3/tp/pull/69), [#183](https://github.com/AY2324S1-CS2103T-W08-3/tp/pull/183))
+ * Forum contributions (e.g., [#30](https://github.com/nus-cs2103-AY2324S1/forum/issues/30), [#103](https://github.com/nus-cs2103-AY2324S1/forum/issues/103))
+ * Reported bugs and suggestions for other teams (e.g., during PE-D)
diff --git a/src/main/java/seedu/address/logic/autocomplete/AutocompleteGenerator.java b/src/main/java/seedu/address/logic/autocomplete/AutocompleteGenerator.java
index d7f32a6b431..5db6a0a6e06 100644
--- a/src/main/java/seedu/address/logic/autocomplete/AutocompleteGenerator.java
+++ b/src/main/java/seedu/address/logic/autocomplete/AutocompleteGenerator.java
@@ -150,14 +150,14 @@ private static Optional