diff --git a/LICENSE b/LICENSE index 39b3478982c..93c6f332326 100644 --- a/LICENSE +++ b/LICENSE @@ -2,11 +2,11 @@ MIT License Copyright (c) 2016 Software Engineering Education - FOSS Resources -Permission is hereby granted, free of charge, to any person obtaining a copy +Permission is hereby granted, free of charge, to any company obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell -copies of the Software, and to permit persons to whom the Software is +copies of the Software, and to permit companies to whom the Software is furnished to do so, subject to the following conditions: The above copyright notice and this permission notice shall be included in all diff --git a/README.md b/README.md index 13f5c77403f..66661bf07c4 100644 --- a/README.md +++ b/README.md @@ -1,14 +1,26 @@ -[![CI Status](https://github.com/se-edu/addressbook-level3/workflows/Java%20CI/badge.svg)](https://github.com/se-edu/addressbook-level3/actions) +# LinkMeIn + +[![CI Status](https://github.com/AY2324S1-CS2103T-T17-2/tp/workflows/Java%20CI/badge.svg)](https://github.com/AY2324S1-CS2103T-T17-2/tp/actions) ![Ui](docs/images/Ui.png) -* This is **a sample project for Software Engineering (SE) students**.
- Example usages: - * as a starting point of a course project (as opposed to writing everything from scratch) - * as a case study -* The project simulates an ongoing software project for a desktop application (called _AddressBook_) used for managing contact details. - * It is **written in OOP fashion**. It provides a **reasonably well-written** code base **bigger** (around 6 KLoC) than what students usually write in beginner-level SE modules, without being overwhelmingly big. +* This is **a project forked from CS2103T TP Software Engineering (SE) for SE students**.
+
+ * This application allows students to track their applications to companies +

+ * It also allows students to take note of application deadlines +

+ * It is **written in OOP fashion**. It provides a **reasonably well-written** + code base **bigger** (around 6 KLoC) than what students usually write in beginner-level SE modules, + without being overwhelmingly big. +

* It comes with a **reasonable level of user and developer documentation**. -* It is named `AddressBook Level 3` (`AB3` for short) because it was initially created as a part of a series of `AddressBook` projects (`Level 1`, `Level 2`, `Level 3` ...). -* For the detailed documentation of this project, see the **[Address Book Product Website](https://se-education.org/addressbook-level3)**. -* This project is a **part of the se-education.org** initiative. If you would like to contribute code to this project, see [se-education.org](https://se-education.org#https://se-education.org/#contributing) for more info. +

+ * It is named `LinkMeIn` as it was inspired from LinkedIn's functionality. However, this + project puts a spin on LinkedIn by allowing students to track their applications to companies. +

+* This project is based on the AddressBook-Level3 project created by the +[SE-EDU initiative](https://se-education.org). +

+* If you would like to contribute code to this project, +see [se-education.org](https://se-education.org#https://se-education.org/#contributing) for more info. diff --git a/build.gradle b/build.gradle index a2951cc709e..72b0263738e 100644 --- a/build.gradle +++ b/build.gradle @@ -66,7 +66,11 @@ dependencies { } shadowJar { - archiveFileName = 'addressbook.jar' + archiveFileName = 'LinkMeIn.jar' +} + +run { + enableAssertions = true } defaultTasks 'clean', 'test' diff --git a/codecov.yml b/codecov.yml new file mode 100644 index 00000000000..3189404d2e0 --- /dev/null +++ b/codecov.yml @@ -0,0 +1,8 @@ +coverage: + status: + project: + default: + informational: true # Project status checks will be informational + patch: + default: + informational: true # Patch status checks will be informational diff --git a/docs/AboutUs.md b/docs/AboutUs.md index 1c9514e966a..64ed3231f0c 100644 --- a/docs/AboutUs.md +++ b/docs/AboutUs.md @@ -7,53 +7,50 @@ We are a team based in the [School of Computing, National University of Singapor You can reach us at the email `seer[at]comp.nus.edu.sg` -## Project team +## Project Team -### John Doe +### Alagappan Ramanathan - + -[[homepage](http://www.comp.nus.edu.sg/~damithch)] -[[github](https://github.com/johndoe)] -[[portfolio](team/johndoe.md)] +[[Github](https://github.com/AlagappanRa)][[Portfolio](team/alagappanra.md)] -* Role: Project Advisor +* Role: Developer +* Responsibilities: Testing -### Jane Doe +### Tay Ru Xin - + -[[github](http://github.com/johndoe)] -[[portfolio](team/johndoe.md)] +[[Github](http://github.com/tayruxin)][[Portfolio](team/tayruxin.md)] -* Role: Team Lead -* Responsibilities: UI +* Role: Developer +* Responsibilities: Deliverables and Deadlines -### Johnny Doe +### Glenda Chong Rui Ting - + -[[github](http://github.com/johndoe)] [[portfolio](team/johndoe.md)] +[[Github](http://github.com/glendachong)][[LinkedIn](https://www.linkedin.com/in/glenda-chong-149367237)][[Portfolio](team/glendachong.md)] * Role: Developer -* Responsibilities: Data +* Responsibilities: Documentation -### Jean Doe +### Lim En Tian - + + +[[Github](http://github.com/alientian)][[Portfolio](team/alientian.md)] -[[github](http://github.com/johndoe)] -[[portfolio](team/johndoe.md)] * Role: Developer -* Responsibilities: Dev Ops + Threading +* Responsibilities: UI -### James Doe +### Ramu Rithik Vijay - + -[[github](http://github.com/johndoe)] -[[portfolio](team/johndoe.md)] +[[Github](http://github.com/papataco14)][[LinkedIn](https://www.linkedin.com/in/rithikvijay/)][[Portfolio](team/papataco14.md)] * Role: Developer -* Responsibilities: UI +* Responsibilities: Deciphering requirements diff --git a/docs/DeveloperGuide.md b/docs/DeveloperGuide.md index 8a861859bfd..9f16f3ec37b 100644 --- a/docs/DeveloperGuide.md +++ b/docs/DeveloperGuide.md @@ -2,63 +2,74 @@ layout: page title: Developer Guide --- + +## **Table of Contents** * Table of Contents {:toc} --------------------------------------------------------------------------------------------------------------------- +--- ## **Acknowledgements** -* {list here sources of all reused/adapted ideas, code, documentation, and third-party libraries -- include links to the original source as well} +This project is based on the AddressBook-Level3 project created by the [SE-EDU initiative](https://se-education.org). --------------------------------------------------------------------------------------------------------------------- +* Libraries used: + * [JavaFX](https://openjfx.io/) + * [Jackson](https://github.com/FasterXML/jackson) + * [JUnit](https://junit.org/junit5/) + +--- -## **Setting up, getting started** +## **Setting Up, Getting Started** Refer to the guide [_Setting up and getting started_](SettingUp.md). --------------------------------------------------------------------------------------------------------------------- +--- +
## **Design**
:bulb: **Tip:** The `.puml` files used to create diagrams in this document `docs/diagrams` folder. Refer to the [_PlantUML Tutorial_ at se-edu/guides](https://se-education.org/guides/tutorials/plantUml.html) to learn how to create and edit diagrams. +
### Architecture -The ***Architecture Diagram*** given above explains the high-level design of the App. +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`](https://github.com/se-edu/addressbook-level3/tree/master/src/main/java/seedu/address/Main.java) and [`MainApp`](https://github.com/se-edu/addressbook-level3/tree/master/src/main/java/seedu/address/MainApp.java)) is in charge of the app launch and shut down. -* At app launch, it initializes the other components in the correct sequence, and connects them up with each other. -* At shut down, it shuts down the other components and invokes cleanup methods where necessary. +**`Main`** (consisting of classes [`Main`](https://github.com/AY2324S1-CS2103T-T17-2/tp/blob/master/src/main/java/seedu/address/Main.java) and [`MainApp`](https://github.com/AY2324S1-CS2103T-T17-2/tp/blob/master/src/main/java/seedu/address/MainApp.java)) is in charge of the app launch and shut down. + +- At app launch, it initializes the other components in the correct sequence, and connects them up with each other. +- At shut down, it shuts down the other components and invokes cleanup methods where necessary. The bulk of the app's work is done by the following four components: -* [**`UI`**](#ui-component): The UI of the App. -* [**`Logic`**](#logic-component): The command executor. -* [**`Model`**](#model-component): Holds the data of the App in memory. -* [**`Storage`**](#storage-component): Reads data from, and writes data to, the hard disk. +- [**`UI`**](#ui-component): The UI of the App. +- [**`Logic`**](#logic-component): The command executor. +- [**`Model`**](#model-component): Holds the data of the App in memory. +- [**`Storage`**](#storage-component): Reads data from, and writes data to, the hard disk. [**`Commons`**](#common-classes) 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`. +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), - -* defines its *API* in an `interface` with the same name as the Component. -* implements its functionality using a concrete `{Component Name}Manager` class (which follows the corresponding API `interface` mentioned in the previous point. +- defines its _API_ in an `interface` with the same name as the Component. +- implements its functionality using a concrete `{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. @@ -66,26 +77,30 @@ For example, the `Logic` component defines its API in the `Logic.java` interface The sections below give more details of each component. -### UI component +
+ +### UI Component -The **API** of this component is specified in [`Ui.java`](https://github.com/se-edu/addressbook-level3/tree/master/src/main/java/seedu/address/ui/Ui.java) +The **API** of this component is specified in [`Ui.java`](https://github.com/AY2324S1-CS2103T-T17-2/tp/blob/master/src/main/java/seedu/address/ui/Ui.java) ![Structure of the UI Component](images/UiClassDiagram.png) -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 consists of a `MainWindow` that is made up of parts e.g.`CommandBox`, `ResultDisplay`, `CompanyListPanel`, `CompanyDetailPanel`, `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`](https://github.com/se-edu/addressbook-level3/tree/master/src/main/java/seedu/address/ui/MainWindow.java) is specified in [`MainWindow.fxml`](https://github.com/se-edu/addressbook-level3/tree/master/src/main/resources/view/MainWindow.fxml) +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`](https://github.com/AY2324S1-CS2103T-T17-2/tp/blob/master/src/main/java/seedu/address/ui/MainWindow.java) is specified in [`MainWindow.fxml`](https://github.com/AY2324S1-CS2103T-T17-2/tp/blob/master/src/main/resources/view/MainWindow.fxml) The `UI` component, -* executes user commands using the `Logic` component. -* listens for changes to `Model` data so that the UI can be updated with the modified data. -* keeps a reference to the `Logic` component, because the `UI` relies on the `Logic` to execute commands. -* depends on some classes in the `Model` component, as it displays `Person` object residing in the `Model`. +- executes user commands using the `Logic` component. +- listens for changes to `Model` data so that the UI can be updated with the modified data. +- keeps a reference to the `Logic` component, because the `UI` relies on the `Logic` to execute commands. +- depends on some classes in the `Model` component, as it displays `Company` object residing in the `Model`. -### Logic component +
-**API** : [`Logic.java`](https://github.com/se-edu/addressbook-level3/tree/master/src/main/java/seedu/address/logic/Logic.java) +### Logic Component + +**API** : [`Logic.java`](https://github.com/AY2324S1-CS2103T-T17-2/tp/blob/master/src/main/java/seedu/address/logic/Logic.java) Here's a (partial) class diagram of the `Logic` component: @@ -101,231 +116,950 @@ The sequence diagram below illustrates the interactions within the `Logic` compo How the `Logic` component works: 1. When `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. -1. This results in a `Command` object (more precisely, an object of one of its subclasses e.g., `DeleteCommand`) which is executed by the `LogicManager`. -1. The command can communicate with the `Model` when it is executed (e.g. to delete a person). -1. The result of the command execution is encapsulated as a `CommandResult` object which is returned back from `Logic`. +2. This results in a `Command` object (more precisely, an object of one of its subclasses e.g., `DeleteCommand`) which is executed by the `LogicManager`. +3. The command can communicate with the `Model` when it is executed (e.g. to delete a company). +4. The result of the command execution is encapsulated as a `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: -* When called upon to parse a user command, the `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. -* All `XYZCommandParser` classes (e.g., `AddCommandParser`, `DeleteCommandParser`, ...) inherit from the `Parser` interface so that they can be treated similarly where possible e.g, during testing. -### Model component -**API** : [`Model.java`](https://github.com/se-edu/addressbook-level3/tree/master/src/main/java/seedu/address/model/Model.java) +- When called upon to parse a user command, the `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. +- All `XYZCommandParser` classes (e.g., `AddCommandParser`, `DeleteCommandParser`, ...) inherit from the `Parser` interface so that they can be treated similarly where possible e.g, during testing. - +
+### Model Component -The `Model` component, +**API** : [`Model.java`](https://github.com/AY2324S1-CS2103T-T17-2/tp/blob/master/src/main/java/seedu/address/model/Model.java) -* stores the address book data i.e., all `Person` objects (which are contained in a `UniquePersonList` object). -* stores the currently 'selected' `Person` objects (e.g., results of a search query) as a separate _filtered_ list which is exposed to outsiders as an unmodifiable `ObservableList` 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. -* stores a `UserPref` object that represents the user’s preferences. This is exposed to the outside as a `ReadOnlyUserPref` objects. -* does not depend on any of the other three components (as the `Model` represents data entities of the domain, they should make sense on their own without depending on other components) + -
:information_source: **Note:** An alternative (arguably, a more OOP) model is given below. It has a `Tag` list in the `AddressBook`, which `Person` references. This allows `AddressBook` to only require one `Tag` object per unique tag, instead of each `Person` needing their own `Tag` objects.
- - +The `Model` component, -
+- stores the address book data i.e., all `Company` objects (which are contained in a `UniqueCompanyList` object). +- stores the currently 'selected' `Company` objects (e.g. results of a search query) as a separate _filtered_ list + which is exposed to outsiders as an unmodifiable `ObservableList` 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. +- stores a `UserPref` object that represents the user’s preferences. This is exposed to the outside as a `ReadOnlyUserPref` objects. +- does not depend on any of the other three components (as the `Model` represents data entities of the domain, they should make sense on their own without depending on other components) +
-### Storage component +### Storage Component -**API** : [`Storage.java`](https://github.com/se-edu/addressbook-level3/tree/master/src/main/java/seedu/address/storage/Storage.java) +**API** : [`Storage.java`](https://github.com/AY2324S1-CS2103T-T17-2/tp/blob/master/src/main/java/seedu/address/storage/Storage.java) - + The `Storage` component, -* can save both address book data and user preference data in JSON format, and read them back into corresponding objects. -* inherits from both `AddressBookStorage` and `UserPrefStorage`, which means it can be treated as either one (if only the functionality of only one is needed). -* depends on some classes in the `Model` component (because the `Storage` component's job is to save/retrieve objects that belong to the `Model`) -### Common classes +- can save both address book data and user preference data in JSON format, and read them back into corresponding objects. +- inherits from both `AddressBookStorage` and `UserPrefStorage`, which means it can be treated as either one (if only the functionality of only one is needed). +- depends on some classes in the `Model` component (because the `Storage` component's job is to save/retrieve objects that belong to the `Model`) + +### Common Classes Classes used by multiple components are in the `seedu.addressbook.commons` package. --------------------------------------------------------------------------------------------------------------------- +--- ## **Implementation** This section describes some noteworthy details on how certain features are implemented. -### \[Proposed\] Undo/redo feature +### Company Detail Panel (UI Component) +The `CompanyDetailPanel` allows the user to view the company details of the selected company in the company list. +Recruiter's information, company's information and remarks will be shown in the `CompanyDetailPanel`. -#### Proposed Implementation +#### Implementation -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: +`CompanyDetailCard` and `CompanyDetailPanel`, both inheriting `UiPart`, are used to display the company details. More details of the class implementation can be seen in the class diagram below. -* `VersionedAddressBook#commit()` — Saves the current address book state in its history. -* `VersionedAddressBook#undo()` — Restores the previous address book state from its history. -* `VersionedAddressBook#redo()` — Restores a previously undone address book state from its history. + -These operations are exposed in the `Model` interface as `Model#commitAddressBook()`, `Model#undoAddressBook()` and `Model#redoAddressBook()` respectively. +`CompanyDetailCard` calls the static method `createPriorityFlowPane` from `CompanyCardUtils`, which creates a `FlowPane` to display the priority of the company. +The color of the `FlowPane` is determined by the priority of the company. Red is used to indicate high priority, +orange is used to indicate medium priority and green is used to indicate low priority. -Given below is an example usage scenario and how the undo/redo mechanism behaves at each step. +As for the other information, FXML labels are used to display the information. Within the constructor of `CompanyDetailCard`, +the respective FXML labels are set with the information of the company. -Step 1. The user launches the application for the first time. The `VersionedAddressBook` will be initialized with the initial address book state, and the `currentStatePointer` pointing to that single address book state. +To display the details in 3 different boxes, `CompanyDetailCard.fxml` is divided into 3 sections with each section +being a `VBox`. The 3 `VBox` are then added into a `HBox` to display the details in 3 different boxes. -![UndoRedoState0](images/UndoRedoState0.png) +As for `CompanyDetailPanel`, there is an inner class `CompanyDetailViewCell` which extends `ListCell`. This class +sets the graphics to the `CompanyDetailCard` by constructing a new `CompanyDetailCard` with the company details of the company. -Step 2. The user executes `delete 5` command to delete the 5th person in the address book. The `delete` command calls `Model#commitAddressBook()`, causing the modified state of the address book after the `delete 5` command executes to be saved in the `addressBookStateList`, and the `currentStatePointer` is shifted to the newly inserted address book state. +#### Design Considerations -![UndoRedoState1](images/UndoRedoState1.png) +**Aspect: How details of the company are displayed** -Step 3. The user executes `add n/David …​` to add a new person. The `add` command also calls `Model#commitAddressBook()`, causing another modified address book state to be saved into the `addressBookStateList`. +- **Alternative 1 (Current Choice):** Display the details of the company in a separate panel. -![UndoRedoState2](images/UndoRedoState2.png) + - Pros: The information is well compartmentalized. This improves the user viewing experience. + - Cons: One additional command is needed to view the details of the company. -
:information_source: **Note:** If a command fails its execution, it will not call `Model#commitAddressBook()`, so the address book state will not be saved into the `addressBookStateList`. +- **Alternative 2:** Display all the details of the company in the same panel as the company list. + - Pros: The user does not need to key in additional commands to view the details of the company. + - Cons: The `CompanyListPanel` will be too cluttered with too much information displayed in a company card. -
+
+ +### View Feature +The `CompanyDetailPanel` allows the user to view the company details of the selected company in the company list. +The user can use the `view` command to select the company to view. + +#### Implementation +A new `UniqueCompanyList` is created in `AddressBook` to store the selected company which the user wishes to view. +Additionally, the following operations are implemented in `AddressBook` to support the `view` and other commands: + +- `setCurrentViewedCompany(Company company)` - Sets the selected company to be viewed. +- `clearDetailPanel()` - Clears the `UniqueCompanyList` to remove the selected company from the company detail panel. + +These operations are exposed in the `Model` interface as `Model#setCurrentViewedCompany(Company company)` and +`Model#checkDelete()` respectively. + +The `view` function is implemented in the `ViewCommand` class which calls `Model#setCurrentViewedCopany(Company company)` +to insert the selected company into the `UniqueCompanyList`. +The follow sequence diagram depicts how the `view` command is executed. + + + +
+ **:information_source: Note:** + The lifeline for `ViewCommandParser` should end at the destroy marker (X) but due to a limitation of PlantUML, the lifeline reaches the end of diagram. +
+ +Since only the detail of one company will be displayed anytime, `Model#setCurrentViewedCopany(Company company)` will +clear the `UniqueCompanyList` before inserting the selected company. +Since `UniqueCompanyList` is an observable list, the `CompanyDetailPanel` will be updated automatically +when there is any changes made to the `UniqueCompanyList`. + +When the `edit`, `add`, `view` or `delete` command is executed, the `CompanyDetailPanel` will be updated respectively as +shown in the activity diagram below. + +Company Detail Panel Activity Diagram + +#### Design Considerations + +**Aspect: How the company to be viewed is stored in the `AddressBook`** -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 address book state, and restores the address book to that state. +- **Alternative 1 (Current Choice):** Create a new `UniqueCompanyList` in `AddressBook` to store the selected company which the user wishes to view. -![UndoRedoState3](images/UndoRedoState3.png) + - Pros: Since the `UniqueCompanyList` is an observable list, the `CompanyDetailPanel` will be updated automatically when there is any changes made to the `UniqueCompanyList`. + - Cons: There is a need to clear the list before adding the selected company to the `UniqueCompanyList` to ensure that only one company is displayed in the `CompanyDetailPanel` at any time. -
:information_source: **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. +- **Alternative 2:** Create a new `Company` object in `AddressBook` to store the selected company which the user wishes to view. + - Pros: Since there are no lists involved, there is no need to clear the list. + - Cons: The `CompanyDetailPanel` will not be updated automatically when there are any changes made to the `Company` object. There is a need to create additional methods to update the `CompanyDetailPanel` when changes are made to the `Company` object. +
+ +### Find Feature + +#### Implementation + +The `find` command allows users to search for companies using one or more keywords. Companies matching any of the keywords in their names will be returned. This search is case-insensitive, and partial matches are valid. The critical change in the implementation centers around the modification of the `NameContainsKeywordsPredicate` class. + +**How `NameContainsKeywordsPredicate` Works** + +Previously, `NameContainsKeywordsPredicate` was designed to match a company name against a whole keyword. However, the modified implementation allows it to test a company's name against substrings and return true if the company's name contains the substring. + +When `find` is executed, it uses the `Model` interface's `updateFilteredCompanyList(Predicate predicate)` method, passing in the modified `NameContainsKeywordsPredicate` to filter the list of companies. + +The sequence diagram below illustrates the processing of a `find` command, such as `find tech sta`: + + + +
+**:information_source: Notes:** +* The above sequence diagram simplifies the interaction by focusing on the primary components involved in processing the `find` command. +* The lifeline for `FindCommandParser` should end at the destroy marker (X) but due to a limitation of PlantUML, the lifeline reaches the end of diagram.
-The following sequence diagram shows how the undo operation works: +#### Design Considerations + +**Aspect: Approach to matching keywords** + +- **Alternative 1 (Current Choice):** Match company names that contain the keyword **anywhere** within them. + + - Pros: Flexible search, allows partial keyword matching. + - Cons: Might produce more results than expected. + +- **Alternative 2:** Match company names that **start** with the given keyword. + + - Pros: Precise results. + - Cons: Might omit some relevant results if user does not remember the exact start of the company's name. + +**Aspect: Case-sensitivity** -![UndoSequenceDiagram](images/UndoSequenceDiagram.png) +- **Alternative 1 (Current Choice):** Case-insensitive matching. -
:information_source: **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. + - Pros: User-friendly; users don’t need to remember exact case. + - Cons: Might produce a broader range of results. +- **Alternative 2:** Case-sensitive matching. + + - Pros: More exact matches. + - Cons: Less user-friendly, especially if users do not recall the exact case of company names. + +With the design considerations, we've chosen the alternatives that provide a balance between user-friendliness and precision. + +
+ +### Filter Feature + +The `filter` command allows users to filter the list of companies based on the valid application status. + +#### Implementation + +The `filter` command uses a new predicate, `ApplicationStatusPredicate`, which tests and returns true if a company's application status matches the application status input specified by the user. The `ApplicationStatusPredicate` class implements the `Predicate` interface, which allows it to be used in the `Model#updateFilteredCompanyList(Predicate predicate)` method to filter the list of companies. All companies that match the application status input will be displayed in the updated `CompanyListPanel`. + +The following sequence diagram will illustrate the process of performing the `filter` command, taking `filter s/pa` as an example. + + + +
+ +
+**:information_source: Note:** +The lifeline for `FilterCommandParser` should end at the destroy marker (X) but due to a limitation of PlantUML, the lifeline reaches the end of diagram.
-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 address book to that state. +#### Design Considerations + +**Aspect: UI of the Filter Command** + +* **Alternative 1:** The `CompanyDetailPanel` will still display the details of the company that was last viewed before the `filter` command is executed. + * Pros: Users can still view the details of the last viewed company in the `CompanyDetailPanel` alongside the filtered list of companies. + * Cons: Users may be confused as the last viewed company in the `CompanyDetailPanel` may not be in the filtered list of companies after filtering. + +* **Alternative 2 (Current Choice):** The `CompanyDetailPanel` will be cleared whenever the `filter` command is executed. + * Pros: Users can focus on viewing details of company(s) belonging to the filtered list only, reducing distractions and confusions. + * Cons: Users might have to execute the `view` command again to access details of the last viewed company before filtering even if that company is still in the filtered list, potentially leading to additional steps taken. -
:information_source: **Note:** If the `currentStatePointer` is at index `addressBookStateList.size() - 1`, pointing to the latest address 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. +
+### Edit Feature + +#### Implementation +The edit mechanism is facilitated by `EditCompanyDescriptor`, which is a nested class of `EditCommand` that is similar to the `Company` model, except that the value of parameters can be null. +The `EditCommandParser` parses the user input and stores the values of the parameters to be edited in an `EditCompanyDescriptor` object while unedited parameters are `null`. +Additionally, `EditCommand` implements the `EditCommand#execute(Model model)`operation which edits all the parameters indicated by the user input. +This operation is exposed in the `Model` interface as: + +* `Model#setCompany(Company target, Company editedCompany)` - Updates a company in the list to a new company with edited parameters. +* `Model#setCurrentViewedCompany(Company company)` - Sets the selected company to be viewed in the `CompanyDetailPanel`. + +The following sequence diagram will illustrate the process of performing the `edit` command, taking `edit 1 r/SWE` as an example. + + + +
+ +
+**:information_source: Note:** +The lifeline for `EditCommandParser` should end at the destroy marker (X) but due to a limitation of PlantUML, the lifeline reaches the end of diagram.
-Step 5. The user then decides to execute the command `list`. Commands that do not modify the address book, such as `list`, will usually not call `Model#commitAddressBook()`, `Model#undoAddressBook()` or `Model#redoAddressBook()`. Thus, the `addressBookStateList` remains unchanged. +The `Model#getCompany(Index index)` is a pseudo method to represent getting the original `Company` object, `target`, from `Model`. +When `EditCommand#execute()` is called, an edited `Company` object, `c`, is created by a self-invoked method since `Company` is immutable. +When `Model#setCompany(Company company)` is called, the original `target` in the `AddressBook` is replaced with the edited `c`. + +#### Design Considerations + +**Aspect: How to edit different attributes of a company** + +* **Alternative 1 (Current Choice):** Edits all attributes using one command. + * Pros: Easy to implement. + * Cons: More prone to errors and bugs/ require more test cases for code coverage. + +* **Alternative 2:** Have a command to edit each attribute. + * Pros: Command line is shorter which reduces users' error such as duplicates or invalid command. This improves user experience. + * Cons: We must ensure that the implementation of each individual command are correct. This may also require more memory usage as a `Company` object is initialized for every modified attribute. + +
+ +### Duplicate Detection + + + +#### Implementation +The term _duplicate_ hereafter refers to companies with the same company name, role and deadline. + +The _duplicate_ detection mechanism is facilitated by `Company#isSameCompany(Company otherCompany)`. +This method checks if two `Company` entities are the same by checking if their `Name`, `Role` and +`Deadline` parameters are equal. This method is used by `AddCommand` and `EditCommand` to check if +the company to be added or edited already exists in the company list. + +The above sequence diagram shows the events when a user attempts to **edit** the details of an existing company, +namely the company name, role and deadline parameters to match that of another company in the company list. +The purpose of the diagram is a **simplified** view of the message passing when a _duplicate_ company is detected. + +Therefore, the diagram omits the following: +1. The `if` statements in the `isSameCompany` method checking for strict equality with `this` and company d with`null`. + This is removed to simplify the diagram and not show the inner-workings of the method in detail. +2. The `equals` method propagated after the `getName()`, `getRole()` and `getDeadline()` methods. Again, this would + involve the details of the equality checks of the `Name`, `Role` and `Deadline` classes, overcomplicating the + diagram with three more classes. + +**Description of the diagram** + +Upon ascertaining that the edited company is a duplicate, +1. The `EditCommand` class calls the `getDuplicateCompany(c)` method in the `ModelManager` class. +2. `ModelManager` forwards the call to the `AddressBook` class. +3. The `AddressBook` class calls the `contains(c)` method in the `UniqueCompanyList` class. +4. The `UniqueCompanyList` class calls the `Company::isSameCompany` method for each company in the list + to check if the edited company is a duplicate. +5. `Company::isSameCompany` self-invokes the `getName()`, `getRole()` and `getDeadline()` methods and also + invokes the `getName()`, `getRole()` and `getDeadline()` on the company d to check for equality. +6. The duplicated company is returned to the `EditCommand` class. + +Below is an activity diagram showing the events when a user attempts to **add** a duplicate company to the company list. + +Duplicate Activity Diagram + +The purpose of the diagram is to show the difference in the message passing when a duplicate company is detected +between the `AddCommand` and `EditCommand` classes. Therefore, the diagram omits the propagation of the +getDuplicateCompany(toAdd) method, which has already been shown in the sequence diagram prior. + +#### Design Considerations +**Aspect: Change the location of the duplicate detection** +- **Alternative:** Implement the duplicate detection logic within the `AddCommandParser` or `EditCommandParser` classes. + - Pros: The `execute` method's sole responsibility will be to execute the `add` or `edit` command without + needing to handle duplicate detection logic, adhering to the Single Responsibility Principle. + - Cons: The current architecture design dictates that `Model` be separate from `Logic`. The interaction + between `Model` and `Logic` is through the `execute` method. Implementing the duplicate detection in the + `Parser` classes will require the `Parser` classes to have access to the `Model` class, which violates the + current architecture design. + +**Aspect: Change the definition of a _duplicate_** +- **Alternative:** Define _duplicates_ as equivalence of all parameters other than just `Name`, `Role` and `Deadline`. + - Pros: Allows users to add companies with the same name, role and deadline but different contact details. + - Cons: This approach does not align with real-world scenarios where if the Name, Role, and Deadline parameters + are identical, it likely indicates the same job application. The purpose of the duplicate detection is to prevent + interns from inadvertently applying multiple times to the same position at a company with the same role and + application deadline. + +
+ +### Remark Feature + +The `remark` feature allows user to add and delete remarks from a company. + +#### Implementation + +Unlike other `Command` class, the `RemarkCommand` class has two `COMMAND_WORD` - remark and unremark. +Hence, it is a dependency for two `Parser` - `RemarkCommandParser` and `UnremarkCommandParser`. +The two command words require two different parsers as they have different command format. +Meanwhile, both can create the same type of Command object, `RemarkCommand`, because both command words results in a change in remarks of a company. +The following activity diagram will show how `RemarkCommand` can achieve the functionality of both `COMMAND_WORD`. -![UndoRedoState4](images/UndoRedoState4.png) + -Step 6. The user executes `clear`, which calls `Model#commitAddressBook()`. Since the `currentStatePointer` is not pointing at the end of the `addressBookStateList`, all address 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 remark feature has a similar implementation as the [edit feature](#edit-feature), except that a `Remark` object is initialized instead of `EditCompanyDescriptor`. -![UndoRedoState5](images/UndoRedoState5.png) +#### Design Considerations -The following activity diagram summarizes what happens when a user executes a new command: +**Aspect: Implementation of `COMMAND_WORD` for Remark** +- **Alternative 1 (Current Choice):** Use two `COMMAND_WORD` + - Pros: More specific commands allow for better error handling i.e. empty remark can be considered invalid input, thus more defensive programming + - Cons: More test cases needed to find bugs/More prone to bugs if error handling not implemented correctly. +- **Alternative 2:** Use only one `COMMAND_WORD` - remark + - Pros: Easier to implement. + - Cons: Remarks may be accidentally deleted by an empty input for the parameter. This can affect user experience negatively. - +
-#### Design considerations: +### Add Feature +The `add` command allows users to add companies into LinkMeIn. -**Aspect: How undo & redo executes:** +#### Implementation +The `add` feature is implemented using the `AddCommand` class. The `AddCommand` object takes in a `Company` object. Only if all the inputs for the parameters are valid, all compulsory parameters are present and there is no duplicate company in LinkMeIn, then the `Company` object is created. -* **Alternative 1 (current choice):** Saves the entire address book. - * Pros: Easy to implement. - * Cons: May have performance issues in terms of memory usage. +The `add` feature includes the following operations in `ModelManager`, which implements the `Model` interface: +* `Model#hasCompany(Company company)` — Checks if the company is a _duplicate_ company in LinkMeIn. +* `Model#addCompany(Company company)` — Adds a company into LinkMeIn. +* `Model#setCurrentViewedCompany(Company company)` - Sets the selected company to be viewed in the `CompanyDetailPanel`. -* **Alternative 2:** Individual command knows how to undo/redo by - itself. - * 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. +The following sequence diagram illustrates how the `add` command works and interacts between the `Logic` and `Model` components, taking the input `add c/Google r/Software Engineer s/PA d/10-10-2023 n/Francis Tan p/98765432 e/francist@gmail.com` as an example. -_{more aspects and alternatives to be added}_ +Add Sequence Diagram -### \[Proposed\] Data archiving +
+**:information_source: Note:** +The lifeline for `AddCommandParser` should end at the destroy marker (X) but due to a limitation of PlantUML, the lifeline reaches the end of diagram. +
+ +The following activity diagram shows what happens when the user executes the `add` command. + +Add Activity Diagram + +
-_{Explain here how the data archiving feature will be implemented}_ +#### Design Considerations +**Aspect: Parameters to be Added into Company** +* **Alternative 1:** A `Company` object only requires the company's name, application's role and deadline as parameters for `add` command. + * Pros: Short and concise `add` command for users to type in. Easy for developers to implement with less code. + * Cons: Users may not be able to store necessary information in LinkMeIn, such as recruiter's information. Users may also be unable to keep track of which stage of the application they are at. +* **Alternative 2 (Current Choice):** A `Company` object also includes application status, recruiter's name, phone and email address. The priority parameter is kept optional. + * Pros: Users can add in all the information at once, minimising the need to use other commands to do so afterward, like using `edit` command. + * Cons: Longer `add` command for users. Users may also not have recruiter's information at hand, especially during the initial stage of the application. Hence, users may not be able to add in the company into LinkMeIn. --------------------------------------------------------------------------------------------------------------------- +
-## **Documentation, logging, testing, configuration, dev-ops** +### Sort Feature +The `sort` command allows users to sort the list of companies by their application deadlines in either ascending or +descending order. -* [Documentation guide](Documentation.md) -* [Testing guide](Testing.md) -* [Logging guide](Logging.md) -* [Configuration guide](Configuration.md) -* [DevOps guide](DevOps.md) +#### Implementation +The `Deadline` class implements the `java.lang.Comparable` interface, which provides a natural ordering of deadlines. +The sort feature leverages the fact that the `Deadline` parameter in a `Company` object is comparable and uses +the Java `Comparator` interface to sort companies based on their deadlines. --------------------------------------------------------------------------------------------------------------------- +The sequence diagram below illustrates the execution of the SortCommand, when it is called with a `sortOrder` that can +be either `ASCENDING` or `DESCENDING`. For simplicity, the parsing of the command prior to the execution of the command +has been excluded. -## **Appendix: Requirements** +Sort Sequence Diagram -### Product scope +
-**Target user profile**: +
+**:information_source: Note:** +The corresponding methods `createComparator`, `getUnmodifiableObservableList` and `sortCompanies` in the sequence diagram +are simplifications of the actual code implementations for their respective actions. Also, the `sortOrder` is stored +as an attribute in the `SortCommand` object, when it is created during parsing. It is shown as the way it is in the +diagram for simplicity. +
-* has a need to manage a significant number of contacts -* prefer desktop apps over other types -* can type fast -* prefers typing to mouse interactions -* is reasonably comfortable using CLI apps +--- +
-**Value proposition**: manage contacts faster than a typical mouse/GUI driven app +## **Documentation, Logging, Testing, Configuration, DevOps** +- [Documentation guide](Documentation.md) +- [Testing guide](Testing.md) +- [Logging guide](Logging.md) +- [Configuration guide](Configuration.md) +- [DevOps guide](DevOps.md) -### User stories +--- +
+ +## **Appendix A: Requirements** + +### Product Scope + +**Target User Profile** + +National University of Singapore Computer Science students preparing for an internship who +- prefer desktop apps over other types, +- can type quickly, +- prefer typing to mouse interactions, +- are reasonably comfortable using CLI apps. + +**Value Proposition**
+CS students often struggle to manage a multitude of internship applications and track their application progress. An intuitive CLI address book not only efficiently stores these applications but also offers a valuable tool for monitoring and organizing the entire application process, simplifying the pursuit of career opportunities. + +
+ +### User Stories + +**Priority:** +- `* * *` - High (must have) +- `* *` - Medium (nice to have) +- `*` - Low (unlikely to have) + +| Priority | As a …​ | I want to …​ | So that I can…​ | +|----------|---------------------------------|--------------------------------------------------------------|--------------------------------------------------------------------------------------------| +| `* * *` | user | add a new company to LinkMeIn | manage my internship applications for that company | +| `* * *` | thorough user | view the recruiter's information of a company | follow up on my internship application | +| `* * *` | tidy user | delete a company | ensure my list of companies remains organised by removing those I no longer wish to manage | +| `* * *` | user | list out all my companies | have an overview of my internship applications | +| `* *` | careless user | edit the details of a company | rectify any typographical errors in the company details | +| `* *` | user managing many applications | find companies by their name | locate details of companies without having to go through the entire list | +| `* *` | user managing many applications | sort companies by application deadline | view applications with nearer or further deadlines easily to plan my schedule | +| `* *` | meticulous user | add remarks for a company | keep track of specific notes, thoughts or important details related to that application | +| `* *` | meticulous user | remove remarks for a company | remove irrelevant information and keep my remarks up to date | +| `* *` | seasoned user | clear all data | start afresh on a internship application cycle | +| `* *` | user | exit the app quickly | conclude my session and ensure the application is not running in the background | +| `* *` | confused user | view a list of available CLI commands and their descriptions | learn more about the application's features | +| `* *` | new user | access a list of sample data | test the application out | +| `* *` | seasoned user | filter companies by application status | focus on the most pertinent and relevant applications of interest | +| `* *` | careless user | check for duplicate entries before adding an entry | avoid redundancy and maintain an accurate representation of my internship applications | +| `* ` | creative user | be able to change the theme of LinkMeIn | personalise the visual appearance of the interface based on my preferences | +| `*` | new user | import data from an Excel file | easily switch from excel to LinkMeIn and continue tracking my internship applications | +| `*` | new user | export data to an Excel file | easily switch from LinkMeIn to excel and continue tracking my internship applications | + +
+ +### Use Cases + +
+**:information_source: Note:**
+For all use cases below, the **System** is `LinkMeIn` and the **Actor** is the `user`, unless specified otherwise. +
-Priorities: High (must have) - `* * *`, Medium (nice to have) - `* *`, Low (unlikely to have) - `*` -| Priority | As a …​ | I want to …​ | So that I can…​ | -| -------- | ------------------------------------------ | ------------------------------ | ---------------------------------------------------------------------- | -| `* * *` | new user | see usage instructions | refer to instructions when I forget how to use the App | -| `* * *` | user | add a new person | | -| `* * *` | user | delete a person | remove entries that I no longer need | -| `* * *` | user | find a person by name | locate details of persons without having to go through the entire list | -| `* *` | user | hide private contact details | minimize chance of someone else seeing them by accident | -| `*` | user with many persons in the address book | sort persons by name | locate a person easily | +**Use Case: UC01 - List all Companies** -*{More to be added}* +**MSS**
+1. User requests to list all companies. +2. LinkMeIn displays the full list of companies.
+ Use case ends. -### Use cases +**Extensions**
+* 1a. LinkMeIn detects an invalid command format error in the input. + * 1a1. LinkMeIn displays an error message. + * 1a2. User enters a new command to list all companies.
+ Use case resumes from Step 1. -(For all use cases below, the **System** is the `AddressBook` and the **Actor** is the `user`, unless specified otherwise) -**Use case: Delete a person** +**Use Case: UC02 - Add a Company** -**MSS** +**MSS**
+1. User requests to add a company. +2. LinkMeIn adds the company.
+ Use case ends. -1. User requests to list persons -2. AddressBook shows a list of persons -3. User requests to delete a specific person in the list -4. AddressBook deletes the person +**Extensions**
+* 1a. LinkMeIn detects an invalid command format error in the input → handled similarly to 1a of UC01. +* 1b. LinkMeIn detects an invalid parameter input. + * 1b1. LinkMeIn displays an error message. + * 1b2. User enters new data for the parameter.
+ Use case resumes from Step 1. +* 1c. User requests to add a duplicate company. + * 1c1. LinkMeIn displays an error message. + * 1c2. User enters the information of a new company.
+ Use case resumes from Step 1. - Use case ends. +**Use Case: UC03 - Delete a Company** + +**MSS**
+1. User requests to delete a specific company from the list of companies. +2. LinkMeIn deletes the company.
+ Use case ends. + +**Extensions**
+* 1a. LinkMeIn detects an invalid index input. + * 1a1. LinkMeIn displays an error message. + * 1a2. User enters a new index.
+ Use case resumes from Step 1. + +* 1b. LinkMeIn detects an invalid command format error in the input → handled similarly to 1a of UC01. + + +**Use Case: UC04 - View a Company Detailed Information** + +**MSS**
+1. User requests to view a specific company from the list of companies. +2. LinkMeIn shows the full information of the company in the company detail panel.
+ Use case ends. **Extensions** +* 1a. LinkMeIn detects an invalid index input → handled similarly to 1a of UC03. +* 1b. LinkMeIn detects an invalid command format error in the input → handled similarly to 1a of UC01. + + +**Use Case: UC05 - Clear all Companies** + +**MSS**
+1. User requests to clear all companies from the full list of companies. +2. LinkMeIn clears all companies in the data.
+ Use case ends. + +**Extensions**
+* 1a. LinkMeIn detects an invalid command format error in the input → handled similarly to 1a of UC01. + +**Use Case: UC06 - Edit a Company** + +**MSS**
+1. User requests to edit parameter(s) of a specific company in the list. +2. LinkMeIn edits the company.
+ Use case ends. + +**Extensions**
+* 1a. LinkMeIn detects an invalid index input → handled similarly to 1a of UC03. +* 1b. LinkMeIn detects an invalid command format error in the input → handled similarly to 1a of UC01. +* 1c. User requests to edit to a duplicate company → handled similarly to 1c of UC02. + + +**Use Case: UC07 - Find a Company** + +**MSS**
+1. User requests to find companies based on the keywords. +2. LinkMeIn displays a list of companies with matching keywords.
+ Use case ends. + +**Extensions**
+* 1a. LinkMeIn detects an invalid command format error in the input → handled similarly to 1a of UC01. + + +**Use Case: UC08 - Filter Companies by Application Status** + +**MSS**
+1. User requests to filter the list of companies by one of the application statuses. +2. LinkMein displays a list of companies matching the application status.
+ Use case ends. + +**Extensions**
+* 1a. LinkMeIn detects an invalid command format error in the input → handled similarly to 1a of UC01. +* 1b. LinkMeIn detects an invalid parameter input → handled similarly to 1b of UC02. -* 2a. The list is empty. - Use case ends. +**Use Case: UC09 - Sort Companies by Deadline** -* 3a. The given index is invalid. +**MSS**
+1. User requests to sort the list of companies by deadline. +2. LinkMeIn displays the sorted list of companies.
+ Use case ends. - * 3a1. AddressBook shows an error message. +**Extensions**
+* 1a. LinkMeIn detects an invalid command format error in the input → handled similarly to 1a of UC01. +* 1b. LinkMeIn detects an invalid parameter input → handled similarly to 1b of UC02. - Use case resumes at step 2. -*{More to be added}* +**Use Case: UC10 - Add Remarks for a Company** + +**MSS**
+1. User requests to add remarks for a specific company. +2. LinkMeIn adds the remarks to the company.
+ Use case ends. + +**Extensions**
+* 1a. LinkMeIn detects an invalid index input → handled similarly to 1a of UC03. +* 1b. LinkMeIn detects an invalid parameter input → handled similarly to 1b of UC02. + + +**Use Case: UC11 - Delete Remarks for a Company** + +**MSS**
+1. User requests to delete remarks for a specific company from the list of companies. +2. LinkMeIn deletes the remarks from the company.
+ Use case ends. + +**Extensions**
+* 1a. LinkMeIn detects an invalid index input → handled similarly to 1a of UC03. + + +**Use Case: UC12 - Exit the Program** + +**MSS**
+1. User requests to exit the program. +2. LinkMeIn exits the program.
+ Use case ends. + +**Extensions**
+* 1a. LinkMeIn detects an invalid command format error in the input → handled similarly to 1a of UC01. + + +**Use Case: UC13 - View Help** + +**MSS**
+1. User requests for help to use LinkMeIn. +2. LinkMeIn displays a window with a link to the user guide.
+ Use case ends. + +**Extensions**
+* 1a. LinkMeIn detects an invalid command format error in the input → handled similarly to 1a of UC01. + +
### Non-Functional Requirements -1. Should work on any _mainstream OS_ as long as it has Java `11` or above installed. -2. Should be able to hold up to 1000 persons without a noticeable sluggishness in performance for typical usage. -3. A user with above average typing speed for regular English text (i.e. not code, not system admin commands) should be able to accomplish most of the tasks faster using commands than using the mouse. +1. The system should be available for download on our GitHub release page in the form of a JAR file. +2. The system should work on any mainstream OS as long as it has Java 11 or above installed. +3. The system should be able to hold up to 300 companies without a noticeable sluggishness in performance for typical usage. +4. The system should be a single-user application. +5. The response to any user input should become visible within 2 seconds. +6. A user with above average typing speed for regular English text (i.e. not code, not system admin commands) should be able to accomplish most of the tasks faster using commands than using the mouse. +7. The system should be easily picked up by a novice with no experience with managing internship applications. +8. Data should be stored locally in the device. +9. The application should guide the user if it fails to execute any of the user’s commands for various reasons. +10. The application should be packaged into a single JAR file with size not exceeding 100MB. +11. The code should meet the coding standard of CS2103T for maintainability. -*{More to be added}* +
### Glossary -* **Mainstream OS**: Windows, Linux, Unix, OS-X -* **Private contact detail**: A contact detail that is not meant to be shared with others +| Term | Definition | +|-------------------|-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------| +| **Actor** | Represents an external entity that interacts with the system being modeled. Actors can be individuals, external systems, or organizations. | +| **Alphanumeric** | Refers to a character set that includes both letters and numbers. It includes the 26 letters of the English alphabet (both uppercase and lowercase) and the numbers 0 through 9. | +| **CLI** | Command-Line Interface (CLI) is a text-based user interface where users interact with the application by typing commands. | +| **Command** | A command is an instruction given by a user to LinkMeIn to perform a specific action. For example,`add` command is a command to add the company's application into LinkMeIn. | +| **Component** | A part of the application that serves a particular function (e.g., Logic, Storage). | +| **GUI** | Graphical User Interface (GUI) is a visual method to interact with software using icons, buttons, and windows. GUI provides a user-friendly way to interact with software using graphical elements rather than text-based commands. | +| **Index** | Refers to the index number shown in the displayed company list. | +| **JAR** | JAR stands for Java Archive and is a package file format typically used to aggregate many Java class files and associated metadata and resources into one file for distribution. | +| **JavaFX** | The UI framework that is used in this project. | +| **JSON** | JSON stands for JavaScript Object Notation. It is a lightweight format for data interchange, easy to read and write for humans, and easy to parse for machines. Often used in web applications and configuration files. | +| **Mainstream OS** | Windows, Linux, Unix, OS-X. | +| **PlantUML** | Diagramming tool used to make the diagrams in this guide. | +| **System** | Refers to the LinkMeIn application. | + +
+**:information_source: Note:**
+The definitions for parameters and prefixes have been omitted as they have already been defined in the user guide. +
+ +--- +
+ +## **Appendix B: Planned Enhancements** + +### More Specific Success Message for Company + +**Feature Flaw in Current Implementation** + +Currently, the success message for `view`, `edit`, `remark`, `unremark`, and `add` commands only displays the company name. +However, the duplicate check implemented in LinkMeIn uses 3 criteria, company name, role, and deadline. As such, there +can be more than one entry with the same company name. The user might want to know the role and deadline to +differentiate between applications with the same company name. As such, the current success message displayed can be confusing for the user as to which company specifically has been modified. + +**Proposed Enhancement** + +Instead of displaying only the company name, the success message will display the company name, role and deadline. +This will be the same implementation done for the existing `delete` command. As such, a method was already created in +the `Messages` class called `getCompanyInfo` where the company name, role and deadline from the company object will be +returned as a string. + +The following implementation will be adopted instead: +`return new CommandResult(String.format(MESSAGE_SUCCESS, Messages.getCompanyInfo(toAdd)));` + +**Examples** + +- **view**: `Viewing company: COMPANY_NAME (ROLE, DEADLINE)` +- **edit**: `COMPANY_NAME (ROLE, DEADLINE) company edited` +- **remark**: `Added remark to company: COMPANY_NAME (ROLE, DEADLINE)` +- **unremark**: `Removed remark from company: COMPANY_NAME (ROLE, DEADLINE)` +- **add**: `New company added: COMPANY_NAME (ROLE, DEADLINE)` + +
+ +### Make Recruiter Name, Phone and Email Parameters Optional in Add Command +**Feature Flaw in Current Implementation**
+Currently, the recruiter’s information, namely recruiter’s name, phone number and email address, are compulsory parameters as inputs for `add` command. However, the user may not have the recruiter’s information at the point of applying to the company, which is common in most internship applications now. The user may only have the recruiter’s information at a later point in time. Hence, the user will not be able to add the company into LinkMeIn, without the recruiter's name, phone number and email address. + +**Proposed Enhancement**
+Instead of having the recruiter's name, phone number and email address to be compulsory parameters, they will be changed to optional parameters in the `add` command. This will allow the user to add the company into LinkMeIn without the recruiter's information. + +The updated `add` command format would be as follows: +`add c/COMPANY_NAME r/ROLE s/APPLICATION_STATUS d/DEADLINE [n/RECRUITER_NAME] [p/PHONE] [e/EMAIL] [pr/PRIORITY]`. + +If the user did not add in the recruiter's name, phone number and email address upon adding the company into LinkMeIn, they can still do so with the existing `edit` command afterward. + +**Examples**
+* `add c/Google r/Software Engineer s/pa d/11-11-2023` +* `add c/TikTok r/Data Analyst s/pa d/10-12-2023 n/Ben Tan` + +
+ +### Omit Alphanumeric Checks for Company Name, Recruiter Name and Role Parameters +**Feature Flaw in Current Implementation** + +Currently, recruiter name, company name and role are checked for non-alphanumeric characters (defined as all characters other than alphabets and digits), and as a result, non-complying inputs are blocked. + +**Examples:** +- `X Æ A-12` for recruiter name. +- `H20.ai` for company name. +- `Software Engineer (Backend)` for the role. + +The above inputs are all currently blocked due to the alphanumeric requirement. +The input validation may be overly restrictive, restricting possible company names, recruiter names and roles inputs. + +**Proposed Enhancement** + +Instead of the current regex check located within the `Name`, `Role` and `RecruiterName` classes, the new regex check: +- Allows periods (.) and parentheses ((, )) since these are common in company names and job titles. +- Allows special characters like Æ and hyphens (-). +- Allows any Unicode letter using \p{L}. +- Allows for special characters at the start of the string as well. + +With the proposed change in the regular expression, the validation criteria for company names, recruiter names, and roles will be more inclusive. + +**Examples** + +Here are some examples illustrating what will now be allowed and what will remain disallowed: + +**Allowed Inputs** +1. **Company Names:** + - `H20.ai`: Includes a period and digits. + - `Klüft Skogar`: Includes a special character (ü). + - `Déjà Vu Inc.`: Includes special characters (é, à) and a period. + +2. **Recruiter Names:** + - `X Æ A-12`: Includes a special character (Æ) and a hyphen. + - `Anne-Marie`: Includes a hyphen. + - `O’Connor`: Includes an apostrophe. + +3. **Roles:** + - `Software Engineer (Backend)`: Includes parentheses. + - `C++ Developer`: Includes a plus sign. + - `Sr. Manager - R&D`: Includes a period and a hyphen. + +**Disallowed Inputs** +**Company Names, Recruiter Names, and Roles:** +- `@example.com`: Starts with a disallowed special character (@). +- `Jane#Doe`: Includes a disallowed special character (#). +- `$$$ Enterprises`: Starts with disallowed special characters ($$$). +- `Developer!!!`: Ends with disallowed special characters (!!!). + +The new regex allows for a more diverse range of characters, accommodating special characters, Unicode letters, numbers, spaces, periods, parentheses, and hyphens. +It still restricts inputs that start with or contain certain special characters not typically found in names or titles. + +
+ +### Enhanced Flexibility in Phone Number Parameter Input + +**Feature Flaw in Current Implementation** + +Currently, the phone number parameter only accepts integers as valid user inputs. However, users may encounter scenarios, +such as applying for overseas internships, where they want to include symbols like `()`, `+`, `-` and `.` in the phone +number parameter. The current restriction prevents users from indicating country codes, potentially causing confusion about +the origin of the phone number. + +**Proposed Enhancement** + +The regex checking for a valid phone number will be changed to allow for `()`, `+`, `-` and `.` in the phone number +parameter. In addition, the character `+` will only be allowed at the start while, the other symbols have no positioning restrictions. + +**Examples** + +- +33 (0)6 12 34 56 78: will be accepted. +- +33612345678: will be accepted. +- 06.12.34.56.78: will be accepted. +- 06-12-34-56-78: will be accepted. +- 922492304: will be accepted. +- 24234 + 234243: will **not** be accepted. + +
+ +### Enhance Find Feature to Search with Other Parameters +**Potential Flaw in Current Implementation**
+Currently, LinkMeIn only allows searching through the list of companies by the `COMPANY_NAME` parameter. However, +users might want to search through the list using other parameters, like `RECRUITER_NAME`, `PRIORITY` and `ROLE`. --------------------------------------------------------------------------------------------------------------------- +**Proposed Enhancement**
+We plan to expand the current find command’s capability to allow for search using other parameters. Users will +be able to specify the prefix that corresponds to the parameter they wish to use for the search, before the keyword(s). +The prefixes used will be consistent with the rest of the application, in regard to what parameter they represent. -## **Appendix: Instructions for manual testing** +Here are the new suggested formats : +* Find using `RECRUITER_NAME` : `find n/KEYWORD [KEYWORDS]...` +* Find using `PRIORITY`: `find pr/KEYWORD [KEYWORDS]...` +* Find using `Role`: `find r/KEYWORD [KEYWORDS]...` + +**Examples**
+* `find n/John Doe` +* `find pr/High` +* `find r/Software Engineer` + +
+ +### Enhance Find Feature to Allow for Search of Exact Company Names +**Potential Flaw in Current Implementation**
+If users would like to find a specific company that has two or more words in their name such as `Microsoft +Corporation`, using the current `find` command will return companies that match either `Microsoft` or `Corporation`. +This can potentially pollute the results and defeat the purpose of the find feature. + +**Proposed Enhancement**
+We plan to expand the `find` command's capability, to allow for exact keyword matching. This can be done by specifying +the keyword(s) within quotations. + +Suggested command format for exact find: `find “KEYWORD [KEYWORDS]...”` + +For example, users can now type: `find “Microsoft Corporation”`. This will return companies with names that match +`Microsoft Corporation` exactly, reducing the potential for polluted find results. + +### Improve Error Message for Deadline Parameter +**Potential Flaw in Current Implementation**
+Currently, users are able to input deadline past the current date successfully. We have allowed this in our current implementation because we understand that some users would like to track internship applications even if they have passed, but still belong in that internship cycle. + +However, some users might perceive it as a lack of validation check in LinkMeIn to inform them about an incorrectly entered deadline input. + +**Proposed Enhancement**
+To enhance the deadline parameter input, we will add a check to determine if the input deadline has already passed. If the deadline is before the current date, the user will still be able to add or edit the deadline. However, instead of the success message being `New company added: COMPANY_NAME`, we will improve the success message to be: +``` +New company added: COMPANY_NAME. +Note that you have entered a deadline past the current date. If you made a mistake in your input, please use the `edit` command to update the deadline. +``` +
+ +### Enhance Flexibility in Deadline Parameter Input +**Potential Flaw in Current Implementation**
+Currently, users are constrained to adhere strictly to the DD-MM-YYYY format for inputting deadline parameters. This rigid format might be inconvenient for some users, who prefer different date formats, which are equally common. + +**Proposed Enhancement**
+To enhance user flexibility and accommodate various user preferences, we will allow multiple deadline formats. Instead of accepting only DD-MM-YYYY format, we will also accept DD/MM/YYYY, YYYY/MM/DD and YYYY-MM-DD formats. + +Also, we understand that some users may not wish to type leading zeros for days and months with leading zeros, D/M/YYYY, D-M-YYYY, YYYY-M-D and YYYY/M/D formats will also be accepted. + +**Examples** +* 1/1/2024 is in D/M/YYYY format. +* 2024-1-1 is in YYYY-M-D format. +* 12/12/2023 is in DD/MM/YYYY format. + +
+ +### Allow Multiple Indices Input for Delete Command + +**Feature Flaw in Current Implementation** + +Currently, the user can only delete one company at once. However, there will be cases where the user wishes to delete multiple entries at once, such as deleting all the companies that the user got rejected from. This can be tedious and inconvenient for the user. + +**Proposed Enhancement** + +Enable the user to input multiple indices when attempting to delete entries. Users can separate each index with a comma. If the user wishes to delete a range of indices, they can use a dash, to indicate the range. The format to delete a range of companies is `INDEX_START - INDEX_END`. +The `DeleteCommandParser` will split the string by commas and remove the companies corresponding to the specified indices. There will also be checks to see if the user keyed in the same index more than once. If the same index is keyed in more than once, the parser will accept the input but treat it as if the user only keyed in that same index once. +If the user keys in a range of indices, the parser will check if `INDEX_START` is smaller than or equals to `INDEX_END`. If `INDEX_START` is larger than `INDEX_END`, an error message will be displayed to the user. Besides, if `INDEX_END` is larger than the size of the list of companies, an error message will also be displayed to the user. `INDEX_START` and `INDEX_END` must be positive integers less than or equal to the maximum integer. + +**Examples** + +- `delete 1, 2`: deletes companies at index 1 and 2. +- `delete 1`: deletes company at index 1. +- `delete 4 - 7`: deletes companies at index 4, 5, 6, 7. + +
+ +### Enhance Remark Feature +**Potential Flaw in Current Implementation** + +Currently, users are unable to copy texts from the `CompanyDetailPanel` in our UI. +If users wish to add on to the existing remarks, they need to re-type the existing remarks into the Command Box, followed by their new remarks. +This may not be a practical implementation, especially if the existing remarks are long, negatively affecting the user experience. + +**Proposed Enhancement** + +Edit the error message returned for `remark INDEX re/`. +Currently, when `remark 1 re/` is entered, the error message returned is `Oops! Remark should not be empty. Please try again!`. +This can be enhanced to return the existing remarks in the Message Box where the user can copy the content unlike in the`CompanyDetailPanel` where the user is unable to do so. +Hence, the `remark INDEX re/` command will be modified such that if the user does not enter any remarks after `re/` prefix, the message displayed to the user will include their existing remarks. +Should they wish to add on to their existing remarks, they can easily copy their existing remarks from the Message Box. +The success message for a valid cumulative remark command will be the same as the usual remark command, which is `Added remark to Company: COMPANY_NAME`. + +**Examples** +* Google is the first company in the list and the user wants to add remarks cumulatively. + +When `remark 1 re/` is entered, the Message Box will display the following message. +``` +Remarks in Google: +Require experience in Java, Interview on 12/12/2023 +``` +The user can copy from the Message Box and add on to his remarks. A sample input of an updated remark will then be: + +`remark 1 re/Require experience in Java, Interview on 12/12/2023, Interview went well!` + +--- +
+ +## **Appendix C: Instructions for Manual Testing** Given below are instructions to test the app manually. @@ -334,44 +1068,155 @@ testers are expected to do more *exploratory* testing.
-### Launch and shutdown - +### Launch and Shutdown 1. Initial launch + 1. Download the jar file and copy into an empty folder. + 2. Run `java -jar LinkMeIn.jar` in the folder containing the jar file to launch LinkMeIn.
+ Expected: Shows the GUI with a set of sample companies. The window size may not be optimum. +2. Saving window preferences + 1. Resize the window to an optimum size. Move the window to a different location. Close the window. + 2. Re-launch LinkMeIn.
+ Expected: The most recent window size and location is retained. - 1. Download the jar file and copy into an empty folder +### Adding a Company +1. Test case: `add c/Google r/Software Engineer s/PA d/10-10-2023 n/Francis Tan p/98765432 e/johnd@example.com pr/HIGH`
+ Expected: A new company is added to the end of the list of companies. Details of the added company is displayed in the `CompanyDetailPanel`. +2. Test case: `add c/Google r/Software Engineer s/PA d/10-10-2023 n/Francis Tan`
+ Expected: No company is added. Error details shown in the command message. +3. Try adding the same test case from Step 1. Check that an error message is displayed. - 1. Double-click the jar file Expected: Shows the GUI with a set of sample contacts. The window size may not be optimum. +
-1. Saving window preferences +### Editing a Company +Prerequisite: There is at least one company in the list. - 1. Resize the window to an optimum size. Move the window to a different location. Close the window. +1. Test case: `edit 1 r/Data Analyst`
+ Expected: First company’s role is updated in the list. Details of the edited company is displayed in the `CompanyDetailPanel`. +2. Try editing other companies with different parameters. - 1. Re-launch the app by double-clicking the jar file.
- Expected: The most recent window size and location is retained. +### Deleting a Company +Prerequisite: There is at least one company in the list. + +1. Test case: `delete 1`
+ Expected: First contact is deleted from the list. Details of the deleted company shown in the Message Box. + +2. Test case: `delete 0`
+ Expected: No company is deleted. Error details shown in the Message Box. + +3. Other incorrect delete commands to try: `delete`, `delete x`, `...` (where x is larger than the list size)
+ Expected: Similar to previous. + +### Viewing a Company +Prerequisites: List all companies using the `list` command. Multiple companies in the list. + +1. Test case: `view 1`
+ Expected: First company is shown in the `CompanyDetailPanel`. +2. Test case: `view 0`
+ Expected: No company is shown in the `CompanyDetailPanel`. Error details shown in the Message Box. +3. Other incorrect view commands to try: `view`, `view x`, `...` (where x is larger than the list size)
+ Expected: Similar to previous. + +
+ +### Adding Remarks to a Company +Prerequisite: There is at least one company in the list. + +1. Test case: `remark 1 r/This is a remark`
+ Expected: Remarks are added to the first company in the list. +2. Try adding remarks to a company with an index greater than the number of companies in the current list. Check that an error message is displayed and no remarks are added. + +### Deleting Remarks from a Company +Prerequisite: There is at least one company in the list. + +1. Test case: `unremark 1`
+ Expected: Remarks deleted from the first company in the list. `CompanyDetailPanel` will display "No remarks" under Remarks. + +### Listing Companies +1. Test case: `list`
+ Expected: All companies in the list are displayed in the `CompanyListPanel`. + +### Finding Companies +1. Test case: `find Google`
+ Expected: All companies with the keyword "Google" in their names are displayed in the `CompanyListPanel`. +2. Try finding for a company that does not exist in the list.
+ Expected: No company is displayed in the `CompanyListPanel`. + +
+ +### Sorting Companies by Deadline +1. Test case: `sort`
+ Expected: All companies in the list are displayed in the `CompanyListPanel`, sorted by deadline in ascending order. +2. Test case: `sort d`
+ Expected: All companies in the list are displayed in the `CompanyListPanel`, sorted by deadline in descending order. +3. Try sorting companies by an invalid parameter. Check that an error message is displayed. + +### Filtering Companies by Application Status +1. Test case: `filter s/PA`
+ Expected: All companies with the application status "PA" are displayed in the `CompanyListPanel`. +2. Try again with an invalid application status. Check that an error message is displayed. + +### Clearing All Data +1. Test case: `clear`
+ Expected: All companies are deleted from the list. + +### Exiting LinkMeIn +1. Test case: `exit`
+ Expected: LinkMeIn closes. + +
+ +### Saving Data +1. Dealing with missing data file + 1. Delete the file named `companydata.json` located in the `data` folder. + 2. Relaunch LinkMeIn.
+ Expected: A new `companydata.json` file is created in the `data` folder, with sample companies shown in the GUI. +2. Dealing with corrupted data file + 1. Open the `companydata.json` file located in the `data` folder with a text editor. + 2. Corrupt the file by deleting a few characters. Save the file. + 3. Relaunch LinkMeIn.
+ Expected: No companies will be shown in LinkMeIn. + +
+ +## **Appendix D: Effort** +### Effort +**UI Enhancements** + +With JavaFX, the UI has been revamped by importing different components such as `SplitPane` and `ListView`. +Implementing these components requires us to learn more about JavaFX and experiment on our own. + +**Enhancements to Existing AB3 Features** -1. _{ more test cases …​ }_ +While editing the commands to include new parameters may require less effort, we have put in substantial effort to enhance commands and issues inherited from AB3. +This includes implementing a more optimised `find` command to search with greater flexibility and more extensive checks for more specific error messages which can guide users better. +Duplicate check is one of the most commendable efforts for checks. -### Deleting a person +**New Classes Implemented** -1. Deleting a person while all persons are being shown +Examples of new classes created: - 1. Prerequisites: List all persons using the `list` command. Multiple persons in the list. +`Model` classes - Deadline, Priority, Status, Role etc. - 1. Test case: `delete 1`
- Expected: First contact is deleted from the list. Details of the deleted contact shown in the status message. Timestamp in the status bar is updated. +`Command` classes - Filter, Remark, Sort, View - 1. Test case: `delete 0`
- Expected: No person is deleted. Error details shown in the status message. Status bar remains the same. +Besides ensuring that new classes added follow the architecture, another important aspect is the code quality. +We have added test cases for all new classes and practised defensive programming by adding assertion and logging statements. - 1. Other incorrect delete commands to try: `delete`, `delete x`, `...` (where x is larger than the list size)
- Expected: Similar to previous. -1. _{ more test cases …​ }_ +### Challenges Faced +- **Coding within a team:** +Most of us were used to doing personal projects or pair projects, which are much easier to manage in terms of workflow. +In the short amount of time we had, we had to familiarise ourselves with the GitHub workflow to enhance our collaboration. +Merge conflicts and issues arising from minor mistakes with pull requests required a significant amount of time to resolve. -### Saving data +- **Using JavaFX:** +We were newly introduced to the JavaFX package in this course, which we had little experience with. +Editing the UI aspect is also more complex than coding the frontend and backend systems, as changing the UI relies on visualisation, which requires much trial and error to perfect. This steep learning curve for UI enhancements took us more time and effort to overcome. -1. Dealing with missing/corrupted data files +- **Evolving from AB-3:** +Refactoring AB-3 code was challenging, especially at the start of the project. Significant time was spent understanding how the large codebase works. This proved even more challenging as we only learned software design patterns quite late into the semester. Hence, the code did not make much sense to us when we first started. - 1. _{explain how to simulate a missing/corrupted file, and the expected behavior}_ +When evolving from AB-3 to LinkMeIn, we made a fair amount of enhancements, covering various aspects of the software, including changes in UI, addition of new commands, and error handling. LinkMeIn is a small evolution from AB3. With these considerations, the difficulty level for the LinkMeIn project is moderate. -1. _{ more test cases …​ }_ +### Achievements +We have made significant progress since the start of this module. We have familiarised ourselves with the GitHub workflow and successfully developed a CLI application that follows proper code quality standards, achieving readability and maintainability. We are genuinely proud of what we have achieved! diff --git a/docs/UserGuide.md b/docs/UserGuide.md index 57437026c7b..e4a33f014d6 100644 --- a/docs/UserGuide.md +++ b/docs/UserGuide.md @@ -3,195 +3,1014 @@ layout: page title: User Guide --- -AddressBook Level 3 (AB3) is a **desktop app for managing contacts, optimized for use via a Command Line Interface** (CLI) while still having the benefits of a Graphical User Interface (GUI). If you can type fast, AB3 can get your contact management tasks done faster than traditional GUI apps. +# Welcome to LinkMeIn! -* Table of Contents +_Your One-Stop Internship Application Tracker._ + +It's that time of the year again! You're scrolling through LinkedIn to discover internship opportunities, in hopes of trying to secure one for summer. To increase your chances, you've mass-applied to multiple companies, and now you're struggling to keep track of all your applications + +Well, fret not! LinkMeIn is here to help you! LinkMeIn is a **desktop application** specifically designed for all of you, NUS School Of Computing's Computer Science students, to effectively manage and track your internship applications. + +Here is a **quick** overview of how LinkMeIn transforms your internship application process: + +- Dynamic Data Management: Easily **add**, **edit**, **find** and **filter** companies for targeted application tracking. +- Smart Organization: **Sort** applications by deadline and quickly pinpoint key opportunities. +- Interactive Cards: Easily **view** details of a specific company — a sleeker approach than Excel sheets. + +LinkMeIn is more than just an application — it's your **personalized** partner, offering a seamless experience that outclasses conventional tracking methods. + +Moreover, LinkMeIn combines the **efficiency** of the [Command Line Interface (CLI)](#introducing-linkmeins-cli) with the visual clarity of the [Graphical User Interface (GUI)](#introducing-linkmeins-gui), offering a **best-of-both-worlds** experience. + +

+ +# Table of Contents +* TOC {:toc} --------------------------------------------------------------------------------------------------------------------- +

+ +# Usage of This Guide + +This user guide aims to empower you with the knowledge and skills needed to maximize the potential of LinkMeIn. We are +committed to guide you at every step of your internship journey. Whether you're a new user looking to get started or +an experienced one seeking advanced insights, you'll find valuable information tailored to your unique +needs and expertise. + +Before we begin, let us first introduce you to the annotations that you will encounter throughout this user guide. + +
+**:bulb: Useful Tip:**
+* Provides you with additional insights or more efficient ways to enhance your user experience with LinkMeIn. +
+ +
+**:information_source: Note:**
+* Presents additional details to you that are valuable to know when using LinkMeIn. +
+ +
+**:exclamation: Warning:**
+* Alerts you of potential pitfalls or things to be cautious of when using LinkMeIn. +
+ +

+ +Throughout this guide, you will also notice **various text styles**. Here's what each of them means: +- _Used to show possible scenarios that you can use a feature for (mainly in the feature sections)._ +- [Represents hyperlinks that you can click into, which will direct you to another section of this user guide or to + a website.]() +- `Used to highlight specific elements such as file names, commands, or any text that should be viewed as code.` +- > Used to describe information about the parameters that you can key into a command. + +Now that you are familiar with the annotations and text styles, let us teach you how to navigate this user guide according +to your level of expertise. -## Quick start +## New to LinkMeIn? ## -1. Ensure you have Java `11` or above installed in your Computer. +Thank you for choosing LinkMeIn as your internship tracking ally! We are excited to embark on this journey with you. -1. Download the latest `addressbook.jar` from [here](https://github.com/se-edu/addressbook-level3/releases). +1. To get started, you can refer to the [Quick Start Section](#quick-start) to set up LinkMeIn. +2. After downloading LinkMeIn and setting up your computer, we have prepared a + [Quick Tour](#introducing-linkmein-a-quick-tour) for you. This tour will help you get started with the key features of + LinkMeIn that you will be using quite often. +3. If you choose to explore LinkMeIn on your own, you can refer to the [Features Section](#current-features) to find out + more about LinkMeIn's features. -1. Copy the file to the folder you want to use as the _home folder_ for your AddressBook. +

-1. Open a command terminal, `cd` into the folder you put the jar file in, and use the `java -jar addressbook.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.
- ![Ui](images/Ui.png) +## LinkMeIn Experts? ## +Welcome back! We hope that you have been enjoying your internship tracking journey with LinkMeIn. -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.
- Some example commands you can try: +1. If you need a refresher on how to use a feature, you can refer to the [Features Section](#current-features) to find + out more about LinkMeIn's features. In the Features Section, there are **detailed explanations** of each feature and + **examples** to help you better understand how to use them. +2. To quickly refer to the command format of a feature, you can head over to the [Command Summary Section](#command-summary) + where all the commands are listed out in a table format. - * `list` : Lists all contacts. +If you face any issues while using LinkMeIn, you can refer to the [FAQ Section](#faq) to see if your issue has been addressed before. - * `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. +[↑ Back to Table of Contents](#table-of-contents) - * `delete 3` : Deletes the 3rd contact shown in the current list. +

+ +# Quick Start +In this section, you will learn how to set up LinkMeIn on your computer. + +1. Make sure that you have **Java 11 or above** installed on your Computer. Click + [here](#1-how-do-i-check-if-i-have-java-11-installed) if you are unsure of how to check if you have Java 11 installed. + +2. With Java 11 installed, you can now download our latest jar file from [here](https://github.com/AY2324S1-CS2103T-T17-2/tp/releases/latest). + +3. Click on the `LinkMeIn.jar` file to download it. +
+ Github Release +
+ +4. Move the downloaded jar file into a home folder of your choice, such as the **Desktop** or **Documents** folder. + +5. Open up your command terminal. If you are unsure of how to do so, you can check out [this FAQ](#2-how-do-i-open-up-my-terminal). + +6. Navigate to the folder where you have placed the jar file by typing `cd`, followed by the folder path. + - For example if you have placed the jar file in the **Documents** folder, type `cd ~/Documents` and press `Enter`. + +

+ +7. Type the command `java -jar LinkMeIn.jar` and press `Enter`. Your command terminal should look like this after + Steps 6 and 7: +
+ Launch LinkMeIn +
+ +
+ **:exclamation: Warning:**
+ * Do not move or delete the `data` folder as it contains the data of your internship applications. +
+ +

+ +8. You should have successfully launched LinkMeIn with the following interface appearing on your screen. +
+ Start Up Page LinkMeIn +
+ +9. Great job! You are now ready to learn about the **GUI** of LinkMeIn! + +[↑ Back to Table of Contents](#table-of-contents) + +

+ +# Introducing LinkMeIn's GUI +LinkMeIn's [GUI](#glossary) is designed to be **simple** and **intuitive**, with you in mind. +The GUI consists of four main components: + +![uiIntro.png](images/ui-intro/uiIntro.png) + +| Number | Component | Description | +|--------|----------------------|----------------------------------------------------------| +| 1 | Command Box | Key in your commands here and LinkMeIn will execute them | +| 2 | Message Box | Displays success or error messages to you | +| 3 | Company List Panel | Displays the list of companies that you have added | +| 4 | Company Detail Panel | Displays the details of a company that you are viewing | + +

+ +
+**:bulb: Useful Tip:**
+* To maximise your viewing experience, opt for full-screen mode in LinkMeIn! +
- * `clear` : Deletes all contacts. +Now that you've been introduced to LinkMeIn's GUI, let's proceed to learn how you can use the CLI to interact with LinkMeIn. - * `exit` : Exits the app. +[↑ Back to Table of Contents](#table-of-contents) -1. Refer to the [Features](#features) below for details of each command. +

--------------------------------------------------------------------------------------------------------------------- +# Introducing LinkMeIn's CLI -## Features +LinkMeIn operates through the Command Line Interface (CLI), where you interact with our app by simply **typing commands**. Say goodbye to the days of multitasking between typing and clicking, and say hello to the world of CLI! + +Don't let the name intimidate you! Continue reading on to discover how **E**ffortless, **E**asy and **E**fficient CLI is when using LinkMeIn. + +
+ CliDescription1 +
+ +The Command Box serves as the gateway for entering command lines. Once you press enter, LinkMeIn processes your input and provides responses through the Message Box. This process of interacting with LinkMeIn through text is exactly how CLI works! +Now, let's move on to learn how to write command lines, and you are ready to try LinkMeIn! + +## Command Format +A command line has 4 components, **command word**, **index**, **prefix** and **parameter**. + +| Component | Example | Description | +|--------------|----------|---------------------------------------------------------------------------------------------------------------------------------------------------------------------------| +| Command Word | `add` | Indicates the feature to be executed | +| Index | `1`, `5` | Indicates the position of the company in the list (e.g., 5th company in the list) | +| Parameter | `John` |
Represents the updated value or content.
These values, which are provided by the user, replaces the `UPPER_CASE` placeholders in the command format

| +| Prefix | `c/` | Indicates the type of parameter to be edited (e.g., company's name) | + +You can find all the parameters used in LinkMeIn [here](#parameters-description). +To learn more about the prefixes and command words used in LinkMeIn, you can refer to the [Command Summary Section](#command-summary). + +Now, let's see how you can use these components to easily write a command! +The following color code will assist you in highlighting each component for better understanding. + +
+ CommandFormat1 +
+ +Let's use the [`add` command](#adding-a-company--add) format as shown below to explain the components. +
+ CommandFormat2 +
+ +The `add` command word is used to initiate the adding of a company into LinkMeIn.
+ +The prefix indicates the parameter type. For example, `c/John` adds "John" as the company name while `n/John` adds "John" as the recruiter's name. +Simply replace the parameters with your specific application details, and you have effectively crafted an `add` command! + +But wait! Notice the `[]` around `pr/PRIORITY`? Here's what it means: + +| Symbol | Description | Example | Interpretation | +|---------|------------------|------------------|-------------------------------------------------------| +| None | Compulsory field | `C/COMPANY_NAME` | The company's name is required when adding a company | +| `[ ]` | Optional field | `[pr/PRIORITY]` | Not a must to indicate priority when adding a company | + +Since `PRIORITY` parameter is optional, the following command lines are accepted for the `add` command. + +

+ +**Examples:** +- `add c/GovTech r/Software Engineer s/PA n/John Doe d/12-12-2023 e/johnDoe@gmail.com p/98765432 pr/medium` +- `add c/GovTech r/Software Engineer s/PA n/John Doe d/12-12-2023 e/johnDoe@gmail.com p/98765432`
+**:information_source: Notes:**
+* Parameters can be in any order (e.g., if the command specifies `c/COMPANY_NAME r/ROLE`, `r/ROLE c/COMPANY_NAME` is also acceptable). +* Parameters and prefixes are case-insensitive (e.g., `c/COMPANY_NAME` is the same as `C/company_name`). +
-**:information_source: Notes about the command format:**
+Notice that the `add` command does not use `INDEX` in its command format. Each feature has a unique command format, but every command line must begin with a command word to specify the desired feature. You can find the command format for each feature in the [Features](#current-features) section or take a **quick tour** to get hands-on experience with LinkMeIn, right below! -* 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`. +[↑ Back to Table of Contents](#table-of-contents) -* 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. +# Introducing LinkMeIn: A Quick Tour -* 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 you are new to LinkMeIn, welcome aboard! We know that navigating the world of internship applications can be +daunting, especially when you have multiple opportunities in sight. But fret not, because with LinkMeIn, +you have a reliable companion to guide you through this exciting journey._ -* Extraneous parameters for commands that do not take in parameters (such as `help`, `list`, `exit` and `clear`) will be ignored.
- e.g. if the command specifies `help 123`, it will be interpreted as `help`. +This tour aims to help you get started with LinkMeIn by introducing you to its essential features that you will be +using quite often. In this tour, you will be learning how and when to: -* If you are using a PDF version of this document, be careful when copying and pasting commands that span multiple lines as space characters surrounding line-breaks may be omitted when copied over to the application. +- [add a company](#1-adding-a-company), +- [view its details](#2-viewing-company-details), +- [edit its details](#3-editing-company-details), +- [delete it](#4-deleting-a-company). + +Before we embark on this tour, remember to download LinkMeIn and have your computer set up correctly. If you have not +done so, do check out the [Quick Start Guide](#quick-start) for more information. +Now, follow us along this tour and transform yourself into a master of tracking your internship applications! + +## 1. Adding a Company + +Adding a company is the first step to tracking your internship applications. Let us start off by adding your first company to LinkMeIn. + +**Step 1:** Let's say you are interested to apply for the **Software Engineer** role from **Apple**. Through the application description, you obtained the following information: +* **Deadline:** 10-10-2023 +* **Recruiter Name:** Francis Tan +* **Email:** francistan@example.com +* **Phone Number:** 88287345 + +This application is of **medium** priority as you have other applications that you want to focus on first. + +

+ +**Step 2:** With the details above, simply type `add c/Apple r/Software Engineer s/PA n/Francis Tan d/10-10-2023 e/francistan@example.com p/88287345 pr/medium` into the Command Box and press `Enter`. + +![img.png](images/add-command/BeforeAddCommand.png) + +

+ +**Step 3:** The Company Detail Panel will be updated to show the details of the newly added company's application, and the company will be added to the list of companies. + +![img.png](images/add-command/AfterAddCommand.png) + +
+**:bulb: Useful Tip:**
+* To quickly navigate to the start and end of your command line, you can use 'Ctrl' (Windows User) / 'Command' (Mac User) with the 'Left' and 'Right' arrow keys respectively!
-### Viewing help : `help` +Congratulations! You have successfully added your first company to LinkMeIn. Go ahead and try adding a few more companies on your own! + +If you wish to learn more about the `add` command, you can do so [here](#adding-a-company--add). + +

+ +## 2. Viewing Company Details + +Now that you have added your first few companies into LinkMeIn, you may want to view the details of a specific company. + +**Step 1:** After scrolling through your list of companies, you wish to view the details of the company DSTA. +Simply type `view 3` to view DSTA's details. + +![img.png](images/view-command/BeforeViewCommand.png) + +

+ +**Step 2:** The Company Detail Panel will be updated to show the details of DSTA. -Shows a message explaning how to access the help page. +![img.png](images/view-command/AfterViewCommand.png) -![help message](images/helpMessage.png) +Go ahead and try viewing the details of a few more companies on your own! -Format: `help` +If you wish to read up more on the `view` command, you can do so [here](#viewing-full-companys-information-view). +

-### Adding a person: `add` +## 3. Editing Company Details -Adds a person to the address book. +Suppose you received an email from DSTA inviting you to interview for a Frontend Developer role, which differs from the Software Engineer role you initially applied for. -Format: `add n/NAME p/PHONE_NUMBER e/EMAIL a/ADDRESS [t/TAG]…​` +**Step 1.** To edit the company's information, type `edit 3 s/PI r/Frontend Developer` -
:bulb: **Tip:** -A person can have any number of tags (including 0) +![EditDemo1.png](images/edit-command/EditDemo1.png) + +

+ +**Step 2.** The application status and role of the 3rd company in the list is edited to be Pending Interview and Frontend Developer respectively. + +![EditDemo2.png](images/edit-command/EditDemo2.png) + +Go ahead and try editing the other companies too. If you wish to read up more on the `edit` command, you can do so [here](#editing-a-companys-information-edit). + +

+ +## 4. Deleting a Company + +Suppose you no longer wish to track the DSTA application from earlier, you can easily delete the company from LinkMeIn. + +**Step 1:** To delete DSTA, type `delete 3` in the command box and press enter + +![img.png](images/delete-command/BeforeDeleteCommand.png) + +

+ +**Step 2:** DSTA will be removed from the list of companies. The Company Detail Panel will be cleared too. + +![img.png](images/delete-command/AfterDeleteCommand.png) + +Go ahead and try deleting the other companies too. If you wish to read up more on the delete command, you can do so +[here](#deleting-a-company--delete). + + +**Congratulations!** You have completed the quick tour of LinkMeIn. You are now ready to use LinkMeIn to track your own +internship applications. To remove the sample data provided in LinkMeIn, simply type `clear` in the command box to remove +all existing entries. Find out more about the `clear` command [here](#clearing-all-companies-clear). + +LinkMeIn offers more than just the features that you have learnt in this tour. +If you wish to learn more about the other features of LinkMeIn, head over to our **Features Section** right below! +You can also visit the [FAQ](#faq) to view the frequently asked questions if you need more help! + +[↑ Back to Table of Contents](#table-of-contents) + +--- +

+ +# Current Features + +LinkMeIn's features can be categorised into 3 broad categories: + +- [General Features](#general-features): This section equips you with essential tools to **navigate** LinkMeIn effectively. + Here, you can access help, clear all entries, and gracefully exit LinkMeIn. +- [Company Management Features](#company-management-features): Dive into this section to **engage with individual company entries.** You can easily + add, view, edit, delete companies, as well as add your own remarks to them. +- [Company List Features](#company-list-features): This section allows you to **interact with the list of companies,** thereby unlocking LinkMeIn's full potential. + Explore options to find, list, filter and sort companies, managing all companies with ease. + +
+**:information_source: Notes:**
+* For commands that do not take in any parameters (such as `help`, `list`, `exit` and `clear`), anything typed after the command word will be ignored. For example, if you type `help 123`, `123` will be ignored, and the command will just be interpreted as `help`. +* If you are using a PDF version of this document, be careful when copying and pasting commands that span multiple lines! It could result in an invalid input. +
+ +

+ +## General Features +These general features are here to enhance your user experience when using LinkMeIn. Keep reading to find out more about them! + +### Clearing All Companies: `clear` + +_You've just completed an internship cycle and are preparing for the next one! Want to keep your list of companies clutter-free? Just use the `clear` command to clear all the existing companies in LinkMeIn at once._ + +**Format:** `clear` + +**Example:** + +**Step 1:** Type `clear` in the Command Box and press `Enter`. + +**Step 2:** You should see an empty list of companies immediately. + +![img.png](images/clear-command/clear.png) + +

+ +
+**:exclamation: Warning:**
+* Companies cannot be recovered after clearing! Please only use the `clear` command when you are very sure that you no longer wish to track the existing list of companies! +
+ +[↑ Back to Table of Contents](#table-of-contents) + +### Exiting LinkMeIn: `exit` +_You are done tracking for the day and wish to exit LinkMeIn. Simply use the `exit` command to bid farewell to LinkMeIn._ + +**Format:** `exit` + +
+**:information_source: Note:**
+* Don't worry about losing your data; it's safe with LinkMeIn, thanks to automatic saving!
-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` +[↑ Back to Table of Contents](#table-of-contents) + +

+ +### Accessing Help: `help` -### Listing all persons : `list` +_You find yourself wrecking your brains just to think of that one command that you need to use. Just use the `help` command to access our User Guide, and you can easily get the help you need!_ -Shows a list of all persons in the address book. +**Format:** `help` -Format: `list` +Simply copy the link provided and paste it into your web browser to access LinkMeIn's User Guide! -### Editing a person : `edit` +![img.png](images/help-command/helpcommand.png) -Edits an existing person in the address book. +[↑ Back to Table of Contents](#table-of-contents) -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, …​ -* 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. +## Company Management Features +These features are designed to make managing individual companies in LinkMeIn a breeze for you! Read on further to find out more about them! -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. +### Adding a Company : `add` -### Locating persons by name: `find` +_You scroll through your LinkedIn feed and see a company that you are interested in. +You wish to start on the application later, but you are afraid that you will forget about it. +Add the company to LinkMeIn now to keep track of the application process using the `add` command!_ -Finds persons whose names contain any of the given keywords. +**Format**: +`add c/COMPANY_NAME r/ROLE s/APPLICATION_STATUS d/DEADLINE n/RECRUITER_NAME e/EMAIL p/PHONE_NUMBER [pr/PRIORITY]` -Format: `find KEYWORD [MORE_KEYWORDS]` +> All [**parameters**](#parameters-description) specified in the format are compulsory except for PRIORITY. + +
+**:information_source: Note:**
+* Parameters can be in any order. +
-* 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` -* Persons matching at least one keyword will be returned (i.e. `OR` search). - e.g. `Hans Bo` will return `Hans Gruber`, `Bo Yang` +**Examples:** -Examples: -* `find John` returns `john` and `John Doe` -* `find alex david` returns `Alex Yeoh`, `David Li`
- ![result for 'find alex david'](images/findAlexDavidResult.png) +If you've completed the Quick Tour of LinkMeIn, you've likely added a few companies to your app. If not, you can refer to the [Quick Tour Section](#1-adding-a-company) for guidance on adding companies. -### Deleting a person : `delete` +Here are some other examples of `add` commands that you can try: +- `add c/Uber r/Software Engineer s/PA n/Mavis d/02-03-2023 e/mavis@example.com p/88284452 pr/low` +- `add c/Oracle r/Data Analyst s/PA n/Marry Lim d/12-11-2023 e/marrylim@example.com p/98452321` -Deletes the specified person from the address book. +

-Format: `delete INDEX` +**Possible Error:**
-* Deletes 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, …​ +If you made a mistake for any of the parameters input, you will see an error message in the Message Box informing you of the specific error message. Don't worry, just update your input accordingly and try again! An example of the error message is shown below. -Examples: -* `list` followed by `delete 2` deletes the 2nd person in the address book. -* `find Betsy` followed by `delete 1` deletes the 1st person in the results of the `find` command. +![img.png](images/add-command/AddCommandError2.png) -### Clearing all entries : `clear` +[↑ Back to Table of Contents](#table-of-contents) -Clears all entries from the address book. +### Viewing Full Company's Information: `view` -Format: `clear` +_You look at the list of companies, and you realise that it's been 3 weeks since the interview, yet the company has not gotten back to you. +With the `view` command, you can easily view the full details of a specific company, including the recruiter's contact details, and follow up with them!_ + +**Format:** `view INDEX` + +> `INDEX` must be a positive integer less than or equal to the maximum integer (i.e., 1, 2, 3, ..., 2147483647). It must also not be greater than the number of companies in the list. + +
+**:information_source: Note:**
+* You can only view the full details of one company at any time. +
-### Exiting the program : `exit` +**Examples:** -Exits the program. +If you've completed the Quick Tour of LinkMeIn, you've likely viewed a few companies. If not, you can refer to the [Quick Tour Section](#2-viewing-company-details) for guidance on viewing companies! -Format: `exit` +Here are some other examples of `view` commands that you can try: +- `view 1` +- `view 4` -### 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. +**Possible Error:** -### Editing the data file +If you have entered an [**invalid index**](#5-what-is-an-invalid-index), you will see an error message in the Message Box as shown below. Don’t worry, just edit your index accordingly and try the command again! -AddressBook data are saved automatically as a JSON file `[JAR file location]/data/addressbook.json`. Advanced users are welcome to update data directly by editing that data file. +![img.png](images/view-command/ViewCommandError.png) -
: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. Hence, it is recommended to take a backup of the file before editing it. +[↑ Back to Table of Contents](#table-of-contents) + +### Deleting a Company : `delete` + +_Whether you accidentally added a company or no longer want to track it, don't worry! LinkMeIn has got you covered! +You can use the `delete` command to delete any company from your list of companies._ + +**Format:`delete INDEX`** + +> `INDEX` must be a positive integer less than or equal to the maximum integer (i.e., 1, 2, 3, ..., 2147483647). It must also not be greater than the number of companies in the list. + +
+**:information_source: Note:**
+* You can only delete one company at a time.
-### Archiving data files `[coming in v2.0]` +**Examples:** + +If you've completed the Quick Tour of LinkMeIn, you've likely deleted a few companies. If not, you can refer to the [Quick Tour Section](#4-deleting-a-company) for guidance on deleting companies. + +Here are some other examples of `delete` commands that you can try: +- `delete 1` +- `delete 2` + +

+ +**Possible Error:** + +If you have entered an [**invalid index**](#5-what-is-an-invalid-index), +you will see an error message in the Message Box as shown below. Don’t worry, just edit your index accordingly and try the command again! + +![img.png](images/delete-command/DeleteCommandError.png) + +[↑ Back to Table of Contents](#table-of-contents) + +

+ +### Adding Remarks to a Company: `remark` + +_After adding a company, you wish to note down more information such as the job description, pre-requisites and mental notes for yourself! Just use the `remark` command to input these additional details!_ + +**Format:** `remark INDEX re/REMARK` + +> `INDEX` must be a positive integer less than or equal to the maximum integer (i.e., 1, 2, 3, ..., 2147483647). It must also not be greater than the number of companies in the list.
+> +> Remarks cannot be empty. + +
+**:exclamation: Warning:**
+* When adding remarks, the existing remarks of the company is not cumulative. This means that whenever you type new remarks, your existing remarks will be completely overwritten! +
+ +**Examples:** + +**Step 1.** After adding the internship for DSTA into LinkMeIn, +you want to note that this internship requires experience in Java. + +

+ +**Step 2.** To note this down, type `remark 3 re/need Java` and press `Enter`. + +![RemarkDemo1.png](images/remark-command/RemarkDemo1.png) + +

+ +**Step 3.** You can view the remarks of the 3rd company as shown below in the Company Detail Panel. + +![RemarkDemo2.png](images/remark-command/RemarkDemo2.png) + +Here are some other examples of `remark` commands that you can try: +- `remark 4 re/interview went well!` +- `remark 5 re/$800 per month` + +

-_Details coming soon ..._ +**Possible Error:** --------------------------------------------------------------------------------------------------------------------- +If you have entered an **empty remark**, +you will see an error message in the Message Box as shown below. Don’t worry, just try again with remarks now! + +![RemarkErrMsg.png](images/remark-command/RemarkErrMsg.png) + +
+**:bulb: Useful Tip:**
+* However, if you intend to delete the existing remarks of a company and hence entered an empty remark, you should use the `unremark` command instead. +
+ +[↑ Back to Table of Contents](#table-of-contents) + +

+ +### Deleting Remarks of a Company: `unremark` + +_You have previously added some remarks to a company, but the remarks have become outdated and you no longer need them anymore. Use the `unremark` command to quickly delete them._ + +**Format:** `unremark INDEX` + +> `INDEX` must be a positive integer less than or equal to the maximum integer (i.e., 1, 2, 3, ..., 2147483647). It must also not be greater than the number of companies in the list. + +
+**:bulb: Useful Tip:**
+* To add new remarks, you do **NOT** need to delete the existing remarks using `unremark` command first. Directly use the `remark` command to add your new remarks. +
+ +
+**:information_source: Note:**
+* You can unremark a company that already has no remarks. +LinkMeIn does not check for the existence of remarks. +The same success message will be displayed regardless of whether remarks exist for a company. +
+ +

+ +**Example:** + +**Step 1.** If you wish to delete the remarks of DSTA company, which is 3rd in the Company List Panel, type `unremark 3` and press `Enter`. + +![UnremarkDemo1.png](images/remark-command/UnremarkDemo1.png) + +

+ +**Step 2.** The remarks of DSTA will be removed as shown below. + +![UnremarkDemo2.png](images/remark-command/UnremarkDemo2.png) + +**Possible Error:** + +If you have entered an [**invalid index**](#5-what-is-an-invalid-index), +you will see an error message in the Message Box as shown below. Don’t worry, just edit your index accordingly and try the command again! + +![UnremarkErrMsg.png](images/remark-command/UnremarkErrMsg.png) + +[↑ Back to Table of Contents](#table-of-contents) + +

+ +### Editing a Company's Information: `edit` + +_You look at the details of the application, and realise that you have made a typo or need to update the progress of application. Use the `edit` command to input the accurate details._ + +**Format:** `edit INDEX [c/COMPANY_NAME] [n/RECRUITER_NAME] [r/ROLE] [s/APPLICATION_STATUS] [d/DEADLINE] [e/EMAIL] [p/PHONE_NUMBER] [pr/PRIORITY]` + +> `INDEX` must be a positive integer less than or equal to the maximum integer (i.e., 1, 2, 3, ..., 2147483647). It must also not be greater than the number of companies in the list. +> +> At least one of the optional parameters must be provided. + +**Examples:** + +If you've completed the Quick Tour of LinkMeIn, you've likely edited a few companies. If not, you can refer to the [Quick Tour Section](#3-editing-company-details) for guidance on editing companies. + +Here are some more examples of `edit` commands that you can try: + +- `edit 3 d/11-09-2025 pr/LOW`
+ Edits the deadline and priority of the 3rd company in the displayed list. + +- `edit 1 n/Amy Tan e/amytan@gmail.com`
+ Edits the recruiter's name and email of the 1st company in the displayed list. + +**Possible Error:** + +If you have entered an **invalid prefix**, you will see an error message in the Message Box. Don’t worry, just edit your prefixes accordingly and +try the command again! An example of an invalid input and error message is shown below. +![EditErrMsg.png](images/edit-command/EditErrMsg.png) + +[↑ Back to Table of Contents](#table-of-contents) + +

+ +### Duplicate Detection + +_Seeking an internship but worried about double-applying? +Our duplicate detection swiftly ensures you never submit the same application twice!_ + +If you attempt to **add** or **edit** an application, you might accidentally create a duplicate entry with the same **company name**, **role**, and **deadline** as an existing company in LinkMeIn. An error message will be displayed in the Message Box, informing you of the **company name**, **role** and **deadline** of that duplicate company. + +
+**:information_source: Note:**
+* LinkMeIn's duplicate check is case-insensitive (e.g., `tiktok` is the same as `TikTok`). +
+ +**Example 1:** +Suppose you attempt to add a company with the **exact same company and recruiter information** as an existing entry in LinkMeIn, you will be notified of the duplicate company, as seen below. + +![img.png](images/duplicate-detection/add-command/duplicate-exact-match.png) + +

+ +**Example 2:** +If you attempt to add a company with the **same company name, role and deadline**, but different recruiter information, you will be see an error message similar to that in Example 1. However, in this case, LinkMeIn will also prompt you to edit the parameter that differs from the duplicate company, recognizing that you may have accidentally used the `add` command instead of the `edit` command. + +![img.png](images/duplicate-detection/add-command/duplicate-partial-match.png) + +

+ +**Example 3:** +LinkMeIn's duplicate check does not stop with adding entries. If you attempt to **edit** an application, creating a +duplicate entry with the **same company name, role, and deadline** as an existing application in LinkMeIn, +an error message will be displayed in the Message Box, notifying you of the duplicate company as seen below. + +![img.png](images/duplicate-detection/edit-command/duplicate-edit.png) + +[↑ Back to Table of Contents](#table-of-contents) + +

+ +## Company List Features +These features are crafted to simplify the management of your list of companies in LinkMeIn! Continue reading to discover more about how they work! + +### Finding a Company: `find` + +_You've applied to many companies, and now you wish to monitor your internship applications for a specific company. Use the find command for a swift and efficient way to locate the company you want!_ + +**Format:** `find KEYWORD [MORE_KEYWORDS]...` +> KEYWORD must be at least 1 character long. Multiple keywords can be provided. + +
+**:information_source: Notes:**
+* The `find` command searches only the company name. +* Companies with names that contain **any** of the keywords will be returned. +* Keyword is case-insensitive (e.g. `tiktok` will match `TikTok`). +* The order of your keywords doesn't matter (e.g. `tiktok google` will match `google tiktok`). +* LinkMeIn's `find` command will always find from the **full** list of companies. This means that if you have previously used `filter`, performing `find`, will not search from the filtered list of companies. +
+ +
+**:bulb: Useful Tip:**
+* You don't have to type the full name of the company. Partial names work too! For example, `tik` will match +`tiktok`. Use this to find companies quickly! +
+ +

+ +**Example:** + +**Step 1:** Let's say you want to follow up on a DSTA application. Simply type `find ds` to search for DSTA. + +![img.png](images/find-command/BeforeFind.png) + +

+ +**Step 2:** You will see the list of companies that match your search criteria. In this case, the company DSTA will be +shown. And that is it! You have found the company you wanted. + +![img.png](images/find-command/AfterFind.png) + +[↑ Back to Table of Contents](#table-of-contents) + +

+ +### Listing All Companies: `list` + +_You've found the specific company you wanted using the find command earlier, and now you want to see all of your applications in one list again. You can do so easily with the `list` command!_ + +**Format:** `list` + +**Example:** + +**Step 1:** You have used the `find` command to find the company _DSTA_ earlier. Now, to view the full list of companies again, simply type `list` and press `Enter`! + +![img.png](images/list-command/ListCommand.png) + +
+**:information_source: Note:**
+* Upon launching LinkMeIn, you will see your full list of companies (i.e., `list` command is executed automatically). +
+ +[↑ Back to Table of Contents](#table-of-contents) + +

+ +### Filtering Companies by Application Status: `filter` + +_Can't remember which applications you haven't submitted or want to prepare for the companies that have offered you an interview? +Filter the list of companies by their application status using the `filter` command!_ + +**Format:** `filter s/APPLICATION_STATUS` + +> [**APPLICATION_STATUS**](#application-status-parameter-description) should be one of the following: `PA`, `PI`, `PO`, `A`, `R`. + +
+**:information_source: Note:**
+* LinkMeIn's `filter` command will always filter from the **full** list of companies. This means that if you have previously used `find`, performing `filter`, will not filter from the list of companies that you have searched for. +
+ +

+ +**Example:** + +**Step 1:** You wish to prepare for the upcoming interviews that you have secured. + +**Step 2:** Simply type `filter s/PI` to filter the list of companies to show only companies with status "Pending Interview" and press `Enter`. + +![img.png](images/filter-command/FilterByPI.png) + +

+ +**Step 3:** You can then check the Company List Panel for all the companies where you have pending interviews. + +![img.png](images/filter-command/AfterFilterCommand.png) + +**Possible Error:** + +If you enter an invalid prefix for the filter command, you will see an error message informing you of the invalid command, and suggest the correct format to follow. + +![img.png](images/filter-command/FilterCommandError.png) + +[↑ Back to Table of Contents](#table-of-contents) + +

+ +### Sorting Companies by Deadlines: `sort` + +_Want to see which application deadlines are coming up soon or which ones are far off? Use the `sort` command to +arrange your list of applications based on their deadlines!_ + +**Format:** `sort SORT_ORDER` +> SORT_ORDER should be one of the following: `ascending`, `a`, `asc` for ascending order, and `descending`, `d`, `desc` for descending order. + +
+**:information_source: Notes:**
+* Ascending order means that the nearest deadlines will be shown first. +* Descending order means that the furthest deadlines will be shown first. +* The case of `SORT_ORDER` does not matter (e.g., `ASCENDING` and `ascending` are treated the same). +
+ +
+**:bulb: Useful Tip:**
+* If no `SORT_ORDER` is specified, it will be set to `ascending` by default. Use this to quickly see which deadlines are +coming up soon by simply typing `sort`! +
+ +

+ +**Example:** + +**Step 1.** You've lost track of time and are uncertain about which internship deadlines are looming. Your current +list looks chaotic. Just type `sort ascending` to sort the list of applications by their deadlines. + +![typecommand.png](images/sort-command/BeforeSorting.png) + +

+ +**Step 2.** Your applications are now organized by upcoming deadlines. Time to start applying without delay! + +![img.png](images/sort-command/AfterSorting.png) + +**Possible Error:** + +Suppose you misspelled the `SORT-ORDER` keyword, you will see an error message informing you of the invalid keyword, +and suggest the correct keyword to use: + +![img.png](images/sort-command/SortError.png) + +[↑ Back to Table of Contents](#table-of-contents) + +--- +

+ +## Glossary + +### Definitions of Key Terms + +Encountered an unfamiliar term when using LinkMeIn? Read the respective descriptions to better understand the term! + +| Term | Definition | +|----------------------|-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------| +| **Alphanumeric** | Alphanumeric refers to a character set that includes both letters and numbers. It includes the 26 letters of the English alphabet (both uppercase and lowercase) and the numbers 0 through 9. | +| **Case-insensitive** | Upper case and lower case are being treated the same way. For example, `tiktok` and `TikTok` will be considered the same. | +| **CLI** | Command-Line Interface (CLI) is a text-based user interface where users interact with the application by typing commands. | +| **Command** | A command is an instruction given by a user to LinkMeIn to perform a specific action. For example,`add` command is a command to add the company's application into LinkMeIn. | +| **GUI** | Graphical User Interface (GUI) is a visual method to interact with software using icons, buttons, and windows. GUI provides a user-friendly way to interact with software using graphical elements rather than text-based commands. | +| **Index** | Refers to the index number shown in the displayed company list. | +| **JAR** | JAR stands for Java Archive and is a package file format typically used to aggregate many Java class files and associated metadata and resources into one file for distribution. | +| **JSON** | JSON stands for JavaScript Object Notation. It is lightweight format for data interchange, easy to read and write for humans, and easy to parse for machines. Often used in web applications and configuration files. | +| **Parameter** | Parameter is similar to a field in a form you have to fill up. For example, in the command `edit 1 c/COMPANY_NAME e/EMAIL`, `COMPANY_NAME` and `EMAIL` are parameters in the command. | +| **Prefix** | Prefix is a keyword that is used to identify the parameter. For example, in the command `edit 1 c/COMPANY_NAME e/EMAIL`, `c/` and `e/` are prefixes. | + +

+ +### Parameters Description + +| Parameter | Description | Constraints | +|--------------------|-----------------------------------------------|---------------------------------------------------------------------------------------------------------------------------------| +| COMPANY_NAME | Name of the company that you are applying to. | Only contain alphanumeric characters and spaces, and should not be blank. Maximum of 100 characters (excluding spaces). | +| ROLE | Role of the internship that you are applying. | Only contain alphanumeric characters and spaces, and should not be blank. Maximum of 100 characters (excluding spaces). | +| APPLICATION_STATUS | Status of the application. | Case-insensitive. Refer to [Application Status Description](#application-status-parameter-description) for all possible inputs. | +| DEADLINE | Deadline of the application. | Should be in DD-MM-YYYY format. Dates before the current date are allowed. | +| RECRUITER_NAME | Name of the recruiter. | Only contain alphanumeric characters and spaces, and should not be blank. Maximum of 100 characters (excluding spaces). | +| EMAIL | Email of the recruiter. | Should be in the format of [`local-part@domain`](#email-format-description) and should not be blank. | +| PHONE_NUMBER | Phone number of the recruiter. | Only contain numbers, be at least 3 digits and at most 20 digits long. Should not be blank. | +| PRIORITY | Priority of the application. |
Case-insensitive and should be one of the following: `high`, `medium`, `low`, `none`.

| +| REMARK | Remark of the application. | Should not be blank. | + + +
+**:information_source: Note:**
+* If you enter an invalid input for any of the prefixes, you will see an error message in the command box. Refer to the error message, check the description for the respective prefix and try the command again! An example of an error message is shown below. + +![img.png](images/add-command/AddCommandError.png) +
+ +

+ +#### Application Status Parameter Description + +| Application Status | Other Accepted Inputs | What it means | +|-----------------------|-------------------------------------------------------------------------|-------------------------------------------------------------------------------------------------------------------------------------| +| `PENDING APPLICATION` | `PA`, `PENDAPP`, `PENDINGAPP`, `PENDINGAPPLICATION`, `P A`, `PENDING A` | You have not submitted the application, but are currently working on it. | +| `PENDING INTERVIEW` | `PI`, `PENDINT`, `PENDINGINT`, `PENDINGINTERVIEW`, `P I`, `PENDING I` | You have submitted the application, and are either waiting for an interview offer, or waiting to go for the interview. | +| `PENDING OUTCOME` | `PO`, `PENDOUT`, `PENDINGOUT`, `PENDINGOUTCOME`, `P O`, `PENDING O` | You have went through the interview, but the final decision or outcome (whether accepted or rejected) hasn't been communicated yet. | +| `ACCEPTED` | `A`, `ACC`, `ACPT`, `ACCEPT` | You have been offered the internship position. Congratulations! | +| `REJECTED` | `R`, `REJ`, `REJECT` | Unfortunately, the application wasn't successful and you were not offered the internship. Don't worry, try again next time! | + +

+ +#### Email Format Description +The email format is `local-part@domain`. + +`local-part` constraints: +* Only contain alphanumeric characters and these special characters, excluding the parentheses, (+_.-). +* May not start or end with any special characters. + +`domain` name constraints: +* Made up of domain labels separated by periods. +* 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. + +[↑ Back to Table of Contents](#table-of-contents) + +--- +

## 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. +### 1. How do I check if I have Java 11 installed? + +* Open up your terminal. If you are unsure of how to do so, you can refer [here](#2-how-do-i-open-up-my-terminal). +* Type `java -version`. If you have Java installed, you will see the following: + +![img.png](images/quick-start/java11.png) + +* If you do not have Java installed, you can download it [here](https://www.oracle.com/sg/java/technologies/downloads/#java11). + Remember to download the Java 11 version. +* You can refer to the guides below to install Java 11 for your respective operating systems: + * [Windows Guide](https://www.java.com/en/download/help/windows_manual_download.html) to install Java. + * [macOS Guide](https://www.java.com/en/download/help/mac_install.html) to install Java. + * [Linux Guide](https://www.java.com/en/download/help/linux_x64_install.html) to install Java. + +[↑ Back to Quick Start](#quick-start) + +

+ +### 2. How do I open up my terminal? +* **Windows:** Click the Windows Start button, and type **'Command Prompt'** or **'cmd'** into the search bar. + Press Enter to open it. +* **macOS:** Click on **'F4'** and type **'terminal'**. Press Enter when it appears in the + search results. +* **Linux:** Press **'Ctrl'**, **'Alt'** and **'T'** simultaneously to open the terminal. + +[↑ Back to Quick Start](#quick-start) --------------------------------------------------------------------------------------------------------------------- +### 3. How do I load data from another computer? -## Known issues +Delete the `companydata.json` file stored at `[JAR file location]/data/companydata.json` from the computer that you +wish to use LinkMeIn on (refer to image below). -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. +![img.png](images/CompanyDataLocation.png) --------------------------------------------------------------------------------------------------------------------- +Then, copy over the `companydata.json` file from the other computer. And that's it! Just start LinkMeIn to +check whether your data is properly loaded into the new computer and you're good to go! -## Command summary +### 4. Why am I unable to run LinkMeIn? -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` +Make sure you have Java 11 installed on your machine as the product only runs on Java 11. + +

+ +### 5. What is an invalid index? + +An invalid index is a non-positive integer or an index greater than the number of companies you have. +Examples: -1, 0, a, \*, 1 0 (Only one index is allowed at a time). Positive index should not exceed the maximum allowed +range of 2147483647. + +### 6. Do I need an internet connection to use LinkMeIn? + +LinkMeIn is an offline application that functions well without an internet connection. However, an Internet connection is required to download the application. + +### 7. How do I save my data on LinkMeIn? + +With LinkMeIn, there is no need for you to save manually. Everything is saved automatically for you. + +[↑ Back to Table of Contents](#table-of-contents) + +--- +

+ +## Command Summary + +| Command | Format | Example | +|----------|----------------------------------------------------------------------------------------------------------------------------------------------------|-----------------------------------------------------------------------------------------------| +| `add` | `add c/COMPANY_NAME r/ROLE s/APPLICATION_STATUS d/DEADLINE n/RECRUITER_NAME e/EMAIL p/PHONE_NUMBER [pr/PRIORITY]` | `add c/Apple r/Software Engineer s/PA d/12-12-2023 n/John Tan e/johntan@gmail.com p/98765432` | +| `view` | `view INDEX` | `view 1` | +| `delete` | `delete INDEX` | `delete 1` | +| `remark` | `remark INDEX re/REMARK` | `remark 1 re/need Java` | +| `list` | `list` | `list` | +| `filter` | `filter s/APPLICATION_STATUS` | `filter s/PI` | +| `sort` | `sort SORT_ORDER` | `sort ascending` | +| `edit` | `edit INDEX [c/COMPANY_NAME] [n/RECRUITER_NAME] [r/ROLE] [s/APPLICATION_STATUS] [d/DEADLINE] [e/EMAIL] [p/PHONE_NUMBER] [pr/PRIORITY] [re/REMARK]` | `edit 1 s/PI r/Frontend Developer` | +| `find` | `find KEYWORD [MORE_KEYWORDS]...` | `find ds` | +| `clear` | `clear` | `clear` | +| `exit` | `exit` | `exit`

| +| `help` | `help` | `help` | + +[↑ Back to Table of Contents](#table-of-contents) diff --git a/docs/_config.yml b/docs/_config.yml index 6bd245d8f4e..482a6da2e3c 100644 --- a/docs/_config.yml +++ b/docs/_config.yml @@ -1,4 +1,4 @@ -title: "AB-3" +title: "LinkMeIn" theme: minima header_pages: @@ -8,7 +8,7 @@ header_pages: markdown: kramdown -repository: "se-edu/addressbook-level3" +repository: "AY2324S1-CS2103T-T17-2/tp" github_icon: "images/github-icon.png" plugins: diff --git a/docs/_sass/minima/_base.scss b/docs/_sass/minima/_base.scss index 0d3f6e80ced..cee47b86288 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: "LinkMeIn"; font-size: 32px; } } diff --git a/docs/assets/css/style.scss b/docs/assets/css/style.scss index b5ec6976efa..c7facf4a5e0 100644 --- a/docs/assets/css/style.scss +++ b/docs/assets/css/style.scss @@ -3,10 +3,13 @@ --- @import - "minima/skins/{{ site.minima.skin | default: 'classic' }}", - "minima/initialize"; +"minima/skins/{{ site.minima.skin | default: 'classic' }}", +"minima/initialize"; -.icon { - height: 21px; - width: 21px +blockquote { + font-size: 1rem; /* This sets the font size to the base font size, which should match your normal text if that's also set to 1rem */ + margin-left: 20px; /* Adjust as needed to match your layout */ + padding-left: 20px; /* Adjust as needed for padding inside the blockquote */ + border-left: 4px solid #d3d3d3; /* A typical blockquote border, adjust the color as needed */ + /* Other styles as needed to match your typography */ } diff --git a/docs/diagrams/AddActivityDiagram.puml b/docs/diagrams/AddActivityDiagram.puml new file mode 100644 index 00000000000..8c2ce80dfaa --- /dev/null +++ b/docs/diagrams/AddActivityDiagram.puml @@ -0,0 +1,25 @@ +@startuml +skin rose +skinparam ActivityFontSize 12 +skinparam ArrowFontSize 12 +start +:User executes AddCommand; + +'Since the beta syntax does not support placing the condition outside the +'diamond we place it as the true branch instead. + +if () then ([user input is valid]) + if () then ([company already exists]) + :System displays duplicate company error message; + else ([else]) + :System inserts company to list of companies; + :System displays added company in CompanyListPanel; + :System displays added company in CompanyDetailPanel; + endif + +else ([else]) +:System displays specific error message; + +endif +stop +@enduml diff --git a/docs/diagrams/AddSequenceDiagram.puml b/docs/diagrams/AddSequenceDiagram.puml new file mode 100644 index 00000000000..24a96a430af --- /dev/null +++ b/docs/diagrams/AddSequenceDiagram.puml @@ -0,0 +1,101 @@ +@startuml +!include style.puml +skinparam ArrowFontStyle plain + +box Logic LOGIC_COLOR_T1 + +participant ":LogicManager" as LogicManager LOGIC_COLOR +participant ":AddressBookParser" as AddressBookParser LOGIC_COLOR +participant ":AddCommandParser" as AddCommandParser LOGIC_COLOR +participant "c:Company" as Company MODEL_COLOR +participant "a:AddCommand" as AddCommand LOGIC_COLOR +participant ":CommandResult" as CommandResult LOGIC_COLOR + +end box + +box Model MODEL_COLOR_T1 +participant "m:ModelManager" as Model MODEL_COLOR +end box + +note left of LogicManager + In the diagram, params refers to the following: + "c/Google r/Software Engineer + s/PA d/10-10-2023 n/Francis Tan + p/98765432 e/francist@gmail.com" +end note + +[-> LogicManager : execute(params) +activate LogicManager + +LogicManager -> AddressBookParser : parseCommand(params) +activate AddressBookParser + +create AddCommandParser +AddressBookParser -> AddCommandParser +activate AddCommandParser + +AddCommandParser --> AddressBookParser +deactivate AddCommandParser + +AddressBookParser -> AddCommandParser : parse(params) +activate AddCommandParser + +create Company +AddCommandParser -> Company: Company(...) +activate Company + +Company --> AddCommandParser +deactivate Company + +create AddCommand +AddCommandParser -> AddCommand +activate AddCommand + +AddCommand --> AddCommandParser : a +deactivate AddCommand + + +AddCommandParser --> AddressBookParser : a +deactivate AddCommandParser +'Hidden arrow to position the destroy marker below the end of the activation bar. +AddCommandParser -[hidden]-> AddressBookParser +destroy AddCommandParser + +AddressBookParser --> LogicManager : a +deactivate AddressBookParser + +LogicManager -> AddCommand : execute(m) +activate AddCommand + +AddCommand -> Model : hasCompany(c) +activate Model + +Model --> AddCommand +deactivate Model + +AddCommand -> Model : addCompany(c) +activate Model + +Model --> AddCommand +deactivate Model + +AddCommand -> Model : setCurrentViewedCompany(c) +activate Model + +Model --> AddCommand +deactivate Model + +create CommandResult +AddCommand -> CommandResult +activate CommandResult + +CommandResult --> AddCommand +deactivate CommandResult + +AddCommand --> LogicManager +deactivate AddCommand + +[<--LogicManager +deactivate LogicManager + +@enduml diff --git a/docs/diagrams/ArchitectureSequenceDiagram.puml b/docs/diagrams/ArchitectureSequenceDiagram.puml index 48b6cc4333c..ea564e5cb83 100644 --- a/docs/diagrams/ArchitectureSequenceDiagram.puml +++ b/docs/diagrams/ArchitectureSequenceDiagram.puml @@ -14,7 +14,7 @@ activate ui UI_COLOR ui -[UI_COLOR]> logic : execute("delete 1") activate logic LOGIC_COLOR -logic -[LOGIC_COLOR]> model : deletePerson(p) +logic -[LOGIC_COLOR]> model : deleteCompany(p) activate model MODEL_COLOR model -[MODEL_COLOR]-> logic diff --git a/docs/diagrams/BetterModelClassDiagram.puml b/docs/diagrams/BetterModelClassDiagram.puml index 598474a5c82..bf3bb90075b 100644 --- a/docs/diagrams/BetterModelClassDiagram.puml +++ b/docs/diagrams/BetterModelClassDiagram.puml @@ -4,18 +4,18 @@ skinparam arrowThickness 1.1 skinparam arrowColor MODEL_COLOR skinparam classBackgroundColor MODEL_COLOR -AddressBook *-right-> "1" UniquePersonList -AddressBook *-right-> "1" UniqueTagList -UniqueTagList -[hidden]down- UniquePersonList -UniqueTagList -[hidden]down- UniquePersonList +AddressBook *-right-> "1" UniqueCompanyList -UniqueTagList -right-> "*" Tag -UniquePersonList -right-> Person +UniqueCompanyList -right-> Company -Person -up-> "*" Tag - -Person *--> Name -Person *--> Phone -Person *--> Email -Person *--> Address +Company *--> Name +Company *--> Phone +Company *--> Email +Company *--> Address +Company *--> ApplicationStatus +Company *--> Deadline +Company *--> RecruiterName +Company *--> Role +Company *--> Priority +Company *--> Remark @enduml diff --git a/docs/diagrams/CompanyDetailPanelActivityDiagram.puml b/docs/diagrams/CompanyDetailPanelActivityDiagram.puml new file mode 100644 index 00000000000..0ca53b4d2f6 --- /dev/null +++ b/docs/diagrams/CompanyDetailPanelActivityDiagram.puml @@ -0,0 +1,24 @@ +@startuml +skin rose +skinparam ActivityFontSize 15 +skinparam ArrowFontSize 12 +start +:User executes command; + +'Since the beta syntax does not support placing the condition outside the +'diamond we place it as the true branch instead. + +if () then ([view, edit or add command]) + :Clear UniqueCompanyList; + :Add the company to + UniqueCompanyList; + :Company detail panel displays company; +else ([delete command]) + if () then ([viewing the company to be deleted]) + :Clear company detail panel; + else ([else]) + endif + +endif +stop +@enduml diff --git a/docs/diagrams/DeleteSequenceDiagram.puml b/docs/diagrams/DeleteSequenceDiagram.puml index 40ea6c9dc4c..bf760d7dce2 100644 --- a/docs/diagrams/DeleteSequenceDiagram.puml +++ b/docs/diagrams/DeleteSequenceDiagram.puml @@ -11,7 +11,7 @@ participant ":CommandResult" as CommandResult LOGIC_COLOR end box box Model MODEL_COLOR_T1 -participant ":Model" as Model MODEL_COLOR +participant "m:ModelManager" as Model MODEL_COLOR end box [-> LogicManager : execute("delete 1") @@ -46,10 +46,10 @@ destroy DeleteCommandParser AddressBookParser --> LogicManager : d deactivate AddressBookParser -LogicManager -> DeleteCommand : execute() +LogicManager -> DeleteCommand : execute(m) activate DeleteCommand -DeleteCommand -> Model : deletePerson(1) +DeleteCommand -> Model : deleteCompany(1) activate Model Model --> DeleteCommand diff --git a/docs/diagrams/DetailPanelClassDiagram.puml b/docs/diagrams/DetailPanelClassDiagram.puml new file mode 100644 index 00000000000..d82c6e3c324 --- /dev/null +++ b/docs/diagrams/DetailPanelClassDiagram.puml @@ -0,0 +1,30 @@ +@startuml +!include style.puml +skinparam arrowThickness 1.1 +skinparam arrowColor UI_COLOR_T4 +skinparam classBackgroundColor UI_COLOR + +package UI <>{ +Class MainWindow +Class CompanyDetailPanel +Class CompanyDetailCard +Class "{abstract}\nUiPart" as UiPart +Class CompanyCardUtils { + createPriorityFlowPane(Company, Boolean) : FlowPane +} +} +package Model <> { +Class HiddenModel #FFFFFF +} + +MainWindow *-right-> "1" CompanyDetailPanel +CompanyDetailPanel *-down-> "0...1" CompanyDetailCard +CompanyDetailCard -right..> Model +MainWindow -down-|> UiPart +CompanyDetailPanel -down-|> UiPart +CompanyDetailCard -down-|> UiPart +CompanyDetailCard .down.> CompanyCardUtils + +show CompanyCardUtils members + +@enduml diff --git a/docs/diagrams/DuplicateActivityDiagram.puml b/docs/diagrams/DuplicateActivityDiagram.puml new file mode 100644 index 00000000000..6366f60166c --- /dev/null +++ b/docs/diagrams/DuplicateActivityDiagram.puml @@ -0,0 +1,19 @@ +@startuml +skin rose +skinparam ActivityFontSize 15 +skinparam ArrowFontSize 12 +start + +'Since the beta syntax does not support placing the condition outside the +'diamond we place it as the true branch instead. + +: Get the existing duplicate \n company from the model; +:Get the index of the duplicate company from the \n filtered company list panel; +if () then ([else]) + :Get the index of the duplicate company from the \n full company list panel; +else ([Duplicate company is in filtered company list panel]) + endif +: Get all the fields that were different between \nthe duplicate existing company and inputted company; +:Format the error message with the fields and the index; +stop +@enduml diff --git a/docs/diagrams/DuplicateSequenceDiagram.puml b/docs/diagrams/DuplicateSequenceDiagram.puml new file mode 100644 index 00000000000..a321c174ecd --- /dev/null +++ b/docs/diagrams/DuplicateSequenceDiagram.puml @@ -0,0 +1,76 @@ +@startuml +!include style.puml +skinparam ArrowFontStyle plain + +box "Logic" LOGIC_COLOR_T1 +participant ":EditCommand" as EditCommand LOGIC_COLOR +end box + +box "Model" MODEL_COLOR_T1 +participant ":ModelManager" as ModelManager MODEL_COLOR +participant ":AddressBook" as AddressBook MODEL_COLOR +participant ":UniqueCompanyList" as UniqueCompanyList MODEL_COLOR +participant "c:Company" as CompanyC MODEL_COLOR +participant "d:Company" as CompanyD MODEL_COLOR +end box + +EditCommand -> ModelManager : getDuplicateCompany(c) +activate EditCommand +activate ModelManager + +ModelManager -> AddressBook : getDuplicateCompany(c) +activate AddressBook + +AddressBook -> UniqueCompanyList : contains(c) +activate UniqueCompanyList + +loop for each company in UniqueCompanyList + UniqueCompanyList -> CompanyC : isSameCompany(d) + activate CompanyC + ' Self-invocation within Company + CompanyC -> CompanyD : getName() + activate CompanyD + CompanyD --> CompanyC + deactivate CompanyD + + CompanyC -> CompanyC : getName() + activate CompanyC #DarkSlateGray + CompanyC --> CompanyC + deactivate CompanyC #DarkSlateGray + + CompanyC -> CompanyD : getRole() + activate CompanyD + CompanyD --> CompanyC + deactivate CompanyD + + CompanyC -> CompanyC : getRole() + activate CompanyC #DarkSlateGray + CompanyC --> CompanyC + deactivate CompanyC #DarkSlateGray + + CompanyC -> CompanyD : getDeadline() + activate CompanyD + CompanyD --> CompanyC + deactivate CompanyD + + CompanyC -> CompanyC : getDeadline() + activate CompanyC #DarkSlateGray + CompanyC --> CompanyC + deactivate CompanyC #DarkSlateGray + + CompanyC --> UniqueCompanyList + deactivate CompanyC +end + +UniqueCompanyList --> AddressBook +deactivate UniqueCompanyList + +AddressBook --> ModelManager +deactivate AddressBook + +ModelManager --> EditCommand +deactivate ModelManager + +deactivate EditCommand + +@enduml diff --git a/docs/diagrams/EditSequenceDiagram.puml b/docs/diagrams/EditSequenceDiagram.puml new file mode 100644 index 00000000000..3bd3f0695b4 --- /dev/null +++ b/docs/diagrams/EditSequenceDiagram.puml @@ -0,0 +1,98 @@ +@startuml +!include style.puml +skinparam ArrowFontStyle plain + +box Logic LOGIC_COLOR_T1 + +participant ":LogicManager" as LogicManager LOGIC_COLOR +participant ":AddressBookParser" as AddressBookParser LOGIC_COLOR +participant ":EditCommandParser" as EditCommandParser LOGIC_COLOR +participant "d:EditCompanyDescriptor" as EditCompanyDescriptor LOGIC_COLOR +participant "e:EditCommand" as EditCommand LOGIC_COLOR +participant ":CommandResult" as CommandResult LOGIC_COLOR + +end box + +box Model MODEL_COLOR_T1 +participant "m:ModelManager" as Model MODEL_COLOR +end box + +[-> LogicManager : execute("edit 1 r/SWE") +activate LogicManager + +LogicManager -> AddressBookParser : parseCommand("edit 1 r/SWE") +activate AddressBookParser + +create EditCommandParser +AddressBookParser -> EditCommandParser +activate EditCommandParser + +EditCommandParser --> AddressBookParser +deactivate EditCommandParser + +AddressBookParser -> EditCommandParser : parse("1 r/SWE") +activate EditCommandParser + +create EditCompanyDescriptor +EditCommandParser -> EditCompanyDescriptor +activate EditCompanyDescriptor + +EditCompanyDescriptor --> EditCommandParser : d +deactivate EditCompanyDescriptor + +create EditCommand +EditCommandParser -> EditCommand : EditCommand(1, d) +activate EditCommand + +EditCommand --> EditCommandParser : e +deactivate EditCommand + +EditCommandParser --> AddressBookParser : e +deactivate EditCommandParser +'Hidden arrow to position the destroy marker below the end of the activation bar. +EditCommandParser -[hidden]-> AddressBookParser +destroy EditCommandParser + +AddressBookParser --> LogicManager : e +deactivate AddressBookParser + +LogicManager -> EditCommand : execute(m) +activate EditCommand + +EditCommand -> Model : getCompany(1) +activate Model + +Model --> EditCommand : target +deactivate Model + +EditCommand -> EditCommand : createEditedCompany(target, d) +activate EditCommand +EditCommand --> EditCommand : c +deactivate EditCommand + +EditCommand -> Model : setCompany(target, c) +activate Model + +Model --> EditCommand +deactivate Model + +EditCommand -> Model : setCurrentViewedCompany(c) +activate Model + +Model --> EditCommand +deactivate Model + +create CommandResult +EditCommand -> CommandResult +activate CommandResult + +CommandResult --> EditCommand +deactivate CommandResult + +EditCommand --> LogicManager : result +deactivate EditCommand + +[<--LogicManager +deactivate LogicManager + +@enduml diff --git a/docs/diagrams/FilterSequenceDiagram.puml b/docs/diagrams/FilterSequenceDiagram.puml new file mode 100644 index 00000000000..72d6deda03a --- /dev/null +++ b/docs/diagrams/FilterSequenceDiagram.puml @@ -0,0 +1,81 @@ +@startuml +!include style.puml +skinparam ArrowFontStyle plain + +box Logic LOGIC_COLOR_T1 + +participant ":LogicManager" as LogicManager LOGIC_COLOR +participant ":AddressBookParser" as AddressBookParser LOGIC_COLOR +participant ":FilterCommandParser" as FilterCommandParser LOGIC_COLOR +participant "p:ApplicationStatusPredicate" as ApplicationStatusPredicate MODEL_COLOR +participant "f:FilterCommand" as FilterCommand LOGIC_COLOR +participant ":CommandResult" as CommandResult LOGIC_COLOR + +end box + +box Model MODEL_COLOR_T1 +participant "m:ModelManager" as Model MODEL_COLOR +end box + +[-> LogicManager : execute("filter s/pa") +activate LogicManager + +LogicManager -> AddressBookParser : parseCommand("filter s/pa") +activate AddressBookParser + +create FilterCommandParser +AddressBookParser -> FilterCommandParser +activate FilterCommandParser + +FilterCommandParser --> AddressBookParser +deactivate FilterCommandParser + +AddressBookParser -> FilterCommandParser : parse("s/pa") +activate FilterCommandParser + +create ApplicationStatusPredicate +FilterCommandParser -> ApplicationStatusPredicate +activate ApplicationStatusPredicate + +ApplicationStatusPredicate --> FilterCommandParser +deactivate ApplicationStatusPredicate + +create FilterCommand +FilterCommandParser -> FilterCommand +activate FilterCommand + +FilterCommand --> FilterCommandParser : f +deactivate FilterCommand + +FilterCommandParser --> AddressBookParser : f +deactivate FilterCommandParser +'Hidden arrow to position the destroy marker below the end of the activation bar. +FilterCommandParser -[hidden]-> AddressBookParser +destroy FilterCommandParser + +AddressBookParser --> LogicManager : f +deactivate AddressBookParser + +LogicManager -> FilterCommand : execute(m) +activate FilterCommand + +FilterCommand -> Model : filterCompaniesByStatus(p) +activate Model + +Model -->FilterCommand +deactivate Model + +create CommandResult +FilterCommand -> CommandResult +activate CommandResult + +CommandResult --> FilterCommand +deactivate CommandResult + +FilterCommand --> LogicManager : result +deactivate FilterCommand + +[<--LogicManager +deactivate LogicManager + +@enduml diff --git a/docs/diagrams/FindCompanySequenceDiagram.puml b/docs/diagrams/FindCompanySequenceDiagram.puml new file mode 100644 index 00000000000..1df8d91c8f7 --- /dev/null +++ b/docs/diagrams/FindCompanySequenceDiagram.puml @@ -0,0 +1,78 @@ +@startuml +!include style.puml +skinparam ArrowFontStyle plain + +box Logic LOGIC_COLOR_T1 +participant ":LogicManager" as LogicManager LOGIC_COLOR +participant ":AddressBookParser" as AddressBookParser LOGIC_COLOR +participant ":FindCommandParser" as FindCommandParser LOGIC_COLOR +participant "u:FindCommand" as FindCommand LOGIC_COLOR +participant "u:CommandResult" as CommandResult LOGIC_COLOR +participant "p :NameContainsKeywordsPredicate" as NameContainsKeywordsPredicate MODEL_COLOR +end box + +box Model MODEL_COLOR_T1 +participant "m:ModelManager" as Model MODEL_COLOR +end box + +[-> LogicManager : execute("find tech sta") +activate LogicManager + +LogicManager -> AddressBookParser : parseCommand("find tech sta") +activate AddressBookParser + +create FindCommandParser +AddressBookParser -> FindCommandParser +activate FindCommandParser + +FindCommandParser --> AddressBookParser +deactivate FindCommandParser + +AddressBookParser -> FindCommandParser : parse("find tech sta") +activate FindCommandParser + +create NameContainsKeywordsPredicate +FindCommandParser -> NameContainsKeywordsPredicate +activate NameContainsKeywordsPredicate + +NameContainsKeywordsPredicate --> FindCommandParser +deactivate NameContainsKeywordsPredicate + +create FindCommand +FindCommandParser -> FindCommand +activate FindCommand + +FindCommand --> FindCommandParser : u +deactivate FindCommand + +FindCommandParser --> AddressBookParser : u +deactivate FindCommandParser +'Hidden arrow to position the destroy marker below the end of the activation bar. +FindCommandParser -[hidden]-> AddressBookParser +destroy FindCommandParser + +AddressBookParser --> LogicManager : u +deactivate AddressBookParser + +LogicManager -> FindCommand : execute(m) +activate FindCommand + +FindCommand -> Model : updateFilteredCompanyList(p) +activate Model + +Model --> FindCommand +deactivate Model + +create CommandResult +FindCommand -> CommandResult +activate CommandResult + +CommandResult --> FindCommand +deactivate CommandResult + +FindCommand --> LogicManager : result +deactivate FindCommand + +[<--LogicManager +deactivate LogicManager +@enduml diff --git a/docs/diagrams/ModelClassDiagram.puml b/docs/diagrams/ModelClassDiagram.puml index 0de5673070d..d8e597c8f39 100644 --- a/docs/diagrams/ModelClassDiagram.puml +++ b/docs/diagrams/ModelClassDiagram.puml @@ -12,13 +12,18 @@ Class AddressBook Class ModelManager Class UserPrefs -Class UniquePersonList -Class Person -Class Address +Class UniqueCompanyList +Class Company Class Email Class Name Class Phone -Class Tag +Class ApplicationStatus +Class Deadline +Class Priority +Class RecruiterName +Class Role +Class Priority +Class Remark Class I #FFFFFF } @@ -35,20 +40,22 @@ ModelManager -left-> "1" AddressBook ModelManager -right-> "1" UserPrefs UserPrefs .up.|> ReadOnlyUserPrefs -AddressBook *--> "1" UniquePersonList -UniquePersonList --> "~* all" Person -Person *--> Name -Person *--> Phone -Person *--> Email -Person *--> Address -Person *--> "*" Tag - -Person -[hidden]up--> I -UniquePersonList -[hidden]right-> I +AddressBook *--> "1" UniqueCompanyList +UniqueCompanyList --> "~* all" Company +Company *--> Email +Company *--> Name +Company *--> Phone +Company *--> ApplicationStatus +Company *--> Deadline +Company *--> RecruiterName +Company *--> Role +Company *--> Priority +Company *--> Remark + +Company -[hidden]up--> I +UniqueCompanyList -[hidden]right-> I Name -[hidden]right-> Phone -Phone -[hidden]right-> Address -Address -[hidden]right-> Email -ModelManager --> "~* filtered" Person +ModelManager --> "~* filtered" Company @enduml diff --git a/docs/diagrams/RemarkActivityDiagram.puml b/docs/diagrams/RemarkActivityDiagram.puml new file mode 100644 index 00000000000..06d873d5192 --- /dev/null +++ b/docs/diagrams/RemarkActivityDiagram.puml @@ -0,0 +1,27 @@ +@startuml +skin rose +skinparam ActivityFontSize 15 +skinparam ArrowFontSize 12 +start +:AddressBookParser parses user input; + +'Since the beta syntax does not support placing the condition outside the +'diamond we place it as the true branch instead. + +if () then ([remark command word]) + :Create RemarkCommandParser; + :Parse user input; + :Create RemarkCommand + with user input as remark; + +else ([unremark command word]) + :Create UnremarkCommandParser; + : Create RemarkCommand + with "No remarks" as remark; + +endif + +: RemarkCommand.execute() +updates remark of the company; +stop +@enduml diff --git a/docs/diagrams/SortSequenceDiagram.puml b/docs/diagrams/SortSequenceDiagram.puml new file mode 100644 index 00000000000..13c6749599d --- /dev/null +++ b/docs/diagrams/SortSequenceDiagram.puml @@ -0,0 +1,46 @@ +@startuml +!include style.puml +skinparam ArrowFontStyle plain + +box Logic LOGIC_COLOR_T1 +participant ":SortCommand" as SortCommand LOGIC_COLOR +participant "c:Comparator" as Comparator LOGIC_COLOR +participant ":CommandResult" as CommandResult LOGIC_COLOR + +box Model MODEL_COLOR_T1 +participant ":ModelManager" as Model MODEL_COLOR + +-> SortCommand : execute(sortOrder) +activate SortCommand +create Comparator +SortCommand -> Comparator : createComparator(sortOrder) + +activate Comparator +Comparator --> SortCommand +deactivate Comparator + +SortCommand -> Model : getUnmodifiableObservableList() +activate Model +Model --> SortCommand : companyList +deactivate Model + +SortCommand -> SortCommand : sortCompanies(companyList, c) +activate SortCommand +SortCommand --> SortCommand : sortedList +deactivate SortCommand + +SortCommand -> Model : setAllCompanies(sortedList) +activate Model +Model --> SortCommand +deactivate Model + +create CommandResult +SortCommand -> CommandResult +activate CommandResult + +CommandResult --> SortCommand +deactivate CommandResult + +<-- SortCommand : result +deactivate SortCommand +@enduml diff --git a/docs/diagrams/StorageClassDiagram.puml b/docs/diagrams/StorageClassDiagram.puml index a821e06458c..bcc9fbac70d 100644 --- a/docs/diagrams/StorageClassDiagram.puml +++ b/docs/diagrams/StorageClassDiagram.puml @@ -18,8 +18,8 @@ package "AddressBook Storage" #F4F6F6{ Class "<>\nAddressBookStorage" as AddressBookStorage Class JsonAddressBookStorage Class JsonSerializableAddressBook -Class JsonAdaptedPerson -Class JsonAdaptedTag +Class JsonAdaptedCompany + } } @@ -37,7 +37,6 @@ Storage -right-|> AddressBookStorage JsonUserPrefsStorage .up.|> UserPrefsStorage JsonAddressBookStorage .up.|> AddressBookStorage JsonAddressBookStorage ..> JsonSerializableAddressBook -JsonSerializableAddressBook --> "*" JsonAdaptedPerson -JsonAdaptedPerson --> "*" JsonAdaptedTag +JsonSerializableAddressBook --> "*" JsonAdaptedCompany @enduml diff --git a/docs/diagrams/UiClassDiagram.puml b/docs/diagrams/UiClassDiagram.puml index 95473d5aa19..63d12d69048 100644 --- a/docs/diagrams/UiClassDiagram.puml +++ b/docs/diagrams/UiClassDiagram.puml @@ -11,9 +11,11 @@ Class UiManager Class MainWindow Class HelpWindow Class ResultDisplay -Class PersonListPanel -Class PersonCard +Class CompanyListPanel +Class CompanyCard Class StatusBarFooter +Class CompanyDetailPanel +Class CompanyDetailCard Class CommandBox } @@ -32,26 +34,31 @@ UiManager .left.|> Ui UiManager -down-> "1" MainWindow MainWindow *-down-> "1" CommandBox MainWindow *-down-> "1" ResultDisplay -MainWindow *-down-> "1" PersonListPanel +MainWindow *-down-> "1" CompanyListPanel MainWindow *-down-> "1" StatusBarFooter MainWindow --> "0..1" HelpWindow - -PersonListPanel -down-> "*" PersonCard +MainWindow *-down-> "1" CompanyDetailPanel +CompanyListPanel -down-> "*" CompanyCard +CompanyDetailPanel -down-> "0...1" CompanyDetailCard MainWindow -left-|> UiPart -ResultDisplay --|> UiPart -CommandBox --|> UiPart -PersonListPanel --|> UiPart -PersonCard --|> UiPart +ResultDisplay -down--|> UiPart +CommandBox -down--|> UiPart +CompanyCard -down--|> UiPart +CompanyDetailCard -down--|> UiPart +CompanyListPanel -down--|> UiPart +CompanyDetailPanel -down--|> UiPart + StatusBarFooter --|> UiPart HelpWindow --|> UiPart -PersonCard ..> Model +CompanyCard -down..> Model +CompanyDetailCard -down..> Model UiManager -right-> Logic MainWindow -left-> Logic -PersonListPanel -[hidden]left- HelpWindow +CompanyListPanel -[hidden]left- HelpWindow HelpWindow -[hidden]left- CommandBox CommandBox -[hidden]left- ResultDisplay ResultDisplay -[hidden]left- StatusBarFooter diff --git a/docs/diagrams/UndoRedoState0.puml b/docs/diagrams/UndoRedoState0.puml deleted file mode 100644 index 43a45903ac9..00000000000 --- a/docs/diagrams/UndoRedoState0.puml +++ /dev/null @@ -1,21 +0,0 @@ -@startuml -!include style.puml -skinparam ClassFontColor #000000 -skinparam ClassBorderColor #000000 -skinparam ClassBackgroundColor #FFFFAA - -title Initial state - -package States { - class State1 as "ab0:AddressBook" - class State2 as "ab1:AddressBook" - class State3 as "ab2:AddressBook" -} -State1 -[hidden]right-> State2 -State2 -[hidden]right-> State3 -hide State2 -hide State3 - -class Pointer as "Current State" #FFFFFF -Pointer -up-> State1 -@end diff --git a/docs/diagrams/UndoRedoState1.puml b/docs/diagrams/UndoRedoState1.puml deleted file mode 100644 index 5a41e9e1651..00000000000 --- a/docs/diagrams/UndoRedoState1.puml +++ /dev/null @@ -1,23 +0,0 @@ -@startuml -!include style.puml -skinparam ClassFontColor #000000 -skinparam ClassBorderColor #000000 -skinparam ClassBackgroundColor #FFFFAA - -title After command "delete 5" - -package States <> { - class State1 as "ab0:AddressBook" - class State2 as "ab1:AddressBook" - class State3 as "ab2:AddressBook" -} - -State1 -[hidden]right-> State2 -State2 -[hidden]right-> State3 - -hide State3 - -class Pointer as "Current State" #FFFFFF - -Pointer -up-> State2 -@end diff --git a/docs/diagrams/UndoRedoState2.puml b/docs/diagrams/UndoRedoState2.puml deleted file mode 100644 index ad32fce1b0b..00000000000 --- a/docs/diagrams/UndoRedoState2.puml +++ /dev/null @@ -1,21 +0,0 @@ -@startuml -!include style.puml -skinparam ClassFontColor #000000 -skinparam ClassBorderColor #000000 -skinparam ClassBackgroundColor #FFFFAA - -title After command "add n/David" - -package States <> { - class State1 as "ab0:AddressBook" - class State2 as "ab1:AddressBook" - class State3 as "ab2:AddressBook" -} - -State1 -[hidden]right-> State2 -State2 -[hidden]right-> State3 - -class Pointer as "Current State" #FFFFFF - -Pointer -up-> State3 -@end diff --git a/docs/diagrams/UndoRedoState3.puml b/docs/diagrams/UndoRedoState3.puml deleted file mode 100644 index 9187a690036..00000000000 --- a/docs/diagrams/UndoRedoState3.puml +++ /dev/null @@ -1,21 +0,0 @@ -@startuml -!include style.puml -skinparam ClassFontColor #000000 -skinparam ClassBorderColor #000000 -skinparam ClassBackgroundColor #FFFFAA - -title After command "undo" - -package States <> { - class State1 as "ab0:AddressBook" - class State2 as "ab1:AddressBook" - class State3 as "ab2:AddressBook" -} - -State1 -[hidden]right-> State2 -State2 -[hidden]right-> State3 - -class Pointer as "Current State" #FFFFFF - -Pointer -up-> State2 -@end diff --git a/docs/diagrams/UndoRedoState4.puml b/docs/diagrams/UndoRedoState4.puml deleted file mode 100644 index 2bc631ffcd0..00000000000 --- a/docs/diagrams/UndoRedoState4.puml +++ /dev/null @@ -1,21 +0,0 @@ -@startuml -!include style.puml -skinparam ClassFontColor #000000 -skinparam ClassBorderColor #000000 -skinparam ClassBackgroundColor #FFFFAA - -title After command "list" - -package States <> { - class State1 as "ab0:AddressBook" - class State2 as "ab1:AddressBook" - class State3 as "ab2:AddressBook" -} - -State1 -[hidden]right-> State2 -State2 -[hidden]right-> State3 - -class Pointer as "Current State" #FFFFFF - -Pointer -up-> State2 -@end diff --git a/docs/diagrams/UndoRedoState5.puml b/docs/diagrams/UndoRedoState5.puml deleted file mode 100644 index e77b04104aa..00000000000 --- a/docs/diagrams/UndoRedoState5.puml +++ /dev/null @@ -1,22 +0,0 @@ -@startuml -!include style.puml -skinparam ClassFontColor #000000 -skinparam ClassBorderColor #000000 -skinparam ClassBackgroundColor #FFFFAA - -title After command "clear" - -package States <> { - class State1 as "ab0:AddressBook" - class State2 as "ab1:AddressBook" - class State3 as "ab3:AddressBook" -} - -State1 -[hidden]right-> State2 -State2 -[hidden]right-> State3 - -class Pointer as "Current State" #FFFFFF - -Pointer -up-> State3 -note right on link: State ab2 deleted. -@end diff --git a/docs/diagrams/UndoSequenceDiagram.puml b/docs/diagrams/UndoSequenceDiagram.puml deleted file mode 100644 index 87ff3e9237e..00000000000 --- a/docs/diagrams/UndoSequenceDiagram.puml +++ /dev/null @@ -1,54 +0,0 @@ -@startuml -!include style.puml -skinparam ArrowFontStyle plain - -box Logic LOGIC_COLOR_T1 -participant ":LogicManager" as LogicManager LOGIC_COLOR -participant ":AddressBookParser" as AddressBookParser LOGIC_COLOR -participant "u:UndoCommand" as UndoCommand LOGIC_COLOR -end box - -box Model MODEL_COLOR_T1 -participant ":Model" as Model MODEL_COLOR -participant ":VersionedAddressBook" as VersionedAddressBook MODEL_COLOR -end box -[-> LogicManager : execute(undo) -activate LogicManager - -LogicManager -> AddressBookParser : parseCommand(undo) -activate AddressBookParser - -create UndoCommand -AddressBookParser -> UndoCommand -activate UndoCommand - -UndoCommand --> AddressBookParser -deactivate UndoCommand - -AddressBookParser --> LogicManager : u -deactivate AddressBookParser - -LogicManager -> UndoCommand : execute() -activate UndoCommand - -UndoCommand -> Model : undoAddressBook() -activate Model - -Model -> VersionedAddressBook : undo() -activate VersionedAddressBook - -VersionedAddressBook -> VersionedAddressBook :resetData(ReadOnlyAddressBook) -VersionedAddressBook --> Model : -deactivate VersionedAddressBook - -Model --> UndoCommand -deactivate Model - -UndoCommand --> LogicManager : result -deactivate UndoCommand -UndoCommand -[hidden]-> LogicManager : result -destroy UndoCommand - -[<--LogicManager -deactivate LogicManager -@enduml diff --git a/docs/diagrams/ViewSequenceDiagram.puml b/docs/diagrams/ViewSequenceDiagram.puml new file mode 100644 index 00000000000..fb27244573e --- /dev/null +++ b/docs/diagrams/ViewSequenceDiagram.puml @@ -0,0 +1,86 @@ +@startuml +!include style.puml +skinparam ArrowFontStyle plain + +box Logic LOGIC_COLOR_T1 + +participant ":LogicManager" as LogicManager LOGIC_COLOR +participant ":AddressBookParser" as AddressBookParser LOGIC_COLOR +participant ":ViewCommandParser" as ViewCommandParser LOGIC_COLOR +participant "c:Company" as Company MODEL_COLOR +participant "v:ViewCommand" as ViewCommand LOGIC_COLOR +participant ":CommandResult" as CommandResult LOGIC_COLOR + +end box + +box Model MODEL_COLOR_T1 +participant "m:ModelManager" as Model MODEL_COLOR +end box + +[-> LogicManager : execute("view 1") +activate LogicManager + +LogicManager -> AddressBookParser : parseCommand("view 1") +activate AddressBookParser + +create ViewCommandParser +AddressBookParser -> ViewCommandParser +activate ViewCommandParser + +ViewCommandParser --> AddressBookParser +deactivate ViewCommandParser + +AddressBookParser -> ViewCommandParser : parse("1") +activate ViewCommandParser + +create Company +ViewCommandParser -> Company: Company(...) +activate Company + +Company --> ViewCommandParser +deactivate Company + +create ViewCommand +ViewCommandParser -> ViewCommand +activate ViewCommand + +ViewCommand --> ViewCommandParser : v +deactivate ViewCommand + +ViewCommandParser --> AddressBookParser : v +deactivate ViewCommandParser +'Hidden arrow to position the destroy marker below the end of the activation bar. +ViewCommandParser -[hidden]-> AddressBookParser +destroy ViewCommandParser + +AddressBookParser --> LogicManager : v +deactivate AddressBookParser + +LogicManager -> ViewCommand : execute(m) +activate ViewCommand + +ViewCommand -> Model : setCurrentViewedCompany(c) + +activate Model + +Model --> ViewCommand +deactivate Model + +create CommandResult +ViewCommand -> CommandResult +activate CommandResult + +CommandResult --> ViewCommand +deactivate CommandResult + +ViewCommand --> LogicManager : result +deactivate ViewCommand + +[<--LogicManager +deactivate LogicManager + + + + + +@enduml diff --git a/docs/diagrams/add-remark/ParserClass.puml b/docs/diagrams/add-remark/ParserClass.puml deleted file mode 100644 index 24d390a4023..00000000000 --- a/docs/diagrams/add-remark/ParserClass.puml +++ /dev/null @@ -1,14 +0,0 @@ -@startuml -hide circle -skinparam classAttributeIconSize 0 - -Class "<>\nParser" as Parser -Class RemarkCommandParser { - +parse(): RemarkCommand -} -Class ParserException - -RemarkCommandParser .up.|> Parser -Parser .right.> ParserException: throws > -RemarkCommandParser .right.> ParserException: throws > -@enduml diff --git a/docs/diagrams/add-remark/RemarkClass.puml b/docs/diagrams/add-remark/RemarkClass.puml deleted file mode 100644 index 019c1ecbbf1..00000000000 --- a/docs/diagrams/add-remark/RemarkClass.puml +++ /dev/null @@ -1,19 +0,0 @@ -@startuml -hide circle -skinparam classAttributeIconSize 0 - -Class "{abstract}\nCommand" as Command { - +execute(Model): CommandResult -} -Class RemarkCommand { - +COMMAND_WORD: String - +MESSAGE_USAGE: String - +MESSAGE_NOT_IMPLEMENTED_YET: String - +execute(Model): CommandResult -} -Class CommandException - -RemarkCommand -up-|> Command -Command ..> CommandException: throws > -RemarkCommand .right.> CommandException: throws > -@enduml diff --git a/docs/diagrams/style.puml b/docs/diagrams/style.puml index f7d7347ae84..7765e080ee0 100644 --- a/docs/diagrams/style.puml +++ b/docs/diagrams/style.puml @@ -48,6 +48,15 @@ skinparam Class { FontName Arial } +skinparam ClassAttribute { + FontColor #FFFFFF + FontSize 15 + BorderThickness 1 + BorderColor #FFFFFF + StereotypeFontColor #FFFFFF + FontName Arial +} + skinparam Actor { BorderColor USER_COLOR Color USER_COLOR diff --git a/docs/diagrams/tracing/LogicSequenceDiagram.puml b/docs/diagrams/tracing/LogicSequenceDiagram.puml deleted file mode 100644 index 42bf46d3ce8..00000000000 --- a/docs/diagrams/tracing/LogicSequenceDiagram.puml +++ /dev/null @@ -1,22 +0,0 @@ -@startuml -!include ../style.puml -skinparam ArrowFontStyle plain - -Participant ":LogicManager" as logic LOGIC_COLOR -Participant ":AddressBookParser" as abp LOGIC_COLOR -Participant ":EditCommandParser" as ecp LOGIC_COLOR -Participant "command:EditCommand" as ec LOGIC_COLOR - -[-> logic : execute -activate logic -logic -> abp ++: parseCommand(commandText) -create ecp -abp -> ecp -abp -> ecp ++: parse(arguments) -create ec -ecp -> ec ++: index, editPersonDescriptor -ec --> ecp -- -ecp --> abp --: command -abp --> logic --: command - -@enduml diff --git a/docs/images/AddActivityDiagram.png b/docs/images/AddActivityDiagram.png new file mode 100644 index 00000000000..3ac16c9cfa8 Binary files /dev/null and b/docs/images/AddActivityDiagram.png differ diff --git a/docs/images/AddSequenceDiagram.png b/docs/images/AddSequenceDiagram.png new file mode 100644 index 00000000000..b5bc6c1269d Binary files /dev/null and b/docs/images/AddSequenceDiagram.png differ diff --git a/docs/images/ArchitectureSequenceDiagram.png b/docs/images/ArchitectureSequenceDiagram.png index 37ad06a2803..b0c67abfc9e 100644 Binary files a/docs/images/ArchitectureSequenceDiagram.png and b/docs/images/ArchitectureSequenceDiagram.png differ diff --git a/docs/images/BetterModelClassDiagram.png b/docs/images/BetterModelClassDiagram.png index 02a42e35e76..62dcbb88e13 100644 Binary files a/docs/images/BetterModelClassDiagram.png and b/docs/images/BetterModelClassDiagram.png differ diff --git a/docs/images/CompanyDataLocation.png b/docs/images/CompanyDataLocation.png new file mode 100644 index 00000000000..506d29c6f54 Binary files /dev/null and b/docs/images/CompanyDataLocation.png differ diff --git a/docs/images/CompanyDetailPanelActivityDiagram.png b/docs/images/CompanyDetailPanelActivityDiagram.png new file mode 100644 index 00000000000..9c43b6eb978 Binary files /dev/null and b/docs/images/CompanyDetailPanelActivityDiagram.png differ diff --git a/docs/images/DeleteSequenceDiagram.png b/docs/images/DeleteSequenceDiagram.png index e186f7ba096..5590902f31e 100644 Binary files a/docs/images/DeleteSequenceDiagram.png and b/docs/images/DeleteSequenceDiagram.png differ diff --git a/docs/images/DetailPanelClassDiagram.png b/docs/images/DetailPanelClassDiagram.png new file mode 100644 index 00000000000..86f6e1318b3 Binary files /dev/null and b/docs/images/DetailPanelClassDiagram.png differ diff --git a/docs/images/EditSequenceDiagram.png b/docs/images/EditSequenceDiagram.png new file mode 100644 index 00000000000..1fcd9b42aaf Binary files /dev/null and b/docs/images/EditSequenceDiagram.png differ diff --git a/docs/images/FilterSequenceDiagram.png b/docs/images/FilterSequenceDiagram.png new file mode 100644 index 00000000000..151b22c6429 Binary files /dev/null and b/docs/images/FilterSequenceDiagram.png differ diff --git a/docs/images/FindCompanySequenceDiagram.png b/docs/images/FindCompanySequenceDiagram.png new file mode 100644 index 00000000000..b42ef29a683 Binary files /dev/null and b/docs/images/FindCompanySequenceDiagram.png differ diff --git a/docs/images/ModelClassDiagram.png b/docs/images/ModelClassDiagram.png index a19fb1b4ac8..34a873e4dbe 100644 Binary files a/docs/images/ModelClassDiagram.png and b/docs/images/ModelClassDiagram.png differ diff --git a/docs/images/RemarkActivityDiagram.png b/docs/images/RemarkActivityDiagram.png new file mode 100644 index 00000000000..8c6699e2320 Binary files /dev/null and b/docs/images/RemarkActivityDiagram.png differ diff --git a/docs/images/SortSequenceDiagram.png b/docs/images/SortSequenceDiagram.png new file mode 100644 index 00000000000..5033e129000 Binary files /dev/null and b/docs/images/SortSequenceDiagram.png differ diff --git a/docs/images/StorageClassDiagram.png b/docs/images/StorageClassDiagram.png index 18fa4d0d51f..1ccdaa5898f 100644 Binary files a/docs/images/StorageClassDiagram.png and b/docs/images/StorageClassDiagram.png differ diff --git a/docs/images/Ui.png b/docs/images/Ui.png index 5bd77847aa2..01fd42327df 100644 Binary files a/docs/images/Ui.png and b/docs/images/Ui.png differ diff --git a/docs/images/UiClassDiagram.png b/docs/images/UiClassDiagram.png index 11f06d68671..6adf5f2442c 100644 Binary files a/docs/images/UiClassDiagram.png and b/docs/images/UiClassDiagram.png differ diff --git a/docs/images/UndoRedoState0.png b/docs/images/UndoRedoState0.png deleted file mode 100644 index c5f91b58533..00000000000 Binary files a/docs/images/UndoRedoState0.png and /dev/null differ diff --git a/docs/images/UndoRedoState1.png b/docs/images/UndoRedoState1.png deleted file mode 100644 index 2d3ad09c047..00000000000 Binary files a/docs/images/UndoRedoState1.png and /dev/null differ diff --git a/docs/images/UndoRedoState2.png b/docs/images/UndoRedoState2.png deleted file mode 100644 index 20853694e03..00000000000 Binary files a/docs/images/UndoRedoState2.png and /dev/null differ diff --git a/docs/images/UndoRedoState3.png b/docs/images/UndoRedoState3.png deleted file mode 100644 index 1a9551b31be..00000000000 Binary files a/docs/images/UndoRedoState3.png and /dev/null differ diff --git a/docs/images/UndoRedoState4.png b/docs/images/UndoRedoState4.png deleted file mode 100644 index 46dfae78c94..00000000000 Binary files a/docs/images/UndoRedoState4.png and /dev/null differ diff --git a/docs/images/UndoRedoState5.png b/docs/images/UndoRedoState5.png deleted file mode 100644 index f45889b5fdf..00000000000 Binary files a/docs/images/UndoRedoState5.png and /dev/null differ diff --git a/docs/images/UndoSequenceDiagram.png b/docs/images/UndoSequenceDiagram.png deleted file mode 100644 index c7a7e637266..00000000000 Binary files a/docs/images/UndoSequenceDiagram.png and /dev/null differ diff --git a/docs/images/ViewSequenceDiagram.png b/docs/images/ViewSequenceDiagram.png new file mode 100644 index 00000000000..293f642a31b Binary files /dev/null and b/docs/images/ViewSequenceDiagram.png differ diff --git a/docs/images/add-command/AddCommandError.png b/docs/images/add-command/AddCommandError.png new file mode 100644 index 00000000000..f5f2d1d5564 Binary files /dev/null and b/docs/images/add-command/AddCommandError.png differ diff --git a/docs/images/add-command/AddCommandError2.png b/docs/images/add-command/AddCommandError2.png new file mode 100644 index 00000000000..918d54f7c6f Binary files /dev/null and b/docs/images/add-command/AddCommandError2.png differ diff --git a/docs/images/add-command/AfterAddCommand.png b/docs/images/add-command/AfterAddCommand.png new file mode 100644 index 00000000000..a2e7234d4c2 Binary files /dev/null and b/docs/images/add-command/AfterAddCommand.png differ diff --git a/docs/images/add-command/BeforeAddCommand.png b/docs/images/add-command/BeforeAddCommand.png new file mode 100644 index 00000000000..b1d9d520469 Binary files /dev/null and b/docs/images/add-command/BeforeAddCommand.png differ diff --git a/docs/images/alagappanra.png b/docs/images/alagappanra.png new file mode 100644 index 00000000000..079fc03a5be Binary files /dev/null and b/docs/images/alagappanra.png differ diff --git a/docs/images/alientian.png b/docs/images/alientian.png new file mode 100644 index 00000000000..770882717ad Binary files /dev/null and b/docs/images/alientian.png differ diff --git a/docs/images/clear-command/clear.png b/docs/images/clear-command/clear.png new file mode 100644 index 00000000000..1b1a7f56be6 Binary files /dev/null and b/docs/images/clear-command/clear.png differ diff --git a/docs/images/cli-description/CliDescription1.png b/docs/images/cli-description/CliDescription1.png new file mode 100644 index 00000000000..9aca7d1b575 Binary files /dev/null and b/docs/images/cli-description/CliDescription1.png differ diff --git a/docs/images/cli-description/CommandFormat1.png b/docs/images/cli-description/CommandFormat1.png new file mode 100644 index 00000000000..a83e8eb950a Binary files /dev/null and b/docs/images/cli-description/CommandFormat1.png differ diff --git a/docs/images/cli-description/CommandFormat2.png b/docs/images/cli-description/CommandFormat2.png new file mode 100644 index 00000000000..efb4ee51d8a Binary files /dev/null and b/docs/images/cli-description/CommandFormat2.png differ diff --git a/docs/images/delete-command/AfterDeleteCommand.png b/docs/images/delete-command/AfterDeleteCommand.png new file mode 100644 index 00000000000..311e7347710 Binary files /dev/null and b/docs/images/delete-command/AfterDeleteCommand.png differ diff --git a/docs/images/delete-command/BeforeDeleteCommand.png b/docs/images/delete-command/BeforeDeleteCommand.png new file mode 100644 index 00000000000..8ab98786c38 Binary files /dev/null and b/docs/images/delete-command/BeforeDeleteCommand.png differ diff --git a/docs/images/delete-command/DeleteCommandError.png b/docs/images/delete-command/DeleteCommandError.png new file mode 100644 index 00000000000..a98f39a5877 Binary files /dev/null and b/docs/images/delete-command/DeleteCommandError.png differ diff --git a/docs/images/duplicate-detection/add-command/DuplicateActivityDiagram.png b/docs/images/duplicate-detection/add-command/DuplicateActivityDiagram.png new file mode 100644 index 00000000000..2cf188d9398 Binary files /dev/null and b/docs/images/duplicate-detection/add-command/DuplicateActivityDiagram.png differ diff --git a/docs/images/duplicate-detection/add-command/duplicate-exact-match.png b/docs/images/duplicate-detection/add-command/duplicate-exact-match.png new file mode 100644 index 00000000000..63234ee1a5b Binary files /dev/null and b/docs/images/duplicate-detection/add-command/duplicate-exact-match.png differ diff --git a/docs/images/duplicate-detection/add-command/duplicate-partial-match.png b/docs/images/duplicate-detection/add-command/duplicate-partial-match.png new file mode 100644 index 00000000000..9af73a5fceb Binary files /dev/null and b/docs/images/duplicate-detection/add-command/duplicate-partial-match.png differ diff --git a/docs/images/duplicate-detection/edit-command/DuplicateSequenceDiagram.png b/docs/images/duplicate-detection/edit-command/DuplicateSequenceDiagram.png new file mode 100644 index 00000000000..720d601e375 Binary files /dev/null and b/docs/images/duplicate-detection/edit-command/DuplicateSequenceDiagram.png differ diff --git a/docs/images/duplicate-detection/edit-command/duplicate-edit.png b/docs/images/duplicate-detection/edit-command/duplicate-edit.png new file mode 100644 index 00000000000..1707519244a Binary files /dev/null and b/docs/images/duplicate-detection/edit-command/duplicate-edit.png differ diff --git a/docs/images/edit-command/EditDemo1.png b/docs/images/edit-command/EditDemo1.png new file mode 100644 index 00000000000..f4c04a383a5 Binary files /dev/null and b/docs/images/edit-command/EditDemo1.png differ diff --git a/docs/images/edit-command/EditDemo2.png b/docs/images/edit-command/EditDemo2.png new file mode 100644 index 00000000000..5762f4bfd44 Binary files /dev/null and b/docs/images/edit-command/EditDemo2.png differ diff --git a/docs/images/edit-command/EditErrMsg.png b/docs/images/edit-command/EditErrMsg.png new file mode 100644 index 00000000000..fbf37cf5f8e Binary files /dev/null and b/docs/images/edit-command/EditErrMsg.png differ diff --git a/docs/images/filter-command/AfterFilterCommand.png b/docs/images/filter-command/AfterFilterCommand.png new file mode 100644 index 00000000000..9a84748aee8 Binary files /dev/null and b/docs/images/filter-command/AfterFilterCommand.png differ diff --git a/docs/images/filter-command/FilterByPI.png b/docs/images/filter-command/FilterByPI.png new file mode 100644 index 00000000000..11b558798ad Binary files /dev/null and b/docs/images/filter-command/FilterByPI.png differ diff --git a/docs/images/filter-command/FilterCommandError.png b/docs/images/filter-command/FilterCommandError.png new file mode 100644 index 00000000000..e2dc731a10e Binary files /dev/null and b/docs/images/filter-command/FilterCommandError.png differ diff --git a/docs/images/find-command/AfterFind.png b/docs/images/find-command/AfterFind.png new file mode 100644 index 00000000000..f1126c964dd Binary files /dev/null and b/docs/images/find-command/AfterFind.png differ diff --git a/docs/images/find-command/BeforeFind.png b/docs/images/find-command/BeforeFind.png new file mode 100644 index 00000000000..4fd586d1391 Binary files /dev/null and b/docs/images/find-command/BeforeFind.png differ diff --git a/docs/images/findAlexDavidResult.png b/docs/images/findAlexDavidResult.png deleted file mode 100644 index 235da1c273e..00000000000 Binary files a/docs/images/findAlexDavidResult.png and /dev/null differ diff --git a/docs/images/glendachong.png b/docs/images/glendachong.png new file mode 100644 index 00000000000..6fa692db0d6 Binary files /dev/null and b/docs/images/glendachong.png differ diff --git a/docs/images/help-command/helpcommand.png b/docs/images/help-command/helpcommand.png new file mode 100644 index 00000000000..926acb8c5d1 Binary files /dev/null and b/docs/images/help-command/helpcommand.png differ diff --git a/docs/images/helpMessage.png b/docs/images/helpMessage.png deleted file mode 100644 index b1f70470137..00000000000 Binary files a/docs/images/helpMessage.png and /dev/null differ diff --git a/docs/images/johndoe.png b/docs/images/johndoe.png deleted file mode 100644 index 1ce7ce16dc8..00000000000 Binary files a/docs/images/johndoe.png and /dev/null differ diff --git a/docs/images/list-command/ListCommand.png b/docs/images/list-command/ListCommand.png new file mode 100644 index 00000000000..5708682b3b4 Binary files /dev/null and b/docs/images/list-command/ListCommand.png differ diff --git a/docs/images/papataco14.png b/docs/images/papataco14.png new file mode 100644 index 00000000000..d6b94b23142 Binary files /dev/null and b/docs/images/papataco14.png differ diff --git a/docs/images/quick-start/githubRelease.png b/docs/images/quick-start/githubRelease.png new file mode 100644 index 00000000000..7189b94a194 Binary files /dev/null and b/docs/images/quick-start/githubRelease.png differ diff --git a/docs/images/quick-start/java11.png b/docs/images/quick-start/java11.png new file mode 100644 index 00000000000..07cee395246 Binary files /dev/null and b/docs/images/quick-start/java11.png differ diff --git a/docs/images/quick-start/launchLinkMeIn.png b/docs/images/quick-start/launchLinkMeIn.png new file mode 100644 index 00000000000..cf9f9ef4d2d Binary files /dev/null and b/docs/images/quick-start/launchLinkMeIn.png differ diff --git a/docs/images/quick-start/startupPage.png b/docs/images/quick-start/startupPage.png new file mode 100644 index 00000000000..8c7f48c144b Binary files /dev/null and b/docs/images/quick-start/startupPage.png differ diff --git a/docs/images/remark-command/RemarkDemo1.png b/docs/images/remark-command/RemarkDemo1.png new file mode 100644 index 00000000000..c3e39e37e8b Binary files /dev/null and b/docs/images/remark-command/RemarkDemo1.png differ diff --git a/docs/images/remark-command/RemarkDemo2.png b/docs/images/remark-command/RemarkDemo2.png new file mode 100644 index 00000000000..aa8f87d3df5 Binary files /dev/null and b/docs/images/remark-command/RemarkDemo2.png differ diff --git a/docs/images/remark-command/RemarkErrMsg.png b/docs/images/remark-command/RemarkErrMsg.png new file mode 100644 index 00000000000..8ad17e26d52 Binary files /dev/null and b/docs/images/remark-command/RemarkErrMsg.png differ diff --git a/docs/images/remark-command/UnremarkDemo1.png b/docs/images/remark-command/UnremarkDemo1.png new file mode 100644 index 00000000000..5c9b76c64cd Binary files /dev/null and b/docs/images/remark-command/UnremarkDemo1.png differ diff --git a/docs/images/remark-command/UnremarkDemo2.png b/docs/images/remark-command/UnremarkDemo2.png new file mode 100644 index 00000000000..089488fe0df Binary files /dev/null and b/docs/images/remark-command/UnremarkDemo2.png differ diff --git a/docs/images/remark-command/UnremarkErrMsg.png b/docs/images/remark-command/UnremarkErrMsg.png new file mode 100644 index 00000000000..590b41dfbc0 Binary files /dev/null and b/docs/images/remark-command/UnremarkErrMsg.png differ diff --git a/docs/images/request_access.png b/docs/images/request_access.png deleted file mode 100644 index 12e8a81bd28..00000000000 Binary files a/docs/images/request_access.png and /dev/null differ diff --git a/docs/images/sort-command/AfterSorting.png b/docs/images/sort-command/AfterSorting.png new file mode 100644 index 00000000000..1beb18daee0 Binary files /dev/null and b/docs/images/sort-command/AfterSorting.png differ diff --git a/docs/images/sort-command/BeforeSorting.png b/docs/images/sort-command/BeforeSorting.png new file mode 100644 index 00000000000..32f8c6c88ae Binary files /dev/null and b/docs/images/sort-command/BeforeSorting.png differ diff --git a/docs/images/sort-command/SortError.png b/docs/images/sort-command/SortError.png new file mode 100644 index 00000000000..54f596d86de Binary files /dev/null and b/docs/images/sort-command/SortError.png differ diff --git a/docs/images/sort-command/TypeCommand.png b/docs/images/sort-command/TypeCommand.png new file mode 100644 index 00000000000..c5155594819 Binary files /dev/null and b/docs/images/sort-command/TypeCommand.png differ diff --git a/docs/images/tayruxin.png b/docs/images/tayruxin.png new file mode 100644 index 00000000000..2c6ca169903 Binary files /dev/null and b/docs/images/tayruxin.png differ diff --git a/docs/images/ui-intro/uiIntro.png b/docs/images/ui-intro/uiIntro.png new file mode 100644 index 00000000000..c0e6c0bc615 Binary files /dev/null and b/docs/images/ui-intro/uiIntro.png differ diff --git a/docs/images/view-command/AfterViewCommand.png b/docs/images/view-command/AfterViewCommand.png new file mode 100644 index 00000000000..2142570fba6 Binary files /dev/null and b/docs/images/view-command/AfterViewCommand.png differ diff --git a/docs/images/view-command/BeforeViewCommand.png b/docs/images/view-command/BeforeViewCommand.png new file mode 100644 index 00000000000..a3de2d3f1bb Binary files /dev/null and b/docs/images/view-command/BeforeViewCommand.png differ diff --git a/docs/images/view-command/ViewCommandError.png b/docs/images/view-command/ViewCommandError.png new file mode 100644 index 00000000000..f4cee8d8cbe Binary files /dev/null and b/docs/images/view-command/ViewCommandError.png differ diff --git a/docs/index.md b/docs/index.md index 7601dbaad0d..a35b0b1ba2b 100644 --- a/docs/index.md +++ b/docs/index.md @@ -1,19 +1,19 @@ --- layout: page -title: AddressBook Level-3 +title: "LinkMeIn" --- +[![CI Status](https://github.com/se-edu/addressbook-level3/workflows/Java%20CI/badge.svg)](https://github.com/AY2324S1-CS2103T-T17-2/tp/actions/workflows/gradle.yml) +[![codecov](https://codecov.io/gh/se-edu/addressbook-level3/branch/master/graph/badge.svg)](https://app.codecov.io/gh/AY2324S1-CS2103T-T17-2/tp) -[![CI Status](https://github.com/se-edu/addressbook-level3/workflows/Java%20CI/badge.svg)](https://github.com/se-edu/addressbook-level3/actions) -[![codecov](https://codecov.io/gh/se-edu/addressbook-level3/branch/master/graph/badge.svg)](https://codecov.io/gh/se-edu/addressbook-level3) ![Ui](images/Ui.png) -**AddressBook is a desktop application for managing your contact details.** While it has a GUI, most of the user interactions happen using a CLI (Command Line Interface). - -* If you are interested in using AddressBook, head over to the [_Quick Start_ section of the **User Guide**](UserGuide.html#quick-start). -* If you are interested about developing AddressBook, the [**Developer Guide**](DeveloperGuide.html) is a good place to start. +**LinkMeIn is a desktop application for managing your internship applications as a Computer Science student.** While it has a GUI, most of the user interactions happen using a CLI (Command Line Interface). +* If you are interested in using LinkMeIn, head over to the [_Quick Start_ section of the **User Guide**](UserGuide.html#quick-start). +* If you are interested about developing LinkMeIn, the [**Developer Guide**](DeveloperGuide.html) is a good place to start. **Acknowledgements** * Libraries used: [JavaFX](https://openjfx.io/), [Jackson](https://github.com/FasterXML/jackson), [JUnit5](https://github.com/junit-team/junit5) +* This project is based on the AddressBook-Level3 project created by the [SE-EDU initiative](https://se-education.org). diff --git a/docs/team/alagappanra.md b/docs/team/alagappanra.md new file mode 100644 index 00000000000..81877509032 --- /dev/null +++ b/docs/team/alagappanra.md @@ -0,0 +1,98 @@ +--- +layout: page +title: Alagappan Ramanathan's Project Portfolio Page +--- + +### Project: LinkMeIn +LinkMeIn - Is a desktop address book application +used to track student's job applications to companies. +The user interacts with it using a CLI, and it has a +GUI created with JavaFX. It is written in Java, and has about +~10 kLoC. + +Given below are my contributions to the project. + +## **Code contributed**: +The code that I have contributed can be found in this [RepoSense link](https://nus-cs2103-ay2324s1.github.io/tp-dashboard/?search=AlagappanRa&breakdown=false&sort=groupTitle%20dsc&sortWithin=title&since=2023-09-22&timeframe=commit&mergegroup=&groupSelect=groupByRepos) + +## Enhancements implemented: +**Duplicate checking algorithm for the add and edit command** + +**What it does:**
+The duplicate checking algorithm checks if the company that the user is trying to add or edit is already present in the +company list. If the company is already present in the company list, a specific error message will be raised to the +user, informing them of the corrective action they need to take. + +**Justification:**
+This feature was implemented to inform the user of an accidental duplicate company that they +tried to add or edit. The associated error message covers 4 different cases, each of which +guides the user towards a specific corrective action. These cases are filtered list view, +original list view, partial match and complete match of fields. + +**Input validation method for all fields** + +**What it does:**
+- Company name, recruiter name, role, phone number, email, application status and priority fields are validated to +ensure that they are not empty and that they follow the correct regex. +- Implemented specific REGEX to ensure that the phone number and email fields are in the correct format. + +**Justification:**
+Input validation allows us to validate duplicates, while allowing the user to see whatever they typed. This allows +for flexibility in the user interface, while ensuring that the user does not enter invalid inputs. + +**Test cases for the duplicate checking algorithm**
+Added close to 990 lines of test cases for the duplicate checking algorithm and the input validation fields +to ensure behaviour was as expected. + +## General +**Bug Fixes**: +* Fixed a [bug](https://github.com/AY2324S1-CS2103T-T17-2/tp/pull/232) where the duplicate detection algorithm gave a wrong output +* Fixed a bug where `Software Engineer 2` and `Software Engineer` were considered equals +* Sequence diagrams and Activity Diagrams [bug](https://github.com/AY2324S1-CS2103T-T17-2/tp/pull/322) fixes + +**Team Contributions**: +* PR's reviewed non-trivially + [#325](https://github.com/AY2324S1-CS2103T-T17-2/tp/pull/325), + [#287](https://github.com/AY2324S1-CS2103T-T17-2/tp/pull/287), + [#236](https://github.com/AY2324S1-CS2103T-T17-2/tp/pull/236) + +**Forum Enthusiast** +* Resolved other classmate's code related issues (examples: + [#104](https://github.com/nus-cs2103-AY2324S1/forum/issues/104#issuecomment-1706219015), + [#154](https://github.com/nus-cs2103-AY2324S1/forum/issues/154#issuecomment-1726817514), + [#170](https://github.com/nus-cs2103-AY2324S1/forum/issues/170#issuecomment-1730530807), + [#249](https://github.com/nus-cs2103-AY2324S1/forum/issues/249#issuecomment-1759469324)) +* Resolved a bug in the [JavaFX tutorial](https://se-education.org/guides/tutorials/javaFxPart1.html) + regarding a JavaFX MAC-OS dependency issue. Recommended a modification to build gradle to solve the issue + [#159](https://github.com/nus-cs2103-AY2324S1/forum/issues/159#issuecomment-1728708305) +* Questions asked in the forum (examples: + [#434](https://github.com/nus-cs2103-AY2324S1/forum/issues/434), + [#339](https://github.com/nus-cs2103-AY2324S1/forum/issues/339), + [#411](https://github.com/nus-cs2103-AY2324S1/forum/issues/411), + [#336](https://github.com/nus-cs2103-AY2324S1/forum/issues/336)) + +**PE-D Testing** +* Reported [10 bugs, of which 9 out of 10 were triaged](https://github.com/AY2324S1-CS2103T-T15-1/tp/issues?q=is%3Aissue+is%3Aclosed+AlagappanRa) +* Breakdown: 2 High, 2 Medium, 3 Low, 2 Very Low, 1 Rejected + +### Contributions to the UG: +The following sections from the UG were contributed by me: +1. **Features**: + - Duplicate detection algorithm: Added description, examples for the various errors that can arise +2. **Added FAQ**: + - Added questions 1 and 2 to the FAQ section. +3. **Introduction section** + - Added a section on the motivation behind LinkMeIn + - Quick summary of features +4. **Code block text size re-adjustment** + - Adjusted the code block text size to be smaller for better readability. + +### Contributions to the DG: +The following sections from the DG were contributed by me: +- Added activity & sequence diagrams for the duplicate checking algorithm +- Planned enhancements + - Remove the alphanumeric checks for the company name, recruiter name and role fields + - Expanding acceptance for phone number field +- Effort section + + diff --git a/docs/team/alientian.md b/docs/team/alientian.md new file mode 100644 index 00000000000..cc4f32eb706 --- /dev/null +++ b/docs/team/alientian.md @@ -0,0 +1,84 @@ +--- +layout: page +title: Lim En Tian's Project Portfolio Page +--- + +# Project: LinkMeIn + +## Overview + +LinkMeIn is a desktop address book application used to track computer science student's job applications to companies. +The user interacts with it using a CLI, and it has a GUI created with JavaFX. It is written in Java, and has about +~10 kLoC. + +The features in LinkMeIn can be categorised into 3 main categories: +1. **General features:** Navigating the application. Includes, help, exit and clear commands. +2. **Company management features:** Manage an entry of a company. Includes, add, delete, edit, view, remark and + unremark commands. +3. **Company list features:** Manage the list of companies added. Includes, list, find, sort and filter commands. + +## Summary of Contributions + +Given below are my contributions to the project. + +### Code contributed +You can find all the code I have contributed in [RepoSense](https://nus-cs2103-ay2324s1.github.io/tp-dashboard/?search=alientian&breakdown=false&sort=groupTitle%20dsc&sortWithin=title&since=2023-09-22&timeframe=commit&mergegroup=&groupSelect=groupByRepos). + +### Enhancements implemented + +#### 1. Implemented display of application details in the GUI +This enhancement adds a horizontal SplitPane to add a panel to show application details of all the fields input by user. +Users change the company viewed by clicking on the list of companies on the right panel. +This is later on enhanced by my team member, Ru Xin, to be controlled by the `view` command to adhere to our CLI app. +Edited `MainWinfow.fxml` to restructure the GUI and created `CompanyDetailCard.fxml` file to define structure of the panel added and its Java class to render the UI. + +#### 2. Implemented new feature: Remark feature +This allows users to write additional details to a specific application. +Created the `Remark` class to add a remark to the `Company` model. +`RemarkCommandParser` and `UnremarkCommandParser` classes are created to add and remove remarks respectively. +`RemarkCommand` class is also created so that both parser extends from `Parser`. +Test cases were added for all the classes created. + +#### 3. Modified the edit command +Edited the code for `edit` command so that the command can edit all the fields that we have added to the `Company` model. +The `edit` command should allow users to edit all the fields for more convenience and better user experience. +Added more checks in `EditCommandParser` to provide more specific error message for invalid inputs. +Test cases were edited to test for fields and error messages added. + +### **Contributions to the UG** + +- **CLI Description** : +Added an introduction to CLI for users to learn how to write commands. + +- **Features** : +Added description, examples, possible errors and images for the following features. +Tips, notes and warnings are also added if applicable. + - **Edit** + - **Remark** + - **Unremark** + - **Clear** + - **Exit** + +### **Contributions to the DG** + +- Added NFRs +- Added planned enhancements +- Added how Edit Command and Remark Command works under Implementation +- Created a UML sequence diagram to explain Edit Command +- Created a UML activity diagram to explain Remark Command + +### **Contributions to team-based tasks** + +- Created new issues under the issue tracker + +### **Review/Mentoring contributions** + +- Non-trivial PRs reviewed: +[\#145](https://github.com/AY2324S1-CS2103T-T17-2/tp/pull/145), +[\#232](https://github.com/AY2324S1-CS2103T-T17-2/tp/pull/232), +[\#274](https://github.com/AY2324S1-CS2103T-T17-2/tp/pull/274) + + +### **Contributions beyond the project team** + +- [Bugs reported during PE-D](https://github.com/alientian/ped/issues) diff --git a/docs/team/glendachong.md b/docs/team/glendachong.md new file mode 100644 index 00000000000..a5d991a4919 --- /dev/null +++ b/docs/team/glendachong.md @@ -0,0 +1,59 @@ +--- +layout: page +title: Glenda Chong Rui Ting's Project Portfolio Page +--- + +# Project: LinkMeIn + +LinkMeIn is a desktop address book application for NUS Computer Science students to track their internship applications. +The user interacts with it using a Command Line Interface (CLI), and it has a Graphical User Interface (GUI) created with JavaFX. It is written in Java, and has about +~10 kLoC. + +## Summary of Contributions + +Given below are my contributions to the project. + +* **Code Contributed:** The code that I have contributed can be found in this [RepoSense link](https://nus-cs2103-ay2324s1.github.io/tp-dashboard/?search=GlendaChong&sort=groupTitle&sortWithin=title&timeframe=commit&mergegroup=&groupSelect=groupByRepos&breakdown=true&checkedFileTypes=docs~functional-code~test-code&since=2023-09-22). + +* **New Feature: Filter Companies** + * **What it does:** Filters the list of companies by application status. + * **Justifications:** Users may wish to only view internship applications of a particular status. For example, they may wish to put more attention into applications that are pending interviews, so that they can prepare for the interviews. + * **Highlights:** The `filter` command relies on the new predicate, `ApplicationStatusPredicate`, to test if the company's application status matches the application status given by the user. The `filter` command also uses the updated `CompanyListPanel` to display the filtered list of companies. + +* **New Feature: Update GUI for `CompanyListPanel` and `CompanyDetailPanel`** + * **What it does:** `CompanyListPanel` and `CompanyDetailPanel` are of a similar colour theme. All the fields displayed will not be truncated, and will be soft-wrapped instead. + * **Justifications:** This update will improve the user experience of the GUI, and allow them to view the full information of the company. + +* **Enhancement to Existing Features:** + * **Enhance Error Messages for Fields in Company Model** + * **What it does:** For each field, there will be 2 main error messages, 1 for when the field is empty and 1 for when the field does not follow the valid regex. + * **Justifications:** The user needs to know exactly what is wrong with the input, and be able to correct it easily. + * **Highlights:** While the change was not difficult to implement, it was very tedious due to the large number of fields in the company model. It was very crucial to also not break the existing code base. + * **Enhance Existing `add` Command** + * **What it does:** The `add` command now accepts all the new fields added to the company model, including `Role`, `RecruiterName`, `ApplicationStatus` and `Deadline`. The error messages for the `add` command now also differentiates between empty inputs, invalid fields, or duplicate fields. + * **Justifications:** The `add` command is one of the most important commands in LinkMeIn. By adding more fields to the `add` command, it allows the user to add more information about the company. More specific error messages also allow the user to know exactly what is wrong with the input, and be able to correct it easily. + +* **Contributions to the UG** + * **Navigating the User Guide:** Add the annotations and icons using bootstrap alert icons. + * **Quick Start:** Improve on this section with step-by-step instructions, including adding more details and screenshots. + * **Features:** Add a company (`add`), List all companies (`list`), Filter companies by application status (`filter`) + * Include description of command, format, notes, tips, examples and possible errors. + * **Glossary:** Add definitions of key terms, parameters description, application status parameter description and email format description sections. + * **Command Summary:** Add the command summary table. + +* **Contributions to the DG** + * Add use cases. + * Add 3 planned enhancements. + * Add non-functional requirements. + * Add implementation details for `filter` and `add` commands. + * Add instructions for manual testing section. + +* **Contributions to Team-Based Tasks** + * Set up CodeCov for the project. + * Update landing page for the project website and AboutUs page. + * Manage milestones, change their due dates, and wrap-up milestones. + * Review PRs for the team regularly. + * Non-trivial PRs reviewed: [#271](https://github.com/AY2324S1-CS2103T-T17-2/tp/pull/271), [#261](https://github.com/AY2324S1-CS2103T-T17-2/tp/pull/261), [#226](https://github.com/AY2324S1-CS2103T-T17-2/tp/pull/226), [#156](https://github.com/AY2324S1-CS2103T-T17-2/tp/pull/156), [#169](https://github.com/AY2324S1-CS2103T-T17-2/tp/pull/169), [#142](https://github.com/AY2324S1-CS2103T-T17-2/tp/pull/142), [#135](https://github.com/AY2324S1-CS2103T-T17-2/tp/pull/135), [#109](https://github.com/AY2324S1-CS2103T-T17-2/tp/pull/109), [#104](https://github.com/AY2324S1-CS2103T-T17-2/tp/pull/104). + +* **Contributions beyond the Project Team** + * Extensive number of bugs reported for the other team's product during PE-D (28 bug reports) diff --git a/docs/team/johndoe.md b/docs/team/johndoe.md deleted file mode 100644 index 773a07794e2..00000000000 --- a/docs/team/johndoe.md +++ /dev/null @@ -1,46 +0,0 @@ ---- -layout: page -title: John Doe's Project Portfolio Page ---- - -### Project: AddressBook Level 3 - -AddressBook - Level 3 is a desktop address book application used for teaching Software Engineering principles. The user interacts with it using a CLI, and it has a GUI created with JavaFX. It is written in Java, and has about 10 kLoC. - -Given below are my contributions to the project. - -* **New Feature**: Added the ability to undo/redo previous commands. - * What it does: allows the user to undo all previous commands one at a time. Preceding undo commands can be reversed by using the redo command. - * Justification: This feature improves the product significantly because a user can make mistakes in commands and the app should provide a convenient way to rectify them. - * Highlights: This enhancement affects existing commands and commands to be added in future. It required an in-depth analysis of design alternatives. The implementation too was challenging as it required changes to existing commands. - * Credits: *{mention here if you reused any code/ideas from elsewhere or if a third-party library is heavily used in the feature so that a reader can make a more accurate judgement of how much effort went into the feature}* - -* **New Feature**: Added a history command that allows the user to navigate to previous commands using up/down keys. - -* **Code contributed**: [RepoSense link]() - -* **Project management**: - * Managed releases `v1.3` - `v1.5rc` (3 releases) on GitHub - -* **Enhancements to existing features**: - * Updated the GUI color scheme (Pull requests [\#33](), [\#34]()) - * Wrote additional tests for existing features to increase coverage from 88% to 92% (Pull requests [\#36](), [\#38]()) - -* **Documentation**: - * User Guide: - * Added documentation for the features `delete` and `find` [\#72]() - * Did cosmetic tweaks to existing documentation of features `clear`, `exit`: [\#74]() - * Developer Guide: - * Added implementation details of the `delete` feature. - -* **Community**: - * PRs reviewed (with non-trivial review comments): [\#12](), [\#32](), [\#19](), [\#42]() - * Contributed to forum discussions (examples: [1](), [2](), [3](), [4]()) - * Reported bugs and suggestions for other teams in the class (examples: [1](), [2](), [3]()) - * Some parts of the history feature I added was adopted by several other class mates ([1](), [2]()) - -* **Tools**: - * Integrated a third party library (Natty) to the project ([\#42]()) - * Integrated a new Github plugin (CircleCI) to the team repo - -* _{you can add/remove categories in the list above}_ diff --git a/docs/team/papataco14.md b/docs/team/papataco14.md new file mode 100644 index 00000000000..e2a3b70a4b0 --- /dev/null +++ b/docs/team/papataco14.md @@ -0,0 +1,100 @@ +--- +layout: page +title: Ramu Rithik Vijay's Project Portfolio Page +--- + +#### Project: LinkMeIn + +LinkMeIn - Is a desktop address book application made for NUS Computer Science students to track their internship +applications. The user interacts with it using a CLI, and it has a GUI created with JavaFX. It is written in Java, +and has about ~10 kLoC. + +The features in LinkMeIn can be categorised into 3 main categories: + +1. **General features:** Navigating the application. Includes, help, exit and clear commands. +2. **Company management features:** Manage an entry of a company. Includes, add, delete, edit, view, remark and unremark commands. +3. **Company list features:** Manage the list of companies added. Includes, list, find, sort and filter commands. + +Given below are my contributions to the project. +**Code contributed**: + +The code that I have contributed can be found in this [RepoSense link](https://nus-cs2103-ay2324s1.github.io/tp-dashboard/?search=papataco&breakdown=false&sort=groupTitle%20dsc&sortWithin=title&since=2023-09-22&timeframe=commit&mergegroup=&groupSelect=groupByRepos) + +#### Enhancements implemented: + +**1. Implemented the sort command.** + +**What it does:** + +The `sort` command organizes the list of companies by their respective deadlines, in either ascending or descending order. + +**Justification:** + +This feature was implemented to assist users in efficiently managing their application deadlines. It addresses the need for quick prioritization and helps prevent missing important deadlines by keeping the closest deadlines at the forefront. + +**Highlights:** + +- **Ease of Use**: Case-insensitive input and a default to the most commonly used sorting order (ascending). Also allow various other `SORT-ORDER` inputs such as `asc` and `desc` for fast typists. +- **Robust Error Handling**: Informs users of incorrect input and guides them towards correct usage. +- **Thorough Testing**: Ensured reliability and performance across diverse scenarios and data sets. + +**2. Implemented the find command.** + +**What it does:** + +The `find` command enables users to search for companies by keywords, with case-insensitive and partial matching capabilities. + +**Justification:** + +Implemented to enhance navigability and accessibility, this command allows users to locate companies quickly without exact name recall, significantly improving user experience. + +**Highlights:** + +- **Flexible Search**: Supports partial keyword matching for broader search results. +- **Case-Insensitive Logic**: Ensures user convenience by eliminating the need for precise casing. +- **Predicate Enhancement**: Modified `NameContainsKeywordsPredicate` for substring matching, boosting the command's functionality. +- **User-Centric Design**: Selected design alternatives aim for the optimal balance between flexibility and precision, prioritizing ease of use. + +**3. Modified the Deadline class** +Previously, the deadline field in the Deadline class was a string. I have modified this to be a java LocalDate object for better date time management. I also modified the validation regex and error messages to distinguish between invalid date formats and invalid dates. For implementation of the sorting functionality, instead of having the basis of comparison between deadlines being defined in the sort method, I have modified the Deadline class to implement the comparable interface and defined the basis of comparison within the Deadline class itself. This allows for simpler code and better abstraction. + +**4. Refactor person to company** +Changed the person model to company model for better OOP at the start of the project. + +#### Contribution to the UG: + +The following sections from the UG were contributed by me: + +1. Features: + - Sort command: Added description, examples and possible errors for the sort command. + - Find a company: Added description, examples and possible error for the find command. +2. Added known issues +3. Added FAQ: + - How do I load data from another computer? + - How do I open up my terminal? + +#### Contribution to the DG: + +- Updated the models to use Company instead of Person +- Added a sequence diagram for the find command implementation discussion +- Added uses cases for sorting by deadline +- Reordered the user stories table to be in order of priority + +#### Contribution to team-based tasks: + +- Created the developers team in our team organization and linked the team repo to it. +- Created additional labels for bug triaging for the project. +- Created a release template for the project and managed two releases, v1.2.0 and v1.3.0. +- Created a pull request template for the project. +- Maintained the GitHub issues page to remove duplicates and close issues that are no longer relevant. + +#### Review/mentoring contributions: + +- PRs reviewed: + - [#107](https://github.com/AY2324S1-CS2103T-T17-2/tp/pull/107), [#92](https://github.com/AY2324S1-CS2103T-T17-2/tp/pull/92), [#140](https://github.com/AY2324S1-CS2103T-T17-2/tp/pull/140), [#167](https://github.com/AY2324S1-CS2103T-T17-2/tp/pull/167) + +#### Contributions beyond the project team: + +- Bugs reported for the other team during PE-D: [link to issues](https://github.com/papataco14/ped/issues) +- Helped others on the forum with smoke testing on Windows [link to forum post](https://github.com/nus-cs2103-AY2324S1/forum/issues/218) +- Suggested a fix for better code in course textbook website [link to issue](https://github.com/nus-cs2103-AY2324S1/website/issues/2) diff --git a/docs/team/tayruxin.md b/docs/team/tayruxin.md new file mode 100644 index 00000000000..2bcd4a33f20 --- /dev/null +++ b/docs/team/tayruxin.md @@ -0,0 +1,97 @@ +--- +layout: page +title: Tay Ru Xin's Project Portfolio Page +--- + +# Project: LinkMeIn + +LinkMeIn - Is a desktop address book application made for computer science to +their internship application. +The user interacts with it using a CLI, and it has a +GUI created with JavaFX. It is written in Java, and has about +~10 kLoC. + +The features in LinkMeIn can be categorised into 3 main categories: +1. **General features:** Navigating the application. Includes, help, exit and clear commands. +2. **Company management features:** Manage an entry of a company. Includes, add, delete, edit, view, remark and unremark commands. +3. **Company list features:** Manage the list of companies added. Includes, list, find, sort and filter commands. + +Given below are my contributions to the project. + +## **Code contributed**: +The code that I have contributed can be found in this [RepoSense link](https://nus-cs2103-ay2324s1.github.io/tp-dashboard/?search=tayruxin&breakdown=false&sort=groupTitle%20dsc&sortWithin=title&since=2023-09-22&timeframe=commit&mergegroup=&groupSelect=groupByRepos) + +## Enhancements implemented: + +**1. Implemented the view command.** + +Created a new command class `ViewCommand` to handle the view command. A new parser class `ViewCommandParser` was created to handle the parsing of the view command. +Furthermore, a new UniqueCompanyList was created in `AddressBook` to store the +filtered company list which will contain the company that the user wish to view. Test cases were added to test the view command. + +**2. Enhance error message for invalid index** + +Previously, when checking for invalid index, the error message is the same regardless of whether the index is out of bounds or the index is not a positive integer. + +I have enhanced the error message to be more specific to the error. I have added new methods in `String.util` to check if the index passed is an integer with the +`isInteger` method. + +**3. Added the company detail panel and company detail card to the GUI.** + +Previously, the GUI only shows the list of companies that the user have. I have added a `CompanyDetailPanel` which extends `UiPart` to the GUI. +Furthermore, I have added `CompanyDetailPanel.fxml` to the GUI. + + +**4. Added the priority field to company model.** + +A new priority field was added to the company model. I have made the priority filed optional. When the user adds a company +without indicated the priority, the priority will be set to `none`. + +**5. Added the application status field to company model.** + +A new application status field was added to the company model. The application status is an enums with 5 possible values. + +**6. Delete address field from the company model.** + +The address field was deleted from the company model as the address field was not used in any of the commands. Address field was also removed in all the various +test cases. + +## Contribution to the UG: + +The following sections from the UG were contributed by me: +1. **Introducing LinkMeIn's User Interface:** Added an intro to LinkMeIn's GUI. +2. **Navigating the User Guide:** Added a section on how to navigate the UG, which includes symbols used and how the user guide is catered for all levels of users. +3. **Quick Start:** Added this section to teach user how to download and set-up LinkMeIn. +4. **Introducing LinkMeIn: A quick tour:** Added this section to teach first-time users how to use the application. Included features like +add, view, delete, edit and clear. +5. Features: + - View full company information: Added description, examples and possible errors for the view command. + - Delete a company: Added description, examples and possible error for the delete command. +6. Added FAQ: + - How do I check if I have Java 11 installed? + - How do I open up my terminal? + - What is an invalid index? + +## Contribution to the DG: +- Added use cases into the DG. +- Added planned enhancements into the DG. +- Added a UML sequence diagram for the view command into the DG. +- Added a UML Activity diagram for the view command into the DG. +- Elaborated on how the View command works in the DG. + +## Contribution to team-based tasks: +- Set up the team repo and organisation on GitHub. +- Created the labels that are required for the project. +- Set up the project board in GitHub for user stories. +- Help to enable assertion in the team repo (in `build.gradle`). + +## Review/mentoring contributions: +- PRs reviewed: + - [\#135](https://github.com/AY2324S1-CS2103T-T17-2/tp/pull/135), [\#111](https://github.com/AY2324S1-CS2103T-T17-2/tp/pull/111), +[\#89](https://github.com/AY2324S1-CS2103T-T17-2/tp/pull/89), [\#110](https://github.com/AY2324S1-CS2103T-T17-2/tp/pull/110), +[\#147](https://github.com/AY2324S1-CS2103T-T17-2/tp/pull/147), +[\#105](https://github.com/AY2324S1-CS2103T-T17-2/tp/pull/105) + +## Contributions beyond the project team: +- Bugs reported for the other team during PE-D: [link to issues](https://github.com/tayruxin/ped/issues) + diff --git a/docs/tutorials/AddRemark.md b/docs/tutorials/AddRemark.md deleted file mode 100644 index d98f38982e7..00000000000 --- a/docs/tutorials/AddRemark.md +++ /dev/null @@ -1,399 +0,0 @@ ---- -layout: page -title: "Tutorial: Adding a command" ---- - -Let's walk you through the implementation of a new command — `remark`. - -This command allows users of the AddressBook application to add optional remarks to people in their address book and edit it if required. The command should have the following format: - -`remark INDEX r/REMARK` (e.g., `remark 2 r/Likes baseball`) - -We’ll assume that you have already set up the development environment as outlined in the Developer’s Guide. - - -## Create a new `remark` command - -Looking in the `logic.command` package, you will notice that each existing command have their own class. All the commands inherit from the abstract class `Command` which means that they must override `execute()`. Each `Command` returns an instance of `CommandResult` upon success and `CommandResult#feedbackToUser` is printed to the `ResultDisplay`. - -Let’s start by creating a new `RemarkCommand` class in the `src/main/java/seedu/address/logic/command` directory. - -For now, let’s keep `RemarkCommand` as simple as possible and print some output. We accomplish that by returning a `CommandResult` with an accompanying message. - -**`RemarkCommand.java`:** - -``` java -package seedu.address.logic.commands; - -import seedu.address.model.Model; - -/** - * Changes the remark of an existing person in the address book. - */ -public class RemarkCommand extends Command { - - public static final String COMMAND_WORD = "remark"; - - @Override - public CommandResult execute(Model model) { - return new CommandResult("Hello from remark"); - } -} -``` - -### Hook `RemarkCommand` into the application - -Now that we have our `RemarkCommand` ready to be executed, we need to update `AddressBookParser#parseCommand()` to recognize the `remark` keyword. Add the new command to the `switch` block by creating a new `case` that returns a new instance of `RemarkCommand`. - -You can refer to the changes in this [diff](https://github.com/se-edu/addressbook-level3/commit/35eb7286f18a029d39cb7a29df8f172a001e4fd8#diff-399c284cb892c20b7c04a69116fcff6ccc0666c5230a1db8e4a9145def8fa4ee). - -### Run the application - -Run `Main#main` and try out your new `RemarkCommand`. If everything went well, you should see something like this: - -![Output displayed](../images/add-remark/RemarkHello.png) - -## Change `RemarkCommand` to throw an exception - -While we have successfully printed a message to `ResultDisplay`, the command does not do what it is supposed to do. Let’s change the command to throw a `CommandException` to accurately reflect that our command is still a work in progress. - -![The relationship between RemarkCommand and Command](../images/add-remark/RemarkCommandClass.png) - -Following the convention in other commands, we add relevant messages as constants and use them. - -**`RemarkCommand.java`:** - -``` java - public static final String MESSAGE_USAGE = COMMAND_WORD - + ": Edits the remark of the person identified " - + "by the index number used in the last person listing. " - + "Existing remark will be overwritten by the input.\n" - + "Parameters: INDEX (must be a positive integer) " - + "r/ [REMARK]\n" - + "Example: " + COMMAND_WORD + " 1 " - + "r/ Likes to swim."; - - public static final String MESSAGE_NOT_IMPLEMENTED_YET = - "Remark command not implemented yet"; - - @Override - public CommandResult execute(Model model) throws CommandException { - throw new CommandException(MESSAGE_NOT_IMPLEMENTED_YET); - } -``` - -## Enhancing `RemarkCommand` - -Let’s change `RemarkCommand` to parse input from the user. - -### Make the command accept parameters - -We start by modifying the constructor of `RemarkCommand` to accept an `Index` and a `String`. While we are at it, let’s change the error message to echo the values. While this is not a replacement for tests, it is an obvious way to tell if our code is functioning as intended. - -``` java -import static seedu.address.commons.util.CollectionUtil.requireAllNonNull; -//... -public class RemarkCommand extends Command { - //... - public static final String MESSAGE_ARGUMENTS = "Index: %1$d, Remark: %2$s"; - - private final Index index; - private final String remark; - - /** - * @param index of the person in the filtered person list to edit the remark - * @param remark of the person to be updated to - */ - public RemarkCommand(Index index, String remark) { - requireAllNonNull(index, remark); - - this.index = index; - this.remark = remark; - } - @Override - public CommandResult execute(Model model) throws CommandException { - throw new CommandException( - String.format(MESSAGE_ARGUMENTS, index.getOneBased(), remark)); - } - - @Override - public boolean equals(Object other) { - if (other == this) { - return true; - } - - // instanceof handles nulls - if (!(other instanceof RemarkCommand)) { - return false; - } - - RemarkCommand e = (RemarkCommand) other; - return index.equals(e.index) - && remark.equals(e.remark); - } -} -``` - -Your code should look something like [this](https://github.com/se-edu/addressbook-level3/commit/dc6d5139d08f6403da0ec624ea32bd79a2ae0cbf#diff-a8e35af8f9c251525063fae36c9852922a7e7195763018eacec60f3a4d87c594) after you are done. - -### Parse user input - -Now let’s move on to writing a parser that will extract the index and remark from the input provided by the user. - -Create a `RemarkCommandParser` class in the `seedu.address.logic.parser` package. The class must extend the `Parser` interface. - -![The relationship between Parser and RemarkCommandParser](../images/add-remark/RemarkCommandParserClass.png) - -Thankfully, `ArgumentTokenizer#tokenize()` makes it trivial to parse user input. Let’s take a look at the JavaDoc provided for the function to understand what it does. - -**`ArgumentTokenizer.java`:** - -``` java -/** - * Tokenizes an arguments string and returns an {@code ArgumentMultimap} - * object that maps prefixes to their respective argument values. Only the - * given prefixes will be recognized in the arguments string. - * - * @param argsString Arguments string of the form: - * {@code preamble value value ...} - * @param prefixes Prefixes to tokenize the arguments string with - * @return ArgumentMultimap object that maps prefixes to their - * arguments - */ -``` - -We can tell `ArgumentTokenizer#tokenize()` to look out for our new prefix `r/` and it will return us an instance of `ArgumentMultimap`. Now let’s find out what we need to do in order to obtain the Index and String that we need. Let’s look through `ArgumentMultimap` : - -**`ArgumentMultimap.java`:** - -``` java -/** - * Returns the last value of {@code prefix}. - */ -public Optional getValue(Prefix prefix) { - List values = getAllValues(prefix); - return values.isEmpty() ? Optional.empty() : - Optional.of(values.get(values.size() - 1)); -} -``` - -This appears to be what we need to get a String of the remark. But what about the Index? Let's take a quick peek at existing `Command` that uses an index to see how it is done. - -**`DeleteCommandParser.java`:** - -``` java -Index index = ParserUtil.parseIndex(args); -return new DeleteCommand(index); -``` - -There appears to be another utility class that obtains an `Index` from the input provided by the user. - -Now that we have the know-how to extract the data that we need from the user’s input, we can parse the user command and create a new instance of `RemarkCommand`, as given below. - -**`RemarkCommandParser.java`:** - -``` java -public RemarkCommand parse(String args) throws ParseException { - requireNonNull(args); - ArgumentMultimap argMultimap = ArgumentTokenizer.tokenize(args, - PREFIX_REMARK); - - Index index; - try { - index = ParserUtil.parseIndex(argMultimap.getPreamble()); - } catch (IllegalValueException ive) { - throw new ParseException(String.format(MESSAGE_INVALID_COMMAND_FORMAT, - RemarkCommand.MESSAGE_USAGE), ive); - } - - String remark = argMultimap.getValue(PREFIX_REMARK).orElse(""); - - return new RemarkCommand(index, remark); -} -``` - -
- -:information_source: Don’t forget to update `AddressBookParser` to use our new `RemarkCommandParser`! - -
- -If you are stuck, check out the sample -[here](https://github.com/se-edu/addressbook-level3/commit/dc6d5139d08f6403da0ec624ea32bd79a2ae0cbf#diff-8bf239e8e9529369b577701303ddd96af93178b4ed6735f91c2d8488b20c6b4a). - -## Add `Remark` to the model - -Now that we have all the information that we need, let’s lay the groundwork for propagating the remarks added into the in-memory storage of person data. We achieve that by working with the `Person` model. Each field in a Person is implemented as a separate class (e.g. a `Name` object represents the person’s name). That means we should add a `Remark` class so that we can use a `Remark` object to represent a remark given to a person. - -### Add a new `Remark` class - -Create a new `Remark` in `seedu.address.model.person`. Since a `Remark` is a field that is similar to `Address`, we can reuse a significant bit of code. - -A copy-paste and search-replace later, you should have something like [this](https://github.com/se-edu/addressbook-level3/commit/4516e099699baa9e2d51801bd26f016d812dedcc#diff-41bb13c581e280c686198251ad6cc337cd5e27032772f06ed9bf7f1440995ece). Note how `Remark` has no constrains and thus does not require input -validation. - -### Make use of `Remark` - -Let’s change `RemarkCommand` and `RemarkCommandParser` to use the new `Remark` class instead of plain `String`. These should be relatively simple changes. - -## Add a placeholder element for remark to the UI - -Without getting too deep into `fxml`, let’s go on a 5 minute adventure to get some placeholder text to show up for each person. - -Simply add the following to [`seedu.address.ui.PersonCard`](https://github.com/se-edu/addressbook-level3/commit/850b78879582f38accb05dd20c245963c65ea599#diff-639834f1e05afe2276a86372adf0fe5f69314642c2d93cfa543d614ce5a76688). - -**`PersonCard.java`:** - -``` java -@FXML -private Label remark; -``` - - -`@FXML` is an annotation that marks a private or protected field and makes it accessible to FXML. It might sound like Greek to you right now, don’t worry — we will get back to it later. - -Then insert the following into [`main/resources/view/PersonListCard.fxml`](https://github.com/se-edu/addressbook-level3/commit/850b78879582f38accb05dd20c245963c65ea599#diff-d44c4f51c24f6253c277a2bb9bc440b8064d9c15ad7cb7ceda280bca032efce9). - -**`PersonListCard.fxml`:** - -``` xml -