diff --git a/AY2324S2-CS2103-F08-4_tp_master/authorship.json b/AY2324S2-CS2103-F08-4_tp_master/authorship.json index 64ea484d..b27931c0 100644 --- a/AY2324S2-CS2103-F08-4_tp_master/authorship.json +++ b/AY2324S2-CS2103-F08-4_tp_master/authorship.json @@ -1 +1 @@ -[{"path":"README.md","fileType":"docs","lines":[{"lineNumber":1,"author":{"gitId":"joelgoh1"},"content":"[![CI Status](https://github.com/se-edu/addressbook-level3/workflows/Java%20CI/badge.svg)](https://github.com/AY2324S2-CS2103-F08-4/tp/actions)","lastModifiedDate":"2024-03-07"},{"lineNumber":2,"author":{"gitId":"amanzainal"},"content":"[![codecov](https://codecov.io/gh/AY2324S2-CS2103-F08-4/tp/graph/badge.svg?token\u003dMYL7SH6BMO)](https://codecov.io/gh/AY2324S2-CS2103-F08-4/tp)","lastModifiedDate":"2024-03-05"},{"lineNumber":3,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":4,"author":{"gitId":"-"},"content":"![Ui](docs/images/Ui.png)","lastModifiedDate":"2020-05-23"},{"lineNumber":5,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":6,"author":{"gitId":"joelgoh1"},"content":"# TutorTrack","lastModifiedDate":"2024-03-07"},{"lineNumber":7,"author":{"gitId":"joelgoh1"},"content":"TutorTrack provides fast access to tutors\u0027 students contact details, optimized for users who prefer a CLI-driven interface. This serves as a powerful contact management tool designed for academic and professional use by streamlining tasks and enhancing organization.","lastModifiedDate":"2024-03-07"},{"lineNumber":8,"author":{"gitId":"joelgoh1"},"content":"","lastModifiedDate":"2024-03-07"},{"lineNumber":9,"author":{"gitId":"joelgoh1"},"content":"## Features","lastModifiedDate":"2024-03-07"},{"lineNumber":10,"author":{"gitId":"joelgoh1"},"content":"* Tutors can add and edit their student\u0027s contact, storing important information like name, phone number, email, adress, tag and grades","lastModifiedDate":"2024-03-07"},{"lineNumber":11,"author":{"gitId":"joelgoh1"},"content":"* Tutors can search for specific students","lastModifiedDate":"2024-03-07"},{"lineNumber":12,"author":{"gitId":"joelgoh1"},"content":"* Tutors can delete old student\u0027s contacts","lastModifiedDate":"2024-03-07"},{"lineNumber":13,"author":{"gitId":"joelgoh1"},"content":"* Tutors can view all their current students","lastModifiedDate":"2024-03-07"},{"lineNumber":14,"author":{"gitId":"joelgoh1"},"content":"","lastModifiedDate":"2024-03-07"},{"lineNumber":15,"author":{"gitId":"joelgoh1"},"content":"## Documentation","lastModifiedDate":"2024-03-07"},{"lineNumber":16,"author":{"gitId":"joelgoh1"},"content":"For the detailed documentation of this project, see the **[TutorTrack Product Website](https://ay2324s2-cs2103-f08-4.github.io/tp/)**.","lastModifiedDate":"2024-03-07"},{"lineNumber":17,"author":{"gitId":"joelgoh1"},"content":"","lastModifiedDate":"2024-03-07"},{"lineNumber":18,"author":{"gitId":"joelgoh1"},"content":"## Credits","lastModifiedDate":"2024-03-07"},{"lineNumber":19,"author":{"gitId":"joelgoh1"},"content":"This project is based on the AddressBook-Level3 project created by the [SE-EDU initiative](https://se-education.org).","lastModifiedDate":"2024-03-07"}],"authorContributionMap":{"joelgoh1":15,"-":3,"amanzainal":1}},{"path":"docs/DeveloperGuide.md","fileType":"docs","lines":[{"lineNumber":1,"author":{"gitId":"-"},"content":"---","lastModifiedDate":"2020-05-23"},{"lineNumber":2,"author":{"gitId":"-"},"content":" layout: default.md","lastModifiedDate":"2023-09-12"},{"lineNumber":3,"author":{"gitId":"-"},"content":" title: \"Developer Guide\"","lastModifiedDate":"2023-09-12"},{"lineNumber":4,"author":{"gitId":"-"},"content":" pageNav: 3","lastModifiedDate":"2023-09-12"},{"lineNumber":5,"author":{"gitId":"-"},"content":"---","lastModifiedDate":"2020-05-23"},{"lineNumber":6,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2023-09-12"},{"lineNumber":7,"author":{"gitId":"joelgoh1"},"content":"# TutorTrack Developer Guide","lastModifiedDate":"2024-03-07"},{"lineNumber":8,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2023-09-12"},{"lineNumber":9,"author":{"gitId":"-"},"content":"\u003c!-- * Table of Contents --\u003e","lastModifiedDate":"2023-09-12"},{"lineNumber":10,"author":{"gitId":"-"},"content":"\u003cpage-nav-print /\u003e","lastModifiedDate":"2023-09-12"},{"lineNumber":11,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":12,"author":{"gitId":"-"},"content":"--------------------------------------------------------------------------------------------------------------------","lastModifiedDate":"2020-05-23"},{"lineNumber":13,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2021-07-30"},{"lineNumber":14,"author":{"gitId":"-"},"content":"## **Acknowledgements**","lastModifiedDate":"2021-07-30"},{"lineNumber":15,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2021-07-30"},{"lineNumber":16,"author":{"gitId":"joelgoh1"},"content":"This project is based on the AddressBook-Level3 project created by the [SE-EDU initiative](https://se-education.org)","lastModifiedDate":"2024-03-07"},{"lineNumber":17,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2021-07-30"},{"lineNumber":18,"author":{"gitId":"-"},"content":"--------------------------------------------------------------------------------------------------------------------","lastModifiedDate":"2021-07-30"},{"lineNumber":19,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":20,"author":{"gitId":"-"},"content":"## **Setting up, getting started**","lastModifiedDate":"2020-05-23"},{"lineNumber":21,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":22,"author":{"gitId":"-"},"content":"Refer to the guide [_Setting up and getting started_](SettingUp.md).","lastModifiedDate":"2020-05-23"},{"lineNumber":23,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":24,"author":{"gitId":"-"},"content":"--------------------------------------------------------------------------------------------------------------------","lastModifiedDate":"2020-05-23"},{"lineNumber":25,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":26,"author":{"gitId":"-"},"content":"## **Design**","lastModifiedDate":"2020-05-23"},{"lineNumber":27,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":28,"author":{"gitId":"-"},"content":"### Architecture","lastModifiedDate":"2021-07-31"},{"lineNumber":29,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":30,"author":{"gitId":"-"},"content":"\u003cpuml src\u003d\"diagrams/ArchitectureDiagram.puml\" width\u003d\"280\" /\u003e","lastModifiedDate":"2023-09-12"},{"lineNumber":31,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":32,"author":{"gitId":"-"},"content":"The ***Architecture Diagram*** given above explains the high-level design of the App.","lastModifiedDate":"2021-07-31"},{"lineNumber":33,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":34,"author":{"gitId":"-"},"content":"Given below is a quick overview of main components and how they interact with each other.","lastModifiedDate":"2021-07-31"},{"lineNumber":35,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2021-07-31"},{"lineNumber":36,"author":{"gitId":"-"},"content":"**Main components of the architecture**","lastModifiedDate":"2021-07-31"},{"lineNumber":37,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":38,"author":{"gitId":"-"},"content":"**`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.","lastModifiedDate":"2023-09-03"},{"lineNumber":39,"author":{"gitId":"-"},"content":"* At app launch, it initializes the other components in the correct sequence, and connects them up with each other.","lastModifiedDate":"2023-09-03"},{"lineNumber":40,"author":{"gitId":"-"},"content":"* At shut down, it shuts down the other components and invokes cleanup methods where necessary.","lastModifiedDate":"2023-09-03"},{"lineNumber":41,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":42,"author":{"gitId":"-"},"content":"The bulk of the app\u0027s work is done by the following four components:","lastModifiedDate":"2023-09-03"},{"lineNumber":43,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":44,"author":{"gitId":"-"},"content":"* [**`UI`**](#ui-component): The UI of the App.","lastModifiedDate":"2020-05-23"},{"lineNumber":45,"author":{"gitId":"-"},"content":"* [**`Logic`**](#logic-component): The command executor.","lastModifiedDate":"2020-05-23"},{"lineNumber":46,"author":{"gitId":"-"},"content":"* [**`Model`**](#model-component): Holds the data of the App in memory.","lastModifiedDate":"2020-05-23"},{"lineNumber":47,"author":{"gitId":"-"},"content":"* [**`Storage`**](#storage-component): Reads data from, and writes data to, the hard disk.","lastModifiedDate":"2020-05-23"},{"lineNumber":48,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":49,"author":{"gitId":"-"},"content":"[**`Commons`**](#common-classes) represents a collection of classes used by multiple other components.","lastModifiedDate":"2023-09-03"},{"lineNumber":50,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":51,"author":{"gitId":"-"},"content":"**How the architecture components interact with each other**","lastModifiedDate":"2020-05-23"},{"lineNumber":52,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":53,"author":{"gitId":"-"},"content":"The *Sequence Diagram* below shows how the components interact with each other for the scenario where the user issues the command `delete 1`.","lastModifiedDate":"2020-05-23"},{"lineNumber":54,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":55,"author":{"gitId":"-"},"content":"\u003cpuml src\u003d\"diagrams/ArchitectureSequenceDiagram.puml\" width\u003d\"574\" /\u003e","lastModifiedDate":"2023-09-12"},{"lineNumber":56,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":57,"author":{"gitId":"-"},"content":"Each of the four main components (also shown in the diagram above),","lastModifiedDate":"2021-07-31"},{"lineNumber":58,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2021-07-31"},{"lineNumber":59,"author":{"gitId":"-"},"content":"* defines its *API* in an `interface` with the same name as the Component.","lastModifiedDate":"2021-07-31"},{"lineNumber":60,"author":{"gitId":"-"},"content":"* implements its functionality using a concrete `{Component Name}Manager` class (which follows the corresponding API `interface` mentioned in the previous point.","lastModifiedDate":"2021-07-31"},{"lineNumber":61,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2021-07-31"},{"lineNumber":62,"author":{"gitId":"-"},"content":"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\u0027s being coupled to the implementation of a component), as illustrated in the (partial) class diagram below.","lastModifiedDate":"2021-07-31"},{"lineNumber":63,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2021-07-31"},{"lineNumber":64,"author":{"gitId":"-"},"content":"\u003cpuml src\u003d\"diagrams/ComponentManagers.puml\" width\u003d\"300\" /\u003e","lastModifiedDate":"2023-09-12"},{"lineNumber":65,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2021-07-31"},{"lineNumber":66,"author":{"gitId":"-"},"content":"The sections below give more details of each component.","lastModifiedDate":"2020-05-23"},{"lineNumber":67,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":68,"author":{"gitId":"-"},"content":"### UI component","lastModifiedDate":"2020-05-23"},{"lineNumber":69,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":70,"author":{"gitId":"-"},"content":"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)","lastModifiedDate":"2021-07-31"},{"lineNumber":71,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":72,"author":{"gitId":"-"},"content":"\u003cpuml src\u003d\"diagrams/UiClassDiagram.puml\" alt\u003d\"Structure of the UI Component\"/\u003e","lastModifiedDate":"2023-09-12"},{"lineNumber":73,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":74,"author":{"gitId":"-"},"content":"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.","lastModifiedDate":"2021-07-31"},{"lineNumber":75,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":76,"author":{"gitId":"-"},"content":"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)","lastModifiedDate":"2021-07-31"},{"lineNumber":77,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":78,"author":{"gitId":"-"},"content":"The `UI` component,","lastModifiedDate":"2020-05-23"},{"lineNumber":79,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":80,"author":{"gitId":"-"},"content":"* executes user commands using the `Logic` component.","lastModifiedDate":"2021-07-31"},{"lineNumber":81,"author":{"gitId":"-"},"content":"* listens for changes to `Model` data so that the UI can be updated with the modified data.","lastModifiedDate":"2021-07-31"},{"lineNumber":82,"author":{"gitId":"-"},"content":"* keeps a reference to the `Logic` component, because the `UI` relies on the `Logic` to execute commands.","lastModifiedDate":"2021-07-31"},{"lineNumber":83,"author":{"gitId":"-"},"content":"* depends on some classes in the `Model` component, as it displays `Person` object residing in the `Model`.","lastModifiedDate":"2021-07-31"},{"lineNumber":84,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":85,"author":{"gitId":"-"},"content":"### Logic component","lastModifiedDate":"2020-05-23"},{"lineNumber":86,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":87,"author":{"gitId":"-"},"content":"**API** : [`Logic.java`](https://github.com/se-edu/addressbook-level3/tree/master/src/main/java/seedu/address/logic/Logic.java)","lastModifiedDate":"2021-07-31"},{"lineNumber":88,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":89,"author":{"gitId":"-"},"content":"Here\u0027s a (partial) class diagram of the `Logic` component:","lastModifiedDate":"2021-07-31"},{"lineNumber":90,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":91,"author":{"gitId":"-"},"content":"\u003cpuml src\u003d\"diagrams/LogicClassDiagram.puml\" width\u003d\"550\"/\u003e","lastModifiedDate":"2023-09-12"},{"lineNumber":92,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":93,"author":{"gitId":"-"},"content":"The sequence diagram below illustrates the interactions within the `Logic` component, taking `execute(\"delete 1\")` API call as an example.","lastModifiedDate":"2023-09-03"},{"lineNumber":94,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":95,"author":{"gitId":"-"},"content":"\u003cpuml src\u003d\"diagrams/DeleteSequenceDiagram.puml\" alt\u003d\"Interactions Inside the Logic Component for the `delete 1` Command\" /\u003e","lastModifiedDate":"2023-09-12"},{"lineNumber":96,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2023-09-12"},{"lineNumber":97,"author":{"gitId":"-"},"content":"\u003cbox type\u003d\"info\" seamless\u003e","lastModifiedDate":"2023-09-12"},{"lineNumber":98,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":99,"author":{"gitId":"-"},"content":"**Note:** The lifeline for `DeleteCommandParser` should end at the destroy marker (X) but due to a limitation of PlantUML, the lifeline continues till the end of diagram.","lastModifiedDate":"2023-09-12"},{"lineNumber":100,"author":{"gitId":"-"},"content":"\u003c/box\u003e","lastModifiedDate":"2023-09-12"},{"lineNumber":101,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":102,"author":{"gitId":"-"},"content":"How the `Logic` component works:","lastModifiedDate":"2023-09-03"},{"lineNumber":103,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2023-09-03"},{"lineNumber":104,"author":{"gitId":"-"},"content":"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.","lastModifiedDate":"2023-09-03"},{"lineNumber":105,"author":{"gitId":"-"},"content":"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`.","lastModifiedDate":"2023-09-03"},{"lineNumber":106,"author":{"gitId":"-"},"content":"1. The command can communicate with the `Model` when it is executed (e.g. to delete a person).\u003cbr\u003e","lastModifiedDate":"2024-02-09"},{"lineNumber":107,"author":{"gitId":"-"},"content":" Note that although this is shown as a single step in the diagram above (for simplicity), in the code it can take several interactions (between the command object and the `Model`) to achieve.","lastModifiedDate":"2024-02-09"},{"lineNumber":108,"author":{"gitId":"-"},"content":"1. The result of the command execution is encapsulated as a `CommandResult` object which is returned back from `Logic`.","lastModifiedDate":"2023-09-03"},{"lineNumber":109,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2023-09-03"},{"lineNumber":110,"author":{"gitId":"-"},"content":"Here are the other classes in `Logic` (omitted from the class diagram above) that are used for parsing a user command:","lastModifiedDate":"2021-07-31"},{"lineNumber":111,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2021-07-31"},{"lineNumber":112,"author":{"gitId":"-"},"content":"\u003cpuml src\u003d\"diagrams/ParserClasses.puml\" width\u003d\"600\"/\u003e","lastModifiedDate":"2023-09-12"},{"lineNumber":113,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":114,"author":{"gitId":"-"},"content":"How the parsing works:","lastModifiedDate":"2021-07-31"},{"lineNumber":115,"author":{"gitId":"-"},"content":"* 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.","lastModifiedDate":"2021-07-31"},{"lineNumber":116,"author":{"gitId":"-"},"content":"* 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.","lastModifiedDate":"2021-07-31"},{"lineNumber":117,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":118,"author":{"gitId":"-"},"content":"### Model component","lastModifiedDate":"2021-07-31"},{"lineNumber":119,"author":{"gitId":"-"},"content":"**API** : [`Model.java`](https://github.com/se-edu/addressbook-level3/tree/master/src/main/java/seedu/address/model/Model.java)","lastModifiedDate":"2020-05-23"},{"lineNumber":120,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":121,"author":{"gitId":"-"},"content":"\u003cpuml src\u003d\"diagrams/ModelClassDiagram.puml\" width\u003d\"450\" /\u003e","lastModifiedDate":"2023-09-12"},{"lineNumber":122,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":123,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":124,"author":{"gitId":"-"},"content":"The `Model` component,","lastModifiedDate":"2021-07-31"},{"lineNumber":125,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":126,"author":{"gitId":"-"},"content":"* stores the address book data i.e., all `Person` objects (which are contained in a `UniquePersonList` object).","lastModifiedDate":"2021-07-31"},{"lineNumber":127,"author":{"gitId":"-"},"content":"* stores the currently \u0027selected\u0027 `Person` objects (e.g., results of a search query) as a separate _filtered_ list which is exposed to outsiders as an unmodifiable `ObservableList\u003cPerson\u003e` that can be \u0027observed\u0027 e.g. the UI can be bound to this list so that the UI automatically updates when the data in the list change.","lastModifiedDate":"2021-07-31"},{"lineNumber":128,"author":{"gitId":"-"},"content":"* stores a `UserPref` object that represents the user’s preferences. This is exposed to the outside as a `ReadOnlyUserPref` objects.","lastModifiedDate":"2021-07-31"},{"lineNumber":129,"author":{"gitId":"-"},"content":"* 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)","lastModifiedDate":"2021-07-31"},{"lineNumber":130,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2021-07-31"},{"lineNumber":131,"author":{"gitId":"-"},"content":"\u003cbox type\u003d\"info\" seamless\u003e","lastModifiedDate":"2023-09-12"},{"lineNumber":132,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2023-09-12"},{"lineNumber":133,"author":{"gitId":"-"},"content":"**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.\u003cbr\u003e","lastModifiedDate":"2023-09-12"},{"lineNumber":134,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2021-07-31"},{"lineNumber":135,"author":{"gitId":"-"},"content":"\u003cpuml src\u003d\"diagrams/BetterModelClassDiagram.puml\" width\u003d\"450\" /\u003e","lastModifiedDate":"2023-09-12"},{"lineNumber":136,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":137,"author":{"gitId":"-"},"content":"\u003c/box\u003e","lastModifiedDate":"2023-09-12"},{"lineNumber":138,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":139,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":140,"author":{"gitId":"-"},"content":"### Storage component","lastModifiedDate":"2020-05-23"},{"lineNumber":141,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":142,"author":{"gitId":"-"},"content":"**API** : [`Storage.java`](https://github.com/se-edu/addressbook-level3/tree/master/src/main/java/seedu/address/storage/Storage.java)","lastModifiedDate":"2020-05-23"},{"lineNumber":143,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":144,"author":{"gitId":"-"},"content":"\u003cpuml src\u003d\"diagrams/StorageClassDiagram.puml\" width\u003d\"550\" /\u003e","lastModifiedDate":"2023-09-12"},{"lineNumber":145,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2021-07-31"},{"lineNumber":146,"author":{"gitId":"-"},"content":"The `Storage` component,","lastModifiedDate":"2020-05-23"},{"lineNumber":147,"author":{"gitId":"-"},"content":"* can save both address book data and user preference data in JSON format, and read them back into corresponding objects.","lastModifiedDate":"2023-09-03"},{"lineNumber":148,"author":{"gitId":"-"},"content":"* inherits from both `AddressBookStorage` and `UserPrefStorage`, which means it can be treated as either one (if only the functionality of only one is needed).","lastModifiedDate":"2021-07-31"},{"lineNumber":149,"author":{"gitId":"-"},"content":"* depends on some classes in the `Model` component (because the `Storage` component\u0027s job is to save/retrieve objects that belong to the `Model`)","lastModifiedDate":"2021-07-21"},{"lineNumber":150,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":151,"author":{"gitId":"-"},"content":"### Common classes","lastModifiedDate":"2020-05-23"},{"lineNumber":152,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":153,"author":{"gitId":"-"},"content":"Classes used by multiple components are in the `seedu.addressbook.commons` package.","lastModifiedDate":"2020-05-23"},{"lineNumber":154,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":155,"author":{"gitId":"-"},"content":"--------------------------------------------------------------------------------------------------------------------","lastModifiedDate":"2020-05-23"},{"lineNumber":156,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":157,"author":{"gitId":"-"},"content":"## **Implementation**","lastModifiedDate":"2020-05-23"},{"lineNumber":158,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":159,"author":{"gitId":"-"},"content":"This section describes some noteworthy details on how certain features are implemented.","lastModifiedDate":"2020-05-23"},{"lineNumber":160,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":161,"author":{"gitId":"-"},"content":"### \\[Proposed\\] Undo/redo feature","lastModifiedDate":"2020-06-07"},{"lineNumber":162,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":163,"author":{"gitId":"-"},"content":"#### Proposed Implementation","lastModifiedDate":"2020-05-23"},{"lineNumber":164,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":165,"author":{"gitId":"-"},"content":"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:","lastModifiedDate":"2020-05-23"},{"lineNumber":166,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":167,"author":{"gitId":"-"},"content":"* `VersionedAddressBook#commit()` — Saves the current address book state in its history.","lastModifiedDate":"2020-05-23"},{"lineNumber":168,"author":{"gitId":"-"},"content":"* `VersionedAddressBook#undo()` — Restores the previous address book state from its history.","lastModifiedDate":"2020-05-23"},{"lineNumber":169,"author":{"gitId":"-"},"content":"* `VersionedAddressBook#redo()` — Restores a previously undone address book state from its history.","lastModifiedDate":"2020-05-23"},{"lineNumber":170,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":171,"author":{"gitId":"-"},"content":"These operations are exposed in the `Model` interface as `Model#commitAddressBook()`, `Model#undoAddressBook()` and `Model#redoAddressBook()` respectively.","lastModifiedDate":"2020-05-23"},{"lineNumber":172,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":173,"author":{"gitId":"-"},"content":"Given below is an example usage scenario and how the undo/redo mechanism behaves at each step.","lastModifiedDate":"2020-05-23"},{"lineNumber":174,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":175,"author":{"gitId":"-"},"content":"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.","lastModifiedDate":"2020-05-23"},{"lineNumber":176,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":177,"author":{"gitId":"-"},"content":"\u003cpuml src\u003d\"diagrams/UndoRedoState0.puml\" alt\u003d\"UndoRedoState0\" /\u003e","lastModifiedDate":"2023-09-12"},{"lineNumber":178,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":179,"author":{"gitId":"-"},"content":"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.","lastModifiedDate":"2020-05-23"},{"lineNumber":180,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":181,"author":{"gitId":"-"},"content":"\u003cpuml src\u003d\"diagrams/UndoRedoState1.puml\" alt\u003d\"UndoRedoState1\" /\u003e","lastModifiedDate":"2023-09-12"},{"lineNumber":182,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":183,"author":{"gitId":"-"},"content":"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`.","lastModifiedDate":"2020-05-23"},{"lineNumber":184,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":185,"author":{"gitId":"-"},"content":"\u003cpuml src\u003d\"diagrams/UndoRedoState2.puml\" alt\u003d\"UndoRedoState2\" /\u003e","lastModifiedDate":"2023-09-12"},{"lineNumber":186,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":187,"author":{"gitId":"-"},"content":"\u003cbox type\u003d\"info\" seamless\u003e","lastModifiedDate":"2023-09-12"},{"lineNumber":188,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":189,"author":{"gitId":"-"},"content":"**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`.","lastModifiedDate":"2023-09-12"},{"lineNumber":190,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2023-09-12"},{"lineNumber":191,"author":{"gitId":"-"},"content":"\u003c/box\u003e","lastModifiedDate":"2023-09-12"},{"lineNumber":192,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":193,"author":{"gitId":"-"},"content":"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.","lastModifiedDate":"2020-05-23"},{"lineNumber":194,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":195,"author":{"gitId":"-"},"content":"\u003cpuml src\u003d\"diagrams/UndoRedoState3.puml\" alt\u003d\"UndoRedoState3\" /\u003e","lastModifiedDate":"2023-09-12"},{"lineNumber":196,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2023-09-12"},{"lineNumber":197,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2023-09-12"},{"lineNumber":198,"author":{"gitId":"-"},"content":"\u003cbox type\u003d\"info\" seamless\u003e","lastModifiedDate":"2023-09-12"},{"lineNumber":199,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":200,"author":{"gitId":"-"},"content":"**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","lastModifiedDate":"2023-09-12"},{"lineNumber":201,"author":{"gitId":"-"},"content":"than attempting to perform the undo.","lastModifiedDate":"2020-05-23"},{"lineNumber":202,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":203,"author":{"gitId":"-"},"content":"\u003c/box\u003e","lastModifiedDate":"2023-09-12"},{"lineNumber":204,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":205,"author":{"gitId":"-"},"content":"The following sequence diagram shows how an undo operation goes through the `Logic` component:","lastModifiedDate":"2024-02-09"},{"lineNumber":206,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":207,"author":{"gitId":"-"},"content":"\u003cpuml src\u003d\"diagrams/UndoSequenceDiagram-Logic.puml\" alt\u003d\"UndoSequenceDiagram-Logic\" /\u003e","lastModifiedDate":"2023-09-12"},{"lineNumber":208,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":209,"author":{"gitId":"-"},"content":"\u003cbox type\u003d\"info\" seamless\u003e","lastModifiedDate":"2023-09-12"},{"lineNumber":210,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":211,"author":{"gitId":"-"},"content":"**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.","lastModifiedDate":"2023-09-12"},{"lineNumber":212,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2023-09-12"},{"lineNumber":213,"author":{"gitId":"-"},"content":"\u003c/box\u003e","lastModifiedDate":"2023-09-12"},{"lineNumber":214,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":215,"author":{"gitId":"-"},"content":"Similarly, how an undo operation goes through the `Model` component is shown below:","lastModifiedDate":"2024-02-09"},{"lineNumber":216,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2024-02-09"},{"lineNumber":217,"author":{"gitId":"-"},"content":"\u003cpuml src\u003d\"diagrams/UndoSequenceDiagram-Model.puml\" alt\u003d\"UndoSequenceDiagram-Model\" /\u003e","lastModifiedDate":"2023-09-12"},{"lineNumber":218,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2024-02-09"},{"lineNumber":219,"author":{"gitId":"-"},"content":"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.","lastModifiedDate":"2020-05-23"},{"lineNumber":220,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":221,"author":{"gitId":"-"},"content":"\u003cbox type\u003d\"info\" seamless\u003e","lastModifiedDate":"2023-09-12"},{"lineNumber":222,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2023-09-12"},{"lineNumber":223,"author":{"gitId":"-"},"content":"**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.","lastModifiedDate":"2023-09-12"},{"lineNumber":224,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":225,"author":{"gitId":"-"},"content":"\u003c/box\u003e","lastModifiedDate":"2023-09-12"},{"lineNumber":226,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":227,"author":{"gitId":"-"},"content":"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.","lastModifiedDate":"2020-05-23"},{"lineNumber":228,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":229,"author":{"gitId":"-"},"content":"\u003cpuml src\u003d\"diagrams/UndoRedoState4.puml\" alt\u003d\"UndoRedoState4\" /\u003e","lastModifiedDate":"2023-09-12"},{"lineNumber":230,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":231,"author":{"gitId":"-"},"content":"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.","lastModifiedDate":"2020-05-23"},{"lineNumber":232,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":233,"author":{"gitId":"-"},"content":"\u003cpuml src\u003d\"diagrams/UndoRedoState5.puml\" alt\u003d\"UndoRedoState5\" /\u003e","lastModifiedDate":"2023-09-12"},{"lineNumber":234,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":235,"author":{"gitId":"-"},"content":"The following activity diagram summarizes what happens when a user executes a new command:","lastModifiedDate":"2020-05-23"},{"lineNumber":236,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":237,"author":{"gitId":"-"},"content":"\u003cpuml src\u003d\"diagrams/CommitActivityDiagram.puml\" width\u003d\"250\" /\u003e","lastModifiedDate":"2023-09-12"},{"lineNumber":238,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":239,"author":{"gitId":"-"},"content":"#### Design considerations:","lastModifiedDate":"2021-07-31"},{"lineNumber":240,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":241,"author":{"gitId":"-"},"content":"**Aspect: How undo \u0026 redo executes:**","lastModifiedDate":"2021-07-31"},{"lineNumber":242,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":243,"author":{"gitId":"-"},"content":"* **Alternative 1 (current choice):** Saves the entire address book.","lastModifiedDate":"2020-05-23"},{"lineNumber":244,"author":{"gitId":"-"},"content":" * Pros: Easy to implement.","lastModifiedDate":"2020-05-23"},{"lineNumber":245,"author":{"gitId":"-"},"content":" * Cons: May have performance issues in terms of memory usage.","lastModifiedDate":"2020-05-23"},{"lineNumber":246,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":247,"author":{"gitId":"-"},"content":"* **Alternative 2:** Individual command knows how to undo/redo by","lastModifiedDate":"2020-05-23"},{"lineNumber":248,"author":{"gitId":"-"},"content":" itself.","lastModifiedDate":"2020-05-23"},{"lineNumber":249,"author":{"gitId":"-"},"content":" * Pros: Will use less memory (e.g. for `delete`, just save the person being deleted).","lastModifiedDate":"2020-05-23"},{"lineNumber":250,"author":{"gitId":"-"},"content":" * Cons: We must ensure that the implementation of each individual command are correct.","lastModifiedDate":"2020-05-23"},{"lineNumber":251,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":252,"author":{"gitId":"-"},"content":"_{more aspects and alternatives to be added}_","lastModifiedDate":"2020-05-23"},{"lineNumber":253,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":254,"author":{"gitId":"-"},"content":"### \\[Proposed\\] Data archiving","lastModifiedDate":"2020-05-23"},{"lineNumber":255,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":256,"author":{"gitId":"-"},"content":"_{Explain here how the data archiving feature will be implemented}_","lastModifiedDate":"2020-05-23"},{"lineNumber":257,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":258,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":259,"author":{"gitId":"-"},"content":"--------------------------------------------------------------------------------------------------------------------","lastModifiedDate":"2020-05-23"},{"lineNumber":260,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":261,"author":{"gitId":"-"},"content":"## **Documentation, logging, testing, configuration, dev-ops**","lastModifiedDate":"2020-06-07"},{"lineNumber":262,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":263,"author":{"gitId":"-"},"content":"* [Documentation guide](Documentation.md)","lastModifiedDate":"2020-06-07"},{"lineNumber":264,"author":{"gitId":"-"},"content":"* [Testing guide](Testing.md)","lastModifiedDate":"2020-06-07"},{"lineNumber":265,"author":{"gitId":"-"},"content":"* [Logging guide](Logging.md)","lastModifiedDate":"2020-06-07"},{"lineNumber":266,"author":{"gitId":"-"},"content":"* [Configuration guide](Configuration.md)","lastModifiedDate":"2020-06-07"},{"lineNumber":267,"author":{"gitId":"-"},"content":"* [DevOps guide](DevOps.md)","lastModifiedDate":"2020-06-07"},{"lineNumber":268,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":269,"author":{"gitId":"-"},"content":"--------------------------------------------------------------------------------------------------------------------","lastModifiedDate":"2020-05-23"},{"lineNumber":270,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":271,"author":{"gitId":"-"},"content":"## **Appendix: Requirements**","lastModifiedDate":"2020-05-23"},{"lineNumber":272,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":273,"author":{"gitId":"-"},"content":"### Product scope","lastModifiedDate":"2020-05-23"},{"lineNumber":274,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":275,"author":{"gitId":"-"},"content":"**Target user profile**:","lastModifiedDate":"2020-05-23"},{"lineNumber":276,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":277,"author":{"gitId":"joelgoh1"},"content":"* a tutor who has many students ","lastModifiedDate":"2024-03-07"},{"lineNumber":278,"author":{"gitId":"joelgoh1"},"content":"* currently busy studying","lastModifiedDate":"2024-03-07"},{"lineNumber":279,"author":{"gitId":"joelgoh1"},"content":"* wants a solution for smoother academic interactions with his students","lastModifiedDate":"2024-03-07"},{"lineNumber":280,"author":{"gitId":"-"},"content":"* prefer desktop apps over other types","lastModifiedDate":"2020-05-23"},{"lineNumber":281,"author":{"gitId":"-"},"content":"* can type fast","lastModifiedDate":"2020-05-23"},{"lineNumber":282,"author":{"gitId":"-"},"content":"* prefers typing to mouse interactions","lastModifiedDate":"2020-05-26"},{"lineNumber":283,"author":{"gitId":"-"},"content":"* is reasonably comfortable using CLI apps","lastModifiedDate":"2020-05-23"},{"lineNumber":284,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":285,"author":{"gitId":"joelgoh1"},"content":"**Value proposition**: manage contacts faster than a typical mouse/GUI driven app and provides tutors a ","lastModifiedDate":"2024-03-07"},{"lineNumber":286,"author":{"gitId":"joelgoh1"},"content":"streamlined approach to communicate with and track information about their students.","lastModifiedDate":"2024-03-07"},{"lineNumber":287,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":288,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":289,"author":{"gitId":"-"},"content":"### User stories","lastModifiedDate":"2020-06-07"},{"lineNumber":290,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":291,"author":{"gitId":"-"},"content":"Priorities: High (must have) - `* * *`, Medium (nice to have) - `* *`, Low (unlikely to have) - `*`","lastModifiedDate":"2020-05-23"},{"lineNumber":292,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":293,"author":{"gitId":"-"},"content":"| Priority | As a …​ | I want to …​ | So that I can…​ |","lastModifiedDate":"2020-05-23"},{"lineNumber":294,"author":{"gitId":"joelgoh1"},"content":"|----------|--------------------------------------------|----------------------------------------------|--------------------------------------------------------------------|","lastModifiedDate":"2024-03-07"},{"lineNumber":295,"author":{"gitId":"joelgoh1"},"content":"| `* * *` | user | add a student\u0027s contact | |","lastModifiedDate":"2024-03-07"},{"lineNumber":296,"author":{"gitId":"joelgoh1"},"content":"| `* * *` | user | delete a student\u0027s contact | remove entries of students that I no longer need to keep track of |","lastModifiedDate":"2024-03-07"},{"lineNumber":297,"author":{"gitId":"joelgoh1"},"content":"| `* * *` | user | edit a student\u0027s contact | correct mistakes i made when adding a contact |","lastModifiedDate":"2024-03-07"},{"lineNumber":298,"author":{"gitId":"joelgoh1"},"content":"| `* * *` | user | search for a student\u0027s contact | I can find a student\u0027s contact |","lastModifiedDate":"2024-03-07"},{"lineNumber":299,"author":{"gitId":"joelgoh1"},"content":"| `* * *` | user with many persons in the address book | view all students\u0027 contact | |","lastModifiedDate":"2024-03-07"},{"lineNumber":300,"author":{"gitId":"joelgoh1"},"content":"| `* * ` | new user | see usage instructions | refer to instructions when I forget how to use the App |","lastModifiedDate":"2024-03-07"},{"lineNumber":301,"author":{"gitId":"joelgoh1"},"content":"| `* * ` | new user | try out the programme with sample data | I can explore the functionalities of the product |","lastModifiedDate":"2024-03-07"},{"lineNumber":302,"author":{"gitId":"joelgoh1"},"content":"| `* * ` | advanced user | create shortcuts for commands | I can more efficiently type commands |","lastModifiedDate":"2024-03-07"},{"lineNumber":303,"author":{"gitId":"joelgoh1"},"content":"| `* ` | administrative tutor | broadcast information to groups of students | I can quickly relay information to my tutees |","lastModifiedDate":"2024-03-07"},{"lineNumber":304,"author":{"gitId":"joelgoh1"},"content":"| `* * ` | forgetful tutor | attach tags to tutees | I can quickly access important information related to them |","lastModifiedDate":"2024-03-07"},{"lineNumber":305,"author":{"gitId":"joelgoh1"},"content":"| `* * ` | proactive tutor | get a summary of my tutees current abilities | I can better prepare for classes |","lastModifiedDate":"2024-03-07"},{"lineNumber":306,"author":{"gitId":"joelgoh1"},"content":"| `* * ` | forgetful tutor | set and get reminders on lessons | I will not miss any lessons |","lastModifiedDate":"2024-03-07"},{"lineNumber":307,"author":{"gitId":"joelgoh1"},"content":"| `* * ` | tutor | group students by tags | I can easily communicate with different teams indicated by tags |","lastModifiedDate":"2024-03-07"},{"lineNumber":308,"author":{"gitId":"joelgoh1"},"content":"| `* * ` | clumsy typer | do fuzzy search | I can quickly find the record I need even if there are some typos |","lastModifiedDate":"2024-03-07"},{"lineNumber":309,"author":{"gitId":"joelgoh1"},"content":" ","lastModifiedDate":"2024-03-07"},{"lineNumber":310,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":311,"author":{"gitId":"-"},"content":"*{More to be added}*","lastModifiedDate":"2020-05-23"},{"lineNumber":312,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":313,"author":{"gitId":"-"},"content":"### Use cases","lastModifiedDate":"2020-06-07"},{"lineNumber":314,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":315,"author":{"gitId":"-"},"content":"(For all use cases below, the **System** is the `AddressBook` and the **Actor** is the `user`, unless specified otherwise)","lastModifiedDate":"2020-05-23"},{"lineNumber":316,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":317,"author":{"gitId":"-"},"content":"**Use case: Delete a person**","lastModifiedDate":"2020-05-23"},{"lineNumber":318,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":319,"author":{"gitId":"-"},"content":"**MSS**","lastModifiedDate":"2020-05-23"},{"lineNumber":320,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":321,"author":{"gitId":"-"},"content":"1. User requests to list persons","lastModifiedDate":"2020-05-23"},{"lineNumber":322,"author":{"gitId":"-"},"content":"2. AddressBook shows a list of persons","lastModifiedDate":"2020-05-23"},{"lineNumber":323,"author":{"gitId":"-"},"content":"3. User requests to delete a specific person in the list","lastModifiedDate":"2020-05-23"},{"lineNumber":324,"author":{"gitId":"-"},"content":"4. AddressBook deletes the person","lastModifiedDate":"2020-05-23"},{"lineNumber":325,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":326,"author":{"gitId":"-"},"content":" Use case ends.","lastModifiedDate":"2020-05-23"},{"lineNumber":327,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":328,"author":{"gitId":"-"},"content":"**Extensions**","lastModifiedDate":"2020-05-23"},{"lineNumber":329,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":330,"author":{"gitId":"-"},"content":"* 2a. The list is empty.","lastModifiedDate":"2020-05-23"},{"lineNumber":331,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":332,"author":{"gitId":"-"},"content":" Use case ends.","lastModifiedDate":"2020-05-23"},{"lineNumber":333,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":334,"author":{"gitId":"-"},"content":"* 3a. The given index is invalid.","lastModifiedDate":"2020-05-23"},{"lineNumber":335,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":336,"author":{"gitId":"-"},"content":" * 3a1. AddressBook shows an error message.","lastModifiedDate":"2020-05-23"},{"lineNumber":337,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":338,"author":{"gitId":"-"},"content":" Use case resumes at step 2.","lastModifiedDate":"2020-05-23"},{"lineNumber":339,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":340,"author":{"gitId":"-"},"content":"*{More to be added}*","lastModifiedDate":"2020-05-23"},{"lineNumber":341,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":342,"author":{"gitId":"-"},"content":"### Non-Functional Requirements","lastModifiedDate":"2020-05-23"},{"lineNumber":343,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":344,"author":{"gitId":"-"},"content":"1. Should work on any _mainstream OS_ as long as it has Java `11` or above installed.","lastModifiedDate":"2020-05-23"},{"lineNumber":345,"author":{"gitId":"-"},"content":"2. Should be able to hold up to 1000 persons without a noticeable sluggishness in performance for typical usage.","lastModifiedDate":"2020-05-23"},{"lineNumber":346,"author":{"gitId":"-"},"content":"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.","lastModifiedDate":"2020-05-23"},{"lineNumber":347,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":348,"author":{"gitId":"-"},"content":"*{More to be added}*","lastModifiedDate":"2020-05-23"},{"lineNumber":349,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":350,"author":{"gitId":"-"},"content":"### Glossary","lastModifiedDate":"2020-05-23"},{"lineNumber":351,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":352,"author":{"gitId":"-"},"content":"* **Mainstream OS**: Windows, Linux, Unix, MacOS","lastModifiedDate":"2024-02-09"},{"lineNumber":353,"author":{"gitId":"-"},"content":"* **Private contact detail**: A contact detail that is not meant to be shared with others","lastModifiedDate":"2020-05-23"},{"lineNumber":354,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":355,"author":{"gitId":"-"},"content":"--------------------------------------------------------------------------------------------------------------------","lastModifiedDate":"2020-05-23"},{"lineNumber":356,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":357,"author":{"gitId":"-"},"content":"## **Appendix: Instructions for manual testing**","lastModifiedDate":"2020-05-23"},{"lineNumber":358,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":359,"author":{"gitId":"-"},"content":"Given below are instructions to test the app manually.","lastModifiedDate":"2020-05-23"},{"lineNumber":360,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":361,"author":{"gitId":"-"},"content":"\u003cbox type\u003d\"info\" seamless\u003e","lastModifiedDate":"2023-09-12"},{"lineNumber":362,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2023-09-12"},{"lineNumber":363,"author":{"gitId":"-"},"content":"**Note:** These instructions only provide a starting point for testers to work on;","lastModifiedDate":"2023-09-12"},{"lineNumber":364,"author":{"gitId":"-"},"content":"testers are expected to do more *exploratory* testing.","lastModifiedDate":"2020-05-23"},{"lineNumber":365,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":366,"author":{"gitId":"-"},"content":"\u003c/box\u003e","lastModifiedDate":"2023-09-12"},{"lineNumber":367,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":368,"author":{"gitId":"-"},"content":"### Launch and shutdown","lastModifiedDate":"2020-05-23"},{"lineNumber":369,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":370,"author":{"gitId":"-"},"content":"1. Initial launch","lastModifiedDate":"2020-05-23"},{"lineNumber":371,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":372,"author":{"gitId":"-"},"content":" 1. Download the jar file and copy into an empty folder","lastModifiedDate":"2020-05-23"},{"lineNumber":373,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":374,"author":{"gitId":"-"},"content":" 1. Double-click the jar file Expected: Shows the GUI with a set of sample contacts. The window size may not be optimum.","lastModifiedDate":"2020-05-23"},{"lineNumber":375,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":376,"author":{"gitId":"-"},"content":"1. Saving window preferences","lastModifiedDate":"2020-05-23"},{"lineNumber":377,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":378,"author":{"gitId":"-"},"content":" 1. Resize the window to an optimum size. Move the window to a different location. Close the window.","lastModifiedDate":"2020-05-23"},{"lineNumber":379,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":380,"author":{"gitId":"-"},"content":" 1. Re-launch the app by double-clicking the jar file.\u003cbr\u003e","lastModifiedDate":"2020-05-23"},{"lineNumber":381,"author":{"gitId":"-"},"content":" Expected: The most recent window size and location is retained.","lastModifiedDate":"2020-05-23"},{"lineNumber":382,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":383,"author":{"gitId":"-"},"content":"1. _{ more test cases …​ }_","lastModifiedDate":"2020-05-23"},{"lineNumber":384,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":385,"author":{"gitId":"-"},"content":"### Deleting a person","lastModifiedDate":"2020-05-23"},{"lineNumber":386,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":387,"author":{"gitId":"-"},"content":"1. Deleting a person while all persons are being shown","lastModifiedDate":"2020-05-23"},{"lineNumber":388,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":389,"author":{"gitId":"-"},"content":" 1. Prerequisites: List all persons using the `list` command. Multiple persons in the list.","lastModifiedDate":"2020-05-23"},{"lineNumber":390,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":391,"author":{"gitId":"-"},"content":" 1. Test case: `delete 1`\u003cbr\u003e","lastModifiedDate":"2020-05-23"},{"lineNumber":392,"author":{"gitId":"-"},"content":" 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.","lastModifiedDate":"2020-05-23"},{"lineNumber":393,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":394,"author":{"gitId":"-"},"content":" 1. Test case: `delete 0`\u003cbr\u003e","lastModifiedDate":"2020-05-23"},{"lineNumber":395,"author":{"gitId":"-"},"content":" Expected: No person is deleted. Error details shown in the status message. Status bar remains the same.","lastModifiedDate":"2020-05-23"},{"lineNumber":396,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":397,"author":{"gitId":"-"},"content":" 1. Other incorrect delete commands to try: `delete`, `delete x`, `...` (where x is larger than the list size)\u003cbr\u003e","lastModifiedDate":"2020-05-23"},{"lineNumber":398,"author":{"gitId":"-"},"content":" Expected: Similar to previous.","lastModifiedDate":"2020-05-23"},{"lineNumber":399,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":400,"author":{"gitId":"-"},"content":"1. _{ more test cases …​ }_","lastModifiedDate":"2020-05-23"},{"lineNumber":401,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":402,"author":{"gitId":"-"},"content":"### Saving data","lastModifiedDate":"2020-05-23"},{"lineNumber":403,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":404,"author":{"gitId":"-"},"content":"1. Dealing with missing/corrupted data files","lastModifiedDate":"2020-05-23"},{"lineNumber":405,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":406,"author":{"gitId":"-"},"content":" 1. _{explain how to simulate a missing/corrupted file, and the expected behavior}_","lastModifiedDate":"2020-05-23"},{"lineNumber":407,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":408,"author":{"gitId":"-"},"content":"1. _{ more test cases …​ }_","lastModifiedDate":"2020-05-23"}],"authorContributionMap":{"joelgoh1":23,"-":385}},{"path":"docs/_markbind/layouts/default.md","fileType":"docs","lines":[{"lineNumber":1,"author":{"gitId":"-"},"content":"\u003chead-bottom\u003e","lastModifiedDate":"2023-09-12"},{"lineNumber":2,"author":{"gitId":"-"},"content":" \u003clink rel\u003d\"stylesheet\" href\u003d\"{{baseUrl}}/stylesheets/main.css\"\u003e","lastModifiedDate":"2023-09-12"},{"lineNumber":3,"author":{"gitId":"-"},"content":"\u003c/head-bottom\u003e","lastModifiedDate":"2023-09-12"},{"lineNumber":4,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2023-09-12"},{"lineNumber":5,"author":{"gitId":"-"},"content":"\u003cheader sticky\u003e","lastModifiedDate":"2023-09-12"},{"lineNumber":6,"author":{"gitId":"-"},"content":" \u003cnavbar type\u003d\"dark\"\u003e","lastModifiedDate":"2023-09-12"},{"lineNumber":7,"author":{"gitId":"amanzainal"},"content":" \u003ca slot\u003d\"brand\" href\u003d\"{{baseUrl}}/index.html\" title\u003d\"Home\" class\u003d\"navbar-brand\"\u003eTutorTrack\u003c/a\u003e","lastModifiedDate":"2024-03-05"},{"lineNumber":8,"author":{"gitId":"-"},"content":" \u003cli\u003e\u003ca href\u003d\"{{baseUrl}}/index.html\" class\u003d\"nav-link\"\u003eHome\u003c/a\u003e\u003c/li\u003e","lastModifiedDate":"2024-02-09"},{"lineNumber":9,"author":{"gitId":"-"},"content":" \u003cli\u003e\u003ca href\u003d\"{{baseUrl}}/UserGuide.html\" class\u003d\"nav-link\"\u003eUser Guide\u003c/a\u003e\u003c/li\u003e","lastModifiedDate":"2023-09-12"},{"lineNumber":10,"author":{"gitId":"-"},"content":" \u003cli\u003e\u003ca href\u003d\"{{baseUrl}}/DeveloperGuide.html\" class\u003d\"nav-link\"\u003eDeveloper Guide\u003c/a\u003e\u003c/li\u003e","lastModifiedDate":"2023-09-12"},{"lineNumber":11,"author":{"gitId":"-"},"content":" \u003cli\u003e\u003ca href\u003d\"{{baseUrl}}/AboutUs.html\" class\u003d\"nav-link\"\u003eAbout Us\u003c/a\u003e\u003c/li\u003e","lastModifiedDate":"2023-09-12"},{"lineNumber":12,"author":{"gitId":"-"},"content":" \u003cli\u003e\u003ca href\u003d\"https://github.com/se-edu/addressbook-level3\" target\u003d\"_blank\" class\u003d\"nav-link\"\u003e\u003cmd\u003e:fab-github:\u003c/md\u003e\u003c/a\u003e","lastModifiedDate":"2023-09-12"},{"lineNumber":13,"author":{"gitId":"-"},"content":" \u003c/li\u003e","lastModifiedDate":"2023-09-12"},{"lineNumber":14,"author":{"gitId":"-"},"content":" \u003cli slot\u003d\"right\"\u003e","lastModifiedDate":"2023-09-12"},{"lineNumber":15,"author":{"gitId":"-"},"content":" \u003cform class\u003d\"navbar-form\"\u003e","lastModifiedDate":"2023-09-12"},{"lineNumber":16,"author":{"gitId":"-"},"content":" \u003csearchbar :data\u003d\"searchData\" placeholder\u003d\"Search\" :on-hit\u003d\"searchCallback\" menu-align-right\u003e\u003c/searchbar\u003e","lastModifiedDate":"2023-09-12"},{"lineNumber":17,"author":{"gitId":"-"},"content":" \u003c/form\u003e","lastModifiedDate":"2023-09-12"},{"lineNumber":18,"author":{"gitId":"-"},"content":" \u003c/li\u003e","lastModifiedDate":"2023-09-12"},{"lineNumber":19,"author":{"gitId":"-"},"content":" \u003c/navbar\u003e","lastModifiedDate":"2023-09-12"},{"lineNumber":20,"author":{"gitId":"-"},"content":"\u003c/header\u003e","lastModifiedDate":"2023-09-12"},{"lineNumber":21,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2023-09-12"},{"lineNumber":22,"author":{"gitId":"-"},"content":"\u003cdiv id\u003d\"flex-body\"\u003e","lastModifiedDate":"2023-09-12"},{"lineNumber":23,"author":{"gitId":"-"},"content":" \u003cnav id\u003d\"site-nav\"\u003e","lastModifiedDate":"2023-09-12"},{"lineNumber":24,"author":{"gitId":"-"},"content":" \u003cdiv class\u003d\"site-nav-top\"\u003e","lastModifiedDate":"2023-09-12"},{"lineNumber":25,"author":{"gitId":"-"},"content":" \u003cdiv class\u003d\"fw-bold mb-2\" style\u003d\"font-size: 1.25rem;\"\u003eSite Map\u003c/div\u003e","lastModifiedDate":"2023-09-12"},{"lineNumber":26,"author":{"gitId":"-"},"content":" \u003c/div\u003e","lastModifiedDate":"2023-09-12"},{"lineNumber":27,"author":{"gitId":"-"},"content":" \u003cdiv class\u003d\"nav-component slim-scroll\"\u003e","lastModifiedDate":"2023-09-12"},{"lineNumber":28,"author":{"gitId":"-"},"content":" \u003csite-nav\u003e","lastModifiedDate":"2023-09-12"},{"lineNumber":29,"author":{"gitId":"-"},"content":"* [Home]({{ baseUrl }}/index.html)","lastModifiedDate":"2023-09-12"},{"lineNumber":30,"author":{"gitId":"-"},"content":"* [User Guide]({{ baseUrl }}/UserGuide.html) :expanded:","lastModifiedDate":"2023-09-12"},{"lineNumber":31,"author":{"gitId":"-"},"content":" * [Quick Start]({{ baseUrl }}/UserGuide.html#quick-start)","lastModifiedDate":"2023-09-12"},{"lineNumber":32,"author":{"gitId":"-"},"content":" * [Features]({{ baseUrl }}/UserGuide.html#features)","lastModifiedDate":"2023-09-12"},{"lineNumber":33,"author":{"gitId":"-"},"content":" * [FAQ]({{ baseUrl }}/UserGuide.html#faq)","lastModifiedDate":"2023-09-12"},{"lineNumber":34,"author":{"gitId":"-"},"content":" * [Command Summary]({{ baseUrl }}/UserGuide.html#faq)","lastModifiedDate":"2023-09-12"},{"lineNumber":35,"author":{"gitId":"-"},"content":"* [Developer Guide]({{ baseUrl }}/DeveloperGuide.html) :expanded:","lastModifiedDate":"2023-09-12"},{"lineNumber":36,"author":{"gitId":"-"},"content":" * [Acknowledgements]({{ baseUrl }}/DeveloperGuide.html#acknowledgements)","lastModifiedDate":"2023-09-12"},{"lineNumber":37,"author":{"gitId":"-"},"content":" * [Setting Up]({{ baseUrl }}/DeveloperGuide.html#setting-up-getting-started)","lastModifiedDate":"2023-09-12"},{"lineNumber":38,"author":{"gitId":"-"},"content":" * [Design]({{ baseUrl }}/DeveloperGuide.html#design)","lastModifiedDate":"2023-09-12"},{"lineNumber":39,"author":{"gitId":"-"},"content":" * [Implementation]({{ baseUrl }}/DeveloperGuide.html#implementation)","lastModifiedDate":"2023-09-12"},{"lineNumber":40,"author":{"gitId":"-"},"content":" * [Documentation, logging, testing, configuration, dev-ops]({{ baseUrl }}/DeveloperGuide.html#documentation-logging-testing-configuration-dev-ops)","lastModifiedDate":"2023-09-12"},{"lineNumber":41,"author":{"gitId":"-"},"content":" * [Appendix: Requirements]({{ baseUrl }}/DeveloperGuide.html#appendix-requirements)","lastModifiedDate":"2023-09-12"},{"lineNumber":42,"author":{"gitId":"-"},"content":" * [Appendix: Instructions for manual testing]({{ baseUrl }}/DeveloperGuide.html#appendix-instructions-for-manual-testing)","lastModifiedDate":"2023-09-12"},{"lineNumber":43,"author":{"gitId":"-"},"content":"* Tutorials","lastModifiedDate":"2023-09-12"},{"lineNumber":44,"author":{"gitId":"-"},"content":" * [Tracing code]({{ baseUrl }}/tutorials/TracingCode.html)","lastModifiedDate":"2023-09-12"},{"lineNumber":45,"author":{"gitId":"-"},"content":" * [Adding a command]({{ baseUrl }}/tutorials/AddRemark.html)","lastModifiedDate":"2023-09-12"},{"lineNumber":46,"author":{"gitId":"-"},"content":" * [Removing Fields]({{ baseUrl }}/tutorials/RemovingFields.html)","lastModifiedDate":"2023-09-12"},{"lineNumber":47,"author":{"gitId":"-"},"content":"* [About Us]({{ baseUrl }}/AboutUs.html)","lastModifiedDate":"2023-09-12"},{"lineNumber":48,"author":{"gitId":"-"},"content":" \u003c/site-nav\u003e","lastModifiedDate":"2023-09-12"},{"lineNumber":49,"author":{"gitId":"-"},"content":" \u003c/div\u003e","lastModifiedDate":"2023-09-12"},{"lineNumber":50,"author":{"gitId":"-"},"content":" \u003c/nav\u003e","lastModifiedDate":"2023-09-12"},{"lineNumber":51,"author":{"gitId":"-"},"content":" \u003cdiv id\u003d\"content-wrapper\"\u003e","lastModifiedDate":"2023-09-12"},{"lineNumber":52,"author":{"gitId":"-"},"content":" {{ content }}","lastModifiedDate":"2023-09-12"},{"lineNumber":53,"author":{"gitId":"-"},"content":" \u003c/div\u003e","lastModifiedDate":"2023-09-12"},{"lineNumber":54,"author":{"gitId":"-"},"content":" \u003cnav id\u003d\"page-nav\"\u003e","lastModifiedDate":"2023-09-12"},{"lineNumber":55,"author":{"gitId":"-"},"content":" \u003cdiv class\u003d\"nav-component slim-scroll\"\u003e","lastModifiedDate":"2023-09-12"},{"lineNumber":56,"author":{"gitId":"-"},"content":" \u003cpage-nav /\u003e","lastModifiedDate":"2023-09-12"},{"lineNumber":57,"author":{"gitId":"-"},"content":" \u003c/div\u003e","lastModifiedDate":"2023-09-12"},{"lineNumber":58,"author":{"gitId":"-"},"content":" \u003c/nav\u003e","lastModifiedDate":"2023-09-12"},{"lineNumber":59,"author":{"gitId":"-"},"content":" \u003cscroll-top-button\u003e\u003c/scroll-top-button\u003e","lastModifiedDate":"2023-09-12"},{"lineNumber":60,"author":{"gitId":"-"},"content":"\u003c/div\u003e","lastModifiedDate":"2023-09-12"},{"lineNumber":61,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2023-09-12"},{"lineNumber":62,"author":{"gitId":"-"},"content":"\u003cfooter\u003e","lastModifiedDate":"2023-09-12"},{"lineNumber":63,"author":{"gitId":"-"},"content":" \u003c!-- Support MarkBind by including a link to us on your landing page! --\u003e","lastModifiedDate":"2023-09-12"},{"lineNumber":64,"author":{"gitId":"-"},"content":" \u003cdiv class\u003d\"text-center\"\u003e","lastModifiedDate":"2023-09-12"},{"lineNumber":65,"author":{"gitId":"-"},"content":" \u003csmall\u003e[\u003cmd\u003e**Powered by**\u003c/md\u003e \u003cimg src\u003d\"https://markbind.org/favicon.ico\" width\u003d\"30\"\u003e {{MarkBind}}, generated on {{timestamp}}]\u003c/small\u003e","lastModifiedDate":"2023-09-12"},{"lineNumber":66,"author":{"gitId":"-"},"content":" \u003c/div\u003e","lastModifiedDate":"2023-09-12"},{"lineNumber":67,"author":{"gitId":"-"},"content":"\u003c/footer\u003e","lastModifiedDate":"2023-09-12"}],"authorContributionMap":{"-":66,"amanzainal":1}}] +[{"path":"README.md","fileType":"docs","lines":[{"lineNumber":1,"author":{"gitId":"joelgoh1"},"content":"[![CI Status](https://github.com/se-edu/addressbook-level3/workflows/Java%20CI/badge.svg)](https://github.com/AY2324S2-CS2103-F08-4/tp/actions)","lastModifiedDate":"2024-03-07"},{"lineNumber":2,"author":{"gitId":"amanzainal"},"content":"[![codecov](https://codecov.io/gh/AY2324S2-CS2103-F08-4/tp/graph/badge.svg?token\u003dMYL7SH6BMO)](https://codecov.io/gh/AY2324S2-CS2103-F08-4/tp)","lastModifiedDate":"2024-03-05"},{"lineNumber":3,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":4,"author":{"gitId":"-"},"content":"![Ui](docs/images/Ui.png)","lastModifiedDate":"2020-05-23"},{"lineNumber":5,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":6,"author":{"gitId":"joelgoh1"},"content":"# TutorTrack","lastModifiedDate":"2024-03-07"},{"lineNumber":7,"author":{"gitId":"joelgoh1"},"content":"TutorTrack provides fast access to tutors\u0027 students contact details, optimized for users who prefer a CLI-driven interface. This serves as a powerful contact management tool designed for academic and professional use by streamlining tasks and enhancing organization.","lastModifiedDate":"2024-03-07"},{"lineNumber":8,"author":{"gitId":"joelgoh1"},"content":"","lastModifiedDate":"2024-03-07"},{"lineNumber":9,"author":{"gitId":"yap-zong-xin"},"content":"## Must-have Features","lastModifiedDate":"2024-03-08"},{"lineNumber":10,"author":{"gitId":"yap-zong-xin"},"content":"* Tutors can add and edit their student\u0027s contact, storing important information like name, phone number, email, address, tag and grades","lastModifiedDate":"2024-03-08"},{"lineNumber":11,"author":{"gitId":"joelgoh1"},"content":"* Tutors can search for specific students","lastModifiedDate":"2024-03-07"},{"lineNumber":12,"author":{"gitId":"joelgoh1"},"content":"* Tutors can delete old student\u0027s contacts","lastModifiedDate":"2024-03-07"},{"lineNumber":13,"author":{"gitId":"joelgoh1"},"content":"* Tutors can view all their current students","lastModifiedDate":"2024-03-07"},{"lineNumber":14,"author":{"gitId":"joelgoh1"},"content":"","lastModifiedDate":"2024-03-07"},{"lineNumber":15,"author":{"gitId":"yap-zong-xin"},"content":"## Good-to-have Features","lastModifiedDate":"2024-03-08"},{"lineNumber":16,"author":{"gitId":"yap-zong-xin"},"content":"* Having a good user-interface","lastModifiedDate":"2024-03-08"},{"lineNumber":17,"author":{"gitId":"yap-zong-xin"},"content":"* Having an automated routine tasks (e.g. sending reminders)","lastModifiedDate":"2024-03-08"},{"lineNumber":18,"author":{"gitId":"yap-zong-xin"},"content":"* Having an option to confirm or deny all commands","lastModifiedDate":"2024-03-08"},{"lineNumber":19,"author":{"gitId":"yap-zong-xin"},"content":"* Having customizability options on the GUI to reflect personal style","lastModifiedDate":"2024-03-08"},{"lineNumber":20,"author":{"gitId":"yap-zong-xin"},"content":"* Having a grammar or spell-check features within the platform","lastModifiedDate":"2024-03-08"},{"lineNumber":21,"author":{"gitId":"yap-zong-xin"},"content":"","lastModifiedDate":"2024-03-08"},{"lineNumber":22,"author":{"gitId":"joelgoh1"},"content":"## Documentation","lastModifiedDate":"2024-03-07"},{"lineNumber":23,"author":{"gitId":"joelgoh1"},"content":"For the detailed documentation of this project, see the **[TutorTrack Product Website](https://ay2324s2-cs2103-f08-4.github.io/tp/)**.","lastModifiedDate":"2024-03-07"},{"lineNumber":24,"author":{"gitId":"joelgoh1"},"content":"","lastModifiedDate":"2024-03-07"},{"lineNumber":25,"author":{"gitId":"joelgoh1"},"content":"## Credits","lastModifiedDate":"2024-03-07"},{"lineNumber":26,"author":{"gitId":"joelgoh1"},"content":"This project is based on the AddressBook-Level3 project created by the [SE-EDU initiative](https://se-education.org).","lastModifiedDate":"2024-03-07"}],"authorContributionMap":{"joelgoh1":13,"yap-zong-xin":9,"-":3,"amanzainal":1}},{"path":"docs/AboutUs.md","fileType":"docs","lines":[{"lineNumber":1,"author":{"gitId":"-"},"content":"---","lastModifiedDate":"2020-05-23"},{"lineNumber":2,"author":{"gitId":"-"},"content":" layout: default.md","lastModifiedDate":"2023-09-12"},{"lineNumber":3,"author":{"gitId":"-"},"content":" title: \"About Us\"","lastModifiedDate":"2023-09-12"},{"lineNumber":4,"author":{"gitId":"-"},"content":"---","lastModifiedDate":"2020-05-23"},{"lineNumber":5,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":6,"author":{"gitId":"-"},"content":"# About Us","lastModifiedDate":"2023-09-12"},{"lineNumber":7,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2023-09-12"},{"lineNumber":8,"author":{"gitId":"-"},"content":"We are a team based in the [School of Computing, National University of Singapore](http://www.comp.nus.edu.sg).","lastModifiedDate":"2020-05-23"},{"lineNumber":9,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":10,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-06-17"},{"lineNumber":11,"author":{"gitId":"-"},"content":"## Project team","lastModifiedDate":"2020-06-07"},{"lineNumber":12,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":13,"author":{"gitId":"joelgoh1"},"content":"### Joel Goh","lastModifiedDate":"2024-03-08"},{"lineNumber":14,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":15,"author":{"gitId":"joelgoh1"},"content":"\u003cimg src\u003d\"images/joelgoh.png\" width\u003d\"200px\"\u003e","lastModifiedDate":"2024-03-08"},{"lineNumber":16,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":17,"author":{"gitId":"joelgoh1"},"content":"[[github](http://github.com/joelgoh1)]","lastModifiedDate":"2024-03-08"},{"lineNumber":18,"author":{"gitId":"joelgoh1"},"content":"[[portfolio](team/joelgoh.md)]","lastModifiedDate":"2024-03-08"},{"lineNumber":19,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":20,"author":{"gitId":"-"},"content":"* Role: Developer","lastModifiedDate":"2024-03-08"},{"lineNumber":21,"author":{"gitId":"joelgoh1"},"content":"* Responsibilities: Deliverables and deadlines","lastModifiedDate":"2024-03-08"},{"lineNumber":22,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":23,"author":{"gitId":"yap-zong-xin"},"content":"### Yap Zong Xin","lastModifiedDate":"2024-03-08"},{"lineNumber":24,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":25,"author":{"gitId":"yap-zong-xin"},"content":"\u003cimg src\u003d\"images/yap-zong-xin.png\" width\u003d\"200px\"\u003e","lastModifiedDate":"2024-03-08"},{"lineNumber":26,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":27,"author":{"gitId":"yap-zong-xin"},"content":"[[github](http://github.com/yap-zong-xin)] [[portfolio](team/yap-zong-xin.md)]","lastModifiedDate":"2024-03-08"},{"lineNumber":28,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":29,"author":{"gitId":"-"},"content":"* Role: Developer","lastModifiedDate":"2020-05-23"},{"lineNumber":30,"author":{"gitId":"yap-zong-xin"},"content":"* Responsibilities: Add features","lastModifiedDate":"2024-03-08"},{"lineNumber":31,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"}],"authorContributionMap":{"joelgoh1":5,"yap-zong-xin":4,"-":22}},{"path":"docs/DeveloperGuide.md","fileType":"docs","lines":[{"lineNumber":1,"author":{"gitId":"-"},"content":"---","lastModifiedDate":"2020-05-23"},{"lineNumber":2,"author":{"gitId":"-"},"content":" layout: default.md","lastModifiedDate":"2023-09-12"},{"lineNumber":3,"author":{"gitId":"-"},"content":" title: \"Developer Guide\"","lastModifiedDate":"2023-09-12"},{"lineNumber":4,"author":{"gitId":"-"},"content":" pageNav: 3","lastModifiedDate":"2023-09-12"},{"lineNumber":5,"author":{"gitId":"-"},"content":"---","lastModifiedDate":"2020-05-23"},{"lineNumber":6,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2023-09-12"},{"lineNumber":7,"author":{"gitId":"joelgoh1"},"content":"# TutorTrack Developer Guide","lastModifiedDate":"2024-03-07"},{"lineNumber":8,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2023-09-12"},{"lineNumber":9,"author":{"gitId":"-"},"content":"\u003c!-- * Table of Contents --\u003e","lastModifiedDate":"2023-09-12"},{"lineNumber":10,"author":{"gitId":"-"},"content":"\u003cpage-nav-print /\u003e","lastModifiedDate":"2023-09-12"},{"lineNumber":11,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":12,"author":{"gitId":"-"},"content":"--------------------------------------------------------------------------------------------------------------------","lastModifiedDate":"2020-05-23"},{"lineNumber":13,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2021-07-30"},{"lineNumber":14,"author":{"gitId":"-"},"content":"## **Acknowledgements**","lastModifiedDate":"2021-07-30"},{"lineNumber":15,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2021-07-30"},{"lineNumber":16,"author":{"gitId":"joelgoh1"},"content":"This project is based on the AddressBook-Level3 project created by the [SE-EDU initiative](https://se-education.org)","lastModifiedDate":"2024-03-07"},{"lineNumber":17,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2021-07-30"},{"lineNumber":18,"author":{"gitId":"-"},"content":"--------------------------------------------------------------------------------------------------------------------","lastModifiedDate":"2021-07-30"},{"lineNumber":19,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":20,"author":{"gitId":"-"},"content":"## **Setting up, getting started**","lastModifiedDate":"2020-05-23"},{"lineNumber":21,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":22,"author":{"gitId":"-"},"content":"Refer to the guide [_Setting up and getting started_](SettingUp.md).","lastModifiedDate":"2020-05-23"},{"lineNumber":23,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":24,"author":{"gitId":"-"},"content":"--------------------------------------------------------------------------------------------------------------------","lastModifiedDate":"2020-05-23"},{"lineNumber":25,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":26,"author":{"gitId":"-"},"content":"## **Design**","lastModifiedDate":"2020-05-23"},{"lineNumber":27,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":28,"author":{"gitId":"-"},"content":"### Architecture","lastModifiedDate":"2021-07-31"},{"lineNumber":29,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":30,"author":{"gitId":"-"},"content":"\u003cpuml src\u003d\"diagrams/ArchitectureDiagram.puml\" width\u003d\"280\" /\u003e","lastModifiedDate":"2023-09-12"},{"lineNumber":31,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":32,"author":{"gitId":"-"},"content":"The ***Architecture Diagram*** given above explains the high-level design of the App.","lastModifiedDate":"2021-07-31"},{"lineNumber":33,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":34,"author":{"gitId":"-"},"content":"Given below is a quick overview of main components and how they interact with each other.","lastModifiedDate":"2021-07-31"},{"lineNumber":35,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2021-07-31"},{"lineNumber":36,"author":{"gitId":"-"},"content":"**Main components of the architecture**","lastModifiedDate":"2021-07-31"},{"lineNumber":37,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":38,"author":{"gitId":"-"},"content":"**`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.","lastModifiedDate":"2023-09-03"},{"lineNumber":39,"author":{"gitId":"-"},"content":"* At app launch, it initializes the other components in the correct sequence, and connects them up with each other.","lastModifiedDate":"2023-09-03"},{"lineNumber":40,"author":{"gitId":"-"},"content":"* At shut down, it shuts down the other components and invokes cleanup methods where necessary.","lastModifiedDate":"2023-09-03"},{"lineNumber":41,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":42,"author":{"gitId":"-"},"content":"The bulk of the app\u0027s work is done by the following four components:","lastModifiedDate":"2023-09-03"},{"lineNumber":43,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":44,"author":{"gitId":"-"},"content":"* [**`UI`**](#ui-component): The UI of the App.","lastModifiedDate":"2020-05-23"},{"lineNumber":45,"author":{"gitId":"-"},"content":"* [**`Logic`**](#logic-component): The command executor.","lastModifiedDate":"2020-05-23"},{"lineNumber":46,"author":{"gitId":"-"},"content":"* [**`Model`**](#model-component): Holds the data of the App in memory.","lastModifiedDate":"2020-05-23"},{"lineNumber":47,"author":{"gitId":"-"},"content":"* [**`Storage`**](#storage-component): Reads data from, and writes data to, the hard disk.","lastModifiedDate":"2020-05-23"},{"lineNumber":48,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":49,"author":{"gitId":"-"},"content":"[**`Commons`**](#common-classes) represents a collection of classes used by multiple other components.","lastModifiedDate":"2023-09-03"},{"lineNumber":50,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":51,"author":{"gitId":"-"},"content":"**How the architecture components interact with each other**","lastModifiedDate":"2020-05-23"},{"lineNumber":52,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":53,"author":{"gitId":"-"},"content":"The *Sequence Diagram* below shows how the components interact with each other for the scenario where the user issues the command `delete 1`.","lastModifiedDate":"2020-05-23"},{"lineNumber":54,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":55,"author":{"gitId":"-"},"content":"\u003cpuml src\u003d\"diagrams/ArchitectureSequenceDiagram.puml\" width\u003d\"574\" /\u003e","lastModifiedDate":"2023-09-12"},{"lineNumber":56,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":57,"author":{"gitId":"-"},"content":"Each of the four main components (also shown in the diagram above),","lastModifiedDate":"2021-07-31"},{"lineNumber":58,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2021-07-31"},{"lineNumber":59,"author":{"gitId":"-"},"content":"* defines its *API* in an `interface` with the same name as the Component.","lastModifiedDate":"2021-07-31"},{"lineNumber":60,"author":{"gitId":"-"},"content":"* implements its functionality using a concrete `{Component Name}Manager` class (which follows the corresponding API `interface` mentioned in the previous point.","lastModifiedDate":"2021-07-31"},{"lineNumber":61,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2021-07-31"},{"lineNumber":62,"author":{"gitId":"-"},"content":"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\u0027s being coupled to the implementation of a component), as illustrated in the (partial) class diagram below.","lastModifiedDate":"2021-07-31"},{"lineNumber":63,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2021-07-31"},{"lineNumber":64,"author":{"gitId":"-"},"content":"\u003cpuml src\u003d\"diagrams/ComponentManagers.puml\" width\u003d\"300\" /\u003e","lastModifiedDate":"2023-09-12"},{"lineNumber":65,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2021-07-31"},{"lineNumber":66,"author":{"gitId":"-"},"content":"The sections below give more details of each component.","lastModifiedDate":"2020-05-23"},{"lineNumber":67,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":68,"author":{"gitId":"-"},"content":"### UI component","lastModifiedDate":"2020-05-23"},{"lineNumber":69,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":70,"author":{"gitId":"-"},"content":"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)","lastModifiedDate":"2021-07-31"},{"lineNumber":71,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":72,"author":{"gitId":"-"},"content":"\u003cpuml src\u003d\"diagrams/UiClassDiagram.puml\" alt\u003d\"Structure of the UI Component\"/\u003e","lastModifiedDate":"2023-09-12"},{"lineNumber":73,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":74,"author":{"gitId":"-"},"content":"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.","lastModifiedDate":"2021-07-31"},{"lineNumber":75,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":76,"author":{"gitId":"-"},"content":"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)","lastModifiedDate":"2021-07-31"},{"lineNumber":77,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":78,"author":{"gitId":"-"},"content":"The `UI` component,","lastModifiedDate":"2020-05-23"},{"lineNumber":79,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":80,"author":{"gitId":"-"},"content":"* executes user commands using the `Logic` component.","lastModifiedDate":"2021-07-31"},{"lineNumber":81,"author":{"gitId":"-"},"content":"* listens for changes to `Model` data so that the UI can be updated with the modified data.","lastModifiedDate":"2021-07-31"},{"lineNumber":82,"author":{"gitId":"-"},"content":"* keeps a reference to the `Logic` component, because the `UI` relies on the `Logic` to execute commands.","lastModifiedDate":"2021-07-31"},{"lineNumber":83,"author":{"gitId":"-"},"content":"* depends on some classes in the `Model` component, as it displays `Person` object residing in the `Model`.","lastModifiedDate":"2021-07-31"},{"lineNumber":84,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":85,"author":{"gitId":"-"},"content":"### Logic component","lastModifiedDate":"2020-05-23"},{"lineNumber":86,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":87,"author":{"gitId":"-"},"content":"**API** : [`Logic.java`](https://github.com/se-edu/addressbook-level3/tree/master/src/main/java/seedu/address/logic/Logic.java)","lastModifiedDate":"2021-07-31"},{"lineNumber":88,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":89,"author":{"gitId":"-"},"content":"Here\u0027s a (partial) class diagram of the `Logic` component:","lastModifiedDate":"2021-07-31"},{"lineNumber":90,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":91,"author":{"gitId":"-"},"content":"\u003cpuml src\u003d\"diagrams/LogicClassDiagram.puml\" width\u003d\"550\"/\u003e","lastModifiedDate":"2023-09-12"},{"lineNumber":92,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":93,"author":{"gitId":"-"},"content":"The sequence diagram below illustrates the interactions within the `Logic` component, taking `execute(\"delete 1\")` API call as an example.","lastModifiedDate":"2023-09-03"},{"lineNumber":94,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":95,"author":{"gitId":"-"},"content":"\u003cpuml src\u003d\"diagrams/DeleteSequenceDiagram.puml\" alt\u003d\"Interactions Inside the Logic Component for the `delete 1` Command\" /\u003e","lastModifiedDate":"2023-09-12"},{"lineNumber":96,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2023-09-12"},{"lineNumber":97,"author":{"gitId":"-"},"content":"\u003cbox type\u003d\"info\" seamless\u003e","lastModifiedDate":"2023-09-12"},{"lineNumber":98,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":99,"author":{"gitId":"-"},"content":"**Note:** The lifeline for `DeleteCommandParser` should end at the destroy marker (X) but due to a limitation of PlantUML, the lifeline continues till the end of diagram.","lastModifiedDate":"2023-09-12"},{"lineNumber":100,"author":{"gitId":"-"},"content":"\u003c/box\u003e","lastModifiedDate":"2023-09-12"},{"lineNumber":101,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":102,"author":{"gitId":"-"},"content":"How the `Logic` component works:","lastModifiedDate":"2023-09-03"},{"lineNumber":103,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2023-09-03"},{"lineNumber":104,"author":{"gitId":"-"},"content":"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.","lastModifiedDate":"2023-09-03"},{"lineNumber":105,"author":{"gitId":"-"},"content":"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`.","lastModifiedDate":"2023-09-03"},{"lineNumber":106,"author":{"gitId":"-"},"content":"1. The command can communicate with the `Model` when it is executed (e.g. to delete a person).\u003cbr\u003e","lastModifiedDate":"2024-02-09"},{"lineNumber":107,"author":{"gitId":"-"},"content":" Note that although this is shown as a single step in the diagram above (for simplicity), in the code it can take several interactions (between the command object and the `Model`) to achieve.","lastModifiedDate":"2024-02-09"},{"lineNumber":108,"author":{"gitId":"-"},"content":"1. The result of the command execution is encapsulated as a `CommandResult` object which is returned back from `Logic`.","lastModifiedDate":"2023-09-03"},{"lineNumber":109,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2023-09-03"},{"lineNumber":110,"author":{"gitId":"-"},"content":"Here are the other classes in `Logic` (omitted from the class diagram above) that are used for parsing a user command:","lastModifiedDate":"2021-07-31"},{"lineNumber":111,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2021-07-31"},{"lineNumber":112,"author":{"gitId":"-"},"content":"\u003cpuml src\u003d\"diagrams/ParserClasses.puml\" width\u003d\"600\"/\u003e","lastModifiedDate":"2023-09-12"},{"lineNumber":113,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":114,"author":{"gitId":"-"},"content":"How the parsing works:","lastModifiedDate":"2021-07-31"},{"lineNumber":115,"author":{"gitId":"-"},"content":"* 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.","lastModifiedDate":"2021-07-31"},{"lineNumber":116,"author":{"gitId":"-"},"content":"* 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.","lastModifiedDate":"2021-07-31"},{"lineNumber":117,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":118,"author":{"gitId":"-"},"content":"### Model component","lastModifiedDate":"2021-07-31"},{"lineNumber":119,"author":{"gitId":"-"},"content":"**API** : [`Model.java`](https://github.com/se-edu/addressbook-level3/tree/master/src/main/java/seedu/address/model/Model.java)","lastModifiedDate":"2020-05-23"},{"lineNumber":120,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":121,"author":{"gitId":"-"},"content":"\u003cpuml src\u003d\"diagrams/ModelClassDiagram.puml\" width\u003d\"450\" /\u003e","lastModifiedDate":"2023-09-12"},{"lineNumber":122,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":123,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":124,"author":{"gitId":"-"},"content":"The `Model` component,","lastModifiedDate":"2021-07-31"},{"lineNumber":125,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":126,"author":{"gitId":"-"},"content":"* stores the address book data i.e., all `Person` objects (which are contained in a `UniquePersonList` object).","lastModifiedDate":"2021-07-31"},{"lineNumber":127,"author":{"gitId":"-"},"content":"* stores the currently \u0027selected\u0027 `Person` objects (e.g., results of a search query) as a separate _filtered_ list which is exposed to outsiders as an unmodifiable `ObservableList\u003cPerson\u003e` that can be \u0027observed\u0027 e.g. the UI can be bound to this list so that the UI automatically updates when the data in the list change.","lastModifiedDate":"2021-07-31"},{"lineNumber":128,"author":{"gitId":"-"},"content":"* stores a `UserPref` object that represents the user’s preferences. This is exposed to the outside as a `ReadOnlyUserPref` objects.","lastModifiedDate":"2021-07-31"},{"lineNumber":129,"author":{"gitId":"-"},"content":"* 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)","lastModifiedDate":"2021-07-31"},{"lineNumber":130,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2021-07-31"},{"lineNumber":131,"author":{"gitId":"-"},"content":"\u003cbox type\u003d\"info\" seamless\u003e","lastModifiedDate":"2023-09-12"},{"lineNumber":132,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2023-09-12"},{"lineNumber":133,"author":{"gitId":"-"},"content":"**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.\u003cbr\u003e","lastModifiedDate":"2023-09-12"},{"lineNumber":134,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2021-07-31"},{"lineNumber":135,"author":{"gitId":"-"},"content":"\u003cpuml src\u003d\"diagrams/BetterModelClassDiagram.puml\" width\u003d\"450\" /\u003e","lastModifiedDate":"2023-09-12"},{"lineNumber":136,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":137,"author":{"gitId":"-"},"content":"\u003c/box\u003e","lastModifiedDate":"2023-09-12"},{"lineNumber":138,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":139,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":140,"author":{"gitId":"-"},"content":"### Storage component","lastModifiedDate":"2020-05-23"},{"lineNumber":141,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":142,"author":{"gitId":"-"},"content":"**API** : [`Storage.java`](https://github.com/se-edu/addressbook-level3/tree/master/src/main/java/seedu/address/storage/Storage.java)","lastModifiedDate":"2020-05-23"},{"lineNumber":143,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":144,"author":{"gitId":"-"},"content":"\u003cpuml src\u003d\"diagrams/StorageClassDiagram.puml\" width\u003d\"550\" /\u003e","lastModifiedDate":"2023-09-12"},{"lineNumber":145,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2021-07-31"},{"lineNumber":146,"author":{"gitId":"-"},"content":"The `Storage` component,","lastModifiedDate":"2020-05-23"},{"lineNumber":147,"author":{"gitId":"-"},"content":"* can save both address book data and user preference data in JSON format, and read them back into corresponding objects.","lastModifiedDate":"2023-09-03"},{"lineNumber":148,"author":{"gitId":"-"},"content":"* inherits from both `AddressBookStorage` and `UserPrefStorage`, which means it can be treated as either one (if only the functionality of only one is needed).","lastModifiedDate":"2021-07-31"},{"lineNumber":149,"author":{"gitId":"-"},"content":"* depends on some classes in the `Model` component (because the `Storage` component\u0027s job is to save/retrieve objects that belong to the `Model`)","lastModifiedDate":"2021-07-21"},{"lineNumber":150,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":151,"author":{"gitId":"-"},"content":"### Common classes","lastModifiedDate":"2020-05-23"},{"lineNumber":152,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":153,"author":{"gitId":"-"},"content":"Classes used by multiple components are in the `seedu.addressbook.commons` package.","lastModifiedDate":"2020-05-23"},{"lineNumber":154,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":155,"author":{"gitId":"-"},"content":"--------------------------------------------------------------------------------------------------------------------","lastModifiedDate":"2020-05-23"},{"lineNumber":156,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":157,"author":{"gitId":"-"},"content":"## **Implementation**","lastModifiedDate":"2020-05-23"},{"lineNumber":158,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":159,"author":{"gitId":"-"},"content":"This section describes some noteworthy details on how certain features are implemented.","lastModifiedDate":"2020-05-23"},{"lineNumber":160,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":161,"author":{"gitId":"-"},"content":"### \\[Proposed\\] Undo/redo feature","lastModifiedDate":"2020-06-07"},{"lineNumber":162,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":163,"author":{"gitId":"-"},"content":"#### Proposed Implementation","lastModifiedDate":"2020-05-23"},{"lineNumber":164,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":165,"author":{"gitId":"-"},"content":"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:","lastModifiedDate":"2020-05-23"},{"lineNumber":166,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":167,"author":{"gitId":"-"},"content":"* `VersionedAddressBook#commit()` — Saves the current address book state in its history.","lastModifiedDate":"2020-05-23"},{"lineNumber":168,"author":{"gitId":"-"},"content":"* `VersionedAddressBook#undo()` — Restores the previous address book state from its history.","lastModifiedDate":"2020-05-23"},{"lineNumber":169,"author":{"gitId":"-"},"content":"* `VersionedAddressBook#redo()` — Restores a previously undone address book state from its history.","lastModifiedDate":"2020-05-23"},{"lineNumber":170,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":171,"author":{"gitId":"-"},"content":"These operations are exposed in the `Model` interface as `Model#commitAddressBook()`, `Model#undoAddressBook()` and `Model#redoAddressBook()` respectively.","lastModifiedDate":"2020-05-23"},{"lineNumber":172,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":173,"author":{"gitId":"-"},"content":"Given below is an example usage scenario and how the undo/redo mechanism behaves at each step.","lastModifiedDate":"2020-05-23"},{"lineNumber":174,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":175,"author":{"gitId":"-"},"content":"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.","lastModifiedDate":"2020-05-23"},{"lineNumber":176,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":177,"author":{"gitId":"-"},"content":"\u003cpuml src\u003d\"diagrams/UndoRedoState0.puml\" alt\u003d\"UndoRedoState0\" /\u003e","lastModifiedDate":"2023-09-12"},{"lineNumber":178,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":179,"author":{"gitId":"-"},"content":"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.","lastModifiedDate":"2020-05-23"},{"lineNumber":180,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":181,"author":{"gitId":"-"},"content":"\u003cpuml src\u003d\"diagrams/UndoRedoState1.puml\" alt\u003d\"UndoRedoState1\" /\u003e","lastModifiedDate":"2023-09-12"},{"lineNumber":182,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":183,"author":{"gitId":"-"},"content":"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`.","lastModifiedDate":"2020-05-23"},{"lineNumber":184,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":185,"author":{"gitId":"-"},"content":"\u003cpuml src\u003d\"diagrams/UndoRedoState2.puml\" alt\u003d\"UndoRedoState2\" /\u003e","lastModifiedDate":"2023-09-12"},{"lineNumber":186,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":187,"author":{"gitId":"-"},"content":"\u003cbox type\u003d\"info\" seamless\u003e","lastModifiedDate":"2023-09-12"},{"lineNumber":188,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":189,"author":{"gitId":"-"},"content":"**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`.","lastModifiedDate":"2023-09-12"},{"lineNumber":190,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2023-09-12"},{"lineNumber":191,"author":{"gitId":"-"},"content":"\u003c/box\u003e","lastModifiedDate":"2023-09-12"},{"lineNumber":192,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":193,"author":{"gitId":"-"},"content":"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.","lastModifiedDate":"2020-05-23"},{"lineNumber":194,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":195,"author":{"gitId":"-"},"content":"\u003cpuml src\u003d\"diagrams/UndoRedoState3.puml\" alt\u003d\"UndoRedoState3\" /\u003e","lastModifiedDate":"2023-09-12"},{"lineNumber":196,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2023-09-12"},{"lineNumber":197,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2023-09-12"},{"lineNumber":198,"author":{"gitId":"-"},"content":"\u003cbox type\u003d\"info\" seamless\u003e","lastModifiedDate":"2023-09-12"},{"lineNumber":199,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":200,"author":{"gitId":"-"},"content":"**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","lastModifiedDate":"2023-09-12"},{"lineNumber":201,"author":{"gitId":"-"},"content":"than attempting to perform the undo.","lastModifiedDate":"2020-05-23"},{"lineNumber":202,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":203,"author":{"gitId":"-"},"content":"\u003c/box\u003e","lastModifiedDate":"2023-09-12"},{"lineNumber":204,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":205,"author":{"gitId":"-"},"content":"The following sequence diagram shows how an undo operation goes through the `Logic` component:","lastModifiedDate":"2024-02-09"},{"lineNumber":206,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":207,"author":{"gitId":"-"},"content":"\u003cpuml src\u003d\"diagrams/UndoSequenceDiagram-Logic.puml\" alt\u003d\"UndoSequenceDiagram-Logic\" /\u003e","lastModifiedDate":"2023-09-12"},{"lineNumber":208,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":209,"author":{"gitId":"-"},"content":"\u003cbox type\u003d\"info\" seamless\u003e","lastModifiedDate":"2023-09-12"},{"lineNumber":210,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":211,"author":{"gitId":"-"},"content":"**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.","lastModifiedDate":"2023-09-12"},{"lineNumber":212,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2023-09-12"},{"lineNumber":213,"author":{"gitId":"-"},"content":"\u003c/box\u003e","lastModifiedDate":"2023-09-12"},{"lineNumber":214,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":215,"author":{"gitId":"-"},"content":"Similarly, how an undo operation goes through the `Model` component is shown below:","lastModifiedDate":"2024-02-09"},{"lineNumber":216,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2024-02-09"},{"lineNumber":217,"author":{"gitId":"-"},"content":"\u003cpuml src\u003d\"diagrams/UndoSequenceDiagram-Model.puml\" alt\u003d\"UndoSequenceDiagram-Model\" /\u003e","lastModifiedDate":"2023-09-12"},{"lineNumber":218,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2024-02-09"},{"lineNumber":219,"author":{"gitId":"-"},"content":"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.","lastModifiedDate":"2020-05-23"},{"lineNumber":220,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":221,"author":{"gitId":"-"},"content":"\u003cbox type\u003d\"info\" seamless\u003e","lastModifiedDate":"2023-09-12"},{"lineNumber":222,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2023-09-12"},{"lineNumber":223,"author":{"gitId":"-"},"content":"**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.","lastModifiedDate":"2023-09-12"},{"lineNumber":224,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":225,"author":{"gitId":"-"},"content":"\u003c/box\u003e","lastModifiedDate":"2023-09-12"},{"lineNumber":226,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":227,"author":{"gitId":"-"},"content":"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.","lastModifiedDate":"2020-05-23"},{"lineNumber":228,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":229,"author":{"gitId":"-"},"content":"\u003cpuml src\u003d\"diagrams/UndoRedoState4.puml\" alt\u003d\"UndoRedoState4\" /\u003e","lastModifiedDate":"2023-09-12"},{"lineNumber":230,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":231,"author":{"gitId":"-"},"content":"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.","lastModifiedDate":"2020-05-23"},{"lineNumber":232,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":233,"author":{"gitId":"-"},"content":"\u003cpuml src\u003d\"diagrams/UndoRedoState5.puml\" alt\u003d\"UndoRedoState5\" /\u003e","lastModifiedDate":"2023-09-12"},{"lineNumber":234,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":235,"author":{"gitId":"-"},"content":"The following activity diagram summarizes what happens when a user executes a new command:","lastModifiedDate":"2020-05-23"},{"lineNumber":236,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":237,"author":{"gitId":"-"},"content":"\u003cpuml src\u003d\"diagrams/CommitActivityDiagram.puml\" width\u003d\"250\" /\u003e","lastModifiedDate":"2023-09-12"},{"lineNumber":238,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":239,"author":{"gitId":"-"},"content":"#### Design considerations:","lastModifiedDate":"2021-07-31"},{"lineNumber":240,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":241,"author":{"gitId":"-"},"content":"**Aspect: How undo \u0026 redo executes:**","lastModifiedDate":"2021-07-31"},{"lineNumber":242,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":243,"author":{"gitId":"-"},"content":"* **Alternative 1 (current choice):** Saves the entire address book.","lastModifiedDate":"2020-05-23"},{"lineNumber":244,"author":{"gitId":"-"},"content":" * Pros: Easy to implement.","lastModifiedDate":"2020-05-23"},{"lineNumber":245,"author":{"gitId":"-"},"content":" * Cons: May have performance issues in terms of memory usage.","lastModifiedDate":"2020-05-23"},{"lineNumber":246,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":247,"author":{"gitId":"-"},"content":"* **Alternative 2:** Individual command knows how to undo/redo by","lastModifiedDate":"2020-05-23"},{"lineNumber":248,"author":{"gitId":"-"},"content":" itself.","lastModifiedDate":"2020-05-23"},{"lineNumber":249,"author":{"gitId":"-"},"content":" * Pros: Will use less memory (e.g. for `delete`, just save the person being deleted).","lastModifiedDate":"2020-05-23"},{"lineNumber":250,"author":{"gitId":"-"},"content":" * Cons: We must ensure that the implementation of each individual command are correct.","lastModifiedDate":"2020-05-23"},{"lineNumber":251,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":252,"author":{"gitId":"-"},"content":"_{more aspects and alternatives to be added}_","lastModifiedDate":"2020-05-23"},{"lineNumber":253,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":254,"author":{"gitId":"-"},"content":"### \\[Proposed\\] Data archiving","lastModifiedDate":"2020-05-23"},{"lineNumber":255,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":256,"author":{"gitId":"-"},"content":"_{Explain here how the data archiving feature will be implemented}_","lastModifiedDate":"2020-05-23"},{"lineNumber":257,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":258,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":259,"author":{"gitId":"-"},"content":"--------------------------------------------------------------------------------------------------------------------","lastModifiedDate":"2020-05-23"},{"lineNumber":260,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":261,"author":{"gitId":"-"},"content":"## **Documentation, logging, testing, configuration, dev-ops**","lastModifiedDate":"2020-06-07"},{"lineNumber":262,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":263,"author":{"gitId":"-"},"content":"* [Documentation guide](Documentation.md)","lastModifiedDate":"2020-06-07"},{"lineNumber":264,"author":{"gitId":"-"},"content":"* [Testing guide](Testing.md)","lastModifiedDate":"2020-06-07"},{"lineNumber":265,"author":{"gitId":"-"},"content":"* [Logging guide](Logging.md)","lastModifiedDate":"2020-06-07"},{"lineNumber":266,"author":{"gitId":"-"},"content":"* [Configuration guide](Configuration.md)","lastModifiedDate":"2020-06-07"},{"lineNumber":267,"author":{"gitId":"-"},"content":"* [DevOps guide](DevOps.md)","lastModifiedDate":"2020-06-07"},{"lineNumber":268,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":269,"author":{"gitId":"-"},"content":"--------------------------------------------------------------------------------------------------------------------","lastModifiedDate":"2020-05-23"},{"lineNumber":270,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":271,"author":{"gitId":"-"},"content":"## **Appendix: Requirements**","lastModifiedDate":"2020-05-23"},{"lineNumber":272,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":273,"author":{"gitId":"-"},"content":"### Product scope","lastModifiedDate":"2020-05-23"},{"lineNumber":274,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":275,"author":{"gitId":"-"},"content":"**Target user profile**:","lastModifiedDate":"2020-05-23"},{"lineNumber":276,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":277,"author":{"gitId":"joelgoh1"},"content":"* a tutor who has many students ","lastModifiedDate":"2024-03-07"},{"lineNumber":278,"author":{"gitId":"joelgoh1"},"content":"* currently busy studying","lastModifiedDate":"2024-03-07"},{"lineNumber":279,"author":{"gitId":"joelgoh1"},"content":"* wants a solution for smoother academic interactions with his students","lastModifiedDate":"2024-03-07"},{"lineNumber":280,"author":{"gitId":"-"},"content":"* prefer desktop apps over other types","lastModifiedDate":"2020-05-23"},{"lineNumber":281,"author":{"gitId":"-"},"content":"* can type fast","lastModifiedDate":"2020-05-23"},{"lineNumber":282,"author":{"gitId":"-"},"content":"* prefers typing to mouse interactions","lastModifiedDate":"2020-05-26"},{"lineNumber":283,"author":{"gitId":"-"},"content":"* is reasonably comfortable using CLI apps","lastModifiedDate":"2020-05-23"},{"lineNumber":284,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":285,"author":{"gitId":"joelgoh1"},"content":"**Value proposition**: manage contacts faster than a typical mouse/GUI driven app and provides tutors a ","lastModifiedDate":"2024-03-07"},{"lineNumber":286,"author":{"gitId":"joelgoh1"},"content":"streamlined approach to communicate with and track information about their students.","lastModifiedDate":"2024-03-07"},{"lineNumber":287,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":288,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":289,"author":{"gitId":"-"},"content":"### User stories","lastModifiedDate":"2020-06-07"},{"lineNumber":290,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":291,"author":{"gitId":"-"},"content":"Priorities: High (must have) - `* * *`, Medium (nice to have) - `* *`, Low (unlikely to have) - `*`","lastModifiedDate":"2020-05-23"},{"lineNumber":292,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":293,"author":{"gitId":"-"},"content":"| Priority | As a …​ | I want to …​ | So that I can…​ |","lastModifiedDate":"2020-05-23"},{"lineNumber":294,"author":{"gitId":"joelgoh1"},"content":"|----------|--------------------------------------------|----------------------------------------------|--------------------------------------------------------------------|","lastModifiedDate":"2024-03-07"},{"lineNumber":295,"author":{"gitId":"joelgoh1"},"content":"| `* * *` | user | add a student\u0027s contact | |","lastModifiedDate":"2024-03-07"},{"lineNumber":296,"author":{"gitId":"joelgoh1"},"content":"| `* * *` | user | delete a student\u0027s contact | remove entries of students that I no longer need to keep track of |","lastModifiedDate":"2024-03-07"},{"lineNumber":297,"author":{"gitId":"joelgoh1"},"content":"| `* * *` | user | edit a student\u0027s contact | correct mistakes i made when adding a contact |","lastModifiedDate":"2024-03-07"},{"lineNumber":298,"author":{"gitId":"joelgoh1"},"content":"| `* * *` | user | search for a student\u0027s contact | I can find a student\u0027s contact |","lastModifiedDate":"2024-03-07"},{"lineNumber":299,"author":{"gitId":"joelgoh1"},"content":"| `* * *` | user with many persons in the address book | view all students\u0027 contact | |","lastModifiedDate":"2024-03-07"},{"lineNumber":300,"author":{"gitId":"joelgoh1"},"content":"| `* * ` | new user | see usage instructions | refer to instructions when I forget how to use the App |","lastModifiedDate":"2024-03-07"},{"lineNumber":301,"author":{"gitId":"joelgoh1"},"content":"| `* * ` | new user | try out the programme with sample data | I can explore the functionalities of the product |","lastModifiedDate":"2024-03-07"},{"lineNumber":302,"author":{"gitId":"joelgoh1"},"content":"| `* * ` | advanced user | create shortcuts for commands | I can more efficiently type commands |","lastModifiedDate":"2024-03-07"},{"lineNumber":303,"author":{"gitId":"joelgoh1"},"content":"| `* ` | administrative tutor | broadcast information to groups of students | I can quickly relay information to my tutees |","lastModifiedDate":"2024-03-07"},{"lineNumber":304,"author":{"gitId":"joelgoh1"},"content":"| `* * ` | forgetful tutor | attach tags to tutees | I can quickly access important information related to them |","lastModifiedDate":"2024-03-07"},{"lineNumber":305,"author":{"gitId":"joelgoh1"},"content":"| `* * ` | proactive tutor | get a summary of my tutees current abilities | I can better prepare for classes |","lastModifiedDate":"2024-03-07"},{"lineNumber":306,"author":{"gitId":"joelgoh1"},"content":"| `* * ` | forgetful tutor | set and get reminders on lessons | I will not miss any lessons |","lastModifiedDate":"2024-03-07"},{"lineNumber":307,"author":{"gitId":"joelgoh1"},"content":"| `* * ` | tutor | group students by tags | I can easily communicate with different teams indicated by tags |","lastModifiedDate":"2024-03-07"},{"lineNumber":308,"author":{"gitId":"joelgoh1"},"content":"| `* * ` | clumsy typer | do fuzzy search | I can quickly find the record I need even if there are some typos |","lastModifiedDate":"2024-03-07"},{"lineNumber":309,"author":{"gitId":"joelgoh1"},"content":" ","lastModifiedDate":"2024-03-07"},{"lineNumber":310,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":311,"author":{"gitId":"-"},"content":"*{More to be added}*","lastModifiedDate":"2020-05-23"},{"lineNumber":312,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":313,"author":{"gitId":"-"},"content":"### Use cases","lastModifiedDate":"2020-06-07"},{"lineNumber":314,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":315,"author":{"gitId":"-"},"content":"(For all use cases below, the **System** is the `AddressBook` and the **Actor** is the `user`, unless specified otherwise)","lastModifiedDate":"2020-05-23"},{"lineNumber":316,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":317,"author":{"gitId":"-"},"content":"**Use case: Delete a person**","lastModifiedDate":"2020-05-23"},{"lineNumber":318,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":319,"author":{"gitId":"-"},"content":"**MSS**","lastModifiedDate":"2020-05-23"},{"lineNumber":320,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":321,"author":{"gitId":"-"},"content":"1. User requests to list persons","lastModifiedDate":"2020-05-23"},{"lineNumber":322,"author":{"gitId":"-"},"content":"2. AddressBook shows a list of persons","lastModifiedDate":"2020-05-23"},{"lineNumber":323,"author":{"gitId":"-"},"content":"3. User requests to delete a specific person in the list","lastModifiedDate":"2020-05-23"},{"lineNumber":324,"author":{"gitId":"-"},"content":"4. AddressBook deletes the person","lastModifiedDate":"2020-05-23"},{"lineNumber":325,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":326,"author":{"gitId":"-"},"content":" Use case ends.","lastModifiedDate":"2020-05-23"},{"lineNumber":327,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":328,"author":{"gitId":"-"},"content":"**Extensions**","lastModifiedDate":"2020-05-23"},{"lineNumber":329,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":330,"author":{"gitId":"-"},"content":"* 2a. The list is empty.","lastModifiedDate":"2020-05-23"},{"lineNumber":331,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":332,"author":{"gitId":"-"},"content":" Use case ends.","lastModifiedDate":"2020-05-23"},{"lineNumber":333,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":334,"author":{"gitId":"-"},"content":"* 3a. The given index is invalid.","lastModifiedDate":"2020-05-23"},{"lineNumber":335,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":336,"author":{"gitId":"-"},"content":" * 3a1. AddressBook shows an error message.","lastModifiedDate":"2020-05-23"},{"lineNumber":337,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":338,"author":{"gitId":"-"},"content":" Use case resumes at step 2.","lastModifiedDate":"2020-05-23"},{"lineNumber":339,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":340,"author":{"gitId":"-"},"content":"*{More to be added}*","lastModifiedDate":"2020-05-23"},{"lineNumber":341,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":342,"author":{"gitId":"-"},"content":"### Non-Functional Requirements","lastModifiedDate":"2020-05-23"},{"lineNumber":343,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":344,"author":{"gitId":"-"},"content":"1. Should work on any _mainstream OS_ as long as it has Java `11` or above installed.","lastModifiedDate":"2020-05-23"},{"lineNumber":345,"author":{"gitId":"-"},"content":"2. Should be able to hold up to 1000 persons without a noticeable sluggishness in performance for typical usage.","lastModifiedDate":"2020-05-23"},{"lineNumber":346,"author":{"gitId":"-"},"content":"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.","lastModifiedDate":"2020-05-23"},{"lineNumber":347,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":348,"author":{"gitId":"-"},"content":"*{More to be added}*","lastModifiedDate":"2020-05-23"},{"lineNumber":349,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":350,"author":{"gitId":"-"},"content":"### Glossary","lastModifiedDate":"2020-05-23"},{"lineNumber":351,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":352,"author":{"gitId":"-"},"content":"* **Mainstream OS**: Windows, Linux, Unix, MacOS","lastModifiedDate":"2024-02-09"},{"lineNumber":353,"author":{"gitId":"-"},"content":"* **Private contact detail**: A contact detail that is not meant to be shared with others","lastModifiedDate":"2020-05-23"},{"lineNumber":354,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":355,"author":{"gitId":"-"},"content":"--------------------------------------------------------------------------------------------------------------------","lastModifiedDate":"2020-05-23"},{"lineNumber":356,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":357,"author":{"gitId":"-"},"content":"## **Appendix: Instructions for manual testing**","lastModifiedDate":"2020-05-23"},{"lineNumber":358,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":359,"author":{"gitId":"-"},"content":"Given below are instructions to test the app manually.","lastModifiedDate":"2020-05-23"},{"lineNumber":360,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":361,"author":{"gitId":"-"},"content":"\u003cbox type\u003d\"info\" seamless\u003e","lastModifiedDate":"2023-09-12"},{"lineNumber":362,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2023-09-12"},{"lineNumber":363,"author":{"gitId":"-"},"content":"**Note:** These instructions only provide a starting point for testers to work on;","lastModifiedDate":"2023-09-12"},{"lineNumber":364,"author":{"gitId":"-"},"content":"testers are expected to do more *exploratory* testing.","lastModifiedDate":"2020-05-23"},{"lineNumber":365,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":366,"author":{"gitId":"-"},"content":"\u003c/box\u003e","lastModifiedDate":"2023-09-12"},{"lineNumber":367,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":368,"author":{"gitId":"-"},"content":"### Launch and shutdown","lastModifiedDate":"2020-05-23"},{"lineNumber":369,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":370,"author":{"gitId":"-"},"content":"1. Initial launch","lastModifiedDate":"2020-05-23"},{"lineNumber":371,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":372,"author":{"gitId":"-"},"content":" 1. Download the jar file and copy into an empty folder","lastModifiedDate":"2020-05-23"},{"lineNumber":373,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":374,"author":{"gitId":"-"},"content":" 1. Double-click the jar file Expected: Shows the GUI with a set of sample contacts. The window size may not be optimum.","lastModifiedDate":"2020-05-23"},{"lineNumber":375,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":376,"author":{"gitId":"-"},"content":"1. Saving window preferences","lastModifiedDate":"2020-05-23"},{"lineNumber":377,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":378,"author":{"gitId":"-"},"content":" 1. Resize the window to an optimum size. Move the window to a different location. Close the window.","lastModifiedDate":"2020-05-23"},{"lineNumber":379,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":380,"author":{"gitId":"-"},"content":" 1. Re-launch the app by double-clicking the jar file.\u003cbr\u003e","lastModifiedDate":"2020-05-23"},{"lineNumber":381,"author":{"gitId":"-"},"content":" Expected: The most recent window size and location is retained.","lastModifiedDate":"2020-05-23"},{"lineNumber":382,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":383,"author":{"gitId":"-"},"content":"1. _{ more test cases …​ }_","lastModifiedDate":"2020-05-23"},{"lineNumber":384,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":385,"author":{"gitId":"-"},"content":"### Deleting a person","lastModifiedDate":"2020-05-23"},{"lineNumber":386,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":387,"author":{"gitId":"-"},"content":"1. Deleting a person while all persons are being shown","lastModifiedDate":"2020-05-23"},{"lineNumber":388,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":389,"author":{"gitId":"-"},"content":" 1. Prerequisites: List all persons using the `list` command. Multiple persons in the list.","lastModifiedDate":"2020-05-23"},{"lineNumber":390,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":391,"author":{"gitId":"-"},"content":" 1. Test case: `delete 1`\u003cbr\u003e","lastModifiedDate":"2020-05-23"},{"lineNumber":392,"author":{"gitId":"-"},"content":" 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.","lastModifiedDate":"2020-05-23"},{"lineNumber":393,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":394,"author":{"gitId":"-"},"content":" 1. Test case: `delete 0`\u003cbr\u003e","lastModifiedDate":"2020-05-23"},{"lineNumber":395,"author":{"gitId":"-"},"content":" Expected: No person is deleted. Error details shown in the status message. Status bar remains the same.","lastModifiedDate":"2020-05-23"},{"lineNumber":396,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":397,"author":{"gitId":"-"},"content":" 1. Other incorrect delete commands to try: `delete`, `delete x`, `...` (where x is larger than the list size)\u003cbr\u003e","lastModifiedDate":"2020-05-23"},{"lineNumber":398,"author":{"gitId":"-"},"content":" Expected: Similar to previous.","lastModifiedDate":"2020-05-23"},{"lineNumber":399,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":400,"author":{"gitId":"-"},"content":"1. _{ more test cases …​ }_","lastModifiedDate":"2020-05-23"},{"lineNumber":401,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":402,"author":{"gitId":"-"},"content":"### Saving data","lastModifiedDate":"2020-05-23"},{"lineNumber":403,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":404,"author":{"gitId":"-"},"content":"1. Dealing with missing/corrupted data files","lastModifiedDate":"2020-05-23"},{"lineNumber":405,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":406,"author":{"gitId":"-"},"content":" 1. _{explain how to simulate a missing/corrupted file, and the expected behavior}_","lastModifiedDate":"2020-05-23"},{"lineNumber":407,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":408,"author":{"gitId":"-"},"content":"1. _{ more test cases …​ }_","lastModifiedDate":"2020-05-23"}],"authorContributionMap":{"joelgoh1":23,"-":385}},{"path":"docs/_markbind/layouts/default.md","fileType":"docs","lines":[{"lineNumber":1,"author":{"gitId":"-"},"content":"\u003chead-bottom\u003e","lastModifiedDate":"2023-09-12"},{"lineNumber":2,"author":{"gitId":"-"},"content":" \u003clink rel\u003d\"stylesheet\" href\u003d\"{{baseUrl}}/stylesheets/main.css\"\u003e","lastModifiedDate":"2023-09-12"},{"lineNumber":3,"author":{"gitId":"-"},"content":"\u003c/head-bottom\u003e","lastModifiedDate":"2023-09-12"},{"lineNumber":4,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2023-09-12"},{"lineNumber":5,"author":{"gitId":"-"},"content":"\u003cheader sticky\u003e","lastModifiedDate":"2023-09-12"},{"lineNumber":6,"author":{"gitId":"-"},"content":" \u003cnavbar type\u003d\"dark\"\u003e","lastModifiedDate":"2023-09-12"},{"lineNumber":7,"author":{"gitId":"amanzainal"},"content":" \u003ca slot\u003d\"brand\" href\u003d\"{{baseUrl}}/index.html\" title\u003d\"Home\" class\u003d\"navbar-brand\"\u003eTutorTrack\u003c/a\u003e","lastModifiedDate":"2024-03-05"},{"lineNumber":8,"author":{"gitId":"-"},"content":" \u003cli\u003e\u003ca href\u003d\"{{baseUrl}}/index.html\" class\u003d\"nav-link\"\u003eHome\u003c/a\u003e\u003c/li\u003e","lastModifiedDate":"2024-02-09"},{"lineNumber":9,"author":{"gitId":"-"},"content":" \u003cli\u003e\u003ca href\u003d\"{{baseUrl}}/UserGuide.html\" class\u003d\"nav-link\"\u003eUser Guide\u003c/a\u003e\u003c/li\u003e","lastModifiedDate":"2023-09-12"},{"lineNumber":10,"author":{"gitId":"-"},"content":" \u003cli\u003e\u003ca href\u003d\"{{baseUrl}}/DeveloperGuide.html\" class\u003d\"nav-link\"\u003eDeveloper Guide\u003c/a\u003e\u003c/li\u003e","lastModifiedDate":"2023-09-12"},{"lineNumber":11,"author":{"gitId":"-"},"content":" \u003cli\u003e\u003ca href\u003d\"{{baseUrl}}/AboutUs.html\" class\u003d\"nav-link\"\u003eAbout Us\u003c/a\u003e\u003c/li\u003e","lastModifiedDate":"2023-09-12"},{"lineNumber":12,"author":{"gitId":"-"},"content":" \u003cli\u003e\u003ca href\u003d\"https://github.com/se-edu/addressbook-level3\" target\u003d\"_blank\" class\u003d\"nav-link\"\u003e\u003cmd\u003e:fab-github:\u003c/md\u003e\u003c/a\u003e","lastModifiedDate":"2023-09-12"},{"lineNumber":13,"author":{"gitId":"-"},"content":" \u003c/li\u003e","lastModifiedDate":"2023-09-12"},{"lineNumber":14,"author":{"gitId":"-"},"content":" \u003cli slot\u003d\"right\"\u003e","lastModifiedDate":"2023-09-12"},{"lineNumber":15,"author":{"gitId":"-"},"content":" \u003cform class\u003d\"navbar-form\"\u003e","lastModifiedDate":"2023-09-12"},{"lineNumber":16,"author":{"gitId":"-"},"content":" \u003csearchbar :data\u003d\"searchData\" placeholder\u003d\"Search\" :on-hit\u003d\"searchCallback\" menu-align-right\u003e\u003c/searchbar\u003e","lastModifiedDate":"2023-09-12"},{"lineNumber":17,"author":{"gitId":"-"},"content":" \u003c/form\u003e","lastModifiedDate":"2023-09-12"},{"lineNumber":18,"author":{"gitId":"-"},"content":" \u003c/li\u003e","lastModifiedDate":"2023-09-12"},{"lineNumber":19,"author":{"gitId":"-"},"content":" \u003c/navbar\u003e","lastModifiedDate":"2023-09-12"},{"lineNumber":20,"author":{"gitId":"-"},"content":"\u003c/header\u003e","lastModifiedDate":"2023-09-12"},{"lineNumber":21,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2023-09-12"},{"lineNumber":22,"author":{"gitId":"-"},"content":"\u003cdiv id\u003d\"flex-body\"\u003e","lastModifiedDate":"2023-09-12"},{"lineNumber":23,"author":{"gitId":"-"},"content":" \u003cnav id\u003d\"site-nav\"\u003e","lastModifiedDate":"2023-09-12"},{"lineNumber":24,"author":{"gitId":"-"},"content":" \u003cdiv class\u003d\"site-nav-top\"\u003e","lastModifiedDate":"2023-09-12"},{"lineNumber":25,"author":{"gitId":"-"},"content":" \u003cdiv class\u003d\"fw-bold mb-2\" style\u003d\"font-size: 1.25rem;\"\u003eSite Map\u003c/div\u003e","lastModifiedDate":"2023-09-12"},{"lineNumber":26,"author":{"gitId":"-"},"content":" \u003c/div\u003e","lastModifiedDate":"2023-09-12"},{"lineNumber":27,"author":{"gitId":"-"},"content":" \u003cdiv class\u003d\"nav-component slim-scroll\"\u003e","lastModifiedDate":"2023-09-12"},{"lineNumber":28,"author":{"gitId":"-"},"content":" \u003csite-nav\u003e","lastModifiedDate":"2023-09-12"},{"lineNumber":29,"author":{"gitId":"-"},"content":"* [Home]({{ baseUrl }}/index.html)","lastModifiedDate":"2023-09-12"},{"lineNumber":30,"author":{"gitId":"-"},"content":"* [User Guide]({{ baseUrl }}/UserGuide.html) :expanded:","lastModifiedDate":"2023-09-12"},{"lineNumber":31,"author":{"gitId":"-"},"content":" * [Quick Start]({{ baseUrl }}/UserGuide.html#quick-start)","lastModifiedDate":"2023-09-12"},{"lineNumber":32,"author":{"gitId":"-"},"content":" * [Features]({{ baseUrl }}/UserGuide.html#features)","lastModifiedDate":"2023-09-12"},{"lineNumber":33,"author":{"gitId":"-"},"content":" * [FAQ]({{ baseUrl }}/UserGuide.html#faq)","lastModifiedDate":"2023-09-12"},{"lineNumber":34,"author":{"gitId":"-"},"content":" * [Command Summary]({{ baseUrl }}/UserGuide.html#faq)","lastModifiedDate":"2023-09-12"},{"lineNumber":35,"author":{"gitId":"-"},"content":"* [Developer Guide]({{ baseUrl }}/DeveloperGuide.html) :expanded:","lastModifiedDate":"2023-09-12"},{"lineNumber":36,"author":{"gitId":"-"},"content":" * [Acknowledgements]({{ baseUrl }}/DeveloperGuide.html#acknowledgements)","lastModifiedDate":"2023-09-12"},{"lineNumber":37,"author":{"gitId":"-"},"content":" * [Setting Up]({{ baseUrl }}/DeveloperGuide.html#setting-up-getting-started)","lastModifiedDate":"2023-09-12"},{"lineNumber":38,"author":{"gitId":"-"},"content":" * [Design]({{ baseUrl }}/DeveloperGuide.html#design)","lastModifiedDate":"2023-09-12"},{"lineNumber":39,"author":{"gitId":"-"},"content":" * [Implementation]({{ baseUrl }}/DeveloperGuide.html#implementation)","lastModifiedDate":"2023-09-12"},{"lineNumber":40,"author":{"gitId":"-"},"content":" * [Documentation, logging, testing, configuration, dev-ops]({{ baseUrl }}/DeveloperGuide.html#documentation-logging-testing-configuration-dev-ops)","lastModifiedDate":"2023-09-12"},{"lineNumber":41,"author":{"gitId":"-"},"content":" * [Appendix: Requirements]({{ baseUrl }}/DeveloperGuide.html#appendix-requirements)","lastModifiedDate":"2023-09-12"},{"lineNumber":42,"author":{"gitId":"-"},"content":" * [Appendix: Instructions for manual testing]({{ baseUrl }}/DeveloperGuide.html#appendix-instructions-for-manual-testing)","lastModifiedDate":"2023-09-12"},{"lineNumber":43,"author":{"gitId":"-"},"content":"* Tutorials","lastModifiedDate":"2023-09-12"},{"lineNumber":44,"author":{"gitId":"-"},"content":" * [Tracing code]({{ baseUrl }}/tutorials/TracingCode.html)","lastModifiedDate":"2023-09-12"},{"lineNumber":45,"author":{"gitId":"-"},"content":" * [Adding a command]({{ baseUrl }}/tutorials/AddRemark.html)","lastModifiedDate":"2023-09-12"},{"lineNumber":46,"author":{"gitId":"-"},"content":" * [Removing Fields]({{ baseUrl }}/tutorials/RemovingFields.html)","lastModifiedDate":"2023-09-12"},{"lineNumber":47,"author":{"gitId":"-"},"content":"* [About Us]({{ baseUrl }}/AboutUs.html)","lastModifiedDate":"2023-09-12"},{"lineNumber":48,"author":{"gitId":"-"},"content":" \u003c/site-nav\u003e","lastModifiedDate":"2023-09-12"},{"lineNumber":49,"author":{"gitId":"-"},"content":" \u003c/div\u003e","lastModifiedDate":"2023-09-12"},{"lineNumber":50,"author":{"gitId":"-"},"content":" \u003c/nav\u003e","lastModifiedDate":"2023-09-12"},{"lineNumber":51,"author":{"gitId":"-"},"content":" \u003cdiv id\u003d\"content-wrapper\"\u003e","lastModifiedDate":"2023-09-12"},{"lineNumber":52,"author":{"gitId":"-"},"content":" {{ content }}","lastModifiedDate":"2023-09-12"},{"lineNumber":53,"author":{"gitId":"-"},"content":" \u003c/div\u003e","lastModifiedDate":"2023-09-12"},{"lineNumber":54,"author":{"gitId":"-"},"content":" \u003cnav id\u003d\"page-nav\"\u003e","lastModifiedDate":"2023-09-12"},{"lineNumber":55,"author":{"gitId":"-"},"content":" \u003cdiv class\u003d\"nav-component slim-scroll\"\u003e","lastModifiedDate":"2023-09-12"},{"lineNumber":56,"author":{"gitId":"-"},"content":" \u003cpage-nav /\u003e","lastModifiedDate":"2023-09-12"},{"lineNumber":57,"author":{"gitId":"-"},"content":" \u003c/div\u003e","lastModifiedDate":"2023-09-12"},{"lineNumber":58,"author":{"gitId":"-"},"content":" \u003c/nav\u003e","lastModifiedDate":"2023-09-12"},{"lineNumber":59,"author":{"gitId":"-"},"content":" \u003cscroll-top-button\u003e\u003c/scroll-top-button\u003e","lastModifiedDate":"2023-09-12"},{"lineNumber":60,"author":{"gitId":"-"},"content":"\u003c/div\u003e","lastModifiedDate":"2023-09-12"},{"lineNumber":61,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2023-09-12"},{"lineNumber":62,"author":{"gitId":"-"},"content":"\u003cfooter\u003e","lastModifiedDate":"2023-09-12"},{"lineNumber":63,"author":{"gitId":"-"},"content":" \u003c!-- Support MarkBind by including a link to us on your landing page! --\u003e","lastModifiedDate":"2023-09-12"},{"lineNumber":64,"author":{"gitId":"-"},"content":" \u003cdiv class\u003d\"text-center\"\u003e","lastModifiedDate":"2023-09-12"},{"lineNumber":65,"author":{"gitId":"-"},"content":" \u003csmall\u003e[\u003cmd\u003e**Powered by**\u003c/md\u003e \u003cimg src\u003d\"https://markbind.org/favicon.ico\" width\u003d\"30\"\u003e {{MarkBind}}, generated on {{timestamp}}]\u003c/small\u003e","lastModifiedDate":"2023-09-12"},{"lineNumber":66,"author":{"gitId":"-"},"content":" \u003c/div\u003e","lastModifiedDate":"2023-09-12"},{"lineNumber":67,"author":{"gitId":"-"},"content":"\u003c/footer\u003e","lastModifiedDate":"2023-09-12"}],"authorContributionMap":{"-":66,"amanzainal":1}},{"path":"docs/team/joelgoh.md","fileType":"docs","lines":[{"lineNumber":1,"author":{"gitId":"joelgoh1"},"content":"---","lastModifiedDate":"2024-03-08"},{"lineNumber":2,"author":{"gitId":"joelgoh1"},"content":" layout: default.md","lastModifiedDate":"2024-03-08"},{"lineNumber":3,"author":{"gitId":"joelgoh1"},"content":" title: \"Joel Goh\u0027s Project Portfolio Page\"","lastModifiedDate":"2024-03-08"},{"lineNumber":4,"author":{"gitId":"joelgoh1"},"content":"---","lastModifiedDate":"2024-03-08"},{"lineNumber":5,"author":{"gitId":"joelgoh1"},"content":"","lastModifiedDate":"2024-03-08"},{"lineNumber":6,"author":{"gitId":"joelgoh1"},"content":"### Project: Tutor Track","lastModifiedDate":"2024-03-08"},{"lineNumber":7,"author":{"gitId":"joelgoh1"},"content":"","lastModifiedDate":"2024-03-08"},{"lineNumber":8,"author":{"gitId":"joelgoh1"},"content":"","lastModifiedDate":"2024-03-08"},{"lineNumber":9,"author":{"gitId":"joelgoh1"},"content":"Given below are my contributions to the project.","lastModifiedDate":"2024-03-08"},{"lineNumber":10,"author":{"gitId":"joelgoh1"},"content":"","lastModifiedDate":"2024-03-08"},{"lineNumber":11,"author":{"gitId":"joelgoh1"},"content":"* **New Feature**: Added the ability to undo/redo previous commands.","lastModifiedDate":"2024-03-08"},{"lineNumber":12,"author":{"gitId":"joelgoh1"},"content":" * 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.","lastModifiedDate":"2024-03-08"},{"lineNumber":13,"author":{"gitId":"joelgoh1"},"content":" * 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.","lastModifiedDate":"2024-03-08"},{"lineNumber":14,"author":{"gitId":"joelgoh1"},"content":" * 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.","lastModifiedDate":"2024-03-08"},{"lineNumber":15,"author":{"gitId":"joelgoh1"},"content":" * 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}*","lastModifiedDate":"2024-03-08"},{"lineNumber":16,"author":{"gitId":"joelgoh1"},"content":"","lastModifiedDate":"2024-03-08"},{"lineNumber":17,"author":{"gitId":"joelgoh1"},"content":"* **New Feature**: Added a history command that allows the user to navigate to previous commands using up/down keys.","lastModifiedDate":"2024-03-08"},{"lineNumber":18,"author":{"gitId":"joelgoh1"},"content":"","lastModifiedDate":"2024-03-08"},{"lineNumber":19,"author":{"gitId":"joelgoh1"},"content":"* **Code contributed**: [RepoSense link]()","lastModifiedDate":"2024-03-08"},{"lineNumber":20,"author":{"gitId":"joelgoh1"},"content":"","lastModifiedDate":"2024-03-08"},{"lineNumber":21,"author":{"gitId":"joelgoh1"},"content":"* **Project management**:","lastModifiedDate":"2024-03-08"},{"lineNumber":22,"author":{"gitId":"joelgoh1"},"content":" * Managed releases `v1.3` - `v1.5rc` (3 releases) on GitHub","lastModifiedDate":"2024-03-08"},{"lineNumber":23,"author":{"gitId":"joelgoh1"},"content":"","lastModifiedDate":"2024-03-08"},{"lineNumber":24,"author":{"gitId":"joelgoh1"},"content":"* **Enhancements to existing features**:","lastModifiedDate":"2024-03-08"},{"lineNumber":25,"author":{"gitId":"joelgoh1"},"content":" * Updated the GUI color scheme (Pull requests [\\#33](), [\\#34]())","lastModifiedDate":"2024-03-08"},{"lineNumber":26,"author":{"gitId":"joelgoh1"},"content":" * Wrote additional tests for existing features to increase coverage from 88% to 92% (Pull requests [\\#36](), [\\#38]())","lastModifiedDate":"2024-03-08"},{"lineNumber":27,"author":{"gitId":"joelgoh1"},"content":"","lastModifiedDate":"2024-03-08"},{"lineNumber":28,"author":{"gitId":"joelgoh1"},"content":"* **Documentation**:","lastModifiedDate":"2024-03-08"},{"lineNumber":29,"author":{"gitId":"joelgoh1"},"content":" * User Guide:","lastModifiedDate":"2024-03-08"},{"lineNumber":30,"author":{"gitId":"joelgoh1"},"content":" * Added documentation for the features `delete` and `find` [\\#72]()","lastModifiedDate":"2024-03-08"},{"lineNumber":31,"author":{"gitId":"joelgoh1"},"content":" * Did cosmetic tweaks to existing documentation of features `clear`, `exit`: [\\#74]()","lastModifiedDate":"2024-03-08"},{"lineNumber":32,"author":{"gitId":"joelgoh1"},"content":" * Developer Guide:","lastModifiedDate":"2024-03-08"},{"lineNumber":33,"author":{"gitId":"joelgoh1"},"content":" * Added implementation details of the `delete` feature.","lastModifiedDate":"2024-03-08"},{"lineNumber":34,"author":{"gitId":"joelgoh1"},"content":"","lastModifiedDate":"2024-03-08"},{"lineNumber":35,"author":{"gitId":"joelgoh1"},"content":"* **Community**:","lastModifiedDate":"2024-03-08"},{"lineNumber":36,"author":{"gitId":"joelgoh1"},"content":" * PRs reviewed (with non-trivial review comments): [\\#12](), [\\#32](), [\\#19](), [\\#42]()","lastModifiedDate":"2024-03-08"},{"lineNumber":37,"author":{"gitId":"joelgoh1"},"content":" * Contributed to forum discussions (examples: [1](), [2](), [3](), [4]())","lastModifiedDate":"2024-03-08"},{"lineNumber":38,"author":{"gitId":"joelgoh1"},"content":" * Reported bugs and suggestions for other teams in the class (examples: [1](), [2](), [3]())","lastModifiedDate":"2024-03-08"},{"lineNumber":39,"author":{"gitId":"joelgoh1"},"content":" * Some parts of the history feature I added was adopted by several other class mates ([1](), [2]())","lastModifiedDate":"2024-03-08"},{"lineNumber":40,"author":{"gitId":"joelgoh1"},"content":"","lastModifiedDate":"2024-03-08"},{"lineNumber":41,"author":{"gitId":"joelgoh1"},"content":"* **Tools**:","lastModifiedDate":"2024-03-08"},{"lineNumber":42,"author":{"gitId":"joelgoh1"},"content":" * Integrated a third party library (Natty) to the project ([\\#42]())","lastModifiedDate":"2024-03-08"},{"lineNumber":43,"author":{"gitId":"joelgoh1"},"content":" * Integrated a new Github plugin (CircleCI) to the team repo","lastModifiedDate":"2024-03-08"},{"lineNumber":44,"author":{"gitId":"joelgoh1"},"content":"","lastModifiedDate":"2024-03-08"},{"lineNumber":45,"author":{"gitId":"joelgoh1"},"content":"* _{you can add/remove categories in the list above}_","lastModifiedDate":"2024-03-08"}],"authorContributionMap":{"joelgoh1":45}},{"path":"docs/team/yap-zong-xin.md","fileType":"docs","lines":[{"lineNumber":1,"author":{"gitId":"yap-zong-xin"},"content":"---","lastModifiedDate":"2024-03-08"},{"lineNumber":2,"author":{"gitId":"yap-zong-xin"},"content":" layout: default.md","lastModifiedDate":"2024-03-08"},{"lineNumber":3,"author":{"gitId":"yap-zong-xin"},"content":" title: \"John Doe\u0027s Project Portfolio Page\"","lastModifiedDate":"2024-03-08"},{"lineNumber":4,"author":{"gitId":"yap-zong-xin"},"content":"---","lastModifiedDate":"2024-03-08"},{"lineNumber":5,"author":{"gitId":"yap-zong-xin"},"content":"","lastModifiedDate":"2024-03-08"},{"lineNumber":6,"author":{"gitId":"yap-zong-xin"},"content":"### Project: AddressBook Level 3","lastModifiedDate":"2024-03-08"},{"lineNumber":7,"author":{"gitId":"yap-zong-xin"},"content":"","lastModifiedDate":"2024-03-08"},{"lineNumber":8,"author":{"gitId":"yap-zong-xin"},"content":"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.","lastModifiedDate":"2024-03-08"},{"lineNumber":9,"author":{"gitId":"yap-zong-xin"},"content":"","lastModifiedDate":"2024-03-08"},{"lineNumber":10,"author":{"gitId":"yap-zong-xin"},"content":"Given below are my contributions to the project.","lastModifiedDate":"2024-03-08"},{"lineNumber":11,"author":{"gitId":"yap-zong-xin"},"content":"","lastModifiedDate":"2024-03-08"},{"lineNumber":12,"author":{"gitId":"yap-zong-xin"},"content":"* **New Feature**: Added the ability to undo/redo previous commands.","lastModifiedDate":"2024-03-08"},{"lineNumber":13,"author":{"gitId":"yap-zong-xin"},"content":" * 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.","lastModifiedDate":"2024-03-08"},{"lineNumber":14,"author":{"gitId":"yap-zong-xin"},"content":" * 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.","lastModifiedDate":"2024-03-08"},{"lineNumber":15,"author":{"gitId":"yap-zong-xin"},"content":" * 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.","lastModifiedDate":"2024-03-08"},{"lineNumber":16,"author":{"gitId":"yap-zong-xin"},"content":" * 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}*","lastModifiedDate":"2024-03-08"},{"lineNumber":17,"author":{"gitId":"yap-zong-xin"},"content":"","lastModifiedDate":"2024-03-08"},{"lineNumber":18,"author":{"gitId":"yap-zong-xin"},"content":"* **New Feature**: Added a history command that allows the user to navigate to previous commands using up/down keys.","lastModifiedDate":"2024-03-08"},{"lineNumber":19,"author":{"gitId":"yap-zong-xin"},"content":"","lastModifiedDate":"2024-03-08"},{"lineNumber":20,"author":{"gitId":"yap-zong-xin"},"content":"* **Code contributed**: [RepoSense link]()","lastModifiedDate":"2024-03-08"},{"lineNumber":21,"author":{"gitId":"yap-zong-xin"},"content":"","lastModifiedDate":"2024-03-08"},{"lineNumber":22,"author":{"gitId":"yap-zong-xin"},"content":"* **Project management**:","lastModifiedDate":"2024-03-08"},{"lineNumber":23,"author":{"gitId":"yap-zong-xin"},"content":" * Managed releases `v1.3` - `v1.5rc` (3 releases) on GitHub","lastModifiedDate":"2024-03-08"},{"lineNumber":24,"author":{"gitId":"yap-zong-xin"},"content":"","lastModifiedDate":"2024-03-08"},{"lineNumber":25,"author":{"gitId":"yap-zong-xin"},"content":"* **Enhancements to existing features**:","lastModifiedDate":"2024-03-08"},{"lineNumber":26,"author":{"gitId":"yap-zong-xin"},"content":" * Updated the GUI color scheme (Pull requests [\\#33](), [\\#34]())","lastModifiedDate":"2024-03-08"},{"lineNumber":27,"author":{"gitId":"yap-zong-xin"},"content":" * Wrote additional tests for existing features to increase coverage from 88% to 92% (Pull requests [\\#36](), [\\#38]())","lastModifiedDate":"2024-03-08"},{"lineNumber":28,"author":{"gitId":"yap-zong-xin"},"content":"","lastModifiedDate":"2024-03-08"},{"lineNumber":29,"author":{"gitId":"yap-zong-xin"},"content":"* **Documentation**:","lastModifiedDate":"2024-03-08"},{"lineNumber":30,"author":{"gitId":"yap-zong-xin"},"content":" * User Guide:","lastModifiedDate":"2024-03-08"},{"lineNumber":31,"author":{"gitId":"yap-zong-xin"},"content":" * Added documentation for the features `delete` and `find` [\\#72]()","lastModifiedDate":"2024-03-08"},{"lineNumber":32,"author":{"gitId":"yap-zong-xin"},"content":" * Did cosmetic tweaks to existing documentation of features `clear`, `exit`: [\\#74]()","lastModifiedDate":"2024-03-08"},{"lineNumber":33,"author":{"gitId":"yap-zong-xin"},"content":" * Developer Guide:","lastModifiedDate":"2024-03-08"},{"lineNumber":34,"author":{"gitId":"yap-zong-xin"},"content":" * Added implementation details of the `delete` feature.","lastModifiedDate":"2024-03-08"},{"lineNumber":35,"author":{"gitId":"yap-zong-xin"},"content":"","lastModifiedDate":"2024-03-08"},{"lineNumber":36,"author":{"gitId":"yap-zong-xin"},"content":"* **Community**:","lastModifiedDate":"2024-03-08"},{"lineNumber":37,"author":{"gitId":"yap-zong-xin"},"content":" * PRs reviewed (with non-trivial review comments): [\\#12](), [\\#32](), [\\#19](), [\\#42]()","lastModifiedDate":"2024-03-08"},{"lineNumber":38,"author":{"gitId":"yap-zong-xin"},"content":" * Contributed to forum discussions (examples: [1](), [2](), [3](), [4]())","lastModifiedDate":"2024-03-08"},{"lineNumber":39,"author":{"gitId":"yap-zong-xin"},"content":" * Reported bugs and suggestions for other teams in the class (examples: [1](), [2](), [3]())","lastModifiedDate":"2024-03-08"},{"lineNumber":40,"author":{"gitId":"yap-zong-xin"},"content":" * Some parts of the history feature I added was adopted by several other class mates ([1](), [2]())","lastModifiedDate":"2024-03-08"},{"lineNumber":41,"author":{"gitId":"yap-zong-xin"},"content":"","lastModifiedDate":"2024-03-08"},{"lineNumber":42,"author":{"gitId":"yap-zong-xin"},"content":"* **Tools**:","lastModifiedDate":"2024-03-08"},{"lineNumber":43,"author":{"gitId":"yap-zong-xin"},"content":" * Integrated a third party library (Natty) to the project ([\\#42]())","lastModifiedDate":"2024-03-08"},{"lineNumber":44,"author":{"gitId":"yap-zong-xin"},"content":" * Integrated a new Github plugin (CircleCI) to the team repo","lastModifiedDate":"2024-03-08"},{"lineNumber":45,"author":{"gitId":"yap-zong-xin"},"content":"","lastModifiedDate":"2024-03-08"},{"lineNumber":46,"author":{"gitId":"yap-zong-xin"},"content":"* _{you can add/remove categories in the list above}_","lastModifiedDate":"2024-03-08"}],"authorContributionMap":{"yap-zong-xin":46}}] diff --git a/AY2324S2-CS2103-F08-4_tp_master/commits.json b/AY2324S2-CS2103-F08-4_tp_master/commits.json index 8d57fd64..a0d0d184 100644 --- a/AY2324S2-CS2103-F08-4_tp_master/commits.json +++ b/AY2324S2-CS2103-F08-4_tp_master/commits.json @@ -1 +1 @@ -{"authorDailyContributionsMap":{"joelgoh1":[{"date":"2024-03-07","commitResults":[{"hash":"9d3905f2e16870b7c7fc50b937596d2f2afe86c7","isMergeCommit":false,"messageTitle":"Update README.md","messageBody":"","fileTypesAndContributionMap":{"docs":{"insertions":15,"deletions":11}}},{"hash":"a145970c0f975007724f6ac592aa96c56f791bef","isMergeCommit":false,"messageTitle":"Update Developer Guide","messageBody":"","fileTypesAndContributionMap":{"docs":{"insertions":24,"deletions":12}}}]},{"date":"2024-03-08","commitResults":[{"hash":"52b64c07c26b6acd8701174e835175c97752220e","isMergeCommit":true,"messageTitle":"Merge pull request #19 from joelgoh1/Developer-Guide-user-stories","messageBody":"Update Developer Guide","fileTypesAndContributionMap":{}}]}],"yap-zong-xin":[],"amanzainal":[{"date":"2024-03-05","commitResults":[{"hash":"fd5d5934fb5bfa242fd47c280dce718f3fc8df53","isMergeCommit":false,"messageTitle":"Update README.md","messageBody":"Display CodeCov badge","fileTypesAndContributionMap":{"docs":{"insertions":1,"deletions":0}}},{"hash":"c6bfc9feedcf85fb3adb9d8015bd0f792eda2252","isMergeCommit":true,"messageTitle":"Merge pull request #1 from amanzainal/master","messageBody":"Update README.md","fileTypesAndContributionMap":{}},{"hash":"812736e2955769c45257d2e44d0ab2de3a2e62e6","isMergeCommit":true,"messageTitle":"Merge branch \u0027switch-docs-to-markbind\u0027","messageBody":"","fileTypesAndContributionMap":{}},{"hash":"e4f6cb65456483bf09561543b1f4ea19f5b5ab30","isMergeCommit":true,"messageTitle":"Merge remote-tracking branch \u0027origin/master\u0027","messageBody":"","fileTypesAndContributionMap":{}},{"hash":"c3b1d254caebc297a3ab39b0bb4ac8834d6f7102","isMergeCommit":false,"messageTitle":"Update site config","messageBody":"","fileTypesAndContributionMap":{"docs":{"insertions":1,"deletions":1}}},{"hash":"4ea9084dcfbb6ffcda01bdcba6c5e3d9efeea282","isMergeCommit":true,"messageTitle":"Merge pull request #2 from amanzainal/master","messageBody":"Set up MarkBind","fileTypesAndContributionMap":{}}]}]},"authorFileTypeContributionMap":{"joelgoh1":{"docs":38,"functional-code":0,"test-code":0},"yap-zong-xin":{"docs":0,"functional-code":0,"test-code":0},"amanzainal":{"docs":2,"functional-code":0,"test-code":0}},"authorContributionVariance":{"joelgoh1":239.18224,"yap-zong-xin":0.0,"amanzainal":0.56},"authorDisplayNameMap":{"joelgoh1":"CS2103-F08-4 JOEL..FENG","yap-zong-xin":"CS2103-F08-4 YAP .. XIN","amanzainal":"CS2103-F08-4 AMAN..IDIN"}} +{"authorDailyContributionsMap":{"joelgoh1":[{"date":"2024-03-07","commitResults":[{"hash":"9d3905f2e16870b7c7fc50b937596d2f2afe86c7","isMergeCommit":false,"messageTitle":"Update README.md","messageBody":"","fileTypesAndContributionMap":{"docs":{"insertions":15,"deletions":11}}},{"hash":"a145970c0f975007724f6ac592aa96c56f791bef","isMergeCommit":false,"messageTitle":"Update Developer Guide","messageBody":"","fileTypesAndContributionMap":{"docs":{"insertions":24,"deletions":12}}}]},{"date":"2024-03-08","commitResults":[{"hash":"eb0d655df51ed9d874ef64ed7434aef16d839a19","isMergeCommit":false,"messageTitle":"Update AboutUs","messageBody":"","fileTypesAndContributionMap":{"docs":{"insertions":51,"deletions":17}}},{"hash":"52b64c07c26b6acd8701174e835175c97752220e","isMergeCommit":true,"messageTitle":"Merge pull request #19 from joelgoh1/Developer-Guide-user-stories","messageBody":"Update Developer Guide","fileTypesAndContributionMap":{}},{"hash":"1fbfd35c642fb80b5cdd72425041acccdfc0a5a9","isMergeCommit":true,"messageTitle":"Merge pull request #22 from joelgoh1/master","messageBody":"Update AboutUs","fileTypesAndContributionMap":{}},{"hash":"0a536b25cd1293a3a977cff9a10814724646564b","isMergeCommit":true,"messageTitle":"Merge pull request #21 from yap-zong-xin/AboutUs","messageBody":"update AboutUs","fileTypesAndContributionMap":{}}]}],"yap-zong-xin":[{"date":"2024-03-08","commitResults":[{"hash":"49d05c3a0f4c8516d5592079170d9a4e34d5031a","isMergeCommit":false,"messageTitle":"add AboutUs","messageBody":"","fileTypesAndContributionMap":{"docs":{"insertions":0,"deletions":0}}},{"hash":"0a249f22a06beb6322d9079b7de1bb7a437b5dea","isMergeCommit":false,"messageTitle":"add AboutUs","messageBody":"","fileTypesAndContributionMap":{"docs":{"insertions":50,"deletions":23}}},{"hash":"f3238f4865d971e57b0e6e10fd1d82c1ad2921b0","isMergeCommit":false,"messageTitle":"update README to include nice-to-have features","messageBody":"","fileTypesAndContributionMap":{"docs":{"insertions":9,"deletions":2}}},{"hash":"6b7f5b8c2c37b9ce8878819f1b4de8429d6c7a2b","isMergeCommit":true,"messageTitle":"Merge pull request #23 from yap-zong-xin/README","messageBody":"update README to include nice-to-have features","fileTypesAndContributionMap":{}}]}],"amanzainal":[{"date":"2024-03-05","commitResults":[{"hash":"fd5d5934fb5bfa242fd47c280dce718f3fc8df53","isMergeCommit":false,"messageTitle":"Update README.md","messageBody":"Display CodeCov badge","fileTypesAndContributionMap":{"docs":{"insertions":1,"deletions":0}}},{"hash":"c6bfc9feedcf85fb3adb9d8015bd0f792eda2252","isMergeCommit":true,"messageTitle":"Merge pull request #1 from amanzainal/master","messageBody":"Update README.md","fileTypesAndContributionMap":{}},{"hash":"812736e2955769c45257d2e44d0ab2de3a2e62e6","isMergeCommit":true,"messageTitle":"Merge branch \u0027switch-docs-to-markbind\u0027","messageBody":"","fileTypesAndContributionMap":{}},{"hash":"e4f6cb65456483bf09561543b1f4ea19f5b5ab30","isMergeCommit":true,"messageTitle":"Merge remote-tracking branch \u0027origin/master\u0027","messageBody":"","fileTypesAndContributionMap":{}},{"hash":"c3b1d254caebc297a3ab39b0bb4ac8834d6f7102","isMergeCommit":false,"messageTitle":"Update site config","messageBody":"","fileTypesAndContributionMap":{"docs":{"insertions":1,"deletions":1}}},{"hash":"4ea9084dcfbb6ffcda01bdcba6c5e3d9efeea282","isMergeCommit":true,"messageTitle":"Merge pull request #2 from amanzainal/master","messageBody":"Set up MarkBind","fileTypesAndContributionMap":{}}]}]},"authorFileTypeContributionMap":{"joelgoh1":{"docs":86,"functional-code":0,"test-code":0},"yap-zong-xin":{"docs":59,"functional-code":0,"test-code":0},"amanzainal":{"docs":2,"functional-code":0,"test-code":0}},"authorContributionVariance":{"joelgoh1":489.4222,"yap-zong-xin":439.04,"amanzainal":0.56},"authorDisplayNameMap":{"joelgoh1":"CS2103-F08-4 JOEL..FENG","yap-zong-xin":"CS2103-F08-4 YAP .. XIN","amanzainal":"CS2103-F08-4 AMAN..IDIN"}} diff --git a/AY2324S2-CS2103-F15-4_tp_master/authorship.json b/AY2324S2-CS2103-F15-4_tp_master/authorship.json index f783a1fb..3cf92956 100644 --- a/AY2324S2-CS2103-F15-4_tp_master/authorship.json +++ b/AY2324S2-CS2103-F15-4_tp_master/authorship.json @@ -1 +1 @@ -[{"path":"README.md","fileType":"docs","lines":[{"lineNumber":1,"author":{"gitId":"garywongkai"},"content":"[![Java CI](https://github.com/AY2324S2-CS2103-F15-4/tp/actions/workflows/gradle.yml/badge.svg?branch\u003dmaster)](https://github.com/AY2324S2-CS2103-F15-4/tp/actions/workflows/gradle.yml)","lastModifiedDate":"2024-02-26"},{"lineNumber":2,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":3,"author":{"gitId":"-"},"content":"![Ui](docs/images/Ui.png)","lastModifiedDate":"2020-05-23"},{"lineNumber":4,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":5,"author":{"gitId":"garywongkai"},"content":"- This is **Moddie!**.\u003cbr\u003e","lastModifiedDate":"2024-02-26"},{"lineNumber":6,"author":{"gitId":"-"},"content":" Example usages:","lastModifiedDate":"2020-05-23"},{"lineNumber":7,"author":{"gitId":"garywongkai"},"content":" - as a starting point of a course project (as opposed to writing everything from scratch)","lastModifiedDate":"2024-02-26"},{"lineNumber":8,"author":{"gitId":"garywongkai"},"content":" - as a case study","lastModifiedDate":"2024-02-26"},{"lineNumber":9,"author":{"gitId":"garywongkai"},"content":"- The project simulates an ongoing software project for a desktop application (called _AddressBook_) used for managing contact details.","lastModifiedDate":"2024-02-26"},{"lineNumber":10,"author":{"gitId":"garywongkai"},"content":" - 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.","lastModifiedDate":"2024-02-26"},{"lineNumber":11,"author":{"gitId":"garywongkai"},"content":" - It comes with a **reasonable level of user and developer documentation**.","lastModifiedDate":"2024-02-26"},{"lineNumber":12,"author":{"gitId":"garywongkai"},"content":"- It is named `Moddie` and it is adapted from `AddressBook3`!","lastModifiedDate":"2024-02-26"},{"lineNumber":13,"author":{"gitId":"garywongkai"},"content":"- For the detailed documentation of this project, see the **[Moddie Product Website](https://ay2324s2-cs2103-f15-4.github.io/tp/index.html)**.","lastModifiedDate":"2024-02-26"},{"lineNumber":14,"author":{"gitId":"garywongkai"},"content":"- 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.","lastModifiedDate":"2024-02-26"}],"authorContributionMap":{"garywongkai":10,"-":4}},{"path":"docs/AboutUs.md","fileType":"docs","lines":[{"lineNumber":1,"author":{"gitId":"-"},"content":"---","lastModifiedDate":"2020-05-23"},{"lineNumber":2,"author":{"gitId":"-"},"content":" layout: default.md","lastModifiedDate":"2023-09-12"},{"lineNumber":3,"author":{"gitId":"-"},"content":" title: \"About Us\"","lastModifiedDate":"2023-09-12"},{"lineNumber":4,"author":{"gitId":"-"},"content":"---","lastModifiedDate":"2020-05-23"},{"lineNumber":5,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":6,"author":{"gitId":"-"},"content":"# About Us","lastModifiedDate":"2023-09-12"},{"lineNumber":7,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2023-09-12"},{"lineNumber":8,"author":{"gitId":"-"},"content":"We are a team based in the [School of Computing, National University of Singapore](http://www.comp.nus.edu.sg).","lastModifiedDate":"2020-05-23"},{"lineNumber":9,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":10,"author":{"gitId":"garywongkai"},"content":"Together we made ````Moddie!``","lastModifiedDate":"2024-02-27"},{"lineNumber":11,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-06-17"},{"lineNumber":12,"author":{"gitId":"-"},"content":"## Project team","lastModifiedDate":"2020-06-07"},{"lineNumber":13,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":14,"author":{"gitId":"-"},"content":"### Wong Kai Li","lastModifiedDate":"2024-02-18"},{"lineNumber":15,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":16,"author":{"gitId":"garywongkai"},"content":"\u003cimg src\u003d\"images/garywongkai.png\" width\u003d\"200px\"\u003e","lastModifiedDate":"2024-02-27"},{"lineNumber":17,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":18,"author":{"gitId":"-"},"content":"[[github](https://github.com/garywongkai)]","lastModifiedDate":"2024-02-18"},{"lineNumber":19,"author":{"gitId":"-"},"content":"[[portfolio](team/johndoe.md)]","lastModifiedDate":"2020-05-23"},{"lineNumber":20,"author":{"gitId":"garywongkai"},"content":"[[Website](https://react-site-three.vercel.app)]","lastModifiedDate":"2024-02-26"},{"lineNumber":21,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":22,"author":{"gitId":"-"},"content":"* Role: Team Lead","lastModifiedDate":"2020-05-23"},{"lineNumber":23,"author":{"gitId":"-"},"content":"* Responsibilities: Testing","lastModifiedDate":"2024-02-18"},{"lineNumber":24,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2024-02-18"},{"lineNumber":25,"author":{"gitId":"-"},"content":"### Alvis Low Yue Han","lastModifiedDate":"2024-02-18"},{"lineNumber":26,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2024-02-18"},{"lineNumber":27,"author":{"gitId":"garywongkai"},"content":"\u003cimg src\u003d\"images/alvislow.png\" width\u003d\"200px\"\u003e","lastModifiedDate":"2024-03-05"},{"lineNumber":28,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2024-02-18"},{"lineNumber":29,"author":{"gitId":"-"},"content":"[[github](https://github.com/beefsausagee)]","lastModifiedDate":"2024-02-18"},{"lineNumber":30,"author":{"gitId":"-"},"content":"[[portfolio](team/johndoe.md)]","lastModifiedDate":"2024-02-18"},{"lineNumber":31,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2024-02-18"},{"lineNumber":32,"author":{"gitId":"-"},"content":"* Role: Developer","lastModifiedDate":"2024-02-18"},{"lineNumber":33,"author":{"gitId":"-"},"content":"* Responsibilities: UI","lastModifiedDate":"2020-05-23"},{"lineNumber":34,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":35,"author":{"gitId":"-"},"content":"### Aw Joey","lastModifiedDate":"2024-02-18"},{"lineNumber":36,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":37,"author":{"gitId":"AwJoey"},"content":"\u003cimg src\u003d\"images/awjoey.jpg\" width\u003d\"200px\"\u003e","lastModifiedDate":"2024-02-27"},{"lineNumber":38,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":39,"author":{"gitId":"-"},"content":"[[github](https://github.com/AwJoey)] [[portfolio](team/johndoe.md)]","lastModifiedDate":"2024-02-18"},{"lineNumber":40,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":41,"author":{"gitId":"-"},"content":"* Role: Developer","lastModifiedDate":"2020-05-23"},{"lineNumber":42,"author":{"gitId":"-"},"content":"* Responsibilities: Data","lastModifiedDate":"2020-05-23"},{"lineNumber":43,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":44,"author":{"gitId":"-"},"content":"### Fu Ming Jun, Dominic","lastModifiedDate":"2024-02-18"},{"lineNumber":45,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":46,"author":{"gitId":"garywongkai"},"content":"\u003cimg src\u003d\"images/dominicfumj.png\" width\u003d\"200px\"\u003e","lastModifiedDate":"2024-03-05"},{"lineNumber":47,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":48,"author":{"gitId":"-"},"content":"[[github](https://github.com/DominicFuMJ)]","lastModifiedDate":"2024-02-18"},{"lineNumber":49,"author":{"gitId":"-"},"content":"[[portfolio](team/johndoe.md)]","lastModifiedDate":"2020-05-23"},{"lineNumber":50,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":51,"author":{"gitId":"-"},"content":"* Role: Developer","lastModifiedDate":"2020-05-23"},{"lineNumber":52,"author":{"gitId":"-"},"content":"* Responsibilities: Dev Ops + Threading","lastModifiedDate":"2020-05-23"},{"lineNumber":53,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":54,"author":{"gitId":"-"},"content":"### Wu Jinyan","lastModifiedDate":"2024-02-18"},{"lineNumber":55,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":56,"author":{"gitId":"garywongkai"},"content":"\u003cimg src\u003d\"images/morninggloryyy.png\" width\u003d\"200px\"\u003e","lastModifiedDate":"2024-03-05"},{"lineNumber":57,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":58,"author":{"gitId":"-"},"content":"[[github](https://github.com/Morninggloryyy)]","lastModifiedDate":"2024-02-18"},{"lineNumber":59,"author":{"gitId":"-"},"content":"[[portfolio](team/johndoe.md)]","lastModifiedDate":"2020-05-23"},{"lineNumber":60,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":61,"author":{"gitId":"-"},"content":"* Role: Developer","lastModifiedDate":"2020-05-23"},{"lineNumber":62,"author":{"gitId":"-"},"content":"* Responsibilities: UI","lastModifiedDate":"2020-05-23"}],"authorContributionMap":{"AwJoey":1,"garywongkai":6,"-":55}},{"path":"docs/DeveloperGuide.md","fileType":"docs","lines":[{"lineNumber":1,"author":{"gitId":"-"},"content":"---","lastModifiedDate":"2020-05-23"},{"lineNumber":2,"author":{"gitId":"-"},"content":" layout: default.md","lastModifiedDate":"2023-09-12"},{"lineNumber":3,"author":{"gitId":"-"},"content":" title: \"Developer Guide\"","lastModifiedDate":"2023-09-12"},{"lineNumber":4,"author":{"gitId":"-"},"content":" pageNav: 3","lastModifiedDate":"2023-09-12"},{"lineNumber":5,"author":{"gitId":"-"},"content":"---","lastModifiedDate":"2020-05-23"},{"lineNumber":6,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2023-09-12"},{"lineNumber":7,"author":{"gitId":"-"},"content":"# AB-3 Developer Guide","lastModifiedDate":"2023-09-12"},{"lineNumber":8,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2023-09-12"},{"lineNumber":9,"author":{"gitId":"-"},"content":"\u003c!-- * Table of Contents --\u003e","lastModifiedDate":"2023-09-12"},{"lineNumber":10,"author":{"gitId":"-"},"content":"\u003cpage-nav-print /\u003e","lastModifiedDate":"2023-09-12"},{"lineNumber":11,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":12,"author":{"gitId":"-"},"content":"--------------------------------------------------------------------------------------------------------------------","lastModifiedDate":"2020-05-23"},{"lineNumber":13,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2021-07-30"},{"lineNumber":14,"author":{"gitId":"-"},"content":"## **Acknowledgements**","lastModifiedDate":"2021-07-30"},{"lineNumber":15,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2021-07-30"},{"lineNumber":16,"author":{"gitId":"-"},"content":"_{ list here sources of all reused/adapted ideas, code, documentation, and third-party libraries -- include links to the original source as well }_","lastModifiedDate":"2023-09-12"},{"lineNumber":17,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2021-07-30"},{"lineNumber":18,"author":{"gitId":"-"},"content":"--------------------------------------------------------------------------------------------------------------------","lastModifiedDate":"2021-07-30"},{"lineNumber":19,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":20,"author":{"gitId":"-"},"content":"## **Setting up, getting started**","lastModifiedDate":"2020-05-23"},{"lineNumber":21,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":22,"author":{"gitId":"-"},"content":"Refer to the guide [_Setting up and getting started_](SettingUp.md).","lastModifiedDate":"2020-05-23"},{"lineNumber":23,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":24,"author":{"gitId":"-"},"content":"--------------------------------------------------------------------------------------------------------------------","lastModifiedDate":"2020-05-23"},{"lineNumber":25,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":26,"author":{"gitId":"-"},"content":"## **Design**","lastModifiedDate":"2020-05-23"},{"lineNumber":27,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":28,"author":{"gitId":"-"},"content":"### Architecture","lastModifiedDate":"2021-07-31"},{"lineNumber":29,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":30,"author":{"gitId":"-"},"content":"\u003cpuml src\u003d\"diagrams/ArchitectureDiagram.puml\" width\u003d\"280\" /\u003e","lastModifiedDate":"2023-09-12"},{"lineNumber":31,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":32,"author":{"gitId":"-"},"content":"The ***Architecture Diagram*** given above explains the high-level design of the App.","lastModifiedDate":"2021-07-31"},{"lineNumber":33,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":34,"author":{"gitId":"-"},"content":"Given below is a quick overview of main components and how they interact with each other.","lastModifiedDate":"2021-07-31"},{"lineNumber":35,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2021-07-31"},{"lineNumber":36,"author":{"gitId":"-"},"content":"**Main components of the architecture**","lastModifiedDate":"2021-07-31"},{"lineNumber":37,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":38,"author":{"gitId":"-"},"content":"**`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.","lastModifiedDate":"2023-09-03"},{"lineNumber":39,"author":{"gitId":"-"},"content":"* At app launch, it initializes the other components in the correct sequence, and connects them up with each other.","lastModifiedDate":"2023-09-03"},{"lineNumber":40,"author":{"gitId":"-"},"content":"* At shut down, it shuts down the other components and invokes cleanup methods where necessary.","lastModifiedDate":"2023-09-03"},{"lineNumber":41,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":42,"author":{"gitId":"-"},"content":"The bulk of the app\u0027s work is done by the following four components:","lastModifiedDate":"2023-09-03"},{"lineNumber":43,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":44,"author":{"gitId":"-"},"content":"* [**`UI`**](#ui-component): The UI of the App.","lastModifiedDate":"2020-05-23"},{"lineNumber":45,"author":{"gitId":"-"},"content":"* [**`Logic`**](#logic-component): The command executor.","lastModifiedDate":"2020-05-23"},{"lineNumber":46,"author":{"gitId":"-"},"content":"* [**`Model`**](#model-component): Holds the data of the App in memory.","lastModifiedDate":"2020-05-23"},{"lineNumber":47,"author":{"gitId":"-"},"content":"* [**`Storage`**](#storage-component): Reads data from, and writes data to, the hard disk.","lastModifiedDate":"2020-05-23"},{"lineNumber":48,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":49,"author":{"gitId":"-"},"content":"[**`Commons`**](#common-classes) represents a collection of classes used by multiple other components.","lastModifiedDate":"2023-09-03"},{"lineNumber":50,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":51,"author":{"gitId":"-"},"content":"**How the architecture components interact with each other**","lastModifiedDate":"2020-05-23"},{"lineNumber":52,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":53,"author":{"gitId":"-"},"content":"The *Sequence Diagram* below shows how the components interact with each other for the scenario where the user issues the command `delete 1`.","lastModifiedDate":"2020-05-23"},{"lineNumber":54,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":55,"author":{"gitId":"-"},"content":"\u003cpuml src\u003d\"diagrams/ArchitectureSequenceDiagram.puml\" width\u003d\"574\" /\u003e","lastModifiedDate":"2023-09-12"},{"lineNumber":56,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":57,"author":{"gitId":"-"},"content":"Each of the four main components (also shown in the diagram above),","lastModifiedDate":"2021-07-31"},{"lineNumber":58,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2021-07-31"},{"lineNumber":59,"author":{"gitId":"-"},"content":"* defines its *API* in an `interface` with the same name as the Component.","lastModifiedDate":"2021-07-31"},{"lineNumber":60,"author":{"gitId":"-"},"content":"* implements its functionality using a concrete `{Component Name}Manager` class (which follows the corresponding API `interface` mentioned in the previous point.","lastModifiedDate":"2021-07-31"},{"lineNumber":61,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2021-07-31"},{"lineNumber":62,"author":{"gitId":"-"},"content":"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\u0027s being coupled to the implementation of a component), as illustrated in the (partial) class diagram below.","lastModifiedDate":"2021-07-31"},{"lineNumber":63,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2021-07-31"},{"lineNumber":64,"author":{"gitId":"-"},"content":"\u003cpuml src\u003d\"diagrams/ComponentManagers.puml\" width\u003d\"300\" /\u003e","lastModifiedDate":"2023-09-12"},{"lineNumber":65,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2021-07-31"},{"lineNumber":66,"author":{"gitId":"-"},"content":"The sections below give more details of each component.","lastModifiedDate":"2020-05-23"},{"lineNumber":67,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":68,"author":{"gitId":"-"},"content":"### UI component","lastModifiedDate":"2020-05-23"},{"lineNumber":69,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":70,"author":{"gitId":"-"},"content":"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)","lastModifiedDate":"2021-07-31"},{"lineNumber":71,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":72,"author":{"gitId":"-"},"content":"\u003cpuml src\u003d\"diagrams/UiClassDiagram.puml\" alt\u003d\"Structure of the UI Component\"/\u003e","lastModifiedDate":"2023-09-12"},{"lineNumber":73,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":74,"author":{"gitId":"-"},"content":"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.","lastModifiedDate":"2021-07-31"},{"lineNumber":75,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":76,"author":{"gitId":"-"},"content":"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)","lastModifiedDate":"2021-07-31"},{"lineNumber":77,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":78,"author":{"gitId":"-"},"content":"The `UI` component,","lastModifiedDate":"2020-05-23"},{"lineNumber":79,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":80,"author":{"gitId":"-"},"content":"* executes user commands using the `Logic` component.","lastModifiedDate":"2021-07-31"},{"lineNumber":81,"author":{"gitId":"-"},"content":"* listens for changes to `Model` data so that the UI can be updated with the modified data.","lastModifiedDate":"2021-07-31"},{"lineNumber":82,"author":{"gitId":"-"},"content":"* keeps a reference to the `Logic` component, because the `UI` relies on the `Logic` to execute commands.","lastModifiedDate":"2021-07-31"},{"lineNumber":83,"author":{"gitId":"-"},"content":"* depends on some classes in the `Model` component, as it displays `Person` object residing in the `Model`.","lastModifiedDate":"2021-07-31"},{"lineNumber":84,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":85,"author":{"gitId":"-"},"content":"### Logic component","lastModifiedDate":"2020-05-23"},{"lineNumber":86,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":87,"author":{"gitId":"-"},"content":"**API** : [`Logic.java`](https://github.com/se-edu/addressbook-level3/tree/master/src/main/java/seedu/address/logic/Logic.java)","lastModifiedDate":"2021-07-31"},{"lineNumber":88,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":89,"author":{"gitId":"-"},"content":"Here\u0027s a (partial) class diagram of the `Logic` component:","lastModifiedDate":"2021-07-31"},{"lineNumber":90,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":91,"author":{"gitId":"-"},"content":"\u003cpuml src\u003d\"diagrams/LogicClassDiagram.puml\" width\u003d\"550\"/\u003e","lastModifiedDate":"2023-09-12"},{"lineNumber":92,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":93,"author":{"gitId":"-"},"content":"The sequence diagram below illustrates the interactions within the `Logic` component, taking `execute(\"delete 1\")` API call as an example.","lastModifiedDate":"2023-09-03"},{"lineNumber":94,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":95,"author":{"gitId":"-"},"content":"\u003cpuml src\u003d\"diagrams/DeleteSequenceDiagram.puml\" alt\u003d\"Interactions Inside the Logic Component for the `delete 1` Command\" /\u003e","lastModifiedDate":"2023-09-12"},{"lineNumber":96,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2023-09-12"},{"lineNumber":97,"author":{"gitId":"-"},"content":"\u003cbox type\u003d\"info\" seamless\u003e","lastModifiedDate":"2023-09-12"},{"lineNumber":98,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":99,"author":{"gitId":"-"},"content":"**Note:** The lifeline for `DeleteCommandParser` should end at the destroy marker (X) but due to a limitation of PlantUML, the lifeline continues till the end of diagram.","lastModifiedDate":"2023-09-12"},{"lineNumber":100,"author":{"gitId":"-"},"content":"\u003c/box\u003e","lastModifiedDate":"2023-09-12"},{"lineNumber":101,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":102,"author":{"gitId":"-"},"content":"How the `Logic` component works:","lastModifiedDate":"2023-09-03"},{"lineNumber":103,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2023-09-03"},{"lineNumber":104,"author":{"gitId":"-"},"content":"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.","lastModifiedDate":"2023-09-03"},{"lineNumber":105,"author":{"gitId":"-"},"content":"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`.","lastModifiedDate":"2023-09-03"},{"lineNumber":106,"author":{"gitId":"-"},"content":"1. The command can communicate with the `Model` when it is executed (e.g. to delete a person).\u003cbr\u003e","lastModifiedDate":"2024-02-09"},{"lineNumber":107,"author":{"gitId":"-"},"content":" Note that although this is shown as a single step in the diagram above (for simplicity), in the code it can take several interactions (between the command object and the `Model`) to achieve.","lastModifiedDate":"2024-02-09"},{"lineNumber":108,"author":{"gitId":"-"},"content":"1. The result of the command execution is encapsulated as a `CommandResult` object which is returned back from `Logic`.","lastModifiedDate":"2023-09-03"},{"lineNumber":109,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2023-09-03"},{"lineNumber":110,"author":{"gitId":"-"},"content":"Here are the other classes in `Logic` (omitted from the class diagram above) that are used for parsing a user command:","lastModifiedDate":"2021-07-31"},{"lineNumber":111,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2021-07-31"},{"lineNumber":112,"author":{"gitId":"-"},"content":"\u003cpuml src\u003d\"diagrams/ParserClasses.puml\" width\u003d\"600\"/\u003e","lastModifiedDate":"2023-09-12"},{"lineNumber":113,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":114,"author":{"gitId":"-"},"content":"How the parsing works:","lastModifiedDate":"2021-07-31"},{"lineNumber":115,"author":{"gitId":"-"},"content":"* 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.","lastModifiedDate":"2021-07-31"},{"lineNumber":116,"author":{"gitId":"-"},"content":"* 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.","lastModifiedDate":"2021-07-31"},{"lineNumber":117,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":118,"author":{"gitId":"-"},"content":"### Model component","lastModifiedDate":"2021-07-31"},{"lineNumber":119,"author":{"gitId":"-"},"content":"**API** : [`Model.java`](https://github.com/se-edu/addressbook-level3/tree/master/src/main/java/seedu/address/model/Model.java)","lastModifiedDate":"2020-05-23"},{"lineNumber":120,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":121,"author":{"gitId":"-"},"content":"\u003cpuml src\u003d\"diagrams/ModelClassDiagram.puml\" width\u003d\"450\" /\u003e","lastModifiedDate":"2023-09-12"},{"lineNumber":122,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":123,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":124,"author":{"gitId":"-"},"content":"The `Model` component,","lastModifiedDate":"2021-07-31"},{"lineNumber":125,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":126,"author":{"gitId":"-"},"content":"* stores the address book data i.e., all `Person` objects (which are contained in a `UniquePersonList` object).","lastModifiedDate":"2021-07-31"},{"lineNumber":127,"author":{"gitId":"-"},"content":"* stores the currently \u0027selected\u0027 `Person` objects (e.g., results of a search query) as a separate _filtered_ list which is exposed to outsiders as an unmodifiable `ObservableList\u003cPerson\u003e` that can be \u0027observed\u0027 e.g. the UI can be bound to this list so that the UI automatically updates when the data in the list change.","lastModifiedDate":"2021-07-31"},{"lineNumber":128,"author":{"gitId":"-"},"content":"* stores a `UserPref` object that represents the user’s preferences. This is exposed to the outside as a `ReadOnlyUserPref` objects.","lastModifiedDate":"2021-07-31"},{"lineNumber":129,"author":{"gitId":"-"},"content":"* 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)","lastModifiedDate":"2021-07-31"},{"lineNumber":130,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2021-07-31"},{"lineNumber":131,"author":{"gitId":"-"},"content":"\u003cbox type\u003d\"info\" seamless\u003e","lastModifiedDate":"2023-09-12"},{"lineNumber":132,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2023-09-12"},{"lineNumber":133,"author":{"gitId":"-"},"content":"**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.\u003cbr\u003e","lastModifiedDate":"2023-09-12"},{"lineNumber":134,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2021-07-31"},{"lineNumber":135,"author":{"gitId":"-"},"content":"\u003cpuml src\u003d\"diagrams/BetterModelClassDiagram.puml\" width\u003d\"450\" /\u003e","lastModifiedDate":"2023-09-12"},{"lineNumber":136,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":137,"author":{"gitId":"-"},"content":"\u003c/box\u003e","lastModifiedDate":"2023-09-12"},{"lineNumber":138,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":139,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":140,"author":{"gitId":"-"},"content":"### Storage component","lastModifiedDate":"2020-05-23"},{"lineNumber":141,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":142,"author":{"gitId":"-"},"content":"**API** : [`Storage.java`](https://github.com/se-edu/addressbook-level3/tree/master/src/main/java/seedu/address/storage/Storage.java)","lastModifiedDate":"2020-05-23"},{"lineNumber":143,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":144,"author":{"gitId":"-"},"content":"\u003cpuml src\u003d\"diagrams/StorageClassDiagram.puml\" width\u003d\"550\" /\u003e","lastModifiedDate":"2023-09-12"},{"lineNumber":145,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2021-07-31"},{"lineNumber":146,"author":{"gitId":"-"},"content":"The `Storage` component,","lastModifiedDate":"2020-05-23"},{"lineNumber":147,"author":{"gitId":"-"},"content":"* can save both address book data and user preference data in JSON format, and read them back into corresponding objects.","lastModifiedDate":"2023-09-03"},{"lineNumber":148,"author":{"gitId":"-"},"content":"* inherits from both `AddressBookStorage` and `UserPrefStorage`, which means it can be treated as either one (if only the functionality of only one is needed).","lastModifiedDate":"2021-07-31"},{"lineNumber":149,"author":{"gitId":"-"},"content":"* depends on some classes in the `Model` component (because the `Storage` component\u0027s job is to save/retrieve objects that belong to the `Model`)","lastModifiedDate":"2021-07-21"},{"lineNumber":150,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":151,"author":{"gitId":"-"},"content":"### Common classes","lastModifiedDate":"2020-05-23"},{"lineNumber":152,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":153,"author":{"gitId":"-"},"content":"Classes used by multiple components are in the `seedu.addressbook.commons` package.","lastModifiedDate":"2020-05-23"},{"lineNumber":154,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":155,"author":{"gitId":"-"},"content":"--------------------------------------------------------------------------------------------------------------------","lastModifiedDate":"2020-05-23"},{"lineNumber":156,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":157,"author":{"gitId":"-"},"content":"## **Implementation**","lastModifiedDate":"2020-05-23"},{"lineNumber":158,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":159,"author":{"gitId":"-"},"content":"This section describes some noteworthy details on how certain features are implemented.","lastModifiedDate":"2020-05-23"},{"lineNumber":160,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":161,"author":{"gitId":"-"},"content":"### \\[Proposed\\] Undo/redo feature","lastModifiedDate":"2020-06-07"},{"lineNumber":162,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":163,"author":{"gitId":"-"},"content":"#### Proposed Implementation","lastModifiedDate":"2020-05-23"},{"lineNumber":164,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":165,"author":{"gitId":"-"},"content":"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:","lastModifiedDate":"2020-05-23"},{"lineNumber":166,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":167,"author":{"gitId":"-"},"content":"* `VersionedAddressBook#commit()` — Saves the current address book state in its history.","lastModifiedDate":"2020-05-23"},{"lineNumber":168,"author":{"gitId":"-"},"content":"* `VersionedAddressBook#undo()` — Restores the previous address book state from its history.","lastModifiedDate":"2020-05-23"},{"lineNumber":169,"author":{"gitId":"-"},"content":"* `VersionedAddressBook#redo()` — Restores a previously undone address book state from its history.","lastModifiedDate":"2020-05-23"},{"lineNumber":170,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":171,"author":{"gitId":"-"},"content":"These operations are exposed in the `Model` interface as `Model#commitAddressBook()`, `Model#undoAddressBook()` and `Model#redoAddressBook()` respectively.","lastModifiedDate":"2020-05-23"},{"lineNumber":172,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":173,"author":{"gitId":"-"},"content":"Given below is an example usage scenario and how the undo/redo mechanism behaves at each step.","lastModifiedDate":"2020-05-23"},{"lineNumber":174,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":175,"author":{"gitId":"-"},"content":"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.","lastModifiedDate":"2020-05-23"},{"lineNumber":176,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":177,"author":{"gitId":"-"},"content":"\u003cpuml src\u003d\"diagrams/UndoRedoState0.puml\" alt\u003d\"UndoRedoState0\" /\u003e","lastModifiedDate":"2023-09-12"},{"lineNumber":178,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":179,"author":{"gitId":"-"},"content":"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.","lastModifiedDate":"2020-05-23"},{"lineNumber":180,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":181,"author":{"gitId":"-"},"content":"\u003cpuml src\u003d\"diagrams/UndoRedoState1.puml\" alt\u003d\"UndoRedoState1\" /\u003e","lastModifiedDate":"2023-09-12"},{"lineNumber":182,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":183,"author":{"gitId":"-"},"content":"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`.","lastModifiedDate":"2020-05-23"},{"lineNumber":184,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":185,"author":{"gitId":"-"},"content":"\u003cpuml src\u003d\"diagrams/UndoRedoState2.puml\" alt\u003d\"UndoRedoState2\" /\u003e","lastModifiedDate":"2023-09-12"},{"lineNumber":186,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":187,"author":{"gitId":"-"},"content":"\u003cbox type\u003d\"info\" seamless\u003e","lastModifiedDate":"2023-09-12"},{"lineNumber":188,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":189,"author":{"gitId":"-"},"content":"**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`.","lastModifiedDate":"2023-09-12"},{"lineNumber":190,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2023-09-12"},{"lineNumber":191,"author":{"gitId":"-"},"content":"\u003c/box\u003e","lastModifiedDate":"2023-09-12"},{"lineNumber":192,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":193,"author":{"gitId":"-"},"content":"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.","lastModifiedDate":"2020-05-23"},{"lineNumber":194,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":195,"author":{"gitId":"-"},"content":"\u003cpuml src\u003d\"diagrams/UndoRedoState3.puml\" alt\u003d\"UndoRedoState3\" /\u003e","lastModifiedDate":"2023-09-12"},{"lineNumber":196,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2023-09-12"},{"lineNumber":197,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2023-09-12"},{"lineNumber":198,"author":{"gitId":"-"},"content":"\u003cbox type\u003d\"info\" seamless\u003e","lastModifiedDate":"2023-09-12"},{"lineNumber":199,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":200,"author":{"gitId":"-"},"content":"**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","lastModifiedDate":"2023-09-12"},{"lineNumber":201,"author":{"gitId":"-"},"content":"than attempting to perform the undo.","lastModifiedDate":"2020-05-23"},{"lineNumber":202,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":203,"author":{"gitId":"-"},"content":"\u003c/box\u003e","lastModifiedDate":"2023-09-12"},{"lineNumber":204,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":205,"author":{"gitId":"-"},"content":"The following sequence diagram shows how an undo operation goes through the `Logic` component:","lastModifiedDate":"2024-02-09"},{"lineNumber":206,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":207,"author":{"gitId":"-"},"content":"\u003cpuml src\u003d\"diagrams/UndoSequenceDiagram-Logic.puml\" alt\u003d\"UndoSequenceDiagram-Logic\" /\u003e","lastModifiedDate":"2023-09-12"},{"lineNumber":208,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":209,"author":{"gitId":"-"},"content":"\u003cbox type\u003d\"info\" seamless\u003e","lastModifiedDate":"2023-09-12"},{"lineNumber":210,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":211,"author":{"gitId":"-"},"content":"**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.","lastModifiedDate":"2023-09-12"},{"lineNumber":212,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2023-09-12"},{"lineNumber":213,"author":{"gitId":"-"},"content":"\u003c/box\u003e","lastModifiedDate":"2023-09-12"},{"lineNumber":214,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":215,"author":{"gitId":"-"},"content":"Similarly, how an undo operation goes through the `Model` component is shown below:","lastModifiedDate":"2024-02-09"},{"lineNumber":216,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2024-02-09"},{"lineNumber":217,"author":{"gitId":"-"},"content":"\u003cpuml src\u003d\"diagrams/UndoSequenceDiagram-Model.puml\" alt\u003d\"UndoSequenceDiagram-Model\" /\u003e","lastModifiedDate":"2023-09-12"},{"lineNumber":218,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2024-02-09"},{"lineNumber":219,"author":{"gitId":"-"},"content":"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.","lastModifiedDate":"2020-05-23"},{"lineNumber":220,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":221,"author":{"gitId":"-"},"content":"\u003cbox type\u003d\"info\" seamless\u003e","lastModifiedDate":"2023-09-12"},{"lineNumber":222,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2023-09-12"},{"lineNumber":223,"author":{"gitId":"-"},"content":"**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.","lastModifiedDate":"2023-09-12"},{"lineNumber":224,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":225,"author":{"gitId":"-"},"content":"\u003c/box\u003e","lastModifiedDate":"2023-09-12"},{"lineNumber":226,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":227,"author":{"gitId":"-"},"content":"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.","lastModifiedDate":"2020-05-23"},{"lineNumber":228,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":229,"author":{"gitId":"-"},"content":"\u003cpuml src\u003d\"diagrams/UndoRedoState4.puml\" alt\u003d\"UndoRedoState4\" /\u003e","lastModifiedDate":"2023-09-12"},{"lineNumber":230,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":231,"author":{"gitId":"-"},"content":"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.","lastModifiedDate":"2020-05-23"},{"lineNumber":232,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":233,"author":{"gitId":"-"},"content":"\u003cpuml src\u003d\"diagrams/UndoRedoState5.puml\" alt\u003d\"UndoRedoState5\" /\u003e","lastModifiedDate":"2023-09-12"},{"lineNumber":234,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":235,"author":{"gitId":"-"},"content":"The following activity diagram summarizes what happens when a user executes a new command:","lastModifiedDate":"2020-05-23"},{"lineNumber":236,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":237,"author":{"gitId":"-"},"content":"\u003cpuml src\u003d\"diagrams/CommitActivityDiagram.puml\" width\u003d\"250\" /\u003e","lastModifiedDate":"2023-09-12"},{"lineNumber":238,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":239,"author":{"gitId":"-"},"content":"#### Design considerations:","lastModifiedDate":"2021-07-31"},{"lineNumber":240,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":241,"author":{"gitId":"-"},"content":"**Aspect: How undo \u0026 redo executes:**","lastModifiedDate":"2021-07-31"},{"lineNumber":242,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":243,"author":{"gitId":"-"},"content":"* **Alternative 1 (current choice):** Saves the entire address book.","lastModifiedDate":"2020-05-23"},{"lineNumber":244,"author":{"gitId":"-"},"content":" * Pros: Easy to implement.","lastModifiedDate":"2020-05-23"},{"lineNumber":245,"author":{"gitId":"-"},"content":" * Cons: May have performance issues in terms of memory usage.","lastModifiedDate":"2020-05-23"},{"lineNumber":246,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":247,"author":{"gitId":"-"},"content":"* **Alternative 2:** Individual command knows how to undo/redo by","lastModifiedDate":"2020-05-23"},{"lineNumber":248,"author":{"gitId":"-"},"content":" itself.","lastModifiedDate":"2020-05-23"},{"lineNumber":249,"author":{"gitId":"-"},"content":" * Pros: Will use less memory (e.g. for `delete`, just save the person being deleted).","lastModifiedDate":"2020-05-23"},{"lineNumber":250,"author":{"gitId":"-"},"content":" * Cons: We must ensure that the implementation of each individual command are correct.","lastModifiedDate":"2020-05-23"},{"lineNumber":251,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":252,"author":{"gitId":"-"},"content":"_{more aspects and alternatives to be added}_","lastModifiedDate":"2020-05-23"},{"lineNumber":253,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":254,"author":{"gitId":"-"},"content":"### \\[Proposed\\] Data archiving","lastModifiedDate":"2020-05-23"},{"lineNumber":255,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":256,"author":{"gitId":"-"},"content":"_{Explain here how the data archiving feature will be implemented}_","lastModifiedDate":"2020-05-23"},{"lineNumber":257,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":258,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":259,"author":{"gitId":"-"},"content":"--------------------------------------------------------------------------------------------------------------------","lastModifiedDate":"2020-05-23"},{"lineNumber":260,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":261,"author":{"gitId":"-"},"content":"## **Documentation, logging, testing, configuration, dev-ops**","lastModifiedDate":"2020-06-07"},{"lineNumber":262,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":263,"author":{"gitId":"-"},"content":"* [Documentation guide](Documentation.md)","lastModifiedDate":"2020-06-07"},{"lineNumber":264,"author":{"gitId":"-"},"content":"* [Testing guide](Testing.md)","lastModifiedDate":"2020-06-07"},{"lineNumber":265,"author":{"gitId":"-"},"content":"* [Logging guide](Logging.md)","lastModifiedDate":"2020-06-07"},{"lineNumber":266,"author":{"gitId":"-"},"content":"* [Configuration guide](Configuration.md)","lastModifiedDate":"2020-06-07"},{"lineNumber":267,"author":{"gitId":"-"},"content":"* [DevOps guide](DevOps.md)","lastModifiedDate":"2020-06-07"},{"lineNumber":268,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":269,"author":{"gitId":"-"},"content":"--------------------------------------------------------------------------------------------------------------------","lastModifiedDate":"2020-05-23"},{"lineNumber":270,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":271,"author":{"gitId":"-"},"content":"## **Appendix: Requirements**","lastModifiedDate":"2020-05-23"},{"lineNumber":272,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":273,"author":{"gitId":"-"},"content":"### Product scope","lastModifiedDate":"2020-05-23"},{"lineNumber":274,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":275,"author":{"gitId":"-"},"content":"**Target user profile**:","lastModifiedDate":"2020-05-23"},{"lineNumber":276,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":277,"author":{"gitId":"-"},"content":"* has a need to manage a significant number of contacts","lastModifiedDate":"2020-05-23"},{"lineNumber":278,"author":{"gitId":"-"},"content":"* prefer desktop apps over other types","lastModifiedDate":"2020-05-23"},{"lineNumber":279,"author":{"gitId":"-"},"content":"* can type fast","lastModifiedDate":"2020-05-23"},{"lineNumber":280,"author":{"gitId":"-"},"content":"* prefers typing to mouse interactions","lastModifiedDate":"2020-05-26"},{"lineNumber":281,"author":{"gitId":"-"},"content":"* is reasonably comfortable using CLI apps","lastModifiedDate":"2020-05-23"},{"lineNumber":282,"author":{"gitId":"garywongkai"},"content":"* uses application to track schedule of contacts","lastModifiedDate":"2024-03-05"},{"lineNumber":283,"author":{"gitId":"garywongkai"},"content":"* prefer a simple UI","lastModifiedDate":"2024-03-05"},{"lineNumber":284,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":285,"author":{"gitId":"-"},"content":"**Value proposition**: manage contacts faster than a typical mouse/GUI driven app","lastModifiedDate":"2020-05-23"},{"lineNumber":286,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":287,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":288,"author":{"gitId":"-"},"content":"### User stories","lastModifiedDate":"2020-06-07"},{"lineNumber":289,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":290,"author":{"gitId":"-"},"content":"Priorities: High (must have) - `* * *`, Medium (nice to have) - `* *`, Low (unlikely to have) - `*`","lastModifiedDate":"2020-05-23"},{"lineNumber":291,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":292,"author":{"gitId":"-"},"content":"| Priority | As a …​ | I want to …​ | So that I can…​ |","lastModifiedDate":"2020-05-23"},{"lineNumber":293,"author":{"gitId":"-"},"content":"|----------|--------------------------------------------|------------------------------|------------------------------------------------------------------------|","lastModifiedDate":"2023-09-12"},{"lineNumber":294,"author":{"gitId":"beefsausagee"},"content":"| `* * *` | busy student | quickly check my friends\u0027 schedules | find a suitable time to plan a meetup. |","lastModifiedDate":"2024-02-28"},{"lineNumber":295,"author":{"gitId":"beefsausagee"},"content":"| `* * *` | NUS student who likes **---** | find who has similar hobbies/interests with me | know who might want to go to a **---** related activities with me.|","lastModifiedDate":"2024-02-27"},{"lineNumber":296,"author":{"gitId":"beefsausagee"},"content":"| `* * *` | NUS student who prefers command line interface | have a GUI to include commands | add details with convenience |","lastModifiedDate":"2024-02-27"},{"lineNumber":297,"author":{"gitId":"beefsausagee"},"content":"| `* * *` | NUS student working part time | utilise Moddie to store contact details for team members, advisor | optimise my time management with school and work. |","lastModifiedDate":"2024-02-27"},{"lineNumber":298,"author":{"gitId":"beefsausagee"},"content":"| `* * *` | student project team leader | check my teammates\u0027 schedule | conduct meetings with convenience |","lastModifiedDate":"2024-02-27"},{"lineNumber":299,"author":{"gitId":"beefsausagee"},"content":"| `* * *` | international NUS student | find local friends that share similar schedules as me to aid me in easing into the university | build meaningful connections, navigate campus life more smoothly. |","lastModifiedDate":"2024-02-27"},{"lineNumber":300,"author":{"gitId":"beefsausagee"},"content":"| `* * *` | unmotivated student who needs to catch up on my studies|manage my timetable with my friends |easily arrange a study session with them |","lastModifiedDate":"2024-02-27"},{"lineNumber":301,"author":{"gitId":"beefsausagee"},"content":"| `* * *` | lonely NUS Student| find contacts of people with similar interests as myself| get to know them better and make friends.|","lastModifiedDate":"2024-02-28"},{"lineNumber":302,"author":{"gitId":"beefsausagee"},"content":"| `* * *` | NUS graduate|find my lecturer’s contact email and phone number | ask them to be a reference in my resume when applying for a job.|","lastModifiedDate":"2024-02-28"},{"lineNumber":303,"author":{"gitId":"beefsausagee"},"content":"| `* * *` |NUS Student| save my friends’ interests in the contact book| plan outings with them.|","lastModifiedDate":"2024-02-28"},{"lineNumber":304,"author":{"gitId":"beefsausagee"},"content":"| `* * *` |busy NUS student | easily add my schedule to Moddie|efficiently manage my academic, extracurricular, and personal commitments in one centralized platform.|","lastModifiedDate":"2024-02-28"},{"lineNumber":305,"author":{"gitId":"beefsausagee"},"content":"| `* * *` | NUS student| delete both my friends\u0027 and my own schedule details| maintain privacy and control over the information|","lastModifiedDate":"2024-02-28"},{"lineNumber":306,"author":{"gitId":"beefsausagee"},"content":"| `* * *` | NUS student| view my friends\u0027 and their schedule details |easily coordinate plans, schedule meetings |","lastModifiedDate":"2024-02-28"},{"lineNumber":307,"author":{"gitId":"beefsausagee"},"content":"| `* * *` | NUS student who gets confused with commands| have an interface to assist me|know what commands I can use |","lastModifiedDate":"2024-02-28"},{"lineNumber":308,"author":{"gitId":"beefsausagee"},"content":"| `* * *` |NUS student | exit the interface|properly close the application |","lastModifiedDate":"2024-02-28"},{"lineNumber":309,"author":{"gitId":"beefsausagee"},"content":"| `* * *` |NUS student|clear my commands |clear command messages that I do not need anymore |","lastModifiedDate":"2024-02-28"},{"lineNumber":310,"author":{"gitId":"beefsausagee"},"content":"| `* *` | NUS graduate| save the contacts of my Lecturer and Tutor| stay in touch with them after graduation.|","lastModifiedDate":"2024-02-28"},{"lineNumber":311,"author":{"gitId":"beefsausagee"},"content":"| `* *` | NUS student who makes errors|have an interface to prompt me | prevent myself from typing the wrong command.|","lastModifiedDate":"2024-02-28"},{"lineNumber":312,"author":{"gitId":"beefsausagee"},"content":"| `* *` |NUS student who wants to join extracurricular activities |have a place to store my CCA events |easily make time for them. |","lastModifiedDate":"2024-02-28"},{"lineNumber":313,"author":{"gitId":"beefsausagee"},"content":"| `* *` |NUS student who would like timetable suggestions|see other people\u0027s schedules to see who is taking the same modules as me |see what other modules they are also planning to take in the semester. |","lastModifiedDate":"2024-02-28"},{"lineNumber":314,"author":{"gitId":"beefsausagee"},"content":"| `* *` |NUS student pursuing an internship | coordinate networking events and informational interviews with local professionals and industry experts|expand my professional network and efficiently manage my academic commitments. |","lastModifiedDate":"2024-02-28"},{"lineNumber":315,"author":{"gitId":"beefsausagee"},"content":"| `* *` | course coordinator at NUS|communicate announcements, updates, and assignment deadlines to my students | provide a convenient channel for information dissemination and student engagement.|","lastModifiedDate":"2024-02-28"},{"lineNumber":316,"author":{"gitId":"beefsausagee"},"content":"| `* *` |Lecturer | arrange the contacts of the TAs using a module tag| send the correct instructions for the module.|","lastModifiedDate":"2024-02-28"},{"lineNumber":317,"author":{"gitId":"beefsausagee"},"content":"| `* *` |NUS student |edit my schedule, in case of any changes | ensure that my calendar remains accurate and reflective of my current commitments and availability.|","lastModifiedDate":"2024-02-28"},{"lineNumber":318,"author":{"gitId":"beefsausagee"},"content":"| `*` |NUS Student | see the schedule and interest of my classmates to know who would share the same interest as me|meet them for outings/lunch. |","lastModifiedDate":"2024-02-28"},{"lineNumber":319,"author":{"gitId":"beefsausagee"},"content":"| `*` | project leader|have an interface to see the timetable of my group mates | synchronise meetings best fitted for everyone’s schedule.|","lastModifiedDate":"2024-02-28"},{"lineNumber":320,"author":{"gitId":"beefsausagee"},"content":"| `*` | international student| know my groupmates’ schedules to better arrange my flights (to avoid missing any meeting)| successfully accommodate my travel plans.|","lastModifiedDate":"2024-02-28"},{"lineNumber":321,"author":{"gitId":"beefsausagee"},"content":"| `*` |introverted NUS student|arrange meetings with my new groupmates without interacting with them| comfortably initiate group collaboration and fulfil project requirements.|","lastModifiedDate":"2024-02-28"},{"lineNumber":322,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":323,"author":{"gitId":"-"},"content":"### Use cases","lastModifiedDate":"2020-06-07"},{"lineNumber":324,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":325,"author":{"gitId":"garywongkai"},"content":"(For all use cases below, the **System** is the `Moddie` and the **Actor** is the `user`, unless specified otherwise)","lastModifiedDate":"2024-03-05"},{"lineNumber":326,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":327,"author":{"gitId":"-"},"content":"**Use case: Delete a person**","lastModifiedDate":"2020-05-23"},{"lineNumber":328,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":329,"author":{"gitId":"-"},"content":"**MSS**","lastModifiedDate":"2020-05-23"},{"lineNumber":330,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":331,"author":{"gitId":"-"},"content":"1. User requests to list persons","lastModifiedDate":"2020-05-23"},{"lineNumber":332,"author":{"gitId":"-"},"content":"2. AddressBook shows a list of persons","lastModifiedDate":"2020-05-23"},{"lineNumber":333,"author":{"gitId":"-"},"content":"3. User requests to delete a specific person in the list","lastModifiedDate":"2020-05-23"},{"lineNumber":334,"author":{"gitId":"-"},"content":"4. AddressBook deletes the person","lastModifiedDate":"2020-05-23"},{"lineNumber":335,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":336,"author":{"gitId":"-"},"content":" Use case ends.","lastModifiedDate":"2020-05-23"},{"lineNumber":337,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":338,"author":{"gitId":"-"},"content":"**Extensions**","lastModifiedDate":"2020-05-23"},{"lineNumber":339,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":340,"author":{"gitId":"-"},"content":"* 2a. The list is empty.","lastModifiedDate":"2020-05-23"},{"lineNumber":341,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":342,"author":{"gitId":"-"},"content":" Use case ends.","lastModifiedDate":"2020-05-23"},{"lineNumber":343,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":344,"author":{"gitId":"-"},"content":"* 3a. The given index is invalid.","lastModifiedDate":"2020-05-23"},{"lineNumber":345,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":346,"author":{"gitId":"-"},"content":" * 3a1. AddressBook shows an error message.","lastModifiedDate":"2020-05-23"},{"lineNumber":347,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":348,"author":{"gitId":"-"},"content":" Use case resumes at step 2.","lastModifiedDate":"2020-05-23"},{"lineNumber":349,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":350,"author":{"gitId":"-"},"content":"*{More to be added}*","lastModifiedDate":"2020-05-23"},{"lineNumber":351,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":352,"author":{"gitId":"-"},"content":"### Non-Functional Requirements","lastModifiedDate":"2020-05-23"},{"lineNumber":353,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":354,"author":{"gitId":"-"},"content":"1. Should work on any _mainstream OS_ as long as it has Java `11` or above installed.","lastModifiedDate":"2020-05-23"},{"lineNumber":355,"author":{"gitId":"-"},"content":"2. Should be able to hold up to 1000 persons without a noticeable sluggishness in performance for typical usage.","lastModifiedDate":"2020-05-23"},{"lineNumber":356,"author":{"gitId":"-"},"content":"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.","lastModifiedDate":"2020-05-23"},{"lineNumber":357,"author":{"gitId":"garywongkai"},"content":"4. A user can have less than 6 modules in their timetable at a given time.","lastModifiedDate":"2024-02-28"},{"lineNumber":358,"author":{"gitId":"garywongkai"},"content":"5. A user can view 5 other students at one go in the schedule view.","lastModifiedDate":"2024-02-28"},{"lineNumber":359,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":360,"author":{"gitId":"-"},"content":"*{More to be added}*","lastModifiedDate":"2020-05-23"},{"lineNumber":361,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":362,"author":{"gitId":"-"},"content":"### Glossary","lastModifiedDate":"2020-05-23"},{"lineNumber":363,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":364,"author":{"gitId":"-"},"content":"* **Mainstream OS**: Windows, Linux, Unix, MacOS","lastModifiedDate":"2024-02-09"},{"lineNumber":365,"author":{"gitId":"-"},"content":"* **Private contact detail**: A contact detail that is not meant to be shared with others","lastModifiedDate":"2020-05-23"},{"lineNumber":366,"author":{"gitId":"garywongkai"},"content":"* **Module**: A slot in the day used for lesson","lastModifiedDate":"2024-02-28"},{"lineNumber":367,"author":{"gitId":"-"},"content":"--------------------------------------------------------------------------------------------------------------------","lastModifiedDate":"2020-05-23"},{"lineNumber":368,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":369,"author":{"gitId":"-"},"content":"## **Appendix: Instructions for manual testing**","lastModifiedDate":"2020-05-23"},{"lineNumber":370,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":371,"author":{"gitId":"-"},"content":"Given below are instructions to test the app manually.","lastModifiedDate":"2020-05-23"},{"lineNumber":372,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":373,"author":{"gitId":"-"},"content":"\u003cbox type\u003d\"info\" seamless\u003e","lastModifiedDate":"2023-09-12"},{"lineNumber":374,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2023-09-12"},{"lineNumber":375,"author":{"gitId":"-"},"content":"**Note:** These instructions only provide a starting point for testers to work on;","lastModifiedDate":"2023-09-12"},{"lineNumber":376,"author":{"gitId":"-"},"content":"testers are expected to do more *exploratory* testing.","lastModifiedDate":"2020-05-23"},{"lineNumber":377,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":378,"author":{"gitId":"-"},"content":"\u003c/box\u003e","lastModifiedDate":"2023-09-12"},{"lineNumber":379,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":380,"author":{"gitId":"-"},"content":"### Launch and shutdown","lastModifiedDate":"2020-05-23"},{"lineNumber":381,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":382,"author":{"gitId":"-"},"content":"1. Initial launch","lastModifiedDate":"2020-05-23"},{"lineNumber":383,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":384,"author":{"gitId":"-"},"content":" 1. Download the jar file and copy into an empty folder","lastModifiedDate":"2020-05-23"},{"lineNumber":385,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":386,"author":{"gitId":"-"},"content":" 1. Double-click the jar file Expected: Shows the GUI with a set of sample contacts. The window size may not be optimum.","lastModifiedDate":"2020-05-23"},{"lineNumber":387,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":388,"author":{"gitId":"-"},"content":"1. Saving window preferences","lastModifiedDate":"2020-05-23"},{"lineNumber":389,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":390,"author":{"gitId":"-"},"content":" 1. Resize the window to an optimum size. Move the window to a different location. Close the window.","lastModifiedDate":"2020-05-23"},{"lineNumber":391,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":392,"author":{"gitId":"-"},"content":" 1. Re-launch the app by double-clicking the jar file.\u003cbr\u003e","lastModifiedDate":"2020-05-23"},{"lineNumber":393,"author":{"gitId":"-"},"content":" Expected: The most recent window size and location is retained.","lastModifiedDate":"2020-05-23"},{"lineNumber":394,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":395,"author":{"gitId":"-"},"content":"1. _{ more test cases …​ }_","lastModifiedDate":"2020-05-23"},{"lineNumber":396,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":397,"author":{"gitId":"-"},"content":"### Deleting a person","lastModifiedDate":"2020-05-23"},{"lineNumber":398,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":399,"author":{"gitId":"-"},"content":"1. Deleting a person while all persons are being shown","lastModifiedDate":"2020-05-23"},{"lineNumber":400,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":401,"author":{"gitId":"-"},"content":" 1. Prerequisites: List all persons using the `list` command. Multiple persons in the list.","lastModifiedDate":"2020-05-23"},{"lineNumber":402,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":403,"author":{"gitId":"-"},"content":" 1. Test case: `delete 1`\u003cbr\u003e","lastModifiedDate":"2020-05-23"},{"lineNumber":404,"author":{"gitId":"-"},"content":" 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.","lastModifiedDate":"2020-05-23"},{"lineNumber":405,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":406,"author":{"gitId":"-"},"content":" 1. Test case: `delete 0`\u003cbr\u003e","lastModifiedDate":"2020-05-23"},{"lineNumber":407,"author":{"gitId":"-"},"content":" Expected: No person is deleted. Error details shown in the status message. Status bar remains the same.","lastModifiedDate":"2020-05-23"},{"lineNumber":408,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":409,"author":{"gitId":"-"},"content":" 1. Other incorrect delete commands to try: `delete`, `delete x`, `...` (where x is larger than the list size)\u003cbr\u003e","lastModifiedDate":"2020-05-23"},{"lineNumber":410,"author":{"gitId":"-"},"content":" Expected: Similar to previous.","lastModifiedDate":"2020-05-23"},{"lineNumber":411,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":412,"author":{"gitId":"-"},"content":"1. _{ more test cases …​ }_","lastModifiedDate":"2020-05-23"},{"lineNumber":413,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":414,"author":{"gitId":"-"},"content":"### Saving data","lastModifiedDate":"2020-05-23"},{"lineNumber":415,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":416,"author":{"gitId":"-"},"content":"1. Dealing with missing/corrupted data files","lastModifiedDate":"2020-05-23"},{"lineNumber":417,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":418,"author":{"gitId":"-"},"content":" 1. _{explain how to simulate a missing/corrupted file, and the expected behavior}_","lastModifiedDate":"2020-05-23"},{"lineNumber":419,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":420,"author":{"gitId":"-"},"content":"1. _{ more test cases …​ }_","lastModifiedDate":"2020-05-23"}],"authorContributionMap":{"beefsausagee":28,"garywongkai":6,"-":386}},{"path":"docs/UserGuide.md","fileType":"docs","lines":[{"lineNumber":1,"author":{"gitId":"-"},"content":"---","lastModifiedDate":"2020-05-23"},{"lineNumber":2,"author":{"gitId":"-"},"content":" layout: default.md","lastModifiedDate":"2023-09-12"},{"lineNumber":3,"author":{"gitId":"-"},"content":" title: \"User Guide\"","lastModifiedDate":"2023-09-12"},{"lineNumber":4,"author":{"gitId":"-"},"content":" pageNav: 3","lastModifiedDate":"2023-09-12"},{"lineNumber":5,"author":{"gitId":"-"},"content":"---","lastModifiedDate":"2020-05-23"},{"lineNumber":6,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":7,"author":{"gitId":"-"},"content":"# AB-3 User Guide","lastModifiedDate":"2023-09-12"},{"lineNumber":8,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":9,"author":{"gitId":"-"},"content":"AddressBook Level 3 (AB3) is a **desktop app for managing contacts, optimized for use via a 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.","lastModifiedDate":"2023-09-12"},{"lineNumber":10,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2023-09-12"},{"lineNumber":11,"author":{"gitId":"-"},"content":"\u003c!-- * Table of Contents --\u003e","lastModifiedDate":"2023-09-12"},{"lineNumber":12,"author":{"gitId":"-"},"content":"\u003cpage-nav-print /\u003e","lastModifiedDate":"2023-09-12"},{"lineNumber":13,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":14,"author":{"gitId":"-"},"content":"--------------------------------------------------------------------------------------------------------------------","lastModifiedDate":"2020-05-23"},{"lineNumber":15,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":16,"author":{"gitId":"-"},"content":"## Quick start","lastModifiedDate":"2020-05-23"},{"lineNumber":17,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":18,"author":{"gitId":"-"},"content":"1. Ensure you have Java `11` or above installed in your Computer.","lastModifiedDate":"2020-05-23"},{"lineNumber":19,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":20,"author":{"gitId":"-"},"content":"1. Download the latest `addressbook.jar` from [here](https://github.com/se-edu/addressbook-level3/releases).","lastModifiedDate":"2020-05-23"},{"lineNumber":21,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":22,"author":{"gitId":"-"},"content":"1. Copy the file to the folder you want to use as the _home folder_ for your AddressBook.","lastModifiedDate":"2020-05-23"},{"lineNumber":23,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":24,"author":{"gitId":"-"},"content":"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.\u003cbr\u003e","lastModifiedDate":"2023-01-01"},{"lineNumber":25,"author":{"gitId":"-"},"content":" A GUI similar to the below should appear in a few seconds. Note how the app contains some sample data.\u003cbr\u003e","lastModifiedDate":"2023-01-01"},{"lineNumber":26,"author":{"gitId":"-"},"content":" ![Ui](images/Ui.png)","lastModifiedDate":"2020-05-23"},{"lineNumber":27,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":28,"author":{"gitId":"-"},"content":"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.\u003cbr\u003e","lastModifiedDate":"2020-05-23"},{"lineNumber":29,"author":{"gitId":"-"},"content":" Some example commands you can try:","lastModifiedDate":"2020-05-23"},{"lineNumber":30,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":31,"author":{"gitId":"-"},"content":" * `list` : Lists all contacts.","lastModifiedDate":"2023-01-01"},{"lineNumber":32,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":33,"author":{"gitId":"-"},"content":" * `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.","lastModifiedDate":"2023-01-01"},{"lineNumber":34,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":35,"author":{"gitId":"-"},"content":" * `delete 3` : Deletes the 3rd contact shown in the current list.","lastModifiedDate":"2023-01-01"},{"lineNumber":36,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":37,"author":{"gitId":"-"},"content":" * `clear` : Deletes all contacts.","lastModifiedDate":"2023-01-01"},{"lineNumber":38,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":39,"author":{"gitId":"-"},"content":" * `exit` : Exits the app.","lastModifiedDate":"2023-01-01"},{"lineNumber":40,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":41,"author":{"gitId":"-"},"content":"1. Refer to the [Features](#features) below for details of each command.","lastModifiedDate":"2020-05-23"},{"lineNumber":42,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":43,"author":{"gitId":"-"},"content":"--------------------------------------------------------------------------------------------------------------------","lastModifiedDate":"2020-05-23"},{"lineNumber":44,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":45,"author":{"gitId":"-"},"content":"## Features","lastModifiedDate":"2020-05-23"},{"lineNumber":46,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":47,"author":{"gitId":"-"},"content":"\u003cbox type\u003d\"info\" seamless\u003e","lastModifiedDate":"2023-09-12"},{"lineNumber":48,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":49,"author":{"gitId":"-"},"content":"**Notes about the command format:**\u003cbr\u003e","lastModifiedDate":"2023-09-12"},{"lineNumber":50,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":51,"author":{"gitId":"-"},"content":"* Words in `UPPER_CASE` are the parameters to be supplied by the user.\u003cbr\u003e","lastModifiedDate":"2020-05-23"},{"lineNumber":52,"author":{"gitId":"-"},"content":" e.g. in `add n/NAME`, `NAME` is a parameter which can be used as `add n/John Doe`.","lastModifiedDate":"2020-05-23"},{"lineNumber":53,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":54,"author":{"gitId":"-"},"content":"* Items in square brackets are optional.\u003cbr\u003e","lastModifiedDate":"2020-05-23"},{"lineNumber":55,"author":{"gitId":"-"},"content":" e.g `n/NAME [t/TAG]` can be used as `n/John Doe t/friend` or as `n/John Doe`.","lastModifiedDate":"2020-05-23"},{"lineNumber":56,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":57,"author":{"gitId":"-"},"content":"* Items with `…`​ after them can be used multiple times including zero times.\u003cbr\u003e","lastModifiedDate":"2020-05-23"},{"lineNumber":58,"author":{"gitId":"-"},"content":" e.g. `[t/TAG]…​` can be used as ` ` (i.e. 0 times), `t/friend`, `t/friend t/family` etc.","lastModifiedDate":"2020-05-23"},{"lineNumber":59,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":60,"author":{"gitId":"-"},"content":"* Parameters can be in any order.\u003cbr\u003e","lastModifiedDate":"2020-05-23"},{"lineNumber":61,"author":{"gitId":"-"},"content":" e.g. if the command specifies `n/NAME p/PHONE_NUMBER`, `p/PHONE_NUMBER n/NAME` is also acceptable.","lastModifiedDate":"2020-05-23"},{"lineNumber":62,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":63,"author":{"gitId":"-"},"content":"* Extraneous parameters for commands that do not take in parameters (such as `help`, `list`, `exit` and `clear`) will be ignored.\u003cbr\u003e","lastModifiedDate":"2021-02-03"},{"lineNumber":64,"author":{"gitId":"-"},"content":" e.g. if the command specifies `help 123`, it will be interpreted as `help`.","lastModifiedDate":"2021-02-03"},{"lineNumber":65,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2021-02-03"},{"lineNumber":66,"author":{"gitId":"-"},"content":"* 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.","lastModifiedDate":"2023-06-26"},{"lineNumber":67,"author":{"gitId":"-"},"content":"\u003c/box\u003e","lastModifiedDate":"2023-09-12"},{"lineNumber":68,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":69,"author":{"gitId":"-"},"content":"### Viewing help : `help`","lastModifiedDate":"2020-05-23"},{"lineNumber":70,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":71,"author":{"gitId":"-"},"content":"Shows a message explaning how to access the help page.","lastModifiedDate":"2020-05-23"},{"lineNumber":72,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":73,"author":{"gitId":"-"},"content":"Format: `help`","lastModifiedDate":"2020-05-23"},{"lineNumber":74,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":75,"author":{"gitId":"DominicFuMJ"},"content":"Expected success outcome:","lastModifiedDate":"2024-02-29"},{"lineNumber":76,"author":{"gitId":"DominicFuMJ"},"content":"![help message](images/helpMessage.png)","lastModifiedDate":"2024-02-29"},{"lineNumber":77,"author":{"gitId":"DominicFuMJ"},"content":"","lastModifiedDate":"2024-02-29"},{"lineNumber":78,"author":{"gitId":"DominicFuMJ"},"content":"Expected failure outcome:","lastModifiedDate":"2024-02-29"},{"lineNumber":79,"author":{"gitId":"DominicFuMJ"},"content":"```","lastModifiedDate":"2024-02-29"},{"lineNumber":80,"author":{"gitId":"DominicFuMJ"},"content":"Help not available. Please try again.","lastModifiedDate":"2024-02-29"},{"lineNumber":81,"author":{"gitId":"DominicFuMJ"},"content":"```","lastModifiedDate":"2024-02-29"},{"lineNumber":82,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":83,"author":{"gitId":"-"},"content":"### Adding a person: `add`","lastModifiedDate":"2020-05-23"},{"lineNumber":84,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":85,"author":{"gitId":"AwJoey"},"content":"Adds a person to the address book with their information.","lastModifiedDate":"2024-02-29"},{"lineNumber":86,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":87,"author":{"gitId":"-"},"content":"Format: `add n/NAME p/PHONE_NUMBER e/EMAIL a/ADDRESS [t/TAG]…​`","lastModifiedDate":"2020-05-23"},{"lineNumber":88,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":89,"author":{"gitId":"AwJoey"},"content":"* Phone number **must be a valid Singapore number** (i.e. 8 digits, starts with either 6, 8 or 9)","lastModifiedDate":"2024-02-29"},{"lineNumber":90,"author":{"gitId":"AwJoey"},"content":"* Email **must include @ character**","lastModifiedDate":"2024-02-29"},{"lineNumber":91,"author":{"gitId":"AwJoey"},"content":"* Address **must include and be ordered in street name, block number, and unit number (note: include # symbol)**, ","lastModifiedDate":"2024-02-29"},{"lineNumber":92,"author":{"gitId":"AwJoey"},"content":"separated with comma","lastModifiedDate":"2024-02-29"},{"lineNumber":93,"author":{"gitId":"AwJoey"},"content":"* If multiple `tag` are added, separate with comma","lastModifiedDate":"2024-02-29"},{"lineNumber":94,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2023-09-12"},{"lineNumber":95,"author":{"gitId":"-"},"content":"**Tip:** A person can have any number of tags (including 0)","lastModifiedDate":"2023-09-12"},{"lineNumber":96,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":97,"author":{"gitId":"-"},"content":"Examples:","lastModifiedDate":"2020-05-23"},{"lineNumber":98,"author":{"gitId":"-"},"content":"* `add n/John Doe p/98765432 e/johnd@example.com a/John street, block 123, #01-01`","lastModifiedDate":"2020-05-23"},{"lineNumber":99,"author":{"gitId":"-"},"content":"* `add n/Betsy Crowe t/friend e/betsycrowe@example.com a/Newgate Prison p/1234567 t/criminal`","lastModifiedDate":"2020-05-23"},{"lineNumber":100,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":101,"author":{"gitId":"AwJoey"},"content":"Expected success outcome:","lastModifiedDate":"2024-02-29"},{"lineNumber":102,"author":{"gitId":"AwJoey"},"content":"```","lastModifiedDate":"2024-02-29"},{"lineNumber":103,"author":{"gitId":"AwJoey"},"content":"New contact added!","lastModifiedDate":"2024-02-29"},{"lineNumber":104,"author":{"gitId":"AwJoey"},"content":"```","lastModifiedDate":"2024-02-29"},{"lineNumber":105,"author":{"gitId":"AwJoey"},"content":"","lastModifiedDate":"2024-02-29"},{"lineNumber":106,"author":{"gitId":"AwJoey"},"content":"Expected failure outcome:","lastModifiedDate":"2024-02-29"},{"lineNumber":107,"author":{"gitId":"AwJoey"},"content":"```","lastModifiedDate":"2024-02-29"},{"lineNumber":108,"author":{"gitId":"AwJoey"},"content":"Values not accepted.","lastModifiedDate":"2024-02-29"},{"lineNumber":109,"author":{"gitId":"AwJoey"},"content":"```","lastModifiedDate":"2024-02-29"},{"lineNumber":110,"author":{"gitId":"AwJoey"},"content":"","lastModifiedDate":"2024-02-29"},{"lineNumber":111,"author":{"gitId":"AwJoey"},"content":"Potential Errors:","lastModifiedDate":"2024-02-29"},{"lineNumber":112,"author":{"gitId":"AwJoey"},"content":"* Phone number format is wrong (i.e. not a Singapore number)","lastModifiedDate":"2024-02-29"},{"lineNumber":113,"author":{"gitId":"AwJoey"},"content":"* Email format is wrong (i.e. no @)","lastModifiedDate":"2024-02-29"},{"lineNumber":114,"author":{"gitId":"AwJoey"},"content":"* Address format is wrong","lastModifiedDate":"2024-02-29"},{"lineNumber":115,"author":{"gitId":"AwJoey"},"content":"* An existing contact with same name and phone number is found in address book","lastModifiedDate":"2024-02-29"},{"lineNumber":116,"author":{"gitId":"AwJoey"},"content":"","lastModifiedDate":"2024-02-29"},{"lineNumber":117,"author":{"gitId":"AwJoey"},"content":"","lastModifiedDate":"2024-02-29"},{"lineNumber":118,"author":{"gitId":"-"},"content":"### Listing all persons : `list`","lastModifiedDate":"2020-05-23"},{"lineNumber":119,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":120,"author":{"gitId":"-"},"content":"Shows a list of all persons in the address book.","lastModifiedDate":"2020-05-23"},{"lineNumber":121,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":122,"author":{"gitId":"-"},"content":"Format: `list`","lastModifiedDate":"2020-05-23"},{"lineNumber":123,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":124,"author":{"gitId":"AwJoey"},"content":"Expected success outcome:","lastModifiedDate":"2024-02-29"},{"lineNumber":125,"author":{"gitId":"AwJoey"},"content":"```","lastModifiedDate":"2024-02-29"},{"lineNumber":126,"author":{"gitId":"AwJoey"},"content":"List of contacts:","lastModifiedDate":"2024-02-29"},{"lineNumber":127,"author":{"gitId":"AwJoey"},"content":"...","lastModifiedDate":"2024-02-29"},{"lineNumber":128,"author":{"gitId":"AwJoey"},"content":"```","lastModifiedDate":"2024-02-29"},{"lineNumber":129,"author":{"gitId":"AwJoey"},"content":"","lastModifiedDate":"2024-02-29"},{"lineNumber":130,"author":{"gitId":"AwJoey"},"content":"Expected failure outcome:","lastModifiedDate":"2024-02-29"},{"lineNumber":131,"author":{"gitId":"AwJoey"},"content":"```","lastModifiedDate":"2024-02-29"},{"lineNumber":132,"author":{"gitId":"AwJoey"},"content":"No contacts added yet.","lastModifiedDate":"2024-02-29"},{"lineNumber":133,"author":{"gitId":"AwJoey"},"content":"```","lastModifiedDate":"2024-02-29"},{"lineNumber":134,"author":{"gitId":"AwJoey"},"content":"","lastModifiedDate":"2024-02-29"},{"lineNumber":135,"author":{"gitId":"AwJoey"},"content":"","lastModifiedDate":"2024-02-29"},{"lineNumber":136,"author":{"gitId":"-"},"content":"### Editing a person : `edit`","lastModifiedDate":"2020-05-23"},{"lineNumber":137,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":138,"author":{"gitId":"AwJoey"},"content":"Edits an existing person\u0027s information in the address book.","lastModifiedDate":"2024-02-29"},{"lineNumber":139,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":140,"author":{"gitId":"-"},"content":"Format: `edit INDEX [n/NAME] [p/PHONE] [e/EMAIL] [a/ADDRESS] [t/TAG]…​`","lastModifiedDate":"2020-05-23"},{"lineNumber":141,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":142,"author":{"gitId":"-"},"content":"* 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, …​","lastModifiedDate":"2020-05-23"},{"lineNumber":143,"author":{"gitId":"-"},"content":"* At least one of the optional fields must be provided.","lastModifiedDate":"2020-05-23"},{"lineNumber":144,"author":{"gitId":"-"},"content":"* Existing values will be updated to the input values.","lastModifiedDate":"2020-05-23"},{"lineNumber":145,"author":{"gitId":"-"},"content":"* When editing tags, the existing tags of the person will be removed i.e adding of tags is not cumulative.","lastModifiedDate":"2020-05-23"},{"lineNumber":146,"author":{"gitId":"-"},"content":"* You can remove all the person’s tags by typing `t/` without","lastModifiedDate":"2020-05-23"},{"lineNumber":147,"author":{"gitId":"-"},"content":" specifying any tags after it.","lastModifiedDate":"2020-05-23"},{"lineNumber":148,"author":{"gitId":"AwJoey"},"content":"* Adding a person\u0027s format for **phone number, email, and address** applies here as well.","lastModifiedDate":"2024-02-29"},{"lineNumber":149,"author":{"gitId":"AwJoey"},"content":"* ","lastModifiedDate":"2024-02-29"},{"lineNumber":150,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":151,"author":{"gitId":"-"},"content":"Examples:","lastModifiedDate":"2020-05-23"},{"lineNumber":152,"author":{"gitId":"-"},"content":"* `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.","lastModifiedDate":"2020-05-23"},{"lineNumber":153,"author":{"gitId":"-"},"content":"* `edit 2 n/Betsy Crower t/` Edits the name of the 2nd person to be `Betsy Crower` and clears all existing tags.","lastModifiedDate":"2020-05-23"},{"lineNumber":154,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":155,"author":{"gitId":"AwJoey"},"content":"Expected success outcome:","lastModifiedDate":"2024-02-29"},{"lineNumber":156,"author":{"gitId":"AwJoey"},"content":"```","lastModifiedDate":"2024-02-29"},{"lineNumber":157,"author":{"gitId":"AwJoey"},"content":"Contact is updated!","lastModifiedDate":"2024-02-29"},{"lineNumber":158,"author":{"gitId":"AwJoey"},"content":"```","lastModifiedDate":"2024-02-29"},{"lineNumber":159,"author":{"gitId":"AwJoey"},"content":"","lastModifiedDate":"2024-02-29"},{"lineNumber":160,"author":{"gitId":"AwJoey"},"content":"Expected failure outcome:","lastModifiedDate":"2024-02-29"},{"lineNumber":161,"author":{"gitId":"AwJoey"},"content":"```","lastModifiedDate":"2024-02-29"},{"lineNumber":162,"author":{"gitId":"AwJoey"},"content":"Values not accepted.","lastModifiedDate":"2024-02-29"},{"lineNumber":163,"author":{"gitId":"AwJoey"},"content":"```","lastModifiedDate":"2024-02-29"},{"lineNumber":164,"author":{"gitId":"AwJoey"},"content":"OR","lastModifiedDate":"2024-02-29"},{"lineNumber":165,"author":{"gitId":"AwJoey"},"content":"```","lastModifiedDate":"2024-02-29"},{"lineNumber":166,"author":{"gitId":"AwJoey"},"content":"Contact not found in address book","lastModifiedDate":"2024-02-29"},{"lineNumber":167,"author":{"gitId":"AwJoey"},"content":"```","lastModifiedDate":"2024-02-29"},{"lineNumber":168,"author":{"gitId":"AwJoey"},"content":"","lastModifiedDate":"2024-02-29"},{"lineNumber":169,"author":{"gitId":"AwJoey"},"content":"Potential Errors:","lastModifiedDate":"2024-02-29"},{"lineNumber":170,"author":{"gitId":"AwJoey"},"content":"* [if applicable] Phone number format is wrong (i.e. not a Singapore number)","lastModifiedDate":"2024-02-29"},{"lineNumber":171,"author":{"gitId":"AwJoey"},"content":"* [if applicable] Email format is wrong (i.e. no @)","lastModifiedDate":"2024-02-29"},{"lineNumber":172,"author":{"gitId":"AwJoey"},"content":"* [if applicable] Address format is wrong","lastModifiedDate":"2024-02-29"},{"lineNumber":173,"author":{"gitId":"AwJoey"},"content":"* An existing contact with same name and phone number is found in address book","lastModifiedDate":"2024-02-29"},{"lineNumber":174,"author":{"gitId":"AwJoey"},"content":"","lastModifiedDate":"2024-02-29"},{"lineNumber":175,"author":{"gitId":"AwJoey"},"content":"","lastModifiedDate":"2024-02-29"},{"lineNumber":176,"author":{"gitId":"-"},"content":"### Locating persons by name : `find`","lastModifiedDate":"2020-05-23"},{"lineNumber":177,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":178,"author":{"gitId":"-"},"content":"Finds persons whose names contain any of the given keywords.","lastModifiedDate":"2020-05-23"},{"lineNumber":179,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":180,"author":{"gitId":"-"},"content":"Format: `find KEYWORD [MORE_KEYWORDS]`","lastModifiedDate":"2020-05-23"},{"lineNumber":181,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":182,"author":{"gitId":"-"},"content":"* The search is case-insensitive. e.g `hans` will match `Hans`","lastModifiedDate":"2020-05-23"},{"lineNumber":183,"author":{"gitId":"-"},"content":"* The order of the keywords does not matter. e.g. `Hans Bo` will match `Bo Hans`","lastModifiedDate":"2020-05-23"},{"lineNumber":184,"author":{"gitId":"-"},"content":"* Only the name is searched.","lastModifiedDate":"2020-05-23"},{"lineNumber":185,"author":{"gitId":"-"},"content":"* Only full words will be matched e.g. `Han` will not match `Hans`","lastModifiedDate":"2020-05-23"},{"lineNumber":186,"author":{"gitId":"-"},"content":"* Persons matching at least one keyword will be returned (i.e. `OR` search).","lastModifiedDate":"2020-05-23"},{"lineNumber":187,"author":{"gitId":"-"},"content":" e.g. `Hans Bo` will return `Hans Gruber`, `Bo Yang`","lastModifiedDate":"2020-05-23"},{"lineNumber":188,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":189,"author":{"gitId":"-"},"content":"Examples:","lastModifiedDate":"2020-05-23"},{"lineNumber":190,"author":{"gitId":"-"},"content":"* `find John` returns `john` and `John Doe`","lastModifiedDate":"2020-05-23"},{"lineNumber":191,"author":{"gitId":"-"},"content":"* `find alex david` returns `Alex Yeoh`, `David Li`\u003cbr\u003e","lastModifiedDate":"2020-05-23"},{"lineNumber":192,"author":{"gitId":"-"},"content":" ![result for \u0027find alex david\u0027](images/findAlexDavidResult.png)","lastModifiedDate":"2020-05-23"},{"lineNumber":193,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":194,"author":{"gitId":"AwJoey"},"content":"Expected success outcome:","lastModifiedDate":"2024-02-29"},{"lineNumber":195,"author":{"gitId":"AwJoey"},"content":"```","lastModifiedDate":"2024-02-29"},{"lineNumber":196,"author":{"gitId":"AwJoey"},"content":"Contacts found:","lastModifiedDate":"2024-02-29"},{"lineNumber":197,"author":{"gitId":"AwJoey"},"content":"...","lastModifiedDate":"2024-02-29"},{"lineNumber":198,"author":{"gitId":"AwJoey"},"content":"```","lastModifiedDate":"2024-02-29"},{"lineNumber":199,"author":{"gitId":"AwJoey"},"content":"","lastModifiedDate":"2024-02-29"},{"lineNumber":200,"author":{"gitId":"AwJoey"},"content":"Expected failure outcome:","lastModifiedDate":"2024-02-29"},{"lineNumber":201,"author":{"gitId":"AwJoey"},"content":"```","lastModifiedDate":"2024-02-29"},{"lineNumber":202,"author":{"gitId":"AwJoey"},"content":"No contact found.","lastModifiedDate":"2024-02-29"},{"lineNumber":203,"author":{"gitId":"AwJoey"},"content":"```","lastModifiedDate":"2024-02-29"},{"lineNumber":204,"author":{"gitId":"AwJoey"},"content":"","lastModifiedDate":"2024-02-29"},{"lineNumber":205,"author":{"gitId":"AwJoey"},"content":"","lastModifiedDate":"2024-02-29"},{"lineNumber":206,"author":{"gitId":"-"},"content":"### Deleting a person : `delete`","lastModifiedDate":"2020-05-23"},{"lineNumber":207,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":208,"author":{"gitId":"-"},"content":"Deletes the specified person from the address book.","lastModifiedDate":"2020-05-23"},{"lineNumber":209,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":210,"author":{"gitId":"-"},"content":"Format: `delete INDEX`","lastModifiedDate":"2020-05-23"},{"lineNumber":211,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":212,"author":{"gitId":"-"},"content":"* Deletes the person at the specified `INDEX`.","lastModifiedDate":"2020-05-23"},{"lineNumber":213,"author":{"gitId":"-"},"content":"* The index refers to the index number shown in the displayed person list.","lastModifiedDate":"2020-05-23"},{"lineNumber":214,"author":{"gitId":"-"},"content":"* The index **must be a positive integer** 1, 2, 3, …​","lastModifiedDate":"2020-05-23"},{"lineNumber":215,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":216,"author":{"gitId":"-"},"content":"Examples:","lastModifiedDate":"2020-05-23"},{"lineNumber":217,"author":{"gitId":"-"},"content":"* `list` followed by `delete 2` deletes the 2nd person in the address book.","lastModifiedDate":"2020-05-23"},{"lineNumber":218,"author":{"gitId":"-"},"content":"* `find Betsy` followed by `delete 1` deletes the 1st person in the results of the `find` command.","lastModifiedDate":"2020-05-23"},{"lineNumber":219,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":220,"author":{"gitId":"AwJoey"},"content":"Expected success outcome:","lastModifiedDate":"2024-02-29"},{"lineNumber":221,"author":{"gitId":"AwJoey"},"content":"```","lastModifiedDate":"2024-02-29"},{"lineNumber":222,"author":{"gitId":"AwJoey"},"content":"Contact is updated!","lastModifiedDate":"2024-02-29"},{"lineNumber":223,"author":{"gitId":"AwJoey"},"content":"```","lastModifiedDate":"2024-02-29"},{"lineNumber":224,"author":{"gitId":"AwJoey"},"content":"","lastModifiedDate":"2024-02-29"},{"lineNumber":225,"author":{"gitId":"AwJoey"},"content":"Expected failure outcome:","lastModifiedDate":"2024-02-29"},{"lineNumber":226,"author":{"gitId":"AwJoey"},"content":"```","lastModifiedDate":"2024-02-29"},{"lineNumber":227,"author":{"gitId":"AwJoey"},"content":"Values not accepted.","lastModifiedDate":"2024-02-29"},{"lineNumber":228,"author":{"gitId":"AwJoey"},"content":"```","lastModifiedDate":"2024-02-29"},{"lineNumber":229,"author":{"gitId":"AwJoey"},"content":"OR","lastModifiedDate":"2024-02-29"},{"lineNumber":230,"author":{"gitId":"AwJoey"},"content":"```","lastModifiedDate":"2024-02-29"},{"lineNumber":231,"author":{"gitId":"AwJoey"},"content":"Contact not found in address book","lastModifiedDate":"2024-02-29"},{"lineNumber":232,"author":{"gitId":"AwJoey"},"content":"```","lastModifiedDate":"2024-02-29"},{"lineNumber":233,"author":{"gitId":"AwJoey"},"content":"","lastModifiedDate":"2024-02-29"},{"lineNumber":234,"author":{"gitId":"AwJoey"},"content":"","lastModifiedDate":"2024-02-29"},{"lineNumber":235,"author":{"gitId":"-"},"content":"### Clearing all entries : `clear`","lastModifiedDate":"2020-05-23"},{"lineNumber":236,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":237,"author":{"gitId":"-"},"content":"Clears all entries from the address book.","lastModifiedDate":"2020-05-23"},{"lineNumber":238,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":239,"author":{"gitId":"-"},"content":"Format: `clear`","lastModifiedDate":"2020-05-23"},{"lineNumber":240,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":241,"author":{"gitId":"DominicFuMJ"},"content":"Expected success outcome: ","lastModifiedDate":"2024-02-29"},{"lineNumber":242,"author":{"gitId":"DominicFuMJ"},"content":"```","lastModifiedDate":"2024-02-29"},{"lineNumber":243,"author":{"gitId":"DominicFuMJ"},"content":"History cleared","lastModifiedDate":"2024-02-29"},{"lineNumber":244,"author":{"gitId":"DominicFuMJ"},"content":"```","lastModifiedDate":"2024-02-29"},{"lineNumber":245,"author":{"gitId":"DominicFuMJ"},"content":"","lastModifiedDate":"2024-02-29"},{"lineNumber":246,"author":{"gitId":"DominicFuMJ"},"content":"Expected failure outcome:","lastModifiedDate":"2024-02-29"},{"lineNumber":247,"author":{"gitId":"DominicFuMJ"},"content":"```","lastModifiedDate":"2024-02-29"},{"lineNumber":248,"author":{"gitId":"DominicFuMJ"},"content":"History not cleared","lastModifiedDate":"2024-02-29"},{"lineNumber":249,"author":{"gitId":"DominicFuMJ"},"content":"```","lastModifiedDate":"2024-02-29"},{"lineNumber":250,"author":{"gitId":"DominicFuMJ"},"content":"","lastModifiedDate":"2024-02-29"},{"lineNumber":251,"author":{"gitId":"DominicFuMJ"},"content":"### Adding interest tag : `interest`","lastModifiedDate":"2024-02-29"},{"lineNumber":252,"author":{"gitId":"DominicFuMJ"},"content":"","lastModifiedDate":"2024-02-29"},{"lineNumber":253,"author":{"gitId":"DominicFuMJ"},"content":"Adding an interest tag to a specified person from the address book","lastModifiedDate":"2024-02-29"},{"lineNumber":254,"author":{"gitId":"DominicFuMJ"},"content":"","lastModifiedDate":"2024-02-29"},{"lineNumber":255,"author":{"gitId":"DominicFuMJ"},"content":"Format: `interest INDEX INTEREST [MORE_INTEREST]`","lastModifiedDate":"2024-02-29"},{"lineNumber":256,"author":{"gitId":"DominicFuMJ"},"content":"","lastModifiedDate":"2024-02-29"},{"lineNumber":257,"author":{"gitId":"DominicFuMJ"},"content":"* Adds an interest to the person at the specified \u0027INDEX\u0027","lastModifiedDate":"2024-02-29"},{"lineNumber":258,"author":{"gitId":"DominicFuMJ"},"content":"* The index refers to the index number shown in the displayed person list","lastModifiedDate":"2024-02-29"},{"lineNumber":259,"author":{"gitId":"DominicFuMJ"},"content":"* The index **must be a positive integer** 1, 2, 3, …​","lastModifiedDate":"2024-02-29"},{"lineNumber":260,"author":{"gitId":"DominicFuMJ"},"content":"* The interest **must not have any special characters** e.g. !, @, #, $, …​","lastModifiedDate":"2024-02-29"},{"lineNumber":261,"author":{"gitId":"DominicFuMJ"},"content":"","lastModifiedDate":"2024-02-29"},{"lineNumber":262,"author":{"gitId":"DominicFuMJ"},"content":"Examples:","lastModifiedDate":"2024-02-29"},{"lineNumber":263,"author":{"gitId":"DominicFuMJ"},"content":"* `interest 3 swimming` adds the interest tag `swimming` to the 3rd person in the address book","lastModifiedDate":"2024-02-29"},{"lineNumber":264,"author":{"gitId":"DominicFuMJ"},"content":"* `interest 1 cooking cycling` adds the interest tags `cooking` and `cycling` to the 1st person in the address book","lastModifiedDate":"2024-02-29"},{"lineNumber":265,"author":{"gitId":"DominicFuMJ"},"content":"","lastModifiedDate":"2024-02-29"},{"lineNumber":266,"author":{"gitId":"DominicFuMJ"},"content":"Expected success outcome:","lastModifiedDate":"2024-02-29"},{"lineNumber":267,"author":{"gitId":"DominicFuMJ"},"content":"```","lastModifiedDate":"2024-02-29"},{"lineNumber":268,"author":{"gitId":"DominicFuMJ"},"content":"Tagged on contact 1","lastModifiedDate":"2024-02-29"},{"lineNumber":269,"author":{"gitId":"DominicFuMJ"},"content":"```","lastModifiedDate":"2024-02-29"},{"lineNumber":270,"author":{"gitId":"DominicFuMJ"},"content":"","lastModifiedDate":"2024-02-29"},{"lineNumber":271,"author":{"gitId":"DominicFuMJ"},"content":"Expected failure outcome:","lastModifiedDate":"2024-02-29"},{"lineNumber":272,"author":{"gitId":"DominicFuMJ"},"content":"```","lastModifiedDate":"2024-02-29"},{"lineNumber":273,"author":{"gitId":"DominicFuMJ"},"content":"Contact not available","lastModifiedDate":"2024-02-29"},{"lineNumber":274,"author":{"gitId":"DominicFuMJ"},"content":"```","lastModifiedDate":"2024-02-29"},{"lineNumber":275,"author":{"gitId":"DominicFuMJ"},"content":"","lastModifiedDate":"2024-02-29"},{"lineNumber":276,"author":{"gitId":"DominicFuMJ"},"content":"### Locating persons by interest : `findInterest`","lastModifiedDate":"2024-02-29"},{"lineNumber":277,"author":{"gitId":"DominicFuMJ"},"content":"","lastModifiedDate":"2024-02-29"},{"lineNumber":278,"author":{"gitId":"DominicFuMJ"},"content":"Find persons whose interest tag contains any of the given keywords","lastModifiedDate":"2024-02-29"},{"lineNumber":279,"author":{"gitId":"DominicFuMJ"},"content":"","lastModifiedDate":"2024-02-29"},{"lineNumber":280,"author":{"gitId":"DominicFuMJ"},"content":"Format: `findInterest INTEREST [MORE_INTEREST]`","lastModifiedDate":"2024-02-29"},{"lineNumber":281,"author":{"gitId":"DominicFuMJ"},"content":"","lastModifiedDate":"2024-02-29"},{"lineNumber":282,"author":{"gitId":"DominicFuMJ"},"content":"* The search is case-insensitive. e.g. `cooking` will match `Cooking`","lastModifiedDate":"2024-02-29"},{"lineNumber":283,"author":{"gitId":"DominicFuMJ"},"content":"* The order of the keywords does not matter. e.g. `cycling bikes` will match `bikes cycling`","lastModifiedDate":"2024-02-29"},{"lineNumber":284,"author":{"gitId":"DominicFuMJ"},"content":"* Only the interest tag is searched","lastModifiedDate":"2024-02-29"},{"lineNumber":285,"author":{"gitId":"DominicFuMJ"},"content":"* Only full words will be matched e.g. `Cycle` will not match `Cycling`","lastModifiedDate":"2024-02-29"},{"lineNumber":286,"author":{"gitId":"DominicFuMJ"},"content":"* Persons matching at least one keyword will be returned (i.e. `OR` search)","lastModifiedDate":"2024-02-29"},{"lineNumber":287,"author":{"gitId":"DominicFuMJ"},"content":" e.g. `Ice Skating` will return `Ice Sculpting`, `Rollor Skating`","lastModifiedDate":"2024-02-29"},{"lineNumber":288,"author":{"gitId":"DominicFuMJ"},"content":"* The interest **must not have any special characters** e.g. !, @, #, $, …​","lastModifiedDate":"2024-02-29"},{"lineNumber":289,"author":{"gitId":"DominicFuMJ"},"content":"","lastModifiedDate":"2024-02-29"},{"lineNumber":290,"author":{"gitId":"DominicFuMJ"},"content":"Examples:","lastModifiedDate":"2024-02-29"},{"lineNumber":291,"author":{"gitId":"DominicFuMJ"},"content":"* `findInterest swimming` returns `Joseph Schooling` and `Joscelin Yeo Wei Ling` with tags for `swimming`","lastModifiedDate":"2024-02-29"},{"lineNumber":292,"author":{"gitId":"DominicFuMJ"},"content":"* `findInterest cooking cycling` returns `Lance Armstrong` for `cycling`, `Andre Chiang` for `cooking`","lastModifiedDate":"2024-02-29"},{"lineNumber":293,"author":{"gitId":"DominicFuMJ"},"content":"","lastModifiedDate":"2024-02-29"},{"lineNumber":294,"author":{"gitId":"DominicFuMJ"},"content":"Expected success outcome:","lastModifiedDate":"2024-02-29"},{"lineNumber":295,"author":{"gitId":"DominicFuMJ"},"content":"```","lastModifiedDate":"2024-02-29"},{"lineNumber":296,"author":{"gitId":"DominicFuMJ"},"content":"Interests found:","lastModifiedDate":"2024-02-29"},{"lineNumber":297,"author":{"gitId":"DominicFuMJ"},"content":"...","lastModifiedDate":"2024-02-29"},{"lineNumber":298,"author":{"gitId":"DominicFuMJ"},"content":"```","lastModifiedDate":"2024-02-29"},{"lineNumber":299,"author":{"gitId":"DominicFuMJ"},"content":"","lastModifiedDate":"2024-02-29"},{"lineNumber":300,"author":{"gitId":"DominicFuMJ"},"content":"Expected failure outcome:","lastModifiedDate":"2024-02-29"},{"lineNumber":301,"author":{"gitId":"DominicFuMJ"},"content":"```","lastModifiedDate":"2024-02-29"},{"lineNumber":302,"author":{"gitId":"DominicFuMJ"},"content":"Interests not found","lastModifiedDate":"2024-02-29"},{"lineNumber":303,"author":{"gitId":"DominicFuMJ"},"content":"```","lastModifiedDate":"2024-02-29"},{"lineNumber":304,"author":{"gitId":"DominicFuMJ"},"content":"","lastModifiedDate":"2024-02-29"},{"lineNumber":305,"author":{"gitId":"DominicFuMJ"},"content":"### Adding persons to schedule : `addSched`","lastModifiedDate":"2024-02-29"},{"lineNumber":306,"author":{"gitId":"DominicFuMJ"},"content":"","lastModifiedDate":"2024-02-29"},{"lineNumber":307,"author":{"gitId":"DominicFuMJ"},"content":"Adds an event with contact from specified date with time","lastModifiedDate":"2024-02-29"},{"lineNumber":308,"author":{"gitId":"DominicFuMJ"},"content":"","lastModifiedDate":"2024-02-29"},{"lineNumber":309,"author":{"gitId":"DominicFuMJ"},"content":"Format: `addSched INDEX [MORE_INDEX] SCHEDULE_NAME from/DATE_TIME to/TIME`","lastModifiedDate":"2024-02-29"},{"lineNumber":310,"author":{"gitId":"DominicFuMJ"},"content":"","lastModifiedDate":"2024-02-29"},{"lineNumber":311,"author":{"gitId":"DominicFuMJ"},"content":"* The INDEX **must be a positive integer** 1, 2, 3, …​","lastModifiedDate":"2024-02-29"},{"lineNumber":312,"author":{"gitId":"DominicFuMJ"},"content":"* The SCHEDULE_NAME **must not have any special characters** e.g. !, @, #, $, …​","lastModifiedDate":"2024-02-29"},{"lineNumber":313,"author":{"gitId":"DominicFuMJ"},"content":"* The DATE_TIME must be in the format of ddmmyyyy HHmm in 24-hour time","lastModifiedDate":"2024-02-29"},{"lineNumber":314,"author":{"gitId":"DominicFuMJ"},"content":"* The TIME must be in the format of HHmm, but **not before the time from DATE_TIME** e.g. 0000-2359","lastModifiedDate":"2024-02-29"},{"lineNumber":315,"author":{"gitId":"AwJoey"},"content":"* `find Betsy` followed by `addSched 1 Exam 05032024 1600 1800` adds the 1st person in ","lastModifiedDate":"2024-02-29"},{"lineNumber":316,"author":{"gitId":"AwJoey"},"content":"the results of the `find` command to the event stated.","lastModifiedDate":"2024-02-29"},{"lineNumber":317,"author":{"gitId":"DominicFuMJ"},"content":"","lastModifiedDate":"2024-02-29"},{"lineNumber":318,"author":{"gitId":"DominicFuMJ"},"content":"Examples:","lastModifiedDate":"2024-02-29"},{"lineNumber":319,"author":{"gitId":"DominicFuMJ"},"content":"* `addSched 4 Exam 05032024 1600 1800` will add the 4th person in the address list to the `Exam` event which ","lastModifiedDate":"2024-02-29"},{"lineNumber":320,"author":{"gitId":"DominicFuMJ"},"content":"would take place on 5th March 2024 from 4pm - 6pm","lastModifiedDate":"2024-02-29"},{"lineNumber":321,"author":{"gitId":"DominicFuMJ"},"content":"* `addSched 1,2,3 CSMeeting 18032024 1500 1900` will add the 1st, 2nd and 3rd persons in the address list ","lastModifiedDate":"2024-02-29"},{"lineNumber":322,"author":{"gitId":"DominicFuMJ"},"content":"to the `CSMeeting` event which would take place on 18th March 2024 from 3pm - 7pm","lastModifiedDate":"2024-02-29"},{"lineNumber":323,"author":{"gitId":"DominicFuMJ"},"content":"","lastModifiedDate":"2024-02-29"},{"lineNumber":324,"author":{"gitId":"DominicFuMJ"},"content":"Expected success outcome:","lastModifiedDate":"2024-02-29"},{"lineNumber":325,"author":{"gitId":"DominicFuMJ"},"content":"```","lastModifiedDate":"2024-02-29"},{"lineNumber":326,"author":{"gitId":"DominicFuMJ"},"content":"Added schedule with ...","lastModifiedDate":"2024-02-29"},{"lineNumber":327,"author":{"gitId":"DominicFuMJ"},"content":"```","lastModifiedDate":"2024-02-29"},{"lineNumber":328,"author":{"gitId":"DominicFuMJ"},"content":"","lastModifiedDate":"2024-02-29"},{"lineNumber":329,"author":{"gitId":"DominicFuMJ"},"content":"Expected failure outcome:","lastModifiedDate":"2024-02-29"},{"lineNumber":330,"author":{"gitId":"DominicFuMJ"},"content":"```","lastModifiedDate":"2024-02-29"},{"lineNumber":331,"author":{"gitId":"DominicFuMJ"},"content":"Schedule failed to be added.","lastModifiedDate":"2024-02-29"},{"lineNumber":332,"author":{"gitId":"DominicFuMJ"},"content":"```","lastModifiedDate":"2024-02-29"},{"lineNumber":333,"author":{"gitId":"DominicFuMJ"},"content":"","lastModifiedDate":"2024-02-29"},{"lineNumber":334,"author":{"gitId":"DominicFuMJ"},"content":"Potential Errors:","lastModifiedDate":"2024-02-29"},{"lineNumber":335,"author":{"gitId":"DominicFuMJ"},"content":"* Time format is wrong!","lastModifiedDate":"2024-02-29"},{"lineNumber":336,"author":{"gitId":"DominicFuMJ"},"content":"* Date format is wrong","lastModifiedDate":"2024-02-29"},{"lineNumber":337,"author":{"gitId":"DominicFuMJ"},"content":"* Contact not found in address book","lastModifiedDate":"2024-02-29"},{"lineNumber":338,"author":{"gitId":"DominicFuMJ"},"content":"","lastModifiedDate":"2024-02-29"},{"lineNumber":339,"author":{"gitId":"-"},"content":"### Exiting the program : `exit`","lastModifiedDate":"2020-05-23"},{"lineNumber":340,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":341,"author":{"gitId":"-"},"content":"Exits the program.","lastModifiedDate":"2020-05-23"},{"lineNumber":342,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":343,"author":{"gitId":"-"},"content":"Format: `exit`","lastModifiedDate":"2020-05-23"},{"lineNumber":344,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":345,"author":{"gitId":"-"},"content":"### Saving the data","lastModifiedDate":"2020-05-23"},{"lineNumber":346,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":347,"author":{"gitId":"-"},"content":"AddressBook data are saved in the hard disk automatically after any command that changes the data. There is no need to save manually.","lastModifiedDate":"2020-05-23"},{"lineNumber":348,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":349,"author":{"gitId":"-"},"content":"### Editing the data file","lastModifiedDate":"2021-02-04"},{"lineNumber":350,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2021-02-04"},{"lineNumber":351,"author":{"gitId":"-"},"content":"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.","lastModifiedDate":"2023-09-08"},{"lineNumber":352,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2021-02-04"},{"lineNumber":353,"author":{"gitId":"-"},"content":"\u003cbox type\u003d\"warning\" seamless\u003e","lastModifiedDate":"2023-09-12"},{"lineNumber":354,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2023-09-12"},{"lineNumber":355,"author":{"gitId":"-"},"content":"**Caution:**","lastModifiedDate":"2023-09-12"},{"lineNumber":356,"author":{"gitId":"-"},"content":"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.\u003cbr\u003e","lastModifiedDate":"2024-02-09"},{"lineNumber":357,"author":{"gitId":"-"},"content":"Furthermore, certain edits can cause the AddressBook to behave in unexpected ways (e.g., if a value entered is outside the acceptable range). Therefore, edit the data file only if you are confident that you can update it correctly.","lastModifiedDate":"2023-09-12"},{"lineNumber":358,"author":{"gitId":"-"},"content":"\u003c/box\u003e","lastModifiedDate":"2023-09-12"},{"lineNumber":359,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2021-02-04"},{"lineNumber":360,"author":{"gitId":"-"},"content":"### Archiving data files `[coming in v2.0]`","lastModifiedDate":"2020-05-23"},{"lineNumber":361,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":362,"author":{"gitId":"-"},"content":"_Details coming soon ..._","lastModifiedDate":"2021-02-04"},{"lineNumber":363,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":364,"author":{"gitId":"-"},"content":"--------------------------------------------------------------------------------------------------------------------","lastModifiedDate":"2020-05-23"},{"lineNumber":365,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":366,"author":{"gitId":"-"},"content":"## FAQ","lastModifiedDate":"2020-05-23"},{"lineNumber":367,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":368,"author":{"gitId":"-"},"content":"**Q**: How do I transfer my data to another Computer?\u003cbr\u003e","lastModifiedDate":"2020-05-23"},{"lineNumber":369,"author":{"gitId":"-"},"content":"**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.","lastModifiedDate":"2020-05-23"},{"lineNumber":370,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":371,"author":{"gitId":"-"},"content":"--------------------------------------------------------------------------------------------------------------------","lastModifiedDate":"2020-05-23"},{"lineNumber":372,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":373,"author":{"gitId":"-"},"content":"## Known issues","lastModifiedDate":"2023-09-08"},{"lineNumber":374,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2023-09-08"},{"lineNumber":375,"author":{"gitId":"-"},"content":"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.","lastModifiedDate":"2023-09-08"},{"lineNumber":376,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2023-09-08"},{"lineNumber":377,"author":{"gitId":"-"},"content":"--------------------------------------------------------------------------------------------------------------------","lastModifiedDate":"2023-09-08"},{"lineNumber":378,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2023-09-08"},{"lineNumber":379,"author":{"gitId":"-"},"content":"## Command summary","lastModifiedDate":"2020-05-23"},{"lineNumber":380,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":381,"author":{"gitId":"-"},"content":"Action | Format, Examples","lastModifiedDate":"2020-05-23"},{"lineNumber":382,"author":{"gitId":"-"},"content":"-----------|----------------------------------------------------------------------------------------------------------------------------------------------------------------------","lastModifiedDate":"2023-09-12"},{"lineNumber":383,"author":{"gitId":"AwJoey"},"content":"**Help** | `help`","lastModifiedDate":"2024-02-29"},{"lineNumber":384,"author":{"gitId":"-"},"content":"**Add** | `add n/NAME p/PHONE_NUMBER e/EMAIL a/ADDRESS [t/TAG]…​` \u003cbr\u003e e.g., `add n/James Ho p/22224444 e/jamesho@example.com a/123, Clementi Rd, 1234665 t/friend t/colleague`","lastModifiedDate":"2020-05-23"},{"lineNumber":385,"author":{"gitId":"AwJoey"},"content":"**List** | `list`","lastModifiedDate":"2024-02-29"},{"lineNumber":386,"author":{"gitId":"-"},"content":"**Edit** | `edit INDEX [n/NAME] [p/PHONE_NUMBER] [e/EMAIL] [a/ADDRESS] [t/TAG]…​`\u003cbr\u003e e.g.,`edit 2 n/James Lee e/jameslee@example.com`","lastModifiedDate":"2020-05-23"},{"lineNumber":387,"author":{"gitId":"-"},"content":"**Find** | `find KEYWORD [MORE_KEYWORDS]`\u003cbr\u003e e.g., `find James Jake`","lastModifiedDate":"2020-05-23"},{"lineNumber":388,"author":{"gitId":"AwJoey"},"content":"**Delete** | `delete INDEX`\u003cbr\u003e e.g., `delete 3`","lastModifiedDate":"2024-02-29"},{"lineNumber":389,"author":{"gitId":"AwJoey"},"content":"**Clear** | `clear`","lastModifiedDate":"2024-02-29"},{"lineNumber":390,"author":{"gitId":"DominicFuMJ"},"content":"**Interest Tagging** | `interest INDEX INTEREST [MORE_INTERESTS]` \u003cbr\u003e e.g. `interest 3 swimming cooking`","lastModifiedDate":"2024-02-29"},{"lineNumber":391,"author":{"gitId":"DominicFuMJ"},"content":"**Find Interest** | `findInterest INTEREST [MORE_INTEREST]` \u003cbr\u003e e.g. `findInterest cooking music`","lastModifiedDate":"2024-02-29"},{"lineNumber":392,"author":{"gitId":"DominicFuMJ"},"content":"**Add Schedule** | `addSched INDEX [MORE_INDEX] SCHEDULE_NAME` \u003cbr\u003e e.g. `addSched 1,2,3 CSMeeting 18032024 1500 1900`","lastModifiedDate":"2024-02-29"},{"lineNumber":393,"author":{"gitId":"DominicFuMJ"},"content":"**Exit** | `exit`","lastModifiedDate":"2024-02-29"}],"authorContributionMap":{"DominicFuMJ":107,"AwJoey":92,"-":194}}] +[{"path":"README.md","fileType":"docs","lines":[{"lineNumber":1,"author":{"gitId":"garywongkai"},"content":"[![Java CI](https://github.com/AY2324S2-CS2103-F15-4/tp/actions/workflows/gradle.yml/badge.svg?branch\u003dmaster)](https://github.com/AY2324S2-CS2103-F15-4/tp/actions/workflows/gradle.yml)","lastModifiedDate":"2024-02-26"},{"lineNumber":2,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":3,"author":{"gitId":"-"},"content":"![Ui](docs/images/Ui.png)","lastModifiedDate":"2020-05-23"},{"lineNumber":4,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":5,"author":{"gitId":"garywongkai"},"content":"- This is **Moddie!**.\u003cbr\u003e","lastModifiedDate":"2024-02-26"},{"lineNumber":6,"author":{"gitId":"-"},"content":" Example usages:","lastModifiedDate":"2020-05-23"},{"lineNumber":7,"author":{"gitId":"garywongkai"},"content":" - as a starting point of a course project (as opposed to writing everything from scratch)","lastModifiedDate":"2024-02-26"},{"lineNumber":8,"author":{"gitId":"garywongkai"},"content":" - as a case study","lastModifiedDate":"2024-02-26"},{"lineNumber":9,"author":{"gitId":"garywongkai"},"content":"- The project simulates an ongoing software project for a desktop application (called _AddressBook_) used for managing contact details.","lastModifiedDate":"2024-02-26"},{"lineNumber":10,"author":{"gitId":"garywongkai"},"content":" - 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.","lastModifiedDate":"2024-02-26"},{"lineNumber":11,"author":{"gitId":"garywongkai"},"content":" - It comes with a **reasonable level of user and developer documentation**.","lastModifiedDate":"2024-02-26"},{"lineNumber":12,"author":{"gitId":"garywongkai"},"content":"- It is named `Moddie` and it is adapted from `AddressBook3`!","lastModifiedDate":"2024-02-26"},{"lineNumber":13,"author":{"gitId":"garywongkai"},"content":"- For the detailed documentation of this project, see the **[Moddie Product Website](https://ay2324s2-cs2103-f15-4.github.io/tp/index.html)**.","lastModifiedDate":"2024-02-26"},{"lineNumber":14,"author":{"gitId":"garywongkai"},"content":"- 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.","lastModifiedDate":"2024-02-26"}],"authorContributionMap":{"garywongkai":10,"-":4}},{"path":"docs/AboutUs.md","fileType":"docs","lines":[{"lineNumber":1,"author":{"gitId":"-"},"content":"---","lastModifiedDate":"2020-05-23"},{"lineNumber":2,"author":{"gitId":"-"},"content":" layout: default.md","lastModifiedDate":"2023-09-12"},{"lineNumber":3,"author":{"gitId":"-"},"content":" title: \"About Us\"","lastModifiedDate":"2023-09-12"},{"lineNumber":4,"author":{"gitId":"-"},"content":"---","lastModifiedDate":"2020-05-23"},{"lineNumber":5,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":6,"author":{"gitId":"-"},"content":"# About Us","lastModifiedDate":"2023-09-12"},{"lineNumber":7,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2023-09-12"},{"lineNumber":8,"author":{"gitId":"-"},"content":"We are a team based in the [School of Computing, National University of Singapore](http://www.comp.nus.edu.sg).","lastModifiedDate":"2020-05-23"},{"lineNumber":9,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":10,"author":{"gitId":"garywongkai"},"content":"Together we made ````Moddie!``","lastModifiedDate":"2024-02-27"},{"lineNumber":11,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-06-17"},{"lineNumber":12,"author":{"gitId":"-"},"content":"## Project team","lastModifiedDate":"2020-06-07"},{"lineNumber":13,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":14,"author":{"gitId":"-"},"content":"### Wong Kai Li","lastModifiedDate":"2024-02-18"},{"lineNumber":15,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":16,"author":{"gitId":"garywongkai"},"content":"\u003cimg src\u003d\"images/garywongkai.png\" width\u003d\"200px\"\u003e","lastModifiedDate":"2024-02-27"},{"lineNumber":17,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":18,"author":{"gitId":"-"},"content":"[[github](https://github.com/garywongkai)]","lastModifiedDate":"2024-02-18"},{"lineNumber":19,"author":{"gitId":"-"},"content":"[[portfolio](team/johndoe.md)]","lastModifiedDate":"2020-05-23"},{"lineNumber":20,"author":{"gitId":"garywongkai"},"content":"[[Website](https://react-site-three.vercel.app)]","lastModifiedDate":"2024-02-26"},{"lineNumber":21,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":22,"author":{"gitId":"-"},"content":"* Role: Team Lead","lastModifiedDate":"2020-05-23"},{"lineNumber":23,"author":{"gitId":"-"},"content":"* Responsibilities: Testing","lastModifiedDate":"2024-02-18"},{"lineNumber":24,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2024-02-18"},{"lineNumber":25,"author":{"gitId":"-"},"content":"### Alvis Low Yue Han","lastModifiedDate":"2024-02-18"},{"lineNumber":26,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2024-02-18"},{"lineNumber":27,"author":{"gitId":"garywongkai"},"content":"\u003cimg src\u003d\"images/alvislow.png\" width\u003d\"200px\"\u003e","lastModifiedDate":"2024-03-05"},{"lineNumber":28,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2024-02-18"},{"lineNumber":29,"author":{"gitId":"-"},"content":"[[github](https://github.com/beefsausagee)]","lastModifiedDate":"2024-02-18"},{"lineNumber":30,"author":{"gitId":"-"},"content":"[[portfolio](team/johndoe.md)]","lastModifiedDate":"2024-02-18"},{"lineNumber":31,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2024-02-18"},{"lineNumber":32,"author":{"gitId":"-"},"content":"* Role: Developer","lastModifiedDate":"2024-02-18"},{"lineNumber":33,"author":{"gitId":"-"},"content":"* Responsibilities: UI","lastModifiedDate":"2020-05-23"},{"lineNumber":34,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":35,"author":{"gitId":"-"},"content":"### Aw Joey","lastModifiedDate":"2024-02-18"},{"lineNumber":36,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":37,"author":{"gitId":"AwJoey"},"content":"\u003cimg src\u003d\"images/awjoey.png\" width\u003d\"200px\"\u003e","lastModifiedDate":"2024-03-08"},{"lineNumber":38,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":39,"author":{"gitId":"-"},"content":"[[github](https://github.com/AwJoey)] [[portfolio](team/johndoe.md)]","lastModifiedDate":"2024-02-18"},{"lineNumber":40,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":41,"author":{"gitId":"-"},"content":"* Role: Developer","lastModifiedDate":"2020-05-23"},{"lineNumber":42,"author":{"gitId":"-"},"content":"* Responsibilities: Data","lastModifiedDate":"2020-05-23"},{"lineNumber":43,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":44,"author":{"gitId":"-"},"content":"### Fu Ming Jun, Dominic","lastModifiedDate":"2024-02-18"},{"lineNumber":45,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":46,"author":{"gitId":"garywongkai"},"content":"\u003cimg src\u003d\"images/dominicfumj.png\" width\u003d\"200px\"\u003e","lastModifiedDate":"2024-03-05"},{"lineNumber":47,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":48,"author":{"gitId":"-"},"content":"[[github](https://github.com/DominicFuMJ)]","lastModifiedDate":"2024-02-18"},{"lineNumber":49,"author":{"gitId":"-"},"content":"[[portfolio](team/johndoe.md)]","lastModifiedDate":"2020-05-23"},{"lineNumber":50,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":51,"author":{"gitId":"-"},"content":"* Role: Developer","lastModifiedDate":"2020-05-23"},{"lineNumber":52,"author":{"gitId":"-"},"content":"* Responsibilities: Dev Ops + Threading","lastModifiedDate":"2020-05-23"},{"lineNumber":53,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":54,"author":{"gitId":"-"},"content":"### Wu Jinyan","lastModifiedDate":"2024-02-18"},{"lineNumber":55,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":56,"author":{"gitId":"garywongkai"},"content":"\u003cimg src\u003d\"images/morninggloryyy.png\" width\u003d\"200px\"\u003e","lastModifiedDate":"2024-03-05"},{"lineNumber":57,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":58,"author":{"gitId":"-"},"content":"[[github](https://github.com/Morninggloryyy)]","lastModifiedDate":"2024-02-18"},{"lineNumber":59,"author":{"gitId":"-"},"content":"[[portfolio](team/johndoe.md)]","lastModifiedDate":"2020-05-23"},{"lineNumber":60,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":61,"author":{"gitId":"-"},"content":"* Role: Developer","lastModifiedDate":"2020-05-23"},{"lineNumber":62,"author":{"gitId":"-"},"content":"* Responsibilities: UI","lastModifiedDate":"2020-05-23"}],"authorContributionMap":{"AwJoey":1,"garywongkai":6,"-":55}},{"path":"docs/DeveloperGuide.md","fileType":"docs","lines":[{"lineNumber":1,"author":{"gitId":"-"},"content":"---","lastModifiedDate":"2020-05-23"},{"lineNumber":2,"author":{"gitId":"-"},"content":" layout: default.md","lastModifiedDate":"2023-09-12"},{"lineNumber":3,"author":{"gitId":"-"},"content":" title: \"Developer Guide\"","lastModifiedDate":"2023-09-12"},{"lineNumber":4,"author":{"gitId":"-"},"content":" pageNav: 3","lastModifiedDate":"2023-09-12"},{"lineNumber":5,"author":{"gitId":"-"},"content":"---","lastModifiedDate":"2020-05-23"},{"lineNumber":6,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2023-09-12"},{"lineNumber":7,"author":{"gitId":"-"},"content":"# AB-3 Developer Guide","lastModifiedDate":"2023-09-12"},{"lineNumber":8,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2023-09-12"},{"lineNumber":9,"author":{"gitId":"-"},"content":"\u003c!-- * Table of Contents --\u003e","lastModifiedDate":"2023-09-12"},{"lineNumber":10,"author":{"gitId":"-"},"content":"\u003cpage-nav-print /\u003e","lastModifiedDate":"2023-09-12"},{"lineNumber":11,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":12,"author":{"gitId":"-"},"content":"--------------------------------------------------------------------------------------------------------------------","lastModifiedDate":"2020-05-23"},{"lineNumber":13,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2021-07-30"},{"lineNumber":14,"author":{"gitId":"-"},"content":"## **Acknowledgements**","lastModifiedDate":"2021-07-30"},{"lineNumber":15,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2021-07-30"},{"lineNumber":16,"author":{"gitId":"-"},"content":"_{ list here sources of all reused/adapted ideas, code, documentation, and third-party libraries -- include links to the original source as well }_","lastModifiedDate":"2023-09-12"},{"lineNumber":17,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2021-07-30"},{"lineNumber":18,"author":{"gitId":"-"},"content":"--------------------------------------------------------------------------------------------------------------------","lastModifiedDate":"2021-07-30"},{"lineNumber":19,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":20,"author":{"gitId":"-"},"content":"## **Setting up, getting started**","lastModifiedDate":"2020-05-23"},{"lineNumber":21,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":22,"author":{"gitId":"-"},"content":"Refer to the guide [_Setting up and getting started_](SettingUp.md).","lastModifiedDate":"2020-05-23"},{"lineNumber":23,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":24,"author":{"gitId":"-"},"content":"--------------------------------------------------------------------------------------------------------------------","lastModifiedDate":"2020-05-23"},{"lineNumber":25,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":26,"author":{"gitId":"-"},"content":"## **Design**","lastModifiedDate":"2020-05-23"},{"lineNumber":27,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":28,"author":{"gitId":"-"},"content":"### Architecture","lastModifiedDate":"2021-07-31"},{"lineNumber":29,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":30,"author":{"gitId":"-"},"content":"\u003cpuml src\u003d\"diagrams/ArchitectureDiagram.puml\" width\u003d\"280\" /\u003e","lastModifiedDate":"2023-09-12"},{"lineNumber":31,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":32,"author":{"gitId":"-"},"content":"The ***Architecture Diagram*** given above explains the high-level design of the App.","lastModifiedDate":"2021-07-31"},{"lineNumber":33,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":34,"author":{"gitId":"-"},"content":"Given below is a quick overview of main components and how they interact with each other.","lastModifiedDate":"2021-07-31"},{"lineNumber":35,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2021-07-31"},{"lineNumber":36,"author":{"gitId":"-"},"content":"**Main components of the architecture**","lastModifiedDate":"2021-07-31"},{"lineNumber":37,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":38,"author":{"gitId":"-"},"content":"**`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.","lastModifiedDate":"2023-09-03"},{"lineNumber":39,"author":{"gitId":"-"},"content":"* At app launch, it initializes the other components in the correct sequence, and connects them up with each other.","lastModifiedDate":"2023-09-03"},{"lineNumber":40,"author":{"gitId":"-"},"content":"* At shut down, it shuts down the other components and invokes cleanup methods where necessary.","lastModifiedDate":"2023-09-03"},{"lineNumber":41,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":42,"author":{"gitId":"-"},"content":"The bulk of the app\u0027s work is done by the following four components:","lastModifiedDate":"2023-09-03"},{"lineNumber":43,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":44,"author":{"gitId":"-"},"content":"* [**`UI`**](#ui-component): The UI of the App.","lastModifiedDate":"2020-05-23"},{"lineNumber":45,"author":{"gitId":"-"},"content":"* [**`Logic`**](#logic-component): The command executor.","lastModifiedDate":"2020-05-23"},{"lineNumber":46,"author":{"gitId":"-"},"content":"* [**`Model`**](#model-component): Holds the data of the App in memory.","lastModifiedDate":"2020-05-23"},{"lineNumber":47,"author":{"gitId":"-"},"content":"* [**`Storage`**](#storage-component): Reads data from, and writes data to, the hard disk.","lastModifiedDate":"2020-05-23"},{"lineNumber":48,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":49,"author":{"gitId":"-"},"content":"[**`Commons`**](#common-classes) represents a collection of classes used by multiple other components.","lastModifiedDate":"2023-09-03"},{"lineNumber":50,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":51,"author":{"gitId":"-"},"content":"**How the architecture components interact with each other**","lastModifiedDate":"2020-05-23"},{"lineNumber":52,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":53,"author":{"gitId":"-"},"content":"The *Sequence Diagram* below shows how the components interact with each other for the scenario where the user issues the command `delete 1`.","lastModifiedDate":"2020-05-23"},{"lineNumber":54,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":55,"author":{"gitId":"-"},"content":"\u003cpuml src\u003d\"diagrams/ArchitectureSequenceDiagram.puml\" width\u003d\"574\" /\u003e","lastModifiedDate":"2023-09-12"},{"lineNumber":56,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":57,"author":{"gitId":"-"},"content":"Each of the four main components (also shown in the diagram above),","lastModifiedDate":"2021-07-31"},{"lineNumber":58,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2021-07-31"},{"lineNumber":59,"author":{"gitId":"-"},"content":"* defines its *API* in an `interface` with the same name as the Component.","lastModifiedDate":"2021-07-31"},{"lineNumber":60,"author":{"gitId":"-"},"content":"* implements its functionality using a concrete `{Component Name}Manager` class (which follows the corresponding API `interface` mentioned in the previous point.","lastModifiedDate":"2021-07-31"},{"lineNumber":61,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2021-07-31"},{"lineNumber":62,"author":{"gitId":"-"},"content":"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\u0027s being coupled to the implementation of a component), as illustrated in the (partial) class diagram below.","lastModifiedDate":"2021-07-31"},{"lineNumber":63,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2021-07-31"},{"lineNumber":64,"author":{"gitId":"-"},"content":"\u003cpuml src\u003d\"diagrams/ComponentManagers.puml\" width\u003d\"300\" /\u003e","lastModifiedDate":"2023-09-12"},{"lineNumber":65,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2021-07-31"},{"lineNumber":66,"author":{"gitId":"-"},"content":"The sections below give more details of each component.","lastModifiedDate":"2020-05-23"},{"lineNumber":67,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":68,"author":{"gitId":"-"},"content":"### UI component","lastModifiedDate":"2020-05-23"},{"lineNumber":69,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":70,"author":{"gitId":"-"},"content":"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)","lastModifiedDate":"2021-07-31"},{"lineNumber":71,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":72,"author":{"gitId":"-"},"content":"\u003cpuml src\u003d\"diagrams/UiClassDiagram.puml\" alt\u003d\"Structure of the UI Component\"/\u003e","lastModifiedDate":"2023-09-12"},{"lineNumber":73,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":74,"author":{"gitId":"-"},"content":"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.","lastModifiedDate":"2021-07-31"},{"lineNumber":75,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":76,"author":{"gitId":"-"},"content":"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)","lastModifiedDate":"2021-07-31"},{"lineNumber":77,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":78,"author":{"gitId":"-"},"content":"The `UI` component,","lastModifiedDate":"2020-05-23"},{"lineNumber":79,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":80,"author":{"gitId":"-"},"content":"* executes user commands using the `Logic` component.","lastModifiedDate":"2021-07-31"},{"lineNumber":81,"author":{"gitId":"-"},"content":"* listens for changes to `Model` data so that the UI can be updated with the modified data.","lastModifiedDate":"2021-07-31"},{"lineNumber":82,"author":{"gitId":"-"},"content":"* keeps a reference to the `Logic` component, because the `UI` relies on the `Logic` to execute commands.","lastModifiedDate":"2021-07-31"},{"lineNumber":83,"author":{"gitId":"-"},"content":"* depends on some classes in the `Model` component, as it displays `Person` object residing in the `Model`.","lastModifiedDate":"2021-07-31"},{"lineNumber":84,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":85,"author":{"gitId":"-"},"content":"### Logic component","lastModifiedDate":"2020-05-23"},{"lineNumber":86,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":87,"author":{"gitId":"-"},"content":"**API** : [`Logic.java`](https://github.com/se-edu/addressbook-level3/tree/master/src/main/java/seedu/address/logic/Logic.java)","lastModifiedDate":"2021-07-31"},{"lineNumber":88,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":89,"author":{"gitId":"-"},"content":"Here\u0027s a (partial) class diagram of the `Logic` component:","lastModifiedDate":"2021-07-31"},{"lineNumber":90,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":91,"author":{"gitId":"-"},"content":"\u003cpuml src\u003d\"diagrams/LogicClassDiagram.puml\" width\u003d\"550\"/\u003e","lastModifiedDate":"2023-09-12"},{"lineNumber":92,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":93,"author":{"gitId":"-"},"content":"The sequence diagram below illustrates the interactions within the `Logic` component, taking `execute(\"delete 1\")` API call as an example.","lastModifiedDate":"2023-09-03"},{"lineNumber":94,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":95,"author":{"gitId":"-"},"content":"\u003cpuml src\u003d\"diagrams/DeleteSequenceDiagram.puml\" alt\u003d\"Interactions Inside the Logic Component for the `delete 1` Command\" /\u003e","lastModifiedDate":"2023-09-12"},{"lineNumber":96,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2023-09-12"},{"lineNumber":97,"author":{"gitId":"-"},"content":"\u003cbox type\u003d\"info\" seamless\u003e","lastModifiedDate":"2023-09-12"},{"lineNumber":98,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":99,"author":{"gitId":"-"},"content":"**Note:** The lifeline for `DeleteCommandParser` should end at the destroy marker (X) but due to a limitation of PlantUML, the lifeline continues till the end of diagram.","lastModifiedDate":"2023-09-12"},{"lineNumber":100,"author":{"gitId":"-"},"content":"\u003c/box\u003e","lastModifiedDate":"2023-09-12"},{"lineNumber":101,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":102,"author":{"gitId":"-"},"content":"How the `Logic` component works:","lastModifiedDate":"2023-09-03"},{"lineNumber":103,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2023-09-03"},{"lineNumber":104,"author":{"gitId":"-"},"content":"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.","lastModifiedDate":"2023-09-03"},{"lineNumber":105,"author":{"gitId":"-"},"content":"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`.","lastModifiedDate":"2023-09-03"},{"lineNumber":106,"author":{"gitId":"-"},"content":"1. The command can communicate with the `Model` when it is executed (e.g. to delete a person).\u003cbr\u003e","lastModifiedDate":"2024-02-09"},{"lineNumber":107,"author":{"gitId":"-"},"content":" Note that although this is shown as a single step in the diagram above (for simplicity), in the code it can take several interactions (between the command object and the `Model`) to achieve.","lastModifiedDate":"2024-02-09"},{"lineNumber":108,"author":{"gitId":"-"},"content":"1. The result of the command execution is encapsulated as a `CommandResult` object which is returned back from `Logic`.","lastModifiedDate":"2023-09-03"},{"lineNumber":109,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2023-09-03"},{"lineNumber":110,"author":{"gitId":"-"},"content":"Here are the other classes in `Logic` (omitted from the class diagram above) that are used for parsing a user command:","lastModifiedDate":"2021-07-31"},{"lineNumber":111,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2021-07-31"},{"lineNumber":112,"author":{"gitId":"-"},"content":"\u003cpuml src\u003d\"diagrams/ParserClasses.puml\" width\u003d\"600\"/\u003e","lastModifiedDate":"2023-09-12"},{"lineNumber":113,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":114,"author":{"gitId":"-"},"content":"How the parsing works:","lastModifiedDate":"2021-07-31"},{"lineNumber":115,"author":{"gitId":"-"},"content":"* 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.","lastModifiedDate":"2021-07-31"},{"lineNumber":116,"author":{"gitId":"-"},"content":"* 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.","lastModifiedDate":"2021-07-31"},{"lineNumber":117,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":118,"author":{"gitId":"-"},"content":"### Model component","lastModifiedDate":"2021-07-31"},{"lineNumber":119,"author":{"gitId":"-"},"content":"**API** : [`Model.java`](https://github.com/se-edu/addressbook-level3/tree/master/src/main/java/seedu/address/model/Model.java)","lastModifiedDate":"2020-05-23"},{"lineNumber":120,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":121,"author":{"gitId":"-"},"content":"\u003cpuml src\u003d\"diagrams/ModelClassDiagram.puml\" width\u003d\"450\" /\u003e","lastModifiedDate":"2023-09-12"},{"lineNumber":122,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":123,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":124,"author":{"gitId":"-"},"content":"The `Model` component,","lastModifiedDate":"2021-07-31"},{"lineNumber":125,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":126,"author":{"gitId":"-"},"content":"* stores the address book data i.e., all `Person` objects (which are contained in a `UniquePersonList` object).","lastModifiedDate":"2021-07-31"},{"lineNumber":127,"author":{"gitId":"-"},"content":"* stores the currently \u0027selected\u0027 `Person` objects (e.g., results of a search query) as a separate _filtered_ list which is exposed to outsiders as an unmodifiable `ObservableList\u003cPerson\u003e` that can be \u0027observed\u0027 e.g. the UI can be bound to this list so that the UI automatically updates when the data in the list change.","lastModifiedDate":"2021-07-31"},{"lineNumber":128,"author":{"gitId":"-"},"content":"* stores a `UserPref` object that represents the user’s preferences. This is exposed to the outside as a `ReadOnlyUserPref` objects.","lastModifiedDate":"2021-07-31"},{"lineNumber":129,"author":{"gitId":"-"},"content":"* 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)","lastModifiedDate":"2021-07-31"},{"lineNumber":130,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2021-07-31"},{"lineNumber":131,"author":{"gitId":"-"},"content":"\u003cbox type\u003d\"info\" seamless\u003e","lastModifiedDate":"2023-09-12"},{"lineNumber":132,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2023-09-12"},{"lineNumber":133,"author":{"gitId":"-"},"content":"**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.\u003cbr\u003e","lastModifiedDate":"2023-09-12"},{"lineNumber":134,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2021-07-31"},{"lineNumber":135,"author":{"gitId":"-"},"content":"\u003cpuml src\u003d\"diagrams/BetterModelClassDiagram.puml\" width\u003d\"450\" /\u003e","lastModifiedDate":"2023-09-12"},{"lineNumber":136,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":137,"author":{"gitId":"-"},"content":"\u003c/box\u003e","lastModifiedDate":"2023-09-12"},{"lineNumber":138,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":139,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":140,"author":{"gitId":"-"},"content":"### Storage component","lastModifiedDate":"2020-05-23"},{"lineNumber":141,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":142,"author":{"gitId":"-"},"content":"**API** : [`Storage.java`](https://github.com/se-edu/addressbook-level3/tree/master/src/main/java/seedu/address/storage/Storage.java)","lastModifiedDate":"2020-05-23"},{"lineNumber":143,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":144,"author":{"gitId":"-"},"content":"\u003cpuml src\u003d\"diagrams/StorageClassDiagram.puml\" width\u003d\"550\" /\u003e","lastModifiedDate":"2023-09-12"},{"lineNumber":145,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2021-07-31"},{"lineNumber":146,"author":{"gitId":"-"},"content":"The `Storage` component,","lastModifiedDate":"2020-05-23"},{"lineNumber":147,"author":{"gitId":"-"},"content":"* can save both address book data and user preference data in JSON format, and read them back into corresponding objects.","lastModifiedDate":"2023-09-03"},{"lineNumber":148,"author":{"gitId":"-"},"content":"* inherits from both `AddressBookStorage` and `UserPrefStorage`, which means it can be treated as either one (if only the functionality of only one is needed).","lastModifiedDate":"2021-07-31"},{"lineNumber":149,"author":{"gitId":"-"},"content":"* depends on some classes in the `Model` component (because the `Storage` component\u0027s job is to save/retrieve objects that belong to the `Model`)","lastModifiedDate":"2021-07-21"},{"lineNumber":150,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":151,"author":{"gitId":"-"},"content":"### Common classes","lastModifiedDate":"2020-05-23"},{"lineNumber":152,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":153,"author":{"gitId":"-"},"content":"Classes used by multiple components are in the `seedu.addressbook.commons` package.","lastModifiedDate":"2020-05-23"},{"lineNumber":154,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":155,"author":{"gitId":"-"},"content":"--------------------------------------------------------------------------------------------------------------------","lastModifiedDate":"2020-05-23"},{"lineNumber":156,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":157,"author":{"gitId":"-"},"content":"## **Implementation**","lastModifiedDate":"2020-05-23"},{"lineNumber":158,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":159,"author":{"gitId":"-"},"content":"This section describes some noteworthy details on how certain features are implemented.","lastModifiedDate":"2020-05-23"},{"lineNumber":160,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":161,"author":{"gitId":"-"},"content":"### \\[Proposed\\] Undo/redo feature","lastModifiedDate":"2020-06-07"},{"lineNumber":162,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":163,"author":{"gitId":"-"},"content":"#### Proposed Implementation","lastModifiedDate":"2020-05-23"},{"lineNumber":164,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":165,"author":{"gitId":"-"},"content":"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:","lastModifiedDate":"2020-05-23"},{"lineNumber":166,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":167,"author":{"gitId":"-"},"content":"* `VersionedAddressBook#commit()` — Saves the current address book state in its history.","lastModifiedDate":"2020-05-23"},{"lineNumber":168,"author":{"gitId":"-"},"content":"* `VersionedAddressBook#undo()` — Restores the previous address book state from its history.","lastModifiedDate":"2020-05-23"},{"lineNumber":169,"author":{"gitId":"-"},"content":"* `VersionedAddressBook#redo()` — Restores a previously undone address book state from its history.","lastModifiedDate":"2020-05-23"},{"lineNumber":170,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":171,"author":{"gitId":"-"},"content":"These operations are exposed in the `Model` interface as `Model#commitAddressBook()`, `Model#undoAddressBook()` and `Model#redoAddressBook()` respectively.","lastModifiedDate":"2020-05-23"},{"lineNumber":172,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":173,"author":{"gitId":"-"},"content":"Given below is an example usage scenario and how the undo/redo mechanism behaves at each step.","lastModifiedDate":"2020-05-23"},{"lineNumber":174,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":175,"author":{"gitId":"-"},"content":"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.","lastModifiedDate":"2020-05-23"},{"lineNumber":176,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":177,"author":{"gitId":"-"},"content":"\u003cpuml src\u003d\"diagrams/UndoRedoState0.puml\" alt\u003d\"UndoRedoState0\" /\u003e","lastModifiedDate":"2023-09-12"},{"lineNumber":178,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":179,"author":{"gitId":"-"},"content":"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.","lastModifiedDate":"2020-05-23"},{"lineNumber":180,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":181,"author":{"gitId":"-"},"content":"\u003cpuml src\u003d\"diagrams/UndoRedoState1.puml\" alt\u003d\"UndoRedoState1\" /\u003e","lastModifiedDate":"2023-09-12"},{"lineNumber":182,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":183,"author":{"gitId":"-"},"content":"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`.","lastModifiedDate":"2020-05-23"},{"lineNumber":184,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":185,"author":{"gitId":"-"},"content":"\u003cpuml src\u003d\"diagrams/UndoRedoState2.puml\" alt\u003d\"UndoRedoState2\" /\u003e","lastModifiedDate":"2023-09-12"},{"lineNumber":186,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":187,"author":{"gitId":"-"},"content":"\u003cbox type\u003d\"info\" seamless\u003e","lastModifiedDate":"2023-09-12"},{"lineNumber":188,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":189,"author":{"gitId":"-"},"content":"**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`.","lastModifiedDate":"2023-09-12"},{"lineNumber":190,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2023-09-12"},{"lineNumber":191,"author":{"gitId":"-"},"content":"\u003c/box\u003e","lastModifiedDate":"2023-09-12"},{"lineNumber":192,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":193,"author":{"gitId":"-"},"content":"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.","lastModifiedDate":"2020-05-23"},{"lineNumber":194,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":195,"author":{"gitId":"-"},"content":"\u003cpuml src\u003d\"diagrams/UndoRedoState3.puml\" alt\u003d\"UndoRedoState3\" /\u003e","lastModifiedDate":"2023-09-12"},{"lineNumber":196,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2023-09-12"},{"lineNumber":197,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2023-09-12"},{"lineNumber":198,"author":{"gitId":"-"},"content":"\u003cbox type\u003d\"info\" seamless\u003e","lastModifiedDate":"2023-09-12"},{"lineNumber":199,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":200,"author":{"gitId":"-"},"content":"**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","lastModifiedDate":"2023-09-12"},{"lineNumber":201,"author":{"gitId":"-"},"content":"than attempting to perform the undo.","lastModifiedDate":"2020-05-23"},{"lineNumber":202,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":203,"author":{"gitId":"-"},"content":"\u003c/box\u003e","lastModifiedDate":"2023-09-12"},{"lineNumber":204,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":205,"author":{"gitId":"-"},"content":"The following sequence diagram shows how an undo operation goes through the `Logic` component:","lastModifiedDate":"2024-02-09"},{"lineNumber":206,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":207,"author":{"gitId":"-"},"content":"\u003cpuml src\u003d\"diagrams/UndoSequenceDiagram-Logic.puml\" alt\u003d\"UndoSequenceDiagram-Logic\" /\u003e","lastModifiedDate":"2023-09-12"},{"lineNumber":208,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":209,"author":{"gitId":"-"},"content":"\u003cbox type\u003d\"info\" seamless\u003e","lastModifiedDate":"2023-09-12"},{"lineNumber":210,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":211,"author":{"gitId":"-"},"content":"**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.","lastModifiedDate":"2023-09-12"},{"lineNumber":212,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2023-09-12"},{"lineNumber":213,"author":{"gitId":"-"},"content":"\u003c/box\u003e","lastModifiedDate":"2023-09-12"},{"lineNumber":214,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":215,"author":{"gitId":"-"},"content":"Similarly, how an undo operation goes through the `Model` component is shown below:","lastModifiedDate":"2024-02-09"},{"lineNumber":216,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2024-02-09"},{"lineNumber":217,"author":{"gitId":"-"},"content":"\u003cpuml src\u003d\"diagrams/UndoSequenceDiagram-Model.puml\" alt\u003d\"UndoSequenceDiagram-Model\" /\u003e","lastModifiedDate":"2023-09-12"},{"lineNumber":218,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2024-02-09"},{"lineNumber":219,"author":{"gitId":"-"},"content":"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.","lastModifiedDate":"2020-05-23"},{"lineNumber":220,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":221,"author":{"gitId":"-"},"content":"\u003cbox type\u003d\"info\" seamless\u003e","lastModifiedDate":"2023-09-12"},{"lineNumber":222,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2023-09-12"},{"lineNumber":223,"author":{"gitId":"-"},"content":"**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.","lastModifiedDate":"2023-09-12"},{"lineNumber":224,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":225,"author":{"gitId":"-"},"content":"\u003c/box\u003e","lastModifiedDate":"2023-09-12"},{"lineNumber":226,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":227,"author":{"gitId":"-"},"content":"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.","lastModifiedDate":"2020-05-23"},{"lineNumber":228,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":229,"author":{"gitId":"-"},"content":"\u003cpuml src\u003d\"diagrams/UndoRedoState4.puml\" alt\u003d\"UndoRedoState4\" /\u003e","lastModifiedDate":"2023-09-12"},{"lineNumber":230,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":231,"author":{"gitId":"-"},"content":"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.","lastModifiedDate":"2020-05-23"},{"lineNumber":232,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":233,"author":{"gitId":"-"},"content":"\u003cpuml src\u003d\"diagrams/UndoRedoState5.puml\" alt\u003d\"UndoRedoState5\" /\u003e","lastModifiedDate":"2023-09-12"},{"lineNumber":234,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":235,"author":{"gitId":"-"},"content":"The following activity diagram summarizes what happens when a user executes a new command:","lastModifiedDate":"2020-05-23"},{"lineNumber":236,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":237,"author":{"gitId":"-"},"content":"\u003cpuml src\u003d\"diagrams/CommitActivityDiagram.puml\" width\u003d\"250\" /\u003e","lastModifiedDate":"2023-09-12"},{"lineNumber":238,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":239,"author":{"gitId":"-"},"content":"#### Design considerations:","lastModifiedDate":"2021-07-31"},{"lineNumber":240,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":241,"author":{"gitId":"-"},"content":"**Aspect: How undo \u0026 redo executes:**","lastModifiedDate":"2021-07-31"},{"lineNumber":242,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":243,"author":{"gitId":"-"},"content":"* **Alternative 1 (current choice):** Saves the entire address book.","lastModifiedDate":"2020-05-23"},{"lineNumber":244,"author":{"gitId":"-"},"content":" * Pros: Easy to implement.","lastModifiedDate":"2020-05-23"},{"lineNumber":245,"author":{"gitId":"-"},"content":" * Cons: May have performance issues in terms of memory usage.","lastModifiedDate":"2020-05-23"},{"lineNumber":246,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":247,"author":{"gitId":"-"},"content":"* **Alternative 2:** Individual command knows how to undo/redo by","lastModifiedDate":"2020-05-23"},{"lineNumber":248,"author":{"gitId":"-"},"content":" itself.","lastModifiedDate":"2020-05-23"},{"lineNumber":249,"author":{"gitId":"-"},"content":" * Pros: Will use less memory (e.g. for `delete`, just save the person being deleted).","lastModifiedDate":"2020-05-23"},{"lineNumber":250,"author":{"gitId":"-"},"content":" * Cons: We must ensure that the implementation of each individual command are correct.","lastModifiedDate":"2020-05-23"},{"lineNumber":251,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":252,"author":{"gitId":"-"},"content":"_{more aspects and alternatives to be added}_","lastModifiedDate":"2020-05-23"},{"lineNumber":253,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":254,"author":{"gitId":"-"},"content":"### \\[Proposed\\] Data archiving","lastModifiedDate":"2020-05-23"},{"lineNumber":255,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":256,"author":{"gitId":"-"},"content":"_{Explain here how the data archiving feature will be implemented}_","lastModifiedDate":"2020-05-23"},{"lineNumber":257,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":258,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":259,"author":{"gitId":"-"},"content":"--------------------------------------------------------------------------------------------------------------------","lastModifiedDate":"2020-05-23"},{"lineNumber":260,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":261,"author":{"gitId":"-"},"content":"## **Documentation, logging, testing, configuration, dev-ops**","lastModifiedDate":"2020-06-07"},{"lineNumber":262,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":263,"author":{"gitId":"-"},"content":"* [Documentation guide](Documentation.md)","lastModifiedDate":"2020-06-07"},{"lineNumber":264,"author":{"gitId":"-"},"content":"* [Testing guide](Testing.md)","lastModifiedDate":"2020-06-07"},{"lineNumber":265,"author":{"gitId":"-"},"content":"* [Logging guide](Logging.md)","lastModifiedDate":"2020-06-07"},{"lineNumber":266,"author":{"gitId":"-"},"content":"* [Configuration guide](Configuration.md)","lastModifiedDate":"2020-06-07"},{"lineNumber":267,"author":{"gitId":"-"},"content":"* [DevOps guide](DevOps.md)","lastModifiedDate":"2020-06-07"},{"lineNumber":268,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":269,"author":{"gitId":"-"},"content":"--------------------------------------------------------------------------------------------------------------------","lastModifiedDate":"2020-05-23"},{"lineNumber":270,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":271,"author":{"gitId":"-"},"content":"## **Appendix: Requirements**","lastModifiedDate":"2020-05-23"},{"lineNumber":272,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":273,"author":{"gitId":"-"},"content":"### Product scope","lastModifiedDate":"2020-05-23"},{"lineNumber":274,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":275,"author":{"gitId":"-"},"content":"**Target user profile**:","lastModifiedDate":"2020-05-23"},{"lineNumber":276,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":277,"author":{"gitId":"-"},"content":"* has a need to manage a significant number of contacts","lastModifiedDate":"2020-05-23"},{"lineNumber":278,"author":{"gitId":"-"},"content":"* prefer desktop apps over other types","lastModifiedDate":"2020-05-23"},{"lineNumber":279,"author":{"gitId":"-"},"content":"* can type fast","lastModifiedDate":"2020-05-23"},{"lineNumber":280,"author":{"gitId":"-"},"content":"* prefers typing to mouse interactions","lastModifiedDate":"2020-05-26"},{"lineNumber":281,"author":{"gitId":"-"},"content":"* is reasonably comfortable using CLI apps","lastModifiedDate":"2020-05-23"},{"lineNumber":282,"author":{"gitId":"garywongkai"},"content":"* uses application to track schedule of contacts","lastModifiedDate":"2024-03-05"},{"lineNumber":283,"author":{"gitId":"garywongkai"},"content":"* prefer a simple UI","lastModifiedDate":"2024-03-05"},{"lineNumber":284,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":285,"author":{"gitId":"-"},"content":"**Value proposition**: manage contacts faster than a typical mouse/GUI driven app","lastModifiedDate":"2020-05-23"},{"lineNumber":286,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":287,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":288,"author":{"gitId":"-"},"content":"### User stories","lastModifiedDate":"2020-06-07"},{"lineNumber":289,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":290,"author":{"gitId":"-"},"content":"Priorities: High (must have) - `* * *`, Medium (nice to have) - `* *`, Low (unlikely to have) - `*`","lastModifiedDate":"2020-05-23"},{"lineNumber":291,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":292,"author":{"gitId":"-"},"content":"| Priority | As a …​ | I want to …​ | So that I can…​ |","lastModifiedDate":"2020-05-23"},{"lineNumber":293,"author":{"gitId":"-"},"content":"|----------|--------------------------------------------|------------------------------|------------------------------------------------------------------------|","lastModifiedDate":"2023-09-12"},{"lineNumber":294,"author":{"gitId":"beefsausagee"},"content":"| `* * *` | busy student | quickly check my friends\u0027 schedules | find a suitable time to plan a meetup. |","lastModifiedDate":"2024-02-28"},{"lineNumber":295,"author":{"gitId":"beefsausagee"},"content":"| `* * *` | NUS student who likes **---** | find who has similar hobbies/interests with me | know who might want to go to a **---** related activities with me.|","lastModifiedDate":"2024-02-27"},{"lineNumber":296,"author":{"gitId":"beefsausagee"},"content":"| `* * *` | NUS student who prefers command line interface | have a GUI to include commands | add details with convenience |","lastModifiedDate":"2024-02-27"},{"lineNumber":297,"author":{"gitId":"beefsausagee"},"content":"| `* * *` | NUS student working part time | utilise Moddie to store contact details for team members, advisor | optimise my time management with school and work. |","lastModifiedDate":"2024-02-27"},{"lineNumber":298,"author":{"gitId":"beefsausagee"},"content":"| `* * *` | student project team leader | check my teammates\u0027 schedule | conduct meetings with convenience |","lastModifiedDate":"2024-02-27"},{"lineNumber":299,"author":{"gitId":"beefsausagee"},"content":"| `* * *` | international NUS student | find local friends that share similar schedules as me to aid me in easing into the university | build meaningful connections, navigate campus life more smoothly. |","lastModifiedDate":"2024-02-27"},{"lineNumber":300,"author":{"gitId":"beefsausagee"},"content":"| `* * *` | unmotivated student who needs to catch up on my studies|manage my timetable with my friends |easily arrange a study session with them |","lastModifiedDate":"2024-02-27"},{"lineNumber":301,"author":{"gitId":"beefsausagee"},"content":"| `* * *` | lonely NUS Student| find contacts of people with similar interests as myself| get to know them better and make friends.|","lastModifiedDate":"2024-02-28"},{"lineNumber":302,"author":{"gitId":"beefsausagee"},"content":"| `* * *` | NUS graduate|find my lecturer’s contact email and phone number | ask them to be a reference in my resume when applying for a job.|","lastModifiedDate":"2024-02-28"},{"lineNumber":303,"author":{"gitId":"beefsausagee"},"content":"| `* * *` |NUS Student| save my friends’ interests in the contact book| plan outings with them.|","lastModifiedDate":"2024-02-28"},{"lineNumber":304,"author":{"gitId":"beefsausagee"},"content":"| `* * *` |busy NUS student | easily add my schedule to Moddie|efficiently manage my academic, extracurricular, and personal commitments in one centralized platform.|","lastModifiedDate":"2024-02-28"},{"lineNumber":305,"author":{"gitId":"beefsausagee"},"content":"| `* * *` | NUS student| delete both my friends\u0027 and my own schedule details| maintain privacy and control over the information|","lastModifiedDate":"2024-02-28"},{"lineNumber":306,"author":{"gitId":"beefsausagee"},"content":"| `* * *` | NUS student| view my friends\u0027 and their schedule details |easily coordinate plans, schedule meetings |","lastModifiedDate":"2024-02-28"},{"lineNumber":307,"author":{"gitId":"beefsausagee"},"content":"| `* * *` | NUS student who gets confused with commands| have an interface to assist me|know what commands I can use |","lastModifiedDate":"2024-02-28"},{"lineNumber":308,"author":{"gitId":"beefsausagee"},"content":"| `* * *` |NUS student | exit the interface|properly close the application |","lastModifiedDate":"2024-02-28"},{"lineNumber":309,"author":{"gitId":"beefsausagee"},"content":"| `* * *` |NUS student|clear my commands |clear command messages that I do not need anymore |","lastModifiedDate":"2024-02-28"},{"lineNumber":310,"author":{"gitId":"beefsausagee"},"content":"| `* *` | NUS graduate| save the contacts of my Lecturer and Tutor| stay in touch with them after graduation.|","lastModifiedDate":"2024-02-28"},{"lineNumber":311,"author":{"gitId":"beefsausagee"},"content":"| `* *` | NUS student who makes errors|have an interface to prompt me | prevent myself from typing the wrong command.|","lastModifiedDate":"2024-02-28"},{"lineNumber":312,"author":{"gitId":"beefsausagee"},"content":"| `* *` |NUS student who wants to join extracurricular activities |have a place to store my CCA events |easily make time for them. |","lastModifiedDate":"2024-02-28"},{"lineNumber":313,"author":{"gitId":"beefsausagee"},"content":"| `* *` |NUS student who would like timetable suggestions|see other people\u0027s schedules to see who is taking the same modules as me |see what other modules they are also planning to take in the semester. |","lastModifiedDate":"2024-02-28"},{"lineNumber":314,"author":{"gitId":"beefsausagee"},"content":"| `* *` |NUS student pursuing an internship | coordinate networking events and informational interviews with local professionals and industry experts|expand my professional network and efficiently manage my academic commitments. |","lastModifiedDate":"2024-02-28"},{"lineNumber":315,"author":{"gitId":"beefsausagee"},"content":"| `* *` | course coordinator at NUS|communicate announcements, updates, and assignment deadlines to my students | provide a convenient channel for information dissemination and student engagement.|","lastModifiedDate":"2024-02-28"},{"lineNumber":316,"author":{"gitId":"beefsausagee"},"content":"| `* *` |Lecturer | arrange the contacts of the TAs using a module tag| send the correct instructions for the module.|","lastModifiedDate":"2024-02-28"},{"lineNumber":317,"author":{"gitId":"beefsausagee"},"content":"| `* *` |NUS student |edit my schedule, in case of any changes | ensure that my calendar remains accurate and reflective of my current commitments and availability.|","lastModifiedDate":"2024-02-28"},{"lineNumber":318,"author":{"gitId":"beefsausagee"},"content":"| `*` |NUS Student | see the schedule and interest of my classmates to know who would share the same interest as me|meet them for outings/lunch. |","lastModifiedDate":"2024-02-28"},{"lineNumber":319,"author":{"gitId":"beefsausagee"},"content":"| `*` | project leader|have an interface to see the timetable of my group mates | synchronise meetings best fitted for everyone’s schedule.|","lastModifiedDate":"2024-02-28"},{"lineNumber":320,"author":{"gitId":"beefsausagee"},"content":"| `*` | international student| know my groupmates’ schedules to better arrange my flights (to avoid missing any meeting)| successfully accommodate my travel plans.|","lastModifiedDate":"2024-02-28"},{"lineNumber":321,"author":{"gitId":"beefsausagee"},"content":"| `*` |introverted NUS student|arrange meetings with my new groupmates without interacting with them| comfortably initiate group collaboration and fulfil project requirements.|","lastModifiedDate":"2024-02-28"},{"lineNumber":322,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":323,"author":{"gitId":"-"},"content":"### Use cases","lastModifiedDate":"2020-06-07"},{"lineNumber":324,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":325,"author":{"gitId":"garywongkai"},"content":"(For all use cases below, the **System** is the `Moddie` and the **Actor** is the `user`, unless specified otherwise)","lastModifiedDate":"2024-03-05"},{"lineNumber":326,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":327,"author":{"gitId":"-"},"content":"**Use case: Delete a person**","lastModifiedDate":"2020-05-23"},{"lineNumber":328,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":329,"author":{"gitId":"-"},"content":"**MSS**","lastModifiedDate":"2020-05-23"},{"lineNumber":330,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":331,"author":{"gitId":"-"},"content":"1. User requests to list persons","lastModifiedDate":"2020-05-23"},{"lineNumber":332,"author":{"gitId":"-"},"content":"2. AddressBook shows a list of persons","lastModifiedDate":"2020-05-23"},{"lineNumber":333,"author":{"gitId":"-"},"content":"3. User requests to delete a specific person in the list","lastModifiedDate":"2020-05-23"},{"lineNumber":334,"author":{"gitId":"-"},"content":"4. AddressBook deletes the person","lastModifiedDate":"2020-05-23"},{"lineNumber":335,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":336,"author":{"gitId":"-"},"content":" Use case ends.","lastModifiedDate":"2020-05-23"},{"lineNumber":337,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":338,"author":{"gitId":"-"},"content":"**Extensions**","lastModifiedDate":"2020-05-23"},{"lineNumber":339,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":340,"author":{"gitId":"-"},"content":"* 2a. The list is empty.","lastModifiedDate":"2020-05-23"},{"lineNumber":341,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":342,"author":{"gitId":"-"},"content":" Use case ends.","lastModifiedDate":"2020-05-23"},{"lineNumber":343,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":344,"author":{"gitId":"-"},"content":"* 3a. The given index is invalid.","lastModifiedDate":"2020-05-23"},{"lineNumber":345,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":346,"author":{"gitId":"-"},"content":" * 3a1. AddressBook shows an error message.","lastModifiedDate":"2020-05-23"},{"lineNumber":347,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":348,"author":{"gitId":"-"},"content":" Use case resumes at step 2.","lastModifiedDate":"2020-05-23"},{"lineNumber":349,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":350,"author":{"gitId":"-"},"content":"*{More to be added}*","lastModifiedDate":"2020-05-23"},{"lineNumber":351,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":352,"author":{"gitId":"-"},"content":"### Non-Functional Requirements","lastModifiedDate":"2020-05-23"},{"lineNumber":353,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":354,"author":{"gitId":"-"},"content":"1. Should work on any _mainstream OS_ as long as it has Java `11` or above installed.","lastModifiedDate":"2020-05-23"},{"lineNumber":355,"author":{"gitId":"-"},"content":"2. Should be able to hold up to 1000 persons without a noticeable sluggishness in performance for typical usage.","lastModifiedDate":"2020-05-23"},{"lineNumber":356,"author":{"gitId":"-"},"content":"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.","lastModifiedDate":"2020-05-23"},{"lineNumber":357,"author":{"gitId":"garywongkai"},"content":"4. A user can have less than 6 modules in their timetable at a given time.","lastModifiedDate":"2024-02-28"},{"lineNumber":358,"author":{"gitId":"garywongkai"},"content":"5. A user can view 5 other students at one go in the schedule view.","lastModifiedDate":"2024-02-28"},{"lineNumber":359,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":360,"author":{"gitId":"-"},"content":"*{More to be added}*","lastModifiedDate":"2020-05-23"},{"lineNumber":361,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":362,"author":{"gitId":"-"},"content":"### Glossary","lastModifiedDate":"2020-05-23"},{"lineNumber":363,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":364,"author":{"gitId":"-"},"content":"* **Mainstream OS**: Windows, Linux, Unix, MacOS","lastModifiedDate":"2024-02-09"},{"lineNumber":365,"author":{"gitId":"-"},"content":"* **Private contact detail**: A contact detail that is not meant to be shared with others","lastModifiedDate":"2020-05-23"},{"lineNumber":366,"author":{"gitId":"garywongkai"},"content":"* **Module**: A slot in the day used for lesson","lastModifiedDate":"2024-02-28"},{"lineNumber":367,"author":{"gitId":"-"},"content":"--------------------------------------------------------------------------------------------------------------------","lastModifiedDate":"2020-05-23"},{"lineNumber":368,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":369,"author":{"gitId":"-"},"content":"## **Appendix: Instructions for manual testing**","lastModifiedDate":"2020-05-23"},{"lineNumber":370,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":371,"author":{"gitId":"-"},"content":"Given below are instructions to test the app manually.","lastModifiedDate":"2020-05-23"},{"lineNumber":372,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":373,"author":{"gitId":"-"},"content":"\u003cbox type\u003d\"info\" seamless\u003e","lastModifiedDate":"2023-09-12"},{"lineNumber":374,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2023-09-12"},{"lineNumber":375,"author":{"gitId":"-"},"content":"**Note:** These instructions only provide a starting point for testers to work on;","lastModifiedDate":"2023-09-12"},{"lineNumber":376,"author":{"gitId":"-"},"content":"testers are expected to do more *exploratory* testing.","lastModifiedDate":"2020-05-23"},{"lineNumber":377,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":378,"author":{"gitId":"-"},"content":"\u003c/box\u003e","lastModifiedDate":"2023-09-12"},{"lineNumber":379,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":380,"author":{"gitId":"-"},"content":"### Launch and shutdown","lastModifiedDate":"2020-05-23"},{"lineNumber":381,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":382,"author":{"gitId":"-"},"content":"1. Initial launch","lastModifiedDate":"2020-05-23"},{"lineNumber":383,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":384,"author":{"gitId":"-"},"content":" 1. Download the jar file and copy into an empty folder","lastModifiedDate":"2020-05-23"},{"lineNumber":385,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":386,"author":{"gitId":"-"},"content":" 1. Double-click the jar file Expected: Shows the GUI with a set of sample contacts. The window size may not be optimum.","lastModifiedDate":"2020-05-23"},{"lineNumber":387,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":388,"author":{"gitId":"-"},"content":"1. Saving window preferences","lastModifiedDate":"2020-05-23"},{"lineNumber":389,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":390,"author":{"gitId":"-"},"content":" 1. Resize the window to an optimum size. Move the window to a different location. Close the window.","lastModifiedDate":"2020-05-23"},{"lineNumber":391,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":392,"author":{"gitId":"-"},"content":" 1. Re-launch the app by double-clicking the jar file.\u003cbr\u003e","lastModifiedDate":"2020-05-23"},{"lineNumber":393,"author":{"gitId":"-"},"content":" Expected: The most recent window size and location is retained.","lastModifiedDate":"2020-05-23"},{"lineNumber":394,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":395,"author":{"gitId":"-"},"content":"1. _{ more test cases …​ }_","lastModifiedDate":"2020-05-23"},{"lineNumber":396,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":397,"author":{"gitId":"-"},"content":"### Deleting a person","lastModifiedDate":"2020-05-23"},{"lineNumber":398,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":399,"author":{"gitId":"-"},"content":"1. Deleting a person while all persons are being shown","lastModifiedDate":"2020-05-23"},{"lineNumber":400,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":401,"author":{"gitId":"-"},"content":" 1. Prerequisites: List all persons using the `list` command. Multiple persons in the list.","lastModifiedDate":"2020-05-23"},{"lineNumber":402,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":403,"author":{"gitId":"-"},"content":" 1. Test case: `delete 1`\u003cbr\u003e","lastModifiedDate":"2020-05-23"},{"lineNumber":404,"author":{"gitId":"-"},"content":" 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.","lastModifiedDate":"2020-05-23"},{"lineNumber":405,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":406,"author":{"gitId":"-"},"content":" 1. Test case: `delete 0`\u003cbr\u003e","lastModifiedDate":"2020-05-23"},{"lineNumber":407,"author":{"gitId":"-"},"content":" Expected: No person is deleted. Error details shown in the status message. Status bar remains the same.","lastModifiedDate":"2020-05-23"},{"lineNumber":408,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":409,"author":{"gitId":"-"},"content":" 1. Other incorrect delete commands to try: `delete`, `delete x`, `...` (where x is larger than the list size)\u003cbr\u003e","lastModifiedDate":"2020-05-23"},{"lineNumber":410,"author":{"gitId":"-"},"content":" Expected: Similar to previous.","lastModifiedDate":"2020-05-23"},{"lineNumber":411,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":412,"author":{"gitId":"-"},"content":"1. _{ more test cases …​ }_","lastModifiedDate":"2020-05-23"},{"lineNumber":413,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":414,"author":{"gitId":"-"},"content":"### Saving data","lastModifiedDate":"2020-05-23"},{"lineNumber":415,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":416,"author":{"gitId":"-"},"content":"1. Dealing with missing/corrupted data files","lastModifiedDate":"2020-05-23"},{"lineNumber":417,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":418,"author":{"gitId":"-"},"content":" 1. _{explain how to simulate a missing/corrupted file, and the expected behavior}_","lastModifiedDate":"2020-05-23"},{"lineNumber":419,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":420,"author":{"gitId":"-"},"content":"1. _{ more test cases …​ }_","lastModifiedDate":"2020-05-23"}],"authorContributionMap":{"beefsausagee":28,"garywongkai":6,"-":386}},{"path":"docs/UserGuide.md","fileType":"docs","lines":[{"lineNumber":1,"author":{"gitId":"-"},"content":"---","lastModifiedDate":"2020-05-23"},{"lineNumber":2,"author":{"gitId":"-"},"content":" layout: default.md","lastModifiedDate":"2023-09-12"},{"lineNumber":3,"author":{"gitId":"-"},"content":" title: \"User Guide\"","lastModifiedDate":"2023-09-12"},{"lineNumber":4,"author":{"gitId":"-"},"content":" pageNav: 3","lastModifiedDate":"2023-09-12"},{"lineNumber":5,"author":{"gitId":"-"},"content":"---","lastModifiedDate":"2020-05-23"},{"lineNumber":6,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":7,"author":{"gitId":"-"},"content":"# AB-3 User Guide","lastModifiedDate":"2023-09-12"},{"lineNumber":8,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":9,"author":{"gitId":"-"},"content":"AddressBook Level 3 (AB3) is a **desktop app for managing contacts, optimized for use via a 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.","lastModifiedDate":"2023-09-12"},{"lineNumber":10,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2023-09-12"},{"lineNumber":11,"author":{"gitId":"-"},"content":"\u003c!-- * Table of Contents --\u003e","lastModifiedDate":"2023-09-12"},{"lineNumber":12,"author":{"gitId":"-"},"content":"\u003cpage-nav-print /\u003e","lastModifiedDate":"2023-09-12"},{"lineNumber":13,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":14,"author":{"gitId":"-"},"content":"--------------------------------------------------------------------------------------------------------------------","lastModifiedDate":"2020-05-23"},{"lineNumber":15,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":16,"author":{"gitId":"-"},"content":"## Quick start","lastModifiedDate":"2020-05-23"},{"lineNumber":17,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":18,"author":{"gitId":"-"},"content":"1. Ensure you have Java `11` or above installed in your Computer.","lastModifiedDate":"2020-05-23"},{"lineNumber":19,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":20,"author":{"gitId":"-"},"content":"1. Download the latest `addressbook.jar` from [here](https://github.com/se-edu/addressbook-level3/releases).","lastModifiedDate":"2020-05-23"},{"lineNumber":21,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":22,"author":{"gitId":"-"},"content":"1. Copy the file to the folder you want to use as the _home folder_ for your AddressBook.","lastModifiedDate":"2020-05-23"},{"lineNumber":23,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":24,"author":{"gitId":"-"},"content":"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.\u003cbr\u003e","lastModifiedDate":"2023-01-01"},{"lineNumber":25,"author":{"gitId":"-"},"content":" A GUI similar to the below should appear in a few seconds. Note how the app contains some sample data.\u003cbr\u003e","lastModifiedDate":"2023-01-01"},{"lineNumber":26,"author":{"gitId":"-"},"content":" ![Ui](images/Ui.png)","lastModifiedDate":"2020-05-23"},{"lineNumber":27,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":28,"author":{"gitId":"-"},"content":"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.\u003cbr\u003e","lastModifiedDate":"2020-05-23"},{"lineNumber":29,"author":{"gitId":"-"},"content":" Some example commands you can try:","lastModifiedDate":"2020-05-23"},{"lineNumber":30,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":31,"author":{"gitId":"-"},"content":" * `list` : Lists all contacts.","lastModifiedDate":"2023-01-01"},{"lineNumber":32,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":33,"author":{"gitId":"-"},"content":" * `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.","lastModifiedDate":"2023-01-01"},{"lineNumber":34,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":35,"author":{"gitId":"-"},"content":" * `delete 3` : Deletes the 3rd contact shown in the current list.","lastModifiedDate":"2023-01-01"},{"lineNumber":36,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":37,"author":{"gitId":"-"},"content":" * `clear` : Deletes all contacts.","lastModifiedDate":"2023-01-01"},{"lineNumber":38,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":39,"author":{"gitId":"-"},"content":" * `exit` : Exits the app.","lastModifiedDate":"2023-01-01"},{"lineNumber":40,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":41,"author":{"gitId":"-"},"content":"1. Refer to the [Features](#features) below for details of each command.","lastModifiedDate":"2020-05-23"},{"lineNumber":42,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":43,"author":{"gitId":"-"},"content":"--------------------------------------------------------------------------------------------------------------------","lastModifiedDate":"2020-05-23"},{"lineNumber":44,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":45,"author":{"gitId":"-"},"content":"## Features","lastModifiedDate":"2020-05-23"},{"lineNumber":46,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":47,"author":{"gitId":"-"},"content":"\u003cbox type\u003d\"info\" seamless\u003e","lastModifiedDate":"2023-09-12"},{"lineNumber":48,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":49,"author":{"gitId":"-"},"content":"**Notes about the command format:**\u003cbr\u003e","lastModifiedDate":"2023-09-12"},{"lineNumber":50,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":51,"author":{"gitId":"-"},"content":"* Words in `UPPER_CASE` are the parameters to be supplied by the user.\u003cbr\u003e","lastModifiedDate":"2020-05-23"},{"lineNumber":52,"author":{"gitId":"-"},"content":" e.g. in `add n/NAME`, `NAME` is a parameter which can be used as `add n/John Doe`.","lastModifiedDate":"2020-05-23"},{"lineNumber":53,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":54,"author":{"gitId":"-"},"content":"* Items in square brackets are optional.\u003cbr\u003e","lastModifiedDate":"2020-05-23"},{"lineNumber":55,"author":{"gitId":"-"},"content":" e.g `n/NAME [t/TAG]` can be used as `n/John Doe t/friend` or as `n/John Doe`.","lastModifiedDate":"2020-05-23"},{"lineNumber":56,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":57,"author":{"gitId":"-"},"content":"* Items with `…`​ after them can be used multiple times including zero times.\u003cbr\u003e","lastModifiedDate":"2020-05-23"},{"lineNumber":58,"author":{"gitId":"-"},"content":" e.g. `[t/TAG]…​` can be used as ` ` (i.e. 0 times), `t/friend`, `t/friend t/family` etc.","lastModifiedDate":"2020-05-23"},{"lineNumber":59,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":60,"author":{"gitId":"-"},"content":"* Parameters can be in any order.\u003cbr\u003e","lastModifiedDate":"2020-05-23"},{"lineNumber":61,"author":{"gitId":"-"},"content":" e.g. if the command specifies `n/NAME p/PHONE_NUMBER`, `p/PHONE_NUMBER n/NAME` is also acceptable.","lastModifiedDate":"2020-05-23"},{"lineNumber":62,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":63,"author":{"gitId":"-"},"content":"* Extraneous parameters for commands that do not take in parameters (such as `help`, `list`, `exit` and `clear`) will be ignored.\u003cbr\u003e","lastModifiedDate":"2021-02-03"},{"lineNumber":64,"author":{"gitId":"-"},"content":" e.g. if the command specifies `help 123`, it will be interpreted as `help`.","lastModifiedDate":"2021-02-03"},{"lineNumber":65,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2021-02-03"},{"lineNumber":66,"author":{"gitId":"-"},"content":"* 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.","lastModifiedDate":"2023-06-26"},{"lineNumber":67,"author":{"gitId":"-"},"content":"\u003c/box\u003e","lastModifiedDate":"2023-09-12"},{"lineNumber":68,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":69,"author":{"gitId":"-"},"content":"### Viewing help : `help`","lastModifiedDate":"2020-05-23"},{"lineNumber":70,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":71,"author":{"gitId":"-"},"content":"Shows a message explaning how to access the help page.","lastModifiedDate":"2020-05-23"},{"lineNumber":72,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":73,"author":{"gitId":"-"},"content":"Format: `help`","lastModifiedDate":"2020-05-23"},{"lineNumber":74,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":75,"author":{"gitId":"DominicFuMJ"},"content":"Expected success outcome:","lastModifiedDate":"2024-02-29"},{"lineNumber":76,"author":{"gitId":"DominicFuMJ"},"content":"![help message](images/helpMessage.png)","lastModifiedDate":"2024-02-29"},{"lineNumber":77,"author":{"gitId":"DominicFuMJ"},"content":"","lastModifiedDate":"2024-02-29"},{"lineNumber":78,"author":{"gitId":"DominicFuMJ"},"content":"Expected failure outcome:","lastModifiedDate":"2024-02-29"},{"lineNumber":79,"author":{"gitId":"DominicFuMJ"},"content":"```","lastModifiedDate":"2024-02-29"},{"lineNumber":80,"author":{"gitId":"DominicFuMJ"},"content":"Help not available. Please try again.","lastModifiedDate":"2024-02-29"},{"lineNumber":81,"author":{"gitId":"DominicFuMJ"},"content":"```","lastModifiedDate":"2024-02-29"},{"lineNumber":82,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":83,"author":{"gitId":"-"},"content":"### Adding a person: `add`","lastModifiedDate":"2020-05-23"},{"lineNumber":84,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":85,"author":{"gitId":"AwJoey"},"content":"Adds a person to the address book with their information.","lastModifiedDate":"2024-02-29"},{"lineNumber":86,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":87,"author":{"gitId":"-"},"content":"Format: `add n/NAME p/PHONE_NUMBER e/EMAIL a/ADDRESS [t/TAG]…​`","lastModifiedDate":"2020-05-23"},{"lineNumber":88,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":89,"author":{"gitId":"AwJoey"},"content":"* Phone number **must be a valid Singapore number** (i.e. 8 digits, starts with either 6, 8 or 9)","lastModifiedDate":"2024-02-29"},{"lineNumber":90,"author":{"gitId":"AwJoey"},"content":"* Email **must include @ character**","lastModifiedDate":"2024-02-29"},{"lineNumber":91,"author":{"gitId":"AwJoey"},"content":"* Address **must include and be ordered in street name, block number, and unit number (note: include # symbol)**, ","lastModifiedDate":"2024-02-29"},{"lineNumber":92,"author":{"gitId":"AwJoey"},"content":"separated with comma","lastModifiedDate":"2024-02-29"},{"lineNumber":93,"author":{"gitId":"AwJoey"},"content":"* If multiple `tag` are added, separate with comma","lastModifiedDate":"2024-02-29"},{"lineNumber":94,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2023-09-12"},{"lineNumber":95,"author":{"gitId":"-"},"content":"**Tip:** A person can have any number of tags (including 0)","lastModifiedDate":"2023-09-12"},{"lineNumber":96,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":97,"author":{"gitId":"-"},"content":"Examples:","lastModifiedDate":"2020-05-23"},{"lineNumber":98,"author":{"gitId":"-"},"content":"* `add n/John Doe p/98765432 e/johnd@example.com a/John street, block 123, #01-01`","lastModifiedDate":"2020-05-23"},{"lineNumber":99,"author":{"gitId":"-"},"content":"* `add n/Betsy Crowe t/friend e/betsycrowe@example.com a/Newgate Prison p/1234567 t/criminal`","lastModifiedDate":"2020-05-23"},{"lineNumber":100,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":101,"author":{"gitId":"AwJoey"},"content":"Expected success outcome:","lastModifiedDate":"2024-02-29"},{"lineNumber":102,"author":{"gitId":"AwJoey"},"content":"```","lastModifiedDate":"2024-02-29"},{"lineNumber":103,"author":{"gitId":"AwJoey"},"content":"New contact added!","lastModifiedDate":"2024-02-29"},{"lineNumber":104,"author":{"gitId":"AwJoey"},"content":"```","lastModifiedDate":"2024-02-29"},{"lineNumber":105,"author":{"gitId":"AwJoey"},"content":"","lastModifiedDate":"2024-02-29"},{"lineNumber":106,"author":{"gitId":"AwJoey"},"content":"Expected failure outcome:","lastModifiedDate":"2024-02-29"},{"lineNumber":107,"author":{"gitId":"AwJoey"},"content":"```","lastModifiedDate":"2024-02-29"},{"lineNumber":108,"author":{"gitId":"AwJoey"},"content":"Values not accepted.","lastModifiedDate":"2024-02-29"},{"lineNumber":109,"author":{"gitId":"AwJoey"},"content":"```","lastModifiedDate":"2024-02-29"},{"lineNumber":110,"author":{"gitId":"AwJoey"},"content":"","lastModifiedDate":"2024-02-29"},{"lineNumber":111,"author":{"gitId":"AwJoey"},"content":"Potential Errors:","lastModifiedDate":"2024-02-29"},{"lineNumber":112,"author":{"gitId":"AwJoey"},"content":"* Phone number format is wrong (i.e. not a Singapore number)","lastModifiedDate":"2024-02-29"},{"lineNumber":113,"author":{"gitId":"AwJoey"},"content":"* Email format is wrong (i.e. no @)","lastModifiedDate":"2024-02-29"},{"lineNumber":114,"author":{"gitId":"AwJoey"},"content":"* Address format is wrong","lastModifiedDate":"2024-02-29"},{"lineNumber":115,"author":{"gitId":"AwJoey"},"content":"* An existing contact with same name and phone number is found in address book","lastModifiedDate":"2024-02-29"},{"lineNumber":116,"author":{"gitId":"AwJoey"},"content":"","lastModifiedDate":"2024-02-29"},{"lineNumber":117,"author":{"gitId":"AwJoey"},"content":"","lastModifiedDate":"2024-02-29"},{"lineNumber":118,"author":{"gitId":"-"},"content":"### Listing all persons : `list`","lastModifiedDate":"2020-05-23"},{"lineNumber":119,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":120,"author":{"gitId":"-"},"content":"Shows a list of all persons in the address book.","lastModifiedDate":"2020-05-23"},{"lineNumber":121,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":122,"author":{"gitId":"-"},"content":"Format: `list`","lastModifiedDate":"2020-05-23"},{"lineNumber":123,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":124,"author":{"gitId":"AwJoey"},"content":"Expected success outcome:","lastModifiedDate":"2024-02-29"},{"lineNumber":125,"author":{"gitId":"AwJoey"},"content":"```","lastModifiedDate":"2024-02-29"},{"lineNumber":126,"author":{"gitId":"AwJoey"},"content":"List of contacts:","lastModifiedDate":"2024-02-29"},{"lineNumber":127,"author":{"gitId":"AwJoey"},"content":"...","lastModifiedDate":"2024-02-29"},{"lineNumber":128,"author":{"gitId":"AwJoey"},"content":"```","lastModifiedDate":"2024-02-29"},{"lineNumber":129,"author":{"gitId":"AwJoey"},"content":"","lastModifiedDate":"2024-02-29"},{"lineNumber":130,"author":{"gitId":"AwJoey"},"content":"Expected failure outcome:","lastModifiedDate":"2024-02-29"},{"lineNumber":131,"author":{"gitId":"AwJoey"},"content":"```","lastModifiedDate":"2024-02-29"},{"lineNumber":132,"author":{"gitId":"AwJoey"},"content":"No contacts added yet.","lastModifiedDate":"2024-02-29"},{"lineNumber":133,"author":{"gitId":"AwJoey"},"content":"```","lastModifiedDate":"2024-02-29"},{"lineNumber":134,"author":{"gitId":"AwJoey"},"content":"","lastModifiedDate":"2024-02-29"},{"lineNumber":135,"author":{"gitId":"AwJoey"},"content":"","lastModifiedDate":"2024-02-29"},{"lineNumber":136,"author":{"gitId":"-"},"content":"### Editing a person : `edit`","lastModifiedDate":"2020-05-23"},{"lineNumber":137,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":138,"author":{"gitId":"AwJoey"},"content":"Edits an existing person\u0027s information in the address book.","lastModifiedDate":"2024-02-29"},{"lineNumber":139,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":140,"author":{"gitId":"-"},"content":"Format: `edit INDEX [n/NAME] [p/PHONE] [e/EMAIL] [a/ADDRESS] [t/TAG]…​`","lastModifiedDate":"2020-05-23"},{"lineNumber":141,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":142,"author":{"gitId":"-"},"content":"* 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, …​","lastModifiedDate":"2020-05-23"},{"lineNumber":143,"author":{"gitId":"-"},"content":"* At least one of the optional fields must be provided.","lastModifiedDate":"2020-05-23"},{"lineNumber":144,"author":{"gitId":"-"},"content":"* Existing values will be updated to the input values.","lastModifiedDate":"2020-05-23"},{"lineNumber":145,"author":{"gitId":"-"},"content":"* When editing tags, the existing tags of the person will be removed i.e adding of tags is not cumulative.","lastModifiedDate":"2020-05-23"},{"lineNumber":146,"author":{"gitId":"-"},"content":"* You can remove all the person’s tags by typing `t/` without","lastModifiedDate":"2020-05-23"},{"lineNumber":147,"author":{"gitId":"-"},"content":" specifying any tags after it.","lastModifiedDate":"2020-05-23"},{"lineNumber":148,"author":{"gitId":"AwJoey"},"content":"* Adding a person\u0027s format for **phone number, email, and address** applies here as well.","lastModifiedDate":"2024-02-29"},{"lineNumber":149,"author":{"gitId":"AwJoey"},"content":"* ","lastModifiedDate":"2024-02-29"},{"lineNumber":150,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":151,"author":{"gitId":"-"},"content":"Examples:","lastModifiedDate":"2020-05-23"},{"lineNumber":152,"author":{"gitId":"-"},"content":"* `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.","lastModifiedDate":"2020-05-23"},{"lineNumber":153,"author":{"gitId":"-"},"content":"* `edit 2 n/Betsy Crower t/` Edits the name of the 2nd person to be `Betsy Crower` and clears all existing tags.","lastModifiedDate":"2020-05-23"},{"lineNumber":154,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":155,"author":{"gitId":"AwJoey"},"content":"Expected success outcome:","lastModifiedDate":"2024-02-29"},{"lineNumber":156,"author":{"gitId":"AwJoey"},"content":"```","lastModifiedDate":"2024-02-29"},{"lineNumber":157,"author":{"gitId":"AwJoey"},"content":"Contact is updated!","lastModifiedDate":"2024-02-29"},{"lineNumber":158,"author":{"gitId":"AwJoey"},"content":"```","lastModifiedDate":"2024-02-29"},{"lineNumber":159,"author":{"gitId":"AwJoey"},"content":"","lastModifiedDate":"2024-02-29"},{"lineNumber":160,"author":{"gitId":"AwJoey"},"content":"Expected failure outcome:","lastModifiedDate":"2024-02-29"},{"lineNumber":161,"author":{"gitId":"AwJoey"},"content":"```","lastModifiedDate":"2024-02-29"},{"lineNumber":162,"author":{"gitId":"AwJoey"},"content":"Values not accepted.","lastModifiedDate":"2024-02-29"},{"lineNumber":163,"author":{"gitId":"AwJoey"},"content":"```","lastModifiedDate":"2024-02-29"},{"lineNumber":164,"author":{"gitId":"AwJoey"},"content":"OR","lastModifiedDate":"2024-02-29"},{"lineNumber":165,"author":{"gitId":"AwJoey"},"content":"```","lastModifiedDate":"2024-02-29"},{"lineNumber":166,"author":{"gitId":"AwJoey"},"content":"Contact not found in address book","lastModifiedDate":"2024-02-29"},{"lineNumber":167,"author":{"gitId":"AwJoey"},"content":"```","lastModifiedDate":"2024-02-29"},{"lineNumber":168,"author":{"gitId":"AwJoey"},"content":"","lastModifiedDate":"2024-02-29"},{"lineNumber":169,"author":{"gitId":"AwJoey"},"content":"Potential Errors:","lastModifiedDate":"2024-02-29"},{"lineNumber":170,"author":{"gitId":"AwJoey"},"content":"* [if applicable] Phone number format is wrong (i.e. not a Singapore number)","lastModifiedDate":"2024-02-29"},{"lineNumber":171,"author":{"gitId":"AwJoey"},"content":"* [if applicable] Email format is wrong (i.e. no @)","lastModifiedDate":"2024-02-29"},{"lineNumber":172,"author":{"gitId":"AwJoey"},"content":"* [if applicable] Address format is wrong","lastModifiedDate":"2024-02-29"},{"lineNumber":173,"author":{"gitId":"AwJoey"},"content":"* An existing contact with same name and phone number is found in address book","lastModifiedDate":"2024-02-29"},{"lineNumber":174,"author":{"gitId":"AwJoey"},"content":"","lastModifiedDate":"2024-02-29"},{"lineNumber":175,"author":{"gitId":"AwJoey"},"content":"","lastModifiedDate":"2024-02-29"},{"lineNumber":176,"author":{"gitId":"-"},"content":"### Locating persons by name : `find`","lastModifiedDate":"2020-05-23"},{"lineNumber":177,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":178,"author":{"gitId":"-"},"content":"Finds persons whose names contain any of the given keywords.","lastModifiedDate":"2020-05-23"},{"lineNumber":179,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":180,"author":{"gitId":"-"},"content":"Format: `find KEYWORD [MORE_KEYWORDS]`","lastModifiedDate":"2020-05-23"},{"lineNumber":181,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":182,"author":{"gitId":"-"},"content":"* The search is case-insensitive. e.g `hans` will match `Hans`","lastModifiedDate":"2020-05-23"},{"lineNumber":183,"author":{"gitId":"-"},"content":"* The order of the keywords does not matter. e.g. `Hans Bo` will match `Bo Hans`","lastModifiedDate":"2020-05-23"},{"lineNumber":184,"author":{"gitId":"-"},"content":"* Only the name is searched.","lastModifiedDate":"2020-05-23"},{"lineNumber":185,"author":{"gitId":"-"},"content":"* Only full words will be matched e.g. `Han` will not match `Hans`","lastModifiedDate":"2020-05-23"},{"lineNumber":186,"author":{"gitId":"-"},"content":"* Persons matching at least one keyword will be returned (i.e. `OR` search).","lastModifiedDate":"2020-05-23"},{"lineNumber":187,"author":{"gitId":"-"},"content":" e.g. `Hans Bo` will return `Hans Gruber`, `Bo Yang`","lastModifiedDate":"2020-05-23"},{"lineNumber":188,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":189,"author":{"gitId":"-"},"content":"Examples:","lastModifiedDate":"2020-05-23"},{"lineNumber":190,"author":{"gitId":"-"},"content":"* `find John` returns `john` and `John Doe`","lastModifiedDate":"2020-05-23"},{"lineNumber":191,"author":{"gitId":"-"},"content":"* `find alex david` returns `Alex Yeoh`, `David Li`\u003cbr\u003e","lastModifiedDate":"2020-05-23"},{"lineNumber":192,"author":{"gitId":"-"},"content":" ![result for \u0027find alex david\u0027](images/findAlexDavidResult.png)","lastModifiedDate":"2020-05-23"},{"lineNumber":193,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":194,"author":{"gitId":"AwJoey"},"content":"Expected success outcome:","lastModifiedDate":"2024-02-29"},{"lineNumber":195,"author":{"gitId":"AwJoey"},"content":"```","lastModifiedDate":"2024-02-29"},{"lineNumber":196,"author":{"gitId":"AwJoey"},"content":"Contacts found:","lastModifiedDate":"2024-02-29"},{"lineNumber":197,"author":{"gitId":"AwJoey"},"content":"...","lastModifiedDate":"2024-02-29"},{"lineNumber":198,"author":{"gitId":"AwJoey"},"content":"```","lastModifiedDate":"2024-02-29"},{"lineNumber":199,"author":{"gitId":"AwJoey"},"content":"","lastModifiedDate":"2024-02-29"},{"lineNumber":200,"author":{"gitId":"AwJoey"},"content":"Expected failure outcome:","lastModifiedDate":"2024-02-29"},{"lineNumber":201,"author":{"gitId":"AwJoey"},"content":"```","lastModifiedDate":"2024-02-29"},{"lineNumber":202,"author":{"gitId":"AwJoey"},"content":"No contact found.","lastModifiedDate":"2024-02-29"},{"lineNumber":203,"author":{"gitId":"AwJoey"},"content":"```","lastModifiedDate":"2024-02-29"},{"lineNumber":204,"author":{"gitId":"AwJoey"},"content":"","lastModifiedDate":"2024-02-29"},{"lineNumber":205,"author":{"gitId":"AwJoey"},"content":"","lastModifiedDate":"2024-02-29"},{"lineNumber":206,"author":{"gitId":"-"},"content":"### Deleting a person : `delete`","lastModifiedDate":"2020-05-23"},{"lineNumber":207,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":208,"author":{"gitId":"-"},"content":"Deletes the specified person from the address book.","lastModifiedDate":"2020-05-23"},{"lineNumber":209,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":210,"author":{"gitId":"-"},"content":"Format: `delete INDEX`","lastModifiedDate":"2020-05-23"},{"lineNumber":211,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":212,"author":{"gitId":"-"},"content":"* Deletes the person at the specified `INDEX`.","lastModifiedDate":"2020-05-23"},{"lineNumber":213,"author":{"gitId":"-"},"content":"* The index refers to the index number shown in the displayed person list.","lastModifiedDate":"2020-05-23"},{"lineNumber":214,"author":{"gitId":"-"},"content":"* The index **must be a positive integer** 1, 2, 3, …​","lastModifiedDate":"2020-05-23"},{"lineNumber":215,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":216,"author":{"gitId":"-"},"content":"Examples:","lastModifiedDate":"2020-05-23"},{"lineNumber":217,"author":{"gitId":"-"},"content":"* `list` followed by `delete 2` deletes the 2nd person in the address book.","lastModifiedDate":"2020-05-23"},{"lineNumber":218,"author":{"gitId":"-"},"content":"* `find Betsy` followed by `delete 1` deletes the 1st person in the results of the `find` command.","lastModifiedDate":"2020-05-23"},{"lineNumber":219,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":220,"author":{"gitId":"AwJoey"},"content":"Expected success outcome:","lastModifiedDate":"2024-02-29"},{"lineNumber":221,"author":{"gitId":"AwJoey"},"content":"```","lastModifiedDate":"2024-02-29"},{"lineNumber":222,"author":{"gitId":"AwJoey"},"content":"Contact is updated!","lastModifiedDate":"2024-02-29"},{"lineNumber":223,"author":{"gitId":"AwJoey"},"content":"```","lastModifiedDate":"2024-02-29"},{"lineNumber":224,"author":{"gitId":"AwJoey"},"content":"","lastModifiedDate":"2024-02-29"},{"lineNumber":225,"author":{"gitId":"AwJoey"},"content":"Expected failure outcome:","lastModifiedDate":"2024-02-29"},{"lineNumber":226,"author":{"gitId":"AwJoey"},"content":"```","lastModifiedDate":"2024-02-29"},{"lineNumber":227,"author":{"gitId":"AwJoey"},"content":"Values not accepted.","lastModifiedDate":"2024-02-29"},{"lineNumber":228,"author":{"gitId":"AwJoey"},"content":"```","lastModifiedDate":"2024-02-29"},{"lineNumber":229,"author":{"gitId":"AwJoey"},"content":"OR","lastModifiedDate":"2024-02-29"},{"lineNumber":230,"author":{"gitId":"AwJoey"},"content":"```","lastModifiedDate":"2024-02-29"},{"lineNumber":231,"author":{"gitId":"AwJoey"},"content":"Contact not found in address book","lastModifiedDate":"2024-02-29"},{"lineNumber":232,"author":{"gitId":"AwJoey"},"content":"```","lastModifiedDate":"2024-02-29"},{"lineNumber":233,"author":{"gitId":"AwJoey"},"content":"","lastModifiedDate":"2024-02-29"},{"lineNumber":234,"author":{"gitId":"AwJoey"},"content":"","lastModifiedDate":"2024-02-29"},{"lineNumber":235,"author":{"gitId":"-"},"content":"### Clearing all entries : `clear`","lastModifiedDate":"2020-05-23"},{"lineNumber":236,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":237,"author":{"gitId":"-"},"content":"Clears all entries from the address book.","lastModifiedDate":"2020-05-23"},{"lineNumber":238,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":239,"author":{"gitId":"-"},"content":"Format: `clear`","lastModifiedDate":"2020-05-23"},{"lineNumber":240,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":241,"author":{"gitId":"DominicFuMJ"},"content":"Expected success outcome: ","lastModifiedDate":"2024-02-29"},{"lineNumber":242,"author":{"gitId":"DominicFuMJ"},"content":"```","lastModifiedDate":"2024-02-29"},{"lineNumber":243,"author":{"gitId":"DominicFuMJ"},"content":"History cleared","lastModifiedDate":"2024-02-29"},{"lineNumber":244,"author":{"gitId":"DominicFuMJ"},"content":"```","lastModifiedDate":"2024-02-29"},{"lineNumber":245,"author":{"gitId":"DominicFuMJ"},"content":"","lastModifiedDate":"2024-02-29"},{"lineNumber":246,"author":{"gitId":"DominicFuMJ"},"content":"Expected failure outcome:","lastModifiedDate":"2024-02-29"},{"lineNumber":247,"author":{"gitId":"DominicFuMJ"},"content":"```","lastModifiedDate":"2024-02-29"},{"lineNumber":248,"author":{"gitId":"DominicFuMJ"},"content":"History not cleared","lastModifiedDate":"2024-02-29"},{"lineNumber":249,"author":{"gitId":"DominicFuMJ"},"content":"```","lastModifiedDate":"2024-02-29"},{"lineNumber":250,"author":{"gitId":"DominicFuMJ"},"content":"","lastModifiedDate":"2024-02-29"},{"lineNumber":251,"author":{"gitId":"DominicFuMJ"},"content":"### Adding interest tag : `interest`","lastModifiedDate":"2024-02-29"},{"lineNumber":252,"author":{"gitId":"DominicFuMJ"},"content":"","lastModifiedDate":"2024-02-29"},{"lineNumber":253,"author":{"gitId":"DominicFuMJ"},"content":"Adding an interest tag to a specified person from the address book","lastModifiedDate":"2024-02-29"},{"lineNumber":254,"author":{"gitId":"DominicFuMJ"},"content":"","lastModifiedDate":"2024-02-29"},{"lineNumber":255,"author":{"gitId":"DominicFuMJ"},"content":"Format: `interest INDEX INTEREST [MORE_INTEREST]`","lastModifiedDate":"2024-02-29"},{"lineNumber":256,"author":{"gitId":"DominicFuMJ"},"content":"","lastModifiedDate":"2024-02-29"},{"lineNumber":257,"author":{"gitId":"DominicFuMJ"},"content":"* Adds an interest to the person at the specified \u0027INDEX\u0027","lastModifiedDate":"2024-02-29"},{"lineNumber":258,"author":{"gitId":"DominicFuMJ"},"content":"* The index refers to the index number shown in the displayed person list","lastModifiedDate":"2024-02-29"},{"lineNumber":259,"author":{"gitId":"DominicFuMJ"},"content":"* The index **must be a positive integer** 1, 2, 3, …​","lastModifiedDate":"2024-02-29"},{"lineNumber":260,"author":{"gitId":"DominicFuMJ"},"content":"* The interest **must not have any special characters** e.g. !, @, #, $, …​","lastModifiedDate":"2024-02-29"},{"lineNumber":261,"author":{"gitId":"DominicFuMJ"},"content":"","lastModifiedDate":"2024-02-29"},{"lineNumber":262,"author":{"gitId":"DominicFuMJ"},"content":"Examples:","lastModifiedDate":"2024-02-29"},{"lineNumber":263,"author":{"gitId":"DominicFuMJ"},"content":"* `interest 3 swimming` adds the interest tag `swimming` to the 3rd person in the address book","lastModifiedDate":"2024-02-29"},{"lineNumber":264,"author":{"gitId":"DominicFuMJ"},"content":"* `interest 1 cooking cycling` adds the interest tags `cooking` and `cycling` to the 1st person in the address book","lastModifiedDate":"2024-02-29"},{"lineNumber":265,"author":{"gitId":"DominicFuMJ"},"content":"","lastModifiedDate":"2024-02-29"},{"lineNumber":266,"author":{"gitId":"DominicFuMJ"},"content":"Expected success outcome:","lastModifiedDate":"2024-02-29"},{"lineNumber":267,"author":{"gitId":"DominicFuMJ"},"content":"```","lastModifiedDate":"2024-02-29"},{"lineNumber":268,"author":{"gitId":"DominicFuMJ"},"content":"Tagged on contact 1","lastModifiedDate":"2024-02-29"},{"lineNumber":269,"author":{"gitId":"DominicFuMJ"},"content":"```","lastModifiedDate":"2024-02-29"},{"lineNumber":270,"author":{"gitId":"DominicFuMJ"},"content":"","lastModifiedDate":"2024-02-29"},{"lineNumber":271,"author":{"gitId":"DominicFuMJ"},"content":"Expected failure outcome:","lastModifiedDate":"2024-02-29"},{"lineNumber":272,"author":{"gitId":"DominicFuMJ"},"content":"```","lastModifiedDate":"2024-02-29"},{"lineNumber":273,"author":{"gitId":"DominicFuMJ"},"content":"Contact not available","lastModifiedDate":"2024-02-29"},{"lineNumber":274,"author":{"gitId":"DominicFuMJ"},"content":"```","lastModifiedDate":"2024-02-29"},{"lineNumber":275,"author":{"gitId":"DominicFuMJ"},"content":"","lastModifiedDate":"2024-02-29"},{"lineNumber":276,"author":{"gitId":"DominicFuMJ"},"content":"### Locating persons by interest : `findInterest`","lastModifiedDate":"2024-02-29"},{"lineNumber":277,"author":{"gitId":"DominicFuMJ"},"content":"","lastModifiedDate":"2024-02-29"},{"lineNumber":278,"author":{"gitId":"DominicFuMJ"},"content":"Find persons whose interest tag contains any of the given keywords","lastModifiedDate":"2024-02-29"},{"lineNumber":279,"author":{"gitId":"DominicFuMJ"},"content":"","lastModifiedDate":"2024-02-29"},{"lineNumber":280,"author":{"gitId":"DominicFuMJ"},"content":"Format: `findInterest INTEREST [MORE_INTEREST]`","lastModifiedDate":"2024-02-29"},{"lineNumber":281,"author":{"gitId":"DominicFuMJ"},"content":"","lastModifiedDate":"2024-02-29"},{"lineNumber":282,"author":{"gitId":"DominicFuMJ"},"content":"* The search is case-insensitive. e.g. `cooking` will match `Cooking`","lastModifiedDate":"2024-02-29"},{"lineNumber":283,"author":{"gitId":"DominicFuMJ"},"content":"* The order of the keywords does not matter. e.g. `cycling bikes` will match `bikes cycling`","lastModifiedDate":"2024-02-29"},{"lineNumber":284,"author":{"gitId":"DominicFuMJ"},"content":"* Only the interest tag is searched","lastModifiedDate":"2024-02-29"},{"lineNumber":285,"author":{"gitId":"DominicFuMJ"},"content":"* Only full words will be matched e.g. `Cycle` will not match `Cycling`","lastModifiedDate":"2024-02-29"},{"lineNumber":286,"author":{"gitId":"DominicFuMJ"},"content":"* Persons matching at least one keyword will be returned (i.e. `OR` search)","lastModifiedDate":"2024-02-29"},{"lineNumber":287,"author":{"gitId":"DominicFuMJ"},"content":" e.g. `Ice Skating` will return `Ice Sculpting`, `Rollor Skating`","lastModifiedDate":"2024-02-29"},{"lineNumber":288,"author":{"gitId":"DominicFuMJ"},"content":"* The interest **must not have any special characters** e.g. !, @, #, $, …​","lastModifiedDate":"2024-02-29"},{"lineNumber":289,"author":{"gitId":"DominicFuMJ"},"content":"","lastModifiedDate":"2024-02-29"},{"lineNumber":290,"author":{"gitId":"DominicFuMJ"},"content":"Examples:","lastModifiedDate":"2024-02-29"},{"lineNumber":291,"author":{"gitId":"DominicFuMJ"},"content":"* `findInterest swimming` returns `Joseph Schooling` and `Joscelin Yeo Wei Ling` with tags for `swimming`","lastModifiedDate":"2024-02-29"},{"lineNumber":292,"author":{"gitId":"DominicFuMJ"},"content":"* `findInterest cooking cycling` returns `Lance Armstrong` for `cycling`, `Andre Chiang` for `cooking`","lastModifiedDate":"2024-02-29"},{"lineNumber":293,"author":{"gitId":"DominicFuMJ"},"content":"","lastModifiedDate":"2024-02-29"},{"lineNumber":294,"author":{"gitId":"DominicFuMJ"},"content":"Expected success outcome:","lastModifiedDate":"2024-02-29"},{"lineNumber":295,"author":{"gitId":"DominicFuMJ"},"content":"```","lastModifiedDate":"2024-02-29"},{"lineNumber":296,"author":{"gitId":"DominicFuMJ"},"content":"Interests found:","lastModifiedDate":"2024-02-29"},{"lineNumber":297,"author":{"gitId":"DominicFuMJ"},"content":"...","lastModifiedDate":"2024-02-29"},{"lineNumber":298,"author":{"gitId":"DominicFuMJ"},"content":"```","lastModifiedDate":"2024-02-29"},{"lineNumber":299,"author":{"gitId":"DominicFuMJ"},"content":"","lastModifiedDate":"2024-02-29"},{"lineNumber":300,"author":{"gitId":"DominicFuMJ"},"content":"Expected failure outcome:","lastModifiedDate":"2024-02-29"},{"lineNumber":301,"author":{"gitId":"DominicFuMJ"},"content":"```","lastModifiedDate":"2024-02-29"},{"lineNumber":302,"author":{"gitId":"DominicFuMJ"},"content":"Interests not found","lastModifiedDate":"2024-02-29"},{"lineNumber":303,"author":{"gitId":"DominicFuMJ"},"content":"```","lastModifiedDate":"2024-02-29"},{"lineNumber":304,"author":{"gitId":"DominicFuMJ"},"content":"","lastModifiedDate":"2024-02-29"},{"lineNumber":305,"author":{"gitId":"DominicFuMJ"},"content":"### Adding persons to schedule : `addSched`","lastModifiedDate":"2024-02-29"},{"lineNumber":306,"author":{"gitId":"DominicFuMJ"},"content":"","lastModifiedDate":"2024-02-29"},{"lineNumber":307,"author":{"gitId":"DominicFuMJ"},"content":"Adds an event with contact from specified date with time","lastModifiedDate":"2024-02-29"},{"lineNumber":308,"author":{"gitId":"DominicFuMJ"},"content":"","lastModifiedDate":"2024-02-29"},{"lineNumber":309,"author":{"gitId":"DominicFuMJ"},"content":"Format: `addSched INDEX [MORE_INDEX] SCHEDULE_NAME from/DATE_TIME to/TIME`","lastModifiedDate":"2024-02-29"},{"lineNumber":310,"author":{"gitId":"DominicFuMJ"},"content":"","lastModifiedDate":"2024-02-29"},{"lineNumber":311,"author":{"gitId":"DominicFuMJ"},"content":"* The INDEX **must be a positive integer** 1, 2, 3, …​","lastModifiedDate":"2024-02-29"},{"lineNumber":312,"author":{"gitId":"DominicFuMJ"},"content":"* The SCHEDULE_NAME **must not have any special characters** e.g. !, @, #, $, …​","lastModifiedDate":"2024-02-29"},{"lineNumber":313,"author":{"gitId":"DominicFuMJ"},"content":"* The DATE_TIME must be in the format of ddmmyyyy HHmm in 24-hour time","lastModifiedDate":"2024-02-29"},{"lineNumber":314,"author":{"gitId":"DominicFuMJ"},"content":"* The TIME must be in the format of HHmm, but **not before the time from DATE_TIME** e.g. 0000-2359","lastModifiedDate":"2024-02-29"},{"lineNumber":315,"author":{"gitId":"AwJoey"},"content":"* `find Betsy` followed by `addSched 1 Exam 05032024 1600 1800` adds the 1st person in ","lastModifiedDate":"2024-02-29"},{"lineNumber":316,"author":{"gitId":"AwJoey"},"content":"the results of the `find` command to the event stated.","lastModifiedDate":"2024-02-29"},{"lineNumber":317,"author":{"gitId":"DominicFuMJ"},"content":"","lastModifiedDate":"2024-02-29"},{"lineNumber":318,"author":{"gitId":"DominicFuMJ"},"content":"Examples:","lastModifiedDate":"2024-02-29"},{"lineNumber":319,"author":{"gitId":"DominicFuMJ"},"content":"* `addSched 4 Exam 05032024 1600 1800` will add the 4th person in the address list to the `Exam` event which ","lastModifiedDate":"2024-02-29"},{"lineNumber":320,"author":{"gitId":"DominicFuMJ"},"content":"would take place on 5th March 2024 from 4pm - 6pm","lastModifiedDate":"2024-02-29"},{"lineNumber":321,"author":{"gitId":"DominicFuMJ"},"content":"* `addSched 1,2,3 CSMeeting 18032024 1500 1900` will add the 1st, 2nd and 3rd persons in the address list ","lastModifiedDate":"2024-02-29"},{"lineNumber":322,"author":{"gitId":"DominicFuMJ"},"content":"to the `CSMeeting` event which would take place on 18th March 2024 from 3pm - 7pm","lastModifiedDate":"2024-02-29"},{"lineNumber":323,"author":{"gitId":"DominicFuMJ"},"content":"","lastModifiedDate":"2024-02-29"},{"lineNumber":324,"author":{"gitId":"DominicFuMJ"},"content":"Expected success outcome:","lastModifiedDate":"2024-02-29"},{"lineNumber":325,"author":{"gitId":"DominicFuMJ"},"content":"```","lastModifiedDate":"2024-02-29"},{"lineNumber":326,"author":{"gitId":"DominicFuMJ"},"content":"Added schedule with ...","lastModifiedDate":"2024-02-29"},{"lineNumber":327,"author":{"gitId":"DominicFuMJ"},"content":"```","lastModifiedDate":"2024-02-29"},{"lineNumber":328,"author":{"gitId":"DominicFuMJ"},"content":"","lastModifiedDate":"2024-02-29"},{"lineNumber":329,"author":{"gitId":"DominicFuMJ"},"content":"Expected failure outcome:","lastModifiedDate":"2024-02-29"},{"lineNumber":330,"author":{"gitId":"DominicFuMJ"},"content":"```","lastModifiedDate":"2024-02-29"},{"lineNumber":331,"author":{"gitId":"DominicFuMJ"},"content":"Schedule failed to be added.","lastModifiedDate":"2024-02-29"},{"lineNumber":332,"author":{"gitId":"DominicFuMJ"},"content":"```","lastModifiedDate":"2024-02-29"},{"lineNumber":333,"author":{"gitId":"DominicFuMJ"},"content":"","lastModifiedDate":"2024-02-29"},{"lineNumber":334,"author":{"gitId":"DominicFuMJ"},"content":"Potential Errors:","lastModifiedDate":"2024-02-29"},{"lineNumber":335,"author":{"gitId":"DominicFuMJ"},"content":"* Time format is wrong!","lastModifiedDate":"2024-02-29"},{"lineNumber":336,"author":{"gitId":"DominicFuMJ"},"content":"* Date format is wrong","lastModifiedDate":"2024-02-29"},{"lineNumber":337,"author":{"gitId":"DominicFuMJ"},"content":"* Contact not found in address book","lastModifiedDate":"2024-02-29"},{"lineNumber":338,"author":{"gitId":"DominicFuMJ"},"content":"","lastModifiedDate":"2024-02-29"},{"lineNumber":339,"author":{"gitId":"-"},"content":"### Exiting the program : `exit`","lastModifiedDate":"2020-05-23"},{"lineNumber":340,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":341,"author":{"gitId":"-"},"content":"Exits the program.","lastModifiedDate":"2020-05-23"},{"lineNumber":342,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":343,"author":{"gitId":"-"},"content":"Format: `exit`","lastModifiedDate":"2020-05-23"},{"lineNumber":344,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":345,"author":{"gitId":"-"},"content":"### Saving the data","lastModifiedDate":"2020-05-23"},{"lineNumber":346,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":347,"author":{"gitId":"-"},"content":"AddressBook data are saved in the hard disk automatically after any command that changes the data. There is no need to save manually.","lastModifiedDate":"2020-05-23"},{"lineNumber":348,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":349,"author":{"gitId":"-"},"content":"### Editing the data file","lastModifiedDate":"2021-02-04"},{"lineNumber":350,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2021-02-04"},{"lineNumber":351,"author":{"gitId":"-"},"content":"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.","lastModifiedDate":"2023-09-08"},{"lineNumber":352,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2021-02-04"},{"lineNumber":353,"author":{"gitId":"-"},"content":"\u003cbox type\u003d\"warning\" seamless\u003e","lastModifiedDate":"2023-09-12"},{"lineNumber":354,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2023-09-12"},{"lineNumber":355,"author":{"gitId":"-"},"content":"**Caution:**","lastModifiedDate":"2023-09-12"},{"lineNumber":356,"author":{"gitId":"-"},"content":"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.\u003cbr\u003e","lastModifiedDate":"2024-02-09"},{"lineNumber":357,"author":{"gitId":"-"},"content":"Furthermore, certain edits can cause the AddressBook to behave in unexpected ways (e.g., if a value entered is outside the acceptable range). Therefore, edit the data file only if you are confident that you can update it correctly.","lastModifiedDate":"2023-09-12"},{"lineNumber":358,"author":{"gitId":"-"},"content":"\u003c/box\u003e","lastModifiedDate":"2023-09-12"},{"lineNumber":359,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2021-02-04"},{"lineNumber":360,"author":{"gitId":"-"},"content":"### Archiving data files `[coming in v2.0]`","lastModifiedDate":"2020-05-23"},{"lineNumber":361,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":362,"author":{"gitId":"-"},"content":"_Details coming soon ..._","lastModifiedDate":"2021-02-04"},{"lineNumber":363,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":364,"author":{"gitId":"-"},"content":"--------------------------------------------------------------------------------------------------------------------","lastModifiedDate":"2020-05-23"},{"lineNumber":365,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":366,"author":{"gitId":"-"},"content":"## FAQ","lastModifiedDate":"2020-05-23"},{"lineNumber":367,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":368,"author":{"gitId":"-"},"content":"**Q**: How do I transfer my data to another Computer?\u003cbr\u003e","lastModifiedDate":"2020-05-23"},{"lineNumber":369,"author":{"gitId":"-"},"content":"**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.","lastModifiedDate":"2020-05-23"},{"lineNumber":370,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":371,"author":{"gitId":"-"},"content":"--------------------------------------------------------------------------------------------------------------------","lastModifiedDate":"2020-05-23"},{"lineNumber":372,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":373,"author":{"gitId":"-"},"content":"## Known issues","lastModifiedDate":"2023-09-08"},{"lineNumber":374,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2023-09-08"},{"lineNumber":375,"author":{"gitId":"-"},"content":"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.","lastModifiedDate":"2023-09-08"},{"lineNumber":376,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2023-09-08"},{"lineNumber":377,"author":{"gitId":"-"},"content":"--------------------------------------------------------------------------------------------------------------------","lastModifiedDate":"2023-09-08"},{"lineNumber":378,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2023-09-08"},{"lineNumber":379,"author":{"gitId":"-"},"content":"## Command summary","lastModifiedDate":"2020-05-23"},{"lineNumber":380,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":381,"author":{"gitId":"-"},"content":"Action | Format, Examples","lastModifiedDate":"2020-05-23"},{"lineNumber":382,"author":{"gitId":"-"},"content":"-----------|----------------------------------------------------------------------------------------------------------------------------------------------------------------------","lastModifiedDate":"2023-09-12"},{"lineNumber":383,"author":{"gitId":"AwJoey"},"content":"**Help** | `help`","lastModifiedDate":"2024-02-29"},{"lineNumber":384,"author":{"gitId":"-"},"content":"**Add** | `add n/NAME p/PHONE_NUMBER e/EMAIL a/ADDRESS [t/TAG]…​` \u003cbr\u003e e.g., `add n/James Ho p/22224444 e/jamesho@example.com a/123, Clementi Rd, 1234665 t/friend t/colleague`","lastModifiedDate":"2020-05-23"},{"lineNumber":385,"author":{"gitId":"AwJoey"},"content":"**List** | `list`","lastModifiedDate":"2024-02-29"},{"lineNumber":386,"author":{"gitId":"-"},"content":"**Edit** | `edit INDEX [n/NAME] [p/PHONE_NUMBER] [e/EMAIL] [a/ADDRESS] [t/TAG]…​`\u003cbr\u003e e.g.,`edit 2 n/James Lee e/jameslee@example.com`","lastModifiedDate":"2020-05-23"},{"lineNumber":387,"author":{"gitId":"-"},"content":"**Find** | `find KEYWORD [MORE_KEYWORDS]`\u003cbr\u003e e.g., `find James Jake`","lastModifiedDate":"2020-05-23"},{"lineNumber":388,"author":{"gitId":"AwJoey"},"content":"**Delete** | `delete INDEX`\u003cbr\u003e e.g., `delete 3`","lastModifiedDate":"2024-02-29"},{"lineNumber":389,"author":{"gitId":"AwJoey"},"content":"**Clear** | `clear`","lastModifiedDate":"2024-02-29"},{"lineNumber":390,"author":{"gitId":"DominicFuMJ"},"content":"**Interest Tagging** | `interest INDEX INTEREST [MORE_INTERESTS]` \u003cbr\u003e e.g. `interest 3 swimming cooking`","lastModifiedDate":"2024-02-29"},{"lineNumber":391,"author":{"gitId":"DominicFuMJ"},"content":"**Find Interest** | `findInterest INTEREST [MORE_INTEREST]` \u003cbr\u003e e.g. `findInterest cooking music`","lastModifiedDate":"2024-02-29"},{"lineNumber":392,"author":{"gitId":"DominicFuMJ"},"content":"**Add Schedule** | `addSched INDEX [MORE_INDEX] SCHEDULE_NAME` \u003cbr\u003e e.g. `addSched 1,2,3 CSMeeting 18032024 1500 1900`","lastModifiedDate":"2024-02-29"},{"lineNumber":393,"author":{"gitId":"DominicFuMJ"},"content":"**Exit** | `exit`","lastModifiedDate":"2024-02-29"}],"authorContributionMap":{"DominicFuMJ":107,"AwJoey":92,"-":194}}] diff --git a/AY2324S2-CS2103-F15-4_tp_master/commits.json b/AY2324S2-CS2103-F15-4_tp_master/commits.json index 95d8fb4d..1d172bf6 100644 --- a/AY2324S2-CS2103-F15-4_tp_master/commits.json +++ b/AY2324S2-CS2103-F15-4_tp_master/commits.json @@ -1 +1 @@ -{"authorDailyContributionsMap":{"beefsausagee":[{"date":"2024-02-27","commitResults":[{"hash":"1a850110f8e3334ded13fac55d0bd42c1b30b957","isMergeCommit":false,"messageTitle":"Add photo to AboutUs.md","messageBody":"","fileTypesAndContributionMap":{"docs":{"insertions":1,"deletions":1}}},{"hash":"a98e39eab1133877c17f3d38e9efde0589231c7a","isMergeCommit":true,"messageTitle":"Merge pull request #12 from beefsausagee/branch-Alvis","messageBody":"Add photo to AboutUs.md","fileTypesAndContributionMap":{}},{"hash":"2a777ec58241cda576d1040a36e4cbc07ad327f9","isMergeCommit":false,"messageTitle":"Add User Stories","messageBody":"","fileTypesAndContributionMap":{"docs":{"insertions":12,"deletions":7}}}]},{"date":"2024-02-28","commitResults":[{"hash":"f0ec4a79285aa4320e19bd0f231faad2ebc28c43","isMergeCommit":false,"messageTitle":"Add more user stories","messageBody":"","fileTypesAndContributionMap":{"docs":{"insertions":22,"deletions":5}}},{"hash":"49a5fb1e4b443d96904a0d5ae586d441992c142a","isMergeCommit":false,"messageTitle":"Implement changes for grammar on DeveloperGuide.md","messageBody":"","fileTypesAndContributionMap":{"docs":{"insertions":4,"deletions":6}}},{"hash":"8e86a41b8e7c266f3846a26d95b8291c5acd4b71","isMergeCommit":false,"messageTitle":"Implement changes to DeveloperGuide.md","messageBody":"","fileTypesAndContributionMap":{"docs":{"insertions":12,"deletions":12}}}]}],"Morninggloryyy":[{"date":"2024-02-27","commitResults":[{"hash":"d08116fb52e8001c4533d000081459a9d672c24a","isMergeCommit":false,"messageTitle":"Add photo","messageBody":"","fileTypesAndContributionMap":{"docs":{"insertions":1,"deletions":1}}},{"hash":"bf6fe7826d7acb044fb6cd7651a405db8f7241aa","isMergeCommit":true,"messageTitle":"Merge pull request #13 from Morninggloryyy/branch-Jinyan","messageBody":"Add photo","fileTypesAndContributionMap":{}}]}],"DominicFuMJ":[{"date":"2024-02-27","commitResults":[{"hash":"5ccc48193fdea99fcc2b2ed6f8fce0f220133268","isMergeCommit":false,"messageTitle":"Add image for Dominic and update the photo in the AboutUs.md","messageBody":"I added my image to the docs/images folder and updated the photo used in the AboutUs.md\n","fileTypesAndContributionMap":{"docs":{"insertions":1,"deletions":1}}},{"hash":"f734d27ce5a6b33ee4852df656749f8ec390d9fe","isMergeCommit":true,"messageTitle":"Merge pull request #11 from DominicFuMJ/branch-dominic-about-us","messageBody":"Add image for Dominic and update the photo in the AboutUs.md","fileTypesAndContributionMap":{}}]},{"date":"2024-02-29","commitResults":[{"hash":"0a5ed4c8cbfde7ce2dbf914deb75d568b19045e0","isMergeCommit":false,"messageTitle":"Added the user guide features for clear, help, exit, interest tagging, find similar interest and schedule adding.","messageBody":"","fileTypesAndContributionMap":{"docs":{"insertions":108,"deletions":3}}},{"hash":"6a8e4678560523c3d00c3ba75ec0a4e874d4b5c4","isMergeCommit":true,"messageTitle":"Merge pull request #15 from beefsausagee/branch-Alvis","messageBody":"Add User Stories to DeveloperGuide.md","fileTypesAndContributionMap":{}},{"hash":"f24605fab486f008a009defc110fd47dca931b82","isMergeCommit":true,"messageTitle":"Merge pull request #16 from garywongkai/Issue7-DeveloperGuide","messageBody":"Update DeveloperGuide.md","fileTypesAndContributionMap":{}}]}],"AwJoey":[{"date":"2024-02-27","commitResults":[{"hash":"488861800fdde90b6b8f0d7b1eaea23af14c25ad","isMergeCommit":false,"messageTitle":"Update AboutUs.md: add awjoey.jpg and update photo","messageBody":"","fileTypesAndContributionMap":{"docs":{"insertions":1,"deletions":1}}},{"hash":"ff3cea7bda00bfc4891d8358470657727584c51c","isMergeCommit":false,"messageTitle":"Revert \"Update AboutUs.md: add awjoey.jpg and update photo\"","messageBody":"This reverts commit 488861800fdde90b6b8f0d7b1eaea23af14c25ad.\n","fileTypesAndContributionMap":{"docs":{"insertions":1,"deletions":1}}},{"hash":"44227f9e48f07ca3172584355a713c4d56986b4b","isMergeCommit":false,"messageTitle":"Update AboutUs.md: add awjoey.jpg and update photo","messageBody":"","fileTypesAndContributionMap":{"docs":{"insertions":1,"deletions":1}}}]},{"date":"2024-02-29","commitResults":[{"hash":"f62a3e8ed41618789fde622092a1d2433441956f","isMergeCommit":true,"messageTitle":"Merge pull request #17 from DominicFuMJ/branch-dominic-UserGuide","messageBody":"Added the user guide features for clear, help, exit, interest tagging…","fileTypesAndContributionMap":{}},{"hash":"217d2e3f1be9d2a47ba2c41f54479c1fcb67182e","isMergeCommit":false,"messageTitle":"Edit UserGuide Add, List, Edit, Find, Delete, addSched commands","messageBody":"","fileTypesAndContributionMap":{"docs":{"insertions":90,"deletions":8}}},{"hash":"b0f9deebb7dedc69feb321c20bb358b1cd307576","isMergeCommit":false,"messageTitle":"Edit UserGuide\u0027s addSched command to include previous find cmd behavior","messageBody":"","fileTypesAndContributionMap":{"docs":{"insertions":2,"deletions":0}}}]}],"garywongkai":[{"date":"2024-02-26","commitResults":[{"hash":"d74e2c8c57fd393ed48f7626cc8553a9ed1854b6","isMergeCommit":false,"messageTitle":"Update AboutUs.md","messageBody":"","fileTypesAndContributionMap":{"docs":{"insertions":2,"deletions":1}}},{"hash":"b9d8884efeab6b784f5118ddf88ef55a32c9e0b9","isMergeCommit":false,"messageTitle":"Update README.md","messageBody":"","fileTypesAndContributionMap":{"docs":{"insertions":10,"deletions":10}}}]},{"date":"2024-02-27","commitResults":[{"hash":"2c5d7dab98daa9607e6f96b1ae7e7478ad82356f","isMergeCommit":false,"messageTitle":"Update AboutUs.md","messageBody":"","fileTypesAndContributionMap":{"docs":{"insertions":1,"deletions":1}}},{"hash":"92e5e7c7f38e27a95c6281b4a415fae1edcabfc3","isMergeCommit":false,"messageTitle":"Update AboutUs.md","messageBody":"","fileTypesAndContributionMap":{"docs":{"insertions":1,"deletions":11}}},{"hash":"2eacf54868e619203de3208c271048054695477f","isMergeCommit":true,"messageTitle":"Merge pull request #14 from AY2324S2-CS2103-F15-4/branch-awjoey-aboutus","messageBody":"Update AboutUs.md: add awjoey.jpg and update photo","fileTypesAndContributionMap":{}},{"hash":"99f1230cfb1c781ecebe9a1beb7439491bee77d4","isMergeCommit":true,"messageTitle":"Merge pull request #8 from garywongkai/US1-AboutUs","messageBody":"Update AboutUs.md","fileTypesAndContributionMap":{}},{"hash":"df3ff2fbd3fcabca3f64b07957ec92f1113d18a2","isMergeCommit":true,"messageTitle":"Merge pull request #9 from garywongkai/Issue5-README","messageBody":"Update README.md","fileTypesAndContributionMap":{}}]},{"date":"2024-02-28","commitResults":[{"hash":"9eb69cd00f3a047dc6d0b2d8de7a14e956c3bf0d","isMergeCommit":false,"messageTitle":"Update DeveloperGuide.md","messageBody":"","fileTypesAndContributionMap":{"docs":{"insertions":3,"deletions":1}}}]},{"date":"2024-03-01","commitResults":[{"hash":"145cc54e5b0382e8cbbcfe8e934d76d6d507effb","isMergeCommit":true,"messageTitle":"Merge pull request #18 from AwJoey/master","messageBody":"Edit user guide for add, edit, list, delete, addSched commands","fileTypesAndContributionMap":{}}]},{"date":"2024-03-05","commitResults":[{"hash":"09e2c42c71515716bda7316708fd5ab2e323fc8f","isMergeCommit":false,"messageTitle":"Update DG/AboutUS.md","messageBody":"","fileTypesAndContributionMap":{"docs":{"insertions":6,"deletions":4}}}]},{"date":"2024-03-06","commitResults":[{"hash":"d1c902f53f9655c1628424f0ac100e329db2efa2","isMergeCommit":true,"messageTitle":"Merge pull request #19 from garywongkai/Issue#5-About","messageBody":"Update DG/AboutUS.md","fileTypesAndContributionMap":{}}]}]},"authorFileTypeContributionMap":{"beefsausagee":{"docs":28,"functional-code":0,"test-code":0},"Morninggloryyy":{"docs":0,"functional-code":0,"test-code":0},"DominicFuMJ":{"docs":107,"functional-code":0,"test-code":0},"AwJoey":{"docs":93,"functional-code":0,"test-code":0},"garywongkai":{"docs":22,"functional-code":0,"test-code":0}},"authorContributionVariance":{"beefsausagee":280.3668,"Morninggloryyy":0.28402358,"DominicFuMJ":872.52094,"AwJoey":705.5149,"garywongkai":49.301765},"authorDisplayNameMap":{"beefsausagee":"CS2103-F15-4 ALVI.. HAN","Morninggloryyy":"CS2103-F15-4 WU J..NYAN","DominicFuMJ":"CS2103-F15-4 FU M..INIC","AwJoey":"CS2103-F15-4 AW J..JOEY","garywongkai":"CS2103-F15-4 WONG..I LI"}} +{"authorDailyContributionsMap":{"beefsausagee":[{"date":"2024-02-27","commitResults":[{"hash":"1a850110f8e3334ded13fac55d0bd42c1b30b957","isMergeCommit":false,"messageTitle":"Add photo to AboutUs.md","messageBody":"","fileTypesAndContributionMap":{"docs":{"insertions":1,"deletions":1}}},{"hash":"a98e39eab1133877c17f3d38e9efde0589231c7a","isMergeCommit":true,"messageTitle":"Merge pull request #12 from beefsausagee/branch-Alvis","messageBody":"Add photo to AboutUs.md","fileTypesAndContributionMap":{}},{"hash":"2a777ec58241cda576d1040a36e4cbc07ad327f9","isMergeCommit":false,"messageTitle":"Add User Stories","messageBody":"","fileTypesAndContributionMap":{"docs":{"insertions":12,"deletions":7}}}]},{"date":"2024-02-28","commitResults":[{"hash":"f0ec4a79285aa4320e19bd0f231faad2ebc28c43","isMergeCommit":false,"messageTitle":"Add more user stories","messageBody":"","fileTypesAndContributionMap":{"docs":{"insertions":22,"deletions":5}}},{"hash":"49a5fb1e4b443d96904a0d5ae586d441992c142a","isMergeCommit":false,"messageTitle":"Implement changes for grammar on DeveloperGuide.md","messageBody":"","fileTypesAndContributionMap":{"docs":{"insertions":4,"deletions":6}}},{"hash":"8e86a41b8e7c266f3846a26d95b8291c5acd4b71","isMergeCommit":false,"messageTitle":"Implement changes to DeveloperGuide.md","messageBody":"","fileTypesAndContributionMap":{"docs":{"insertions":12,"deletions":12}}}]}],"Morninggloryyy":[{"date":"2024-02-27","commitResults":[{"hash":"d08116fb52e8001c4533d000081459a9d672c24a","isMergeCommit":false,"messageTitle":"Add photo","messageBody":"","fileTypesAndContributionMap":{"docs":{"insertions":1,"deletions":1}}},{"hash":"bf6fe7826d7acb044fb6cd7651a405db8f7241aa","isMergeCommit":true,"messageTitle":"Merge pull request #13 from Morninggloryyy/branch-Jinyan","messageBody":"Add photo","fileTypesAndContributionMap":{}}]}],"DominicFuMJ":[{"date":"2024-02-27","commitResults":[{"hash":"5ccc48193fdea99fcc2b2ed6f8fce0f220133268","isMergeCommit":false,"messageTitle":"Add image for Dominic and update the photo in the AboutUs.md","messageBody":"I added my image to the docs/images folder and updated the photo used in the AboutUs.md\n","fileTypesAndContributionMap":{"docs":{"insertions":1,"deletions":1}}},{"hash":"f734d27ce5a6b33ee4852df656749f8ec390d9fe","isMergeCommit":true,"messageTitle":"Merge pull request #11 from DominicFuMJ/branch-dominic-about-us","messageBody":"Add image for Dominic and update the photo in the AboutUs.md","fileTypesAndContributionMap":{}}]},{"date":"2024-02-29","commitResults":[{"hash":"0a5ed4c8cbfde7ce2dbf914deb75d568b19045e0","isMergeCommit":false,"messageTitle":"Added the user guide features for clear, help, exit, interest tagging, find similar interest and schedule adding.","messageBody":"","fileTypesAndContributionMap":{"docs":{"insertions":108,"deletions":3}}},{"hash":"6a8e4678560523c3d00c3ba75ec0a4e874d4b5c4","isMergeCommit":true,"messageTitle":"Merge pull request #15 from beefsausagee/branch-Alvis","messageBody":"Add User Stories to DeveloperGuide.md","fileTypesAndContributionMap":{}},{"hash":"f24605fab486f008a009defc110fd47dca931b82","isMergeCommit":true,"messageTitle":"Merge pull request #16 from garywongkai/Issue7-DeveloperGuide","messageBody":"Update DeveloperGuide.md","fileTypesAndContributionMap":{}}]}],"AwJoey":[{"date":"2024-02-27","commitResults":[{"hash":"488861800fdde90b6b8f0d7b1eaea23af14c25ad","isMergeCommit":false,"messageTitle":"Update AboutUs.md: add awjoey.jpg and update photo","messageBody":"","fileTypesAndContributionMap":{"docs":{"insertions":1,"deletions":1}}},{"hash":"ff3cea7bda00bfc4891d8358470657727584c51c","isMergeCommit":false,"messageTitle":"Revert \"Update AboutUs.md: add awjoey.jpg and update photo\"","messageBody":"This reverts commit 488861800fdde90b6b8f0d7b1eaea23af14c25ad.\n","fileTypesAndContributionMap":{"docs":{"insertions":1,"deletions":1}}},{"hash":"44227f9e48f07ca3172584355a713c4d56986b4b","isMergeCommit":false,"messageTitle":"Update AboutUs.md: add awjoey.jpg and update photo","messageBody":"","fileTypesAndContributionMap":{"docs":{"insertions":1,"deletions":1}}}]},{"date":"2024-02-29","commitResults":[{"hash":"f62a3e8ed41618789fde622092a1d2433441956f","isMergeCommit":true,"messageTitle":"Merge pull request #17 from DominicFuMJ/branch-dominic-UserGuide","messageBody":"Added the user guide features for clear, help, exit, interest tagging…","fileTypesAndContributionMap":{}},{"hash":"217d2e3f1be9d2a47ba2c41f54479c1fcb67182e","isMergeCommit":false,"messageTitle":"Edit UserGuide Add, List, Edit, Find, Delete, addSched commands","messageBody":"","fileTypesAndContributionMap":{"docs":{"insertions":90,"deletions":8}}},{"hash":"b0f9deebb7dedc69feb321c20bb358b1cd307576","isMergeCommit":false,"messageTitle":"Edit UserGuide\u0027s addSched command to include previous find cmd behavior","messageBody":"","fileTypesAndContributionMap":{"docs":{"insertions":2,"deletions":0}}}]},{"date":"2024-03-08","commitResults":[{"hash":"fb5ed99b276c2670db639082541e70889e3b3f58","isMergeCommit":false,"messageTitle":"Rename awjoey.jpg to png","messageBody":"","fileTypesAndContributionMap":{"docs":{"insertions":1,"deletions":1}}},{"hash":"c4b2b3d31a30b1c085cdd17a4d9eb619022fb35f","isMergeCommit":true,"messageTitle":"Merge pull request #20 from AwJoey/master","messageBody":"Rename awjoey.jpg to png","fileTypesAndContributionMap":{}}]}],"garywongkai":[{"date":"2024-02-26","commitResults":[{"hash":"d74e2c8c57fd393ed48f7626cc8553a9ed1854b6","isMergeCommit":false,"messageTitle":"Update AboutUs.md","messageBody":"","fileTypesAndContributionMap":{"docs":{"insertions":2,"deletions":1}}},{"hash":"b9d8884efeab6b784f5118ddf88ef55a32c9e0b9","isMergeCommit":false,"messageTitle":"Update README.md","messageBody":"","fileTypesAndContributionMap":{"docs":{"insertions":10,"deletions":10}}}]},{"date":"2024-02-27","commitResults":[{"hash":"2c5d7dab98daa9607e6f96b1ae7e7478ad82356f","isMergeCommit":false,"messageTitle":"Update AboutUs.md","messageBody":"","fileTypesAndContributionMap":{"docs":{"insertions":1,"deletions":1}}},{"hash":"92e5e7c7f38e27a95c6281b4a415fae1edcabfc3","isMergeCommit":false,"messageTitle":"Update AboutUs.md","messageBody":"","fileTypesAndContributionMap":{"docs":{"insertions":1,"deletions":11}}},{"hash":"2eacf54868e619203de3208c271048054695477f","isMergeCommit":true,"messageTitle":"Merge pull request #14 from AY2324S2-CS2103-F15-4/branch-awjoey-aboutus","messageBody":"Update AboutUs.md: add awjoey.jpg and update photo","fileTypesAndContributionMap":{}},{"hash":"99f1230cfb1c781ecebe9a1beb7439491bee77d4","isMergeCommit":true,"messageTitle":"Merge pull request #8 from garywongkai/US1-AboutUs","messageBody":"Update AboutUs.md","fileTypesAndContributionMap":{}},{"hash":"df3ff2fbd3fcabca3f64b07957ec92f1113d18a2","isMergeCommit":true,"messageTitle":"Merge pull request #9 from garywongkai/Issue5-README","messageBody":"Update README.md","fileTypesAndContributionMap":{}}]},{"date":"2024-02-28","commitResults":[{"hash":"9eb69cd00f3a047dc6d0b2d8de7a14e956c3bf0d","isMergeCommit":false,"messageTitle":"Update DeveloperGuide.md","messageBody":"","fileTypesAndContributionMap":{"docs":{"insertions":3,"deletions":1}}}]},{"date":"2024-03-01","commitResults":[{"hash":"145cc54e5b0382e8cbbcfe8e934d76d6d507effb","isMergeCommit":true,"messageTitle":"Merge pull request #18 from AwJoey/master","messageBody":"Edit user guide for add, edit, list, delete, addSched commands","fileTypesAndContributionMap":{}}]},{"date":"2024-03-05","commitResults":[{"hash":"09e2c42c71515716bda7316708fd5ab2e323fc8f","isMergeCommit":false,"messageTitle":"Update DG/AboutUS.md","messageBody":"","fileTypesAndContributionMap":{"docs":{"insertions":6,"deletions":4}}}]},{"date":"2024-03-06","commitResults":[{"hash":"d1c902f53f9655c1628424f0ac100e329db2efa2","isMergeCommit":true,"messageTitle":"Merge pull request #19 from garywongkai/Issue#5-About","messageBody":"Update DG/AboutUS.md","fileTypesAndContributionMap":{}}]}]},"authorFileTypeContributionMap":{"beefsausagee":{"docs":28,"functional-code":0,"test-code":0},"Morninggloryyy":{"docs":0,"functional-code":0,"test-code":0},"DominicFuMJ":{"docs":107,"functional-code":0,"test-code":0},"AwJoey":{"docs":93,"functional-code":0,"test-code":0},"garywongkai":{"docs":22,"functional-code":0,"test-code":0}},"authorContributionVariance":{"beefsausagee":247.58226,"Morninggloryyy":0.24888882,"DominicFuMJ":764.91547,"AwJoey":617.4933,"garywongkai":44.506664},"authorDisplayNameMap":{"beefsausagee":"CS2103-F15-4 ALVI.. HAN","Morninggloryyy":"CS2103-F15-4 WU J..NYAN","DominicFuMJ":"CS2103-F15-4 FU M..INIC","AwJoey":"CS2103-F15-4 AW J..JOEY","garywongkai":"CS2103-F15-4 WONG..I LI"}} diff --git a/AY2324S2-CS2103T-F10-1_tp_master/authorship.json b/AY2324S2-CS2103T-F10-1_tp_master/authorship.json index 83b4335e..7ce978c4 100644 --- a/AY2324S2-CS2103T-F10-1_tp_master/authorship.json +++ b/AY2324S2-CS2103T-F10-1_tp_master/authorship.json @@ -1 +1 @@ -[{"path":"README.md","fileType":"docs","lines":[{"lineNumber":1,"author":{"gitId":"iamtr"},"content":"[![CI Status](https://github.com/AY2324S2-CS2103T-F10-1/tp/workflows/Java%20CI/badge.svg)](https://github.com/AY2324S2-CS2103T-F10-1/tp/actions)","lastModifiedDate":"2024-03-07"},{"lineNumber":2,"author":{"gitId":"iamtr"},"content":"![codecov](https://codecov.io/gh/AY2324S2-CS2103T-F10-1/tp/branch/master/graph/badge.svg)","lastModifiedDate":"2024-03-07"},{"lineNumber":3,"author":{"gitId":"iamtr"},"content":"","lastModifiedDate":"2024-03-07"},{"lineNumber":4,"author":{"gitId":"iamtr"},"content":"![Ui](docs/images/Ui.png)","lastModifiedDate":"2024-03-07"},{"lineNumber":5,"author":{"gitId":"iamtr"},"content":"","lastModifiedDate":"2024-03-07"},{"lineNumber":6,"author":{"gitId":"-"},"content":"# Nursing Address Book","lastModifiedDate":"2024-02-21"},{"lineNumber":7,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":8,"author":{"gitId":"-"},"content":"Target user:","lastModifiedDate":"2024-03-07"},{"lineNumber":9,"author":{"gitId":"-"},"content":"Our target group is Ward Nurses. This product is for users who prefer typing quickly while having quick access to critical patient information fast.","lastModifiedDate":"2024-03-07"},{"lineNumber":10,"author":{"gitId":"iamtr"},"content":"","lastModifiedDate":"2024-03-07"},{"lineNumber":11,"author":{"gitId":"-"},"content":"Value proposition:","lastModifiedDate":"2024-03-07"},{"lineNumber":12,"author":{"gitId":"iamtr"},"content":"Streamlined text-based commands to manage contacts faster than a typical mouse/GUI driven app","lastModifiedDate":"2024-03-07"},{"lineNumber":13,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2024-03-07"},{"lineNumber":14,"author":{"gitId":"iamtr"},"content":"_This project is based on the AddressBook-Level3 project created by the [SE-EDU initiative](https://se-education.org)._","lastModifiedDate":"2024-03-07"}],"authorContributionMap":{"iamtr":8,"-":6}},{"path":"docs/AboutUs.md","fileType":"docs","lines":[{"lineNumber":1,"author":{"gitId":"-"},"content":"---","lastModifiedDate":"2020-05-23"},{"lineNumber":2,"author":{"gitId":"-"},"content":"layout: page","lastModifiedDate":"2020-05-23"},{"lineNumber":3,"author":{"gitId":"-"},"content":"title: About Us","lastModifiedDate":"2020-05-23"},{"lineNumber":4,"author":{"gitId":"-"},"content":"---","lastModifiedDate":"2020-05-23"},{"lineNumber":5,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":6,"author":{"gitId":"-"},"content":"We are a team based in the [School of Computing, National University of Singapore](http://www.comp.nus.edu.sg).","lastModifiedDate":"2020-05-23"},{"lineNumber":7,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":8,"author":{"gitId":"-"},"content":"You can reach us at the email `seer[at]comp.nus.edu.sg`","lastModifiedDate":"2020-06-17"},{"lineNumber":9,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-06-17"},{"lineNumber":10,"author":{"gitId":"-"},"content":"## Project team","lastModifiedDate":"2020-06-07"},{"lineNumber":11,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":12,"author":{"gitId":"erv-teo"},"content":"### Ong Tze Jet","lastModifiedDate":"2024-03-07"},{"lineNumber":13,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":14,"author":{"gitId":"erv-teo"},"content":"\u003cimg src\u003d\"images/iamtr.png\" width\u003d\"200px\"\u003e","lastModifiedDate":"2024-03-07"},{"lineNumber":15,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":16,"author":{"gitId":"-"},"content":"[[homepage](http://www.comp.nus.edu.sg/~damithch)]","lastModifiedDate":"2020-05-23"},{"lineNumber":17,"author":{"gitId":"erv-teo"},"content":"[[github](https://github.com/iamtr)]","lastModifiedDate":"2024-03-07"},{"lineNumber":18,"author":{"gitId":"-"},"content":"[[portfolio](team/johndoe.md)]","lastModifiedDate":"2020-05-23"},{"lineNumber":19,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":20,"author":{"gitId":"-"},"content":"* Role: Project Advisor","lastModifiedDate":"2020-05-23"},{"lineNumber":21,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":22,"author":{"gitId":"erv-teo"},"content":"### An Eu Jin","lastModifiedDate":"2024-03-07"},{"lineNumber":23,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":24,"author":{"gitId":"erv-teo"},"content":"\u003cimg src\u003d\"images/ejnan.png\" width\u003d\"200px\"\u003e","lastModifiedDate":"2024-03-07"},{"lineNumber":25,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":26,"author":{"gitId":"erv-teo"},"content":"[[github](http://github.com/ejnan)]","lastModifiedDate":"2024-03-07"},{"lineNumber":27,"author":{"gitId":"-"},"content":"[[portfolio](team/johndoe.md)]","lastModifiedDate":"2020-05-23"},{"lineNumber":28,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":29,"author":{"gitId":"-"},"content":"* Role: Team Lead","lastModifiedDate":"2020-05-23"},{"lineNumber":30,"author":{"gitId":"-"},"content":"* Responsibilities: UI","lastModifiedDate":"2020-05-23"},{"lineNumber":31,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":32,"author":{"gitId":"erv-teo"},"content":"### Ryan Lim Ding Xuan","lastModifiedDate":"2024-03-07"},{"lineNumber":33,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":34,"author":{"gitId":"erv-teo"},"content":"\u003cimg src\u003d\"images/ryanlimdx.png\" width\u003d\"200px\"\u003e","lastModifiedDate":"2024-03-07"},{"lineNumber":35,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":36,"author":{"gitId":"erv-teo"},"content":"[[github](http://github.com/ryanlimdx)] [[portfolio](team/johndoe.md)]","lastModifiedDate":"2024-03-07"},{"lineNumber":37,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":38,"author":{"gitId":"-"},"content":"* Role: Developer","lastModifiedDate":"2020-05-23"},{"lineNumber":39,"author":{"gitId":"-"},"content":"* Responsibilities: Data","lastModifiedDate":"2020-05-23"},{"lineNumber":40,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":41,"author":{"gitId":"erv-teo"},"content":"### Tan Shao Wei","lastModifiedDate":"2024-03-07"},{"lineNumber":42,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":43,"author":{"gitId":"erv-teo"},"content":"\u003cimg src\u003d\"images/swtan346.png\" width\u003d\"200px\"\u003e","lastModifiedDate":"2024-03-07"},{"lineNumber":44,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":45,"author":{"gitId":"erv-teo"},"content":"[[github](http://github.com/swtan346)]","lastModifiedDate":"2024-03-07"},{"lineNumber":46,"author":{"gitId":"-"},"content":"[[portfolio](team/johndoe.md)]","lastModifiedDate":"2020-05-23"},{"lineNumber":47,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":48,"author":{"gitId":"-"},"content":"* Role: Developer","lastModifiedDate":"2020-05-23"},{"lineNumber":49,"author":{"gitId":"-"},"content":"* Responsibilities: Dev Ops + Threading","lastModifiedDate":"2020-05-23"},{"lineNumber":50,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":51,"author":{"gitId":"erv-teo"},"content":"### Ervin Teo Jun Xiong","lastModifiedDate":"2024-03-07"},{"lineNumber":52,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":53,"author":{"gitId":"erv-teo"},"content":"\u003cimg src\u003d\"images/erv-teo.png\" width\u003d\"200px\"\u003e","lastModifiedDate":"2024-03-07"},{"lineNumber":54,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":55,"author":{"gitId":"erv-teo"},"content":"[[github](http://github.com/erv-teo)]","lastModifiedDate":"2024-03-07"},{"lineNumber":56,"author":{"gitId":"-"},"content":"[[portfolio](team/johndoe.md)]","lastModifiedDate":"2020-05-23"},{"lineNumber":57,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":58,"author":{"gitId":"-"},"content":"* Role: Developer","lastModifiedDate":"2020-05-23"},{"lineNumber":59,"author":{"gitId":"-"},"content":"* Responsibilities: UI","lastModifiedDate":"2020-05-23"}],"authorContributionMap":{"erv-teo":15,"-":44}},{"path":"docs/DeveloperGuide.md","fileType":"docs","lines":[{"lineNumber":1,"author":{"gitId":"-"},"content":"---","lastModifiedDate":"2020-05-23"},{"lineNumber":2,"author":{"gitId":"-"},"content":"layout: page","lastModifiedDate":"2020-05-23"},{"lineNumber":3,"author":{"gitId":"-"},"content":"title: Developer Guide","lastModifiedDate":"2020-05-23"},{"lineNumber":4,"author":{"gitId":"-"},"content":"---","lastModifiedDate":"2020-05-23"},{"lineNumber":5,"author":{"gitId":"-"},"content":"* Table of Contents","lastModifiedDate":"2020-05-23"},{"lineNumber":6,"author":{"gitId":"-"},"content":"{:toc}","lastModifiedDate":"2020-05-23"},{"lineNumber":7,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":8,"author":{"gitId":"-"},"content":"--------------------------------------------------------------------------------------------------------------------","lastModifiedDate":"2020-05-23"},{"lineNumber":9,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2021-07-30"},{"lineNumber":10,"author":{"gitId":"-"},"content":"## **Acknowledgements**","lastModifiedDate":"2021-07-30"},{"lineNumber":11,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2021-07-30"},{"lineNumber":12,"author":{"gitId":"-"},"content":"* {list here sources of all reused/adapted ideas, code, documentation, and third-party libraries -- include links to the original source as well}","lastModifiedDate":"2021-07-30"},{"lineNumber":13,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2021-07-30"},{"lineNumber":14,"author":{"gitId":"-"},"content":"--------------------------------------------------------------------------------------------------------------------","lastModifiedDate":"2021-07-30"},{"lineNumber":15,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":16,"author":{"gitId":"-"},"content":"## **Setting up, getting started**","lastModifiedDate":"2020-05-23"},{"lineNumber":17,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":18,"author":{"gitId":"-"},"content":"Refer to the guide [_Setting up and getting started_](SettingUp.md).","lastModifiedDate":"2020-05-23"},{"lineNumber":19,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":20,"author":{"gitId":"-"},"content":"--------------------------------------------------------------------------------------------------------------------","lastModifiedDate":"2020-05-23"},{"lineNumber":21,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":22,"author":{"gitId":"-"},"content":"## **Design**","lastModifiedDate":"2020-05-23"},{"lineNumber":23,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":24,"author":{"gitId":"-"},"content":"\u003cdiv markdown\u003d\"span\" class\u003d\"alert alert-primary\"\u003e","lastModifiedDate":"2021-07-31"},{"lineNumber":25,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":26,"author":{"gitId":"-"},"content":":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.","lastModifiedDate":"2023-09-03"},{"lineNumber":27,"author":{"gitId":"-"},"content":"\u003c/div\u003e","lastModifiedDate":"2021-07-31"},{"lineNumber":28,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":29,"author":{"gitId":"-"},"content":"### Architecture","lastModifiedDate":"2021-07-31"},{"lineNumber":30,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":31,"author":{"gitId":"-"},"content":"\u003cimg src\u003d\"images/ArchitectureDiagram.png\" width\u003d\"280\" /\u003e","lastModifiedDate":"2021-07-31"},{"lineNumber":32,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":33,"author":{"gitId":"-"},"content":"The ***Architecture Diagram*** given above explains the high-level design of the App.","lastModifiedDate":"2021-07-31"},{"lineNumber":34,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":35,"author":{"gitId":"-"},"content":"Given below is a quick overview of main components and how they interact with each other.","lastModifiedDate":"2021-07-31"},{"lineNumber":36,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2021-07-31"},{"lineNumber":37,"author":{"gitId":"-"},"content":"**Main components of the architecture**","lastModifiedDate":"2021-07-31"},{"lineNumber":38,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":39,"author":{"gitId":"-"},"content":"**`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.","lastModifiedDate":"2023-09-03"},{"lineNumber":40,"author":{"gitId":"-"},"content":"* At app launch, it initializes the other components in the correct sequence, and connects them up with each other.","lastModifiedDate":"2023-09-03"},{"lineNumber":41,"author":{"gitId":"-"},"content":"* At shut down, it shuts down the other components and invokes cleanup methods where necessary.","lastModifiedDate":"2023-09-03"},{"lineNumber":42,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":43,"author":{"gitId":"-"},"content":"The bulk of the app\u0027s work is done by the following four components:","lastModifiedDate":"2023-09-03"},{"lineNumber":44,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":45,"author":{"gitId":"-"},"content":"* [**`UI`**](#ui-component): The UI of the App.","lastModifiedDate":"2020-05-23"},{"lineNumber":46,"author":{"gitId":"-"},"content":"* [**`Logic`**](#logic-component): The command executor.","lastModifiedDate":"2020-05-23"},{"lineNumber":47,"author":{"gitId":"-"},"content":"* [**`Model`**](#model-component): Holds the data of the App in memory.","lastModifiedDate":"2020-05-23"},{"lineNumber":48,"author":{"gitId":"-"},"content":"* [**`Storage`**](#storage-component): Reads data from, and writes data to, the hard disk.","lastModifiedDate":"2020-05-23"},{"lineNumber":49,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":50,"author":{"gitId":"-"},"content":"[**`Commons`**](#common-classes) represents a collection of classes used by multiple other components.","lastModifiedDate":"2023-09-03"},{"lineNumber":51,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":52,"author":{"gitId":"-"},"content":"**How the architecture components interact with each other**","lastModifiedDate":"2020-05-23"},{"lineNumber":53,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":54,"author":{"gitId":"-"},"content":"The *Sequence Diagram* below shows how the components interact with each other for the scenario where the user issues the command `delete 1`.","lastModifiedDate":"2020-05-23"},{"lineNumber":55,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":56,"author":{"gitId":"-"},"content":"\u003cimg src\u003d\"images/ArchitectureSequenceDiagram.png\" width\u003d\"574\" /\u003e","lastModifiedDate":"2020-06-07"},{"lineNumber":57,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":58,"author":{"gitId":"-"},"content":"Each of the four main components (also shown in the diagram above),","lastModifiedDate":"2021-07-31"},{"lineNumber":59,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2021-07-31"},{"lineNumber":60,"author":{"gitId":"-"},"content":"* defines its *API* in an `interface` with the same name as the Component.","lastModifiedDate":"2021-07-31"},{"lineNumber":61,"author":{"gitId":"-"},"content":"* implements its functionality using a concrete `{Component Name}Manager` class (which follows the corresponding API `interface` mentioned in the previous point.","lastModifiedDate":"2021-07-31"},{"lineNumber":62,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2021-07-31"},{"lineNumber":63,"author":{"gitId":"-"},"content":"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\u0027s being coupled to the implementation of a component), as illustrated in the (partial) class diagram below.","lastModifiedDate":"2021-07-31"},{"lineNumber":64,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2021-07-31"},{"lineNumber":65,"author":{"gitId":"-"},"content":"\u003cimg src\u003d\"images/ComponentManagers.png\" width\u003d\"300\" /\u003e","lastModifiedDate":"2021-07-31"},{"lineNumber":66,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2021-07-31"},{"lineNumber":67,"author":{"gitId":"-"},"content":"The sections below give more details of each component.","lastModifiedDate":"2020-05-23"},{"lineNumber":68,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":69,"author":{"gitId":"-"},"content":"### UI component","lastModifiedDate":"2020-05-23"},{"lineNumber":70,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":71,"author":{"gitId":"-"},"content":"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)","lastModifiedDate":"2021-07-31"},{"lineNumber":72,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":73,"author":{"gitId":"-"},"content":"![Structure of the UI Component](images/UiClassDiagram.png)","lastModifiedDate":"2021-07-31"},{"lineNumber":74,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":75,"author":{"gitId":"-"},"content":"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.","lastModifiedDate":"2021-07-31"},{"lineNumber":76,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":77,"author":{"gitId":"-"},"content":"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)","lastModifiedDate":"2021-07-31"},{"lineNumber":78,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":79,"author":{"gitId":"-"},"content":"The `UI` component,","lastModifiedDate":"2020-05-23"},{"lineNumber":80,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":81,"author":{"gitId":"-"},"content":"* executes user commands using the `Logic` component.","lastModifiedDate":"2021-07-31"},{"lineNumber":82,"author":{"gitId":"-"},"content":"* listens for changes to `Model` data so that the UI can be updated with the modified data.","lastModifiedDate":"2021-07-31"},{"lineNumber":83,"author":{"gitId":"-"},"content":"* keeps a reference to the `Logic` component, because the `UI` relies on the `Logic` to execute commands.","lastModifiedDate":"2021-07-31"},{"lineNumber":84,"author":{"gitId":"-"},"content":"* depends on some classes in the `Model` component, as it displays `Person` object residing in the `Model`.","lastModifiedDate":"2021-07-31"},{"lineNumber":85,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":86,"author":{"gitId":"-"},"content":"### Logic component","lastModifiedDate":"2020-05-23"},{"lineNumber":87,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":88,"author":{"gitId":"-"},"content":"**API** : [`Logic.java`](https://github.com/se-edu/addressbook-level3/tree/master/src/main/java/seedu/address/logic/Logic.java)","lastModifiedDate":"2021-07-31"},{"lineNumber":89,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":90,"author":{"gitId":"-"},"content":"Here\u0027s a (partial) class diagram of the `Logic` component:","lastModifiedDate":"2021-07-31"},{"lineNumber":91,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":92,"author":{"gitId":"-"},"content":"\u003cimg src\u003d\"images/LogicClassDiagram.png\" width\u003d\"550\"/\u003e","lastModifiedDate":"2021-07-31"},{"lineNumber":93,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":94,"author":{"gitId":"-"},"content":"The sequence diagram below illustrates the interactions within the `Logic` component, taking `execute(\"delete 1\")` API call as an example.","lastModifiedDate":"2023-09-03"},{"lineNumber":95,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":96,"author":{"gitId":"-"},"content":"![Interactions Inside the Logic Component for the `delete 1` Command](images/DeleteSequenceDiagram.png)","lastModifiedDate":"2020-05-23"},{"lineNumber":97,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":98,"author":{"gitId":"-"},"content":"\u003cdiv markdown\u003d\"span\" class\u003d\"alert alert-info\"\u003e:information_source: **Note:** The lifeline for `DeleteCommandParser` should end at the destroy marker (X) but due to a limitation of PlantUML, the lifeline continues till the end of diagram.","lastModifiedDate":"2024-02-09"},{"lineNumber":99,"author":{"gitId":"-"},"content":"\u003c/div\u003e","lastModifiedDate":"2020-05-23"},{"lineNumber":100,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":101,"author":{"gitId":"-"},"content":"How the `Logic` component works:","lastModifiedDate":"2023-09-03"},{"lineNumber":102,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2023-09-03"},{"lineNumber":103,"author":{"gitId":"-"},"content":"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.","lastModifiedDate":"2023-09-03"},{"lineNumber":104,"author":{"gitId":"-"},"content":"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`.","lastModifiedDate":"2023-09-03"},{"lineNumber":105,"author":{"gitId":"-"},"content":"1. The command can communicate with the `Model` when it is executed (e.g. to delete a person).\u003cbr\u003e","lastModifiedDate":"2024-02-09"},{"lineNumber":106,"author":{"gitId":"-"},"content":" Note that although this is shown as a single step in the diagram above (for simplicity), in the code it can take several interactions (between the command object and the `Model`) to achieve.","lastModifiedDate":"2024-02-09"},{"lineNumber":107,"author":{"gitId":"-"},"content":"1. The result of the command execution is encapsulated as a `CommandResult` object which is returned back from `Logic`.","lastModifiedDate":"2023-09-03"},{"lineNumber":108,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2023-09-03"},{"lineNumber":109,"author":{"gitId":"-"},"content":"Here are the other classes in `Logic` (omitted from the class diagram above) that are used for parsing a user command:","lastModifiedDate":"2021-07-31"},{"lineNumber":110,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2021-07-31"},{"lineNumber":111,"author":{"gitId":"-"},"content":"\u003cimg src\u003d\"images/ParserClasses.png\" width\u003d\"600\"/\u003e","lastModifiedDate":"2021-07-31"},{"lineNumber":112,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":113,"author":{"gitId":"-"},"content":"How the parsing works:","lastModifiedDate":"2021-07-31"},{"lineNumber":114,"author":{"gitId":"-"},"content":"* 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.","lastModifiedDate":"2021-07-31"},{"lineNumber":115,"author":{"gitId":"-"},"content":"* 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.","lastModifiedDate":"2021-07-31"},{"lineNumber":116,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":117,"author":{"gitId":"-"},"content":"### Model component","lastModifiedDate":"2021-07-31"},{"lineNumber":118,"author":{"gitId":"-"},"content":"**API** : [`Model.java`](https://github.com/se-edu/addressbook-level3/tree/master/src/main/java/seedu/address/model/Model.java)","lastModifiedDate":"2020-05-23"},{"lineNumber":119,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":120,"author":{"gitId":"-"},"content":"\u003cimg src\u003d\"images/ModelClassDiagram.png\" width\u003d\"450\" /\u003e","lastModifiedDate":"2021-07-31"},{"lineNumber":121,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":122,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":123,"author":{"gitId":"-"},"content":"The `Model` component,","lastModifiedDate":"2021-07-31"},{"lineNumber":124,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":125,"author":{"gitId":"-"},"content":"* stores the address book data i.e., all `Person` objects (which are contained in a `UniquePersonList` object).","lastModifiedDate":"2021-07-31"},{"lineNumber":126,"author":{"gitId":"-"},"content":"* stores the currently \u0027selected\u0027 `Person` objects (e.g., results of a search query) as a separate _filtered_ list which is exposed to outsiders as an unmodifiable `ObservableList\u003cPerson\u003e` that can be \u0027observed\u0027 e.g. the UI can be bound to this list so that the UI automatically updates when the data in the list change.","lastModifiedDate":"2021-07-31"},{"lineNumber":127,"author":{"gitId":"-"},"content":"* stores a `UserPref` object that represents the user’s preferences. This is exposed to the outside as a `ReadOnlyUserPref` objects.","lastModifiedDate":"2021-07-31"},{"lineNumber":128,"author":{"gitId":"-"},"content":"* 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)","lastModifiedDate":"2021-07-31"},{"lineNumber":129,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2021-07-31"},{"lineNumber":130,"author":{"gitId":"-"},"content":"\u003cdiv markdown\u003d\"span\" class\u003d\"alert alert-info\"\u003e: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.\u003cbr\u003e","lastModifiedDate":"2021-07-31"},{"lineNumber":131,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2021-07-31"},{"lineNumber":132,"author":{"gitId":"-"},"content":"\u003cimg src\u003d\"images/BetterModelClassDiagram.png\" width\u003d\"450\" /\u003e","lastModifiedDate":"2021-07-31"},{"lineNumber":133,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":134,"author":{"gitId":"-"},"content":"\u003c/div\u003e","lastModifiedDate":"2020-05-23"},{"lineNumber":135,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":136,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":137,"author":{"gitId":"-"},"content":"### Storage component","lastModifiedDate":"2020-05-23"},{"lineNumber":138,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":139,"author":{"gitId":"-"},"content":"**API** : [`Storage.java`](https://github.com/se-edu/addressbook-level3/tree/master/src/main/java/seedu/address/storage/Storage.java)","lastModifiedDate":"2020-05-23"},{"lineNumber":140,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":141,"author":{"gitId":"-"},"content":"\u003cimg src\u003d\"images/StorageClassDiagram.png\" width\u003d\"550\" /\u003e","lastModifiedDate":"2021-07-31"},{"lineNumber":142,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2021-07-31"},{"lineNumber":143,"author":{"gitId":"-"},"content":"The `Storage` component,","lastModifiedDate":"2020-05-23"},{"lineNumber":144,"author":{"gitId":"-"},"content":"* can save both address book data and user preference data in JSON format, and read them back into corresponding objects.","lastModifiedDate":"2023-09-03"},{"lineNumber":145,"author":{"gitId":"-"},"content":"* inherits from both `AddressBookStorage` and `UserPrefStorage`, which means it can be treated as either one (if only the functionality of only one is needed).","lastModifiedDate":"2021-07-31"},{"lineNumber":146,"author":{"gitId":"-"},"content":"* depends on some classes in the `Model` component (because the `Storage` component\u0027s job is to save/retrieve objects that belong to the `Model`)","lastModifiedDate":"2021-07-21"},{"lineNumber":147,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":148,"author":{"gitId":"-"},"content":"### Common classes","lastModifiedDate":"2020-05-23"},{"lineNumber":149,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":150,"author":{"gitId":"-"},"content":"Classes used by multiple components are in the `seedu.addressbook.commons` package.","lastModifiedDate":"2020-05-23"},{"lineNumber":151,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":152,"author":{"gitId":"-"},"content":"--------------------------------------------------------------------------------------------------------------------","lastModifiedDate":"2020-05-23"},{"lineNumber":153,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":154,"author":{"gitId":"-"},"content":"## **Implementation**","lastModifiedDate":"2020-05-23"},{"lineNumber":155,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":156,"author":{"gitId":"-"},"content":"This section describes some noteworthy details on how certain features are implemented.","lastModifiedDate":"2020-05-23"},{"lineNumber":157,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":158,"author":{"gitId":"-"},"content":"### \\[Proposed\\] Undo/redo feature","lastModifiedDate":"2020-06-07"},{"lineNumber":159,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":160,"author":{"gitId":"-"},"content":"#### Proposed Implementation","lastModifiedDate":"2020-05-23"},{"lineNumber":161,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":162,"author":{"gitId":"-"},"content":"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:","lastModifiedDate":"2020-05-23"},{"lineNumber":163,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":164,"author":{"gitId":"-"},"content":"* `VersionedAddressBook#commit()` — Saves the current address book state in its history.","lastModifiedDate":"2020-05-23"},{"lineNumber":165,"author":{"gitId":"-"},"content":"* `VersionedAddressBook#undo()` — Restores the previous address book state from its history.","lastModifiedDate":"2020-05-23"},{"lineNumber":166,"author":{"gitId":"-"},"content":"* `VersionedAddressBook#redo()` — Restores a previously undone address book state from its history.","lastModifiedDate":"2020-05-23"},{"lineNumber":167,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":168,"author":{"gitId":"-"},"content":"These operations are exposed in the `Model` interface as `Model#commitAddressBook()`, `Model#undoAddressBook()` and `Model#redoAddressBook()` respectively.","lastModifiedDate":"2020-05-23"},{"lineNumber":169,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":170,"author":{"gitId":"-"},"content":"Given below is an example usage scenario and how the undo/redo mechanism behaves at each step.","lastModifiedDate":"2020-05-23"},{"lineNumber":171,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":172,"author":{"gitId":"-"},"content":"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.","lastModifiedDate":"2020-05-23"},{"lineNumber":173,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":174,"author":{"gitId":"-"},"content":"![UndoRedoState0](images/UndoRedoState0.png)","lastModifiedDate":"2020-05-23"},{"lineNumber":175,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":176,"author":{"gitId":"-"},"content":"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.","lastModifiedDate":"2020-05-23"},{"lineNumber":177,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":178,"author":{"gitId":"-"},"content":"![UndoRedoState1](images/UndoRedoState1.png)","lastModifiedDate":"2020-05-23"},{"lineNumber":179,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":180,"author":{"gitId":"-"},"content":"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`.","lastModifiedDate":"2020-05-23"},{"lineNumber":181,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":182,"author":{"gitId":"-"},"content":"![UndoRedoState2](images/UndoRedoState2.png)","lastModifiedDate":"2020-05-23"},{"lineNumber":183,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":184,"author":{"gitId":"-"},"content":"\u003cdiv markdown\u003d\"span\" class\u003d\"alert alert-info\"\u003e: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`.","lastModifiedDate":"2020-05-23"},{"lineNumber":185,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":186,"author":{"gitId":"-"},"content":"\u003c/div\u003e","lastModifiedDate":"2020-05-23"},{"lineNumber":187,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":188,"author":{"gitId":"-"},"content":"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.","lastModifiedDate":"2020-05-23"},{"lineNumber":189,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":190,"author":{"gitId":"-"},"content":"![UndoRedoState3](images/UndoRedoState3.png)","lastModifiedDate":"2020-05-23"},{"lineNumber":191,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":192,"author":{"gitId":"-"},"content":"\u003cdiv markdown\u003d\"span\" class\u003d\"alert alert-info\"\u003e: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","lastModifiedDate":"2020-05-23"},{"lineNumber":193,"author":{"gitId":"-"},"content":"than attempting to perform the undo.","lastModifiedDate":"2020-05-23"},{"lineNumber":194,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":195,"author":{"gitId":"-"},"content":"\u003c/div\u003e","lastModifiedDate":"2020-05-23"},{"lineNumber":196,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":197,"author":{"gitId":"-"},"content":"The following sequence diagram shows how an undo operation goes through the `Logic` component:","lastModifiedDate":"2024-02-09"},{"lineNumber":198,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":199,"author":{"gitId":"-"},"content":"![UndoSequenceDiagram](images/UndoSequenceDiagram-Logic.png)","lastModifiedDate":"2024-02-09"},{"lineNumber":200,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":201,"author":{"gitId":"-"},"content":"\u003cdiv markdown\u003d\"span\" class\u003d\"alert alert-info\"\u003e: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.","lastModifiedDate":"2020-05-23"},{"lineNumber":202,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":203,"author":{"gitId":"-"},"content":"\u003c/div\u003e","lastModifiedDate":"2020-05-23"},{"lineNumber":204,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":205,"author":{"gitId":"-"},"content":"Similarly, how an undo operation goes through the `Model` component is shown below:","lastModifiedDate":"2024-02-09"},{"lineNumber":206,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2024-02-09"},{"lineNumber":207,"author":{"gitId":"-"},"content":"![UndoSequenceDiagram](images/UndoSequenceDiagram-Model.png)","lastModifiedDate":"2024-02-09"},{"lineNumber":208,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2024-02-09"},{"lineNumber":209,"author":{"gitId":"-"},"content":"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.","lastModifiedDate":"2020-05-23"},{"lineNumber":210,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":211,"author":{"gitId":"-"},"content":"\u003cdiv markdown\u003d\"span\" class\u003d\"alert alert-info\"\u003e: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.","lastModifiedDate":"2020-05-23"},{"lineNumber":212,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":213,"author":{"gitId":"-"},"content":"\u003c/div\u003e","lastModifiedDate":"2020-05-23"},{"lineNumber":214,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":215,"author":{"gitId":"-"},"content":"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.","lastModifiedDate":"2020-05-23"},{"lineNumber":216,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":217,"author":{"gitId":"-"},"content":"![UndoRedoState4](images/UndoRedoState4.png)","lastModifiedDate":"2020-05-23"},{"lineNumber":218,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":219,"author":{"gitId":"-"},"content":"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.","lastModifiedDate":"2020-05-23"},{"lineNumber":220,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":221,"author":{"gitId":"-"},"content":"![UndoRedoState5](images/UndoRedoState5.png)","lastModifiedDate":"2020-05-23"},{"lineNumber":222,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":223,"author":{"gitId":"-"},"content":"The following activity diagram summarizes what happens when a user executes a new command:","lastModifiedDate":"2020-05-23"},{"lineNumber":224,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":225,"author":{"gitId":"-"},"content":"\u003cimg src\u003d\"images/CommitActivityDiagram.png\" width\u003d\"250\" /\u003e","lastModifiedDate":"2021-07-31"},{"lineNumber":226,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":227,"author":{"gitId":"-"},"content":"#### Design considerations:","lastModifiedDate":"2021-07-31"},{"lineNumber":228,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":229,"author":{"gitId":"-"},"content":"**Aspect: How undo \u0026 redo executes:**","lastModifiedDate":"2021-07-31"},{"lineNumber":230,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":231,"author":{"gitId":"-"},"content":"* **Alternative 1 (current choice):** Saves the entire address book.","lastModifiedDate":"2020-05-23"},{"lineNumber":232,"author":{"gitId":"-"},"content":" * Pros: Easy to implement.","lastModifiedDate":"2020-05-23"},{"lineNumber":233,"author":{"gitId":"-"},"content":" * Cons: May have performance issues in terms of memory usage.","lastModifiedDate":"2020-05-23"},{"lineNumber":234,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":235,"author":{"gitId":"-"},"content":"* **Alternative 2:** Individual command knows how to undo/redo by","lastModifiedDate":"2020-05-23"},{"lineNumber":236,"author":{"gitId":"-"},"content":" itself.","lastModifiedDate":"2020-05-23"},{"lineNumber":237,"author":{"gitId":"-"},"content":" * Pros: Will use less memory (e.g. for `delete`, just save the person being deleted).","lastModifiedDate":"2020-05-23"},{"lineNumber":238,"author":{"gitId":"-"},"content":" * Cons: We must ensure that the implementation of each individual command are correct.","lastModifiedDate":"2020-05-23"},{"lineNumber":239,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":240,"author":{"gitId":"-"},"content":"_{more aspects and alternatives to be added}_","lastModifiedDate":"2020-05-23"},{"lineNumber":241,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":242,"author":{"gitId":"-"},"content":"### \\[Proposed\\] Data archiving","lastModifiedDate":"2020-05-23"},{"lineNumber":243,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":244,"author":{"gitId":"-"},"content":"_{Explain here how the data archiving feature will be implemented}_","lastModifiedDate":"2020-05-23"},{"lineNumber":245,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":246,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":247,"author":{"gitId":"-"},"content":"--------------------------------------------------------------------------------------------------------------------","lastModifiedDate":"2020-05-23"},{"lineNumber":248,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":249,"author":{"gitId":"-"},"content":"## **Documentation, logging, testing, configuration, dev-ops**","lastModifiedDate":"2020-06-07"},{"lineNumber":250,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":251,"author":{"gitId":"-"},"content":"* [Documentation guide](Documentation.md)","lastModifiedDate":"2020-06-07"},{"lineNumber":252,"author":{"gitId":"-"},"content":"* [Testing guide](Testing.md)","lastModifiedDate":"2020-06-07"},{"lineNumber":253,"author":{"gitId":"-"},"content":"* [Logging guide](Logging.md)","lastModifiedDate":"2020-06-07"},{"lineNumber":254,"author":{"gitId":"-"},"content":"* [Configuration guide](Configuration.md)","lastModifiedDate":"2020-06-07"},{"lineNumber":255,"author":{"gitId":"-"},"content":"* [DevOps guide](DevOps.md)","lastModifiedDate":"2020-06-07"},{"lineNumber":256,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":257,"author":{"gitId":"-"},"content":"--------------------------------------------------------------------------------------------------------------------","lastModifiedDate":"2020-05-23"},{"lineNumber":258,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":259,"author":{"gitId":"-"},"content":"## **Appendix: Requirements**","lastModifiedDate":"2020-05-23"},{"lineNumber":260,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":261,"author":{"gitId":"-"},"content":"### Product scope","lastModifiedDate":"2020-05-23"},{"lineNumber":262,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":263,"author":{"gitId":"-"},"content":"**Target user profile**:","lastModifiedDate":"2020-05-23"},{"lineNumber":264,"author":{"gitId":"ejnan"},"content":"Ward nurses","lastModifiedDate":"2024-03-07"},{"lineNumber":265,"author":{"gitId":"ejnan"},"content":"* manage a significant number of patient contacts with varying details","lastModifiedDate":"2024-03-07"},{"lineNumber":266,"author":{"gitId":"ejnan"},"content":"* quickly access critical patient information in time-sensitive situations","lastModifiedDate":"2024-03-07"},{"lineNumber":267,"author":{"gitId":"ejnan"},"content":"* track and log details of care administered to each patient over time","lastModifiedDate":"2024-03-07"},{"lineNumber":268,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":269,"author":{"gitId":"ejnan"},"content":"**Preferences/ Skills**","lastModifiedDate":"2024-03-07"},{"lineNumber":270,"author":{"gitId":"-"},"content":"* prefer desktop apps over other types","lastModifiedDate":"2020-05-23"},{"lineNumber":271,"author":{"gitId":"-"},"content":"* can type fast","lastModifiedDate":"2020-05-23"},{"lineNumber":272,"author":{"gitId":"-"},"content":"* prefers typing to mouse interactions","lastModifiedDate":"2020-05-26"},{"lineNumber":273,"author":{"gitId":"-"},"content":"* is reasonably comfortable using CLI apps","lastModifiedDate":"2020-05-23"},{"lineNumber":274,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":275,"author":{"gitId":"ejnan"},"content":"**Value proposition**: streamlined text-based commands to manage contacts faster than a typical mouse/GUI driven app","lastModifiedDate":"2024-03-07"},{"lineNumber":276,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":277,"author":{"gitId":"-"},"content":"### User stories","lastModifiedDate":"2020-06-07"},{"lineNumber":278,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":279,"author":{"gitId":"-"},"content":"Priorities: High (must have) - `* * *`, Medium (nice to have) - `* *`, Low (unlikely to have) - `*`","lastModifiedDate":"2020-05-23"},{"lineNumber":280,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":281,"author":{"gitId":"-"},"content":"| Priority | As a …​ | I want to …​ | So that I can…​ |","lastModifiedDate":"2020-05-23"},{"lineNumber":282,"author":{"gitId":"ejnan"},"content":"| -------- | -------------------------------------- |-------------------------------|---------------------------------------------------------|","lastModifiedDate":"2024-03-07"},{"lineNumber":283,"author":{"gitId":"ejnan"},"content":"| `* * *` | user | add a new patient | store new patient records |","lastModifiedDate":"2024-03-07"},{"lineNumber":284,"author":{"gitId":"ejnan"},"content":"| `* * *` | user | view existing patient records | access information on existing patients |","lastModifiedDate":"2024-03-07"},{"lineNumber":285,"author":{"gitId":"ejnan"},"content":"| `* * *` | user | delete a patient record | remove outdated or irrelevant patient data |","lastModifiedDate":"2024-03-07"},{"lineNumber":286,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":287,"author":{"gitId":"-"},"content":"*{More to be added}*","lastModifiedDate":"2020-05-23"},{"lineNumber":288,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":289,"author":{"gitId":"-"},"content":"### Use cases","lastModifiedDate":"2020-06-07"},{"lineNumber":290,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":291,"author":{"gitId":"-"},"content":"(For all use cases below, the **System** is the `AddressBook` and the **Actor** is the `user`, unless specified otherwise)","lastModifiedDate":"2020-05-23"},{"lineNumber":292,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":293,"author":{"gitId":"swtan346"},"content":"**Use case: UC01 - View contacts**","lastModifiedDate":"2024-03-07"},{"lineNumber":294,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":295,"author":{"gitId":"-"},"content":"**MSS**","lastModifiedDate":"2020-05-23"},{"lineNumber":296,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":297,"author":{"gitId":"-"},"content":"1. User requests to list persons","lastModifiedDate":"2020-05-23"},{"lineNumber":298,"author":{"gitId":"-"},"content":"2. AddressBook shows a list of persons","lastModifiedDate":"2020-05-23"},{"lineNumber":299,"author":{"gitId":"swtan346"},"content":"","lastModifiedDate":"2024-03-07"},{"lineNumber":300,"author":{"gitId":"swtan346"},"content":" Use case ends.","lastModifiedDate":"2024-03-07"},{"lineNumber":301,"author":{"gitId":"swtan346"},"content":"","lastModifiedDate":"2024-03-07"},{"lineNumber":302,"author":{"gitId":"swtan346"},"content":"**Use case: UC02 - Add a person**","lastModifiedDate":"2024-03-07"},{"lineNumber":303,"author":{"gitId":"swtan346"},"content":"","lastModifiedDate":"2024-03-07"},{"lineNumber":304,"author":{"gitId":"swtan346"},"content":"**MSS**","lastModifiedDate":"2024-03-07"},{"lineNumber":305,"author":{"gitId":"swtan346"},"content":"","lastModifiedDate":"2024-03-07"},{"lineNumber":306,"author":{"gitId":"swtan346"},"content":"1. User requests to add a person","lastModifiedDate":"2024-03-07"},{"lineNumber":307,"author":{"gitId":"swtan346"},"content":"2. AddressBook adds the person","lastModifiedDate":"2024-03-07"},{"lineNumber":308,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":309,"author":{"gitId":"-"},"content":" Use case ends.","lastModifiedDate":"2020-05-23"},{"lineNumber":310,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":311,"author":{"gitId":"-"},"content":"**Extensions**","lastModifiedDate":"2020-05-23"},{"lineNumber":312,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":313,"author":{"gitId":"swtan346"},"content":"* 2a. The given person details are invalid.","lastModifiedDate":"2024-03-07"},{"lineNumber":314,"author":{"gitId":"swtan346"},"content":"","lastModifiedDate":"2024-03-07"},{"lineNumber":315,"author":{"gitId":"swtan346"},"content":" * 2a1. AddressBook shows an error message.","lastModifiedDate":"2024-03-07"},{"lineNumber":316,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":317,"author":{"gitId":"-"},"content":" Use case ends.","lastModifiedDate":"2020-05-23"},{"lineNumber":318,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":319,"author":{"gitId":"swtan346"},"content":"**Use case: US03 - Delete a person**","lastModifiedDate":"2024-03-07"},{"lineNumber":320,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":321,"author":{"gitId":"-"},"content":"**MSS**","lastModifiedDate":"2020-05-23"},{"lineNumber":322,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":323,"author":{"gitId":"swtan346"},"content":"1. User requests to view contacts(UC01)","lastModifiedDate":"2024-03-07"},{"lineNumber":324,"author":{"gitId":"swtan346"},"content":"2. User requests to delete a specific person in the list ","lastModifiedDate":"2024-03-07"},{"lineNumber":325,"author":{"gitId":"swtan346"},"content":"3. AddressBook deletes the person","lastModifiedDate":"2024-03-07"},{"lineNumber":326,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":327,"author":{"gitId":"-"},"content":" Use case ends.","lastModifiedDate":"2020-05-23"},{"lineNumber":328,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":329,"author":{"gitId":"-"},"content":"**Extensions**","lastModifiedDate":"2020-05-23"},{"lineNumber":330,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":331,"author":{"gitId":"swtan346"},"content":"* 1a. The list is empty.","lastModifiedDate":"2024-03-07"},{"lineNumber":332,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":333,"author":{"gitId":"-"},"content":" Use case ends.","lastModifiedDate":"2020-05-23"},{"lineNumber":334,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":335,"author":{"gitId":"swtan346"},"content":"* 2a. The given index is invalid.","lastModifiedDate":"2024-03-07"},{"lineNumber":336,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":337,"author":{"gitId":"swtan346"},"content":" * 2a1. AddressBook shows an error message.","lastModifiedDate":"2024-03-07"},{"lineNumber":338,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":339,"author":{"gitId":"-"},"content":" Use case resumes at step 2.","lastModifiedDate":"2020-05-23"},{"lineNumber":340,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":341,"author":{"gitId":"-"},"content":"### Non-Functional Requirements","lastModifiedDate":"2020-05-23"},{"lineNumber":342,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":343,"author":{"gitId":"-"},"content":"1. Should work on any _mainstream OS_ as long as it has Java `11` or above installed.","lastModifiedDate":"2020-05-23"},{"lineNumber":344,"author":{"gitId":"-"},"content":"2. Should be able to hold up to 1000 persons without a noticeable sluggishness in performance for typical usage.","lastModifiedDate":"2020-05-23"},{"lineNumber":345,"author":{"gitId":"-"},"content":"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.","lastModifiedDate":"2020-05-23"},{"lineNumber":346,"author":{"gitId":"swtan346"},"content":"4. The user interface should be intuitive and easy to navigate.","lastModifiedDate":"2024-03-07"},{"lineNumber":347,"author":{"gitId":"swtan346"},"content":"5. The codebase should be well-structured and well-documented to facilitate future maintenance and enhancements.","lastModifiedDate":"2024-03-07"},{"lineNumber":348,"author":{"gitId":"swtan346"},"content":"6. The application should only support a single user.","lastModifiedDate":"2024-03-07"},{"lineNumber":349,"author":{"gitId":"swtan346"},"content":"7. The product needs to be developed in a breadth-first incremental manner over the project duration.","lastModifiedDate":"2024-03-07"},{"lineNumber":350,"author":{"gitId":"swtan346"},"content":"8. The data should be stored locally and should be in a human editable text file.","lastModifiedDate":"2024-03-07"},{"lineNumber":351,"author":{"gitId":"swtan346"},"content":"9. The software should follow the Object-oriented paradigm primarily.","lastModifiedDate":"2024-03-07"},{"lineNumber":352,"author":{"gitId":"swtan346"},"content":"10. The software should work without requiring an installer.","lastModifiedDate":"2024-03-07"},{"lineNumber":353,"author":{"gitId":"swtan346"},"content":"11. The software should not depend on a specific remote server.","lastModifiedDate":"2024-03-07"},{"lineNumber":354,"author":{"gitId":"swtan346"},"content":"12. The GUI should work well for standard screen resolutions 1920x1080 and higher, and, for screen scales 100% and 125%.","lastModifiedDate":"2024-03-07"},{"lineNumber":355,"author":{"gitId":"swtan346"},"content":"13. The GUI should be usable (i.e., all functions can be used even if the user experience is not optimal) for, ","lastModifiedDate":"2024-03-07"},{"lineNumber":356,"author":{"gitId":"swtan346"},"content":" resolutions 1280x720 and higher, and, for screen scales 150%.","lastModifiedDate":"2024-03-07"},{"lineNumber":357,"author":{"gitId":"swtan346"},"content":"14. The product should be available as a single JAR file of size 100MB or below.","lastModifiedDate":"2024-03-07"},{"lineNumber":358,"author":{"gitId":"swtan346"},"content":"15. The web documents saved should be a PDF file of size 15MB or below.","lastModifiedDate":"2024-03-07"},{"lineNumber":359,"author":{"gitId":"swtan346"},"content":"16. The final JAR/PDF files should not be bloated unnecessarily.","lastModifiedDate":"2024-03-07"},{"lineNumber":360,"author":{"gitId":"swtan346"},"content":"17. The DG and UG should be PDF-friendly, without any expandable panels, embedded videos, animated GIFs etc.","lastModifiedDate":"2024-03-07"},{"lineNumber":361,"author":{"gitId":"swtan346"},"content":"18. The use of third-party frameworks/libraries/services is allowed only if they, are free, open-source (this ","lastModifiedDate":"2024-03-07"},{"lineNumber":362,"author":{"gitId":"swtan346"},"content":" doesn\u0027t apply to services), and have permissive license terms; do not require any installation by the user; do ","lastModifiedDate":"2024-03-07"},{"lineNumber":363,"author":{"gitId":"swtan346"},"content":" not violate other constraints.","lastModifiedDate":"2024-03-07"},{"lineNumber":364,"author":{"gitId":"swtan346"},"content":"19. The product should process a user input command within 1 second.","lastModifiedDate":"2024-03-07"},{"lineNumber":365,"author":{"gitId":"swtan346"},"content":"20. The system must perform without failure in 95 percent of use cases during a month.","lastModifiedDate":"2024-03-07"},{"lineNumber":366,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":367,"author":{"gitId":"-"},"content":"### Glossary","lastModifiedDate":"2020-05-23"},{"lineNumber":368,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":369,"author":{"gitId":"-"},"content":"* **Mainstream OS**: Windows, Linux, Unix, MacOS","lastModifiedDate":"2024-02-09"},{"lineNumber":370,"author":{"gitId":"-"},"content":"* **Private contact detail**: A contact detail that is not meant to be shared with others","lastModifiedDate":"2020-05-23"},{"lineNumber":371,"author":{"gitId":"swtan346"},"content":"* **DG**: Developer guide","lastModifiedDate":"2024-03-07"},{"lineNumber":372,"author":{"gitId":"swtan346"},"content":"* **UG**: User guide","lastModifiedDate":"2024-03-07"},{"lineNumber":373,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":374,"author":{"gitId":"-"},"content":"--------------------------------------------------------------------------------------------------------------------","lastModifiedDate":"2020-05-23"},{"lineNumber":375,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":376,"author":{"gitId":"-"},"content":"## **Appendix: Instructions for manual testing**","lastModifiedDate":"2020-05-23"},{"lineNumber":377,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":378,"author":{"gitId":"-"},"content":"Given below are instructions to test the app manually.","lastModifiedDate":"2020-05-23"},{"lineNumber":379,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":380,"author":{"gitId":"-"},"content":"\u003cdiv markdown\u003d\"span\" class\u003d\"alert alert-info\"\u003e:information_source: **Note:** These instructions only provide a starting point for testers to work on;","lastModifiedDate":"2020-05-23"},{"lineNumber":381,"author":{"gitId":"-"},"content":"testers are expected to do more *exploratory* testing.","lastModifiedDate":"2020-05-23"},{"lineNumber":382,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":383,"author":{"gitId":"-"},"content":"\u003c/div\u003e","lastModifiedDate":"2020-05-23"},{"lineNumber":384,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":385,"author":{"gitId":"-"},"content":"### Launch and shutdown","lastModifiedDate":"2020-05-23"},{"lineNumber":386,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":387,"author":{"gitId":"-"},"content":"1. Initial launch","lastModifiedDate":"2020-05-23"},{"lineNumber":388,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":389,"author":{"gitId":"-"},"content":" 1. Download the jar file and copy into an empty folder","lastModifiedDate":"2020-05-23"},{"lineNumber":390,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":391,"author":{"gitId":"-"},"content":" 1. Double-click the jar file Expected: Shows the GUI with a set of sample contacts. The window size may not be optimum.","lastModifiedDate":"2020-05-23"},{"lineNumber":392,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":393,"author":{"gitId":"-"},"content":"1. Saving window preferences","lastModifiedDate":"2020-05-23"},{"lineNumber":394,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":395,"author":{"gitId":"-"},"content":" 1. Resize the window to an optimum size. Move the window to a different location. Close the window.","lastModifiedDate":"2020-05-23"},{"lineNumber":396,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":397,"author":{"gitId":"-"},"content":" 1. Re-launch the app by double-clicking the jar file.\u003cbr\u003e","lastModifiedDate":"2020-05-23"},{"lineNumber":398,"author":{"gitId":"-"},"content":" Expected: The most recent window size and location is retained.","lastModifiedDate":"2020-05-23"},{"lineNumber":399,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":400,"author":{"gitId":"-"},"content":"1. _{ more test cases …​ }_","lastModifiedDate":"2020-05-23"},{"lineNumber":401,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":402,"author":{"gitId":"-"},"content":"### Deleting a person","lastModifiedDate":"2020-05-23"},{"lineNumber":403,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":404,"author":{"gitId":"-"},"content":"1. Deleting a person while all persons are being shown","lastModifiedDate":"2020-05-23"},{"lineNumber":405,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":406,"author":{"gitId":"-"},"content":" 1. Prerequisites: List all persons using the `list` command. Multiple persons in the list.","lastModifiedDate":"2020-05-23"},{"lineNumber":407,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":408,"author":{"gitId":"-"},"content":" 1. Test case: `delete 1`\u003cbr\u003e","lastModifiedDate":"2020-05-23"},{"lineNumber":409,"author":{"gitId":"-"},"content":" 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.","lastModifiedDate":"2020-05-23"},{"lineNumber":410,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":411,"author":{"gitId":"-"},"content":" 1. Test case: `delete 0`\u003cbr\u003e","lastModifiedDate":"2020-05-23"},{"lineNumber":412,"author":{"gitId":"-"},"content":" Expected: No person is deleted. Error details shown in the status message. Status bar remains the same.","lastModifiedDate":"2020-05-23"},{"lineNumber":413,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":414,"author":{"gitId":"-"},"content":" 1. Other incorrect delete commands to try: `delete`, `delete x`, `...` (where x is larger than the list size)\u003cbr\u003e","lastModifiedDate":"2020-05-23"},{"lineNumber":415,"author":{"gitId":"-"},"content":" Expected: Similar to previous.","lastModifiedDate":"2020-05-23"},{"lineNumber":416,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":417,"author":{"gitId":"-"},"content":"1. _{ more test cases …​ }_","lastModifiedDate":"2020-05-23"},{"lineNumber":418,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":419,"author":{"gitId":"-"},"content":"### Saving data","lastModifiedDate":"2020-05-23"},{"lineNumber":420,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":421,"author":{"gitId":"-"},"content":"1. Dealing with missing/corrupted data files","lastModifiedDate":"2020-05-23"},{"lineNumber":422,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":423,"author":{"gitId":"-"},"content":" 1. _{explain how to simulate a missing/corrupted file, and the expected behavior}_","lastModifiedDate":"2020-05-23"},{"lineNumber":424,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":425,"author":{"gitId":"-"},"content":"1. _{ more test cases …​ }_","lastModifiedDate":"2020-05-23"}],"authorContributionMap":{"swtan346":42,"ejnan":10,"-":373}},{"path":"docs/UserGuide.md","fileType":"docs","lines":[{"lineNumber":1,"author":{"gitId":"-"},"content":"---","lastModifiedDate":"2020-05-23"},{"lineNumber":2,"author":{"gitId":"-"},"content":"layout: page","lastModifiedDate":"2020-05-23"},{"lineNumber":3,"author":{"gitId":"-"},"content":"title: User Guide","lastModifiedDate":"2020-05-23"},{"lineNumber":4,"author":{"gitId":"-"},"content":"---","lastModifiedDate":"2020-05-23"},{"lineNumber":5,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":6,"author":{"gitId":"-"},"content":"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.","lastModifiedDate":"2020-05-23"},{"lineNumber":7,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":8,"author":{"gitId":"-"},"content":"* Table of Contents","lastModifiedDate":"2020-05-23"},{"lineNumber":9,"author":{"gitId":"-"},"content":"{:toc}","lastModifiedDate":"2020-05-23"},{"lineNumber":10,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":11,"author":{"gitId":"-"},"content":"--------------------------------------------------------------------------------------------------------------------","lastModifiedDate":"2020-05-23"},{"lineNumber":12,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":13,"author":{"gitId":"-"},"content":"## Quick start","lastModifiedDate":"2020-05-23"},{"lineNumber":14,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":15,"author":{"gitId":"-"},"content":"1. Ensure you have Java `11` or above installed in your Computer.","lastModifiedDate":"2020-05-23"},{"lineNumber":16,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":17,"author":{"gitId":"-"},"content":"1. Download the latest `addressbook.jar` from [here](https://github.com/se-edu/addressbook-level3/releases).","lastModifiedDate":"2020-05-23"},{"lineNumber":18,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":19,"author":{"gitId":"-"},"content":"1. Copy the file to the folder you want to use as the _home folder_ for your AddressBook.","lastModifiedDate":"2020-05-23"},{"lineNumber":20,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":21,"author":{"gitId":"-"},"content":"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.\u003cbr\u003e","lastModifiedDate":"2023-01-01"},{"lineNumber":22,"author":{"gitId":"ryanlimdx"},"content":" A GUI similar to the below should appear in a few seconds. Note how the app contains some sample input.\u003cbr\u003e","lastModifiedDate":"2024-03-06"},{"lineNumber":23,"author":{"gitId":"-"},"content":" ![Ui](images/Ui.png)","lastModifiedDate":"2020-05-23"},{"lineNumber":24,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":25,"author":{"gitId":"-"},"content":"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.\u003cbr\u003e","lastModifiedDate":"2020-05-23"},{"lineNumber":26,"author":{"gitId":"-"},"content":" Some example commands you can try:","lastModifiedDate":"2020-05-23"},{"lineNumber":27,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":28,"author":{"gitId":"-"},"content":" * `list` : Lists all contacts.","lastModifiedDate":"2023-01-01"},{"lineNumber":29,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":30,"author":{"gitId":"-"},"content":" * `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.","lastModifiedDate":"2023-01-01"},{"lineNumber":31,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":32,"author":{"gitId":"-"},"content":" * `delete 3` : Deletes the 3rd contact shown in the current list.","lastModifiedDate":"2023-01-01"},{"lineNumber":33,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":34,"author":{"gitId":"-"},"content":" * `clear` : Deletes all contacts.","lastModifiedDate":"2023-01-01"},{"lineNumber":35,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":36,"author":{"gitId":"-"},"content":" * `exit` : Exits the app.","lastModifiedDate":"2023-01-01"},{"lineNumber":37,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":38,"author":{"gitId":"-"},"content":"1. Refer to the [Features](#features) below for details of each command.","lastModifiedDate":"2020-05-23"},{"lineNumber":39,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":40,"author":{"gitId":"-"},"content":"--------------------------------------------------------------------------------------------------------------------","lastModifiedDate":"2020-05-23"},{"lineNumber":41,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":42,"author":{"gitId":"-"},"content":"## Features","lastModifiedDate":"2020-05-23"},{"lineNumber":43,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":44,"author":{"gitId":"-"},"content":"\u003cdiv markdown\u003d\"block\" class\u003d\"alert alert-info\"\u003e","lastModifiedDate":"2020-05-23"},{"lineNumber":45,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":46,"author":{"gitId":"-"},"content":"**:information_source: Notes about the command format:**\u003cbr\u003e","lastModifiedDate":"2020-05-23"},{"lineNumber":47,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":48,"author":{"gitId":"-"},"content":"* Words in `UPPER_CASE` are the parameters to be supplied by the user.\u003cbr\u003e","lastModifiedDate":"2020-05-23"},{"lineNumber":49,"author":{"gitId":"-"},"content":" e.g. in `add n/NAME`, `NAME` is a parameter which can be used as `add n/John Doe`.","lastModifiedDate":"2020-05-23"},{"lineNumber":50,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":51,"author":{"gitId":"-"},"content":"* Items in square brackets are optional.\u003cbr\u003e","lastModifiedDate":"2020-05-23"},{"lineNumber":52,"author":{"gitId":"-"},"content":" e.g `n/NAME [t/TAG]` can be used as `n/John Doe t/friend` or as `n/John Doe`.","lastModifiedDate":"2020-05-23"},{"lineNumber":53,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":54,"author":{"gitId":"-"},"content":"* Items with `…`​ after them can be used multiple times including zero times.\u003cbr\u003e","lastModifiedDate":"2020-05-23"},{"lineNumber":55,"author":{"gitId":"-"},"content":" e.g. `[t/TAG]…​` can be used as ` ` (i.e. 0 times), `t/friend`, `t/friend t/family` etc.","lastModifiedDate":"2020-05-23"},{"lineNumber":56,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":57,"author":{"gitId":"-"},"content":"* Parameters can be in any order.\u003cbr\u003e","lastModifiedDate":"2020-05-23"},{"lineNumber":58,"author":{"gitId":"-"},"content":" e.g. if the command specifies `n/NAME p/PHONE_NUMBER`, `p/PHONE_NUMBER n/NAME` is also acceptable.","lastModifiedDate":"2020-05-23"},{"lineNumber":59,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":60,"author":{"gitId":"-"},"content":"* Extraneous parameters for commands that do not take in parameters (such as `help`, `list`, `exit` and `clear`) will be ignored.\u003cbr\u003e","lastModifiedDate":"2021-02-03"},{"lineNumber":61,"author":{"gitId":"-"},"content":" e.g. if the command specifies `help 123`, it will be interpreted as `help`.","lastModifiedDate":"2021-02-03"},{"lineNumber":62,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2021-02-03"},{"lineNumber":63,"author":{"gitId":"-"},"content":"* 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.","lastModifiedDate":"2023-06-26"},{"lineNumber":64,"author":{"gitId":"-"},"content":"\u003c/div\u003e","lastModifiedDate":"2020-05-23"},{"lineNumber":65,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":66,"author":{"gitId":"-"},"content":"### Viewing help : `help`","lastModifiedDate":"2020-05-23"},{"lineNumber":67,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":68,"author":{"gitId":"-"},"content":"Shows a message explaning how to access the help page.","lastModifiedDate":"2020-05-23"},{"lineNumber":69,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":70,"author":{"gitId":"-"},"content":"![help message](images/helpMessage.png)","lastModifiedDate":"2020-05-23"},{"lineNumber":71,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":72,"author":{"gitId":"-"},"content":"Format: `help`","lastModifiedDate":"2020-05-23"},{"lineNumber":73,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":74,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":75,"author":{"gitId":"-"},"content":"### Adding a person: `add`","lastModifiedDate":"2020-05-23"},{"lineNumber":76,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":77,"author":{"gitId":"-"},"content":"Adds a person to the address book.","lastModifiedDate":"2020-05-23"},{"lineNumber":78,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":79,"author":{"gitId":"-"},"content":"Format: `add n/NAME p/PHONE_NUMBER e/EMAIL a/ADDRESS [t/TAG]…​`","lastModifiedDate":"2020-05-23"},{"lineNumber":80,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":81,"author":{"gitId":"-"},"content":"\u003cdiv markdown\u003d\"span\" class\u003d\"alert alert-primary\"\u003e:bulb: **Tip:**","lastModifiedDate":"2020-05-23"},{"lineNumber":82,"author":{"gitId":"-"},"content":"A person can have any number of tags (including 0)","lastModifiedDate":"2020-05-23"},{"lineNumber":83,"author":{"gitId":"-"},"content":"\u003c/div\u003e","lastModifiedDate":"2020-05-23"},{"lineNumber":84,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":85,"author":{"gitId":"-"},"content":"Examples:","lastModifiedDate":"2020-05-23"},{"lineNumber":86,"author":{"gitId":"-"},"content":"* `add n/John Doe p/98765432 e/johnd@example.com a/John street, block 123, #01-01`","lastModifiedDate":"2020-05-23"},{"lineNumber":87,"author":{"gitId":"-"},"content":"* `add n/Betsy Crowe t/friend e/betsycrowe@example.com a/Newgate Prison p/1234567 t/criminal`","lastModifiedDate":"2020-05-23"},{"lineNumber":88,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":89,"author":{"gitId":"-"},"content":"### Listing all persons : `list`","lastModifiedDate":"2020-05-23"},{"lineNumber":90,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":91,"author":{"gitId":"-"},"content":"Shows a list of all persons in the address book.","lastModifiedDate":"2020-05-23"},{"lineNumber":92,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":93,"author":{"gitId":"-"},"content":"Format: `list`","lastModifiedDate":"2020-05-23"},{"lineNumber":94,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":95,"author":{"gitId":"-"},"content":"### Editing a person : `edit`","lastModifiedDate":"2020-05-23"},{"lineNumber":96,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":97,"author":{"gitId":"-"},"content":"Edits an existing person in the address book.","lastModifiedDate":"2020-05-23"},{"lineNumber":98,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":99,"author":{"gitId":"-"},"content":"Format: `edit INDEX [n/NAME] [p/PHONE] [e/EMAIL] [a/ADDRESS] [t/TAG]…​`","lastModifiedDate":"2020-05-23"},{"lineNumber":100,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":101,"author":{"gitId":"-"},"content":"* 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, …​","lastModifiedDate":"2020-05-23"},{"lineNumber":102,"author":{"gitId":"-"},"content":"* At least one of the optional fields must be provided.","lastModifiedDate":"2020-05-23"},{"lineNumber":103,"author":{"gitId":"-"},"content":"* Existing values will be updated to the input values.","lastModifiedDate":"2020-05-23"},{"lineNumber":104,"author":{"gitId":"-"},"content":"* When editing tags, the existing tags of the person will be removed i.e adding of tags is not cumulative.","lastModifiedDate":"2020-05-23"},{"lineNumber":105,"author":{"gitId":"-"},"content":"* You can remove all the person’s tags by typing `t/` without","lastModifiedDate":"2020-05-23"},{"lineNumber":106,"author":{"gitId":"-"},"content":" specifying any tags after it.","lastModifiedDate":"2020-05-23"},{"lineNumber":107,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":108,"author":{"gitId":"-"},"content":"Examples:","lastModifiedDate":"2020-05-23"},{"lineNumber":109,"author":{"gitId":"-"},"content":"* `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.","lastModifiedDate":"2020-05-23"},{"lineNumber":110,"author":{"gitId":"-"},"content":"* `edit 2 n/Betsy Crower t/` Edits the name of the 2nd person to be `Betsy Crower` and clears all existing tags.","lastModifiedDate":"2020-05-23"},{"lineNumber":111,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":112,"author":{"gitId":"-"},"content":"### Locating persons by name: `find`","lastModifiedDate":"2020-05-23"},{"lineNumber":113,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":114,"author":{"gitId":"-"},"content":"Finds persons whose names contain any of the given keywords.","lastModifiedDate":"2020-05-23"},{"lineNumber":115,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":116,"author":{"gitId":"-"},"content":"Format: `find KEYWORD [MORE_KEYWORDS]`","lastModifiedDate":"2020-05-23"},{"lineNumber":117,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":118,"author":{"gitId":"-"},"content":"* The search is case-insensitive. e.g `hans` will match `Hans`","lastModifiedDate":"2020-05-23"},{"lineNumber":119,"author":{"gitId":"-"},"content":"* The order of the keywords does not matter. e.g. `Hans Bo` will match `Bo Hans`","lastModifiedDate":"2020-05-23"},{"lineNumber":120,"author":{"gitId":"-"},"content":"* Only the name is searched.","lastModifiedDate":"2020-05-23"},{"lineNumber":121,"author":{"gitId":"-"},"content":"* Only full words will be matched e.g. `Han` will not match `Hans`","lastModifiedDate":"2020-05-23"},{"lineNumber":122,"author":{"gitId":"-"},"content":"* Persons matching at least one keyword will be returned (i.e. `OR` search).","lastModifiedDate":"2020-05-23"},{"lineNumber":123,"author":{"gitId":"-"},"content":" e.g. `Hans Bo` will return `Hans Gruber`, `Bo Yang`","lastModifiedDate":"2020-05-23"},{"lineNumber":124,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":125,"author":{"gitId":"-"},"content":"Examples:","lastModifiedDate":"2020-05-23"},{"lineNumber":126,"author":{"gitId":"-"},"content":"* `find John` returns `john` and `John Doe`","lastModifiedDate":"2020-05-23"},{"lineNumber":127,"author":{"gitId":"-"},"content":"* `find alex david` returns `Alex Yeoh`, `David Li`\u003cbr\u003e","lastModifiedDate":"2020-05-23"},{"lineNumber":128,"author":{"gitId":"-"},"content":" ![result for \u0027find alex david\u0027](images/findAlexDavidResult.png)","lastModifiedDate":"2020-05-23"},{"lineNumber":129,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":130,"author":{"gitId":"-"},"content":"### Deleting a person : `delete`","lastModifiedDate":"2020-05-23"},{"lineNumber":131,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":132,"author":{"gitId":"-"},"content":"Deletes the specified person from the address book.","lastModifiedDate":"2020-05-23"},{"lineNumber":133,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":134,"author":{"gitId":"-"},"content":"Format: `delete INDEX`","lastModifiedDate":"2020-05-23"},{"lineNumber":135,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":136,"author":{"gitId":"-"},"content":"* Deletes the person at the specified `INDEX`.","lastModifiedDate":"2020-05-23"},{"lineNumber":137,"author":{"gitId":"-"},"content":"* The index refers to the index number shown in the displayed person list.","lastModifiedDate":"2020-05-23"},{"lineNumber":138,"author":{"gitId":"-"},"content":"* The index **must be a positive integer** 1, 2, 3, …​","lastModifiedDate":"2020-05-23"},{"lineNumber":139,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":140,"author":{"gitId":"-"},"content":"Examples:","lastModifiedDate":"2020-05-23"},{"lineNumber":141,"author":{"gitId":"-"},"content":"* `list` followed by `delete 2` deletes the 2nd person in the address book.","lastModifiedDate":"2020-05-23"},{"lineNumber":142,"author":{"gitId":"-"},"content":"* `find Betsy` followed by `delete 1` deletes the 1st person in the results of the `find` command.","lastModifiedDate":"2020-05-23"},{"lineNumber":143,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":144,"author":{"gitId":"-"},"content":"### Clearing all entries : `clear`","lastModifiedDate":"2020-05-23"},{"lineNumber":145,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":146,"author":{"gitId":"-"},"content":"Clears all entries from the address book.","lastModifiedDate":"2020-05-23"},{"lineNumber":147,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":148,"author":{"gitId":"-"},"content":"Format: `clear`","lastModifiedDate":"2020-05-23"},{"lineNumber":149,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":150,"author":{"gitId":"-"},"content":"### Exiting the program : `exit`","lastModifiedDate":"2020-05-23"},{"lineNumber":151,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":152,"author":{"gitId":"-"},"content":"Exits the program.","lastModifiedDate":"2020-05-23"},{"lineNumber":153,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":154,"author":{"gitId":"-"},"content":"Format: `exit`","lastModifiedDate":"2020-05-23"},{"lineNumber":155,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":156,"author":{"gitId":"-"},"content":"### Saving the data","lastModifiedDate":"2020-05-23"},{"lineNumber":157,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":158,"author":{"gitId":"-"},"content":"AddressBook data are saved in the hard disk automatically after any command that changes the data. There is no need to save manually.","lastModifiedDate":"2020-05-23"},{"lineNumber":159,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":160,"author":{"gitId":"-"},"content":"### Editing the data file","lastModifiedDate":"2021-02-04"},{"lineNumber":161,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2021-02-04"},{"lineNumber":162,"author":{"gitId":"-"},"content":"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.","lastModifiedDate":"2023-09-08"},{"lineNumber":163,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2021-02-04"},{"lineNumber":164,"author":{"gitId":"-"},"content":"\u003cdiv markdown\u003d\"span\" class\u003d\"alert alert-warning\"\u003e:exclamation: **Caution:**","lastModifiedDate":"2021-02-04"},{"lineNumber":165,"author":{"gitId":"-"},"content":"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.\u003cbr\u003e","lastModifiedDate":"2024-02-09"},{"lineNumber":166,"author":{"gitId":"-"},"content":"Furthermore, certain edits can cause the AddressBook to behave in unexpected ways (e.g., if a value entered is outside of the acceptable range). Therefore, edit the data file only if you are confident that you can update it correctly.","lastModifiedDate":"2024-02-09"},{"lineNumber":167,"author":{"gitId":"-"},"content":"\u003c/div\u003e","lastModifiedDate":"2021-02-04"},{"lineNumber":168,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2021-02-04"},{"lineNumber":169,"author":{"gitId":"-"},"content":"### Archiving data files `[coming in v2.0]`","lastModifiedDate":"2020-05-23"},{"lineNumber":170,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":171,"author":{"gitId":"-"},"content":"_Details coming soon ..._","lastModifiedDate":"2021-02-04"},{"lineNumber":172,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":173,"author":{"gitId":"-"},"content":"--------------------------------------------------------------------------------------------------------------------","lastModifiedDate":"2020-05-23"},{"lineNumber":174,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":175,"author":{"gitId":"-"},"content":"## FAQ","lastModifiedDate":"2020-05-23"},{"lineNumber":176,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":177,"author":{"gitId":"-"},"content":"**Q**: How do I transfer my data to another Computer?\u003cbr\u003e","lastModifiedDate":"2020-05-23"},{"lineNumber":178,"author":{"gitId":"-"},"content":"**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.","lastModifiedDate":"2020-05-23"},{"lineNumber":179,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":180,"author":{"gitId":"-"},"content":"--------------------------------------------------------------------------------------------------------------------","lastModifiedDate":"2020-05-23"},{"lineNumber":181,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":182,"author":{"gitId":"-"},"content":"## Known issues","lastModifiedDate":"2023-09-08"},{"lineNumber":183,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2023-09-08"},{"lineNumber":184,"author":{"gitId":"-"},"content":"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.","lastModifiedDate":"2023-09-08"},{"lineNumber":185,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2023-09-08"},{"lineNumber":186,"author":{"gitId":"-"},"content":"--------------------------------------------------------------------------------------------------------------------","lastModifiedDate":"2023-09-08"},{"lineNumber":187,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2023-09-08"},{"lineNumber":188,"author":{"gitId":"-"},"content":"## Command summary","lastModifiedDate":"2020-05-23"},{"lineNumber":189,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":190,"author":{"gitId":"-"},"content":"Action | Format, Examples","lastModifiedDate":"2020-05-23"},{"lineNumber":191,"author":{"gitId":"-"},"content":"--------|------------------","lastModifiedDate":"2020-05-23"},{"lineNumber":192,"author":{"gitId":"-"},"content":"**Add** | `add n/NAME p/PHONE_NUMBER e/EMAIL a/ADDRESS [t/TAG]…​` \u003cbr\u003e e.g., `add n/James Ho p/22224444 e/jamesho@example.com a/123, Clementi Rd, 1234665 t/friend t/colleague`","lastModifiedDate":"2020-05-23"},{"lineNumber":193,"author":{"gitId":"-"},"content":"**Clear** | `clear`","lastModifiedDate":"2020-05-23"},{"lineNumber":194,"author":{"gitId":"-"},"content":"**Delete** | `delete INDEX`\u003cbr\u003e e.g., `delete 3`","lastModifiedDate":"2020-05-23"},{"lineNumber":195,"author":{"gitId":"-"},"content":"**Edit** | `edit INDEX [n/NAME] [p/PHONE_NUMBER] [e/EMAIL] [a/ADDRESS] [t/TAG]…​`\u003cbr\u003e e.g.,`edit 2 n/James Lee e/jameslee@example.com`","lastModifiedDate":"2020-05-23"},{"lineNumber":196,"author":{"gitId":"-"},"content":"**Find** | `find KEYWORD [MORE_KEYWORDS]`\u003cbr\u003e e.g., `find James Jake`","lastModifiedDate":"2020-05-23"},{"lineNumber":197,"author":{"gitId":"-"},"content":"**List** | `list`","lastModifiedDate":"2020-05-23"},{"lineNumber":198,"author":{"gitId":"-"},"content":"**Help** | `help`","lastModifiedDate":"2020-05-23"}],"authorContributionMap":{"ryanlimdx":1,"-":197}},{"path":"docs/index.md","fileType":"docs","lines":[{"lineNumber":1,"author":{"gitId":"-"},"content":"---","lastModifiedDate":"2020-05-23"},{"lineNumber":2,"author":{"gitId":"-"},"content":"layout: page","lastModifiedDate":"2020-05-23"},{"lineNumber":3,"author":{"gitId":"-"},"content":"title: AddressBook Level-3","lastModifiedDate":"2020-05-23"},{"lineNumber":4,"author":{"gitId":"-"},"content":"---","lastModifiedDate":"2020-05-23"},{"lineNumber":5,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":6,"author":{"gitId":"ryanlimdx"},"content":"[![CI Status](https://github.com/se-edu/addressbook-level3/workflows/Java%20CI/badge.svg)](https://github.com/AY2324S2-CS2103T-F10-1/tp/actions)","lastModifiedDate":"2024-03-06"},{"lineNumber":7,"author":{"gitId":"-"},"content":"[![codecov](https://codecov.io/gh/se-edu/addressbook-level3/branch/master/graph/badge.svg)](https://codecov.io/gh/se-edu/addressbook-level3)","lastModifiedDate":"2020-08-07"},{"lineNumber":8,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":9,"author":{"gitId":"-"},"content":"![Ui](images/Ui.png)","lastModifiedDate":"2020-05-23"},{"lineNumber":10,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":11,"author":{"gitId":"-"},"content":"**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).","lastModifiedDate":"2020-05-23"},{"lineNumber":12,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":13,"author":{"gitId":"-"},"content":"* If you are interested in using AddressBook, head over to the [_Quick Start_ section of the **User Guide**](UserGuide.html#quick-start).","lastModifiedDate":"2020-05-23"},{"lineNumber":14,"author":{"gitId":"-"},"content":"* If you are interested about developing AddressBook, the [**Developer Guide**](DeveloperGuide.html) is a good place to start.","lastModifiedDate":"2020-05-23"},{"lineNumber":15,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":16,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":17,"author":{"gitId":"-"},"content":"**Acknowledgements**","lastModifiedDate":"2020-05-23"},{"lineNumber":18,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":19,"author":{"gitId":"-"},"content":"* Libraries used: [JavaFX](https://openjfx.io/), [Jackson](https://github.com/FasterXML/jackson), [JUnit5](https://github.com/junit-team/junit5)","lastModifiedDate":"2020-05-23"},{"lineNumber":20,"author":{"gitId":"ryanlimdx"},"content":"* This project is based on the AddressBook-Level3 project created by the [SE-EDU initiative](https://se-education.org).","lastModifiedDate":"2024-03-06"}],"authorContributionMap":{"ryanlimdx":2,"-":18}}] +[{"path":"README.md","fileType":"docs","lines":[{"lineNumber":1,"author":{"gitId":"iamtr"},"content":"[![CI Status](https://github.com/AY2324S2-CS2103T-F10-1/tp/workflows/Java%20CI/badge.svg)](https://github.com/AY2324S2-CS2103T-F10-1/tp/actions)","lastModifiedDate":"2024-03-07"},{"lineNumber":2,"author":{"gitId":"iamtr"},"content":"![codecov](https://codecov.io/gh/AY2324S2-CS2103T-F10-1/tp/branch/master/graph/badge.svg)","lastModifiedDate":"2024-03-07"},{"lineNumber":3,"author":{"gitId":"iamtr"},"content":"","lastModifiedDate":"2024-03-07"},{"lineNumber":4,"author":{"gitId":"iamtr"},"content":"![Ui](docs/images/Ui.png)","lastModifiedDate":"2024-03-07"},{"lineNumber":5,"author":{"gitId":"iamtr"},"content":"","lastModifiedDate":"2024-03-07"},{"lineNumber":6,"author":{"gitId":"-"},"content":"# Nursing Address Book","lastModifiedDate":"2024-02-21"},{"lineNumber":7,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":8,"author":{"gitId":"-"},"content":"Target user:","lastModifiedDate":"2024-03-07"},{"lineNumber":9,"author":{"gitId":"-"},"content":"Our target group is Ward Nurses. This product is for users who prefer typing quickly while having quick access to critical patient information fast.","lastModifiedDate":"2024-03-07"},{"lineNumber":10,"author":{"gitId":"iamtr"},"content":"","lastModifiedDate":"2024-03-07"},{"lineNumber":11,"author":{"gitId":"-"},"content":"Value proposition:","lastModifiedDate":"2024-03-07"},{"lineNumber":12,"author":{"gitId":"iamtr"},"content":"Streamlined text-based commands to manage contacts faster than a typical mouse/GUI driven app","lastModifiedDate":"2024-03-07"},{"lineNumber":13,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2024-03-07"},{"lineNumber":14,"author":{"gitId":"iamtr"},"content":"_This project is based on the AddressBook-Level3 project created by the [SE-EDU initiative](https://se-education.org)._","lastModifiedDate":"2024-03-07"}],"authorContributionMap":{"iamtr":8,"-":6}},{"path":"docs/AboutUs.md","fileType":"docs","lines":[{"lineNumber":1,"author":{"gitId":"-"},"content":"---","lastModifiedDate":"2020-05-23"},{"lineNumber":2,"author":{"gitId":"-"},"content":"layout: page","lastModifiedDate":"2020-05-23"},{"lineNumber":3,"author":{"gitId":"-"},"content":"title: About Us","lastModifiedDate":"2020-05-23"},{"lineNumber":4,"author":{"gitId":"-"},"content":"---","lastModifiedDate":"2020-05-23"},{"lineNumber":5,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":6,"author":{"gitId":"-"},"content":"We are a team based in the [School of Computing, National University of Singapore](http://www.comp.nus.edu.sg).","lastModifiedDate":"2020-05-23"},{"lineNumber":7,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":8,"author":{"gitId":"-"},"content":"You can reach us at the email `seer[at]comp.nus.edu.sg`","lastModifiedDate":"2020-06-17"},{"lineNumber":9,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-06-17"},{"lineNumber":10,"author":{"gitId":"-"},"content":"## Project team","lastModifiedDate":"2020-06-07"},{"lineNumber":11,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":12,"author":{"gitId":"erv-teo"},"content":"### Ong Tze Jet","lastModifiedDate":"2024-03-07"},{"lineNumber":13,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":14,"author":{"gitId":"erv-teo"},"content":"\u003cimg src\u003d\"images/iamtr.png\" width\u003d\"200px\"\u003e","lastModifiedDate":"2024-03-07"},{"lineNumber":15,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":16,"author":{"gitId":"-"},"content":"[[homepage](http://www.comp.nus.edu.sg/~damithch)]","lastModifiedDate":"2020-05-23"},{"lineNumber":17,"author":{"gitId":"erv-teo"},"content":"[[github](https://github.com/iamtr)]","lastModifiedDate":"2024-03-07"},{"lineNumber":18,"author":{"gitId":"-"},"content":"[[portfolio](team/johndoe.md)]","lastModifiedDate":"2020-05-23"},{"lineNumber":19,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":20,"author":{"gitId":"-"},"content":"* Role: Project Advisor","lastModifiedDate":"2020-05-23"},{"lineNumber":21,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":22,"author":{"gitId":"erv-teo"},"content":"### An Eu Jin","lastModifiedDate":"2024-03-07"},{"lineNumber":23,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":24,"author":{"gitId":"erv-teo"},"content":"\u003cimg src\u003d\"images/ejnan.png\" width\u003d\"200px\"\u003e","lastModifiedDate":"2024-03-07"},{"lineNumber":25,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":26,"author":{"gitId":"erv-teo"},"content":"[[github](http://github.com/ejnan)]","lastModifiedDate":"2024-03-07"},{"lineNumber":27,"author":{"gitId":"-"},"content":"[[portfolio](team/johndoe.md)]","lastModifiedDate":"2020-05-23"},{"lineNumber":28,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":29,"author":{"gitId":"-"},"content":"* Role: Team Lead","lastModifiedDate":"2020-05-23"},{"lineNumber":30,"author":{"gitId":"-"},"content":"* Responsibilities: UI","lastModifiedDate":"2020-05-23"},{"lineNumber":31,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":32,"author":{"gitId":"erv-teo"},"content":"### Ryan Lim Ding Xuan","lastModifiedDate":"2024-03-07"},{"lineNumber":33,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":34,"author":{"gitId":"erv-teo"},"content":"\u003cimg src\u003d\"images/ryanlimdx.png\" width\u003d\"200px\"\u003e","lastModifiedDate":"2024-03-07"},{"lineNumber":35,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":36,"author":{"gitId":"erv-teo"},"content":"[[github](http://github.com/ryanlimdx)] [[portfolio](team/johndoe.md)]","lastModifiedDate":"2024-03-07"},{"lineNumber":37,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":38,"author":{"gitId":"-"},"content":"* Role: Developer","lastModifiedDate":"2020-05-23"},{"lineNumber":39,"author":{"gitId":"-"},"content":"* Responsibilities: Data","lastModifiedDate":"2020-05-23"},{"lineNumber":40,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":41,"author":{"gitId":"erv-teo"},"content":"### Tan Shao Wei","lastModifiedDate":"2024-03-07"},{"lineNumber":42,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":43,"author":{"gitId":"erv-teo"},"content":"\u003cimg src\u003d\"images/swtan346.png\" width\u003d\"200px\"\u003e","lastModifiedDate":"2024-03-07"},{"lineNumber":44,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":45,"author":{"gitId":"erv-teo"},"content":"[[github](http://github.com/swtan346)]","lastModifiedDate":"2024-03-07"},{"lineNumber":46,"author":{"gitId":"-"},"content":"[[portfolio](team/johndoe.md)]","lastModifiedDate":"2020-05-23"},{"lineNumber":47,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":48,"author":{"gitId":"-"},"content":"* Role: Developer","lastModifiedDate":"2020-05-23"},{"lineNumber":49,"author":{"gitId":"-"},"content":"* Responsibilities: Dev Ops + Threading","lastModifiedDate":"2020-05-23"},{"lineNumber":50,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":51,"author":{"gitId":"erv-teo"},"content":"### Ervin Teo Jun Xiong","lastModifiedDate":"2024-03-07"},{"lineNumber":52,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":53,"author":{"gitId":"erv-teo"},"content":"\u003cimg src\u003d\"images/erv-teo.png\" width\u003d\"200px\"\u003e","lastModifiedDate":"2024-03-07"},{"lineNumber":54,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":55,"author":{"gitId":"erv-teo"},"content":"[[github](http://github.com/erv-teo)]","lastModifiedDate":"2024-03-07"},{"lineNumber":56,"author":{"gitId":"-"},"content":"[[portfolio](team/johndoe.md)]","lastModifiedDate":"2020-05-23"},{"lineNumber":57,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":58,"author":{"gitId":"-"},"content":"* Role: Developer","lastModifiedDate":"2020-05-23"},{"lineNumber":59,"author":{"gitId":"-"},"content":"* Responsibilities: UI","lastModifiedDate":"2020-05-23"}],"authorContributionMap":{"erv-teo":15,"-":44}},{"path":"docs/DeveloperGuide.md","fileType":"docs","lines":[{"lineNumber":1,"author":{"gitId":"-"},"content":"---","lastModifiedDate":"2020-05-23"},{"lineNumber":2,"author":{"gitId":"-"},"content":"layout: page","lastModifiedDate":"2020-05-23"},{"lineNumber":3,"author":{"gitId":"-"},"content":"title: Developer Guide","lastModifiedDate":"2020-05-23"},{"lineNumber":4,"author":{"gitId":"-"},"content":"---","lastModifiedDate":"2020-05-23"},{"lineNumber":5,"author":{"gitId":"-"},"content":"* Table of Contents","lastModifiedDate":"2020-05-23"},{"lineNumber":6,"author":{"gitId":"-"},"content":"{:toc}","lastModifiedDate":"2020-05-23"},{"lineNumber":7,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":8,"author":{"gitId":"-"},"content":"--------------------------------------------------------------------------------------------------------------------","lastModifiedDate":"2020-05-23"},{"lineNumber":9,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2021-07-30"},{"lineNumber":10,"author":{"gitId":"-"},"content":"## **Acknowledgements**","lastModifiedDate":"2021-07-30"},{"lineNumber":11,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2021-07-30"},{"lineNumber":12,"author":{"gitId":"-"},"content":"* {list here sources of all reused/adapted ideas, code, documentation, and third-party libraries -- include links to the original source as well}","lastModifiedDate":"2021-07-30"},{"lineNumber":13,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2021-07-30"},{"lineNumber":14,"author":{"gitId":"-"},"content":"--------------------------------------------------------------------------------------------------------------------","lastModifiedDate":"2021-07-30"},{"lineNumber":15,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":16,"author":{"gitId":"-"},"content":"## **Setting up, getting started**","lastModifiedDate":"2020-05-23"},{"lineNumber":17,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":18,"author":{"gitId":"-"},"content":"Refer to the guide [_Setting up and getting started_](SettingUp.md).","lastModifiedDate":"2020-05-23"},{"lineNumber":19,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":20,"author":{"gitId":"-"},"content":"--------------------------------------------------------------------------------------------------------------------","lastModifiedDate":"2020-05-23"},{"lineNumber":21,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":22,"author":{"gitId":"-"},"content":"## **Design**","lastModifiedDate":"2020-05-23"},{"lineNumber":23,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":24,"author":{"gitId":"-"},"content":"\u003cdiv markdown\u003d\"span\" class\u003d\"alert alert-primary\"\u003e","lastModifiedDate":"2021-07-31"},{"lineNumber":25,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":26,"author":{"gitId":"-"},"content":":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.","lastModifiedDate":"2023-09-03"},{"lineNumber":27,"author":{"gitId":"-"},"content":"\u003c/div\u003e","lastModifiedDate":"2021-07-31"},{"lineNumber":28,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":29,"author":{"gitId":"-"},"content":"### Architecture","lastModifiedDate":"2021-07-31"},{"lineNumber":30,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":31,"author":{"gitId":"-"},"content":"\u003cimg src\u003d\"images/ArchitectureDiagram.png\" width\u003d\"280\" /\u003e","lastModifiedDate":"2021-07-31"},{"lineNumber":32,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":33,"author":{"gitId":"-"},"content":"The ***Architecture Diagram*** given above explains the high-level design of the App.","lastModifiedDate":"2021-07-31"},{"lineNumber":34,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":35,"author":{"gitId":"-"},"content":"Given below is a quick overview of main components and how they interact with each other.","lastModifiedDate":"2021-07-31"},{"lineNumber":36,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2021-07-31"},{"lineNumber":37,"author":{"gitId":"-"},"content":"**Main components of the architecture**","lastModifiedDate":"2021-07-31"},{"lineNumber":38,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":39,"author":{"gitId":"-"},"content":"**`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.","lastModifiedDate":"2023-09-03"},{"lineNumber":40,"author":{"gitId":"-"},"content":"* At app launch, it initializes the other components in the correct sequence, and connects them up with each other.","lastModifiedDate":"2023-09-03"},{"lineNumber":41,"author":{"gitId":"-"},"content":"* At shut down, it shuts down the other components and invokes cleanup methods where necessary.","lastModifiedDate":"2023-09-03"},{"lineNumber":42,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":43,"author":{"gitId":"-"},"content":"The bulk of the app\u0027s work is done by the following four components:","lastModifiedDate":"2023-09-03"},{"lineNumber":44,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":45,"author":{"gitId":"-"},"content":"* [**`UI`**](#ui-component): The UI of the App.","lastModifiedDate":"2020-05-23"},{"lineNumber":46,"author":{"gitId":"-"},"content":"* [**`Logic`**](#logic-component): The command executor.","lastModifiedDate":"2020-05-23"},{"lineNumber":47,"author":{"gitId":"-"},"content":"* [**`Model`**](#model-component): Holds the data of the App in memory.","lastModifiedDate":"2020-05-23"},{"lineNumber":48,"author":{"gitId":"-"},"content":"* [**`Storage`**](#storage-component): Reads data from, and writes data to, the hard disk.","lastModifiedDate":"2020-05-23"},{"lineNumber":49,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":50,"author":{"gitId":"-"},"content":"[**`Commons`**](#common-classes) represents a collection of classes used by multiple other components.","lastModifiedDate":"2023-09-03"},{"lineNumber":51,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":52,"author":{"gitId":"-"},"content":"**How the architecture components interact with each other**","lastModifiedDate":"2020-05-23"},{"lineNumber":53,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":54,"author":{"gitId":"-"},"content":"The *Sequence Diagram* below shows how the components interact with each other for the scenario where the user issues the command `delete 1`.","lastModifiedDate":"2020-05-23"},{"lineNumber":55,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":56,"author":{"gitId":"-"},"content":"\u003cimg src\u003d\"images/ArchitectureSequenceDiagram.png\" width\u003d\"574\" /\u003e","lastModifiedDate":"2020-06-07"},{"lineNumber":57,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":58,"author":{"gitId":"-"},"content":"Each of the four main components (also shown in the diagram above),","lastModifiedDate":"2021-07-31"},{"lineNumber":59,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2021-07-31"},{"lineNumber":60,"author":{"gitId":"-"},"content":"* defines its *API* in an `interface` with the same name as the Component.","lastModifiedDate":"2021-07-31"},{"lineNumber":61,"author":{"gitId":"-"},"content":"* implements its functionality using a concrete `{Component Name}Manager` class (which follows the corresponding API `interface` mentioned in the previous point.","lastModifiedDate":"2021-07-31"},{"lineNumber":62,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2021-07-31"},{"lineNumber":63,"author":{"gitId":"-"},"content":"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\u0027s being coupled to the implementation of a component), as illustrated in the (partial) class diagram below.","lastModifiedDate":"2021-07-31"},{"lineNumber":64,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2021-07-31"},{"lineNumber":65,"author":{"gitId":"-"},"content":"\u003cimg src\u003d\"images/ComponentManagers.png\" width\u003d\"300\" /\u003e","lastModifiedDate":"2021-07-31"},{"lineNumber":66,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2021-07-31"},{"lineNumber":67,"author":{"gitId":"-"},"content":"The sections below give more details of each component.","lastModifiedDate":"2020-05-23"},{"lineNumber":68,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":69,"author":{"gitId":"-"},"content":"### UI component","lastModifiedDate":"2020-05-23"},{"lineNumber":70,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":71,"author":{"gitId":"-"},"content":"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)","lastModifiedDate":"2021-07-31"},{"lineNumber":72,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":73,"author":{"gitId":"-"},"content":"![Structure of the UI Component](images/UiClassDiagram.png)","lastModifiedDate":"2021-07-31"},{"lineNumber":74,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":75,"author":{"gitId":"-"},"content":"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.","lastModifiedDate":"2021-07-31"},{"lineNumber":76,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":77,"author":{"gitId":"-"},"content":"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)","lastModifiedDate":"2021-07-31"},{"lineNumber":78,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":79,"author":{"gitId":"-"},"content":"The `UI` component,","lastModifiedDate":"2020-05-23"},{"lineNumber":80,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":81,"author":{"gitId":"-"},"content":"* executes user commands using the `Logic` component.","lastModifiedDate":"2021-07-31"},{"lineNumber":82,"author":{"gitId":"-"},"content":"* listens for changes to `Model` data so that the UI can be updated with the modified data.","lastModifiedDate":"2021-07-31"},{"lineNumber":83,"author":{"gitId":"-"},"content":"* keeps a reference to the `Logic` component, because the `UI` relies on the `Logic` to execute commands.","lastModifiedDate":"2021-07-31"},{"lineNumber":84,"author":{"gitId":"-"},"content":"* depends on some classes in the `Model` component, as it displays `Person` object residing in the `Model`.","lastModifiedDate":"2021-07-31"},{"lineNumber":85,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":86,"author":{"gitId":"-"},"content":"### Logic component","lastModifiedDate":"2020-05-23"},{"lineNumber":87,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":88,"author":{"gitId":"-"},"content":"**API** : [`Logic.java`](https://github.com/se-edu/addressbook-level3/tree/master/src/main/java/seedu/address/logic/Logic.java)","lastModifiedDate":"2021-07-31"},{"lineNumber":89,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":90,"author":{"gitId":"-"},"content":"Here\u0027s a (partial) class diagram of the `Logic` component:","lastModifiedDate":"2021-07-31"},{"lineNumber":91,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":92,"author":{"gitId":"-"},"content":"\u003cimg src\u003d\"images/LogicClassDiagram.png\" width\u003d\"550\"/\u003e","lastModifiedDate":"2021-07-31"},{"lineNumber":93,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":94,"author":{"gitId":"-"},"content":"The sequence diagram below illustrates the interactions within the `Logic` component, taking `execute(\"delete 1\")` API call as an example.","lastModifiedDate":"2023-09-03"},{"lineNumber":95,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":96,"author":{"gitId":"-"},"content":"![Interactions Inside the Logic Component for the `delete 1` Command](images/DeleteSequenceDiagram.png)","lastModifiedDate":"2020-05-23"},{"lineNumber":97,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":98,"author":{"gitId":"-"},"content":"\u003cdiv markdown\u003d\"span\" class\u003d\"alert alert-info\"\u003e:information_source: **Note:** The lifeline for `DeleteCommandParser` should end at the destroy marker (X) but due to a limitation of PlantUML, the lifeline continues till the end of diagram.","lastModifiedDate":"2024-02-09"},{"lineNumber":99,"author":{"gitId":"-"},"content":"\u003c/div\u003e","lastModifiedDate":"2020-05-23"},{"lineNumber":100,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":101,"author":{"gitId":"-"},"content":"How the `Logic` component works:","lastModifiedDate":"2023-09-03"},{"lineNumber":102,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2023-09-03"},{"lineNumber":103,"author":{"gitId":"-"},"content":"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.","lastModifiedDate":"2023-09-03"},{"lineNumber":104,"author":{"gitId":"-"},"content":"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`.","lastModifiedDate":"2023-09-03"},{"lineNumber":105,"author":{"gitId":"-"},"content":"1. The command can communicate with the `Model` when it is executed (e.g. to delete a person).\u003cbr\u003e","lastModifiedDate":"2024-02-09"},{"lineNumber":106,"author":{"gitId":"-"},"content":" Note that although this is shown as a single step in the diagram above (for simplicity), in the code it can take several interactions (between the command object and the `Model`) to achieve.","lastModifiedDate":"2024-02-09"},{"lineNumber":107,"author":{"gitId":"-"},"content":"1. The result of the command execution is encapsulated as a `CommandResult` object which is returned back from `Logic`.","lastModifiedDate":"2023-09-03"},{"lineNumber":108,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2023-09-03"},{"lineNumber":109,"author":{"gitId":"-"},"content":"Here are the other classes in `Logic` (omitted from the class diagram above) that are used for parsing a user command:","lastModifiedDate":"2021-07-31"},{"lineNumber":110,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2021-07-31"},{"lineNumber":111,"author":{"gitId":"-"},"content":"\u003cimg src\u003d\"images/ParserClasses.png\" width\u003d\"600\"/\u003e","lastModifiedDate":"2021-07-31"},{"lineNumber":112,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":113,"author":{"gitId":"-"},"content":"How the parsing works:","lastModifiedDate":"2021-07-31"},{"lineNumber":114,"author":{"gitId":"-"},"content":"* 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.","lastModifiedDate":"2021-07-31"},{"lineNumber":115,"author":{"gitId":"-"},"content":"* 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.","lastModifiedDate":"2021-07-31"},{"lineNumber":116,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":117,"author":{"gitId":"-"},"content":"### Model component","lastModifiedDate":"2021-07-31"},{"lineNumber":118,"author":{"gitId":"-"},"content":"**API** : [`Model.java`](https://github.com/se-edu/addressbook-level3/tree/master/src/main/java/seedu/address/model/Model.java)","lastModifiedDate":"2020-05-23"},{"lineNumber":119,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":120,"author":{"gitId":"-"},"content":"\u003cimg src\u003d\"images/ModelClassDiagram.png\" width\u003d\"450\" /\u003e","lastModifiedDate":"2021-07-31"},{"lineNumber":121,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":122,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":123,"author":{"gitId":"-"},"content":"The `Model` component,","lastModifiedDate":"2021-07-31"},{"lineNumber":124,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":125,"author":{"gitId":"-"},"content":"* stores the address book data i.e., all `Person` objects (which are contained in a `UniquePersonList` object).","lastModifiedDate":"2021-07-31"},{"lineNumber":126,"author":{"gitId":"-"},"content":"* stores the currently \u0027selected\u0027 `Person` objects (e.g., results of a search query) as a separate _filtered_ list which is exposed to outsiders as an unmodifiable `ObservableList\u003cPerson\u003e` that can be \u0027observed\u0027 e.g. the UI can be bound to this list so that the UI automatically updates when the data in the list change.","lastModifiedDate":"2021-07-31"},{"lineNumber":127,"author":{"gitId":"-"},"content":"* stores a `UserPref` object that represents the user’s preferences. This is exposed to the outside as a `ReadOnlyUserPref` objects.","lastModifiedDate":"2021-07-31"},{"lineNumber":128,"author":{"gitId":"-"},"content":"* 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)","lastModifiedDate":"2021-07-31"},{"lineNumber":129,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2021-07-31"},{"lineNumber":130,"author":{"gitId":"-"},"content":"\u003cdiv markdown\u003d\"span\" class\u003d\"alert alert-info\"\u003e: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.\u003cbr\u003e","lastModifiedDate":"2021-07-31"},{"lineNumber":131,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2021-07-31"},{"lineNumber":132,"author":{"gitId":"-"},"content":"\u003cimg src\u003d\"images/BetterModelClassDiagram.png\" width\u003d\"450\" /\u003e","lastModifiedDate":"2021-07-31"},{"lineNumber":133,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":134,"author":{"gitId":"-"},"content":"\u003c/div\u003e","lastModifiedDate":"2020-05-23"},{"lineNumber":135,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":136,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":137,"author":{"gitId":"-"},"content":"### Storage component","lastModifiedDate":"2020-05-23"},{"lineNumber":138,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":139,"author":{"gitId":"-"},"content":"**API** : [`Storage.java`](https://github.com/se-edu/addressbook-level3/tree/master/src/main/java/seedu/address/storage/Storage.java)","lastModifiedDate":"2020-05-23"},{"lineNumber":140,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":141,"author":{"gitId":"-"},"content":"\u003cimg src\u003d\"images/StorageClassDiagram.png\" width\u003d\"550\" /\u003e","lastModifiedDate":"2021-07-31"},{"lineNumber":142,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2021-07-31"},{"lineNumber":143,"author":{"gitId":"-"},"content":"The `Storage` component,","lastModifiedDate":"2020-05-23"},{"lineNumber":144,"author":{"gitId":"-"},"content":"* can save both address book data and user preference data in JSON format, and read them back into corresponding objects.","lastModifiedDate":"2023-09-03"},{"lineNumber":145,"author":{"gitId":"-"},"content":"* inherits from both `AddressBookStorage` and `UserPrefStorage`, which means it can be treated as either one (if only the functionality of only one is needed).","lastModifiedDate":"2021-07-31"},{"lineNumber":146,"author":{"gitId":"-"},"content":"* depends on some classes in the `Model` component (because the `Storage` component\u0027s job is to save/retrieve objects that belong to the `Model`)","lastModifiedDate":"2021-07-21"},{"lineNumber":147,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":148,"author":{"gitId":"-"},"content":"### Common classes","lastModifiedDate":"2020-05-23"},{"lineNumber":149,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":150,"author":{"gitId":"-"},"content":"Classes used by multiple components are in the `seedu.addressbook.commons` package.","lastModifiedDate":"2020-05-23"},{"lineNumber":151,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":152,"author":{"gitId":"-"},"content":"--------------------------------------------------------------------------------------------------------------------","lastModifiedDate":"2020-05-23"},{"lineNumber":153,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":154,"author":{"gitId":"-"},"content":"## **Implementation**","lastModifiedDate":"2020-05-23"},{"lineNumber":155,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":156,"author":{"gitId":"-"},"content":"This section describes some noteworthy details on how certain features are implemented.","lastModifiedDate":"2020-05-23"},{"lineNumber":157,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":158,"author":{"gitId":"-"},"content":"### \\[Proposed\\] Undo/redo feature","lastModifiedDate":"2020-06-07"},{"lineNumber":159,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":160,"author":{"gitId":"-"},"content":"#### Proposed Implementation","lastModifiedDate":"2020-05-23"},{"lineNumber":161,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":162,"author":{"gitId":"-"},"content":"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:","lastModifiedDate":"2020-05-23"},{"lineNumber":163,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":164,"author":{"gitId":"-"},"content":"* `VersionedAddressBook#commit()` — Saves the current address book state in its history.","lastModifiedDate":"2020-05-23"},{"lineNumber":165,"author":{"gitId":"-"},"content":"* `VersionedAddressBook#undo()` — Restores the previous address book state from its history.","lastModifiedDate":"2020-05-23"},{"lineNumber":166,"author":{"gitId":"-"},"content":"* `VersionedAddressBook#redo()` — Restores a previously undone address book state from its history.","lastModifiedDate":"2020-05-23"},{"lineNumber":167,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":168,"author":{"gitId":"-"},"content":"These operations are exposed in the `Model` interface as `Model#commitAddressBook()`, `Model#undoAddressBook()` and `Model#redoAddressBook()` respectively.","lastModifiedDate":"2020-05-23"},{"lineNumber":169,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":170,"author":{"gitId":"-"},"content":"Given below is an example usage scenario and how the undo/redo mechanism behaves at each step.","lastModifiedDate":"2020-05-23"},{"lineNumber":171,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":172,"author":{"gitId":"-"},"content":"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.","lastModifiedDate":"2020-05-23"},{"lineNumber":173,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":174,"author":{"gitId":"-"},"content":"![UndoRedoState0](images/UndoRedoState0.png)","lastModifiedDate":"2020-05-23"},{"lineNumber":175,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":176,"author":{"gitId":"-"},"content":"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.","lastModifiedDate":"2020-05-23"},{"lineNumber":177,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":178,"author":{"gitId":"-"},"content":"![UndoRedoState1](images/UndoRedoState1.png)","lastModifiedDate":"2020-05-23"},{"lineNumber":179,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":180,"author":{"gitId":"-"},"content":"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`.","lastModifiedDate":"2020-05-23"},{"lineNumber":181,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":182,"author":{"gitId":"-"},"content":"![UndoRedoState2](images/UndoRedoState2.png)","lastModifiedDate":"2020-05-23"},{"lineNumber":183,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":184,"author":{"gitId":"-"},"content":"\u003cdiv markdown\u003d\"span\" class\u003d\"alert alert-info\"\u003e: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`.","lastModifiedDate":"2020-05-23"},{"lineNumber":185,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":186,"author":{"gitId":"-"},"content":"\u003c/div\u003e","lastModifiedDate":"2020-05-23"},{"lineNumber":187,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":188,"author":{"gitId":"-"},"content":"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.","lastModifiedDate":"2020-05-23"},{"lineNumber":189,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":190,"author":{"gitId":"-"},"content":"![UndoRedoState3](images/UndoRedoState3.png)","lastModifiedDate":"2020-05-23"},{"lineNumber":191,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":192,"author":{"gitId":"-"},"content":"\u003cdiv markdown\u003d\"span\" class\u003d\"alert alert-info\"\u003e: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","lastModifiedDate":"2020-05-23"},{"lineNumber":193,"author":{"gitId":"-"},"content":"than attempting to perform the undo.","lastModifiedDate":"2020-05-23"},{"lineNumber":194,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":195,"author":{"gitId":"-"},"content":"\u003c/div\u003e","lastModifiedDate":"2020-05-23"},{"lineNumber":196,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":197,"author":{"gitId":"-"},"content":"The following sequence diagram shows how an undo operation goes through the `Logic` component:","lastModifiedDate":"2024-02-09"},{"lineNumber":198,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":199,"author":{"gitId":"-"},"content":"![UndoSequenceDiagram](images/UndoSequenceDiagram-Logic.png)","lastModifiedDate":"2024-02-09"},{"lineNumber":200,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":201,"author":{"gitId":"-"},"content":"\u003cdiv markdown\u003d\"span\" class\u003d\"alert alert-info\"\u003e: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.","lastModifiedDate":"2020-05-23"},{"lineNumber":202,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":203,"author":{"gitId":"-"},"content":"\u003c/div\u003e","lastModifiedDate":"2020-05-23"},{"lineNumber":204,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":205,"author":{"gitId":"-"},"content":"Similarly, how an undo operation goes through the `Model` component is shown below:","lastModifiedDate":"2024-02-09"},{"lineNumber":206,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2024-02-09"},{"lineNumber":207,"author":{"gitId":"-"},"content":"![UndoSequenceDiagram](images/UndoSequenceDiagram-Model.png)","lastModifiedDate":"2024-02-09"},{"lineNumber":208,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2024-02-09"},{"lineNumber":209,"author":{"gitId":"-"},"content":"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.","lastModifiedDate":"2020-05-23"},{"lineNumber":210,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":211,"author":{"gitId":"-"},"content":"\u003cdiv markdown\u003d\"span\" class\u003d\"alert alert-info\"\u003e: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.","lastModifiedDate":"2020-05-23"},{"lineNumber":212,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":213,"author":{"gitId":"-"},"content":"\u003c/div\u003e","lastModifiedDate":"2020-05-23"},{"lineNumber":214,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":215,"author":{"gitId":"-"},"content":"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.","lastModifiedDate":"2020-05-23"},{"lineNumber":216,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":217,"author":{"gitId":"-"},"content":"![UndoRedoState4](images/UndoRedoState4.png)","lastModifiedDate":"2020-05-23"},{"lineNumber":218,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":219,"author":{"gitId":"-"},"content":"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.","lastModifiedDate":"2020-05-23"},{"lineNumber":220,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":221,"author":{"gitId":"-"},"content":"![UndoRedoState5](images/UndoRedoState5.png)","lastModifiedDate":"2020-05-23"},{"lineNumber":222,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":223,"author":{"gitId":"-"},"content":"The following activity diagram summarizes what happens when a user executes a new command:","lastModifiedDate":"2020-05-23"},{"lineNumber":224,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":225,"author":{"gitId":"-"},"content":"\u003cimg src\u003d\"images/CommitActivityDiagram.png\" width\u003d\"250\" /\u003e","lastModifiedDate":"2021-07-31"},{"lineNumber":226,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":227,"author":{"gitId":"-"},"content":"#### Design considerations:","lastModifiedDate":"2021-07-31"},{"lineNumber":228,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":229,"author":{"gitId":"-"},"content":"**Aspect: How undo \u0026 redo executes:**","lastModifiedDate":"2021-07-31"},{"lineNumber":230,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":231,"author":{"gitId":"-"},"content":"* **Alternative 1 (current choice):** Saves the entire address book.","lastModifiedDate":"2020-05-23"},{"lineNumber":232,"author":{"gitId":"-"},"content":" * Pros: Easy to implement.","lastModifiedDate":"2020-05-23"},{"lineNumber":233,"author":{"gitId":"-"},"content":" * Cons: May have performance issues in terms of memory usage.","lastModifiedDate":"2020-05-23"},{"lineNumber":234,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":235,"author":{"gitId":"-"},"content":"* **Alternative 2:** Individual command knows how to undo/redo by","lastModifiedDate":"2020-05-23"},{"lineNumber":236,"author":{"gitId":"-"},"content":" itself.","lastModifiedDate":"2020-05-23"},{"lineNumber":237,"author":{"gitId":"-"},"content":" * Pros: Will use less memory (e.g. for `delete`, just save the person being deleted).","lastModifiedDate":"2020-05-23"},{"lineNumber":238,"author":{"gitId":"-"},"content":" * Cons: We must ensure that the implementation of each individual command are correct.","lastModifiedDate":"2020-05-23"},{"lineNumber":239,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":240,"author":{"gitId":"-"},"content":"_{more aspects and alternatives to be added}_","lastModifiedDate":"2020-05-23"},{"lineNumber":241,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":242,"author":{"gitId":"-"},"content":"### \\[Proposed\\] Data archiving","lastModifiedDate":"2020-05-23"},{"lineNumber":243,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":244,"author":{"gitId":"-"},"content":"_{Explain here how the data archiving feature will be implemented}_","lastModifiedDate":"2020-05-23"},{"lineNumber":245,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":246,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":247,"author":{"gitId":"-"},"content":"--------------------------------------------------------------------------------------------------------------------","lastModifiedDate":"2020-05-23"},{"lineNumber":248,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":249,"author":{"gitId":"-"},"content":"## **Documentation, logging, testing, configuration, dev-ops**","lastModifiedDate":"2020-06-07"},{"lineNumber":250,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":251,"author":{"gitId":"-"},"content":"* [Documentation guide](Documentation.md)","lastModifiedDate":"2020-06-07"},{"lineNumber":252,"author":{"gitId":"-"},"content":"* [Testing guide](Testing.md)","lastModifiedDate":"2020-06-07"},{"lineNumber":253,"author":{"gitId":"-"},"content":"* [Logging guide](Logging.md)","lastModifiedDate":"2020-06-07"},{"lineNumber":254,"author":{"gitId":"-"},"content":"* [Configuration guide](Configuration.md)","lastModifiedDate":"2020-06-07"},{"lineNumber":255,"author":{"gitId":"-"},"content":"* [DevOps guide](DevOps.md)","lastModifiedDate":"2020-06-07"},{"lineNumber":256,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":257,"author":{"gitId":"-"},"content":"--------------------------------------------------------------------------------------------------------------------","lastModifiedDate":"2020-05-23"},{"lineNumber":258,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":259,"author":{"gitId":"-"},"content":"## **Appendix: Requirements**","lastModifiedDate":"2020-05-23"},{"lineNumber":260,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":261,"author":{"gitId":"-"},"content":"### Product scope","lastModifiedDate":"2020-05-23"},{"lineNumber":262,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":263,"author":{"gitId":"-"},"content":"**Target user profile**:","lastModifiedDate":"2020-05-23"},{"lineNumber":264,"author":{"gitId":"ejnan"},"content":"Ward nurses","lastModifiedDate":"2024-03-07"},{"lineNumber":265,"author":{"gitId":"ejnan"},"content":"* manage a significant number of patient contacts with varying details","lastModifiedDate":"2024-03-07"},{"lineNumber":266,"author":{"gitId":"ejnan"},"content":"* quickly access critical patient information in time-sensitive situations","lastModifiedDate":"2024-03-07"},{"lineNumber":267,"author":{"gitId":"ejnan"},"content":"* track and log details of care administered to each patient over time","lastModifiedDate":"2024-03-07"},{"lineNumber":268,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":269,"author":{"gitId":"ejnan"},"content":"**Preferences/ Skills**","lastModifiedDate":"2024-03-07"},{"lineNumber":270,"author":{"gitId":"-"},"content":"* prefer desktop apps over other types","lastModifiedDate":"2020-05-23"},{"lineNumber":271,"author":{"gitId":"-"},"content":"* can type fast","lastModifiedDate":"2020-05-23"},{"lineNumber":272,"author":{"gitId":"-"},"content":"* prefers typing to mouse interactions","lastModifiedDate":"2020-05-26"},{"lineNumber":273,"author":{"gitId":"ejnan"},"content":"* is reasonably comfortable using CLI (command-line interface) apps","lastModifiedDate":"2024-03-08"},{"lineNumber":274,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":275,"author":{"gitId":"ejnan"},"content":"**Value proposition**: streamlined text-based commands to manage contacts faster than a typical mouse/GUI driven app","lastModifiedDate":"2024-03-07"},{"lineNumber":276,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":277,"author":{"gitId":"-"},"content":"### User stories","lastModifiedDate":"2020-06-07"},{"lineNumber":278,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":279,"author":{"gitId":"-"},"content":"Priorities: High (must have) - `* * *`, Medium (nice to have) - `* *`, Low (unlikely to have) - `*`","lastModifiedDate":"2020-05-23"},{"lineNumber":280,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":281,"author":{"gitId":"-"},"content":"| Priority | As a …​ | I want to …​ | So that I can…​ |","lastModifiedDate":"2020-05-23"},{"lineNumber":282,"author":{"gitId":"ejnan"},"content":"| -------- | -------------------------------------- |-------------------------------|---------------------------------------------------------|","lastModifiedDate":"2024-03-07"},{"lineNumber":283,"author":{"gitId":"ejnan"},"content":"| `* * *` | user | add a new patient | store new patient records |","lastModifiedDate":"2024-03-07"},{"lineNumber":284,"author":{"gitId":"ejnan"},"content":"| `* * *` | user | view existing patient records | access information on existing patients |","lastModifiedDate":"2024-03-07"},{"lineNumber":285,"author":{"gitId":"ejnan"},"content":"| `* * *` | user | delete a patient record | remove outdated or irrelevant patient data |","lastModifiedDate":"2024-03-07"},{"lineNumber":286,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":287,"author":{"gitId":"-"},"content":"*{More to be added}*","lastModifiedDate":"2020-05-23"},{"lineNumber":288,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":289,"author":{"gitId":"-"},"content":"### Use cases","lastModifiedDate":"2020-06-07"},{"lineNumber":290,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":291,"author":{"gitId":"-"},"content":"(For all use cases below, the **System** is the `AddressBook` and the **Actor** is the `user`, unless specified otherwise)","lastModifiedDate":"2020-05-23"},{"lineNumber":292,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":293,"author":{"gitId":"swtan346"},"content":"**Use case: UC01 - View contacts**","lastModifiedDate":"2024-03-07"},{"lineNumber":294,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":295,"author":{"gitId":"-"},"content":"**MSS**","lastModifiedDate":"2020-05-23"},{"lineNumber":296,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":297,"author":{"gitId":"-"},"content":"1. User requests to list persons","lastModifiedDate":"2020-05-23"},{"lineNumber":298,"author":{"gitId":"-"},"content":"2. AddressBook shows a list of persons","lastModifiedDate":"2020-05-23"},{"lineNumber":299,"author":{"gitId":"swtan346"},"content":"","lastModifiedDate":"2024-03-07"},{"lineNumber":300,"author":{"gitId":"swtan346"},"content":" Use case ends.","lastModifiedDate":"2024-03-07"},{"lineNumber":301,"author":{"gitId":"swtan346"},"content":"","lastModifiedDate":"2024-03-07"},{"lineNumber":302,"author":{"gitId":"swtan346"},"content":"**Use case: UC02 - Add a person**","lastModifiedDate":"2024-03-07"},{"lineNumber":303,"author":{"gitId":"swtan346"},"content":"","lastModifiedDate":"2024-03-07"},{"lineNumber":304,"author":{"gitId":"swtan346"},"content":"**MSS**","lastModifiedDate":"2024-03-07"},{"lineNumber":305,"author":{"gitId":"swtan346"},"content":"","lastModifiedDate":"2024-03-07"},{"lineNumber":306,"author":{"gitId":"swtan346"},"content":"1. User requests to add a person","lastModifiedDate":"2024-03-07"},{"lineNumber":307,"author":{"gitId":"swtan346"},"content":"2. AddressBook adds the person","lastModifiedDate":"2024-03-07"},{"lineNumber":308,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":309,"author":{"gitId":"-"},"content":" Use case ends.","lastModifiedDate":"2020-05-23"},{"lineNumber":310,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":311,"author":{"gitId":"-"},"content":"**Extensions**","lastModifiedDate":"2020-05-23"},{"lineNumber":312,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":313,"author":{"gitId":"swtan346"},"content":"* 2a. The given person details are invalid.","lastModifiedDate":"2024-03-07"},{"lineNumber":314,"author":{"gitId":"swtan346"},"content":"","lastModifiedDate":"2024-03-07"},{"lineNumber":315,"author":{"gitId":"swtan346"},"content":" * 2a1. AddressBook shows an error message.","lastModifiedDate":"2024-03-07"},{"lineNumber":316,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":317,"author":{"gitId":"-"},"content":" Use case ends.","lastModifiedDate":"2020-05-23"},{"lineNumber":318,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":319,"author":{"gitId":"swtan346"},"content":"**Use case: US03 - Delete a person**","lastModifiedDate":"2024-03-07"},{"lineNumber":320,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":321,"author":{"gitId":"-"},"content":"**MSS**","lastModifiedDate":"2020-05-23"},{"lineNumber":322,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":323,"author":{"gitId":"swtan346"},"content":"1. User requests to view contacts(UC01)","lastModifiedDate":"2024-03-07"},{"lineNumber":324,"author":{"gitId":"swtan346"},"content":"2. User requests to delete a specific person in the list ","lastModifiedDate":"2024-03-07"},{"lineNumber":325,"author":{"gitId":"swtan346"},"content":"3. AddressBook deletes the person","lastModifiedDate":"2024-03-07"},{"lineNumber":326,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":327,"author":{"gitId":"-"},"content":" Use case ends.","lastModifiedDate":"2020-05-23"},{"lineNumber":328,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":329,"author":{"gitId":"-"},"content":"**Extensions**","lastModifiedDate":"2020-05-23"},{"lineNumber":330,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":331,"author":{"gitId":"swtan346"},"content":"* 1a. The list is empty.","lastModifiedDate":"2024-03-07"},{"lineNumber":332,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":333,"author":{"gitId":"-"},"content":" Use case ends.","lastModifiedDate":"2020-05-23"},{"lineNumber":334,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":335,"author":{"gitId":"swtan346"},"content":"* 2a. The given index is invalid.","lastModifiedDate":"2024-03-07"},{"lineNumber":336,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":337,"author":{"gitId":"swtan346"},"content":" * 2a1. AddressBook shows an error message.","lastModifiedDate":"2024-03-07"},{"lineNumber":338,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":339,"author":{"gitId":"-"},"content":" Use case resumes at step 2.","lastModifiedDate":"2020-05-23"},{"lineNumber":340,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":341,"author":{"gitId":"-"},"content":"### Non-Functional Requirements","lastModifiedDate":"2020-05-23"},{"lineNumber":342,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":343,"author":{"gitId":"-"},"content":"1. Should work on any _mainstream OS_ as long as it has Java `11` or above installed.","lastModifiedDate":"2020-05-23"},{"lineNumber":344,"author":{"gitId":"-"},"content":"2. Should be able to hold up to 1000 persons without a noticeable sluggishness in performance for typical usage.","lastModifiedDate":"2020-05-23"},{"lineNumber":345,"author":{"gitId":"-"},"content":"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.","lastModifiedDate":"2020-05-23"},{"lineNumber":346,"author":{"gitId":"swtan346"},"content":"4. The user interface should be intuitive and easy to navigate.","lastModifiedDate":"2024-03-07"},{"lineNumber":347,"author":{"gitId":"swtan346"},"content":"5. The codebase should be well-structured and well-documented to facilitate future maintenance and enhancements.","lastModifiedDate":"2024-03-07"},{"lineNumber":348,"author":{"gitId":"swtan346"},"content":"6. The application should only support a single user.","lastModifiedDate":"2024-03-07"},{"lineNumber":349,"author":{"gitId":"swtan346"},"content":"7. The product needs to be developed in a breadth-first incremental manner over the project duration.","lastModifiedDate":"2024-03-07"},{"lineNumber":350,"author":{"gitId":"swtan346"},"content":"8. The data should be stored locally and should be in a human editable text file.","lastModifiedDate":"2024-03-07"},{"lineNumber":351,"author":{"gitId":"swtan346"},"content":"9. The software should follow the Object-oriented paradigm primarily.","lastModifiedDate":"2024-03-07"},{"lineNumber":352,"author":{"gitId":"swtan346"},"content":"10. The software should work without requiring an installer.","lastModifiedDate":"2024-03-07"},{"lineNumber":353,"author":{"gitId":"swtan346"},"content":"11. The software should not depend on a specific remote server.","lastModifiedDate":"2024-03-07"},{"lineNumber":354,"author":{"gitId":"swtan346"},"content":"12. The GUI should work well for standard screen resolutions 1920x1080 and higher, and, for screen scales 100% and 125%.","lastModifiedDate":"2024-03-07"},{"lineNumber":355,"author":{"gitId":"swtan346"},"content":"13. The GUI should be usable (i.e., all functions can be used even if the user experience is not optimal) for, ","lastModifiedDate":"2024-03-07"},{"lineNumber":356,"author":{"gitId":"swtan346"},"content":" resolutions 1280x720 and higher, and, for screen scales 150%.","lastModifiedDate":"2024-03-07"},{"lineNumber":357,"author":{"gitId":"swtan346"},"content":"14. The product should be available as a single JAR file of size 100MB or below.","lastModifiedDate":"2024-03-07"},{"lineNumber":358,"author":{"gitId":"swtan346"},"content":"15. The web documents saved should be a PDF file of size 15MB or below.","lastModifiedDate":"2024-03-07"},{"lineNumber":359,"author":{"gitId":"swtan346"},"content":"16. The final JAR/PDF files should not be bloated unnecessarily.","lastModifiedDate":"2024-03-07"},{"lineNumber":360,"author":{"gitId":"swtan346"},"content":"17. The DG and UG should be PDF-friendly, without any expandable panels, embedded videos, animated GIFs etc.","lastModifiedDate":"2024-03-07"},{"lineNumber":361,"author":{"gitId":"swtan346"},"content":"18. The use of third-party frameworks/libraries/services is allowed only if they, are free, open-source (this ","lastModifiedDate":"2024-03-07"},{"lineNumber":362,"author":{"gitId":"swtan346"},"content":" doesn\u0027t apply to services), and have permissive license terms; do not require any installation by the user; do ","lastModifiedDate":"2024-03-07"},{"lineNumber":363,"author":{"gitId":"swtan346"},"content":" not violate other constraints.","lastModifiedDate":"2024-03-07"},{"lineNumber":364,"author":{"gitId":"swtan346"},"content":"19. The product should process a user input command within 1 second.","lastModifiedDate":"2024-03-07"},{"lineNumber":365,"author":{"gitId":"swtan346"},"content":"20. The system must perform without failure in 95 percent of use cases during a month.","lastModifiedDate":"2024-03-07"},{"lineNumber":366,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":367,"author":{"gitId":"-"},"content":"### Glossary","lastModifiedDate":"2020-05-23"},{"lineNumber":368,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":369,"author":{"gitId":"-"},"content":"* **Mainstream OS**: Windows, Linux, Unix, MacOS","lastModifiedDate":"2024-02-09"},{"lineNumber":370,"author":{"gitId":"-"},"content":"* **Private contact detail**: A contact detail that is not meant to be shared with others","lastModifiedDate":"2020-05-23"},{"lineNumber":371,"author":{"gitId":"swtan346"},"content":"* **DG**: Developer guide","lastModifiedDate":"2024-03-07"},{"lineNumber":372,"author":{"gitId":"swtan346"},"content":"* **UG**: User guide","lastModifiedDate":"2024-03-07"},{"lineNumber":373,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":374,"author":{"gitId":"-"},"content":"--------------------------------------------------------------------------------------------------------------------","lastModifiedDate":"2020-05-23"},{"lineNumber":375,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":376,"author":{"gitId":"-"},"content":"## **Appendix: Instructions for manual testing**","lastModifiedDate":"2020-05-23"},{"lineNumber":377,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":378,"author":{"gitId":"-"},"content":"Given below are instructions to test the app manually.","lastModifiedDate":"2020-05-23"},{"lineNumber":379,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":380,"author":{"gitId":"-"},"content":"\u003cdiv markdown\u003d\"span\" class\u003d\"alert alert-info\"\u003e:information_source: **Note:** These instructions only provide a starting point for testers to work on;","lastModifiedDate":"2020-05-23"},{"lineNumber":381,"author":{"gitId":"-"},"content":"testers are expected to do more *exploratory* testing.","lastModifiedDate":"2020-05-23"},{"lineNumber":382,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":383,"author":{"gitId":"-"},"content":"\u003c/div\u003e","lastModifiedDate":"2020-05-23"},{"lineNumber":384,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":385,"author":{"gitId":"-"},"content":"### Launch and shutdown","lastModifiedDate":"2020-05-23"},{"lineNumber":386,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":387,"author":{"gitId":"-"},"content":"1. Initial launch","lastModifiedDate":"2020-05-23"},{"lineNumber":388,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":389,"author":{"gitId":"-"},"content":" 1. Download the jar file and copy into an empty folder","lastModifiedDate":"2020-05-23"},{"lineNumber":390,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":391,"author":{"gitId":"-"},"content":" 1. Double-click the jar file Expected: Shows the GUI with a set of sample contacts. The window size may not be optimum.","lastModifiedDate":"2020-05-23"},{"lineNumber":392,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":393,"author":{"gitId":"-"},"content":"1. Saving window preferences","lastModifiedDate":"2020-05-23"},{"lineNumber":394,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":395,"author":{"gitId":"-"},"content":" 1. Resize the window to an optimum size. Move the window to a different location. Close the window.","lastModifiedDate":"2020-05-23"},{"lineNumber":396,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":397,"author":{"gitId":"-"},"content":" 1. Re-launch the app by double-clicking the jar file.\u003cbr\u003e","lastModifiedDate":"2020-05-23"},{"lineNumber":398,"author":{"gitId":"-"},"content":" Expected: The most recent window size and location is retained.","lastModifiedDate":"2020-05-23"},{"lineNumber":399,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":400,"author":{"gitId":"-"},"content":"1. _{ more test cases …​ }_","lastModifiedDate":"2020-05-23"},{"lineNumber":401,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":402,"author":{"gitId":"-"},"content":"### Deleting a person","lastModifiedDate":"2020-05-23"},{"lineNumber":403,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":404,"author":{"gitId":"-"},"content":"1. Deleting a person while all persons are being shown","lastModifiedDate":"2020-05-23"},{"lineNumber":405,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":406,"author":{"gitId":"-"},"content":" 1. Prerequisites: List all persons using the `list` command. Multiple persons in the list.","lastModifiedDate":"2020-05-23"},{"lineNumber":407,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":408,"author":{"gitId":"-"},"content":" 1. Test case: `delete 1`\u003cbr\u003e","lastModifiedDate":"2020-05-23"},{"lineNumber":409,"author":{"gitId":"-"},"content":" 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.","lastModifiedDate":"2020-05-23"},{"lineNumber":410,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":411,"author":{"gitId":"-"},"content":" 1. Test case: `delete 0`\u003cbr\u003e","lastModifiedDate":"2020-05-23"},{"lineNumber":412,"author":{"gitId":"-"},"content":" Expected: No person is deleted. Error details shown in the status message. Status bar remains the same.","lastModifiedDate":"2020-05-23"},{"lineNumber":413,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":414,"author":{"gitId":"-"},"content":" 1. Other incorrect delete commands to try: `delete`, `delete x`, `...` (where x is larger than the list size)\u003cbr\u003e","lastModifiedDate":"2020-05-23"},{"lineNumber":415,"author":{"gitId":"-"},"content":" Expected: Similar to previous.","lastModifiedDate":"2020-05-23"},{"lineNumber":416,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":417,"author":{"gitId":"-"},"content":"1. _{ more test cases …​ }_","lastModifiedDate":"2020-05-23"},{"lineNumber":418,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":419,"author":{"gitId":"-"},"content":"### Saving data","lastModifiedDate":"2020-05-23"},{"lineNumber":420,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":421,"author":{"gitId":"-"},"content":"1. Dealing with missing/corrupted data files","lastModifiedDate":"2020-05-23"},{"lineNumber":422,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":423,"author":{"gitId":"-"},"content":" 1. _{explain how to simulate a missing/corrupted file, and the expected behavior}_","lastModifiedDate":"2020-05-23"},{"lineNumber":424,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":425,"author":{"gitId":"-"},"content":"1. _{ more test cases …​ }_","lastModifiedDate":"2020-05-23"},{"lineNumber":426,"author":{"gitId":"ejnan"},"content":"","lastModifiedDate":"2024-03-08"}],"authorContributionMap":{"swtan346":42,"ejnan":12,"-":372}},{"path":"docs/UserGuide.md","fileType":"docs","lines":[{"lineNumber":1,"author":{"gitId":"-"},"content":"---","lastModifiedDate":"2020-05-23"},{"lineNumber":2,"author":{"gitId":"-"},"content":"layout: page","lastModifiedDate":"2020-05-23"},{"lineNumber":3,"author":{"gitId":"-"},"content":"title: User Guide","lastModifiedDate":"2020-05-23"},{"lineNumber":4,"author":{"gitId":"-"},"content":"---","lastModifiedDate":"2020-05-23"},{"lineNumber":5,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":6,"author":{"gitId":"-"},"content":"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.","lastModifiedDate":"2020-05-23"},{"lineNumber":7,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":8,"author":{"gitId":"-"},"content":"* Table of Contents","lastModifiedDate":"2020-05-23"},{"lineNumber":9,"author":{"gitId":"-"},"content":"{:toc}","lastModifiedDate":"2020-05-23"},{"lineNumber":10,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":11,"author":{"gitId":"-"},"content":"--------------------------------------------------------------------------------------------------------------------","lastModifiedDate":"2020-05-23"},{"lineNumber":12,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":13,"author":{"gitId":"-"},"content":"## Quick start","lastModifiedDate":"2020-05-23"},{"lineNumber":14,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":15,"author":{"gitId":"-"},"content":"1. Ensure you have Java `11` or above installed in your Computer.","lastModifiedDate":"2020-05-23"},{"lineNumber":16,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":17,"author":{"gitId":"-"},"content":"1. Download the latest `addressbook.jar` from [here](https://github.com/se-edu/addressbook-level3/releases).","lastModifiedDate":"2020-05-23"},{"lineNumber":18,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":19,"author":{"gitId":"-"},"content":"1. Copy the file to the folder you want to use as the _home folder_ for your AddressBook.","lastModifiedDate":"2020-05-23"},{"lineNumber":20,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":21,"author":{"gitId":"-"},"content":"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.\u003cbr\u003e","lastModifiedDate":"2023-01-01"},{"lineNumber":22,"author":{"gitId":"ryanlimdx"},"content":" A GUI similar to the below should appear in a few seconds. Note how the app contains some sample input.\u003cbr\u003e","lastModifiedDate":"2024-03-06"},{"lineNumber":23,"author":{"gitId":"-"},"content":" ![Ui](images/Ui.png)","lastModifiedDate":"2020-05-23"},{"lineNumber":24,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":25,"author":{"gitId":"-"},"content":"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.\u003cbr\u003e","lastModifiedDate":"2020-05-23"},{"lineNumber":26,"author":{"gitId":"-"},"content":" Some example commands you can try:","lastModifiedDate":"2020-05-23"},{"lineNumber":27,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":28,"author":{"gitId":"-"},"content":" * `list` : Lists all contacts.","lastModifiedDate":"2023-01-01"},{"lineNumber":29,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":30,"author":{"gitId":"-"},"content":" * `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.","lastModifiedDate":"2023-01-01"},{"lineNumber":31,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":32,"author":{"gitId":"-"},"content":" * `delete 3` : Deletes the 3rd contact shown in the current list.","lastModifiedDate":"2023-01-01"},{"lineNumber":33,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":34,"author":{"gitId":"-"},"content":" * `clear` : Deletes all contacts.","lastModifiedDate":"2023-01-01"},{"lineNumber":35,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":36,"author":{"gitId":"-"},"content":" * `exit` : Exits the app.","lastModifiedDate":"2023-01-01"},{"lineNumber":37,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":38,"author":{"gitId":"-"},"content":"1. Refer to the [Features](#features) below for details of each command.","lastModifiedDate":"2020-05-23"},{"lineNumber":39,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":40,"author":{"gitId":"-"},"content":"--------------------------------------------------------------------------------------------------------------------","lastModifiedDate":"2020-05-23"},{"lineNumber":41,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":42,"author":{"gitId":"-"},"content":"## Features","lastModifiedDate":"2020-05-23"},{"lineNumber":43,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":44,"author":{"gitId":"-"},"content":"\u003cdiv markdown\u003d\"block\" class\u003d\"alert alert-info\"\u003e","lastModifiedDate":"2020-05-23"},{"lineNumber":45,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":46,"author":{"gitId":"-"},"content":"**:information_source: Notes about the command format:**\u003cbr\u003e","lastModifiedDate":"2020-05-23"},{"lineNumber":47,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":48,"author":{"gitId":"-"},"content":"* Words in `UPPER_CASE` are the parameters to be supplied by the user.\u003cbr\u003e","lastModifiedDate":"2020-05-23"},{"lineNumber":49,"author":{"gitId":"-"},"content":" e.g. in `add n/NAME`, `NAME` is a parameter which can be used as `add n/John Doe`.","lastModifiedDate":"2020-05-23"},{"lineNumber":50,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":51,"author":{"gitId":"-"},"content":"* Items in square brackets are optional.\u003cbr\u003e","lastModifiedDate":"2020-05-23"},{"lineNumber":52,"author":{"gitId":"-"},"content":" e.g `n/NAME [t/TAG]` can be used as `n/John Doe t/friend` or as `n/John Doe`.","lastModifiedDate":"2020-05-23"},{"lineNumber":53,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":54,"author":{"gitId":"-"},"content":"* Items with `…`​ after them can be used multiple times including zero times.\u003cbr\u003e","lastModifiedDate":"2020-05-23"},{"lineNumber":55,"author":{"gitId":"-"},"content":" e.g. `[t/TAG]…​` can be used as ` ` (i.e. 0 times), `t/friend`, `t/friend t/family` etc.","lastModifiedDate":"2020-05-23"},{"lineNumber":56,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":57,"author":{"gitId":"-"},"content":"* Parameters can be in any order.\u003cbr\u003e","lastModifiedDate":"2020-05-23"},{"lineNumber":58,"author":{"gitId":"-"},"content":" e.g. if the command specifies `n/NAME p/PHONE_NUMBER`, `p/PHONE_NUMBER n/NAME` is also acceptable.","lastModifiedDate":"2020-05-23"},{"lineNumber":59,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":60,"author":{"gitId":"-"},"content":"* Extraneous parameters for commands that do not take in parameters (such as `help`, `list`, `exit` and `clear`) will be ignored.\u003cbr\u003e","lastModifiedDate":"2021-02-03"},{"lineNumber":61,"author":{"gitId":"-"},"content":" e.g. if the command specifies `help 123`, it will be interpreted as `help`.","lastModifiedDate":"2021-02-03"},{"lineNumber":62,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2021-02-03"},{"lineNumber":63,"author":{"gitId":"-"},"content":"* 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.","lastModifiedDate":"2023-06-26"},{"lineNumber":64,"author":{"gitId":"-"},"content":"\u003c/div\u003e","lastModifiedDate":"2020-05-23"},{"lineNumber":65,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":66,"author":{"gitId":"-"},"content":"### Viewing help : `help`","lastModifiedDate":"2020-05-23"},{"lineNumber":67,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":68,"author":{"gitId":"-"},"content":"Shows a message explaning how to access the help page.","lastModifiedDate":"2020-05-23"},{"lineNumber":69,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":70,"author":{"gitId":"-"},"content":"![help message](images/helpMessage.png)","lastModifiedDate":"2020-05-23"},{"lineNumber":71,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":72,"author":{"gitId":"-"},"content":"Format: `help`","lastModifiedDate":"2020-05-23"},{"lineNumber":73,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":74,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":75,"author":{"gitId":"-"},"content":"### Adding a person: `add`","lastModifiedDate":"2020-05-23"},{"lineNumber":76,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":77,"author":{"gitId":"-"},"content":"Adds a person to the address book.","lastModifiedDate":"2020-05-23"},{"lineNumber":78,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":79,"author":{"gitId":"-"},"content":"Format: `add n/NAME p/PHONE_NUMBER e/EMAIL a/ADDRESS [t/TAG]…​`","lastModifiedDate":"2020-05-23"},{"lineNumber":80,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":81,"author":{"gitId":"-"},"content":"\u003cdiv markdown\u003d\"span\" class\u003d\"alert alert-primary\"\u003e:bulb: **Tip:**","lastModifiedDate":"2020-05-23"},{"lineNumber":82,"author":{"gitId":"-"},"content":"A person can have any number of tags (including 0)","lastModifiedDate":"2020-05-23"},{"lineNumber":83,"author":{"gitId":"-"},"content":"\u003c/div\u003e","lastModifiedDate":"2020-05-23"},{"lineNumber":84,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":85,"author":{"gitId":"-"},"content":"Examples:","lastModifiedDate":"2020-05-23"},{"lineNumber":86,"author":{"gitId":"-"},"content":"* `add n/John Doe p/98765432 e/johnd@example.com a/John street, block 123, #01-01`","lastModifiedDate":"2020-05-23"},{"lineNumber":87,"author":{"gitId":"-"},"content":"* `add n/Betsy Crowe t/friend e/betsycrowe@example.com a/Newgate Prison p/1234567 t/criminal`","lastModifiedDate":"2020-05-23"},{"lineNumber":88,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":89,"author":{"gitId":"-"},"content":"### Listing all persons : `list`","lastModifiedDate":"2020-05-23"},{"lineNumber":90,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":91,"author":{"gitId":"-"},"content":"Shows a list of all persons in the address book.","lastModifiedDate":"2020-05-23"},{"lineNumber":92,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":93,"author":{"gitId":"-"},"content":"Format: `list`","lastModifiedDate":"2020-05-23"},{"lineNumber":94,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":95,"author":{"gitId":"-"},"content":"### Editing a person : `edit`","lastModifiedDate":"2020-05-23"},{"lineNumber":96,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":97,"author":{"gitId":"-"},"content":"Edits an existing person in the address book.","lastModifiedDate":"2020-05-23"},{"lineNumber":98,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":99,"author":{"gitId":"-"},"content":"Format: `edit INDEX [n/NAME] [p/PHONE] [e/EMAIL] [a/ADDRESS] [t/TAG]…​`","lastModifiedDate":"2020-05-23"},{"lineNumber":100,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":101,"author":{"gitId":"-"},"content":"* 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, …​","lastModifiedDate":"2020-05-23"},{"lineNumber":102,"author":{"gitId":"-"},"content":"* At least one of the optional fields must be provided.","lastModifiedDate":"2020-05-23"},{"lineNumber":103,"author":{"gitId":"-"},"content":"* Existing values will be updated to the input values.","lastModifiedDate":"2020-05-23"},{"lineNumber":104,"author":{"gitId":"-"},"content":"* When editing tags, the existing tags of the person will be removed i.e adding of tags is not cumulative.","lastModifiedDate":"2020-05-23"},{"lineNumber":105,"author":{"gitId":"-"},"content":"* You can remove all the person’s tags by typing `t/` without","lastModifiedDate":"2020-05-23"},{"lineNumber":106,"author":{"gitId":"-"},"content":" specifying any tags after it.","lastModifiedDate":"2020-05-23"},{"lineNumber":107,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":108,"author":{"gitId":"-"},"content":"Examples:","lastModifiedDate":"2020-05-23"},{"lineNumber":109,"author":{"gitId":"-"},"content":"* `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.","lastModifiedDate":"2020-05-23"},{"lineNumber":110,"author":{"gitId":"-"},"content":"* `edit 2 n/Betsy Crower t/` Edits the name of the 2nd person to be `Betsy Crower` and clears all existing tags.","lastModifiedDate":"2020-05-23"},{"lineNumber":111,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":112,"author":{"gitId":"-"},"content":"### Locating persons by name: `find`","lastModifiedDate":"2020-05-23"},{"lineNumber":113,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":114,"author":{"gitId":"-"},"content":"Finds persons whose names contain any of the given keywords.","lastModifiedDate":"2020-05-23"},{"lineNumber":115,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":116,"author":{"gitId":"-"},"content":"Format: `find KEYWORD [MORE_KEYWORDS]`","lastModifiedDate":"2020-05-23"},{"lineNumber":117,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":118,"author":{"gitId":"-"},"content":"* The search is case-insensitive. e.g `hans` will match `Hans`","lastModifiedDate":"2020-05-23"},{"lineNumber":119,"author":{"gitId":"-"},"content":"* The order of the keywords does not matter. e.g. `Hans Bo` will match `Bo Hans`","lastModifiedDate":"2020-05-23"},{"lineNumber":120,"author":{"gitId":"-"},"content":"* Only the name is searched.","lastModifiedDate":"2020-05-23"},{"lineNumber":121,"author":{"gitId":"-"},"content":"* Only full words will be matched e.g. `Han` will not match `Hans`","lastModifiedDate":"2020-05-23"},{"lineNumber":122,"author":{"gitId":"-"},"content":"* Persons matching at least one keyword will be returned (i.e. `OR` search).","lastModifiedDate":"2020-05-23"},{"lineNumber":123,"author":{"gitId":"-"},"content":" e.g. `Hans Bo` will return `Hans Gruber`, `Bo Yang`","lastModifiedDate":"2020-05-23"},{"lineNumber":124,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":125,"author":{"gitId":"-"},"content":"Examples:","lastModifiedDate":"2020-05-23"},{"lineNumber":126,"author":{"gitId":"-"},"content":"* `find John` returns `john` and `John Doe`","lastModifiedDate":"2020-05-23"},{"lineNumber":127,"author":{"gitId":"-"},"content":"* `find alex david` returns `Alex Yeoh`, `David Li`\u003cbr\u003e","lastModifiedDate":"2020-05-23"},{"lineNumber":128,"author":{"gitId":"-"},"content":" ![result for \u0027find alex david\u0027](images/findAlexDavidResult.png)","lastModifiedDate":"2020-05-23"},{"lineNumber":129,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":130,"author":{"gitId":"-"},"content":"### Deleting a person : `delete`","lastModifiedDate":"2020-05-23"},{"lineNumber":131,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":132,"author":{"gitId":"-"},"content":"Deletes the specified person from the address book.","lastModifiedDate":"2020-05-23"},{"lineNumber":133,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":134,"author":{"gitId":"-"},"content":"Format: `delete INDEX`","lastModifiedDate":"2020-05-23"},{"lineNumber":135,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":136,"author":{"gitId":"-"},"content":"* Deletes the person at the specified `INDEX`.","lastModifiedDate":"2020-05-23"},{"lineNumber":137,"author":{"gitId":"-"},"content":"* The index refers to the index number shown in the displayed person list.","lastModifiedDate":"2020-05-23"},{"lineNumber":138,"author":{"gitId":"-"},"content":"* The index **must be a positive integer** 1, 2, 3, …​","lastModifiedDate":"2020-05-23"},{"lineNumber":139,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":140,"author":{"gitId":"-"},"content":"Examples:","lastModifiedDate":"2020-05-23"},{"lineNumber":141,"author":{"gitId":"-"},"content":"* `list` followed by `delete 2` deletes the 2nd person in the address book.","lastModifiedDate":"2020-05-23"},{"lineNumber":142,"author":{"gitId":"-"},"content":"* `find Betsy` followed by `delete 1` deletes the 1st person in the results of the `find` command.","lastModifiedDate":"2020-05-23"},{"lineNumber":143,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":144,"author":{"gitId":"-"},"content":"### Clearing all entries : `clear`","lastModifiedDate":"2020-05-23"},{"lineNumber":145,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":146,"author":{"gitId":"-"},"content":"Clears all entries from the address book.","lastModifiedDate":"2020-05-23"},{"lineNumber":147,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":148,"author":{"gitId":"-"},"content":"Format: `clear`","lastModifiedDate":"2020-05-23"},{"lineNumber":149,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":150,"author":{"gitId":"-"},"content":"### Exiting the program : `exit`","lastModifiedDate":"2020-05-23"},{"lineNumber":151,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":152,"author":{"gitId":"-"},"content":"Exits the program.","lastModifiedDate":"2020-05-23"},{"lineNumber":153,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":154,"author":{"gitId":"-"},"content":"Format: `exit`","lastModifiedDate":"2020-05-23"},{"lineNumber":155,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":156,"author":{"gitId":"-"},"content":"### Saving the data","lastModifiedDate":"2020-05-23"},{"lineNumber":157,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":158,"author":{"gitId":"-"},"content":"AddressBook data are saved in the hard disk automatically after any command that changes the data. There is no need to save manually.","lastModifiedDate":"2020-05-23"},{"lineNumber":159,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":160,"author":{"gitId":"-"},"content":"### Editing the data file","lastModifiedDate":"2021-02-04"},{"lineNumber":161,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2021-02-04"},{"lineNumber":162,"author":{"gitId":"-"},"content":"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.","lastModifiedDate":"2023-09-08"},{"lineNumber":163,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2021-02-04"},{"lineNumber":164,"author":{"gitId":"-"},"content":"\u003cdiv markdown\u003d\"span\" class\u003d\"alert alert-warning\"\u003e:exclamation: **Caution:**","lastModifiedDate":"2021-02-04"},{"lineNumber":165,"author":{"gitId":"-"},"content":"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.\u003cbr\u003e","lastModifiedDate":"2024-02-09"},{"lineNumber":166,"author":{"gitId":"-"},"content":"Furthermore, certain edits can cause the AddressBook to behave in unexpected ways (e.g., if a value entered is outside of the acceptable range). Therefore, edit the data file only if you are confident that you can update it correctly.","lastModifiedDate":"2024-02-09"},{"lineNumber":167,"author":{"gitId":"-"},"content":"\u003c/div\u003e","lastModifiedDate":"2021-02-04"},{"lineNumber":168,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2021-02-04"},{"lineNumber":169,"author":{"gitId":"-"},"content":"### Archiving data files `[coming in v2.0]`","lastModifiedDate":"2020-05-23"},{"lineNumber":170,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":171,"author":{"gitId":"-"},"content":"_Details coming soon ..._","lastModifiedDate":"2021-02-04"},{"lineNumber":172,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":173,"author":{"gitId":"-"},"content":"--------------------------------------------------------------------------------------------------------------------","lastModifiedDate":"2020-05-23"},{"lineNumber":174,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":175,"author":{"gitId":"-"},"content":"## FAQ","lastModifiedDate":"2020-05-23"},{"lineNumber":176,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":177,"author":{"gitId":"-"},"content":"**Q**: How do I transfer my data to another Computer?\u003cbr\u003e","lastModifiedDate":"2020-05-23"},{"lineNumber":178,"author":{"gitId":"-"},"content":"**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.","lastModifiedDate":"2020-05-23"},{"lineNumber":179,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":180,"author":{"gitId":"-"},"content":"--------------------------------------------------------------------------------------------------------------------","lastModifiedDate":"2020-05-23"},{"lineNumber":181,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":182,"author":{"gitId":"-"},"content":"## Known issues","lastModifiedDate":"2023-09-08"},{"lineNumber":183,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2023-09-08"},{"lineNumber":184,"author":{"gitId":"-"},"content":"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.","lastModifiedDate":"2023-09-08"},{"lineNumber":185,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2023-09-08"},{"lineNumber":186,"author":{"gitId":"-"},"content":"--------------------------------------------------------------------------------------------------------------------","lastModifiedDate":"2023-09-08"},{"lineNumber":187,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2023-09-08"},{"lineNumber":188,"author":{"gitId":"-"},"content":"## Command summary","lastModifiedDate":"2020-05-23"},{"lineNumber":189,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":190,"author":{"gitId":"-"},"content":"Action | Format, Examples","lastModifiedDate":"2020-05-23"},{"lineNumber":191,"author":{"gitId":"-"},"content":"--------|------------------","lastModifiedDate":"2020-05-23"},{"lineNumber":192,"author":{"gitId":"-"},"content":"**Add** | `add n/NAME p/PHONE_NUMBER e/EMAIL a/ADDRESS [t/TAG]…​` \u003cbr\u003e e.g., `add n/James Ho p/22224444 e/jamesho@example.com a/123, Clementi Rd, 1234665 t/friend t/colleague`","lastModifiedDate":"2020-05-23"},{"lineNumber":193,"author":{"gitId":"-"},"content":"**Clear** | `clear`","lastModifiedDate":"2020-05-23"},{"lineNumber":194,"author":{"gitId":"-"},"content":"**Delete** | `delete INDEX`\u003cbr\u003e e.g., `delete 3`","lastModifiedDate":"2020-05-23"},{"lineNumber":195,"author":{"gitId":"-"},"content":"**Edit** | `edit INDEX [n/NAME] [p/PHONE_NUMBER] [e/EMAIL] [a/ADDRESS] [t/TAG]…​`\u003cbr\u003e e.g.,`edit 2 n/James Lee e/jameslee@example.com`","lastModifiedDate":"2020-05-23"},{"lineNumber":196,"author":{"gitId":"-"},"content":"**Find** | `find KEYWORD [MORE_KEYWORDS]`\u003cbr\u003e e.g., `find James Jake`","lastModifiedDate":"2020-05-23"},{"lineNumber":197,"author":{"gitId":"-"},"content":"**List** | `list`","lastModifiedDate":"2020-05-23"},{"lineNumber":198,"author":{"gitId":"-"},"content":"**Help** | `help`","lastModifiedDate":"2020-05-23"}],"authorContributionMap":{"ryanlimdx":1,"-":197}},{"path":"docs/index.md","fileType":"docs","lines":[{"lineNumber":1,"author":{"gitId":"-"},"content":"---","lastModifiedDate":"2020-05-23"},{"lineNumber":2,"author":{"gitId":"-"},"content":"layout: page","lastModifiedDate":"2020-05-23"},{"lineNumber":3,"author":{"gitId":"-"},"content":"title: AddressBook Level-3","lastModifiedDate":"2020-05-23"},{"lineNumber":4,"author":{"gitId":"-"},"content":"---","lastModifiedDate":"2020-05-23"},{"lineNumber":5,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":6,"author":{"gitId":"ryanlimdx"},"content":"[![CI Status](https://github.com/se-edu/addressbook-level3/workflows/Java%20CI/badge.svg)](https://github.com/AY2324S2-CS2103T-F10-1/tp/actions)","lastModifiedDate":"2024-03-06"},{"lineNumber":7,"author":{"gitId":"-"},"content":"[![codecov](https://codecov.io/gh/se-edu/addressbook-level3/branch/master/graph/badge.svg)](https://codecov.io/gh/se-edu/addressbook-level3)","lastModifiedDate":"2020-08-07"},{"lineNumber":8,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":9,"author":{"gitId":"-"},"content":"![Ui](images/Ui.png)","lastModifiedDate":"2020-05-23"},{"lineNumber":10,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":11,"author":{"gitId":"-"},"content":"**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).","lastModifiedDate":"2020-05-23"},{"lineNumber":12,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":13,"author":{"gitId":"-"},"content":"* If you are interested in using AddressBook, head over to the [_Quick Start_ section of the **User Guide**](UserGuide.html#quick-start).","lastModifiedDate":"2020-05-23"},{"lineNumber":14,"author":{"gitId":"-"},"content":"* If you are interested about developing AddressBook, the [**Developer Guide**](DeveloperGuide.html) is a good place to start.","lastModifiedDate":"2020-05-23"},{"lineNumber":15,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":16,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":17,"author":{"gitId":"-"},"content":"**Acknowledgements**","lastModifiedDate":"2020-05-23"},{"lineNumber":18,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":19,"author":{"gitId":"-"},"content":"* Libraries used: [JavaFX](https://openjfx.io/), [Jackson](https://github.com/FasterXML/jackson), [JUnit5](https://github.com/junit-team/junit5)","lastModifiedDate":"2020-05-23"},{"lineNumber":20,"author":{"gitId":"ryanlimdx"},"content":"* This project is based on the AddressBook-Level3 project created by the [SE-EDU initiative](https://se-education.org).","lastModifiedDate":"2024-03-06"}],"authorContributionMap":{"ryanlimdx":2,"-":18}}] diff --git a/AY2324S2-CS2103T-F10-1_tp_master/commits.json b/AY2324S2-CS2103T-F10-1_tp_master/commits.json index 746478a2..515a1c28 100644 --- a/AY2324S2-CS2103T-F10-1_tp_master/commits.json +++ b/AY2324S2-CS2103T-F10-1_tp_master/commits.json @@ -1 +1 @@ -{"authorDailyContributionsMap":{"swtan346":[{"date":"2024-03-07","commitResults":[{"hash":"dc7bf4a15fa2ce513743b5bd2e776e39701cac8d","isMergeCommit":false,"messageTitle":"Update NFRs and glossary in developer guide","messageBody":"","fileTypesAndContributionMap":{"docs":{"insertions":22,"deletions":2}}},{"hash":"f94ff717ae9d09a01eec1438ce1179d01fa90ad9","isMergeCommit":false,"messageTitle":"Add use cases","messageBody":"","fileTypesAndContributionMap":{"docs":{"insertions":26,"deletions":2}}},{"hash":"8b63892cfd65f9f113ac2cb83f406e67341f3360","isMergeCommit":false,"messageTitle":"Update use cases","messageBody":"","fileTypesAndContributionMap":{"docs":{"insertions":4,"deletions":4}}},{"hash":"bd7537947064fce9832db1ee263991c7f9a9858f","isMergeCommit":false,"messageTitle":"Change use cases","messageBody":"","fileTypesAndContributionMap":{"docs":{"insertions":5,"deletions":6}}}]}],"iamtr":[{"date":"2024-03-07","commitResults":[{"hash":"3ee74ce3cdfb446c81435b9acfcc703332e1eac9","isMergeCommit":false,"messageTitle":"Add acknowledgement to original AB3","messageBody":"","fileTypesAndContributionMap":{"docs":{"insertions":3,"deletions":10}}},{"hash":"a01552baedec8db33315706efed399517aad58c2","isMergeCommit":false,"messageTitle":"Add Target User to README.md","messageBody":"","fileTypesAndContributionMap":{"docs":{"insertions":4,"deletions":0}}},{"hash":"412f7e575e6486f5c836ce712254045149cd38ca","isMergeCommit":true,"messageTitle":"Merge branch \u0027master\u0027 into branch-README-update-contents","messageBody":"","fileTypesAndContributionMap":{}},{"hash":"28071277f8b9d55a41983add96df645b0db6f620","isMergeCommit":true,"messageTitle":"Merge pull request #11 from ryanlimdx/Ui","messageBody":"Update Ui","fileTypesAndContributionMap":{}},{"hash":"6eecdc53e02a54d95bb129e88f008f46423e50b3","isMergeCommit":true,"messageTitle":"Merge pull request #12 from erv-teo/branch-AboutUs","messageBody":"Edit AboutUs to include photos, update site-wide settings","fileTypesAndContributionMap":{}},{"hash":"4f84887e25b39ff908ac85de47d0879c1464ccab","isMergeCommit":false,"messageTitle":"Change value proposition for README","messageBody":"","fileTypesAndContributionMap":{"docs":{"insertions":1,"deletions":1}}},{"hash":"2f519e4adb74675a6190c043f93491f916375e5b","isMergeCommit":true,"messageTitle":"Merge branch \u0027branch-README-update-contents\u0027 of https://github.com/iamtr/tp into branch-README-update-contents","messageBody":"","fileTypesAndContributionMap":{}},{"hash":"0cafa0af7ceeb6fcaeccd9e3b1b72e2bc716f1f6","isMergeCommit":true,"messageTitle":"Merge pull request #16 from ejnan/master","messageBody":"Update DG with user profiles, value proposition and user stories","fileTypesAndContributionMap":{}},{"hash":"15c15b3d708ceb2f5c2d8fde8e33be4b0cdd6ed0","isMergeCommit":false,"messageTitle":"Add badge and UI image to README","messageBody":"","fileTypesAndContributionMap":{"docs":{"insertions":5,"deletions":0}}},{"hash":"0bd4b963565b79017f807017659b89d2371f18ce","isMergeCommit":false,"messageTitle":"Edit badge links","messageBody":"","fileTypesAndContributionMap":{"docs":{"insertions":2,"deletions":2}}},{"hash":"afbeac053f191a02ab59f056b86aa8c8235c864d","isMergeCommit":true,"messageTitle":"Merge pull request #14 from swtan346/update-DG","messageBody":"Update NFRs and glossary in developer guide","fileTypesAndContributionMap":{}},{"hash":"d442bf6d4812bc6b09b2e1a704cf315df40c8640","isMergeCommit":true,"messageTitle":"Merge pull request #17 from iamtr/branch-README-update-contents","messageBody":"Add badge and UI image to README","fileTypesAndContributionMap":{}}]}],"ejnan":[{"date":"2024-03-07","commitResults":[{"hash":"12048b444642cbf2f3c2771964b7c6da23fff933","isMergeCommit":false,"messageTitle":"Update DG with user profiles, value proposition and user stories","messageBody":"","fileTypesAndContributionMap":{"docs":{"insertions":11,"deletions":11}}}]}],"erv-teo":[{"date":"2024-03-07","commitResults":[{"hash":"95ad991accf4766598bb5444fbd410e132a171b7","isMergeCommit":false,"messageTitle":"Edit AboutUs to include photos, update site-wide settings","messageBody":"","fileTypesAndContributionMap":{"docs":{"insertions":15,"deletions":15}}}]}],"ryanlimdx":[{"date":"2024-02-23","commitResults":[{"hash":"4eb7c6b994fe1e2b877b2163c60e08feead4c89c","isMergeCommit":false,"messageTitle":"Add remark feature","messageBody":"","fileTypesAndContributionMap":{"functional-code":{"insertions":215,"deletions":20},"test-code":{"insertions":170,"deletions":11}}},{"hash":"986631cc5c2d69ee46f060ae176cba505f4ca012","isMergeCommit":true,"messageTitle":"Merge branch \u0027branch-A-RemarkCommand\u0027","messageBody":"","fileTypesAndContributionMap":{}},{"hash":"fab9166e0bb9835631f73653438df9a784104100","isMergeCommit":false,"messageTitle":"Revert \"Merge branch \u0027branch-A-RemarkCommand\u0027\"","messageBody":"This reverts commit 986631cc5c2d69ee46f060ae176cba505f4ca012, reversing\nchanges made to 1dc0e943fac39d15110aed5dfa4f897c0029b6a8.\n\nRevert merge to master\n","fileTypesAndContributionMap":{"functional-code":{"insertions":20,"deletions":215},"test-code":{"insertions":11,"deletions":170}}}]},{"date":"2024-03-06","commitResults":[{"hash":"e32beeb1a6e8fc5b4cbf61de9be99acac5a2b420","isMergeCommit":false,"messageTitle":"Update Ui of mockup","messageBody":"","fileTypesAndContributionMap":{"docs":{"insertions":1,"deletions":1}}},{"hash":"6a511397bf008620cb12d0e304faf3dae3b9d358","isMergeCommit":true,"messageTitle":"Merge branch \u0027Ui\u0027","messageBody":"","fileTypesAndContributionMap":{}},{"hash":"047e36295746150b273eaa9ff1eaea99a3eb5ae3","isMergeCommit":false,"messageTitle":"Add acknowledgement","messageBody":"","fileTypesAndContributionMap":{"docs":{"insertions":1,"deletions":0}}},{"hash":"19fff456d2e42356d50928467c68df396fbb57f7","isMergeCommit":false,"messageTitle":"Update link for Github Actions badge","messageBody":"","fileTypesAndContributionMap":{"docs":{"insertions":1,"deletions":1}}}]},{"date":"2024-03-07","commitResults":[{"hash":"d6c1eca650a8ee9c79ee6a2065ad813161676f1c","isMergeCommit":false,"messageTitle":"Fix repo wide tests not passing","messageBody":"","fileTypesAndContributionMap":{"docs":{"insertions":1,"deletions":1}}},{"hash":"6663aba02c7f8d5da1748f231941a3e70f05d9f3","isMergeCommit":true,"messageTitle":"Merge pull request #15 from iamtr/branch-README-update-contents","messageBody":"Update README contents","fileTypesAndContributionMap":{}}]}]},"authorFileTypeContributionMap":{"swtan346":{"docs":42,"functional-code":0,"test-code":0},"iamtr":{"docs":8,"functional-code":0,"test-code":0},"ejnan":{"docs":10,"functional-code":0,"test-code":0},"erv-teo":{"docs":15,"functional-code":0,"test-code":0},"ryanlimdx":{"docs":3,"functional-code":0,"test-code":0}},"authorContributionVariance":{"swtan346":334.35205,"iamtr":52.0,"ejnan":32.102043,"erv-teo":59.69388,"ryanlimdx":45855.21},"authorDisplayNameMap":{"swtan346":"CS2103T-F10-1 TAN .. WEI","iamtr":"CS2103T-F10-1 ONG .. JET","ejnan":"CS2103T-F10-1 AN E.. JIN","erv-teo":"CS2103T-F10-1 ERVI..IONG","ryanlimdx":"CS2103T-F10-1 RYAN..XUAN"}} +{"authorDailyContributionsMap":{"swtan346":[{"date":"2024-03-07","commitResults":[{"hash":"dc7bf4a15fa2ce513743b5bd2e776e39701cac8d","isMergeCommit":false,"messageTitle":"Update NFRs and glossary in developer guide","messageBody":"","fileTypesAndContributionMap":{"docs":{"insertions":22,"deletions":2}}},{"hash":"f94ff717ae9d09a01eec1438ce1179d01fa90ad9","isMergeCommit":false,"messageTitle":"Add use cases","messageBody":"","fileTypesAndContributionMap":{"docs":{"insertions":26,"deletions":2}}},{"hash":"8b63892cfd65f9f113ac2cb83f406e67341f3360","isMergeCommit":false,"messageTitle":"Update use cases","messageBody":"","fileTypesAndContributionMap":{"docs":{"insertions":4,"deletions":4}}},{"hash":"bd7537947064fce9832db1ee263991c7f9a9858f","isMergeCommit":false,"messageTitle":"Change use cases","messageBody":"","fileTypesAndContributionMap":{"docs":{"insertions":5,"deletions":6}}}]}],"iamtr":[{"date":"2024-03-07","commitResults":[{"hash":"3ee74ce3cdfb446c81435b9acfcc703332e1eac9","isMergeCommit":false,"messageTitle":"Add acknowledgement to original AB3","messageBody":"","fileTypesAndContributionMap":{"docs":{"insertions":3,"deletions":10}}},{"hash":"a01552baedec8db33315706efed399517aad58c2","isMergeCommit":false,"messageTitle":"Add Target User to README.md","messageBody":"","fileTypesAndContributionMap":{"docs":{"insertions":4,"deletions":0}}},{"hash":"412f7e575e6486f5c836ce712254045149cd38ca","isMergeCommit":true,"messageTitle":"Merge branch \u0027master\u0027 into branch-README-update-contents","messageBody":"","fileTypesAndContributionMap":{}},{"hash":"28071277f8b9d55a41983add96df645b0db6f620","isMergeCommit":true,"messageTitle":"Merge pull request #11 from ryanlimdx/Ui","messageBody":"Update Ui","fileTypesAndContributionMap":{}},{"hash":"6eecdc53e02a54d95bb129e88f008f46423e50b3","isMergeCommit":true,"messageTitle":"Merge pull request #12 from erv-teo/branch-AboutUs","messageBody":"Edit AboutUs to include photos, update site-wide settings","fileTypesAndContributionMap":{}},{"hash":"4f84887e25b39ff908ac85de47d0879c1464ccab","isMergeCommit":false,"messageTitle":"Change value proposition for README","messageBody":"","fileTypesAndContributionMap":{"docs":{"insertions":1,"deletions":1}}},{"hash":"2f519e4adb74675a6190c043f93491f916375e5b","isMergeCommit":true,"messageTitle":"Merge branch \u0027branch-README-update-contents\u0027 of https://github.com/iamtr/tp into branch-README-update-contents","messageBody":"","fileTypesAndContributionMap":{}},{"hash":"0cafa0af7ceeb6fcaeccd9e3b1b72e2bc716f1f6","isMergeCommit":true,"messageTitle":"Merge pull request #16 from ejnan/master","messageBody":"Update DG with user profiles, value proposition and user stories","fileTypesAndContributionMap":{}},{"hash":"15c15b3d708ceb2f5c2d8fde8e33be4b0cdd6ed0","isMergeCommit":false,"messageTitle":"Add badge and UI image to README","messageBody":"","fileTypesAndContributionMap":{"docs":{"insertions":5,"deletions":0}}},{"hash":"0bd4b963565b79017f807017659b89d2371f18ce","isMergeCommit":false,"messageTitle":"Edit badge links","messageBody":"","fileTypesAndContributionMap":{"docs":{"insertions":2,"deletions":2}}},{"hash":"afbeac053f191a02ab59f056b86aa8c8235c864d","isMergeCommit":true,"messageTitle":"Merge pull request #14 from swtan346/update-DG","messageBody":"Update NFRs and glossary in developer guide","fileTypesAndContributionMap":{}},{"hash":"d442bf6d4812bc6b09b2e1a704cf315df40c8640","isMergeCommit":true,"messageTitle":"Merge pull request #17 from iamtr/branch-README-update-contents","messageBody":"Add badge and UI image to README","fileTypesAndContributionMap":{}}]},{"date":"2024-03-08","commitResults":[{"hash":"7e024e129bfdeed1ae92a3d6cffec947835d635d","isMergeCommit":true,"messageTitle":"Merge pull request #19 from ejnan/update-DG","messageBody":"Update Developer Guide","fileTypesAndContributionMap":{}}]}],"ejnan":[{"date":"2024-03-07","commitResults":[{"hash":"12048b444642cbf2f3c2771964b7c6da23fff933","isMergeCommit":false,"messageTitle":"Update DG with user profiles, value proposition and user stories","messageBody":"","fileTypesAndContributionMap":{"docs":{"insertions":11,"deletions":11}}}]},{"date":"2024-03-08","commitResults":[{"hash":"83e7670cff9f9552d918fbb80e1b1cb4151e48cd","isMergeCommit":false,"messageTitle":"Update Developer Guide","messageBody":"","fileTypesAndContributionMap":{"docs":{"insertions":2,"deletions":1}}}]}],"erv-teo":[{"date":"2024-03-07","commitResults":[{"hash":"95ad991accf4766598bb5444fbd410e132a171b7","isMergeCommit":false,"messageTitle":"Edit AboutUs to include photos, update site-wide settings","messageBody":"","fileTypesAndContributionMap":{"docs":{"insertions":15,"deletions":15}}}]}],"ryanlimdx":[{"date":"2024-02-23","commitResults":[{"hash":"4eb7c6b994fe1e2b877b2163c60e08feead4c89c","isMergeCommit":false,"messageTitle":"Add remark feature","messageBody":"","fileTypesAndContributionMap":{"functional-code":{"insertions":215,"deletions":20},"test-code":{"insertions":170,"deletions":11}}},{"hash":"986631cc5c2d69ee46f060ae176cba505f4ca012","isMergeCommit":true,"messageTitle":"Merge branch \u0027branch-A-RemarkCommand\u0027","messageBody":"","fileTypesAndContributionMap":{}},{"hash":"fab9166e0bb9835631f73653438df9a784104100","isMergeCommit":false,"messageTitle":"Revert \"Merge branch \u0027branch-A-RemarkCommand\u0027\"","messageBody":"This reverts commit 986631cc5c2d69ee46f060ae176cba505f4ca012, reversing\nchanges made to 1dc0e943fac39d15110aed5dfa4f897c0029b6a8.\n\nRevert merge to master\n","fileTypesAndContributionMap":{"functional-code":{"insertions":20,"deletions":215},"test-code":{"insertions":11,"deletions":170}}}]},{"date":"2024-03-06","commitResults":[{"hash":"e32beeb1a6e8fc5b4cbf61de9be99acac5a2b420","isMergeCommit":false,"messageTitle":"Update Ui of mockup","messageBody":"","fileTypesAndContributionMap":{"docs":{"insertions":1,"deletions":1}}},{"hash":"6a511397bf008620cb12d0e304faf3dae3b9d358","isMergeCommit":true,"messageTitle":"Merge branch \u0027Ui\u0027","messageBody":"","fileTypesAndContributionMap":{}},{"hash":"047e36295746150b273eaa9ff1eaea99a3eb5ae3","isMergeCommit":false,"messageTitle":"Add acknowledgement","messageBody":"","fileTypesAndContributionMap":{"docs":{"insertions":1,"deletions":0}}},{"hash":"19fff456d2e42356d50928467c68df396fbb57f7","isMergeCommit":false,"messageTitle":"Update link for Github Actions badge","messageBody":"","fileTypesAndContributionMap":{"docs":{"insertions":1,"deletions":1}}}]},{"date":"2024-03-07","commitResults":[{"hash":"d6c1eca650a8ee9c79ee6a2065ad813161676f1c","isMergeCommit":false,"messageTitle":"Fix repo wide tests not passing","messageBody":"","fileTypesAndContributionMap":{"docs":{"insertions":1,"deletions":1}}},{"hash":"6663aba02c7f8d5da1748f231941a3e70f05d9f3","isMergeCommit":true,"messageTitle":"Merge pull request #15 from iamtr/branch-README-update-contents","messageBody":"Update README contents","fileTypesAndContributionMap":{}}]}]},"authorFileTypeContributionMap":{"swtan346":{"docs":42,"functional-code":0,"test-code":0},"iamtr":{"docs":8,"functional-code":0,"test-code":0},"ejnan":{"docs":12,"functional-code":0,"test-code":0},"erv-teo":{"docs":15,"functional-code":0,"test-code":0},"ryanlimdx":{"docs":3,"functional-code":0,"test-code":0}},"authorContributionVariance":{"swtan346":313.66223,"iamtr":48.782223,"ejnan":30.08889,"erv-teo":56.0,"ryanlimdx":43021.68},"authorDisplayNameMap":{"swtan346":"CS2103T-F10-1 TAN .. WEI","iamtr":"CS2103T-F10-1 ONG .. JET","ejnan":"CS2103T-F10-1 AN E.. JIN","erv-teo":"CS2103T-F10-1 ERVI..IONG","ryanlimdx":"CS2103T-F10-1 RYAN..XUAN"}} diff --git a/AY2324S2-CS2103T-F10-3_tp_master/authorship.json b/AY2324S2-CS2103T-F10-3_tp_master/authorship.json index a57118aa..d2dca9c7 100644 --- a/AY2324S2-CS2103T-F10-3_tp_master/authorship.json +++ b/AY2324S2-CS2103T-F10-3_tp_master/authorship.json @@ -1 +1 @@ -[{"path":"README.md","fileType":"docs","lines":[{"lineNumber":1,"author":{"gitId":"-"},"content":"[![CI Status](https://github.com/se-edu/addressbook-level3/workflows/Java%20CI/badge.svg)](https://github.com/se-edu/addressbook-level3/actions)","lastModifiedDate":"2020-05-23"},{"lineNumber":2,"author":{"gitId":"-"},"content":"[![codecov](https://codecov.io/gh/AY2324S2-CS2103T-F10-3/tp/graph/badge.svg?token\u003dX33TASQ7AY)](https://codecov.io/gh/AY2324S2-CS2103T-F10-3/tp)","lastModifiedDate":"2024-02-20"},{"lineNumber":3,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2024-02-20"},{"lineNumber":4,"author":{"gitId":"-"},"content":"![Ui](docs/images/Ui.png)","lastModifiedDate":"2020-05-23"},{"lineNumber":5,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":6,"author":{"gitId":"xuelinglow"},"content":"* This is **a Command Line Interface (CLI) application for users who prefer CLI to keep track of healthcare appointments and patient information**.\u003cbr\u003e","lastModifiedDate":"2024-03-06"},{"lineNumber":7,"author":{"gitId":"-"},"content":" Example usages:","lastModifiedDate":"2020-05-23"},{"lineNumber":8,"author":{"gitId":"xuelinglow"},"content":" * store and retrieve patient information such as name, contact information and medical allergies","lastModifiedDate":"2024-03-06"},{"lineNumber":9,"author":{"gitId":"xuelinglow"},"content":" * schedule an appointment for the patient","lastModifiedDate":"2024-03-06"},{"lineNumber":10,"author":{"gitId":"xuelinglow"},"content":" * view upcoming appointments in a concise and accessible format","lastModifiedDate":"2024-03-06"},{"lineNumber":11,"author":{"gitId":"xuelinglow"},"content":"","lastModifiedDate":"2024-03-06"},{"lineNumber":12,"author":{"gitId":"xuelinglow"},"content":"* The project simulates an ongoing software project for a desktop application (called CLInic) used for managing patient and appointment details.","lastModifiedDate":"2024-03-06"},{"lineNumber":13,"author":{"gitId":"xuelinglow"},"content":" * It is built on the AddressBook-Level3 project.","lastModifiedDate":"2024-03-06"},{"lineNumber":14,"author":{"gitId":"xuelinglow"},"content":" * It is **written in OOP fashion**. ","lastModifiedDate":"2024-03-06"},{"lineNumber":15,"author":{"gitId":"-"},"content":" * It comes with a **reasonable level of user and developer documentation**.","lastModifiedDate":"2020-05-23"},{"lineNumber":16,"author":{"gitId":"xuelinglow"},"content":"","lastModifiedDate":"2024-03-06"},{"lineNumber":17,"author":{"gitId":"xuelinglow"},"content":"This project is based on the AddressBook-Level3 project created by the [SE-EDU initiative](https://se-education.org).","lastModifiedDate":"2024-03-06"}],"authorContributionMap":{"xuelinglow":10,"-":7}},{"path":"docs/AboutUs.md","fileType":"docs","lines":[{"lineNumber":1,"author":{"gitId":"-"},"content":"---","lastModifiedDate":"2020-05-23"},{"lineNumber":2,"author":{"gitId":"-"},"content":" layout: default.md","lastModifiedDate":"2023-09-12"},{"lineNumber":3,"author":{"gitId":"-"},"content":" title: \"About Us\"","lastModifiedDate":"2023-09-12"},{"lineNumber":4,"author":{"gitId":"-"},"content":"---","lastModifiedDate":"2020-05-23"},{"lineNumber":5,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":6,"author":{"gitId":"-"},"content":"# About Us","lastModifiedDate":"2023-09-12"},{"lineNumber":7,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2023-09-12"},{"lineNumber":8,"author":{"gitId":"-"},"content":"We are a team based in the [School of Computing, National University of Singapore](http://www.comp.nus.edu.sg).","lastModifiedDate":"2020-05-23"},{"lineNumber":9,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":10,"author":{"gitId":"-"},"content":"You can reach us at the email `seer[at]comp.nus.edu.sg`","lastModifiedDate":"2020-06-17"},{"lineNumber":11,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-06-17"},{"lineNumber":12,"author":{"gitId":"-"},"content":"## Project team","lastModifiedDate":"2020-06-07"},{"lineNumber":13,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":14,"author":{"gitId":"cliftonchee"},"content":"### Ang Zi Jun Dayn","lastModifiedDate":"2024-03-04"},{"lineNumber":15,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":16,"author":{"gitId":"cliftonchee"},"content":"\u003cimg src\u003d\"images/dayn-1.png\" width\u003d\"200px\"\u003e","lastModifiedDate":"2024-03-04"},{"lineNumber":17,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":18,"author":{"gitId":"cliftonchee"},"content":"[[github](https://github.com/dayn-1)]","lastModifiedDate":"2024-03-04"},{"lineNumber":19,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":20,"author":{"gitId":"cliftonchee"},"content":"* Role: Team Lead","lastModifiedDate":"2024-03-04"},{"lineNumber":21,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":22,"author":{"gitId":"cliftonchee"},"content":"### Chee Wei Xiong Clifton","lastModifiedDate":"2024-03-04"},{"lineNumber":23,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":24,"author":{"gitId":"cliftonchee"},"content":"\u003cimg src\u003d\"images/cliftonchee.png\" width\u003d\"200px\"\u003e","lastModifiedDate":"2024-03-04"},{"lineNumber":25,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":26,"author":{"gitId":"cliftonchee"},"content":"[[github](http://github.com/cliftonchee)]","lastModifiedDate":"2024-03-04"},{"lineNumber":27,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":28,"author":{"gitId":"cliftonchee"},"content":"* Role: Documentation","lastModifiedDate":"2024-03-04"},{"lineNumber":29,"author":{"gitId":"-"},"content":"* Responsibilities: UI","lastModifiedDate":"2020-05-23"},{"lineNumber":30,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":31,"author":{"gitId":"cliftonchee"},"content":"### Jaime Ng Jia Min","lastModifiedDate":"2024-03-04"},{"lineNumber":32,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":33,"author":{"gitId":"cliftonchee"},"content":"\u003cimg src\u003d\"images/thatgirljam.png\" width\u003d\"200px\"\u003e","lastModifiedDate":"2024-03-04"},{"lineNumber":34,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":35,"author":{"gitId":"cliftonchee"},"content":"[[github](http://github.com/thatgirljam)]","lastModifiedDate":"2024-03-04"},{"lineNumber":36,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":37,"author":{"gitId":"cliftonchee"},"content":"* Role: Testing","lastModifiedDate":"2024-03-04"},{"lineNumber":38,"author":{"gitId":"-"},"content":"* Responsibilities: Data","lastModifiedDate":"2020-05-23"},{"lineNumber":39,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":40,"author":{"gitId":"cliftonchee"},"content":"### Lim Rik","lastModifiedDate":"2024-03-04"},{"lineNumber":41,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":42,"author":{"gitId":"cliftonchee"},"content":"\u003cimg src\u003d\"images/limrik.png\" width\u003d\"200px\"\u003e","lastModifiedDate":"2024-03-04"},{"lineNumber":43,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":44,"author":{"gitId":"cliftonchee"},"content":"[[github](http://github.com/limrik)]","lastModifiedDate":"2024-03-04"},{"lineNumber":45,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":46,"author":{"gitId":"cliftonchee"},"content":"* Role: Code quality, Integration","lastModifiedDate":"2024-03-04"},{"lineNumber":47,"author":{"gitId":"-"},"content":"* Responsibilities: Dev Ops + Threading","lastModifiedDate":"2020-05-23"},{"lineNumber":48,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":49,"author":{"gitId":"cliftonchee"},"content":"### Low Xue Ling","lastModifiedDate":"2024-03-04"},{"lineNumber":50,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":51,"author":{"gitId":"cliftonchee"},"content":"\u003cimg src\u003d\"images/xuelinglow.png\" width\u003d\"200px\"\u003e","lastModifiedDate":"2024-03-04"},{"lineNumber":52,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":53,"author":{"gitId":"cliftonchee"},"content":"[[github](http://github.com/xuelinglow)]","lastModifiedDate":"2024-03-04"},{"lineNumber":54,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":55,"author":{"gitId":"cliftonchee"},"content":"* Role: Deliverables and deadlines","lastModifiedDate":"2024-03-04"},{"lineNumber":56,"author":{"gitId":"-"},"content":"* Responsibilities: UI","lastModifiedDate":"2020-05-23"}],"authorContributionMap":{"-":36,"cliftonchee":20}},{"path":"docs/DeveloperGuide.md","fileType":"docs","lines":[{"lineNumber":1,"author":{"gitId":"-"},"content":"---","lastModifiedDate":"2020-05-23"},{"lineNumber":2,"author":{"gitId":"-"},"content":" layout: default.md","lastModifiedDate":"2023-09-12"},{"lineNumber":3,"author":{"gitId":"-"},"content":" title: \"Developer Guide\"","lastModifiedDate":"2023-09-12"},{"lineNumber":4,"author":{"gitId":"-"},"content":" pageNav: 3","lastModifiedDate":"2023-09-12"},{"lineNumber":5,"author":{"gitId":"-"},"content":"---","lastModifiedDate":"2020-05-23"},{"lineNumber":6,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2023-09-12"},{"lineNumber":7,"author":{"gitId":"-"},"content":"# AB-3 Developer Guide","lastModifiedDate":"2023-09-12"},{"lineNumber":8,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2023-09-12"},{"lineNumber":9,"author":{"gitId":"-"},"content":"\u003c!-- * Table of Contents --\u003e","lastModifiedDate":"2023-09-12"},{"lineNumber":10,"author":{"gitId":"-"},"content":"\u003cpage-nav-print /\u003e","lastModifiedDate":"2023-09-12"},{"lineNumber":11,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":12,"author":{"gitId":"-"},"content":"--------------------------------------------------------------------------------------------------------------------","lastModifiedDate":"2020-05-23"},{"lineNumber":13,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2021-07-30"},{"lineNumber":14,"author":{"gitId":"-"},"content":"## **Acknowledgements**","lastModifiedDate":"2021-07-30"},{"lineNumber":15,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2021-07-30"},{"lineNumber":16,"author":{"gitId":"-"},"content":"_{ list here sources of all reused/adapted ideas, code, documentation, and third-party libraries -- include links to the original source as well }_","lastModifiedDate":"2023-09-12"},{"lineNumber":17,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2021-07-30"},{"lineNumber":18,"author":{"gitId":"-"},"content":"--------------------------------------------------------------------------------------------------------------------","lastModifiedDate":"2021-07-30"},{"lineNumber":19,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":20,"author":{"gitId":"-"},"content":"## **Setting up, getting started**","lastModifiedDate":"2020-05-23"},{"lineNumber":21,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":22,"author":{"gitId":"-"},"content":"Refer to the guide [_Setting up and getting started_](SettingUp.md).","lastModifiedDate":"2020-05-23"},{"lineNumber":23,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":24,"author":{"gitId":"-"},"content":"--------------------------------------------------------------------------------------------------------------------","lastModifiedDate":"2020-05-23"},{"lineNumber":25,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":26,"author":{"gitId":"-"},"content":"## **Design**","lastModifiedDate":"2020-05-23"},{"lineNumber":27,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":28,"author":{"gitId":"-"},"content":"### Architecture","lastModifiedDate":"2021-07-31"},{"lineNumber":29,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":30,"author":{"gitId":"-"},"content":"\u003cpuml src\u003d\"diagrams/ArchitectureDiagram.puml\" width\u003d\"280\" /\u003e","lastModifiedDate":"2023-09-12"},{"lineNumber":31,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":32,"author":{"gitId":"-"},"content":"The ***Architecture Diagram*** given above explains the high-level design of the App.","lastModifiedDate":"2021-07-31"},{"lineNumber":33,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":34,"author":{"gitId":"-"},"content":"Given below is a quick overview of main components and how they interact with each other.","lastModifiedDate":"2021-07-31"},{"lineNumber":35,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2021-07-31"},{"lineNumber":36,"author":{"gitId":"-"},"content":"**Main components of the architecture**","lastModifiedDate":"2021-07-31"},{"lineNumber":37,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":38,"author":{"gitId":"-"},"content":"**`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.","lastModifiedDate":"2023-09-03"},{"lineNumber":39,"author":{"gitId":"-"},"content":"* At app launch, it initializes the other components in the correct sequence, and connects them up with each other.","lastModifiedDate":"2023-09-03"},{"lineNumber":40,"author":{"gitId":"-"},"content":"* At shut down, it shuts down the other components and invokes cleanup methods where necessary.","lastModifiedDate":"2023-09-03"},{"lineNumber":41,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":42,"author":{"gitId":"-"},"content":"The bulk of the app\u0027s work is done by the following four components:","lastModifiedDate":"2023-09-03"},{"lineNumber":43,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":44,"author":{"gitId":"-"},"content":"* [**`UI`**](#ui-component): The UI of the App.","lastModifiedDate":"2020-05-23"},{"lineNumber":45,"author":{"gitId":"-"},"content":"* [**`Logic`**](#logic-component): The command executor.","lastModifiedDate":"2020-05-23"},{"lineNumber":46,"author":{"gitId":"-"},"content":"* [**`Model`**](#model-component): Holds the data of the App in memory.","lastModifiedDate":"2020-05-23"},{"lineNumber":47,"author":{"gitId":"-"},"content":"* [**`Storage`**](#storage-component): Reads data from, and writes data to, the hard disk.","lastModifiedDate":"2020-05-23"},{"lineNumber":48,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":49,"author":{"gitId":"-"},"content":"[**`Commons`**](#common-classes) represents a collection of classes used by multiple other components.","lastModifiedDate":"2023-09-03"},{"lineNumber":50,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":51,"author":{"gitId":"-"},"content":"**How the architecture components interact with each other**","lastModifiedDate":"2020-05-23"},{"lineNumber":52,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":53,"author":{"gitId":"-"},"content":"The *Sequence Diagram* below shows how the components interact with each other for the scenario where the user issues the command `delete 1`.","lastModifiedDate":"2020-05-23"},{"lineNumber":54,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":55,"author":{"gitId":"-"},"content":"\u003cpuml src\u003d\"diagrams/ArchitectureSequenceDiagram.puml\" width\u003d\"574\" /\u003e","lastModifiedDate":"2023-09-12"},{"lineNumber":56,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":57,"author":{"gitId":"-"},"content":"Each of the four main components (also shown in the diagram above),","lastModifiedDate":"2021-07-31"},{"lineNumber":58,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2021-07-31"},{"lineNumber":59,"author":{"gitId":"-"},"content":"* defines its *API* in an `interface` with the same name as the Component.","lastModifiedDate":"2021-07-31"},{"lineNumber":60,"author":{"gitId":"-"},"content":"* implements its functionality using a concrete `{Component Name}Manager` class (which follows the corresponding API `interface` mentioned in the previous point.","lastModifiedDate":"2021-07-31"},{"lineNumber":61,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2021-07-31"},{"lineNumber":62,"author":{"gitId":"-"},"content":"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\u0027s being coupled to the implementation of a component), as illustrated in the (partial) class diagram below.","lastModifiedDate":"2021-07-31"},{"lineNumber":63,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2021-07-31"},{"lineNumber":64,"author":{"gitId":"-"},"content":"\u003cpuml src\u003d\"diagrams/ComponentManagers.puml\" width\u003d\"300\" /\u003e","lastModifiedDate":"2023-09-12"},{"lineNumber":65,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2021-07-31"},{"lineNumber":66,"author":{"gitId":"-"},"content":"The sections below give more details of each component.","lastModifiedDate":"2020-05-23"},{"lineNumber":67,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":68,"author":{"gitId":"-"},"content":"### UI component","lastModifiedDate":"2020-05-23"},{"lineNumber":69,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":70,"author":{"gitId":"-"},"content":"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)","lastModifiedDate":"2021-07-31"},{"lineNumber":71,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":72,"author":{"gitId":"-"},"content":"\u003cpuml src\u003d\"diagrams/UiClassDiagram.puml\" alt\u003d\"Structure of the UI Component\"/\u003e","lastModifiedDate":"2023-09-12"},{"lineNumber":73,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":74,"author":{"gitId":"-"},"content":"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.","lastModifiedDate":"2021-07-31"},{"lineNumber":75,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":76,"author":{"gitId":"-"},"content":"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)","lastModifiedDate":"2021-07-31"},{"lineNumber":77,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":78,"author":{"gitId":"-"},"content":"The `UI` component,","lastModifiedDate":"2020-05-23"},{"lineNumber":79,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":80,"author":{"gitId":"-"},"content":"* executes user commands using the `Logic` component.","lastModifiedDate":"2021-07-31"},{"lineNumber":81,"author":{"gitId":"-"},"content":"* listens for changes to `Model` data so that the UI can be updated with the modified data.","lastModifiedDate":"2021-07-31"},{"lineNumber":82,"author":{"gitId":"-"},"content":"* keeps a reference to the `Logic` component, because the `UI` relies on the `Logic` to execute commands.","lastModifiedDate":"2021-07-31"},{"lineNumber":83,"author":{"gitId":"-"},"content":"* depends on some classes in the `Model` component, as it displays `Person` object residing in the `Model`.","lastModifiedDate":"2021-07-31"},{"lineNumber":84,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":85,"author":{"gitId":"-"},"content":"### Logic component","lastModifiedDate":"2020-05-23"},{"lineNumber":86,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":87,"author":{"gitId":"-"},"content":"**API** : [`Logic.java`](https://github.com/se-edu/addressbook-level3/tree/master/src/main/java/seedu/address/logic/Logic.java)","lastModifiedDate":"2021-07-31"},{"lineNumber":88,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":89,"author":{"gitId":"-"},"content":"Here\u0027s a (partial) class diagram of the `Logic` component:","lastModifiedDate":"2021-07-31"},{"lineNumber":90,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":91,"author":{"gitId":"-"},"content":"\u003cpuml src\u003d\"diagrams/LogicClassDiagram.puml\" width\u003d\"550\"/\u003e","lastModifiedDate":"2023-09-12"},{"lineNumber":92,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":93,"author":{"gitId":"-"},"content":"The sequence diagram below illustrates the interactions within the `Logic` component, taking `execute(\"delete 1\")` API call as an example.","lastModifiedDate":"2023-09-03"},{"lineNumber":94,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":95,"author":{"gitId":"-"},"content":"\u003cpuml src\u003d\"diagrams/DeleteSequenceDiagram.puml\" alt\u003d\"Interactions Inside the Logic Component for the `delete 1` Command\" /\u003e","lastModifiedDate":"2023-09-12"},{"lineNumber":96,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2023-09-12"},{"lineNumber":97,"author":{"gitId":"-"},"content":"\u003cbox type\u003d\"info\" seamless\u003e","lastModifiedDate":"2023-09-12"},{"lineNumber":98,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":99,"author":{"gitId":"-"},"content":"**Note:** The lifeline for `DeleteCommandParser` should end at the destroy marker (X) but due to a limitation of PlantUML, the lifeline continues till the end of diagram.","lastModifiedDate":"2023-09-12"},{"lineNumber":100,"author":{"gitId":"-"},"content":"\u003c/box\u003e","lastModifiedDate":"2023-09-12"},{"lineNumber":101,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":102,"author":{"gitId":"-"},"content":"How the `Logic` component works:","lastModifiedDate":"2023-09-03"},{"lineNumber":103,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2023-09-03"},{"lineNumber":104,"author":{"gitId":"-"},"content":"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.","lastModifiedDate":"2023-09-03"},{"lineNumber":105,"author":{"gitId":"-"},"content":"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`.","lastModifiedDate":"2023-09-03"},{"lineNumber":106,"author":{"gitId":"-"},"content":"1. The command can communicate with the `Model` when it is executed (e.g. to delete a person).\u003cbr\u003e","lastModifiedDate":"2024-02-09"},{"lineNumber":107,"author":{"gitId":"-"},"content":" Note that although this is shown as a single step in the diagram above (for simplicity), in the code it can take several interactions (between the command object and the `Model`) to achieve.","lastModifiedDate":"2024-02-09"},{"lineNumber":108,"author":{"gitId":"-"},"content":"1. The result of the command execution is encapsulated as a `CommandResult` object which is returned back from `Logic`.","lastModifiedDate":"2023-09-03"},{"lineNumber":109,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2023-09-03"},{"lineNumber":110,"author":{"gitId":"-"},"content":"Here are the other classes in `Logic` (omitted from the class diagram above) that are used for parsing a user command:","lastModifiedDate":"2021-07-31"},{"lineNumber":111,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2021-07-31"},{"lineNumber":112,"author":{"gitId":"-"},"content":"\u003cpuml src\u003d\"diagrams/ParserClasses.puml\" width\u003d\"600\"/\u003e","lastModifiedDate":"2023-09-12"},{"lineNumber":113,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":114,"author":{"gitId":"-"},"content":"How the parsing works:","lastModifiedDate":"2021-07-31"},{"lineNumber":115,"author":{"gitId":"-"},"content":"* 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.","lastModifiedDate":"2021-07-31"},{"lineNumber":116,"author":{"gitId":"-"},"content":"* 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.","lastModifiedDate":"2021-07-31"},{"lineNumber":117,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":118,"author":{"gitId":"-"},"content":"### Model component","lastModifiedDate":"2021-07-31"},{"lineNumber":119,"author":{"gitId":"-"},"content":"**API** : [`Model.java`](https://github.com/se-edu/addressbook-level3/tree/master/src/main/java/seedu/address/model/Model.java)","lastModifiedDate":"2020-05-23"},{"lineNumber":120,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":121,"author":{"gitId":"-"},"content":"\u003cpuml src\u003d\"diagrams/ModelClassDiagram.puml\" width\u003d\"450\" /\u003e","lastModifiedDate":"2023-09-12"},{"lineNumber":122,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":123,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":124,"author":{"gitId":"-"},"content":"The `Model` component,","lastModifiedDate":"2021-07-31"},{"lineNumber":125,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":126,"author":{"gitId":"-"},"content":"* stores the address book data i.e., all `Person` objects (which are contained in a `UniquePersonList` object).","lastModifiedDate":"2021-07-31"},{"lineNumber":127,"author":{"gitId":"-"},"content":"* stores the currently \u0027selected\u0027 `Person` objects (e.g., results of a search query) as a separate _filtered_ list which is exposed to outsiders as an unmodifiable `ObservableList\u003cPerson\u003e` that can be \u0027observed\u0027 e.g. the UI can be bound to this list so that the UI automatically updates when the data in the list change.","lastModifiedDate":"2021-07-31"},{"lineNumber":128,"author":{"gitId":"-"},"content":"* stores a `UserPref` object that represents the user’s preferences. This is exposed to the outside as a `ReadOnlyUserPref` objects.","lastModifiedDate":"2021-07-31"},{"lineNumber":129,"author":{"gitId":"-"},"content":"* 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)","lastModifiedDate":"2021-07-31"},{"lineNumber":130,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2021-07-31"},{"lineNumber":131,"author":{"gitId":"-"},"content":"\u003cbox type\u003d\"info\" seamless\u003e","lastModifiedDate":"2023-09-12"},{"lineNumber":132,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2023-09-12"},{"lineNumber":133,"author":{"gitId":"-"},"content":"**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.\u003cbr\u003e","lastModifiedDate":"2023-09-12"},{"lineNumber":134,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2021-07-31"},{"lineNumber":135,"author":{"gitId":"-"},"content":"\u003cpuml src\u003d\"diagrams/BetterModelClassDiagram.puml\" width\u003d\"450\" /\u003e","lastModifiedDate":"2023-09-12"},{"lineNumber":136,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":137,"author":{"gitId":"-"},"content":"\u003c/box\u003e","lastModifiedDate":"2023-09-12"},{"lineNumber":138,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":139,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":140,"author":{"gitId":"-"},"content":"### Storage component","lastModifiedDate":"2020-05-23"},{"lineNumber":141,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":142,"author":{"gitId":"-"},"content":"**API** : [`Storage.java`](https://github.com/se-edu/addressbook-level3/tree/master/src/main/java/seedu/address/storage/Storage.java)","lastModifiedDate":"2020-05-23"},{"lineNumber":143,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":144,"author":{"gitId":"-"},"content":"\u003cpuml src\u003d\"diagrams/StorageClassDiagram.puml\" width\u003d\"550\" /\u003e","lastModifiedDate":"2023-09-12"},{"lineNumber":145,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2021-07-31"},{"lineNumber":146,"author":{"gitId":"-"},"content":"The `Storage` component,","lastModifiedDate":"2020-05-23"},{"lineNumber":147,"author":{"gitId":"-"},"content":"* can save both address book data and user preference data in JSON format, and read them back into corresponding objects.","lastModifiedDate":"2023-09-03"},{"lineNumber":148,"author":{"gitId":"-"},"content":"* inherits from both `AddressBookStorage` and `UserPrefStorage`, which means it can be treated as either one (if only the functionality of only one is needed).","lastModifiedDate":"2021-07-31"},{"lineNumber":149,"author":{"gitId":"-"},"content":"* depends on some classes in the `Model` component (because the `Storage` component\u0027s job is to save/retrieve objects that belong to the `Model`)","lastModifiedDate":"2021-07-21"},{"lineNumber":150,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":151,"author":{"gitId":"-"},"content":"### Common classes","lastModifiedDate":"2020-05-23"},{"lineNumber":152,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":153,"author":{"gitId":"-"},"content":"Classes used by multiple components are in the `seedu.addressbook.commons` package.","lastModifiedDate":"2020-05-23"},{"lineNumber":154,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":155,"author":{"gitId":"-"},"content":"--------------------------------------------------------------------------------------------------------------------","lastModifiedDate":"2020-05-23"},{"lineNumber":156,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":157,"author":{"gitId":"-"},"content":"## **Implementation**","lastModifiedDate":"2020-05-23"},{"lineNumber":158,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":159,"author":{"gitId":"-"},"content":"This section describes some noteworthy details on how certain features are implemented.","lastModifiedDate":"2020-05-23"},{"lineNumber":160,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":161,"author":{"gitId":"-"},"content":"### \\[Proposed\\] Undo/redo feature","lastModifiedDate":"2020-06-07"},{"lineNumber":162,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":163,"author":{"gitId":"-"},"content":"#### Proposed Implementation","lastModifiedDate":"2020-05-23"},{"lineNumber":164,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":165,"author":{"gitId":"-"},"content":"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:","lastModifiedDate":"2020-05-23"},{"lineNumber":166,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":167,"author":{"gitId":"-"},"content":"* `VersionedAddressBook#commit()` — Saves the current address book state in its history.","lastModifiedDate":"2020-05-23"},{"lineNumber":168,"author":{"gitId":"-"},"content":"* `VersionedAddressBook#undo()` — Restores the previous address book state from its history.","lastModifiedDate":"2020-05-23"},{"lineNumber":169,"author":{"gitId":"-"},"content":"* `VersionedAddressBook#redo()` — Restores a previously undone address book state from its history.","lastModifiedDate":"2020-05-23"},{"lineNumber":170,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":171,"author":{"gitId":"-"},"content":"These operations are exposed in the `Model` interface as `Model#commitAddressBook()`, `Model#undoAddressBook()` and `Model#redoAddressBook()` respectively.","lastModifiedDate":"2020-05-23"},{"lineNumber":172,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":173,"author":{"gitId":"-"},"content":"Given below is an example usage scenario and how the undo/redo mechanism behaves at each step.","lastModifiedDate":"2020-05-23"},{"lineNumber":174,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":175,"author":{"gitId":"-"},"content":"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.","lastModifiedDate":"2020-05-23"},{"lineNumber":176,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":177,"author":{"gitId":"-"},"content":"\u003cpuml src\u003d\"diagrams/UndoRedoState0.puml\" alt\u003d\"UndoRedoState0\" /\u003e","lastModifiedDate":"2023-09-12"},{"lineNumber":178,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":179,"author":{"gitId":"-"},"content":"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.","lastModifiedDate":"2020-05-23"},{"lineNumber":180,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":181,"author":{"gitId":"-"},"content":"\u003cpuml src\u003d\"diagrams/UndoRedoState1.puml\" alt\u003d\"UndoRedoState1\" /\u003e","lastModifiedDate":"2023-09-12"},{"lineNumber":182,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":183,"author":{"gitId":"-"},"content":"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`.","lastModifiedDate":"2020-05-23"},{"lineNumber":184,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":185,"author":{"gitId":"-"},"content":"\u003cpuml src\u003d\"diagrams/UndoRedoState2.puml\" alt\u003d\"UndoRedoState2\" /\u003e","lastModifiedDate":"2023-09-12"},{"lineNumber":186,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":187,"author":{"gitId":"-"},"content":"\u003cbox type\u003d\"info\" seamless\u003e","lastModifiedDate":"2023-09-12"},{"lineNumber":188,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":189,"author":{"gitId":"-"},"content":"**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`.","lastModifiedDate":"2023-09-12"},{"lineNumber":190,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2023-09-12"},{"lineNumber":191,"author":{"gitId":"-"},"content":"\u003c/box\u003e","lastModifiedDate":"2023-09-12"},{"lineNumber":192,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":193,"author":{"gitId":"-"},"content":"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.","lastModifiedDate":"2020-05-23"},{"lineNumber":194,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":195,"author":{"gitId":"-"},"content":"\u003cpuml src\u003d\"diagrams/UndoRedoState3.puml\" alt\u003d\"UndoRedoState3\" /\u003e","lastModifiedDate":"2023-09-12"},{"lineNumber":196,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2023-09-12"},{"lineNumber":197,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2023-09-12"},{"lineNumber":198,"author":{"gitId":"-"},"content":"\u003cbox type\u003d\"info\" seamless\u003e","lastModifiedDate":"2023-09-12"},{"lineNumber":199,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":200,"author":{"gitId":"-"},"content":"**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","lastModifiedDate":"2023-09-12"},{"lineNumber":201,"author":{"gitId":"-"},"content":"than attempting to perform the undo.","lastModifiedDate":"2020-05-23"},{"lineNumber":202,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":203,"author":{"gitId":"-"},"content":"\u003c/box\u003e","lastModifiedDate":"2023-09-12"},{"lineNumber":204,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":205,"author":{"gitId":"-"},"content":"The following sequence diagram shows how an undo operation goes through the `Logic` component:","lastModifiedDate":"2024-02-09"},{"lineNumber":206,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":207,"author":{"gitId":"-"},"content":"\u003cpuml src\u003d\"diagrams/UndoSequenceDiagram-Logic.puml\" alt\u003d\"UndoSequenceDiagram-Logic\" /\u003e","lastModifiedDate":"2023-09-12"},{"lineNumber":208,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":209,"author":{"gitId":"-"},"content":"\u003cbox type\u003d\"info\" seamless\u003e","lastModifiedDate":"2023-09-12"},{"lineNumber":210,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":211,"author":{"gitId":"-"},"content":"**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.","lastModifiedDate":"2023-09-12"},{"lineNumber":212,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2023-09-12"},{"lineNumber":213,"author":{"gitId":"-"},"content":"\u003c/box\u003e","lastModifiedDate":"2023-09-12"},{"lineNumber":214,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":215,"author":{"gitId":"-"},"content":"Similarly, how an undo operation goes through the `Model` component is shown below:","lastModifiedDate":"2024-02-09"},{"lineNumber":216,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2024-02-09"},{"lineNumber":217,"author":{"gitId":"-"},"content":"\u003cpuml src\u003d\"diagrams/UndoSequenceDiagram-Model.puml\" alt\u003d\"UndoSequenceDiagram-Model\" /\u003e","lastModifiedDate":"2023-09-12"},{"lineNumber":218,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2024-02-09"},{"lineNumber":219,"author":{"gitId":"-"},"content":"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.","lastModifiedDate":"2020-05-23"},{"lineNumber":220,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":221,"author":{"gitId":"-"},"content":"\u003cbox type\u003d\"info\" seamless\u003e","lastModifiedDate":"2023-09-12"},{"lineNumber":222,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2023-09-12"},{"lineNumber":223,"author":{"gitId":"-"},"content":"**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.","lastModifiedDate":"2023-09-12"},{"lineNumber":224,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":225,"author":{"gitId":"-"},"content":"\u003c/box\u003e","lastModifiedDate":"2023-09-12"},{"lineNumber":226,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":227,"author":{"gitId":"-"},"content":"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.","lastModifiedDate":"2020-05-23"},{"lineNumber":228,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":229,"author":{"gitId":"-"},"content":"\u003cpuml src\u003d\"diagrams/UndoRedoState4.puml\" alt\u003d\"UndoRedoState4\" /\u003e","lastModifiedDate":"2023-09-12"},{"lineNumber":230,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":231,"author":{"gitId":"-"},"content":"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.","lastModifiedDate":"2020-05-23"},{"lineNumber":232,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":233,"author":{"gitId":"-"},"content":"\u003cpuml src\u003d\"diagrams/UndoRedoState5.puml\" alt\u003d\"UndoRedoState5\" /\u003e","lastModifiedDate":"2023-09-12"},{"lineNumber":234,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":235,"author":{"gitId":"-"},"content":"The following activity diagram summarizes what happens when a user executes a new command:","lastModifiedDate":"2020-05-23"},{"lineNumber":236,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":237,"author":{"gitId":"-"},"content":"\u003cpuml src\u003d\"diagrams/CommitActivityDiagram.puml\" width\u003d\"250\" /\u003e","lastModifiedDate":"2023-09-12"},{"lineNumber":238,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":239,"author":{"gitId":"-"},"content":"#### Design considerations:","lastModifiedDate":"2021-07-31"},{"lineNumber":240,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":241,"author":{"gitId":"-"},"content":"**Aspect: How undo \u0026 redo executes:**","lastModifiedDate":"2021-07-31"},{"lineNumber":242,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":243,"author":{"gitId":"-"},"content":"* **Alternative 1 (current choice):** Saves the entire address book.","lastModifiedDate":"2020-05-23"},{"lineNumber":244,"author":{"gitId":"-"},"content":" * Pros: Easy to implement.","lastModifiedDate":"2020-05-23"},{"lineNumber":245,"author":{"gitId":"-"},"content":" * Cons: May have performance issues in terms of memory usage.","lastModifiedDate":"2020-05-23"},{"lineNumber":246,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":247,"author":{"gitId":"-"},"content":"* **Alternative 2:** Individual command knows how to undo/redo by","lastModifiedDate":"2020-05-23"},{"lineNumber":248,"author":{"gitId":"-"},"content":" itself.","lastModifiedDate":"2020-05-23"},{"lineNumber":249,"author":{"gitId":"-"},"content":" * Pros: Will use less memory (e.g. for `delete`, just save the person being deleted).","lastModifiedDate":"2020-05-23"},{"lineNumber":250,"author":{"gitId":"-"},"content":" * Cons: We must ensure that the implementation of each individual command are correct.","lastModifiedDate":"2020-05-23"},{"lineNumber":251,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":252,"author":{"gitId":"-"},"content":"_{more aspects and alternatives to be added}_","lastModifiedDate":"2020-05-23"},{"lineNumber":253,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":254,"author":{"gitId":"-"},"content":"### \\[Proposed\\] Data archiving","lastModifiedDate":"2020-05-23"},{"lineNumber":255,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":256,"author":{"gitId":"-"},"content":"_{Explain here how the data archiving feature will be implemented}_","lastModifiedDate":"2020-05-23"},{"lineNumber":257,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":258,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":259,"author":{"gitId":"-"},"content":"--------------------------------------------------------------------------------------------------------------------","lastModifiedDate":"2020-05-23"},{"lineNumber":260,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":261,"author":{"gitId":"-"},"content":"## **Documentation, logging, testing, configuration, dev-ops**","lastModifiedDate":"2020-06-07"},{"lineNumber":262,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":263,"author":{"gitId":"-"},"content":"* [Documentation guide](Documentation.md)","lastModifiedDate":"2020-06-07"},{"lineNumber":264,"author":{"gitId":"-"},"content":"* [Testing guide](Testing.md)","lastModifiedDate":"2020-06-07"},{"lineNumber":265,"author":{"gitId":"-"},"content":"* [Logging guide](Logging.md)","lastModifiedDate":"2020-06-07"},{"lineNumber":266,"author":{"gitId":"-"},"content":"* [Configuration guide](Configuration.md)","lastModifiedDate":"2020-06-07"},{"lineNumber":267,"author":{"gitId":"-"},"content":"* [DevOps guide](DevOps.md)","lastModifiedDate":"2020-06-07"},{"lineNumber":268,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":269,"author":{"gitId":"-"},"content":"--------------------------------------------------------------------------------------------------------------------","lastModifiedDate":"2020-05-23"},{"lineNumber":270,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":271,"author":{"gitId":"-"},"content":"## **Appendix: Requirements**","lastModifiedDate":"2020-05-23"},{"lineNumber":272,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":273,"author":{"gitId":"-"},"content":"### Product scope","lastModifiedDate":"2020-05-23"},{"lineNumber":274,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":275,"author":{"gitId":"-"},"content":"**Target user profile**:","lastModifiedDate":"2020-05-23"},{"lineNumber":276,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":277,"author":{"gitId":"limrik"},"content":"* has a need to manage a significant number of patient information","lastModifiedDate":"2024-03-05"},{"lineNumber":278,"author":{"gitId":"limrik"},"content":"* has a need to schedule patients for appointments","lastModifiedDate":"2024-03-05"},{"lineNumber":279,"author":{"gitId":"limrik"},"content":"* prefers to manage patient information and appointments in one application","lastModifiedDate":"2024-03-05"},{"lineNumber":280,"author":{"gitId":"-"},"content":"* prefer desktop apps over other types","lastModifiedDate":"2020-05-23"},{"lineNumber":281,"author":{"gitId":"-"},"content":"* can type fast","lastModifiedDate":"2020-05-23"},{"lineNumber":282,"author":{"gitId":"-"},"content":"* prefers typing to mouse interactions","lastModifiedDate":"2020-05-26"},{"lineNumber":283,"author":{"gitId":"-"},"content":"* is reasonably comfortable using CLI apps","lastModifiedDate":"2020-05-23"},{"lineNumber":284,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":285,"author":{"gitId":"limrik"},"content":"**Value proposition**: manage patient appointments faster than a typical mouse/GUI driven app","lastModifiedDate":"2024-03-05"},{"lineNumber":286,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":287,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":288,"author":{"gitId":"-"},"content":"### User stories","lastModifiedDate":"2020-06-07"},{"lineNumber":289,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":290,"author":{"gitId":"-"},"content":"Priorities: High (must have) - `* * *`, Medium (nice to have) - `* *`, Low (unlikely to have) - `*`","lastModifiedDate":"2020-05-23"},{"lineNumber":291,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":292,"author":{"gitId":"-"},"content":"| Priority | As a …​ | I want to …​ | So that I can…​ |","lastModifiedDate":"2020-05-23"},{"lineNumber":293,"author":{"gitId":"limrik"},"content":"|----------|---------|------------------------------------------------------------------------------------|----------------------------------------------------------------------------------|","lastModifiedDate":"2024-03-05"},{"lineNumber":294,"author":{"gitId":"limrik"},"content":"| `* * *` | user | add a new patient | |","lastModifiedDate":"2024-03-05"},{"lineNumber":295,"author":{"gitId":"limrik"},"content":"| `* * *` | user | delete a patient | |","lastModifiedDate":"2024-03-05"},{"lineNumber":296,"author":{"gitId":"limrik"},"content":"| `* * *` | user | schedule an appointment for a patient | |","lastModifiedDate":"2024-03-05"},{"lineNumber":297,"author":{"gitId":"limrik"},"content":"| `* * *` | user | cancel an appointment | account for changes in scheduling |","lastModifiedDate":"2024-03-05"},{"lineNumber":298,"author":{"gitId":"limrik"},"content":"| `* * *` | user | have an overall view of upcoming patient appointments | have situational awareness of the schedule for the day |","lastModifiedDate":"2024-03-05"},{"lineNumber":299,"author":{"gitId":"limrik"},"content":"| `* * *` | user | mark patients who have been seen for the day | track patient\u0027s appointment attendance |","lastModifiedDate":"2024-03-05"},{"lineNumber":300,"author":{"gitId":"limrik"},"content":"| `* *` | user | update a patient\u0027s information | keep the database up to date |","lastModifiedDate":"2024-03-05"},{"lineNumber":301,"author":{"gitId":"limrik"},"content":"| `* *` | user | easily filter the patients by their medical records | see which is in need of more assistance or follow up care |","lastModifiedDate":"2024-03-05"},{"lineNumber":302,"author":{"gitId":"limrik"},"content":"| `* *` | user | search for patients by their name | look up their appointment information quickly |","lastModifiedDate":"2024-03-05"},{"lineNumber":303,"author":{"gitId":"limrik"},"content":"| `* *` | user | update the details of the appointment | reschedule appointments as needed |","lastModifiedDate":"2024-03-05"},{"lineNumber":304,"author":{"gitId":"limrik"},"content":"| `* *` | user | view the list of patients for the given hour | see the immediate schedule |","lastModifiedDate":"2024-03-05"},{"lineNumber":305,"author":{"gitId":"limrik"},"content":"| `* *` | user | tag appointments based on appointment type | I can categorize which appointments require test or room bookings |","lastModifiedDate":"2024-03-05"},{"lineNumber":306,"author":{"gitId":"limrik"},"content":"| `* *` | user | tag appointments based on insurance type | prepare necessary insurance documents before patient’s appointments |","lastModifiedDate":"2024-03-05"},{"lineNumber":307,"author":{"gitId":"limrik"},"content":"| `* *` | user | input commands without having inputs to be in a specific order | key in commands fast in busy periods |","lastModifiedDate":"2024-03-05"},{"lineNumber":308,"author":{"gitId":"limrik"},"content":"| `*` | user | sort the time to a patient\u0027s appointment | remind patients of their appointment |","lastModifiedDate":"2024-03-05"},{"lineNumber":309,"author":{"gitId":"limrik"},"content":"| `*` | user | see how long it has been since a patient\u0027s last appointment | remind patients to come for another checkup |","lastModifiedDate":"2024-03-05"},{"lineNumber":310,"author":{"gitId":"limrik"},"content":"| `*` | user | see what appointments are overlapping | ensure the patients have enough time to be seen for their different appointments |","lastModifiedDate":"2024-03-05"},{"lineNumber":311,"author":{"gitId":"limrik"},"content":"| `*` | user | set notifications for upcoming appointments | staff and patients can be well informed early in advance |","lastModifiedDate":"2024-03-05"},{"lineNumber":312,"author":{"gitId":"limrik"},"content":"| `*` | user | track if the patients have been sent reminders on their appointments | patients do not get spammed with reminders |","lastModifiedDate":"2024-03-05"},{"lineNumber":313,"author":{"gitId":"limrik"},"content":"| `*` | user | be notified of upcoming appointments on entry into the system | will not miss approaching deadlines |","lastModifiedDate":"2024-03-05"},{"lineNumber":314,"author":{"gitId":"limrik"},"content":"| `*` | user | easily contact the patients via SMS or email through the program | update patients about their details and upcoming appointments |","lastModifiedDate":"2024-03-05"},{"lineNumber":315,"author":{"gitId":"limrik"},"content":"| `*` | user | quickly navigate the CLI with intuitive commands | increase my efficiency |","lastModifiedDate":"2024-03-05"},{"lineNumber":316,"author":{"gitId":"limrik"},"content":"| `*` | user | check if patients are related to one another | have alternate contacts |","lastModifiedDate":"2024-03-05"},{"lineNumber":317,"author":{"gitId":"limrik"},"content":"| `*` | user | update or create new records in bulk | process a family more efficiently |","lastModifiedDate":"2024-03-05"},{"lineNumber":318,"author":{"gitId":"limrik"},"content":"| `*` | user | set recurring tasks | I do not have to keep scheduling recurring appointments |","lastModifiedDate":"2024-03-05"},{"lineNumber":319,"author":{"gitId":"limrik"},"content":"| `*` | user | retrieve past records or revert changes easily | revert my changes if I accidentally delete or wrongly edit a patient’s records |","lastModifiedDate":"2024-03-05"},{"lineNumber":320,"author":{"gitId":"limrik"},"content":"| `*` | user | select what information is available when I view the list of patients | cater the view to my needs |","lastModifiedDate":"2024-03-05"},{"lineNumber":321,"author":{"gitId":"limrik"},"content":"| `*` | user | add notes to a patient | include other additional information |","lastModifiedDate":"2024-03-05"},{"lineNumber":322,"author":{"gitId":"limrik"},"content":"| `*` | user | easily generate reports of the patient details and export it to the doctor/patient | have easy access |","lastModifiedDate":"2024-03-05"},{"lineNumber":323,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":324,"author":{"gitId":"-"},"content":"### Use cases","lastModifiedDate":"2020-06-07"},{"lineNumber":325,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":326,"author":{"gitId":"-"},"content":"(For all use cases below, the **System** is the `AddressBook` and the **Actor** is the `user`, unless specified otherwise)","lastModifiedDate":"2020-05-23"},{"lineNumber":327,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":328,"author":{"gitId":"ThatGirlJam"},"content":"// EXAMPLE //","lastModifiedDate":"2024-03-05"},{"lineNumber":329,"author":{"gitId":"-"},"content":"**Use case: Delete a person**","lastModifiedDate":"2020-05-23"},{"lineNumber":330,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":331,"author":{"gitId":"-"},"content":"**MSS**","lastModifiedDate":"2020-05-23"},{"lineNumber":332,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":333,"author":{"gitId":"-"},"content":"1. User requests to list persons","lastModifiedDate":"2020-05-23"},{"lineNumber":334,"author":{"gitId":"-"},"content":"2. AddressBook shows a list of persons","lastModifiedDate":"2020-05-23"},{"lineNumber":335,"author":{"gitId":"-"},"content":"3. User requests to delete a specific person in the list","lastModifiedDate":"2020-05-23"},{"lineNumber":336,"author":{"gitId":"-"},"content":"4. AddressBook deletes the person","lastModifiedDate":"2020-05-23"},{"lineNumber":337,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":338,"author":{"gitId":"-"},"content":" Use case ends.","lastModifiedDate":"2020-05-23"},{"lineNumber":339,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":340,"author":{"gitId":"-"},"content":"**Extensions**","lastModifiedDate":"2020-05-23"},{"lineNumber":341,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":342,"author":{"gitId":"-"},"content":"* 2a. The list is empty.","lastModifiedDate":"2020-05-23"},{"lineNumber":343,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":344,"author":{"gitId":"-"},"content":" Use case ends.","lastModifiedDate":"2020-05-23"},{"lineNumber":345,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":346,"author":{"gitId":"-"},"content":"* 3a. The given index is invalid.","lastModifiedDate":"2020-05-23"},{"lineNumber":347,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":348,"author":{"gitId":"-"},"content":" * 3a1. AddressBook shows an error message.","lastModifiedDate":"2020-05-23"},{"lineNumber":349,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":350,"author":{"gitId":"-"},"content":" Use case resumes at step 2.","lastModifiedDate":"2020-05-23"},{"lineNumber":351,"author":{"gitId":"ThatGirlJam"},"content":"// EXAMPLE //","lastModifiedDate":"2024-03-05"},{"lineNumber":352,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":353,"author":{"gitId":"ThatGirlJam"},"content":"**Use case (UC1) : Add new patient information to the database**","lastModifiedDate":"2024-03-05"},{"lineNumber":354,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2024-03-05"},{"lineNumber":355,"author":{"gitId":"ThatGirlJam"},"content":"**MSS**","lastModifiedDate":"2024-03-05"},{"lineNumber":356,"author":{"gitId":"ThatGirlJam"},"content":"","lastModifiedDate":"2024-03-05"},{"lineNumber":357,"author":{"gitId":"ThatGirlJam"},"content":"1. User requests to add new patient information","lastModifiedDate":"2024-03-05"},{"lineNumber":358,"author":{"gitId":"ThatGirlJam"},"content":"2. AddressBook validates the information ","lastModifiedDate":"2024-03-05"},{"lineNumber":359,"author":{"gitId":"ThatGirlJam"},"content":"3. AddressBook adds the patient\u0027s information to the database","lastModifiedDate":"2024-03-05"},{"lineNumber":360,"author":{"gitId":"ThatGirlJam"},"content":"","lastModifiedDate":"2024-03-05"},{"lineNumber":361,"author":{"gitId":"ThatGirlJam"},"content":" Use case ends.","lastModifiedDate":"2024-03-05"},{"lineNumber":362,"author":{"gitId":"ThatGirlJam"},"content":"","lastModifiedDate":"2024-03-05"},{"lineNumber":363,"author":{"gitId":"ThatGirlJam"},"content":"**Extensions**","lastModifiedDate":"2024-03-05"},{"lineNumber":364,"author":{"gitId":"ThatGirlJam"},"content":"","lastModifiedDate":"2024-03-05"},{"lineNumber":365,"author":{"gitId":"ThatGirlJam"},"content":"* 1a. The required information is missing.","lastModifiedDate":"2024-03-05"},{"lineNumber":366,"author":{"gitId":"ThatGirlJam"},"content":"","lastModifiedDate":"2024-03-05"},{"lineNumber":367,"author":{"gitId":"ThatGirlJam"},"content":" * 1a1. AddressBook prompts user to input required information.","lastModifiedDate":"2024-03-05"},{"lineNumber":368,"author":{"gitId":"ThatGirlJam"},"content":"","lastModifiedDate":"2024-03-05"},{"lineNumber":369,"author":{"gitId":"ThatGirlJam"},"content":" Use case resumes at step 1.","lastModifiedDate":"2024-03-05"},{"lineNumber":370,"author":{"gitId":"ThatGirlJam"},"content":"","lastModifiedDate":"2024-03-05"},{"lineNumber":371,"author":{"gitId":"ThatGirlJam"},"content":"* 2a. The given information is invalid.","lastModifiedDate":"2024-03-05"},{"lineNumber":372,"author":{"gitId":"ThatGirlJam"},"content":"","lastModifiedDate":"2024-03-05"},{"lineNumber":373,"author":{"gitId":"ThatGirlJam"},"content":" * 2a1. AddressBook shows an error message.","lastModifiedDate":"2024-03-05"},{"lineNumber":374,"author":{"gitId":"ThatGirlJam"},"content":"","lastModifiedDate":"2024-03-05"},{"lineNumber":375,"author":{"gitId":"ThatGirlJam"},"content":" Use case resumes at step 1.","lastModifiedDate":"2024-03-05"},{"lineNumber":376,"author":{"gitId":"ThatGirlJam"},"content":"","lastModifiedDate":"2024-03-05"},{"lineNumber":377,"author":{"gitId":"ThatGirlJam"},"content":"**Use case (UC2) : Delete patient information from the database**","lastModifiedDate":"2024-03-05"},{"lineNumber":378,"author":{"gitId":"ThatGirlJam"},"content":"","lastModifiedDate":"2024-03-05"},{"lineNumber":379,"author":{"gitId":"ThatGirlJam"},"content":"**MSS**","lastModifiedDate":"2024-03-05"},{"lineNumber":380,"author":{"gitId":"ThatGirlJam"},"content":"","lastModifiedDate":"2024-03-05"},{"lineNumber":381,"author":{"gitId":"ThatGirlJam"},"content":"1. User requests to list persons","lastModifiedDate":"2024-03-05"},{"lineNumber":382,"author":{"gitId":"ThatGirlJam"},"content":"2. AddressBook shows a list of persons","lastModifiedDate":"2024-03-05"},{"lineNumber":383,"author":{"gitId":"ThatGirlJam"},"content":"3. User requests to delete a specific person in the list","lastModifiedDate":"2024-03-05"},{"lineNumber":384,"author":{"gitId":"ThatGirlJam"},"content":"4. AddressBook deletes the person","lastModifiedDate":"2024-03-05"},{"lineNumber":385,"author":{"gitId":"ThatGirlJam"},"content":"","lastModifiedDate":"2024-03-05"},{"lineNumber":386,"author":{"gitId":"ThatGirlJam"},"content":" Use case ends.","lastModifiedDate":"2024-03-05"},{"lineNumber":387,"author":{"gitId":"ThatGirlJam"},"content":"","lastModifiedDate":"2024-03-05"},{"lineNumber":388,"author":{"gitId":"ThatGirlJam"},"content":"**Extensions**","lastModifiedDate":"2024-03-05"},{"lineNumber":389,"author":{"gitId":"ThatGirlJam"},"content":"","lastModifiedDate":"2024-03-05"},{"lineNumber":390,"author":{"gitId":"ThatGirlJam"},"content":"* 2a. The list is empty.","lastModifiedDate":"2024-03-05"},{"lineNumber":391,"author":{"gitId":"ThatGirlJam"},"content":"","lastModifiedDate":"2024-03-05"},{"lineNumber":392,"author":{"gitId":"ThatGirlJam"},"content":" Use case ends.","lastModifiedDate":"2024-03-05"},{"lineNumber":393,"author":{"gitId":"ThatGirlJam"},"content":"","lastModifiedDate":"2024-03-05"},{"lineNumber":394,"author":{"gitId":"ThatGirlJam"},"content":"* 3a. The given index is invalid.","lastModifiedDate":"2024-03-05"},{"lineNumber":395,"author":{"gitId":"ThatGirlJam"},"content":"","lastModifiedDate":"2024-03-05"},{"lineNumber":396,"author":{"gitId":"ThatGirlJam"},"content":" * 3a1. AddressBook shows an error message.","lastModifiedDate":"2024-03-05"},{"lineNumber":397,"author":{"gitId":"ThatGirlJam"},"content":"","lastModifiedDate":"2024-03-05"},{"lineNumber":398,"author":{"gitId":"ThatGirlJam"},"content":" Use case resumes at step 2.","lastModifiedDate":"2024-03-05"},{"lineNumber":399,"author":{"gitId":"ThatGirlJam"},"content":"","lastModifiedDate":"2024-03-05"},{"lineNumber":400,"author":{"gitId":"ThatGirlJam"},"content":"**Use case (UC3) : Schedule an appointment for the patient**","lastModifiedDate":"2024-03-05"},{"lineNumber":401,"author":{"gitId":"ThatGirlJam"},"content":"","lastModifiedDate":"2024-03-05"},{"lineNumber":402,"author":{"gitId":"ThatGirlJam"},"content":"**MSS**","lastModifiedDate":"2024-03-05"},{"lineNumber":403,"author":{"gitId":"ThatGirlJam"},"content":"","lastModifiedDate":"2024-03-05"},{"lineNumber":404,"author":{"gitId":"ThatGirlJam"},"content":"1. User requests to list persons","lastModifiedDate":"2024-03-05"},{"lineNumber":405,"author":{"gitId":"ThatGirlJam"},"content":"2. AddressBook shows a list of persons","lastModifiedDate":"2024-03-05"},{"lineNumber":406,"author":{"gitId":"ThatGirlJam"},"content":"3. User requests to schedule an appointment for a specific person in the list","lastModifiedDate":"2024-03-05"},{"lineNumber":407,"author":{"gitId":"ThatGirlJam"},"content":"4. AddressBook prompts User to input appointment details","lastModifiedDate":"2024-03-05"},{"lineNumber":408,"author":{"gitId":"ThatGirlJam"},"content":"5. User inputs appointment details ","lastModifiedDate":"2024-03-05"},{"lineNumber":409,"author":{"gitId":"ThatGirlJam"},"content":"6. AddressBook schedules appointment for the patient","lastModifiedDate":"2024-03-05"},{"lineNumber":410,"author":{"gitId":"ThatGirlJam"},"content":"","lastModifiedDate":"2024-03-05"},{"lineNumber":411,"author":{"gitId":"ThatGirlJam"},"content":" Use case ends.","lastModifiedDate":"2024-03-05"},{"lineNumber":412,"author":{"gitId":"ThatGirlJam"},"content":"","lastModifiedDate":"2024-03-05"},{"lineNumber":413,"author":{"gitId":"ThatGirlJam"},"content":"**Extensions**","lastModifiedDate":"2024-03-05"},{"lineNumber":414,"author":{"gitId":"ThatGirlJam"},"content":"","lastModifiedDate":"2024-03-05"},{"lineNumber":415,"author":{"gitId":"ThatGirlJam"},"content":"* 2a. The list is empty.","lastModifiedDate":"2024-03-05"},{"lineNumber":416,"author":{"gitId":"ThatGirlJam"},"content":"","lastModifiedDate":"2024-03-05"},{"lineNumber":417,"author":{"gitId":"ThatGirlJam"},"content":" Use case ends.","lastModifiedDate":"2024-03-05"},{"lineNumber":418,"author":{"gitId":"ThatGirlJam"},"content":"","lastModifiedDate":"2024-03-05"},{"lineNumber":419,"author":{"gitId":"ThatGirlJam"},"content":"* 5a. The given appointment details are invalid.","lastModifiedDate":"2024-03-05"},{"lineNumber":420,"author":{"gitId":"ThatGirlJam"},"content":"","lastModifiedDate":"2024-03-05"},{"lineNumber":421,"author":{"gitId":"ThatGirlJam"},"content":" * 5a1. AddressBook shows an error message.","lastModifiedDate":"2024-03-05"},{"lineNumber":422,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2024-03-05"},{"lineNumber":423,"author":{"gitId":"ThatGirlJam"},"content":" Use case resumes at step 4.","lastModifiedDate":"2024-03-05"},{"lineNumber":424,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2024-03-05"},{"lineNumber":425,"author":{"gitId":"ThatGirlJam"},"content":"**Use case (UC4) : Cancel an appointment**","lastModifiedDate":"2024-03-05"},{"lineNumber":426,"author":{"gitId":"ThatGirlJam"},"content":"","lastModifiedDate":"2024-03-05"},{"lineNumber":427,"author":{"gitId":"ThatGirlJam"},"content":"**MSS**","lastModifiedDate":"2024-03-05"},{"lineNumber":428,"author":{"gitId":"ThatGirlJam"},"content":"","lastModifiedDate":"2024-03-05"},{"lineNumber":429,"author":{"gitId":"ThatGirlJam"},"content":"1. User requests to list persons","lastModifiedDate":"2024-03-05"},{"lineNumber":430,"author":{"gitId":"ThatGirlJam"},"content":"2. AddressBook shows a list of persons","lastModifiedDate":"2024-03-05"},{"lineNumber":431,"author":{"gitId":"ThatGirlJam"},"content":"3. User requests to cancel an appointment for a specific person in the list","lastModifiedDate":"2024-03-05"},{"lineNumber":432,"author":{"gitId":"ThatGirlJam"},"content":"4. AddressBook prompts User to input appointment details","lastModifiedDate":"2024-03-05"},{"lineNumber":433,"author":{"gitId":"ThatGirlJam"},"content":"5. User inputs appointment details","lastModifiedDate":"2024-03-05"},{"lineNumber":434,"author":{"gitId":"ThatGirlJam"},"content":"6. AddressBook cancels appointment for the patient","lastModifiedDate":"2024-03-05"},{"lineNumber":435,"author":{"gitId":"ThatGirlJam"},"content":"","lastModifiedDate":"2024-03-05"},{"lineNumber":436,"author":{"gitId":"ThatGirlJam"},"content":" Use case ends.","lastModifiedDate":"2024-03-05"},{"lineNumber":437,"author":{"gitId":"ThatGirlJam"},"content":"","lastModifiedDate":"2024-03-05"},{"lineNumber":438,"author":{"gitId":"ThatGirlJam"},"content":"**Extensions**","lastModifiedDate":"2024-03-05"},{"lineNumber":439,"author":{"gitId":"ThatGirlJam"},"content":"","lastModifiedDate":"2024-03-05"},{"lineNumber":440,"author":{"gitId":"ThatGirlJam"},"content":"* 2a. The list is empty.","lastModifiedDate":"2024-03-05"},{"lineNumber":441,"author":{"gitId":"ThatGirlJam"},"content":"","lastModifiedDate":"2024-03-05"},{"lineNumber":442,"author":{"gitId":"ThatGirlJam"},"content":" Use case ends.","lastModifiedDate":"2024-03-05"},{"lineNumber":443,"author":{"gitId":"ThatGirlJam"},"content":"","lastModifiedDate":"2024-03-05"},{"lineNumber":444,"author":{"gitId":"ThatGirlJam"},"content":"* 5a. The given appointment details are invalid.","lastModifiedDate":"2024-03-05"},{"lineNumber":445,"author":{"gitId":"ThatGirlJam"},"content":"","lastModifiedDate":"2024-03-05"},{"lineNumber":446,"author":{"gitId":"ThatGirlJam"},"content":" * 5a1. AddressBook shows an error message.","lastModifiedDate":"2024-03-05"},{"lineNumber":447,"author":{"gitId":"ThatGirlJam"},"content":"","lastModifiedDate":"2024-03-05"},{"lineNumber":448,"author":{"gitId":"ThatGirlJam"},"content":" Use case resumes at step 4.","lastModifiedDate":"2024-03-05"},{"lineNumber":449,"author":{"gitId":"ThatGirlJam"},"content":"","lastModifiedDate":"2024-03-05"},{"lineNumber":450,"author":{"gitId":"ThatGirlJam"},"content":"* 6a. There is no appointment scheduled for that slot.","lastModifiedDate":"2024-03-05"},{"lineNumber":451,"author":{"gitId":"ThatGirlJam"},"content":"","lastModifiedDate":"2024-03-05"},{"lineNumber":452,"author":{"gitId":"ThatGirlJam"},"content":" Use case ends.","lastModifiedDate":"2024-03-05"},{"lineNumber":453,"author":{"gitId":"ThatGirlJam"},"content":"","lastModifiedDate":"2024-03-05"},{"lineNumber":454,"author":{"gitId":"ThatGirlJam"},"content":"**Use case (UC5) : View all upcoming appointments displayed in a concise and accessible format**","lastModifiedDate":"2024-03-05"},{"lineNumber":455,"author":{"gitId":"ThatGirlJam"},"content":"","lastModifiedDate":"2024-03-05"},{"lineNumber":456,"author":{"gitId":"ThatGirlJam"},"content":"**MSS**","lastModifiedDate":"2024-03-05"},{"lineNumber":457,"author":{"gitId":"ThatGirlJam"},"content":"","lastModifiedDate":"2024-03-05"},{"lineNumber":458,"author":{"gitId":"ThatGirlJam"},"content":"1. User requests to view all upcoming appointments","lastModifiedDate":"2024-03-05"},{"lineNumber":459,"author":{"gitId":"ThatGirlJam"},"content":"2. AddressBook shows a list of upcoming appointments","lastModifiedDate":"2024-03-05"},{"lineNumber":460,"author":{"gitId":"ThatGirlJam"},"content":"","lastModifiedDate":"2024-03-05"},{"lineNumber":461,"author":{"gitId":"ThatGirlJam"},"content":" Use case ends.","lastModifiedDate":"2024-03-05"},{"lineNumber":462,"author":{"gitId":"ThatGirlJam"},"content":"","lastModifiedDate":"2024-03-05"},{"lineNumber":463,"author":{"gitId":"ThatGirlJam"},"content":"**Extensions**","lastModifiedDate":"2024-03-05"},{"lineNumber":464,"author":{"gitId":"ThatGirlJam"},"content":"","lastModifiedDate":"2024-03-05"},{"lineNumber":465,"author":{"gitId":"ThatGirlJam"},"content":"* 2a. The list is empty.","lastModifiedDate":"2024-03-05"},{"lineNumber":466,"author":{"gitId":"ThatGirlJam"},"content":"","lastModifiedDate":"2024-03-05"},{"lineNumber":467,"author":{"gitId":"ThatGirlJam"},"content":" Use case ends.","lastModifiedDate":"2024-03-05"},{"lineNumber":468,"author":{"gitId":"ThatGirlJam"},"content":"","lastModifiedDate":"2024-03-05"},{"lineNumber":469,"author":{"gitId":"ThatGirlJam"},"content":"**Use case (UC6) : Mark patient appointment as seen for that day**","lastModifiedDate":"2024-03-05"},{"lineNumber":470,"author":{"gitId":"ThatGirlJam"},"content":"","lastModifiedDate":"2024-03-05"},{"lineNumber":471,"author":{"gitId":"ThatGirlJam"},"content":"**MSS**","lastModifiedDate":"2024-03-05"},{"lineNumber":472,"author":{"gitId":"ThatGirlJam"},"content":"","lastModifiedDate":"2024-03-05"},{"lineNumber":473,"author":{"gitId":"ThatGirlJam"},"content":"1. User requests to \u003cins\u003e view all upcoming appointments (UC5) \u003c/ins\u003e","lastModifiedDate":"2024-03-05"},{"lineNumber":474,"author":{"gitId":"ThatGirlJam"},"content":"2. AddressBook shows a list of upcoming appointments","lastModifiedDate":"2024-03-05"},{"lineNumber":475,"author":{"gitId":"ThatGirlJam"},"content":"3. User requests to mark a specific appointment in the list","lastModifiedDate":"2024-03-05"},{"lineNumber":476,"author":{"gitId":"ThatGirlJam"},"content":"4. AddressBook marks the appointment","lastModifiedDate":"2024-03-05"},{"lineNumber":477,"author":{"gitId":"ThatGirlJam"},"content":"","lastModifiedDate":"2024-03-05"},{"lineNumber":478,"author":{"gitId":"ThatGirlJam"},"content":" Use case ends.","lastModifiedDate":"2024-03-05"},{"lineNumber":479,"author":{"gitId":"ThatGirlJam"},"content":"","lastModifiedDate":"2024-03-05"},{"lineNumber":480,"author":{"gitId":"ThatGirlJam"},"content":"**Extensions**","lastModifiedDate":"2024-03-05"},{"lineNumber":481,"author":{"gitId":"ThatGirlJam"},"content":"","lastModifiedDate":"2024-03-05"},{"lineNumber":482,"author":{"gitId":"ThatGirlJam"},"content":"* 2a. The list is empty.","lastModifiedDate":"2024-03-05"},{"lineNumber":483,"author":{"gitId":"ThatGirlJam"},"content":"","lastModifiedDate":"2024-03-05"},{"lineNumber":484,"author":{"gitId":"ThatGirlJam"},"content":" Use case ends.","lastModifiedDate":"2024-03-05"},{"lineNumber":485,"author":{"gitId":"ThatGirlJam"},"content":"","lastModifiedDate":"2024-03-05"},{"lineNumber":486,"author":{"gitId":"ThatGirlJam"},"content":"* 3a. The given index is invalid.","lastModifiedDate":"2024-03-05"},{"lineNumber":487,"author":{"gitId":"ThatGirlJam"},"content":"","lastModifiedDate":"2024-03-05"},{"lineNumber":488,"author":{"gitId":"ThatGirlJam"},"content":" * 3a1. AddressBook shows an error message.","lastModifiedDate":"2024-03-05"},{"lineNumber":489,"author":{"gitId":"ThatGirlJam"},"content":"","lastModifiedDate":"2024-03-05"},{"lineNumber":490,"author":{"gitId":"ThatGirlJam"},"content":" Use case resumes at step 2.","lastModifiedDate":"2024-03-05"},{"lineNumber":491,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":492,"author":{"gitId":"-"},"content":"### Non-Functional Requirements","lastModifiedDate":"2020-05-23"},{"lineNumber":493,"author":{"gitId":"dayn-1"},"content":"1. Patients should not have overlapping appointments","lastModifiedDate":"2024-03-06"},{"lineNumber":494,"author":{"gitId":"dayn-1"},"content":"2. Appointments cannot be backdated or scheduled for past dates","lastModifiedDate":"2024-03-06"},{"lineNumber":495,"author":{"gitId":"dayn-1"},"content":"3. Should be compatible with any _mainstream OS_ with Java `11` or above installed.","lastModifiedDate":"2024-03-06"},{"lineNumber":496,"author":{"gitId":"dayn-1"},"content":"4. Should load patient records and appointment details within three seconds","lastModifiedDate":"2024-03-06"},{"lineNumber":497,"author":{"gitId":"dayn-1"},"content":"5. Should be able to hold up to 1000 patients without a noticeable sluggishness in performance for typical usage.","lastModifiedDate":"2024-03-06"},{"lineNumber":498,"author":{"gitId":"dayn-1"},"content":"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.","lastModifiedDate":"2024-03-06"},{"lineNumber":499,"author":{"gitId":"dayn-1"},"content":"7. The project is expected to adhere to a schedule that delivers a feature set for each milestone","lastModifiedDate":"2024-03-06"},{"lineNumber":500,"author":{"gitId":"dayn-1"},"content":"8. The product is not required to have mouse-click navigation ","lastModifiedDate":"2024-03-06"},{"lineNumber":501,"author":{"gitId":"dayn-1"},"content":"9. The product is not required to integrate with other systems ","lastModifiedDate":"2024-03-06"},{"lineNumber":502,"author":{"gitId":"dayn-1"},"content":"10. The product should avoid terminology or graphics that are insensitive to patients ","lastModifiedDate":"2024-03-06"},{"lineNumber":503,"author":{"gitId":"dayn-1"},"content":"11. The product should be for a single user (not a multi-user product)","lastModifiedDate":"2024-03-06"},{"lineNumber":504,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":505,"author":{"gitId":"-"},"content":"### Glossary","lastModifiedDate":"2020-05-23"},{"lineNumber":506,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":507,"author":{"gitId":"-"},"content":"* **Mainstream OS**: Windows, Linux, Unix, MacOS","lastModifiedDate":"2024-02-09"},{"lineNumber":508,"author":{"gitId":"-"},"content":"* **Private contact detail**: A contact detail that is not meant to be shared with others","lastModifiedDate":"2020-05-23"},{"lineNumber":509,"author":{"gitId":"dayn-1"},"content":"* **Appointment**: A designated time slot for a patient to visit the clinic","lastModifiedDate":"2024-03-06"},{"lineNumber":510,"author":{"gitId":"dayn-1"},"content":"* **Appointment Type**: Categorises the purpose of visit eg. Vaccination, Medical Check-up, etc ","lastModifiedDate":"2024-03-06"},{"lineNumber":511,"author":{"gitId":"dayn-1"},"content":"* **Insurance Type**: Categorises insurance schemes applicable to the patient eg. Medisave, ElderShield, etc.","lastModifiedDate":"2024-03-06"},{"lineNumber":512,"author":{"gitId":"dayn-1"},"content":"* **Medical Records**: Refer to details of patients\u0027 medical allergies only (as at v1.2)","lastModifiedDate":"2024-03-06"},{"lineNumber":513,"author":{"gitId":"dayn-1"},"content":"* **Recurring Appointments**: Refer to appointments that occur regularly eg. weekly or monthly","lastModifiedDate":"2024-03-06"},{"lineNumber":514,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":515,"author":{"gitId":"-"},"content":"--------------------------------------------------------------------------------------------------------------------","lastModifiedDate":"2020-05-23"},{"lineNumber":516,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":517,"author":{"gitId":"-"},"content":"## **Appendix: Instructions for manual testing**","lastModifiedDate":"2020-05-23"},{"lineNumber":518,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":519,"author":{"gitId":"-"},"content":"Given below are instructions to test the app manually.","lastModifiedDate":"2020-05-23"},{"lineNumber":520,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":521,"author":{"gitId":"-"},"content":"\u003cbox type\u003d\"info\" seamless\u003e","lastModifiedDate":"2023-09-12"},{"lineNumber":522,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2023-09-12"},{"lineNumber":523,"author":{"gitId":"-"},"content":"**Note:** These instructions only provide a starting point for testers to work on;","lastModifiedDate":"2023-09-12"},{"lineNumber":524,"author":{"gitId":"-"},"content":"testers are expected to do more *exploratory* testing.","lastModifiedDate":"2020-05-23"},{"lineNumber":525,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":526,"author":{"gitId":"-"},"content":"\u003c/box\u003e","lastModifiedDate":"2023-09-12"},{"lineNumber":527,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":528,"author":{"gitId":"-"},"content":"### Launch and shutdown","lastModifiedDate":"2020-05-23"},{"lineNumber":529,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":530,"author":{"gitId":"-"},"content":"1. Initial launch","lastModifiedDate":"2020-05-23"},{"lineNumber":531,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":532,"author":{"gitId":"-"},"content":" 1. Download the jar file and copy into an empty folder","lastModifiedDate":"2020-05-23"},{"lineNumber":533,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":534,"author":{"gitId":"-"},"content":" 1. Double-click the jar file Expected: Shows the GUI with a set of sample contacts. The window size may not be optimum.","lastModifiedDate":"2020-05-23"},{"lineNumber":535,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":536,"author":{"gitId":"-"},"content":"1. Saving window preferences","lastModifiedDate":"2020-05-23"},{"lineNumber":537,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":538,"author":{"gitId":"-"},"content":" 1. Resize the window to an optimum size. Move the window to a different location. Close the window.","lastModifiedDate":"2020-05-23"},{"lineNumber":539,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":540,"author":{"gitId":"-"},"content":" 1. Re-launch the app by double-clicking the jar file.\u003cbr\u003e","lastModifiedDate":"2020-05-23"},{"lineNumber":541,"author":{"gitId":"-"},"content":" Expected: The most recent window size and location is retained.","lastModifiedDate":"2020-05-23"},{"lineNumber":542,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":543,"author":{"gitId":"-"},"content":"1. _{ more test cases …​ }_","lastModifiedDate":"2020-05-23"},{"lineNumber":544,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":545,"author":{"gitId":"-"},"content":"### Deleting a person","lastModifiedDate":"2020-05-23"},{"lineNumber":546,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":547,"author":{"gitId":"-"},"content":"1. Deleting a person while all persons are being shown","lastModifiedDate":"2020-05-23"},{"lineNumber":548,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":549,"author":{"gitId":"-"},"content":" 1. Prerequisites: List all persons using the `list` command. Multiple persons in the list.","lastModifiedDate":"2020-05-23"},{"lineNumber":550,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":551,"author":{"gitId":"-"},"content":" 1. Test case: `delete 1`\u003cbr\u003e","lastModifiedDate":"2020-05-23"},{"lineNumber":552,"author":{"gitId":"-"},"content":" 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.","lastModifiedDate":"2020-05-23"},{"lineNumber":553,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":554,"author":{"gitId":"-"},"content":" 1. Test case: `delete 0`\u003cbr\u003e","lastModifiedDate":"2020-05-23"},{"lineNumber":555,"author":{"gitId":"-"},"content":" Expected: No person is deleted. Error details shown in the status message. Status bar remains the same.","lastModifiedDate":"2020-05-23"},{"lineNumber":556,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":557,"author":{"gitId":"-"},"content":" 1. Other incorrect delete commands to try: `delete`, `delete x`, `...` (where x is larger than the list size)\u003cbr\u003e","lastModifiedDate":"2020-05-23"},{"lineNumber":558,"author":{"gitId":"-"},"content":" Expected: Similar to previous.","lastModifiedDate":"2020-05-23"},{"lineNumber":559,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":560,"author":{"gitId":"-"},"content":"1. _{ more test cases …​ }_","lastModifiedDate":"2020-05-23"},{"lineNumber":561,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":562,"author":{"gitId":"-"},"content":"### Saving data","lastModifiedDate":"2020-05-23"},{"lineNumber":563,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":564,"author":{"gitId":"-"},"content":"1. Dealing with missing/corrupted data files","lastModifiedDate":"2020-05-23"},{"lineNumber":565,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":566,"author":{"gitId":"-"},"content":" 1. _{explain how to simulate a missing/corrupted file, and the expected behavior}_","lastModifiedDate":"2020-05-23"},{"lineNumber":567,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":568,"author":{"gitId":"-"},"content":"1. _{ more test cases …​ }_","lastModifiedDate":"2020-05-23"}],"authorContributionMap":{"limrik":34,"dayn-1":16,"ThatGirlJam":137,"-":381}},{"path":"docs/_markbind/layouts/default.md","fileType":"docs","lines":[{"lineNumber":1,"author":{"gitId":"-"},"content":"\u003chead-bottom\u003e","lastModifiedDate":"2023-09-12"},{"lineNumber":2,"author":{"gitId":"-"},"content":" \u003clink rel\u003d\"stylesheet\" href\u003d\"{{baseUrl}}/stylesheets/main.css\"\u003e","lastModifiedDate":"2023-09-12"},{"lineNumber":3,"author":{"gitId":"-"},"content":"\u003c/head-bottom\u003e","lastModifiedDate":"2023-09-12"},{"lineNumber":4,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2023-09-12"},{"lineNumber":5,"author":{"gitId":"-"},"content":"\u003cheader sticky\u003e","lastModifiedDate":"2023-09-12"},{"lineNumber":6,"author":{"gitId":"-"},"content":" \u003cnavbar type\u003d\"dark\"\u003e","lastModifiedDate":"2023-09-12"},{"lineNumber":7,"author":{"gitId":"-"},"content":" \u003ca slot\u003d\"brand\" href\u003d\"{{baseUrl}}/index.html\" title\u003d\"Home\" class\u003d\"navbar-brand\"\u003eCLInic\u003c/a\u003e","lastModifiedDate":"2024-02-20"},{"lineNumber":8,"author":{"gitId":"-"},"content":" \u003cli\u003e\u003ca href\u003d\"{{baseUrl}}/index.html\" class\u003d\"nav-link\"\u003eHome\u003c/a\u003e\u003c/li\u003e","lastModifiedDate":"2024-02-09"},{"lineNumber":9,"author":{"gitId":"-"},"content":" \u003cli\u003e\u003ca href\u003d\"{{baseUrl}}/UserGuide.html\" class\u003d\"nav-link\"\u003eUser Guide\u003c/a\u003e\u003c/li\u003e","lastModifiedDate":"2023-09-12"},{"lineNumber":10,"author":{"gitId":"-"},"content":" \u003cli\u003e\u003ca href\u003d\"{{baseUrl}}/DeveloperGuide.html\" class\u003d\"nav-link\"\u003eDeveloper Guide\u003c/a\u003e\u003c/li\u003e","lastModifiedDate":"2023-09-12"},{"lineNumber":11,"author":{"gitId":"-"},"content":" \u003cli\u003e\u003ca href\u003d\"{{baseUrl}}/AboutUs.html\" class\u003d\"nav-link\"\u003eAbout Us\u003c/a\u003e\u003c/li\u003e","lastModifiedDate":"2023-09-12"},{"lineNumber":12,"author":{"gitId":"dayn-1"},"content":" \u003cli\u003e\u003ca href\u003d\"https://github.com/AY2324S2-CS2103T-F10-3/tp\" target\u003d\"_blank\" class\u003d\"nav-link\"\u003e\u003cmd\u003e:fab-github:\u003c/md\u003e\u003c/a\u003e","lastModifiedDate":"2024-03-06"},{"lineNumber":13,"author":{"gitId":"-"},"content":" \u003c/li\u003e","lastModifiedDate":"2023-09-12"},{"lineNumber":14,"author":{"gitId":"-"},"content":" \u003cli slot\u003d\"right\"\u003e","lastModifiedDate":"2023-09-12"},{"lineNumber":15,"author":{"gitId":"-"},"content":" \u003cform class\u003d\"navbar-form\"\u003e","lastModifiedDate":"2023-09-12"},{"lineNumber":16,"author":{"gitId":"-"},"content":" \u003csearchbar :data\u003d\"searchData\" placeholder\u003d\"Search\" :on-hit\u003d\"searchCallback\" menu-align-right\u003e\u003c/searchbar\u003e","lastModifiedDate":"2023-09-12"},{"lineNumber":17,"author":{"gitId":"-"},"content":" \u003c/form\u003e","lastModifiedDate":"2023-09-12"},{"lineNumber":18,"author":{"gitId":"-"},"content":" \u003c/li\u003e","lastModifiedDate":"2023-09-12"},{"lineNumber":19,"author":{"gitId":"-"},"content":" \u003c/navbar\u003e","lastModifiedDate":"2023-09-12"},{"lineNumber":20,"author":{"gitId":"-"},"content":"\u003c/header\u003e","lastModifiedDate":"2023-09-12"},{"lineNumber":21,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2023-09-12"},{"lineNumber":22,"author":{"gitId":"-"},"content":"\u003cdiv id\u003d\"flex-body\"\u003e","lastModifiedDate":"2023-09-12"},{"lineNumber":23,"author":{"gitId":"-"},"content":" \u003cnav id\u003d\"site-nav\"\u003e","lastModifiedDate":"2023-09-12"},{"lineNumber":24,"author":{"gitId":"-"},"content":" \u003cdiv class\u003d\"site-nav-top\"\u003e","lastModifiedDate":"2023-09-12"},{"lineNumber":25,"author":{"gitId":"-"},"content":" \u003cdiv class\u003d\"fw-bold mb-2\" style\u003d\"font-size: 1.25rem;\"\u003eSite Map\u003c/div\u003e","lastModifiedDate":"2023-09-12"},{"lineNumber":26,"author":{"gitId":"-"},"content":" \u003c/div\u003e","lastModifiedDate":"2023-09-12"},{"lineNumber":27,"author":{"gitId":"-"},"content":" \u003cdiv class\u003d\"nav-component slim-scroll\"\u003e","lastModifiedDate":"2023-09-12"},{"lineNumber":28,"author":{"gitId":"-"},"content":" \u003csite-nav\u003e","lastModifiedDate":"2023-09-12"},{"lineNumber":29,"author":{"gitId":"-"},"content":"* [Home]({{ baseUrl }}/index.html)","lastModifiedDate":"2023-09-12"},{"lineNumber":30,"author":{"gitId":"-"},"content":"* [User Guide]({{ baseUrl }}/UserGuide.html) :expanded:","lastModifiedDate":"2023-09-12"},{"lineNumber":31,"author":{"gitId":"-"},"content":" * [Quick Start]({{ baseUrl }}/UserGuide.html#quick-start)","lastModifiedDate":"2023-09-12"},{"lineNumber":32,"author":{"gitId":"-"},"content":" * [Features]({{ baseUrl }}/UserGuide.html#features)","lastModifiedDate":"2023-09-12"},{"lineNumber":33,"author":{"gitId":"-"},"content":" * [FAQ]({{ baseUrl }}/UserGuide.html#faq)","lastModifiedDate":"2023-09-12"},{"lineNumber":34,"author":{"gitId":"-"},"content":" * [Command Summary]({{ baseUrl }}/UserGuide.html#faq)","lastModifiedDate":"2023-09-12"},{"lineNumber":35,"author":{"gitId":"-"},"content":"* [Developer Guide]({{ baseUrl }}/DeveloperGuide.html) :expanded:","lastModifiedDate":"2023-09-12"},{"lineNumber":36,"author":{"gitId":"-"},"content":" * [Acknowledgements]({{ baseUrl }}/DeveloperGuide.html#acknowledgements)","lastModifiedDate":"2023-09-12"},{"lineNumber":37,"author":{"gitId":"-"},"content":" * [Setting Up]({{ baseUrl }}/DeveloperGuide.html#setting-up-getting-started)","lastModifiedDate":"2023-09-12"},{"lineNumber":38,"author":{"gitId":"-"},"content":" * [Design]({{ baseUrl }}/DeveloperGuide.html#design)","lastModifiedDate":"2023-09-12"},{"lineNumber":39,"author":{"gitId":"-"},"content":" * [Implementation]({{ baseUrl }}/DeveloperGuide.html#implementation)","lastModifiedDate":"2023-09-12"},{"lineNumber":40,"author":{"gitId":"-"},"content":" * [Documentation, logging, testing, configuration, dev-ops]({{ baseUrl }}/DeveloperGuide.html#documentation-logging-testing-configuration-dev-ops)","lastModifiedDate":"2023-09-12"},{"lineNumber":41,"author":{"gitId":"-"},"content":" * [Appendix: Requirements]({{ baseUrl }}/DeveloperGuide.html#appendix-requirements)","lastModifiedDate":"2023-09-12"},{"lineNumber":42,"author":{"gitId":"-"},"content":" * [Appendix: Instructions for manual testing]({{ baseUrl }}/DeveloperGuide.html#appendix-instructions-for-manual-testing)","lastModifiedDate":"2023-09-12"},{"lineNumber":43,"author":{"gitId":"-"},"content":"* Tutorials","lastModifiedDate":"2023-09-12"},{"lineNumber":44,"author":{"gitId":"-"},"content":" * [Tracing code]({{ baseUrl }}/tutorials/TracingCode.html)","lastModifiedDate":"2023-09-12"},{"lineNumber":45,"author":{"gitId":"-"},"content":" * [Adding a command]({{ baseUrl }}/tutorials/AddRemark.html)","lastModifiedDate":"2023-09-12"},{"lineNumber":46,"author":{"gitId":"-"},"content":" * [Removing Fields]({{ baseUrl }}/tutorials/RemovingFields.html)","lastModifiedDate":"2023-09-12"},{"lineNumber":47,"author":{"gitId":"-"},"content":"* [About Us]({{ baseUrl }}/AboutUs.html)","lastModifiedDate":"2023-09-12"},{"lineNumber":48,"author":{"gitId":"-"},"content":" \u003c/site-nav\u003e","lastModifiedDate":"2023-09-12"},{"lineNumber":49,"author":{"gitId":"-"},"content":" \u003c/div\u003e","lastModifiedDate":"2023-09-12"},{"lineNumber":50,"author":{"gitId":"-"},"content":" \u003c/nav\u003e","lastModifiedDate":"2023-09-12"},{"lineNumber":51,"author":{"gitId":"-"},"content":" \u003cdiv id\u003d\"content-wrapper\"\u003e","lastModifiedDate":"2023-09-12"},{"lineNumber":52,"author":{"gitId":"-"},"content":" {{ content }}","lastModifiedDate":"2023-09-12"},{"lineNumber":53,"author":{"gitId":"-"},"content":" \u003c/div\u003e","lastModifiedDate":"2023-09-12"},{"lineNumber":54,"author":{"gitId":"-"},"content":" \u003cnav id\u003d\"page-nav\"\u003e","lastModifiedDate":"2023-09-12"},{"lineNumber":55,"author":{"gitId":"-"},"content":" \u003cdiv class\u003d\"nav-component slim-scroll\"\u003e","lastModifiedDate":"2023-09-12"},{"lineNumber":56,"author":{"gitId":"-"},"content":" \u003cpage-nav /\u003e","lastModifiedDate":"2023-09-12"},{"lineNumber":57,"author":{"gitId":"-"},"content":" \u003c/div\u003e","lastModifiedDate":"2023-09-12"},{"lineNumber":58,"author":{"gitId":"-"},"content":" \u003c/nav\u003e","lastModifiedDate":"2023-09-12"},{"lineNumber":59,"author":{"gitId":"-"},"content":" \u003cscroll-top-button\u003e\u003c/scroll-top-button\u003e","lastModifiedDate":"2023-09-12"},{"lineNumber":60,"author":{"gitId":"-"},"content":"\u003c/div\u003e","lastModifiedDate":"2023-09-12"},{"lineNumber":61,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2023-09-12"},{"lineNumber":62,"author":{"gitId":"-"},"content":"\u003cfooter\u003e","lastModifiedDate":"2023-09-12"},{"lineNumber":63,"author":{"gitId":"-"},"content":" \u003c!-- Support MarkBind by including a link to us on your landing page! --\u003e","lastModifiedDate":"2023-09-12"},{"lineNumber":64,"author":{"gitId":"-"},"content":" \u003cdiv class\u003d\"text-center\"\u003e","lastModifiedDate":"2023-09-12"},{"lineNumber":65,"author":{"gitId":"-"},"content":" \u003csmall\u003e[\u003cmd\u003e**Powered by**\u003c/md\u003e \u003cimg src\u003d\"https://markbind.org/favicon.ico\" width\u003d\"30\"\u003e {{MarkBind}}, generated on {{timestamp}}]\u003c/small\u003e","lastModifiedDate":"2023-09-12"},{"lineNumber":66,"author":{"gitId":"-"},"content":" \u003c/div\u003e","lastModifiedDate":"2023-09-12"},{"lineNumber":67,"author":{"gitId":"-"},"content":"\u003c/footer\u003e","lastModifiedDate":"2023-09-12"}],"authorContributionMap":{"dayn-1":1,"-":66}}] +[{"path":"README.md","fileType":"docs","lines":[{"lineNumber":1,"author":{"gitId":"-"},"content":"[![CI Status](https://github.com/se-edu/addressbook-level3/workflows/Java%20CI/badge.svg)](https://github.com/se-edu/addressbook-level3/actions)","lastModifiedDate":"2020-05-23"},{"lineNumber":2,"author":{"gitId":"-"},"content":"[![codecov](https://codecov.io/gh/AY2324S2-CS2103T-F10-3/tp/graph/badge.svg?token\u003dX33TASQ7AY)](https://codecov.io/gh/AY2324S2-CS2103T-F10-3/tp)","lastModifiedDate":"2024-02-20"},{"lineNumber":3,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2024-02-20"},{"lineNumber":4,"author":{"gitId":"-"},"content":"![Ui](docs/images/Ui.png)","lastModifiedDate":"2020-05-23"},{"lineNumber":5,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":6,"author":{"gitId":"xuelinglow"},"content":"* This is **a Command Line Interface (CLI) application for users who prefer CLI to keep track of healthcare appointments and patient information**.\u003cbr\u003e","lastModifiedDate":"2024-03-06"},{"lineNumber":7,"author":{"gitId":"-"},"content":" Example usages:","lastModifiedDate":"2020-05-23"},{"lineNumber":8,"author":{"gitId":"xuelinglow"},"content":" * store and retrieve patient information such as name, contact information and medical allergies","lastModifiedDate":"2024-03-06"},{"lineNumber":9,"author":{"gitId":"xuelinglow"},"content":" * schedule an appointment for the patient","lastModifiedDate":"2024-03-06"},{"lineNumber":10,"author":{"gitId":"xuelinglow"},"content":" * view upcoming appointments in a concise and accessible format","lastModifiedDate":"2024-03-06"},{"lineNumber":11,"author":{"gitId":"xuelinglow"},"content":"","lastModifiedDate":"2024-03-06"},{"lineNumber":12,"author":{"gitId":"xuelinglow"},"content":"* The project simulates an ongoing software project for a desktop application (called CLInic) used for managing patient and appointment details.","lastModifiedDate":"2024-03-06"},{"lineNumber":13,"author":{"gitId":"xuelinglow"},"content":" * It is built on the AddressBook-Level3 project.","lastModifiedDate":"2024-03-06"},{"lineNumber":14,"author":{"gitId":"xuelinglow"},"content":" * It is **written in OOP fashion**. ","lastModifiedDate":"2024-03-06"},{"lineNumber":15,"author":{"gitId":"-"},"content":" * It comes with a **reasonable level of user and developer documentation**.","lastModifiedDate":"2020-05-23"},{"lineNumber":16,"author":{"gitId":"xuelinglow"},"content":"","lastModifiedDate":"2024-03-06"},{"lineNumber":17,"author":{"gitId":"xuelinglow"},"content":"This project is based on the AddressBook-Level3 project created by the [SE-EDU initiative](https://se-education.org).","lastModifiedDate":"2024-03-06"}],"authorContributionMap":{"xuelinglow":10,"-":7}},{"path":"docs/AboutUs.md","fileType":"docs","lines":[{"lineNumber":1,"author":{"gitId":"-"},"content":"---","lastModifiedDate":"2020-05-23"},{"lineNumber":2,"author":{"gitId":"-"},"content":" layout: default.md","lastModifiedDate":"2023-09-12"},{"lineNumber":3,"author":{"gitId":"-"},"content":" title: \"About Us\"","lastModifiedDate":"2023-09-12"},{"lineNumber":4,"author":{"gitId":"-"},"content":"---","lastModifiedDate":"2020-05-23"},{"lineNumber":5,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":6,"author":{"gitId":"-"},"content":"# About Us","lastModifiedDate":"2023-09-12"},{"lineNumber":7,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2023-09-12"},{"lineNumber":8,"author":{"gitId":"-"},"content":"We are a team based in the [School of Computing, National University of Singapore](http://www.comp.nus.edu.sg).","lastModifiedDate":"2020-05-23"},{"lineNumber":9,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":10,"author":{"gitId":"-"},"content":"You can reach us at the email `seer[at]comp.nus.edu.sg`","lastModifiedDate":"2020-06-17"},{"lineNumber":11,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-06-17"},{"lineNumber":12,"author":{"gitId":"-"},"content":"## Project team","lastModifiedDate":"2020-06-07"},{"lineNumber":13,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":14,"author":{"gitId":"cliftonchee"},"content":"### Ang Zi Jun Dayn","lastModifiedDate":"2024-03-04"},{"lineNumber":15,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":16,"author":{"gitId":"cliftonchee"},"content":"\u003cimg src\u003d\"images/dayn-1.png\" width\u003d\"200px\"\u003e","lastModifiedDate":"2024-03-04"},{"lineNumber":17,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":18,"author":{"gitId":"cliftonchee"},"content":"[[github](https://github.com/dayn-1)]","lastModifiedDate":"2024-03-04"},{"lineNumber":19,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":20,"author":{"gitId":"dayn-1"},"content":"* Role: Testing","lastModifiedDate":"2024-03-08"},{"lineNumber":21,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":22,"author":{"gitId":"cliftonchee"},"content":"### Chee Wei Xiong Clifton","lastModifiedDate":"2024-03-04"},{"lineNumber":23,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":24,"author":{"gitId":"cliftonchee"},"content":"\u003cimg src\u003d\"images/cliftonchee.png\" width\u003d\"200px\"\u003e","lastModifiedDate":"2024-03-04"},{"lineNumber":25,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":26,"author":{"gitId":"cliftonchee"},"content":"[[github](http://github.com/cliftonchee)]","lastModifiedDate":"2024-03-04"},{"lineNumber":27,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":28,"author":{"gitId":"cliftonchee"},"content":"* Role: Documentation","lastModifiedDate":"2024-03-04"},{"lineNumber":29,"author":{"gitId":"-"},"content":"* Responsibilities: UI","lastModifiedDate":"2020-05-23"},{"lineNumber":30,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":31,"author":{"gitId":"cliftonchee"},"content":"### Jaime Ng Jia Min","lastModifiedDate":"2024-03-04"},{"lineNumber":32,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":33,"author":{"gitId":"cliftonchee"},"content":"\u003cimg src\u003d\"images/thatgirljam.png\" width\u003d\"200px\"\u003e","lastModifiedDate":"2024-03-04"},{"lineNumber":34,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":35,"author":{"gitId":"cliftonchee"},"content":"[[github](http://github.com/thatgirljam)]","lastModifiedDate":"2024-03-04"},{"lineNumber":36,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":37,"author":{"gitId":"dayn-1"},"content":"* Role: Scheduling and Tracking","lastModifiedDate":"2024-03-08"},{"lineNumber":38,"author":{"gitId":"-"},"content":"* Responsibilities: Data","lastModifiedDate":"2020-05-23"},{"lineNumber":39,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":40,"author":{"gitId":"cliftonchee"},"content":"### Lim Rik","lastModifiedDate":"2024-03-04"},{"lineNumber":41,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":42,"author":{"gitId":"cliftonchee"},"content":"\u003cimg src\u003d\"images/limrik.png\" width\u003d\"200px\"\u003e","lastModifiedDate":"2024-03-04"},{"lineNumber":43,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":44,"author":{"gitId":"cliftonchee"},"content":"[[github](http://github.com/limrik)]","lastModifiedDate":"2024-03-04"},{"lineNumber":45,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":46,"author":{"gitId":"dayn-1"},"content":"* Role: Code quality","lastModifiedDate":"2024-03-08"},{"lineNumber":47,"author":{"gitId":"-"},"content":"* Responsibilities: Dev Ops + Threading","lastModifiedDate":"2020-05-23"},{"lineNumber":48,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":49,"author":{"gitId":"cliftonchee"},"content":"### Low Xue Ling","lastModifiedDate":"2024-03-04"},{"lineNumber":50,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":51,"author":{"gitId":"cliftonchee"},"content":"\u003cimg src\u003d\"images/xuelinglow.png\" width\u003d\"200px\"\u003e","lastModifiedDate":"2024-03-04"},{"lineNumber":52,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":53,"author":{"gitId":"cliftonchee"},"content":"[[github](http://github.com/xuelinglow)]","lastModifiedDate":"2024-03-04"},{"lineNumber":54,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":55,"author":{"gitId":"dayn-1"},"content":"* Role: Integration","lastModifiedDate":"2024-03-08"},{"lineNumber":56,"author":{"gitId":"-"},"content":"* Responsibilities: UI","lastModifiedDate":"2020-05-23"}],"authorContributionMap":{"dayn-1":4,"-":36,"cliftonchee":16}},{"path":"docs/DeveloperGuide.md","fileType":"docs","lines":[{"lineNumber":1,"author":{"gitId":"-"},"content":"---","lastModifiedDate":"2020-05-23"},{"lineNumber":2,"author":{"gitId":"-"},"content":" layout: default.md","lastModifiedDate":"2023-09-12"},{"lineNumber":3,"author":{"gitId":"-"},"content":" title: \"Developer Guide\"","lastModifiedDate":"2023-09-12"},{"lineNumber":4,"author":{"gitId":"-"},"content":" pageNav: 3","lastModifiedDate":"2023-09-12"},{"lineNumber":5,"author":{"gitId":"-"},"content":"---","lastModifiedDate":"2020-05-23"},{"lineNumber":6,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2023-09-12"},{"lineNumber":7,"author":{"gitId":"limrik"},"content":"# CLInic Developer Guide","lastModifiedDate":"2024-03-08"},{"lineNumber":8,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2023-09-12"},{"lineNumber":9,"author":{"gitId":"-"},"content":"\u003c!-- * Table of Contents --\u003e","lastModifiedDate":"2023-09-12"},{"lineNumber":10,"author":{"gitId":"-"},"content":"\u003cpage-nav-print /\u003e","lastModifiedDate":"2023-09-12"},{"lineNumber":11,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":12,"author":{"gitId":"-"},"content":"--------------------------------------------------------------------------------------------------------------------","lastModifiedDate":"2020-05-23"},{"lineNumber":13,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2021-07-30"},{"lineNumber":14,"author":{"gitId":"-"},"content":"## **Acknowledgements**","lastModifiedDate":"2021-07-30"},{"lineNumber":15,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2021-07-30"},{"lineNumber":16,"author":{"gitId":"-"},"content":"_{ list here sources of all reused/adapted ideas, code, documentation, and third-party libraries -- include links to the original source as well }_","lastModifiedDate":"2023-09-12"},{"lineNumber":17,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2021-07-30"},{"lineNumber":18,"author":{"gitId":"-"},"content":"--------------------------------------------------------------------------------------------------------------------","lastModifiedDate":"2021-07-30"},{"lineNumber":19,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":20,"author":{"gitId":"-"},"content":"## **Setting up, getting started**","lastModifiedDate":"2020-05-23"},{"lineNumber":21,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":22,"author":{"gitId":"-"},"content":"Refer to the guide [_Setting up and getting started_](SettingUp.md).","lastModifiedDate":"2020-05-23"},{"lineNumber":23,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":24,"author":{"gitId":"-"},"content":"--------------------------------------------------------------------------------------------------------------------","lastModifiedDate":"2020-05-23"},{"lineNumber":25,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":26,"author":{"gitId":"-"},"content":"## **Design**","lastModifiedDate":"2020-05-23"},{"lineNumber":27,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":28,"author":{"gitId":"-"},"content":"### Architecture","lastModifiedDate":"2021-07-31"},{"lineNumber":29,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":30,"author":{"gitId":"-"},"content":"\u003cpuml src\u003d\"diagrams/ArchitectureDiagram.puml\" width\u003d\"280\" /\u003e","lastModifiedDate":"2023-09-12"},{"lineNumber":31,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":32,"author":{"gitId":"-"},"content":"The ***Architecture Diagram*** given above explains the high-level design of the App.","lastModifiedDate":"2021-07-31"},{"lineNumber":33,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":34,"author":{"gitId":"-"},"content":"Given below is a quick overview of main components and how they interact with each other.","lastModifiedDate":"2021-07-31"},{"lineNumber":35,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2021-07-31"},{"lineNumber":36,"author":{"gitId":"-"},"content":"**Main components of the architecture**","lastModifiedDate":"2021-07-31"},{"lineNumber":37,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":38,"author":{"gitId":"-"},"content":"**`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.","lastModifiedDate":"2023-09-03"},{"lineNumber":39,"author":{"gitId":"-"},"content":"* At app launch, it initializes the other components in the correct sequence, and connects them up with each other.","lastModifiedDate":"2023-09-03"},{"lineNumber":40,"author":{"gitId":"-"},"content":"* At shut down, it shuts down the other components and invokes cleanup methods where necessary.","lastModifiedDate":"2023-09-03"},{"lineNumber":41,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":42,"author":{"gitId":"-"},"content":"The bulk of the app\u0027s work is done by the following four components:","lastModifiedDate":"2023-09-03"},{"lineNumber":43,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":44,"author":{"gitId":"-"},"content":"* [**`UI`**](#ui-component): The UI of the App.","lastModifiedDate":"2020-05-23"},{"lineNumber":45,"author":{"gitId":"-"},"content":"* [**`Logic`**](#logic-component): The command executor.","lastModifiedDate":"2020-05-23"},{"lineNumber":46,"author":{"gitId":"-"},"content":"* [**`Model`**](#model-component): Holds the data of the App in memory.","lastModifiedDate":"2020-05-23"},{"lineNumber":47,"author":{"gitId":"-"},"content":"* [**`Storage`**](#storage-component): Reads data from, and writes data to, the hard disk.","lastModifiedDate":"2020-05-23"},{"lineNumber":48,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":49,"author":{"gitId":"-"},"content":"[**`Commons`**](#common-classes) represents a collection of classes used by multiple other components.","lastModifiedDate":"2023-09-03"},{"lineNumber":50,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":51,"author":{"gitId":"-"},"content":"**How the architecture components interact with each other**","lastModifiedDate":"2020-05-23"},{"lineNumber":52,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":53,"author":{"gitId":"-"},"content":"The *Sequence Diagram* below shows how the components interact with each other for the scenario where the user issues the command `delete 1`.","lastModifiedDate":"2020-05-23"},{"lineNumber":54,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":55,"author":{"gitId":"-"},"content":"\u003cpuml src\u003d\"diagrams/ArchitectureSequenceDiagram.puml\" width\u003d\"574\" /\u003e","lastModifiedDate":"2023-09-12"},{"lineNumber":56,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":57,"author":{"gitId":"-"},"content":"Each of the four main components (also shown in the diagram above),","lastModifiedDate":"2021-07-31"},{"lineNumber":58,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2021-07-31"},{"lineNumber":59,"author":{"gitId":"-"},"content":"* defines its *API* in an `interface` with the same name as the Component.","lastModifiedDate":"2021-07-31"},{"lineNumber":60,"author":{"gitId":"-"},"content":"* implements its functionality using a concrete `{Component Name}Manager` class (which follows the corresponding API `interface` mentioned in the previous point.","lastModifiedDate":"2021-07-31"},{"lineNumber":61,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2021-07-31"},{"lineNumber":62,"author":{"gitId":"-"},"content":"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\u0027s being coupled to the implementation of a component), as illustrated in the (partial) class diagram below.","lastModifiedDate":"2021-07-31"},{"lineNumber":63,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2021-07-31"},{"lineNumber":64,"author":{"gitId":"-"},"content":"\u003cpuml src\u003d\"diagrams/ComponentManagers.puml\" width\u003d\"300\" /\u003e","lastModifiedDate":"2023-09-12"},{"lineNumber":65,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2021-07-31"},{"lineNumber":66,"author":{"gitId":"-"},"content":"The sections below give more details of each component.","lastModifiedDate":"2020-05-23"},{"lineNumber":67,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":68,"author":{"gitId":"-"},"content":"### UI component","lastModifiedDate":"2020-05-23"},{"lineNumber":69,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":70,"author":{"gitId":"-"},"content":"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)","lastModifiedDate":"2021-07-31"},{"lineNumber":71,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":72,"author":{"gitId":"-"},"content":"\u003cpuml src\u003d\"diagrams/UiClassDiagram.puml\" alt\u003d\"Structure of the UI Component\"/\u003e","lastModifiedDate":"2023-09-12"},{"lineNumber":73,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":74,"author":{"gitId":"-"},"content":"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.","lastModifiedDate":"2021-07-31"},{"lineNumber":75,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":76,"author":{"gitId":"-"},"content":"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)","lastModifiedDate":"2021-07-31"},{"lineNumber":77,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":78,"author":{"gitId":"-"},"content":"The `UI` component,","lastModifiedDate":"2020-05-23"},{"lineNumber":79,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":80,"author":{"gitId":"-"},"content":"* executes user commands using the `Logic` component.","lastModifiedDate":"2021-07-31"},{"lineNumber":81,"author":{"gitId":"-"},"content":"* listens for changes to `Model` data so that the UI can be updated with the modified data.","lastModifiedDate":"2021-07-31"},{"lineNumber":82,"author":{"gitId":"-"},"content":"* keeps a reference to the `Logic` component, because the `UI` relies on the `Logic` to execute commands.","lastModifiedDate":"2021-07-31"},{"lineNumber":83,"author":{"gitId":"-"},"content":"* depends on some classes in the `Model` component, as it displays `Person` object residing in the `Model`.","lastModifiedDate":"2021-07-31"},{"lineNumber":84,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":85,"author":{"gitId":"-"},"content":"### Logic component","lastModifiedDate":"2020-05-23"},{"lineNumber":86,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":87,"author":{"gitId":"-"},"content":"**API** : [`Logic.java`](https://github.com/se-edu/addressbook-level3/tree/master/src/main/java/seedu/address/logic/Logic.java)","lastModifiedDate":"2021-07-31"},{"lineNumber":88,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":89,"author":{"gitId":"-"},"content":"Here\u0027s a (partial) class diagram of the `Logic` component:","lastModifiedDate":"2021-07-31"},{"lineNumber":90,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":91,"author":{"gitId":"-"},"content":"\u003cpuml src\u003d\"diagrams/LogicClassDiagram.puml\" width\u003d\"550\"/\u003e","lastModifiedDate":"2023-09-12"},{"lineNumber":92,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":93,"author":{"gitId":"-"},"content":"The sequence diagram below illustrates the interactions within the `Logic` component, taking `execute(\"delete 1\")` API call as an example.","lastModifiedDate":"2023-09-03"},{"lineNumber":94,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":95,"author":{"gitId":"-"},"content":"\u003cpuml src\u003d\"diagrams/DeleteSequenceDiagram.puml\" alt\u003d\"Interactions Inside the Logic Component for the `delete 1` Command\" /\u003e","lastModifiedDate":"2023-09-12"},{"lineNumber":96,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2023-09-12"},{"lineNumber":97,"author":{"gitId":"-"},"content":"\u003cbox type\u003d\"info\" seamless\u003e","lastModifiedDate":"2023-09-12"},{"lineNumber":98,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":99,"author":{"gitId":"-"},"content":"**Note:** The lifeline for `DeleteCommandParser` should end at the destroy marker (X) but due to a limitation of PlantUML, the lifeline continues till the end of diagram.","lastModifiedDate":"2023-09-12"},{"lineNumber":100,"author":{"gitId":"-"},"content":"\u003c/box\u003e","lastModifiedDate":"2023-09-12"},{"lineNumber":101,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":102,"author":{"gitId":"-"},"content":"How the `Logic` component works:","lastModifiedDate":"2023-09-03"},{"lineNumber":103,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2023-09-03"},{"lineNumber":104,"author":{"gitId":"-"},"content":"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.","lastModifiedDate":"2023-09-03"},{"lineNumber":105,"author":{"gitId":"-"},"content":"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`.","lastModifiedDate":"2023-09-03"},{"lineNumber":106,"author":{"gitId":"-"},"content":"1. The command can communicate with the `Model` when it is executed (e.g. to delete a person).\u003cbr\u003e","lastModifiedDate":"2024-02-09"},{"lineNumber":107,"author":{"gitId":"-"},"content":" Note that although this is shown as a single step in the diagram above (for simplicity), in the code it can take several interactions (between the command object and the `Model`) to achieve.","lastModifiedDate":"2024-02-09"},{"lineNumber":108,"author":{"gitId":"-"},"content":"1. The result of the command execution is encapsulated as a `CommandResult` object which is returned back from `Logic`.","lastModifiedDate":"2023-09-03"},{"lineNumber":109,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2023-09-03"},{"lineNumber":110,"author":{"gitId":"-"},"content":"Here are the other classes in `Logic` (omitted from the class diagram above) that are used for parsing a user command:","lastModifiedDate":"2021-07-31"},{"lineNumber":111,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2021-07-31"},{"lineNumber":112,"author":{"gitId":"-"},"content":"\u003cpuml src\u003d\"diagrams/ParserClasses.puml\" width\u003d\"600\"/\u003e","lastModifiedDate":"2023-09-12"},{"lineNumber":113,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":114,"author":{"gitId":"-"},"content":"How the parsing works:","lastModifiedDate":"2021-07-31"},{"lineNumber":115,"author":{"gitId":"-"},"content":"* 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.","lastModifiedDate":"2021-07-31"},{"lineNumber":116,"author":{"gitId":"-"},"content":"* 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.","lastModifiedDate":"2021-07-31"},{"lineNumber":117,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":118,"author":{"gitId":"-"},"content":"### Model component","lastModifiedDate":"2021-07-31"},{"lineNumber":119,"author":{"gitId":"-"},"content":"**API** : [`Model.java`](https://github.com/se-edu/addressbook-level3/tree/master/src/main/java/seedu/address/model/Model.java)","lastModifiedDate":"2020-05-23"},{"lineNumber":120,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":121,"author":{"gitId":"-"},"content":"\u003cpuml src\u003d\"diagrams/ModelClassDiagram.puml\" width\u003d\"450\" /\u003e","lastModifiedDate":"2023-09-12"},{"lineNumber":122,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":123,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":124,"author":{"gitId":"-"},"content":"The `Model` component,","lastModifiedDate":"2021-07-31"},{"lineNumber":125,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":126,"author":{"gitId":"-"},"content":"* stores the address book data i.e., all `Person` objects (which are contained in a `UniquePersonList` object).","lastModifiedDate":"2021-07-31"},{"lineNumber":127,"author":{"gitId":"-"},"content":"* stores the currently \u0027selected\u0027 `Person` objects (e.g., results of a search query) as a separate _filtered_ list which is exposed to outsiders as an unmodifiable `ObservableList\u003cPerson\u003e` that can be \u0027observed\u0027 e.g. the UI can be bound to this list so that the UI automatically updates when the data in the list change.","lastModifiedDate":"2021-07-31"},{"lineNumber":128,"author":{"gitId":"-"},"content":"* stores a `UserPref` object that represents the user’s preferences. This is exposed to the outside as a `ReadOnlyUserPref` objects.","lastModifiedDate":"2021-07-31"},{"lineNumber":129,"author":{"gitId":"-"},"content":"* 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)","lastModifiedDate":"2021-07-31"},{"lineNumber":130,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2021-07-31"},{"lineNumber":131,"author":{"gitId":"-"},"content":"\u003cbox type\u003d\"info\" seamless\u003e","lastModifiedDate":"2023-09-12"},{"lineNumber":132,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2023-09-12"},{"lineNumber":133,"author":{"gitId":"-"},"content":"**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.\u003cbr\u003e","lastModifiedDate":"2023-09-12"},{"lineNumber":134,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2021-07-31"},{"lineNumber":135,"author":{"gitId":"-"},"content":"\u003cpuml src\u003d\"diagrams/BetterModelClassDiagram.puml\" width\u003d\"450\" /\u003e","lastModifiedDate":"2023-09-12"},{"lineNumber":136,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":137,"author":{"gitId":"-"},"content":"\u003c/box\u003e","lastModifiedDate":"2023-09-12"},{"lineNumber":138,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":139,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":140,"author":{"gitId":"-"},"content":"### Storage component","lastModifiedDate":"2020-05-23"},{"lineNumber":141,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":142,"author":{"gitId":"-"},"content":"**API** : [`Storage.java`](https://github.com/se-edu/addressbook-level3/tree/master/src/main/java/seedu/address/storage/Storage.java)","lastModifiedDate":"2020-05-23"},{"lineNumber":143,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":144,"author":{"gitId":"-"},"content":"\u003cpuml src\u003d\"diagrams/StorageClassDiagram.puml\" width\u003d\"550\" /\u003e","lastModifiedDate":"2023-09-12"},{"lineNumber":145,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2021-07-31"},{"lineNumber":146,"author":{"gitId":"-"},"content":"The `Storage` component,","lastModifiedDate":"2020-05-23"},{"lineNumber":147,"author":{"gitId":"-"},"content":"* can save both address book data and user preference data in JSON format, and read them back into corresponding objects.","lastModifiedDate":"2023-09-03"},{"lineNumber":148,"author":{"gitId":"-"},"content":"* inherits from both `AddressBookStorage` and `UserPrefStorage`, which means it can be treated as either one (if only the functionality of only one is needed).","lastModifiedDate":"2021-07-31"},{"lineNumber":149,"author":{"gitId":"-"},"content":"* depends on some classes in the `Model` component (because the `Storage` component\u0027s job is to save/retrieve objects that belong to the `Model`)","lastModifiedDate":"2021-07-21"},{"lineNumber":150,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":151,"author":{"gitId":"-"},"content":"### Common classes","lastModifiedDate":"2020-05-23"},{"lineNumber":152,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":153,"author":{"gitId":"-"},"content":"Classes used by multiple components are in the `seedu.addressbook.commons` package.","lastModifiedDate":"2020-05-23"},{"lineNumber":154,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":155,"author":{"gitId":"-"},"content":"--------------------------------------------------------------------------------------------------------------------","lastModifiedDate":"2020-05-23"},{"lineNumber":156,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":157,"author":{"gitId":"-"},"content":"## **Implementation**","lastModifiedDate":"2020-05-23"},{"lineNumber":158,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":159,"author":{"gitId":"-"},"content":"This section describes some noteworthy details on how certain features are implemented.","lastModifiedDate":"2020-05-23"},{"lineNumber":160,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":161,"author":{"gitId":"-"},"content":"### \\[Proposed\\] Undo/redo feature","lastModifiedDate":"2020-06-07"},{"lineNumber":162,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":163,"author":{"gitId":"-"},"content":"#### Proposed Implementation","lastModifiedDate":"2020-05-23"},{"lineNumber":164,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":165,"author":{"gitId":"-"},"content":"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:","lastModifiedDate":"2020-05-23"},{"lineNumber":166,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":167,"author":{"gitId":"-"},"content":"* `VersionedAddressBook#commit()` — Saves the current address book state in its history.","lastModifiedDate":"2020-05-23"},{"lineNumber":168,"author":{"gitId":"-"},"content":"* `VersionedAddressBook#undo()` — Restores the previous address book state from its history.","lastModifiedDate":"2020-05-23"},{"lineNumber":169,"author":{"gitId":"-"},"content":"* `VersionedAddressBook#redo()` — Restores a previously undone address book state from its history.","lastModifiedDate":"2020-05-23"},{"lineNumber":170,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":171,"author":{"gitId":"-"},"content":"These operations are exposed in the `Model` interface as `Model#commitAddressBook()`, `Model#undoAddressBook()` and `Model#redoAddressBook()` respectively.","lastModifiedDate":"2020-05-23"},{"lineNumber":172,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":173,"author":{"gitId":"-"},"content":"Given below is an example usage scenario and how the undo/redo mechanism behaves at each step.","lastModifiedDate":"2020-05-23"},{"lineNumber":174,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":175,"author":{"gitId":"-"},"content":"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.","lastModifiedDate":"2020-05-23"},{"lineNumber":176,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":177,"author":{"gitId":"-"},"content":"\u003cpuml src\u003d\"diagrams/UndoRedoState0.puml\" alt\u003d\"UndoRedoState0\" /\u003e","lastModifiedDate":"2023-09-12"},{"lineNumber":178,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":179,"author":{"gitId":"-"},"content":"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.","lastModifiedDate":"2020-05-23"},{"lineNumber":180,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":181,"author":{"gitId":"-"},"content":"\u003cpuml src\u003d\"diagrams/UndoRedoState1.puml\" alt\u003d\"UndoRedoState1\" /\u003e","lastModifiedDate":"2023-09-12"},{"lineNumber":182,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":183,"author":{"gitId":"-"},"content":"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`.","lastModifiedDate":"2020-05-23"},{"lineNumber":184,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":185,"author":{"gitId":"-"},"content":"\u003cpuml src\u003d\"diagrams/UndoRedoState2.puml\" alt\u003d\"UndoRedoState2\" /\u003e","lastModifiedDate":"2023-09-12"},{"lineNumber":186,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":187,"author":{"gitId":"-"},"content":"\u003cbox type\u003d\"info\" seamless\u003e","lastModifiedDate":"2023-09-12"},{"lineNumber":188,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":189,"author":{"gitId":"-"},"content":"**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`.","lastModifiedDate":"2023-09-12"},{"lineNumber":190,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2023-09-12"},{"lineNumber":191,"author":{"gitId":"-"},"content":"\u003c/box\u003e","lastModifiedDate":"2023-09-12"},{"lineNumber":192,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":193,"author":{"gitId":"-"},"content":"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.","lastModifiedDate":"2020-05-23"},{"lineNumber":194,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":195,"author":{"gitId":"-"},"content":"\u003cpuml src\u003d\"diagrams/UndoRedoState3.puml\" alt\u003d\"UndoRedoState3\" /\u003e","lastModifiedDate":"2023-09-12"},{"lineNumber":196,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2023-09-12"},{"lineNumber":197,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2023-09-12"},{"lineNumber":198,"author":{"gitId":"-"},"content":"\u003cbox type\u003d\"info\" seamless\u003e","lastModifiedDate":"2023-09-12"},{"lineNumber":199,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":200,"author":{"gitId":"-"},"content":"**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","lastModifiedDate":"2023-09-12"},{"lineNumber":201,"author":{"gitId":"-"},"content":"than attempting to perform the undo.","lastModifiedDate":"2020-05-23"},{"lineNumber":202,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":203,"author":{"gitId":"-"},"content":"\u003c/box\u003e","lastModifiedDate":"2023-09-12"},{"lineNumber":204,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":205,"author":{"gitId":"-"},"content":"The following sequence diagram shows how an undo operation goes through the `Logic` component:","lastModifiedDate":"2024-02-09"},{"lineNumber":206,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":207,"author":{"gitId":"-"},"content":"\u003cpuml src\u003d\"diagrams/UndoSequenceDiagram-Logic.puml\" alt\u003d\"UndoSequenceDiagram-Logic\" /\u003e","lastModifiedDate":"2023-09-12"},{"lineNumber":208,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":209,"author":{"gitId":"-"},"content":"\u003cbox type\u003d\"info\" seamless\u003e","lastModifiedDate":"2023-09-12"},{"lineNumber":210,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":211,"author":{"gitId":"-"},"content":"**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.","lastModifiedDate":"2023-09-12"},{"lineNumber":212,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2023-09-12"},{"lineNumber":213,"author":{"gitId":"-"},"content":"\u003c/box\u003e","lastModifiedDate":"2023-09-12"},{"lineNumber":214,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":215,"author":{"gitId":"-"},"content":"Similarly, how an undo operation goes through the `Model` component is shown below:","lastModifiedDate":"2024-02-09"},{"lineNumber":216,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2024-02-09"},{"lineNumber":217,"author":{"gitId":"-"},"content":"\u003cpuml src\u003d\"diagrams/UndoSequenceDiagram-Model.puml\" alt\u003d\"UndoSequenceDiagram-Model\" /\u003e","lastModifiedDate":"2023-09-12"},{"lineNumber":218,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2024-02-09"},{"lineNumber":219,"author":{"gitId":"-"},"content":"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.","lastModifiedDate":"2020-05-23"},{"lineNumber":220,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":221,"author":{"gitId":"-"},"content":"\u003cbox type\u003d\"info\" seamless\u003e","lastModifiedDate":"2023-09-12"},{"lineNumber":222,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2023-09-12"},{"lineNumber":223,"author":{"gitId":"-"},"content":"**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.","lastModifiedDate":"2023-09-12"},{"lineNumber":224,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":225,"author":{"gitId":"-"},"content":"\u003c/box\u003e","lastModifiedDate":"2023-09-12"},{"lineNumber":226,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":227,"author":{"gitId":"-"},"content":"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.","lastModifiedDate":"2020-05-23"},{"lineNumber":228,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":229,"author":{"gitId":"-"},"content":"\u003cpuml src\u003d\"diagrams/UndoRedoState4.puml\" alt\u003d\"UndoRedoState4\" /\u003e","lastModifiedDate":"2023-09-12"},{"lineNumber":230,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":231,"author":{"gitId":"-"},"content":"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.","lastModifiedDate":"2020-05-23"},{"lineNumber":232,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":233,"author":{"gitId":"-"},"content":"\u003cpuml src\u003d\"diagrams/UndoRedoState5.puml\" alt\u003d\"UndoRedoState5\" /\u003e","lastModifiedDate":"2023-09-12"},{"lineNumber":234,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":235,"author":{"gitId":"-"},"content":"The following activity diagram summarizes what happens when a user executes a new command:","lastModifiedDate":"2020-05-23"},{"lineNumber":236,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":237,"author":{"gitId":"-"},"content":"\u003cpuml src\u003d\"diagrams/CommitActivityDiagram.puml\" width\u003d\"250\" /\u003e","lastModifiedDate":"2023-09-12"},{"lineNumber":238,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":239,"author":{"gitId":"-"},"content":"#### Design considerations:","lastModifiedDate":"2021-07-31"},{"lineNumber":240,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":241,"author":{"gitId":"-"},"content":"**Aspect: How undo \u0026 redo executes:**","lastModifiedDate":"2021-07-31"},{"lineNumber":242,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":243,"author":{"gitId":"-"},"content":"* **Alternative 1 (current choice):** Saves the entire address book.","lastModifiedDate":"2020-05-23"},{"lineNumber":244,"author":{"gitId":"-"},"content":" * Pros: Easy to implement.","lastModifiedDate":"2020-05-23"},{"lineNumber":245,"author":{"gitId":"-"},"content":" * Cons: May have performance issues in terms of memory usage.","lastModifiedDate":"2020-05-23"},{"lineNumber":246,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":247,"author":{"gitId":"-"},"content":"* **Alternative 2:** Individual command knows how to undo/redo by","lastModifiedDate":"2020-05-23"},{"lineNumber":248,"author":{"gitId":"-"},"content":" itself.","lastModifiedDate":"2020-05-23"},{"lineNumber":249,"author":{"gitId":"-"},"content":" * Pros: Will use less memory (e.g. for `delete`, just save the person being deleted).","lastModifiedDate":"2020-05-23"},{"lineNumber":250,"author":{"gitId":"-"},"content":" * Cons: We must ensure that the implementation of each individual command are correct.","lastModifiedDate":"2020-05-23"},{"lineNumber":251,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":252,"author":{"gitId":"-"},"content":"_{more aspects and alternatives to be added}_","lastModifiedDate":"2020-05-23"},{"lineNumber":253,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":254,"author":{"gitId":"-"},"content":"### \\[Proposed\\] Data archiving","lastModifiedDate":"2020-05-23"},{"lineNumber":255,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":256,"author":{"gitId":"-"},"content":"_{Explain here how the data archiving feature will be implemented}_","lastModifiedDate":"2020-05-23"},{"lineNumber":257,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":258,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":259,"author":{"gitId":"-"},"content":"--------------------------------------------------------------------------------------------------------------------","lastModifiedDate":"2020-05-23"},{"lineNumber":260,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":261,"author":{"gitId":"-"},"content":"## **Documentation, logging, testing, configuration, dev-ops**","lastModifiedDate":"2020-06-07"},{"lineNumber":262,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":263,"author":{"gitId":"-"},"content":"* [Documentation guide](Documentation.md)","lastModifiedDate":"2020-06-07"},{"lineNumber":264,"author":{"gitId":"-"},"content":"* [Testing guide](Testing.md)","lastModifiedDate":"2020-06-07"},{"lineNumber":265,"author":{"gitId":"-"},"content":"* [Logging guide](Logging.md)","lastModifiedDate":"2020-06-07"},{"lineNumber":266,"author":{"gitId":"-"},"content":"* [Configuration guide](Configuration.md)","lastModifiedDate":"2020-06-07"},{"lineNumber":267,"author":{"gitId":"-"},"content":"* [DevOps guide](DevOps.md)","lastModifiedDate":"2020-06-07"},{"lineNumber":268,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":269,"author":{"gitId":"-"},"content":"--------------------------------------------------------------------------------------------------------------------","lastModifiedDate":"2020-05-23"},{"lineNumber":270,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":271,"author":{"gitId":"-"},"content":"## **Appendix: Requirements**","lastModifiedDate":"2020-05-23"},{"lineNumber":272,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":273,"author":{"gitId":"-"},"content":"### Product scope","lastModifiedDate":"2020-05-23"},{"lineNumber":274,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":275,"author":{"gitId":"-"},"content":"**Target user profile**:","lastModifiedDate":"2020-05-23"},{"lineNumber":276,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":277,"author":{"gitId":"limrik"},"content":"* has a need to manage a significant number of patient information","lastModifiedDate":"2024-03-05"},{"lineNumber":278,"author":{"gitId":"limrik"},"content":"* has a need to schedule patients for appointments","lastModifiedDate":"2024-03-05"},{"lineNumber":279,"author":{"gitId":"limrik"},"content":"* prefers to manage patient information and appointments in one application","lastModifiedDate":"2024-03-05"},{"lineNumber":280,"author":{"gitId":"-"},"content":"* prefer desktop apps over other types","lastModifiedDate":"2020-05-23"},{"lineNumber":281,"author":{"gitId":"-"},"content":"* can type fast","lastModifiedDate":"2020-05-23"},{"lineNumber":282,"author":{"gitId":"-"},"content":"* prefers typing to mouse interactions","lastModifiedDate":"2020-05-26"},{"lineNumber":283,"author":{"gitId":"-"},"content":"* is reasonably comfortable using CLI apps","lastModifiedDate":"2020-05-23"},{"lineNumber":284,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":285,"author":{"gitId":"limrik"},"content":"**Value proposition**: manage patient appointments faster than a typical mouse/GUI driven app","lastModifiedDate":"2024-03-05"},{"lineNumber":286,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":287,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":288,"author":{"gitId":"-"},"content":"### User stories","lastModifiedDate":"2020-06-07"},{"lineNumber":289,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":290,"author":{"gitId":"-"},"content":"Priorities: High (must have) - `* * *`, Medium (nice to have) - `* *`, Low (unlikely to have) - `*`","lastModifiedDate":"2020-05-23"},{"lineNumber":291,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":292,"author":{"gitId":"-"},"content":"| Priority | As a …​ | I want to …​ | So that I can…​ |","lastModifiedDate":"2020-05-23"},{"lineNumber":293,"author":{"gitId":"limrik"},"content":"|----------|---------|------------------------------------------------------------------------------------|----------------------------------------------------------------------------------|","lastModifiedDate":"2024-03-05"},{"lineNumber":294,"author":{"gitId":"limrik"},"content":"| `* * *` | user | add a new patient | |","lastModifiedDate":"2024-03-05"},{"lineNumber":295,"author":{"gitId":"limrik"},"content":"| `* * *` | user | delete a patient | |","lastModifiedDate":"2024-03-05"},{"lineNumber":296,"author":{"gitId":"limrik"},"content":"| `* * *` | user | schedule an appointment for a patient | |","lastModifiedDate":"2024-03-05"},{"lineNumber":297,"author":{"gitId":"limrik"},"content":"| `* * *` | user | cancel an appointment | account for changes in scheduling |","lastModifiedDate":"2024-03-05"},{"lineNumber":298,"author":{"gitId":"limrik"},"content":"| `* * *` | user | have an overall view of upcoming patient appointments | have situational awareness of the schedule for the day |","lastModifiedDate":"2024-03-05"},{"lineNumber":299,"author":{"gitId":"limrik"},"content":"| `* * *` | user | mark patients who have been seen for the day | track patient\u0027s appointment attendance |","lastModifiedDate":"2024-03-05"},{"lineNumber":300,"author":{"gitId":"limrik"},"content":"| `* *` | user | update a patient\u0027s information | keep the database up to date |","lastModifiedDate":"2024-03-05"},{"lineNumber":301,"author":{"gitId":"limrik"},"content":"| `* *` | user | easily filter the patients by their medical records | see which is in need of more assistance or follow up care |","lastModifiedDate":"2024-03-05"},{"lineNumber":302,"author":{"gitId":"limrik"},"content":"| `* *` | user | search for patients by their name | look up their appointment information quickly |","lastModifiedDate":"2024-03-05"},{"lineNumber":303,"author":{"gitId":"limrik"},"content":"| `* *` | user | update the details of the appointment | reschedule appointments as needed |","lastModifiedDate":"2024-03-05"},{"lineNumber":304,"author":{"gitId":"limrik"},"content":"| `* *` | user | view the list of patients for the given hour | see the immediate schedule |","lastModifiedDate":"2024-03-05"},{"lineNumber":305,"author":{"gitId":"limrik"},"content":"| `* *` | user | tag appointments based on appointment type | I can categorize which appointments require test or room bookings |","lastModifiedDate":"2024-03-05"},{"lineNumber":306,"author":{"gitId":"limrik"},"content":"| `* *` | user | tag appointments based on insurance type | prepare necessary insurance documents before patient’s appointments |","lastModifiedDate":"2024-03-05"},{"lineNumber":307,"author":{"gitId":"limrik"},"content":"| `* *` | user | input commands without having inputs to be in a specific order | key in commands fast in busy periods |","lastModifiedDate":"2024-03-05"},{"lineNumber":308,"author":{"gitId":"limrik"},"content":"| `*` | user | sort the time to a patient\u0027s appointment | remind patients of their appointment |","lastModifiedDate":"2024-03-05"},{"lineNumber":309,"author":{"gitId":"limrik"},"content":"| `*` | user | see how long it has been since a patient\u0027s last appointment | remind patients to come for another checkup |","lastModifiedDate":"2024-03-05"},{"lineNumber":310,"author":{"gitId":"limrik"},"content":"| `*` | user | see what appointments are overlapping | ensure the patients have enough time to be seen for their different appointments |","lastModifiedDate":"2024-03-05"},{"lineNumber":311,"author":{"gitId":"limrik"},"content":"| `*` | user | set notifications for upcoming appointments | staff and patients can be well informed early in advance |","lastModifiedDate":"2024-03-05"},{"lineNumber":312,"author":{"gitId":"limrik"},"content":"| `*` | user | track if the patients have been sent reminders on their appointments | patients do not get spammed with reminders |","lastModifiedDate":"2024-03-05"},{"lineNumber":313,"author":{"gitId":"limrik"},"content":"| `*` | user | be notified of upcoming appointments on entry into the system | will not miss approaching deadlines |","lastModifiedDate":"2024-03-05"},{"lineNumber":314,"author":{"gitId":"limrik"},"content":"| `*` | user | easily contact the patients via SMS or email through the program | update patients about their details and upcoming appointments |","lastModifiedDate":"2024-03-05"},{"lineNumber":315,"author":{"gitId":"limrik"},"content":"| `*` | user | quickly navigate the CLI with intuitive commands | increase my efficiency |","lastModifiedDate":"2024-03-05"},{"lineNumber":316,"author":{"gitId":"limrik"},"content":"| `*` | user | check if patients are related to one another | have alternate contacts |","lastModifiedDate":"2024-03-05"},{"lineNumber":317,"author":{"gitId":"limrik"},"content":"| `*` | user | update or create new records in bulk | process a family more efficiently |","lastModifiedDate":"2024-03-05"},{"lineNumber":318,"author":{"gitId":"limrik"},"content":"| `*` | user | set recurring tasks | I do not have to keep scheduling recurring appointments |","lastModifiedDate":"2024-03-05"},{"lineNumber":319,"author":{"gitId":"limrik"},"content":"| `*` | user | retrieve past records or revert changes easily | revert my changes if I accidentally delete or wrongly edit a patient’s records |","lastModifiedDate":"2024-03-05"},{"lineNumber":320,"author":{"gitId":"limrik"},"content":"| `*` | user | select what information is available when I view the list of patients | cater the view to my needs |","lastModifiedDate":"2024-03-05"},{"lineNumber":321,"author":{"gitId":"limrik"},"content":"| `*` | user | add notes to a patient | include other additional information |","lastModifiedDate":"2024-03-05"},{"lineNumber":322,"author":{"gitId":"limrik"},"content":"| `*` | user | easily generate reports of the patient details and export it to the doctor/patient | have easy access |","lastModifiedDate":"2024-03-05"},{"lineNumber":323,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":324,"author":{"gitId":"-"},"content":"### Use cases","lastModifiedDate":"2020-06-07"},{"lineNumber":325,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":326,"author":{"gitId":"limrik"},"content":"(For all use cases below, the **System** is the `CLInic` and the **Actor** is the `user`, unless specified otherwise)","lastModifiedDate":"2024-03-08"},{"lineNumber":327,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":328,"author":{"gitId":"ThatGirlJam"},"content":"// EXAMPLE //","lastModifiedDate":"2024-03-05"},{"lineNumber":329,"author":{"gitId":"-"},"content":"**Use case: Delete a person**","lastModifiedDate":"2020-05-23"},{"lineNumber":330,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":331,"author":{"gitId":"-"},"content":"**MSS**","lastModifiedDate":"2020-05-23"},{"lineNumber":332,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":333,"author":{"gitId":"-"},"content":"1. User requests to list persons","lastModifiedDate":"2020-05-23"},{"lineNumber":334,"author":{"gitId":"limrik"},"content":"2. CLInic shows a list of persons","lastModifiedDate":"2024-03-08"},{"lineNumber":335,"author":{"gitId":"-"},"content":"3. User requests to delete a specific person in the list","lastModifiedDate":"2020-05-23"},{"lineNumber":336,"author":{"gitId":"limrik"},"content":"4. CLInic deletes the person","lastModifiedDate":"2024-03-08"},{"lineNumber":337,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":338,"author":{"gitId":"-"},"content":" Use case ends.","lastModifiedDate":"2020-05-23"},{"lineNumber":339,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":340,"author":{"gitId":"-"},"content":"**Extensions**","lastModifiedDate":"2020-05-23"},{"lineNumber":341,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":342,"author":{"gitId":"-"},"content":"* 2a. The list is empty.","lastModifiedDate":"2020-05-23"},{"lineNumber":343,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":344,"author":{"gitId":"-"},"content":" Use case ends.","lastModifiedDate":"2020-05-23"},{"lineNumber":345,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":346,"author":{"gitId":"-"},"content":"* 3a. The given index is invalid.","lastModifiedDate":"2020-05-23"},{"lineNumber":347,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":348,"author":{"gitId":"limrik"},"content":" * 3a1. CLInic shows an error message.","lastModifiedDate":"2024-03-08"},{"lineNumber":349,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":350,"author":{"gitId":"-"},"content":" Use case resumes at step 2.","lastModifiedDate":"2020-05-23"},{"lineNumber":351,"author":{"gitId":"ThatGirlJam"},"content":"// EXAMPLE //","lastModifiedDate":"2024-03-05"},{"lineNumber":352,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":353,"author":{"gitId":"ThatGirlJam"},"content":"**Use case (UC1) : Add new patient information to the database**","lastModifiedDate":"2024-03-05"},{"lineNumber":354,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2024-03-05"},{"lineNumber":355,"author":{"gitId":"ThatGirlJam"},"content":"**MSS**","lastModifiedDate":"2024-03-05"},{"lineNumber":356,"author":{"gitId":"ThatGirlJam"},"content":"","lastModifiedDate":"2024-03-05"},{"lineNumber":357,"author":{"gitId":"ThatGirlJam"},"content":"1. User requests to add new patient information","lastModifiedDate":"2024-03-05"},{"lineNumber":358,"author":{"gitId":"limrik"},"content":"2. CLInic validates the information ","lastModifiedDate":"2024-03-08"},{"lineNumber":359,"author":{"gitId":"limrik"},"content":"3. CLInic adds the patient\u0027s information to the database","lastModifiedDate":"2024-03-08"},{"lineNumber":360,"author":{"gitId":"ThatGirlJam"},"content":"","lastModifiedDate":"2024-03-05"},{"lineNumber":361,"author":{"gitId":"ThatGirlJam"},"content":" Use case ends.","lastModifiedDate":"2024-03-05"},{"lineNumber":362,"author":{"gitId":"ThatGirlJam"},"content":"","lastModifiedDate":"2024-03-05"},{"lineNumber":363,"author":{"gitId":"ThatGirlJam"},"content":"**Extensions**","lastModifiedDate":"2024-03-05"},{"lineNumber":364,"author":{"gitId":"ThatGirlJam"},"content":"","lastModifiedDate":"2024-03-05"},{"lineNumber":365,"author":{"gitId":"ThatGirlJam"},"content":"* 1a. The required information is missing.","lastModifiedDate":"2024-03-05"},{"lineNumber":366,"author":{"gitId":"ThatGirlJam"},"content":"","lastModifiedDate":"2024-03-05"},{"lineNumber":367,"author":{"gitId":"limrik"},"content":" * 1a1. CLInic prompts user to input required information.","lastModifiedDate":"2024-03-08"},{"lineNumber":368,"author":{"gitId":"ThatGirlJam"},"content":"","lastModifiedDate":"2024-03-05"},{"lineNumber":369,"author":{"gitId":"ThatGirlJam"},"content":" Use case resumes at step 1.","lastModifiedDate":"2024-03-05"},{"lineNumber":370,"author":{"gitId":"ThatGirlJam"},"content":"","lastModifiedDate":"2024-03-05"},{"lineNumber":371,"author":{"gitId":"ThatGirlJam"},"content":"* 2a. The given information is invalid.","lastModifiedDate":"2024-03-05"},{"lineNumber":372,"author":{"gitId":"ThatGirlJam"},"content":"","lastModifiedDate":"2024-03-05"},{"lineNumber":373,"author":{"gitId":"limrik"},"content":" * 2a1. CLInic shows an error message.","lastModifiedDate":"2024-03-08"},{"lineNumber":374,"author":{"gitId":"ThatGirlJam"},"content":"","lastModifiedDate":"2024-03-05"},{"lineNumber":375,"author":{"gitId":"ThatGirlJam"},"content":" Use case resumes at step 1.","lastModifiedDate":"2024-03-05"},{"lineNumber":376,"author":{"gitId":"ThatGirlJam"},"content":"","lastModifiedDate":"2024-03-05"},{"lineNumber":377,"author":{"gitId":"ThatGirlJam"},"content":"**Use case (UC2) : Delete patient information from the database**","lastModifiedDate":"2024-03-05"},{"lineNumber":378,"author":{"gitId":"ThatGirlJam"},"content":"","lastModifiedDate":"2024-03-05"},{"lineNumber":379,"author":{"gitId":"ThatGirlJam"},"content":"**MSS**","lastModifiedDate":"2024-03-05"},{"lineNumber":380,"author":{"gitId":"ThatGirlJam"},"content":"","lastModifiedDate":"2024-03-05"},{"lineNumber":381,"author":{"gitId":"ThatGirlJam"},"content":"1. User requests to list persons","lastModifiedDate":"2024-03-05"},{"lineNumber":382,"author":{"gitId":"limrik"},"content":"2. CLInic shows a list of persons","lastModifiedDate":"2024-03-08"},{"lineNumber":383,"author":{"gitId":"ThatGirlJam"},"content":"3. User requests to delete a specific person in the list","lastModifiedDate":"2024-03-05"},{"lineNumber":384,"author":{"gitId":"limrik"},"content":"4. CLInic deletes the person","lastModifiedDate":"2024-03-08"},{"lineNumber":385,"author":{"gitId":"ThatGirlJam"},"content":"","lastModifiedDate":"2024-03-05"},{"lineNumber":386,"author":{"gitId":"ThatGirlJam"},"content":" Use case ends.","lastModifiedDate":"2024-03-05"},{"lineNumber":387,"author":{"gitId":"ThatGirlJam"},"content":"","lastModifiedDate":"2024-03-05"},{"lineNumber":388,"author":{"gitId":"ThatGirlJam"},"content":"**Extensions**","lastModifiedDate":"2024-03-05"},{"lineNumber":389,"author":{"gitId":"ThatGirlJam"},"content":"","lastModifiedDate":"2024-03-05"},{"lineNumber":390,"author":{"gitId":"ThatGirlJam"},"content":"* 2a. The list is empty.","lastModifiedDate":"2024-03-05"},{"lineNumber":391,"author":{"gitId":"ThatGirlJam"},"content":"","lastModifiedDate":"2024-03-05"},{"lineNumber":392,"author":{"gitId":"ThatGirlJam"},"content":" Use case ends.","lastModifiedDate":"2024-03-05"},{"lineNumber":393,"author":{"gitId":"ThatGirlJam"},"content":"","lastModifiedDate":"2024-03-05"},{"lineNumber":394,"author":{"gitId":"ThatGirlJam"},"content":"* 3a. The given index is invalid.","lastModifiedDate":"2024-03-05"},{"lineNumber":395,"author":{"gitId":"ThatGirlJam"},"content":"","lastModifiedDate":"2024-03-05"},{"lineNumber":396,"author":{"gitId":"limrik"},"content":" * 3a1. CLInic shows an error message.","lastModifiedDate":"2024-03-08"},{"lineNumber":397,"author":{"gitId":"ThatGirlJam"},"content":"","lastModifiedDate":"2024-03-05"},{"lineNumber":398,"author":{"gitId":"ThatGirlJam"},"content":" Use case resumes at step 2.","lastModifiedDate":"2024-03-05"},{"lineNumber":399,"author":{"gitId":"ThatGirlJam"},"content":"","lastModifiedDate":"2024-03-05"},{"lineNumber":400,"author":{"gitId":"ThatGirlJam"},"content":"**Use case (UC3) : Schedule an appointment for the patient**","lastModifiedDate":"2024-03-05"},{"lineNumber":401,"author":{"gitId":"ThatGirlJam"},"content":"","lastModifiedDate":"2024-03-05"},{"lineNumber":402,"author":{"gitId":"ThatGirlJam"},"content":"**MSS**","lastModifiedDate":"2024-03-05"},{"lineNumber":403,"author":{"gitId":"ThatGirlJam"},"content":"","lastModifiedDate":"2024-03-05"},{"lineNumber":404,"author":{"gitId":"ThatGirlJam"},"content":"1. User requests to list persons","lastModifiedDate":"2024-03-05"},{"lineNumber":405,"author":{"gitId":"limrik"},"content":"2. CLInic shows a list of persons","lastModifiedDate":"2024-03-08"},{"lineNumber":406,"author":{"gitId":"ThatGirlJam"},"content":"3. User requests to schedule an appointment for a specific person in the list","lastModifiedDate":"2024-03-05"},{"lineNumber":407,"author":{"gitId":"limrik"},"content":"4. CLInic prompts User to input appointment details","lastModifiedDate":"2024-03-08"},{"lineNumber":408,"author":{"gitId":"ThatGirlJam"},"content":"5. User inputs appointment details ","lastModifiedDate":"2024-03-05"},{"lineNumber":409,"author":{"gitId":"limrik"},"content":"6. CLInic schedules appointment for the patient","lastModifiedDate":"2024-03-08"},{"lineNumber":410,"author":{"gitId":"ThatGirlJam"},"content":"","lastModifiedDate":"2024-03-05"},{"lineNumber":411,"author":{"gitId":"ThatGirlJam"},"content":" Use case ends.","lastModifiedDate":"2024-03-05"},{"lineNumber":412,"author":{"gitId":"ThatGirlJam"},"content":"","lastModifiedDate":"2024-03-05"},{"lineNumber":413,"author":{"gitId":"ThatGirlJam"},"content":"**Extensions**","lastModifiedDate":"2024-03-05"},{"lineNumber":414,"author":{"gitId":"ThatGirlJam"},"content":"","lastModifiedDate":"2024-03-05"},{"lineNumber":415,"author":{"gitId":"ThatGirlJam"},"content":"* 2a. The list is empty.","lastModifiedDate":"2024-03-05"},{"lineNumber":416,"author":{"gitId":"ThatGirlJam"},"content":"","lastModifiedDate":"2024-03-05"},{"lineNumber":417,"author":{"gitId":"ThatGirlJam"},"content":" Use case ends.","lastModifiedDate":"2024-03-05"},{"lineNumber":418,"author":{"gitId":"ThatGirlJam"},"content":"","lastModifiedDate":"2024-03-05"},{"lineNumber":419,"author":{"gitId":"ThatGirlJam"},"content":"* 5a. The given appointment details are invalid.","lastModifiedDate":"2024-03-05"},{"lineNumber":420,"author":{"gitId":"ThatGirlJam"},"content":"","lastModifiedDate":"2024-03-05"},{"lineNumber":421,"author":{"gitId":"limrik"},"content":" * 5a1. CLInic shows an error message.","lastModifiedDate":"2024-03-08"},{"lineNumber":422,"author":{"gitId":"ThatGirlJam"},"content":"","lastModifiedDate":"2024-03-05"},{"lineNumber":423,"author":{"gitId":"ThatGirlJam"},"content":" Use case resumes at step 4.","lastModifiedDate":"2024-03-05"},{"lineNumber":424,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2024-03-05"},{"lineNumber":425,"author":{"gitId":"ThatGirlJam"},"content":"**Use case (UC4) : Cancel an appointment**","lastModifiedDate":"2024-03-05"},{"lineNumber":426,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2024-03-05"},{"lineNumber":427,"author":{"gitId":"ThatGirlJam"},"content":"**MSS**","lastModifiedDate":"2024-03-05"},{"lineNumber":428,"author":{"gitId":"ThatGirlJam"},"content":"","lastModifiedDate":"2024-03-05"},{"lineNumber":429,"author":{"gitId":"ThatGirlJam"},"content":"1. User requests to list persons","lastModifiedDate":"2024-03-05"},{"lineNumber":430,"author":{"gitId":"limrik"},"content":"2. CLInic shows a list of persons","lastModifiedDate":"2024-03-08"},{"lineNumber":431,"author":{"gitId":"ThatGirlJam"},"content":"3. User requests to cancel an appointment for a specific person in the list","lastModifiedDate":"2024-03-05"},{"lineNumber":432,"author":{"gitId":"limrik"},"content":"4. CLInic prompts User to input appointment details","lastModifiedDate":"2024-03-08"},{"lineNumber":433,"author":{"gitId":"ThatGirlJam"},"content":"5. User inputs appointment details","lastModifiedDate":"2024-03-05"},{"lineNumber":434,"author":{"gitId":"limrik"},"content":"6. CLInic cancels appointment for the patient","lastModifiedDate":"2024-03-08"},{"lineNumber":435,"author":{"gitId":"ThatGirlJam"},"content":"","lastModifiedDate":"2024-03-05"},{"lineNumber":436,"author":{"gitId":"ThatGirlJam"},"content":" Use case ends.","lastModifiedDate":"2024-03-05"},{"lineNumber":437,"author":{"gitId":"ThatGirlJam"},"content":"","lastModifiedDate":"2024-03-05"},{"lineNumber":438,"author":{"gitId":"ThatGirlJam"},"content":"**Extensions**","lastModifiedDate":"2024-03-05"},{"lineNumber":439,"author":{"gitId":"ThatGirlJam"},"content":"","lastModifiedDate":"2024-03-05"},{"lineNumber":440,"author":{"gitId":"ThatGirlJam"},"content":"* 2a. The list is empty.","lastModifiedDate":"2024-03-05"},{"lineNumber":441,"author":{"gitId":"ThatGirlJam"},"content":"","lastModifiedDate":"2024-03-05"},{"lineNumber":442,"author":{"gitId":"ThatGirlJam"},"content":" Use case ends.","lastModifiedDate":"2024-03-05"},{"lineNumber":443,"author":{"gitId":"ThatGirlJam"},"content":"","lastModifiedDate":"2024-03-05"},{"lineNumber":444,"author":{"gitId":"ThatGirlJam"},"content":"* 5a. The given appointment details are invalid.","lastModifiedDate":"2024-03-05"},{"lineNumber":445,"author":{"gitId":"ThatGirlJam"},"content":"","lastModifiedDate":"2024-03-05"},{"lineNumber":446,"author":{"gitId":"limrik"},"content":" * 5a1. CLInic shows an error message.","lastModifiedDate":"2024-03-08"},{"lineNumber":447,"author":{"gitId":"ThatGirlJam"},"content":"","lastModifiedDate":"2024-03-05"},{"lineNumber":448,"author":{"gitId":"ThatGirlJam"},"content":" Use case resumes at step 4.","lastModifiedDate":"2024-03-05"},{"lineNumber":449,"author":{"gitId":"ThatGirlJam"},"content":"","lastModifiedDate":"2024-03-05"},{"lineNumber":450,"author":{"gitId":"ThatGirlJam"},"content":"* 6a. There is no appointment scheduled for that slot.","lastModifiedDate":"2024-03-05"},{"lineNumber":451,"author":{"gitId":"ThatGirlJam"},"content":"","lastModifiedDate":"2024-03-05"},{"lineNumber":452,"author":{"gitId":"ThatGirlJam"},"content":" Use case ends.","lastModifiedDate":"2024-03-05"},{"lineNumber":453,"author":{"gitId":"ThatGirlJam"},"content":"","lastModifiedDate":"2024-03-05"},{"lineNumber":454,"author":{"gitId":"ThatGirlJam"},"content":"**Use case (UC5) : View all upcoming appointments displayed in a concise and accessible format**","lastModifiedDate":"2024-03-05"},{"lineNumber":455,"author":{"gitId":"ThatGirlJam"},"content":"","lastModifiedDate":"2024-03-05"},{"lineNumber":456,"author":{"gitId":"ThatGirlJam"},"content":"**MSS**","lastModifiedDate":"2024-03-05"},{"lineNumber":457,"author":{"gitId":"ThatGirlJam"},"content":"","lastModifiedDate":"2024-03-05"},{"lineNumber":458,"author":{"gitId":"ThatGirlJam"},"content":"1. User requests to view all upcoming appointments","lastModifiedDate":"2024-03-05"},{"lineNumber":459,"author":{"gitId":"limrik"},"content":"2. CLInic shows a list of upcoming appointments","lastModifiedDate":"2024-03-08"},{"lineNumber":460,"author":{"gitId":"ThatGirlJam"},"content":"","lastModifiedDate":"2024-03-05"},{"lineNumber":461,"author":{"gitId":"ThatGirlJam"},"content":" Use case ends.","lastModifiedDate":"2024-03-05"},{"lineNumber":462,"author":{"gitId":"ThatGirlJam"},"content":"","lastModifiedDate":"2024-03-05"},{"lineNumber":463,"author":{"gitId":"ThatGirlJam"},"content":"**Extensions**","lastModifiedDate":"2024-03-05"},{"lineNumber":464,"author":{"gitId":"ThatGirlJam"},"content":"","lastModifiedDate":"2024-03-05"},{"lineNumber":465,"author":{"gitId":"ThatGirlJam"},"content":"* 2a. The list is empty.","lastModifiedDate":"2024-03-05"},{"lineNumber":466,"author":{"gitId":"ThatGirlJam"},"content":"","lastModifiedDate":"2024-03-05"},{"lineNumber":467,"author":{"gitId":"ThatGirlJam"},"content":" Use case ends.","lastModifiedDate":"2024-03-05"},{"lineNumber":468,"author":{"gitId":"ThatGirlJam"},"content":"","lastModifiedDate":"2024-03-05"},{"lineNumber":469,"author":{"gitId":"ThatGirlJam"},"content":"**Use case (UC6) : Mark patient appointment as seen for that day**","lastModifiedDate":"2024-03-05"},{"lineNumber":470,"author":{"gitId":"ThatGirlJam"},"content":"","lastModifiedDate":"2024-03-05"},{"lineNumber":471,"author":{"gitId":"ThatGirlJam"},"content":"**MSS**","lastModifiedDate":"2024-03-05"},{"lineNumber":472,"author":{"gitId":"ThatGirlJam"},"content":"","lastModifiedDate":"2024-03-05"},{"lineNumber":473,"author":{"gitId":"ThatGirlJam"},"content":"1. User requests to \u003cins\u003e view all upcoming appointments (UC5) \u003c/ins\u003e","lastModifiedDate":"2024-03-05"},{"lineNumber":474,"author":{"gitId":"limrik"},"content":"2. CLInic shows a list of upcoming appointments","lastModifiedDate":"2024-03-08"},{"lineNumber":475,"author":{"gitId":"ThatGirlJam"},"content":"3. User requests to mark a specific appointment in the list","lastModifiedDate":"2024-03-05"},{"lineNumber":476,"author":{"gitId":"limrik"},"content":"4. CLInic marks the appointment","lastModifiedDate":"2024-03-08"},{"lineNumber":477,"author":{"gitId":"ThatGirlJam"},"content":"","lastModifiedDate":"2024-03-05"},{"lineNumber":478,"author":{"gitId":"ThatGirlJam"},"content":" Use case ends.","lastModifiedDate":"2024-03-05"},{"lineNumber":479,"author":{"gitId":"ThatGirlJam"},"content":"","lastModifiedDate":"2024-03-05"},{"lineNumber":480,"author":{"gitId":"ThatGirlJam"},"content":"**Extensions**","lastModifiedDate":"2024-03-05"},{"lineNumber":481,"author":{"gitId":"ThatGirlJam"},"content":"","lastModifiedDate":"2024-03-05"},{"lineNumber":482,"author":{"gitId":"ThatGirlJam"},"content":"* 2a. The list is empty.","lastModifiedDate":"2024-03-05"},{"lineNumber":483,"author":{"gitId":"ThatGirlJam"},"content":"","lastModifiedDate":"2024-03-05"},{"lineNumber":484,"author":{"gitId":"ThatGirlJam"},"content":" Use case ends.","lastModifiedDate":"2024-03-05"},{"lineNumber":485,"author":{"gitId":"ThatGirlJam"},"content":"","lastModifiedDate":"2024-03-05"},{"lineNumber":486,"author":{"gitId":"ThatGirlJam"},"content":"* 3a. The given index is invalid.","lastModifiedDate":"2024-03-05"},{"lineNumber":487,"author":{"gitId":"ThatGirlJam"},"content":"","lastModifiedDate":"2024-03-05"},{"lineNumber":488,"author":{"gitId":"limrik"},"content":" * 3a1. CLInic shows an error message.","lastModifiedDate":"2024-03-08"},{"lineNumber":489,"author":{"gitId":"ThatGirlJam"},"content":"","lastModifiedDate":"2024-03-05"},{"lineNumber":490,"author":{"gitId":"ThatGirlJam"},"content":" Use case resumes at step 2.","lastModifiedDate":"2024-03-05"},{"lineNumber":491,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":492,"author":{"gitId":"-"},"content":"### Non-Functional Requirements","lastModifiedDate":"2020-05-23"},{"lineNumber":493,"author":{"gitId":"dayn-1"},"content":"1. Patients should not have overlapping appointments","lastModifiedDate":"2024-03-06"},{"lineNumber":494,"author":{"gitId":"dayn-1"},"content":"2. Appointments cannot be backdated or scheduled for past dates","lastModifiedDate":"2024-03-06"},{"lineNumber":495,"author":{"gitId":"dayn-1"},"content":"3. Should be compatible with any _mainstream OS_ with Java `11` or above installed.","lastModifiedDate":"2024-03-06"},{"lineNumber":496,"author":{"gitId":"dayn-1"},"content":"4. Should load patient records and appointment details within three seconds","lastModifiedDate":"2024-03-06"},{"lineNumber":497,"author":{"gitId":"dayn-1"},"content":"5. Should be able to hold up to 1000 patients without a noticeable sluggishness in performance for typical usage.","lastModifiedDate":"2024-03-06"},{"lineNumber":498,"author":{"gitId":"dayn-1"},"content":"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.","lastModifiedDate":"2024-03-06"},{"lineNumber":499,"author":{"gitId":"dayn-1"},"content":"7. The project is expected to adhere to a schedule that delivers a feature set for each milestone","lastModifiedDate":"2024-03-06"},{"lineNumber":500,"author":{"gitId":"dayn-1"},"content":"8. The product is not required to have mouse-click navigation ","lastModifiedDate":"2024-03-06"},{"lineNumber":501,"author":{"gitId":"dayn-1"},"content":"9. The product is not required to integrate with other systems ","lastModifiedDate":"2024-03-06"},{"lineNumber":502,"author":{"gitId":"dayn-1"},"content":"10. The product should avoid terminology or graphics that are insensitive to patients ","lastModifiedDate":"2024-03-06"},{"lineNumber":503,"author":{"gitId":"dayn-1"},"content":"11. The product should be for a single user (not a multi-user product)","lastModifiedDate":"2024-03-06"},{"lineNumber":504,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":505,"author":{"gitId":"-"},"content":"### Glossary","lastModifiedDate":"2020-05-23"},{"lineNumber":506,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":507,"author":{"gitId":"-"},"content":"* **Mainstream OS**: Windows, Linux, Unix, MacOS","lastModifiedDate":"2024-02-09"},{"lineNumber":508,"author":{"gitId":"-"},"content":"* **Private contact detail**: A contact detail that is not meant to be shared with others","lastModifiedDate":"2020-05-23"},{"lineNumber":509,"author":{"gitId":"dayn-1"},"content":"* **Appointment**: A designated time slot for a patient to visit the clinic","lastModifiedDate":"2024-03-06"},{"lineNumber":510,"author":{"gitId":"dayn-1"},"content":"* **Appointment Type**: Categorises the purpose of visit eg. Vaccination, Medical Check-up, etc ","lastModifiedDate":"2024-03-06"},{"lineNumber":511,"author":{"gitId":"dayn-1"},"content":"* **Insurance Type**: Categorises insurance schemes applicable to the patient eg. Medisave, ElderShield, etc.","lastModifiedDate":"2024-03-06"},{"lineNumber":512,"author":{"gitId":"dayn-1"},"content":"* **Medical Records**: Refer to details of patients\u0027 medical allergies only (as at v1.2)","lastModifiedDate":"2024-03-06"},{"lineNumber":513,"author":{"gitId":"dayn-1"},"content":"* **Recurring Appointments**: Refer to appointments that occur regularly eg. weekly or monthly","lastModifiedDate":"2024-03-06"},{"lineNumber":514,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":515,"author":{"gitId":"-"},"content":"--------------------------------------------------------------------------------------------------------------------","lastModifiedDate":"2020-05-23"},{"lineNumber":516,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":517,"author":{"gitId":"-"},"content":"## **Appendix: Instructions for manual testing**","lastModifiedDate":"2020-05-23"},{"lineNumber":518,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":519,"author":{"gitId":"-"},"content":"Given below are instructions to test the app manually.","lastModifiedDate":"2020-05-23"},{"lineNumber":520,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":521,"author":{"gitId":"-"},"content":"\u003cbox type\u003d\"info\" seamless\u003e","lastModifiedDate":"2023-09-12"},{"lineNumber":522,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2023-09-12"},{"lineNumber":523,"author":{"gitId":"-"},"content":"**Note:** These instructions only provide a starting point for testers to work on;","lastModifiedDate":"2023-09-12"},{"lineNumber":524,"author":{"gitId":"-"},"content":"testers are expected to do more *exploratory* testing.","lastModifiedDate":"2020-05-23"},{"lineNumber":525,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":526,"author":{"gitId":"-"},"content":"\u003c/box\u003e","lastModifiedDate":"2023-09-12"},{"lineNumber":527,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":528,"author":{"gitId":"-"},"content":"### Launch and shutdown","lastModifiedDate":"2020-05-23"},{"lineNumber":529,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":530,"author":{"gitId":"-"},"content":"1. Initial launch","lastModifiedDate":"2020-05-23"},{"lineNumber":531,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":532,"author":{"gitId":"-"},"content":" 1. Download the jar file and copy into an empty folder","lastModifiedDate":"2020-05-23"},{"lineNumber":533,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":534,"author":{"gitId":"-"},"content":" 1. Double-click the jar file Expected: Shows the GUI with a set of sample contacts. The window size may not be optimum.","lastModifiedDate":"2020-05-23"},{"lineNumber":535,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":536,"author":{"gitId":"-"},"content":"1. Saving window preferences","lastModifiedDate":"2020-05-23"},{"lineNumber":537,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":538,"author":{"gitId":"-"},"content":" 1. Resize the window to an optimum size. Move the window to a different location. Close the window.","lastModifiedDate":"2020-05-23"},{"lineNumber":539,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":540,"author":{"gitId":"-"},"content":" 1. Re-launch the app by double-clicking the jar file.\u003cbr\u003e","lastModifiedDate":"2020-05-23"},{"lineNumber":541,"author":{"gitId":"-"},"content":" Expected: The most recent window size and location is retained.","lastModifiedDate":"2020-05-23"},{"lineNumber":542,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":543,"author":{"gitId":"-"},"content":"1. _{ more test cases …​ }_","lastModifiedDate":"2020-05-23"},{"lineNumber":544,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":545,"author":{"gitId":"-"},"content":"### Deleting a person","lastModifiedDate":"2020-05-23"},{"lineNumber":546,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":547,"author":{"gitId":"-"},"content":"1. Deleting a person while all persons are being shown","lastModifiedDate":"2020-05-23"},{"lineNumber":548,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":549,"author":{"gitId":"-"},"content":" 1. Prerequisites: List all persons using the `list` command. Multiple persons in the list.","lastModifiedDate":"2020-05-23"},{"lineNumber":550,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":551,"author":{"gitId":"-"},"content":" 1. Test case: `delete 1`\u003cbr\u003e","lastModifiedDate":"2020-05-23"},{"lineNumber":552,"author":{"gitId":"-"},"content":" 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.","lastModifiedDate":"2020-05-23"},{"lineNumber":553,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":554,"author":{"gitId":"-"},"content":" 1. Test case: `delete 0`\u003cbr\u003e","lastModifiedDate":"2020-05-23"},{"lineNumber":555,"author":{"gitId":"-"},"content":" Expected: No person is deleted. Error details shown in the status message. Status bar remains the same.","lastModifiedDate":"2020-05-23"},{"lineNumber":556,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":557,"author":{"gitId":"-"},"content":" 1. Other incorrect delete commands to try: `delete`, `delete x`, `...` (where x is larger than the list size)\u003cbr\u003e","lastModifiedDate":"2020-05-23"},{"lineNumber":558,"author":{"gitId":"-"},"content":" Expected: Similar to previous.","lastModifiedDate":"2020-05-23"},{"lineNumber":559,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":560,"author":{"gitId":"-"},"content":"1. _{ more test cases …​ }_","lastModifiedDate":"2020-05-23"},{"lineNumber":561,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":562,"author":{"gitId":"-"},"content":"### Saving data","lastModifiedDate":"2020-05-23"},{"lineNumber":563,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":564,"author":{"gitId":"-"},"content":"1. Dealing with missing/corrupted data files","lastModifiedDate":"2020-05-23"},{"lineNumber":565,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":566,"author":{"gitId":"-"},"content":" 1. _{explain how to simulate a missing/corrupted file, and the expected behavior}_","lastModifiedDate":"2020-05-23"},{"lineNumber":567,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":568,"author":{"gitId":"-"},"content":"1. _{ more test cases …​ }_","lastModifiedDate":"2020-05-23"}],"authorContributionMap":{"limrik":58,"dayn-1":16,"ThatGirlJam":118,"-":376}},{"path":"docs/_markbind/layouts/default.md","fileType":"docs","lines":[{"lineNumber":1,"author":{"gitId":"-"},"content":"\u003chead-bottom\u003e","lastModifiedDate":"2023-09-12"},{"lineNumber":2,"author":{"gitId":"-"},"content":" \u003clink rel\u003d\"stylesheet\" href\u003d\"{{baseUrl}}/stylesheets/main.css\"\u003e","lastModifiedDate":"2023-09-12"},{"lineNumber":3,"author":{"gitId":"-"},"content":"\u003c/head-bottom\u003e","lastModifiedDate":"2023-09-12"},{"lineNumber":4,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2023-09-12"},{"lineNumber":5,"author":{"gitId":"-"},"content":"\u003cheader sticky\u003e","lastModifiedDate":"2023-09-12"},{"lineNumber":6,"author":{"gitId":"-"},"content":" \u003cnavbar type\u003d\"dark\"\u003e","lastModifiedDate":"2023-09-12"},{"lineNumber":7,"author":{"gitId":"-"},"content":" \u003ca slot\u003d\"brand\" href\u003d\"{{baseUrl}}/index.html\" title\u003d\"Home\" class\u003d\"navbar-brand\"\u003eCLInic\u003c/a\u003e","lastModifiedDate":"2024-02-20"},{"lineNumber":8,"author":{"gitId":"-"},"content":" \u003cli\u003e\u003ca href\u003d\"{{baseUrl}}/index.html\" class\u003d\"nav-link\"\u003eHome\u003c/a\u003e\u003c/li\u003e","lastModifiedDate":"2024-02-09"},{"lineNumber":9,"author":{"gitId":"-"},"content":" \u003cli\u003e\u003ca href\u003d\"{{baseUrl}}/UserGuide.html\" class\u003d\"nav-link\"\u003eUser Guide\u003c/a\u003e\u003c/li\u003e","lastModifiedDate":"2023-09-12"},{"lineNumber":10,"author":{"gitId":"-"},"content":" \u003cli\u003e\u003ca href\u003d\"{{baseUrl}}/DeveloperGuide.html\" class\u003d\"nav-link\"\u003eDeveloper Guide\u003c/a\u003e\u003c/li\u003e","lastModifiedDate":"2023-09-12"},{"lineNumber":11,"author":{"gitId":"-"},"content":" \u003cli\u003e\u003ca href\u003d\"{{baseUrl}}/AboutUs.html\" class\u003d\"nav-link\"\u003eAbout Us\u003c/a\u003e\u003c/li\u003e","lastModifiedDate":"2023-09-12"},{"lineNumber":12,"author":{"gitId":"dayn-1"},"content":" \u003cli\u003e\u003ca href\u003d\"https://github.com/AY2324S2-CS2103T-F10-3/tp\" target\u003d\"_blank\" class\u003d\"nav-link\"\u003e\u003cmd\u003e:fab-github:\u003c/md\u003e\u003c/a\u003e","lastModifiedDate":"2024-03-06"},{"lineNumber":13,"author":{"gitId":"-"},"content":" \u003c/li\u003e","lastModifiedDate":"2023-09-12"},{"lineNumber":14,"author":{"gitId":"-"},"content":" \u003cli slot\u003d\"right\"\u003e","lastModifiedDate":"2023-09-12"},{"lineNumber":15,"author":{"gitId":"-"},"content":" \u003cform class\u003d\"navbar-form\"\u003e","lastModifiedDate":"2023-09-12"},{"lineNumber":16,"author":{"gitId":"-"},"content":" \u003csearchbar :data\u003d\"searchData\" placeholder\u003d\"Search\" :on-hit\u003d\"searchCallback\" menu-align-right\u003e\u003c/searchbar\u003e","lastModifiedDate":"2023-09-12"},{"lineNumber":17,"author":{"gitId":"-"},"content":" \u003c/form\u003e","lastModifiedDate":"2023-09-12"},{"lineNumber":18,"author":{"gitId":"-"},"content":" \u003c/li\u003e","lastModifiedDate":"2023-09-12"},{"lineNumber":19,"author":{"gitId":"-"},"content":" \u003c/navbar\u003e","lastModifiedDate":"2023-09-12"},{"lineNumber":20,"author":{"gitId":"-"},"content":"\u003c/header\u003e","lastModifiedDate":"2023-09-12"},{"lineNumber":21,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2023-09-12"},{"lineNumber":22,"author":{"gitId":"-"},"content":"\u003cdiv id\u003d\"flex-body\"\u003e","lastModifiedDate":"2023-09-12"},{"lineNumber":23,"author":{"gitId":"-"},"content":" \u003cnav id\u003d\"site-nav\"\u003e","lastModifiedDate":"2023-09-12"},{"lineNumber":24,"author":{"gitId":"-"},"content":" \u003cdiv class\u003d\"site-nav-top\"\u003e","lastModifiedDate":"2023-09-12"},{"lineNumber":25,"author":{"gitId":"-"},"content":" \u003cdiv class\u003d\"fw-bold mb-2\" style\u003d\"font-size: 1.25rem;\"\u003eSite Map\u003c/div\u003e","lastModifiedDate":"2023-09-12"},{"lineNumber":26,"author":{"gitId":"-"},"content":" \u003c/div\u003e","lastModifiedDate":"2023-09-12"},{"lineNumber":27,"author":{"gitId":"-"},"content":" \u003cdiv class\u003d\"nav-component slim-scroll\"\u003e","lastModifiedDate":"2023-09-12"},{"lineNumber":28,"author":{"gitId":"-"},"content":" \u003csite-nav\u003e","lastModifiedDate":"2023-09-12"},{"lineNumber":29,"author":{"gitId":"-"},"content":"* [Home]({{ baseUrl }}/index.html)","lastModifiedDate":"2023-09-12"},{"lineNumber":30,"author":{"gitId":"-"},"content":"* [User Guide]({{ baseUrl }}/UserGuide.html) :expanded:","lastModifiedDate":"2023-09-12"},{"lineNumber":31,"author":{"gitId":"-"},"content":" * [Quick Start]({{ baseUrl }}/UserGuide.html#quick-start)","lastModifiedDate":"2023-09-12"},{"lineNumber":32,"author":{"gitId":"-"},"content":" * [Features]({{ baseUrl }}/UserGuide.html#features)","lastModifiedDate":"2023-09-12"},{"lineNumber":33,"author":{"gitId":"-"},"content":" * [FAQ]({{ baseUrl }}/UserGuide.html#faq)","lastModifiedDate":"2023-09-12"},{"lineNumber":34,"author":{"gitId":"-"},"content":" * [Command Summary]({{ baseUrl }}/UserGuide.html#faq)","lastModifiedDate":"2023-09-12"},{"lineNumber":35,"author":{"gitId":"-"},"content":"* [Developer Guide]({{ baseUrl }}/DeveloperGuide.html) :expanded:","lastModifiedDate":"2023-09-12"},{"lineNumber":36,"author":{"gitId":"-"},"content":" * [Acknowledgements]({{ baseUrl }}/DeveloperGuide.html#acknowledgements)","lastModifiedDate":"2023-09-12"},{"lineNumber":37,"author":{"gitId":"-"},"content":" * [Setting Up]({{ baseUrl }}/DeveloperGuide.html#setting-up-getting-started)","lastModifiedDate":"2023-09-12"},{"lineNumber":38,"author":{"gitId":"-"},"content":" * [Design]({{ baseUrl }}/DeveloperGuide.html#design)","lastModifiedDate":"2023-09-12"},{"lineNumber":39,"author":{"gitId":"-"},"content":" * [Implementation]({{ baseUrl }}/DeveloperGuide.html#implementation)","lastModifiedDate":"2023-09-12"},{"lineNumber":40,"author":{"gitId":"-"},"content":" * [Documentation, logging, testing, configuration, dev-ops]({{ baseUrl }}/DeveloperGuide.html#documentation-logging-testing-configuration-dev-ops)","lastModifiedDate":"2023-09-12"},{"lineNumber":41,"author":{"gitId":"-"},"content":" * [Appendix: Requirements]({{ baseUrl }}/DeveloperGuide.html#appendix-requirements)","lastModifiedDate":"2023-09-12"},{"lineNumber":42,"author":{"gitId":"-"},"content":" * [Appendix: Instructions for manual testing]({{ baseUrl }}/DeveloperGuide.html#appendix-instructions-for-manual-testing)","lastModifiedDate":"2023-09-12"},{"lineNumber":43,"author":{"gitId":"-"},"content":"* Tutorials","lastModifiedDate":"2023-09-12"},{"lineNumber":44,"author":{"gitId":"-"},"content":" * [Tracing code]({{ baseUrl }}/tutorials/TracingCode.html)","lastModifiedDate":"2023-09-12"},{"lineNumber":45,"author":{"gitId":"-"},"content":" * [Adding a command]({{ baseUrl }}/tutorials/AddRemark.html)","lastModifiedDate":"2023-09-12"},{"lineNumber":46,"author":{"gitId":"-"},"content":" * [Removing Fields]({{ baseUrl }}/tutorials/RemovingFields.html)","lastModifiedDate":"2023-09-12"},{"lineNumber":47,"author":{"gitId":"-"},"content":"* [About Us]({{ baseUrl }}/AboutUs.html)","lastModifiedDate":"2023-09-12"},{"lineNumber":48,"author":{"gitId":"-"},"content":" \u003c/site-nav\u003e","lastModifiedDate":"2023-09-12"},{"lineNumber":49,"author":{"gitId":"-"},"content":" \u003c/div\u003e","lastModifiedDate":"2023-09-12"},{"lineNumber":50,"author":{"gitId":"-"},"content":" \u003c/nav\u003e","lastModifiedDate":"2023-09-12"},{"lineNumber":51,"author":{"gitId":"-"},"content":" \u003cdiv id\u003d\"content-wrapper\"\u003e","lastModifiedDate":"2023-09-12"},{"lineNumber":52,"author":{"gitId":"-"},"content":" {{ content }}","lastModifiedDate":"2023-09-12"},{"lineNumber":53,"author":{"gitId":"-"},"content":" \u003c/div\u003e","lastModifiedDate":"2023-09-12"},{"lineNumber":54,"author":{"gitId":"-"},"content":" \u003cnav id\u003d\"page-nav\"\u003e","lastModifiedDate":"2023-09-12"},{"lineNumber":55,"author":{"gitId":"-"},"content":" \u003cdiv class\u003d\"nav-component slim-scroll\"\u003e","lastModifiedDate":"2023-09-12"},{"lineNumber":56,"author":{"gitId":"-"},"content":" \u003cpage-nav /\u003e","lastModifiedDate":"2023-09-12"},{"lineNumber":57,"author":{"gitId":"-"},"content":" \u003c/div\u003e","lastModifiedDate":"2023-09-12"},{"lineNumber":58,"author":{"gitId":"-"},"content":" \u003c/nav\u003e","lastModifiedDate":"2023-09-12"},{"lineNumber":59,"author":{"gitId":"-"},"content":" \u003cscroll-top-button\u003e\u003c/scroll-top-button\u003e","lastModifiedDate":"2023-09-12"},{"lineNumber":60,"author":{"gitId":"-"},"content":"\u003c/div\u003e","lastModifiedDate":"2023-09-12"},{"lineNumber":61,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2023-09-12"},{"lineNumber":62,"author":{"gitId":"-"},"content":"\u003cfooter\u003e","lastModifiedDate":"2023-09-12"},{"lineNumber":63,"author":{"gitId":"-"},"content":" \u003c!-- Support MarkBind by including a link to us on your landing page! --\u003e","lastModifiedDate":"2023-09-12"},{"lineNumber":64,"author":{"gitId":"-"},"content":" \u003cdiv class\u003d\"text-center\"\u003e","lastModifiedDate":"2023-09-12"},{"lineNumber":65,"author":{"gitId":"-"},"content":" \u003csmall\u003e[\u003cmd\u003e**Powered by**\u003c/md\u003e \u003cimg src\u003d\"https://markbind.org/favicon.ico\" width\u003d\"30\"\u003e {{MarkBind}}, generated on {{timestamp}}]\u003c/small\u003e","lastModifiedDate":"2023-09-12"},{"lineNumber":66,"author":{"gitId":"-"},"content":" \u003c/div\u003e","lastModifiedDate":"2023-09-12"},{"lineNumber":67,"author":{"gitId":"-"},"content":"\u003c/footer\u003e","lastModifiedDate":"2023-09-12"}],"authorContributionMap":{"dayn-1":1,"-":66}},{"path":"docs/index.md","fileType":"docs","lines":[{"lineNumber":1,"author":{"gitId":"-"},"content":"---","lastModifiedDate":"2020-05-23"},{"lineNumber":2,"author":{"gitId":"-"},"content":" layout: default.md","lastModifiedDate":"2023-09-12"},{"lineNumber":3,"author":{"gitId":"-"},"content":" title: \"\"","lastModifiedDate":"2023-09-12"},{"lineNumber":4,"author":{"gitId":"-"},"content":"---","lastModifiedDate":"2020-05-23"},{"lineNumber":5,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":6,"author":{"gitId":"dayn-1"},"content":"# CLInic","lastModifiedDate":"2024-03-08"},{"lineNumber":7,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2023-09-12"},{"lineNumber":8,"author":{"gitId":"-"},"content":"[![CI Status](https://github.com/se-edu/addressbook-level3/workflows/Java%20CI/badge.svg)](https://github.com/se-edu/addressbook-level3/actions)","lastModifiedDate":"2020-05-23"},{"lineNumber":9,"author":{"gitId":"-"},"content":"[![codecov](https://codecov.io/gh/se-edu/addressbook-level3/branch/master/graph/badge.svg)](https://codecov.io/gh/se-edu/addressbook-level3)","lastModifiedDate":"2020-08-07"},{"lineNumber":10,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":11,"author":{"gitId":"-"},"content":"![Ui](images/Ui.png)","lastModifiedDate":"2020-05-23"},{"lineNumber":12,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":13,"author":{"gitId":"dayn-1"},"content":"**CLInic is a desktop application for managing patient details and appointments in a clinic.** While it has a GUI, most of the user interactions happen using a CLI (Command Line Interface).","lastModifiedDate":"2024-03-08"},{"lineNumber":14,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":15,"author":{"gitId":"dayn-1"},"content":"* If you are interested in using CLInic, head over to the [_Quick Start_ section of the **User Guide**](UserGuide.html#quick-start).","lastModifiedDate":"2024-03-08"},{"lineNumber":16,"author":{"gitId":"dayn-1"},"content":"* If you are interested about developing CLInic, the [**Developer Guide**](DeveloperGuide.html) is a good place to start.","lastModifiedDate":"2024-03-08"},{"lineNumber":17,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":18,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":19,"author":{"gitId":"-"},"content":"**Acknowledgements**","lastModifiedDate":"2020-05-23"},{"lineNumber":20,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":21,"author":{"gitId":"-"},"content":"* Libraries used: [JavaFX](https://openjfx.io/), [Jackson](https://github.com/FasterXML/jackson), [JUnit5](https://github.com/junit-team/junit5)","lastModifiedDate":"2020-05-23"}],"authorContributionMap":{"dayn-1":4,"-":17}}] diff --git a/AY2324S2-CS2103T-F10-3_tp_master/commits.json b/AY2324S2-CS2103T-F10-3_tp_master/commits.json index acdc5a45..a3136fe0 100644 --- a/AY2324S2-CS2103T-F10-3_tp_master/commits.json +++ b/AY2324S2-CS2103T-F10-3_tp_master/commits.json @@ -1 +1 @@ -{"authorDailyContributionsMap":{"xuelinglow":[{"date":"2024-02-26","commitResults":[{"hash":"60140fddf4b87e9814941999e41a827c1e8df916","isMergeCommit":false,"messageTitle":"Tutorial: Adding a command","messageBody":"","fileTypesAndContributionMap":{"functional-code":{"insertions":197,"deletions":12},"test-code":{"insertions":111,"deletions":13}}},{"hash":"51ac38ab9e498ad935592942169f9cdfd52ca285","isMergeCommit":true,"messageTitle":"Merge pull request #1 from xuelinglow/tutorial-adding-command","messageBody":"Tutorial adding command","fileTypesAndContributionMap":{}}]},{"date":"2024-02-27","commitResults":[{"hash":"8eb8572994384f65edc39c9318d5b73024ca1957","isMergeCommit":false,"messageTitle":"Revert \"Tutorial adding command\"","messageBody":"","fileTypesAndContributionMap":{"functional-code":{"insertions":12,"deletions":197},"test-code":{"insertions":13,"deletions":111}}},{"hash":"bae7d62c9565035abd38ca730ee9d5aec3c43172","isMergeCommit":true,"messageTitle":"Merge pull request #2 from AY2324S2-CS2103T-F10-3/revert-1-tutorial-adding-command","messageBody":"Revert \"Tutorial adding command\"","fileTypesAndContributionMap":{}}]},{"date":"2024-03-06","commitResults":[{"hash":"8ee08b45cb7d234849a3a16e3b754d515e27d72d","isMergeCommit":false,"messageTitle":"Update README with mock UI","messageBody":"","fileTypesAndContributionMap":{"docs":{"insertions":10,"deletions":8}}}]}],"limrik":[{"date":"2024-03-05","commitResults":[{"hash":"a71bb54727dd8528d6d987aad89e263b11ff301f","isMergeCommit":false,"messageTitle":"Update product scope and user stories","messageBody":"","fileTypesAndContributionMap":{"docs":{"insertions":35,"deletions":10}}}]},{"date":"2024-03-06","commitResults":[{"hash":"31a49ca1ae91043347e2a9cd91cc3f1bf1779759","isMergeCommit":true,"messageTitle":"Merge pull request #14 from dayn-1/v1.1-NFR-Glossary","messageBody":"Add NFR and Glossary to Developer Guide","fileTypesAndContributionMap":{}}]}],"dayn-1":[{"date":"2024-02-26","commitResults":[{"hash":"99e9801c9226edd9b5275e90534dbb51cffe1999","isMergeCommit":false,"messageTitle":"Add config changes for MarkBind","messageBody":"","fileTypesAndContributionMap":{"docs":{"insertions":1,"deletions":1}}}]},{"date":"2024-03-06","commitResults":[{"hash":"25ef5d4e73fddf9e675fd27b08e07c0595c1bb34","isMergeCommit":true,"messageTitle":"Merge pull request #11 from limrik/master","messageBody":"Update product scope and user stories","fileTypesAndContributionMap":{}},{"hash":"7f4172f22aab9cdcbe4eb49df80771752235a821","isMergeCommit":true,"messageTitle":"Merge pull request #12 from xuelinglow/master","messageBody":"Update README with mock UI","fileTypesAndContributionMap":{}},{"hash":"0ba591baebd3473011144c36d2a708076b239eb1","isMergeCommit":false,"messageTitle":"Update NFR and Glossary for v1.1","messageBody":"","fileTypesAndContributionMap":{"docs":{"insertions":17,"deletions":9}}}]}],"ThatGirlJam":[{"date":"2024-03-05","commitResults":[{"hash":"5f5dff257e941102e6fb9782b32327d08d6ae3c6","isMergeCommit":false,"messageTitle":"Add use cases for the initial features for week 7 practice iteration","messageBody":"","fileTypesAndContributionMap":{"docs":{"insertions":140,"deletions":1}}}]},{"date":"2024-03-06","commitResults":[{"hash":"75c4563c8d5748ae74c6b6e0d0d022e1fe7e5dd1","isMergeCommit":true,"messageTitle":"Merge pull request #16 from ThatGirlJam/DeveloperGuideUseCases","messageBody":"Add Use Cases to DG v1.1","fileTypesAndContributionMap":{}}]}],"cliftonchee":[{"date":"2024-02-26","commitResults":[{"hash":"56c596beb4c4d3873db8c729eafa8c9fc27b7d75","isMergeCommit":false,"messageTitle":"Test CodeCov","messageBody":"","fileTypesAndContributionMap":{"docs":{"insertions":0,"deletions":1}}},{"hash":"6b7579fbbd898771b0c8044ef6362424dfa0135f","isMergeCommit":false,"messageTitle":"Update README.md","messageBody":"Rename codecov org name","fileTypesAndContributionMap":{"docs":{"insertions":1,"deletions":1}}}]},{"date":"2024-03-04","commitResults":[{"hash":"369d5d67b2f8e08d2beb321748842eec486abf42","isMergeCommit":false,"messageTitle":"Update About Us Page","messageBody":"","fileTypesAndContributionMap":{"docs":{"insertions":20,"deletions":25}}},{"hash":"db4e1f75dd480d6123e6e2644292bd83a65fac03","isMergeCommit":true,"messageTitle":"Merge branch \u0027AY2324S2-CS2103T-F10-3:master\u0027 into about-us","messageBody":"","fileTypesAndContributionMap":{}},{"hash":"3f147112f372ccf321c5f5923c973b4fe18dcf46","isMergeCommit":true,"messageTitle":"Merge pull request #5 from cliftonchee/about-us","messageBody":"Update About Us Page","fileTypesAndContributionMap":{}}]}]},"authorFileTypeContributionMap":{"xuelinglow":{"docs":10,"functional-code":0,"test-code":0},"limrik":{"docs":34,"functional-code":0,"test-code":0},"dayn-1":{"docs":17,"functional-code":0,"test-code":0},"ThatGirlJam":{"docs":137,"functional-code":0,"test-code":0},"cliftonchee":{"docs":20,"functional-code":0,"test-code":0}},"authorContributionVariance":{"xuelinglow":14316.387,"limrik":143.78697,"dayn-1":47.668636,"ThatGirlJam":1411.6685,"cliftonchee":142.82841},"authorDisplayNameMap":{"xuelinglow":"CS2103T-F10-3 LOW ..LING","limrik":"CS2103T-F10-3 LIM .. RIK","dayn-1":"CS2103T-F10-3 ANG ..DAYN","ThatGirlJam":"CS2103T-F10-3 JAIM.. MIN","cliftonchee":"CS2103T-F10-3 CHEE..FTON"}} +{"authorDailyContributionsMap":{"xuelinglow":[{"date":"2024-02-26","commitResults":[{"hash":"60140fddf4b87e9814941999e41a827c1e8df916","isMergeCommit":false,"messageTitle":"Tutorial: Adding a command","messageBody":"","fileTypesAndContributionMap":{"functional-code":{"insertions":197,"deletions":12},"test-code":{"insertions":111,"deletions":13}}},{"hash":"51ac38ab9e498ad935592942169f9cdfd52ca285","isMergeCommit":true,"messageTitle":"Merge pull request #1 from xuelinglow/tutorial-adding-command","messageBody":"Tutorial adding command","fileTypesAndContributionMap":{}}]},{"date":"2024-02-27","commitResults":[{"hash":"8eb8572994384f65edc39c9318d5b73024ca1957","isMergeCommit":false,"messageTitle":"Revert \"Tutorial adding command\"","messageBody":"","fileTypesAndContributionMap":{"functional-code":{"insertions":12,"deletions":197},"test-code":{"insertions":13,"deletions":111}}},{"hash":"bae7d62c9565035abd38ca730ee9d5aec3c43172","isMergeCommit":true,"messageTitle":"Merge pull request #2 from AY2324S2-CS2103T-F10-3/revert-1-tutorial-adding-command","messageBody":"Revert \"Tutorial adding command\"","fileTypesAndContributionMap":{}}]},{"date":"2024-03-06","commitResults":[{"hash":"8ee08b45cb7d234849a3a16e3b754d515e27d72d","isMergeCommit":false,"messageTitle":"Update README with mock UI","messageBody":"","fileTypesAndContributionMap":{"docs":{"insertions":10,"deletions":8}}}]}],"limrik":[{"date":"2024-03-05","commitResults":[{"hash":"a71bb54727dd8528d6d987aad89e263b11ff301f","isMergeCommit":false,"messageTitle":"Update product scope and user stories","messageBody":"","fileTypesAndContributionMap":{"docs":{"insertions":35,"deletions":10}}}]},{"date":"2024-03-06","commitResults":[{"hash":"31a49ca1ae91043347e2a9cd91cc3f1bf1779759","isMergeCommit":true,"messageTitle":"Merge pull request #14 from dayn-1/v1.1-NFR-Glossary","messageBody":"Add NFR and Glossary to Developer Guide","fileTypesAndContributionMap":{}}]},{"date":"2024-03-08","commitResults":[{"hash":"716b3a10083868d5b4717a755fd85be5cc4fd367","isMergeCommit":false,"messageTitle":"Change name for developer guide","messageBody":"","fileTypesAndContributionMap":{"docs":{"insertions":24,"deletions":24}}},{"hash":"dee7f533d0af5c5f31b00f9a6025da96931844a7","isMergeCommit":true,"messageTitle":"Merge pull request #20 from dayn-1/v1.1-Indexmd","messageBody":"Update main page details","fileTypesAndContributionMap":{}}]}],"dayn-1":[{"date":"2024-02-26","commitResults":[{"hash":"99e9801c9226edd9b5275e90534dbb51cffe1999","isMergeCommit":false,"messageTitle":"Add config changes for MarkBind","messageBody":"","fileTypesAndContributionMap":{"docs":{"insertions":1,"deletions":1}}}]},{"date":"2024-03-06","commitResults":[{"hash":"25ef5d4e73fddf9e675fd27b08e07c0595c1bb34","isMergeCommit":true,"messageTitle":"Merge pull request #11 from limrik/master","messageBody":"Update product scope and user stories","fileTypesAndContributionMap":{}},{"hash":"7f4172f22aab9cdcbe4eb49df80771752235a821","isMergeCommit":true,"messageTitle":"Merge pull request #12 from xuelinglow/master","messageBody":"Update README with mock UI","fileTypesAndContributionMap":{}},{"hash":"0ba591baebd3473011144c36d2a708076b239eb1","isMergeCommit":false,"messageTitle":"Update NFR and Glossary for v1.1","messageBody":"","fileTypesAndContributionMap":{"docs":{"insertions":17,"deletions":9}}}]},{"date":"2024-03-08","commitResults":[{"hash":"eacfe3fcceb7ae0c185409fe34c1bce83d99999a","isMergeCommit":false,"messageTitle":"Update main page details","messageBody":"","fileTypesAndContributionMap":{"docs":{"insertions":9,"deletions":9}}},{"hash":"08685c92341a01dcc4e164a70a23f77fcdec0195","isMergeCommit":true,"messageTitle":"Merge pull request #21 from limrik/developer-guide","messageBody":"Change name for developer guide","fileTypesAndContributionMap":{}}]}],"ThatGirlJam":[{"date":"2024-03-05","commitResults":[{"hash":"5f5dff257e941102e6fb9782b32327d08d6ae3c6","isMergeCommit":false,"messageTitle":"Add use cases for the initial features for week 7 practice iteration","messageBody":"","fileTypesAndContributionMap":{"docs":{"insertions":140,"deletions":1}}}]},{"date":"2024-03-06","commitResults":[{"hash":"75c4563c8d5748ae74c6b6e0d0d022e1fe7e5dd1","isMergeCommit":true,"messageTitle":"Merge pull request #16 from ThatGirlJam/DeveloperGuideUseCases","messageBody":"Add Use Cases to DG v1.1","fileTypesAndContributionMap":{}}]}],"cliftonchee":[{"date":"2024-02-26","commitResults":[{"hash":"56c596beb4c4d3873db8c729eafa8c9fc27b7d75","isMergeCommit":false,"messageTitle":"Test CodeCov","messageBody":"","fileTypesAndContributionMap":{"docs":{"insertions":0,"deletions":1}}},{"hash":"6b7579fbbd898771b0c8044ef6362424dfa0135f","isMergeCommit":false,"messageTitle":"Update README.md","messageBody":"Rename codecov org name","fileTypesAndContributionMap":{"docs":{"insertions":1,"deletions":1}}}]},{"date":"2024-03-04","commitResults":[{"hash":"369d5d67b2f8e08d2beb321748842eec486abf42","isMergeCommit":false,"messageTitle":"Update About Us Page","messageBody":"","fileTypesAndContributionMap":{"docs":{"insertions":20,"deletions":25}}},{"hash":"db4e1f75dd480d6123e6e2644292bd83a65fac03","isMergeCommit":true,"messageTitle":"Merge branch \u0027AY2324S2-CS2103T-F10-3:master\u0027 into about-us","messageBody":"","fileTypesAndContributionMap":{}},{"hash":"3f147112f372ccf321c5f5923c973b4fe18dcf46","isMergeCommit":true,"messageTitle":"Merge pull request #5 from cliftonchee/about-us","messageBody":"Update About Us Page","fileTypesAndContributionMap":{}}]}]},"authorFileTypeContributionMap":{"xuelinglow":{"docs":10,"functional-code":0,"test-code":0},"limrik":{"docs":58,"functional-code":0,"test-code":0},"dayn-1":{"docs":25,"functional-code":0,"test-code":0},"ThatGirlJam":{"docs":118,"functional-code":0,"test-code":0},"cliftonchee":{"docs":16,"functional-code":0,"test-code":0}},"authorContributionVariance":{"xuelinglow":12727.439,"limrik":250.15997,"dayn-1":57.52889,"ThatGirlJam":1237.0399,"cliftonchee":125.35999},"authorDisplayNameMap":{"xuelinglow":"CS2103T-F10-3 LOW ..LING","limrik":"CS2103T-F10-3 LIM .. RIK","dayn-1":"CS2103T-F10-3 ANG ..DAYN","ThatGirlJam":"CS2103T-F10-3 JAIM.. MIN","cliftonchee":"CS2103T-F10-3 CHEE..FTON"}} diff --git a/AY2324S2-CS2103T-T09-1_tp_master/authorship.json b/AY2324S2-CS2103T-T09-1_tp_master/authorship.json index f95e079d..bdae5c4a 100644 --- a/AY2324S2-CS2103T-T09-1_tp_master/authorship.json +++ b/AY2324S2-CS2103T-T09-1_tp_master/authorship.json @@ -1 +1 @@ -[{"path":"README.md","fileType":"docs","lines":[{"lineNumber":1,"author":{"gitId":"Wongqingyee"},"content":"[![CI Status](https://github.com/AY2324S2-CS2103T-T09-1/tp/workflows/Java%20CI/badge.svg)](https://github.com/AY2324S2-CS2103T-T09-1/tp/actions)","lastModifiedDate":"2024-02-29"},{"lineNumber":2,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":3,"author":{"gitId":"-"},"content":"[![codecov](https://codecov.io/gh/AY2324S2-CS2103T-T09-1/tp/graph/badge.svg?token\u003d7WFJBKE6LA)](https://codecov.io/gh/AY2324S2-CS2103T-T09-1/tp)","lastModifiedDate":"2024-02-19"},{"lineNumber":4,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2024-02-19"},{"lineNumber":5,"author":{"gitId":"-"},"content":"![Ui](docs/images/Ui.png)","lastModifiedDate":"2020-05-23"},{"lineNumber":6,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":7,"author":{"gitId":"willowisp01"},"content":"* This is **an app for CS instructors that helps manage weaker students**.\u003cbr\u003e","lastModifiedDate":"2024-02-29"},{"lineNumber":8,"author":{"gitId":"willowisp01"},"content":"* The project is based on an ongoing software project for a desktop application (called _AddressBook_) used for managing contact details. We have made several enhancements to it (see example usages).","lastModifiedDate":"2024-02-29"},{"lineNumber":9,"author":{"gitId":"willowisp01"},"content":"","lastModifiedDate":"2024-02-29"},{"lineNumber":10,"author":{"gitId":"willowisp01"},"content":"* Example usages:","lastModifiedDate":"2024-02-29"},{"lineNumber":11,"author":{"gitId":"willowisp01"},"content":" * forming focus groups of weaker students","lastModifiedDate":"2024-02-29"},{"lineNumber":12,"author":{"gitId":"willowisp01"},"content":" * visualising the performance of weaker students over time","lastModifiedDate":"2024-02-29"},{"lineNumber":13,"author":{"gitId":"willowisp01"},"content":" * dedicating tutors and other resources to helping weaker students","lastModifiedDate":"2024-02-29"},{"lineNumber":14,"author":{"gitId":"willowisp01"},"content":"","lastModifiedDate":"2024-02-29"},{"lineNumber":15,"author":{"gitId":"willowisp01"},"content":"* It is **written in OOP fashion**. It provides a **well-written** code base of around 10k LOC.","lastModifiedDate":"2024-02-29"},{"lineNumber":16,"author":{"gitId":"-"},"content":"* It comes with a **reasonable level of user and developer documentation**.","lastModifiedDate":"2020-05-23"},{"lineNumber":17,"author":{"gitId":"willowisp01"},"content":"* It is named **“TeachStack”** as a pun on heap and stack.","lastModifiedDate":"2024-02-29"},{"lineNumber":18,"author":{"gitId":"willowisp01"},"content":"","lastModifiedDate":"2024-02-29"},{"lineNumber":19,"author":{"gitId":"JiaXinEu"},"content":"* For the detailed documentation of this project, see the **[TeachStack Product Website](https://ay2324s2-cs2103t-t09-1.github.io/tp/)**.","lastModifiedDate":"2024-02-29"},{"lineNumber":20,"author":{"gitId":"JiaXinEu"},"content":"* This project is based on the AddressBook-Level3 project created by the [SE-EDU initiative](https://se-education.org).","lastModifiedDate":"2024-02-29"}],"authorContributionMap":{"willowisp01":11,"Wongqingyee":1,"JiaXinEu":2,"-":6}},{"path":"docs/AboutUs.md","fileType":"docs","lines":[{"lineNumber":1,"author":{"gitId":"-"},"content":"---","lastModifiedDate":"2020-05-23"},{"lineNumber":2,"author":{"gitId":"-"},"content":"layout: page","lastModifiedDate":"2020-05-23"},{"lineNumber":3,"author":{"gitId":"-"},"content":"title: About Us","lastModifiedDate":"2020-05-23"},{"lineNumber":4,"author":{"gitId":"-"},"content":"---","lastModifiedDate":"2020-05-23"},{"lineNumber":5,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":6,"author":{"gitId":"-"},"content":"We are a team based in the [School of Computing, National University of Singapore](http://www.comp.nus.edu.sg).","lastModifiedDate":"2020-05-23"},{"lineNumber":7,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":8,"author":{"gitId":"-"},"content":"You can reach us at the email `seer[at]comp.nus.edu.sg`","lastModifiedDate":"2020-06-17"},{"lineNumber":9,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-06-17"},{"lineNumber":10,"author":{"gitId":"-"},"content":"## Project team","lastModifiedDate":"2020-06-07"},{"lineNumber":11,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":12,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2024-02-29"},{"lineNumber":13,"author":{"gitId":"JiaXinEu"},"content":"### Eu Jia Xin","lastModifiedDate":"2024-02-29"},{"lineNumber":14,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":15,"author":{"gitId":"JiaXinEu"},"content":"\u003cimg src\u003d\"images/jiaxineu.png\" width\u003d\"200px\"\u003e","lastModifiedDate":"2024-02-29"},{"lineNumber":16,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":17,"author":{"gitId":"JiaXinEu"},"content":"[[github](https://github.com/JiaXinEu)]","lastModifiedDate":"2024-02-29"},{"lineNumber":18,"author":{"gitId":"JiaXinEu"},"content":"[[portfolio](team/jiaxineu.md)]","lastModifiedDate":"2024-02-29"},{"lineNumber":19,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":20,"author":{"gitId":"-"},"content":"* Role: Project Advisor","lastModifiedDate":"2020-05-23"},{"lineNumber":21,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":22,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":23,"author":{"gitId":"yashma-sonara"},"content":"### Yashma Sonara","lastModifiedDate":"2024-02-29"},{"lineNumber":24,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":25,"author":{"gitId":"yashma-sonara"},"content":"\u003cimg src\u003d\"images/yashma-sonara.png\" width\u003d\"200px\"\u003e","lastModifiedDate":"2024-02-29"},{"lineNumber":26,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":27,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":28,"author":{"gitId":"yashma-sonara"},"content":"[[github](https://github.com/yashma-sonara)]","lastModifiedDate":"2024-02-29"},{"lineNumber":29,"author":{"gitId":"-"},"content":"[[portfolio](team/johndoe.md)]","lastModifiedDate":"2020-05-23"},{"lineNumber":30,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":31,"author":{"gitId":"-"},"content":"* Role: Team Lead","lastModifiedDate":"2020-05-23"},{"lineNumber":32,"author":{"gitId":"-"},"content":"* Responsibilities: UI","lastModifiedDate":"2020-05-23"},{"lineNumber":33,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":34,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":35,"author":{"gitId":"ronnnnnnnnn"},"content":"### Ronn Ng","lastModifiedDate":"2024-02-29"},{"lineNumber":36,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":37,"author":{"gitId":"ronnnnnnnnn"},"content":"\u003cimg src\u003d\"images/ronnnnnnnnn.png\" width\u003d\"200px\"\u003e","lastModifiedDate":"2024-02-29"},{"lineNumber":38,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":39,"author":{"gitId":"ronnnnnnnnn"},"content":"[[github](http://github.com/ronnnnnnnnn)] [[portfolio](team/johndoe.md)]","lastModifiedDate":"2024-02-29"},{"lineNumber":40,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":41,"author":{"gitId":"-"},"content":"* Role: Developer","lastModifiedDate":"2020-05-23"},{"lineNumber":42,"author":{"gitId":"-"},"content":"* Responsibilities: Data","lastModifiedDate":"2020-05-23"},{"lineNumber":43,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":44,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":45,"author":{"gitId":"Wongqingyee"},"content":"### Wong Qing Yee","lastModifiedDate":"2024-02-29"},{"lineNumber":46,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":47,"author":{"gitId":"Wongqingyee"},"content":"\u003cimg src\u003d\"images/wongqingyee.png\" width\u003d\"200px\"\u003e","lastModifiedDate":"2024-02-29"},{"lineNumber":48,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":49,"author":{"gitId":"Wongqingyee"},"content":"[[github](http://github.com/Wongqingyee)]","lastModifiedDate":"2024-02-29"},{"lineNumber":50,"author":{"gitId":"-"},"content":"[[portfolio](team/johndoe.md)]","lastModifiedDate":"2020-05-23"},{"lineNumber":51,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":52,"author":{"gitId":"-"},"content":"* Role: Developer","lastModifiedDate":"2020-05-23"},{"lineNumber":53,"author":{"gitId":"-"},"content":"* Responsibilities: Dev Ops + Threading","lastModifiedDate":"2020-05-23"},{"lineNumber":54,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":55,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":56,"author":{"gitId":"willowisp01"},"content":"### Zhuo En","lastModifiedDate":"2024-02-29"},{"lineNumber":57,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":58,"author":{"gitId":"willowisp01"},"content":"\u003cimg src\u003d\"images/willowisp01.png\" width\u003d\"200px\"\u003e","lastModifiedDate":"2024-02-29"},{"lineNumber":59,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":60,"author":{"gitId":"willowisp01"},"content":"[[github](https://github.com/willowisp01)]","lastModifiedDate":"2024-02-29"},{"lineNumber":61,"author":{"gitId":"-"},"content":"[[portfolio](team/johndoe.md)]","lastModifiedDate":"2020-05-23"},{"lineNumber":62,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":63,"author":{"gitId":"-"},"content":"* Role: Developer","lastModifiedDate":"2020-05-23"},{"lineNumber":64,"author":{"gitId":"-"},"content":"* Responsibilities: UI","lastModifiedDate":"2020-05-23"}],"authorContributionMap":{"yashma-sonara":3,"willowisp01":3,"Wongqingyee":3,"JiaXinEu":4,"-":48,"ronnnnnnnnn":3}},{"path":"docs/DeveloperGuide.md","fileType":"docs","lines":[{"lineNumber":1,"author":{"gitId":"-"},"content":"---","lastModifiedDate":"2020-05-23"},{"lineNumber":2,"author":{"gitId":"-"},"content":"layout: page","lastModifiedDate":"2020-05-23"},{"lineNumber":3,"author":{"gitId":"-"},"content":"title: Developer Guide","lastModifiedDate":"2020-05-23"},{"lineNumber":4,"author":{"gitId":"-"},"content":"---","lastModifiedDate":"2020-05-23"},{"lineNumber":5,"author":{"gitId":"-"},"content":"* Table of Contents","lastModifiedDate":"2020-05-23"},{"lineNumber":6,"author":{"gitId":"-"},"content":"{:toc}","lastModifiedDate":"2020-05-23"},{"lineNumber":7,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":8,"author":{"gitId":"-"},"content":"--------------------------------------------------------------------------------------------------------------------","lastModifiedDate":"2020-05-23"},{"lineNumber":9,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2021-07-30"},{"lineNumber":10,"author":{"gitId":"-"},"content":"## **Acknowledgements**","lastModifiedDate":"2021-07-30"},{"lineNumber":11,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2021-07-30"},{"lineNumber":12,"author":{"gitId":"-"},"content":"* {list here sources of all reused/adapted ideas, code, documentation, and third-party libraries -- include links to the original source as well}","lastModifiedDate":"2021-07-30"},{"lineNumber":13,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2021-07-30"},{"lineNumber":14,"author":{"gitId":"-"},"content":"--------------------------------------------------------------------------------------------------------------------","lastModifiedDate":"2021-07-30"},{"lineNumber":15,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":16,"author":{"gitId":"-"},"content":"## **Setting up, getting started**","lastModifiedDate":"2020-05-23"},{"lineNumber":17,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":18,"author":{"gitId":"-"},"content":"Refer to the guide [_Setting up and getting started_](SettingUp.md).","lastModifiedDate":"2020-05-23"},{"lineNumber":19,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":20,"author":{"gitId":"-"},"content":"--------------------------------------------------------------------------------------------------------------------","lastModifiedDate":"2020-05-23"},{"lineNumber":21,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":22,"author":{"gitId":"-"},"content":"## **Design**","lastModifiedDate":"2020-05-23"},{"lineNumber":23,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":24,"author":{"gitId":"-"},"content":"\u003cdiv markdown\u003d\"span\" class\u003d\"alert alert-primary\"\u003e","lastModifiedDate":"2021-07-31"},{"lineNumber":25,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":26,"author":{"gitId":"-"},"content":":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.","lastModifiedDate":"2023-09-03"},{"lineNumber":27,"author":{"gitId":"-"},"content":"\u003c/div\u003e","lastModifiedDate":"2021-07-31"},{"lineNumber":28,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":29,"author":{"gitId":"-"},"content":"### Architecture","lastModifiedDate":"2021-07-31"},{"lineNumber":30,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":31,"author":{"gitId":"-"},"content":"\u003cimg src\u003d\"images/ArchitectureDiagram.png\" width\u003d\"280\" /\u003e","lastModifiedDate":"2021-07-31"},{"lineNumber":32,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":33,"author":{"gitId":"-"},"content":"The ***Architecture Diagram*** given above explains the high-level design of the App.","lastModifiedDate":"2021-07-31"},{"lineNumber":34,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":35,"author":{"gitId":"-"},"content":"Given below is a quick overview of main components and how they interact with each other.","lastModifiedDate":"2021-07-31"},{"lineNumber":36,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2021-07-31"},{"lineNumber":37,"author":{"gitId":"-"},"content":"**Main components of the architecture**","lastModifiedDate":"2021-07-31"},{"lineNumber":38,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":39,"author":{"gitId":"-"},"content":"**`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.","lastModifiedDate":"2023-09-03"},{"lineNumber":40,"author":{"gitId":"-"},"content":"* At app launch, it initializes the other components in the correct sequence, and connects them up with each other.","lastModifiedDate":"2023-09-03"},{"lineNumber":41,"author":{"gitId":"-"},"content":"* At shut down, it shuts down the other components and invokes cleanup methods where necessary.","lastModifiedDate":"2023-09-03"},{"lineNumber":42,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":43,"author":{"gitId":"-"},"content":"The bulk of the app\u0027s work is done by the following four components:","lastModifiedDate":"2023-09-03"},{"lineNumber":44,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":45,"author":{"gitId":"-"},"content":"* [**`UI`**](#ui-component): The UI of the App.","lastModifiedDate":"2020-05-23"},{"lineNumber":46,"author":{"gitId":"-"},"content":"* [**`Logic`**](#logic-component): The command executor.","lastModifiedDate":"2020-05-23"},{"lineNumber":47,"author":{"gitId":"-"},"content":"* [**`Model`**](#model-component): Holds the data of the App in memory.","lastModifiedDate":"2020-05-23"},{"lineNumber":48,"author":{"gitId":"-"},"content":"* [**`Storage`**](#storage-component): Reads data from, and writes data to, the hard disk.","lastModifiedDate":"2020-05-23"},{"lineNumber":49,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":50,"author":{"gitId":"-"},"content":"[**`Commons`**](#common-classes) represents a collection of classes used by multiple other components.","lastModifiedDate":"2023-09-03"},{"lineNumber":51,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":52,"author":{"gitId":"-"},"content":"**How the architecture components interact with each other**","lastModifiedDate":"2020-05-23"},{"lineNumber":53,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":54,"author":{"gitId":"-"},"content":"The *Sequence Diagram* below shows how the components interact with each other for the scenario where the user issues the command `delete 1`.","lastModifiedDate":"2020-05-23"},{"lineNumber":55,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":56,"author":{"gitId":"-"},"content":"\u003cimg src\u003d\"images/ArchitectureSequenceDiagram.png\" width\u003d\"574\" /\u003e","lastModifiedDate":"2020-06-07"},{"lineNumber":57,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":58,"author":{"gitId":"-"},"content":"Each of the four main components (also shown in the diagram above),","lastModifiedDate":"2021-07-31"},{"lineNumber":59,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2021-07-31"},{"lineNumber":60,"author":{"gitId":"-"},"content":"* defines its *API* in an `interface` with the same name as the Component.","lastModifiedDate":"2021-07-31"},{"lineNumber":61,"author":{"gitId":"-"},"content":"* implements its functionality using a concrete `{Component Name}Manager` class (which follows the corresponding API `interface` mentioned in the previous point.","lastModifiedDate":"2021-07-31"},{"lineNumber":62,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2021-07-31"},{"lineNumber":63,"author":{"gitId":"-"},"content":"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\u0027s being coupled to the implementation of a component), as illustrated in the (partial) class diagram below.","lastModifiedDate":"2021-07-31"},{"lineNumber":64,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2021-07-31"},{"lineNumber":65,"author":{"gitId":"-"},"content":"\u003cimg src\u003d\"images/ComponentManagers.png\" width\u003d\"300\" /\u003e","lastModifiedDate":"2021-07-31"},{"lineNumber":66,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2021-07-31"},{"lineNumber":67,"author":{"gitId":"-"},"content":"The sections below give more details of each component.","lastModifiedDate":"2020-05-23"},{"lineNumber":68,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":69,"author":{"gitId":"-"},"content":"### UI component","lastModifiedDate":"2020-05-23"},{"lineNumber":70,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":71,"author":{"gitId":"-"},"content":"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)","lastModifiedDate":"2021-07-31"},{"lineNumber":72,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":73,"author":{"gitId":"-"},"content":"![Structure of the UI Component](images/UiClassDiagram.png)","lastModifiedDate":"2021-07-31"},{"lineNumber":74,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":75,"author":{"gitId":"-"},"content":"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.","lastModifiedDate":"2021-07-31"},{"lineNumber":76,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":77,"author":{"gitId":"-"},"content":"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)","lastModifiedDate":"2021-07-31"},{"lineNumber":78,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":79,"author":{"gitId":"-"},"content":"The `UI` component,","lastModifiedDate":"2020-05-23"},{"lineNumber":80,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":81,"author":{"gitId":"-"},"content":"* executes user commands using the `Logic` component.","lastModifiedDate":"2021-07-31"},{"lineNumber":82,"author":{"gitId":"-"},"content":"* listens for changes to `Model` data so that the UI can be updated with the modified data.","lastModifiedDate":"2021-07-31"},{"lineNumber":83,"author":{"gitId":"-"},"content":"* keeps a reference to the `Logic` component, because the `UI` relies on the `Logic` to execute commands.","lastModifiedDate":"2021-07-31"},{"lineNumber":84,"author":{"gitId":"-"},"content":"* depends on some classes in the `Model` component, as it displays `Person` object residing in the `Model`.","lastModifiedDate":"2021-07-31"},{"lineNumber":85,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":86,"author":{"gitId":"-"},"content":"### Logic component","lastModifiedDate":"2020-05-23"},{"lineNumber":87,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":88,"author":{"gitId":"-"},"content":"**API** : [`Logic.java`](https://github.com/se-edu/addressbook-level3/tree/master/src/main/java/seedu/address/logic/Logic.java)","lastModifiedDate":"2021-07-31"},{"lineNumber":89,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":90,"author":{"gitId":"-"},"content":"Here\u0027s a (partial) class diagram of the `Logic` component:","lastModifiedDate":"2021-07-31"},{"lineNumber":91,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":92,"author":{"gitId":"-"},"content":"\u003cimg src\u003d\"images/LogicClassDiagram.png\" width\u003d\"550\"/\u003e","lastModifiedDate":"2021-07-31"},{"lineNumber":93,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":94,"author":{"gitId":"-"},"content":"The sequence diagram below illustrates the interactions within the `Logic` component, taking `execute(\"delete 1\")` API call as an example.","lastModifiedDate":"2023-09-03"},{"lineNumber":95,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":96,"author":{"gitId":"-"},"content":"![Interactions Inside the Logic Component for the `delete 1` Command](images/DeleteSequenceDiagram.png)","lastModifiedDate":"2020-05-23"},{"lineNumber":97,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":98,"author":{"gitId":"-"},"content":"\u003cdiv markdown\u003d\"span\" class\u003d\"alert alert-info\"\u003e:information_source: **Note:** The lifeline for `DeleteCommandParser` should end at the destroy marker (X) but due to a limitation of PlantUML, the lifeline continues till the end of diagram.","lastModifiedDate":"2024-02-09"},{"lineNumber":99,"author":{"gitId":"-"},"content":"\u003c/div\u003e","lastModifiedDate":"2020-05-23"},{"lineNumber":100,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":101,"author":{"gitId":"-"},"content":"How the `Logic` component works:","lastModifiedDate":"2023-09-03"},{"lineNumber":102,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2023-09-03"},{"lineNumber":103,"author":{"gitId":"-"},"content":"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.","lastModifiedDate":"2023-09-03"},{"lineNumber":104,"author":{"gitId":"-"},"content":"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`.","lastModifiedDate":"2023-09-03"},{"lineNumber":105,"author":{"gitId":"-"},"content":"1. The command can communicate with the `Model` when it is executed (e.g. to delete a person).\u003cbr\u003e","lastModifiedDate":"2024-02-09"},{"lineNumber":106,"author":{"gitId":"-"},"content":" Note that although this is shown as a single step in the diagram above (for simplicity), in the code it can take several interactions (between the command object and the `Model`) to achieve.","lastModifiedDate":"2024-02-09"},{"lineNumber":107,"author":{"gitId":"-"},"content":"1. The result of the command execution is encapsulated as a `CommandResult` object which is returned back from `Logic`.","lastModifiedDate":"2023-09-03"},{"lineNumber":108,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2023-09-03"},{"lineNumber":109,"author":{"gitId":"-"},"content":"Here are the other classes in `Logic` (omitted from the class diagram above) that are used for parsing a user command:","lastModifiedDate":"2021-07-31"},{"lineNumber":110,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2021-07-31"},{"lineNumber":111,"author":{"gitId":"-"},"content":"\u003cimg src\u003d\"images/ParserClasses.png\" width\u003d\"600\"/\u003e","lastModifiedDate":"2021-07-31"},{"lineNumber":112,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":113,"author":{"gitId":"-"},"content":"How the parsing works:","lastModifiedDate":"2021-07-31"},{"lineNumber":114,"author":{"gitId":"-"},"content":"* 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.","lastModifiedDate":"2021-07-31"},{"lineNumber":115,"author":{"gitId":"-"},"content":"* 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.","lastModifiedDate":"2021-07-31"},{"lineNumber":116,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":117,"author":{"gitId":"-"},"content":"### Model component","lastModifiedDate":"2021-07-31"},{"lineNumber":118,"author":{"gitId":"-"},"content":"**API** : [`Model.java`](https://github.com/se-edu/addressbook-level3/tree/master/src/main/java/seedu/address/model/Model.java)","lastModifiedDate":"2020-05-23"},{"lineNumber":119,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":120,"author":{"gitId":"-"},"content":"\u003cimg src\u003d\"images/ModelClassDiagram.png\" width\u003d\"450\" /\u003e","lastModifiedDate":"2021-07-31"},{"lineNumber":121,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":122,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":123,"author":{"gitId":"-"},"content":"The `Model` component,","lastModifiedDate":"2021-07-31"},{"lineNumber":124,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":125,"author":{"gitId":"-"},"content":"* stores the address book data i.e., all `Person` objects (which are contained in a `UniquePersonList` object).","lastModifiedDate":"2021-07-31"},{"lineNumber":126,"author":{"gitId":"-"},"content":"* stores the currently \u0027selected\u0027 `Person` objects (e.g., results of a search query) as a separate _filtered_ list which is exposed to outsiders as an unmodifiable `ObservableList\u003cPerson\u003e` that can be \u0027observed\u0027 e.g. the UI can be bound to this list so that the UI automatically updates when the data in the list change.","lastModifiedDate":"2021-07-31"},{"lineNumber":127,"author":{"gitId":"-"},"content":"* stores a `UserPref` object that represents the user’s preferences. This is exposed to the outside as a `ReadOnlyUserPref` objects.","lastModifiedDate":"2021-07-31"},{"lineNumber":128,"author":{"gitId":"-"},"content":"* 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)","lastModifiedDate":"2021-07-31"},{"lineNumber":129,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2021-07-31"},{"lineNumber":130,"author":{"gitId":"-"},"content":"\u003cdiv markdown\u003d\"span\" class\u003d\"alert alert-info\"\u003e: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.\u003cbr\u003e","lastModifiedDate":"2021-07-31"},{"lineNumber":131,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2021-07-31"},{"lineNumber":132,"author":{"gitId":"-"},"content":"\u003cimg src\u003d\"images/BetterModelClassDiagram.png\" width\u003d\"450\" /\u003e","lastModifiedDate":"2021-07-31"},{"lineNumber":133,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":134,"author":{"gitId":"-"},"content":"\u003c/div\u003e","lastModifiedDate":"2020-05-23"},{"lineNumber":135,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":136,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":137,"author":{"gitId":"-"},"content":"### Storage component","lastModifiedDate":"2020-05-23"},{"lineNumber":138,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":139,"author":{"gitId":"-"},"content":"**API** : [`Storage.java`](https://github.com/se-edu/addressbook-level3/tree/master/src/main/java/seedu/address/storage/Storage.java)","lastModifiedDate":"2020-05-23"},{"lineNumber":140,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":141,"author":{"gitId":"-"},"content":"\u003cimg src\u003d\"images/StorageClassDiagram.png\" width\u003d\"550\" /\u003e","lastModifiedDate":"2021-07-31"},{"lineNumber":142,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2021-07-31"},{"lineNumber":143,"author":{"gitId":"-"},"content":"The `Storage` component,","lastModifiedDate":"2020-05-23"},{"lineNumber":144,"author":{"gitId":"-"},"content":"* can save both address book data and user preference data in JSON format, and read them back into corresponding objects.","lastModifiedDate":"2023-09-03"},{"lineNumber":145,"author":{"gitId":"-"},"content":"* inherits from both `AddressBookStorage` and `UserPrefStorage`, which means it can be treated as either one (if only the functionality of only one is needed).","lastModifiedDate":"2021-07-31"},{"lineNumber":146,"author":{"gitId":"-"},"content":"* depends on some classes in the `Model` component (because the `Storage` component\u0027s job is to save/retrieve objects that belong to the `Model`)","lastModifiedDate":"2021-07-21"},{"lineNumber":147,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":148,"author":{"gitId":"-"},"content":"### Common classes","lastModifiedDate":"2020-05-23"},{"lineNumber":149,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":150,"author":{"gitId":"-"},"content":"Classes used by multiple components are in the `seedu.addressbook.commons` package.","lastModifiedDate":"2020-05-23"},{"lineNumber":151,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":152,"author":{"gitId":"-"},"content":"--------------------------------------------------------------------------------------------------------------------","lastModifiedDate":"2020-05-23"},{"lineNumber":153,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":154,"author":{"gitId":"-"},"content":"## **Implementation**","lastModifiedDate":"2020-05-23"},{"lineNumber":155,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":156,"author":{"gitId":"-"},"content":"This section describes some noteworthy details on how certain features are implemented.","lastModifiedDate":"2020-05-23"},{"lineNumber":157,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":158,"author":{"gitId":"-"},"content":"### \\[Proposed\\] Undo/redo feature","lastModifiedDate":"2020-06-07"},{"lineNumber":159,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":160,"author":{"gitId":"-"},"content":"#### Proposed Implementation","lastModifiedDate":"2020-05-23"},{"lineNumber":161,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":162,"author":{"gitId":"-"},"content":"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:","lastModifiedDate":"2020-05-23"},{"lineNumber":163,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":164,"author":{"gitId":"-"},"content":"* `VersionedAddressBook#commit()` — Saves the current address book state in its history.","lastModifiedDate":"2020-05-23"},{"lineNumber":165,"author":{"gitId":"-"},"content":"* `VersionedAddressBook#undo()` — Restores the previous address book state from its history.","lastModifiedDate":"2020-05-23"},{"lineNumber":166,"author":{"gitId":"-"},"content":"* `VersionedAddressBook#redo()` — Restores a previously undone address book state from its history.","lastModifiedDate":"2020-05-23"},{"lineNumber":167,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":168,"author":{"gitId":"-"},"content":"These operations are exposed in the `Model` interface as `Model#commitAddressBook()`, `Model#undoAddressBook()` and `Model#redoAddressBook()` respectively.","lastModifiedDate":"2020-05-23"},{"lineNumber":169,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":170,"author":{"gitId":"-"},"content":"Given below is an example usage scenario and how the undo/redo mechanism behaves at each step.","lastModifiedDate":"2020-05-23"},{"lineNumber":171,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":172,"author":{"gitId":"-"},"content":"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.","lastModifiedDate":"2020-05-23"},{"lineNumber":173,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":174,"author":{"gitId":"-"},"content":"![UndoRedoState0](images/UndoRedoState0.png)","lastModifiedDate":"2020-05-23"},{"lineNumber":175,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":176,"author":{"gitId":"-"},"content":"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.","lastModifiedDate":"2020-05-23"},{"lineNumber":177,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":178,"author":{"gitId":"-"},"content":"![UndoRedoState1](images/UndoRedoState1.png)","lastModifiedDate":"2020-05-23"},{"lineNumber":179,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":180,"author":{"gitId":"-"},"content":"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`.","lastModifiedDate":"2020-05-23"},{"lineNumber":181,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":182,"author":{"gitId":"-"},"content":"![UndoRedoState2](images/UndoRedoState2.png)","lastModifiedDate":"2020-05-23"},{"lineNumber":183,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":184,"author":{"gitId":"-"},"content":"\u003cdiv markdown\u003d\"span\" class\u003d\"alert alert-info\"\u003e: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`.","lastModifiedDate":"2020-05-23"},{"lineNumber":185,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":186,"author":{"gitId":"-"},"content":"\u003c/div\u003e","lastModifiedDate":"2020-05-23"},{"lineNumber":187,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":188,"author":{"gitId":"-"},"content":"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.","lastModifiedDate":"2020-05-23"},{"lineNumber":189,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":190,"author":{"gitId":"-"},"content":"![UndoRedoState3](images/UndoRedoState3.png)","lastModifiedDate":"2020-05-23"},{"lineNumber":191,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":192,"author":{"gitId":"-"},"content":"\u003cdiv markdown\u003d\"span\" class\u003d\"alert alert-info\"\u003e: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","lastModifiedDate":"2020-05-23"},{"lineNumber":193,"author":{"gitId":"-"},"content":"than attempting to perform the undo.","lastModifiedDate":"2020-05-23"},{"lineNumber":194,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":195,"author":{"gitId":"-"},"content":"\u003c/div\u003e","lastModifiedDate":"2020-05-23"},{"lineNumber":196,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":197,"author":{"gitId":"-"},"content":"The following sequence diagram shows how an undo operation goes through the `Logic` component:","lastModifiedDate":"2024-02-09"},{"lineNumber":198,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":199,"author":{"gitId":"-"},"content":"![UndoSequenceDiagram](images/UndoSequenceDiagram-Logic.png)","lastModifiedDate":"2024-02-09"},{"lineNumber":200,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":201,"author":{"gitId":"-"},"content":"\u003cdiv markdown\u003d\"span\" class\u003d\"alert alert-info\"\u003e: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.","lastModifiedDate":"2020-05-23"},{"lineNumber":202,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":203,"author":{"gitId":"-"},"content":"\u003c/div\u003e","lastModifiedDate":"2020-05-23"},{"lineNumber":204,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":205,"author":{"gitId":"-"},"content":"Similarly, how an undo operation goes through the `Model` component is shown below:","lastModifiedDate":"2024-02-09"},{"lineNumber":206,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2024-02-09"},{"lineNumber":207,"author":{"gitId":"-"},"content":"![UndoSequenceDiagram](images/UndoSequenceDiagram-Model.png)","lastModifiedDate":"2024-02-09"},{"lineNumber":208,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2024-02-09"},{"lineNumber":209,"author":{"gitId":"-"},"content":"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.","lastModifiedDate":"2020-05-23"},{"lineNumber":210,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":211,"author":{"gitId":"-"},"content":"\u003cdiv markdown\u003d\"span\" class\u003d\"alert alert-info\"\u003e: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.","lastModifiedDate":"2020-05-23"},{"lineNumber":212,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":213,"author":{"gitId":"-"},"content":"\u003c/div\u003e","lastModifiedDate":"2020-05-23"},{"lineNumber":214,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":215,"author":{"gitId":"-"},"content":"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.","lastModifiedDate":"2020-05-23"},{"lineNumber":216,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":217,"author":{"gitId":"-"},"content":"![UndoRedoState4](images/UndoRedoState4.png)","lastModifiedDate":"2020-05-23"},{"lineNumber":218,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":219,"author":{"gitId":"-"},"content":"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.","lastModifiedDate":"2020-05-23"},{"lineNumber":220,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":221,"author":{"gitId":"-"},"content":"![UndoRedoState5](images/UndoRedoState5.png)","lastModifiedDate":"2020-05-23"},{"lineNumber":222,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":223,"author":{"gitId":"-"},"content":"The following activity diagram summarizes what happens when a user executes a new command:","lastModifiedDate":"2020-05-23"},{"lineNumber":224,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":225,"author":{"gitId":"-"},"content":"\u003cimg src\u003d\"images/CommitActivityDiagram.png\" width\u003d\"250\" /\u003e","lastModifiedDate":"2021-07-31"},{"lineNumber":226,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":227,"author":{"gitId":"-"},"content":"#### Design considerations:","lastModifiedDate":"2021-07-31"},{"lineNumber":228,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":229,"author":{"gitId":"-"},"content":"**Aspect: How undo \u0026 redo executes:**","lastModifiedDate":"2021-07-31"},{"lineNumber":230,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":231,"author":{"gitId":"-"},"content":"* **Alternative 1 (current choice):** Saves the entire address book.","lastModifiedDate":"2020-05-23"},{"lineNumber":232,"author":{"gitId":"-"},"content":" * Pros: Easy to implement.","lastModifiedDate":"2020-05-23"},{"lineNumber":233,"author":{"gitId":"-"},"content":" * Cons: May have performance issues in terms of memory usage.","lastModifiedDate":"2020-05-23"},{"lineNumber":234,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":235,"author":{"gitId":"-"},"content":"* **Alternative 2:** Individual command knows how to undo/redo by","lastModifiedDate":"2020-05-23"},{"lineNumber":236,"author":{"gitId":"-"},"content":" itself.","lastModifiedDate":"2020-05-23"},{"lineNumber":237,"author":{"gitId":"-"},"content":" * Pros: Will use less memory (e.g. for `delete`, just save the person being deleted).","lastModifiedDate":"2020-05-23"},{"lineNumber":238,"author":{"gitId":"-"},"content":" * Cons: We must ensure that the implementation of each individual command are correct.","lastModifiedDate":"2020-05-23"},{"lineNumber":239,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":240,"author":{"gitId":"-"},"content":"_{more aspects and alternatives to be added}_","lastModifiedDate":"2020-05-23"},{"lineNumber":241,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":242,"author":{"gitId":"-"},"content":"### \\[Proposed\\] Data archiving","lastModifiedDate":"2020-05-23"},{"lineNumber":243,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":244,"author":{"gitId":"-"},"content":"_{Explain here how the data archiving feature will be implemented}_","lastModifiedDate":"2020-05-23"},{"lineNumber":245,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":246,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":247,"author":{"gitId":"-"},"content":"--------------------------------------------------------------------------------------------------------------------","lastModifiedDate":"2020-05-23"},{"lineNumber":248,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":249,"author":{"gitId":"-"},"content":"## **Documentation, logging, testing, configuration, dev-ops**","lastModifiedDate":"2020-06-07"},{"lineNumber":250,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":251,"author":{"gitId":"-"},"content":"* [Documentation guide](Documentation.md)","lastModifiedDate":"2020-06-07"},{"lineNumber":252,"author":{"gitId":"-"},"content":"* [Testing guide](Testing.md)","lastModifiedDate":"2020-06-07"},{"lineNumber":253,"author":{"gitId":"-"},"content":"* [Logging guide](Logging.md)","lastModifiedDate":"2020-06-07"},{"lineNumber":254,"author":{"gitId":"-"},"content":"* [Configuration guide](Configuration.md)","lastModifiedDate":"2020-06-07"},{"lineNumber":255,"author":{"gitId":"-"},"content":"* [DevOps guide](DevOps.md)","lastModifiedDate":"2020-06-07"},{"lineNumber":256,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":257,"author":{"gitId":"-"},"content":"--------------------------------------------------------------------------------------------------------------------","lastModifiedDate":"2020-05-23"},{"lineNumber":258,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":259,"author":{"gitId":"-"},"content":"## **Appendix: Requirements**","lastModifiedDate":"2020-05-23"},{"lineNumber":260,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":261,"author":{"gitId":"-"},"content":"### Product scope","lastModifiedDate":"2020-05-23"},{"lineNumber":262,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":263,"author":{"gitId":"-"},"content":"**Target user profile**:","lastModifiedDate":"2020-05-23"},{"lineNumber":264,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":265,"author":{"gitId":"ronnnnnnnnn"},"content":"* is an instructor for a CS-related course","lastModifiedDate":"2024-02-29"},{"lineNumber":266,"author":{"gitId":"ronnnnnnnnn"},"content":"* is organised and efficient","lastModifiedDate":"2024-02-29"},{"lineNumber":267,"author":{"gitId":"ronnnnnnnnn"},"content":"* prefers desktop apps over other types","lastModifiedDate":"2024-02-29"},{"lineNumber":268,"author":{"gitId":"-"},"content":"* can type fast","lastModifiedDate":"2020-05-23"},{"lineNumber":269,"author":{"gitId":"-"},"content":"* prefers typing to mouse interactions","lastModifiedDate":"2020-05-26"},{"lineNumber":270,"author":{"gitId":"-"},"content":"* is reasonably comfortable using CLI apps","lastModifiedDate":"2020-05-23"},{"lineNumber":271,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":272,"author":{"gitId":"ronnnnnnnnn"},"content":"**Value proposition**: keep track of the details of weaker students, allowing the instructor to pay more attention to them","lastModifiedDate":"2024-02-29"},{"lineNumber":273,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":274,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":275,"author":{"gitId":"-"},"content":"### User stories","lastModifiedDate":"2020-06-07"},{"lineNumber":276,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":277,"author":{"gitId":"-"},"content":"Priorities: High (must have) - `* * *`, Medium (nice to have) - `* *`, Low (unlikely to have) - `*`","lastModifiedDate":"2020-05-23"},{"lineNumber":278,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":279,"author":{"gitId":"-"},"content":"| Priority | As a …​ | I want to …​ | So that I can…​ |","lastModifiedDate":"2020-05-23"},{"lineNumber":280,"author":{"gitId":"willowisp01"},"content":"|----------|-------------------------------------|----------------------------------------------------|----------------------------------------------------|","lastModifiedDate":"2024-02-29"},{"lineNumber":281,"author":{"gitId":"willowisp01"},"content":"| `* * *` | Course Instructor who can type fast | enter new students’ information using command line | store the information efficiently |","lastModifiedDate":"2024-02-29"},{"lineNumber":282,"author":{"gitId":"willowisp01"},"content":"| `* * *` | Course Instructor | put students into groups | tell which group each of the students are in |","lastModifiedDate":"2024-02-29"},{"lineNumber":283,"author":{"gitId":"willowisp01"},"content":"| `* * *` | Course Instructor | access student’s contact information | communicate with them easily |","lastModifiedDate":"2024-02-29"},{"lineNumber":284,"author":{"gitId":"willowisp01"},"content":"| `* *` | Course Instructor | delete student details on command line | remove students no longer in class |","lastModifiedDate":"2024-02-29"},{"lineNumber":285,"author":{"gitId":"willowisp01"},"content":"| `* * *` | Seasoned Course Instructor | view a single student’s details | identify students of note |","lastModifiedDate":"2024-02-29"},{"lineNumber":286,"author":{"gitId":"willowisp01"},"content":"| `* *` | Course Instructor | edit students’ info | update their info if it changes |","lastModifiedDate":"2024-02-29"},{"lineNumber":287,"author":{"gitId":"willowisp01"},"content":"","lastModifiedDate":"2024-02-29"},{"lineNumber":288,"author":{"gitId":"willowisp01"},"content":"*{More to be added -- this is the minimum viable product for v1.2}*","lastModifiedDate":"2024-02-29"},{"lineNumber":289,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":290,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":291,"author":{"gitId":"-"},"content":"### Use cases","lastModifiedDate":"2020-06-07"},{"lineNumber":292,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":293,"author":{"gitId":"JiaXinEu"},"content":"(For all use cases below, the **System** is the `TeachStack` and the **Actor** is the `user`, unless specified otherwise)","lastModifiedDate":"2024-02-29"},{"lineNumber":294,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":295,"author":{"gitId":"JiaXinEu"},"content":"**Use case: Delete a student**","lastModifiedDate":"2024-02-29"},{"lineNumber":296,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":297,"author":{"gitId":"-"},"content":"**MSS**","lastModifiedDate":"2020-05-23"},{"lineNumber":298,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":299,"author":{"gitId":"JiaXinEu"},"content":"1. User requests to list students","lastModifiedDate":"2024-02-29"},{"lineNumber":300,"author":{"gitId":"JiaXinEu"},"content":"2. TeachStack shows a list of students","lastModifiedDate":"2024-02-29"},{"lineNumber":301,"author":{"gitId":"JiaXinEu"},"content":"3. User requests to delete a specific student in the list","lastModifiedDate":"2024-02-29"},{"lineNumber":302,"author":{"gitId":"JiaXinEu"},"content":"4. TeachStack deletes the student","lastModifiedDate":"2024-02-29"},{"lineNumber":303,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":304,"author":{"gitId":"-"},"content":" Use case ends.","lastModifiedDate":"2020-05-23"},{"lineNumber":305,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":306,"author":{"gitId":"-"},"content":"**Extensions**","lastModifiedDate":"2020-05-23"},{"lineNumber":307,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":308,"author":{"gitId":"-"},"content":"* 2a. The list is empty.","lastModifiedDate":"2020-05-23"},{"lineNumber":309,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":310,"author":{"gitId":"-"},"content":" Use case ends.","lastModifiedDate":"2020-05-23"},{"lineNumber":311,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":312,"author":{"gitId":"JiaXinEu"},"content":"* 3a. The given student id is invalid.","lastModifiedDate":"2024-02-29"},{"lineNumber":313,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":314,"author":{"gitId":"JiaXinEu"},"content":" * 3a1. TeachStack displays an error message.","lastModifiedDate":"2024-02-29"},{"lineNumber":315,"author":{"gitId":"JiaXinEu"},"content":"","lastModifiedDate":"2024-02-29"},{"lineNumber":316,"author":{"gitId":"JiaXinEu"},"content":" Use case resumes at step 2.","lastModifiedDate":"2024-02-29"},{"lineNumber":317,"author":{"gitId":"JiaXinEu"},"content":"","lastModifiedDate":"2024-02-29"},{"lineNumber":318,"author":{"gitId":"JiaXinEu"},"content":"**Use case: Add a student**","lastModifiedDate":"2024-02-29"},{"lineNumber":319,"author":{"gitId":"JiaXinEu"},"content":"","lastModifiedDate":"2024-02-29"},{"lineNumber":320,"author":{"gitId":"JiaXinEu"},"content":"**MSS**","lastModifiedDate":"2024-02-29"},{"lineNumber":321,"author":{"gitId":"JiaXinEu"},"content":"","lastModifiedDate":"2024-02-29"},{"lineNumber":322,"author":{"gitId":"JiaXinEu"},"content":"1. User requests to add a student","lastModifiedDate":"2024-02-29"},{"lineNumber":323,"author":{"gitId":"JiaXinEu"},"content":"2. TeachStack adds a new student to the list","lastModifiedDate":"2024-02-29"},{"lineNumber":324,"author":{"gitId":"JiaXinEu"},"content":"","lastModifiedDate":"2024-02-29"},{"lineNumber":325,"author":{"gitId":"JiaXinEu"},"content":" Use case ends.","lastModifiedDate":"2024-02-29"},{"lineNumber":326,"author":{"gitId":"JiaXinEu"},"content":"","lastModifiedDate":"2024-02-29"},{"lineNumber":327,"author":{"gitId":"JiaXinEu"},"content":"**Extensions**","lastModifiedDate":"2024-02-29"},{"lineNumber":328,"author":{"gitId":"JiaXinEu"},"content":"","lastModifiedDate":"2024-02-29"},{"lineNumber":329,"author":{"gitId":"JiaXinEu"},"content":"* 1a. The value given for any parameter is invalid.","lastModifiedDate":"2024-02-29"},{"lineNumber":330,"author":{"gitId":"JiaXinEu"},"content":" * 1a1. TeachStack displays an error message.","lastModifiedDate":"2024-02-29"},{"lineNumber":331,"author":{"gitId":"JiaXinEu"},"content":"","lastModifiedDate":"2024-02-29"},{"lineNumber":332,"author":{"gitId":"JiaXinEu"},"content":" Use case ends.","lastModifiedDate":"2024-02-29"},{"lineNumber":333,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2024-02-29"},{"lineNumber":334,"author":{"gitId":"JiaXinEu"},"content":"**Use case: Form a group of students**","lastModifiedDate":"2024-02-29"},{"lineNumber":335,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2024-02-29"},{"lineNumber":336,"author":{"gitId":"-"},"content":"**MSS**","lastModifiedDate":"2024-02-29"},{"lineNumber":337,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2024-02-29"},{"lineNumber":338,"author":{"gitId":"JiaXinEu"},"content":"1. User requests to list students","lastModifiedDate":"2024-02-29"},{"lineNumber":339,"author":{"gitId":"JiaXinEu"},"content":"2. TeachStack shows a list of students","lastModifiedDate":"2024-02-29"},{"lineNumber":340,"author":{"gitId":"JiaXinEu"},"content":"3. User requests to group specific students in the list","lastModifiedDate":"2024-02-29"},{"lineNumber":341,"author":{"gitId":"JiaXinEu"},"content":"4. TeachStack groups the student","lastModifiedDate":"2024-02-29"},{"lineNumber":342,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2024-02-29"},{"lineNumber":343,"author":{"gitId":"-"},"content":" Use case ends.","lastModifiedDate":"2024-02-29"},{"lineNumber":344,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2024-02-29"},{"lineNumber":345,"author":{"gitId":"-"},"content":"**Extensions**","lastModifiedDate":"2024-02-29"},{"lineNumber":346,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2024-02-29"},{"lineNumber":347,"author":{"gitId":"-"},"content":"* 2a. The list is empty.","lastModifiedDate":"2024-02-29"},{"lineNumber":348,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2024-02-29"},{"lineNumber":349,"author":{"gitId":"-"},"content":" Use case ends.","lastModifiedDate":"2024-02-29"},{"lineNumber":350,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2024-02-29"},{"lineNumber":351,"author":{"gitId":"JiaXinEu"},"content":"* 3a. The given student id is invalid.","lastModifiedDate":"2024-02-29"},{"lineNumber":352,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2024-02-29"},{"lineNumber":353,"author":{"gitId":"JiaXinEu"},"content":" * 3a1. TeachStack displays an error message.","lastModifiedDate":"2024-02-29"},{"lineNumber":354,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":355,"author":{"gitId":"-"},"content":" Use case resumes at step 2.","lastModifiedDate":"2020-05-23"},{"lineNumber":356,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":357,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":358,"author":{"gitId":"-"},"content":"### Non-Functional Requirements","lastModifiedDate":"2020-05-23"},{"lineNumber":359,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":360,"author":{"gitId":"-"},"content":"1. Should work on any _mainstream OS_ as long as it has Java `11` or above installed.","lastModifiedDate":"2020-05-23"},{"lineNumber":361,"author":{"gitId":"-"},"content":"2. Should be able to hold up to 1000 persons without a noticeable sluggishness in performance for typical usage.","lastModifiedDate":"2020-05-23"},{"lineNumber":362,"author":{"gitId":"-"},"content":"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.","lastModifiedDate":"2020-05-23"},{"lineNumber":363,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":364,"author":{"gitId":"-"},"content":"*{More to be added}*","lastModifiedDate":"2020-05-23"},{"lineNumber":365,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":366,"author":{"gitId":"-"},"content":"### Glossary","lastModifiedDate":"2020-05-23"},{"lineNumber":367,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":368,"author":{"gitId":"-"},"content":"* **Mainstream OS**: Windows, Linux, Unix, MacOS","lastModifiedDate":"2024-02-09"},{"lineNumber":369,"author":{"gitId":"-"},"content":"* **Private contact detail**: A contact detail that is not meant to be shared with others","lastModifiedDate":"2020-05-23"},{"lineNumber":370,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":371,"author":{"gitId":"-"},"content":"--------------------------------------------------------------------------------------------------------------------","lastModifiedDate":"2020-05-23"},{"lineNumber":372,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":373,"author":{"gitId":"-"},"content":"## **Appendix: Instructions for manual testing**","lastModifiedDate":"2020-05-23"},{"lineNumber":374,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":375,"author":{"gitId":"-"},"content":"Given below are instructions to test the app manually.","lastModifiedDate":"2020-05-23"},{"lineNumber":376,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":377,"author":{"gitId":"-"},"content":"\u003cdiv markdown\u003d\"span\" class\u003d\"alert alert-info\"\u003e:information_source: **Note:** These instructions only provide a starting point for testers to work on;","lastModifiedDate":"2020-05-23"},{"lineNumber":378,"author":{"gitId":"-"},"content":"testers are expected to do more *exploratory* testing.","lastModifiedDate":"2020-05-23"},{"lineNumber":379,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":380,"author":{"gitId":"-"},"content":"\u003c/div\u003e","lastModifiedDate":"2020-05-23"},{"lineNumber":381,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":382,"author":{"gitId":"-"},"content":"### Launch and shutdown","lastModifiedDate":"2020-05-23"},{"lineNumber":383,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":384,"author":{"gitId":"-"},"content":"1. Initial launch","lastModifiedDate":"2020-05-23"},{"lineNumber":385,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":386,"author":{"gitId":"-"},"content":" 1. Download the jar file and copy into an empty folder","lastModifiedDate":"2020-05-23"},{"lineNumber":387,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":388,"author":{"gitId":"-"},"content":" 1. Double-click the jar file Expected: Shows the GUI with a set of sample contacts. The window size may not be optimum.","lastModifiedDate":"2020-05-23"},{"lineNumber":389,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":390,"author":{"gitId":"-"},"content":"1. Saving window preferences","lastModifiedDate":"2020-05-23"},{"lineNumber":391,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":392,"author":{"gitId":"-"},"content":" 1. Resize the window to an optimum size. Move the window to a different location. Close the window.","lastModifiedDate":"2020-05-23"},{"lineNumber":393,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":394,"author":{"gitId":"-"},"content":" 1. Re-launch the app by double-clicking the jar file.\u003cbr\u003e","lastModifiedDate":"2020-05-23"},{"lineNumber":395,"author":{"gitId":"-"},"content":" Expected: The most recent window size and location is retained.","lastModifiedDate":"2020-05-23"},{"lineNumber":396,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":397,"author":{"gitId":"-"},"content":"1. _{ more test cases …​ }_","lastModifiedDate":"2020-05-23"},{"lineNumber":398,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":399,"author":{"gitId":"-"},"content":"### Deleting a person","lastModifiedDate":"2020-05-23"},{"lineNumber":400,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":401,"author":{"gitId":"-"},"content":"1. Deleting a person while all persons are being shown","lastModifiedDate":"2020-05-23"},{"lineNumber":402,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":403,"author":{"gitId":"-"},"content":" 1. Prerequisites: List all persons using the `list` command. Multiple persons in the list.","lastModifiedDate":"2020-05-23"},{"lineNumber":404,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":405,"author":{"gitId":"-"},"content":" 1. Test case: `delete 1`\u003cbr\u003e","lastModifiedDate":"2020-05-23"},{"lineNumber":406,"author":{"gitId":"-"},"content":" 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.","lastModifiedDate":"2020-05-23"},{"lineNumber":407,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":408,"author":{"gitId":"-"},"content":" 1. Test case: `delete 0`\u003cbr\u003e","lastModifiedDate":"2020-05-23"},{"lineNumber":409,"author":{"gitId":"-"},"content":" Expected: No person is deleted. Error details shown in the status message. Status bar remains the same.","lastModifiedDate":"2020-05-23"},{"lineNumber":410,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":411,"author":{"gitId":"-"},"content":" 1. Other incorrect delete commands to try: `delete`, `delete x`, `...` (where x is larger than the list size)\u003cbr\u003e","lastModifiedDate":"2020-05-23"},{"lineNumber":412,"author":{"gitId":"-"},"content":" Expected: Similar to previous.","lastModifiedDate":"2020-05-23"},{"lineNumber":413,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":414,"author":{"gitId":"-"},"content":"1. _{ more test cases …​ }_","lastModifiedDate":"2020-05-23"},{"lineNumber":415,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":416,"author":{"gitId":"-"},"content":"### Saving data","lastModifiedDate":"2020-05-23"},{"lineNumber":417,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":418,"author":{"gitId":"-"},"content":"1. Dealing with missing/corrupted data files","lastModifiedDate":"2020-05-23"},{"lineNumber":419,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":420,"author":{"gitId":"-"},"content":" 1. _{explain how to simulate a missing/corrupted file, and the expected behavior}_","lastModifiedDate":"2020-05-23"},{"lineNumber":421,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":422,"author":{"gitId":"-"},"content":"1. _{ more test cases …​ }_","lastModifiedDate":"2020-05-23"}],"authorContributionMap":{"willowisp01":9,"JiaXinEu":33,"-":376,"ronnnnnnnnn":4}},{"path":"docs/UserGuide.md","fileType":"docs","lines":[{"lineNumber":1,"author":{"gitId":"-"},"content":"---","lastModifiedDate":"2020-05-23"},{"lineNumber":2,"author":{"gitId":"-"},"content":"layout: page","lastModifiedDate":"2020-05-23"},{"lineNumber":3,"author":{"gitId":"-"},"content":"title: User Guide","lastModifiedDate":"2020-05-23"},{"lineNumber":4,"author":{"gitId":"-"},"content":"---","lastModifiedDate":"2020-05-23"},{"lineNumber":5,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":6,"author":{"gitId":"-"},"content":"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.","lastModifiedDate":"2020-05-23"},{"lineNumber":7,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":8,"author":{"gitId":"-"},"content":"* Table of Contents","lastModifiedDate":"2020-05-23"},{"lineNumber":9,"author":{"gitId":"-"},"content":"{:toc}","lastModifiedDate":"2020-05-23"},{"lineNumber":10,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":11,"author":{"gitId":"-"},"content":"--------------------------------------------------------------------------------------------------------------------","lastModifiedDate":"2020-05-23"},{"lineNumber":12,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":13,"author":{"gitId":"-"},"content":"## Quick start","lastModifiedDate":"2020-05-23"},{"lineNumber":14,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":15,"author":{"gitId":"-"},"content":"1. Ensure you have Java `11` or above installed in your Computer.","lastModifiedDate":"2020-05-23"},{"lineNumber":16,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":17,"author":{"gitId":"Wongqingyee"},"content":"1. Download the latest `TeachStack.jar` from [here](https://github.com/se-edu/addressbook-level3/releases).","lastModifiedDate":"2024-02-29"},{"lineNumber":18,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":19,"author":{"gitId":"-"},"content":"1. Copy the file to the folder you want to use as the _home folder_ for your AddressBook.","lastModifiedDate":"2020-05-23"},{"lineNumber":20,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":21,"author":{"gitId":"Wongqingyee"},"content":"1. Open a command terminal, `cd` into the folder you put the jar file in, and use the `java -jar TeachStack.jar` command to run the application.\u003cbr\u003e","lastModifiedDate":"2024-02-29"},{"lineNumber":22,"author":{"gitId":"-"},"content":" A GUI similar to the below should appear in a few seconds. Note how the app contains some sample data.\u003cbr\u003e","lastModifiedDate":"2023-01-01"},{"lineNumber":23,"author":{"gitId":"-"},"content":" ![Ui](images/Ui.png)","lastModifiedDate":"2020-05-23"},{"lineNumber":24,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":25,"author":{"gitId":"-"},"content":"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.\u003cbr\u003e","lastModifiedDate":"2020-05-23"},{"lineNumber":26,"author":{"gitId":"-"},"content":" Some example commands you can try:","lastModifiedDate":"2020-05-23"},{"lineNumber":27,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":28,"author":{"gitId":"-"},"content":" * `list` : Lists all contacts.","lastModifiedDate":"2023-01-01"},{"lineNumber":29,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":30,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":31,"author":{"gitId":"JiaXinEu"},"content":" * `add id/A01234567H n/John Doe e/e0123456@u.nus.edu` : Adds a student named `John Doe` to the list.","lastModifiedDate":"2024-02-29"},{"lineNumber":32,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":33,"author":{"gitId":"JiaXinEu"},"content":" * `delete A0123456X` : Deletes the student with student id A0123456X from the list.","lastModifiedDate":"2024-02-29"},{"lineNumber":34,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":35,"author":{"gitId":"JiaXinEu"},"content":" * `clear` : Deletes all students.","lastModifiedDate":"2024-02-29"},{"lineNumber":36,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":37,"author":{"gitId":"-"},"content":" * `exit` : Exits the app.","lastModifiedDate":"2023-01-01"},{"lineNumber":38,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":39,"author":{"gitId":"-"},"content":"1. Refer to the [Features](#features) below for details of each command.","lastModifiedDate":"2020-05-23"},{"lineNumber":40,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":41,"author":{"gitId":"-"},"content":"--------------------------------------------------------------------------------------------------------------------","lastModifiedDate":"2020-05-23"},{"lineNumber":42,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":43,"author":{"gitId":"-"},"content":"## Features","lastModifiedDate":"2020-05-23"},{"lineNumber":44,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":45,"author":{"gitId":"-"},"content":"\u003cdiv markdown\u003d\"block\" class\u003d\"alert alert-info\"\u003e","lastModifiedDate":"2020-05-23"},{"lineNumber":46,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":47,"author":{"gitId":"-"},"content":"**:information_source: Notes about the command format:**\u003cbr\u003e","lastModifiedDate":"2020-05-23"},{"lineNumber":48,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":49,"author":{"gitId":"-"},"content":"* Words in `UPPER_CASE` are the parameters to be supplied by the user.\u003cbr\u003e","lastModifiedDate":"2020-05-23"},{"lineNumber":50,"author":{"gitId":"-"},"content":" e.g. in `add n/NAME`, `NAME` is a parameter which can be used as `add n/John Doe`.","lastModifiedDate":"2020-05-23"},{"lineNumber":51,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":52,"author":{"gitId":"-"},"content":"* Items in square brackets are optional.\u003cbr\u003e","lastModifiedDate":"2020-05-23"},{"lineNumber":53,"author":{"gitId":"-"},"content":" e.g `n/NAME [t/TAG]` can be used as `n/John Doe t/friend` or as `n/John Doe`.","lastModifiedDate":"2020-05-23"},{"lineNumber":54,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":55,"author":{"gitId":"Wongqingyee"},"content":"* Parameters must be in specified order.\u003cbr\u003e","lastModifiedDate":"2024-02-29"},{"lineNumber":56,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":57,"author":{"gitId":"-"},"content":"* Extraneous parameters for commands that do not take in parameters (such as `help`, `list`, `exit` and `clear`) will be ignored.\u003cbr\u003e","lastModifiedDate":"2021-02-03"},{"lineNumber":58,"author":{"gitId":"-"},"content":" e.g. if the command specifies `help 123`, it will be interpreted as `help`.","lastModifiedDate":"2021-02-03"},{"lineNumber":59,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2021-02-03"},{"lineNumber":60,"author":{"gitId":"-"},"content":"* 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.","lastModifiedDate":"2023-06-26"},{"lineNumber":61,"author":{"gitId":"-"},"content":"\u003c/div\u003e","lastModifiedDate":"2020-05-23"},{"lineNumber":62,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":63,"author":{"gitId":"-"},"content":"### Viewing help : `help`","lastModifiedDate":"2020-05-23"},{"lineNumber":64,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":65,"author":{"gitId":"-"},"content":"Shows a message explaning how to access the help page.","lastModifiedDate":"2020-05-23"},{"lineNumber":66,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":67,"author":{"gitId":"-"},"content":"![help message](images/helpMessage.png)","lastModifiedDate":"2020-05-23"},{"lineNumber":68,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":69,"author":{"gitId":"-"},"content":"Format: `help`","lastModifiedDate":"2020-05-23"},{"lineNumber":70,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":71,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":72,"author":{"gitId":"-"},"content":"### Adding a person: `add`","lastModifiedDate":"2020-05-23"},{"lineNumber":73,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":74,"author":{"gitId":"Wongqingyee"},"content":"Adds student details to the address book.","lastModifiedDate":"2024-02-29"},{"lineNumber":75,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":76,"author":{"gitId":"Wongqingyee"},"content":"Format: `add id/STUDENT_ID n/NAME e/EMAIL g/GRADE [t/TAG]​`","lastModifiedDate":"2024-02-29"},{"lineNumber":77,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":78,"author":{"gitId":"Wongqingyee"},"content":"* Name, student_id, grade, and email must have.","lastModifiedDate":"2024-02-29"},{"lineNumber":79,"author":{"gitId":"Wongqingyee"},"content":"* Name can be case-insensitive, eg. john doe, JOHN DOE same as John Doe","lastModifiedDate":"2024-02-29"},{"lineNumber":80,"author":{"gitId":"Wongqingyee"},"content":"* Email must have the correct format and string length of 8 for the email username eg. e0000000@u.nus.edu","lastModifiedDate":"2024-02-29"},{"lineNumber":81,"author":{"gitId":"Wongqingyee"},"content":"* Grade: [A+, A, A-, B+, B, B-, C+, C, D+, D, F]","lastModifiedDate":"2024-02-29"},{"lineNumber":82,"author":{"gitId":"Wongqingyee"},"content":"* Student_id must start with A and end with a letter, string length of 9 eg. A0000000X","lastModifiedDate":"2024-02-29"},{"lineNumber":83,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":84,"author":{"gitId":"-"},"content":"Examples:","lastModifiedDate":"2020-05-23"},{"lineNumber":85,"author":{"gitId":"Wongqingyee"},"content":"* `add id/A01234567H n/John Doe e/e0123456@u.nus.edu`","lastModifiedDate":"2024-02-29"},{"lineNumber":86,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2024-02-29"},{"lineNumber":87,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":88,"author":{"gitId":"-"},"content":"### Editing a person : `edit`","lastModifiedDate":"2020-05-23"},{"lineNumber":89,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":90,"author":{"gitId":"-"},"content":"Edits an existing person in the address book.","lastModifiedDate":"2020-05-23"},{"lineNumber":91,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":92,"author":{"gitId":"yashma-sonara"},"content":"Format: `edit [id/STUDENT_ID] [e/EMAIL] `","lastModifiedDate":"2024-02-29"},{"lineNumber":93,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":94,"author":{"gitId":"yashma-sonara"},"content":"* Edits the person with the specified `STUDENT_ID`. The STUDENT_ID refers to the unique alphanumeric sequence assigned to a person shown in the displayed person list. The student_id **must be 9 digits long","lastModifiedDate":"2024-02-29"},{"lineNumber":95,"author":{"gitId":"yashma-sonara"},"content":"* Only 1 field may be provided.","lastModifiedDate":"2024-02-29"},{"lineNumber":96,"author":{"gitId":"yashma-sonara"},"content":"* Existing value will be updated to the input value.","lastModifiedDate":"2024-02-29"},{"lineNumber":97,"author":{"gitId":"yashma-sonara"},"content":"* Name can be case-insensitive, eg. john doe, JOHN DOE same as John Doe","lastModifiedDate":"2024-02-29"},{"lineNumber":98,"author":{"gitId":"yashma-sonara"},"content":"* Email must have the correct domain (@u.nus.edu) and string length of 8 for the email username eg. e0000000@u.nus.edu","lastModifiedDate":"2024-02-29"},{"lineNumber":99,"author":{"gitId":"yashma-sonara"},"content":"* Grade may be of values: [A+, A, A-, B+, B, B-, C+, C, D+, D, F]","lastModifiedDate":"2024-02-29"},{"lineNumber":100,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":101,"author":{"gitId":"-"},"content":"Examples:","lastModifiedDate":"2020-05-23"},{"lineNumber":102,"author":{"gitId":"yashma-sonara"},"content":"* `edit id/A0123456X e/johndoe@example.com` Edits the email address of the person with student_id \u003d A0123456X to be `e1234567@u.nus.edu`.","lastModifiedDate":"2024-02-29"},{"lineNumber":103,"author":{"gitId":"yashma-sonara"},"content":"* `edit id/A2233445X n/Betsy Crower` Edits the name of the person with student_id \u003d A2233445X to be `Betsy Crower`.","lastModifiedDate":"2024-02-29"},{"lineNumber":104,"author":{"gitId":"yashma-sonara"},"content":"","lastModifiedDate":"2024-02-29"},{"lineNumber":105,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":106,"author":{"gitId":"ronnnnnnnnn"},"content":"### Viewing students by name: `view`","lastModifiedDate":"2024-02-29"},{"lineNumber":107,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":108,"author":{"gitId":"ronnnnnnnnn"},"content":"Shows the detailed information of the student with the specified student_id.","lastModifiedDate":"2024-02-29"},{"lineNumber":109,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":110,"author":{"gitId":"ronnnnnnnnn"},"content":"Format: `view STUDENT_ID`","lastModifiedDate":"2024-02-29"},{"lineNumber":111,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":112,"author":{"gitId":"ronnnnnnnnn"},"content":"* Returns the detailed information of the student with the corresponding `STUDENT_ID`.","lastModifiedDate":"2024-02-29"},{"lineNumber":113,"author":{"gitId":"ronnnnnnnnn"},"content":"* The `STUDENT_ID` is case-insensitive.","lastModifiedDate":"2024-02-29"},{"lineNumber":114,"author":{"gitId":"ronnnnnnnnn"},"content":"* The `STUDENT_ID` starts with A and ends with a letter and it must be 9 characters long.","lastModifiedDate":"2024-02-29"},{"lineNumber":115,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":116,"author":{"gitId":"-"},"content":"Examples:","lastModifiedDate":"2020-05-23"},{"lineNumber":117,"author":{"gitId":"ronnnnnnnnn"},"content":"* `view A0123456X` Shows the detailed information of the student with `STUDENT_ID \u003d A0123456X`","lastModifiedDate":"2024-02-29"},{"lineNumber":118,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":119,"author":{"gitId":"-"},"content":"### Deleting a person : `delete`","lastModifiedDate":"2020-05-23"},{"lineNumber":120,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":121,"author":{"gitId":"JiaXinEu"},"content":"Deletes the specified student from the list.","lastModifiedDate":"2024-02-29"},{"lineNumber":122,"author":{"gitId":"JiaXinEu"},"content":"","lastModifiedDate":"2024-02-29"},{"lineNumber":123,"author":{"gitId":"JiaXinEu"},"content":"Format: `delete STUDENT_ID`","lastModifiedDate":"2024-02-29"},{"lineNumber":124,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":125,"author":{"gitId":"JiaXinEu"},"content":"* Deletes the person at the specified `STUDENT_ID`.","lastModifiedDate":"2024-02-29"},{"lineNumber":126,"author":{"gitId":"JiaXinEu"},"content":"* The STUDENT_ID refers to the id corresponding to the student in the list.","lastModifiedDate":"2024-02-29"},{"lineNumber":127,"author":{"gitId":"JiaXinEu"},"content":"* The STUDENT_ID is case-insensitive, must be a String starting with ‘A’ and ending with any letter, with a total length of 9","lastModifiedDate":"2024-02-29"},{"lineNumber":128,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":129,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":130,"author":{"gitId":"-"},"content":"Examples:","lastModifiedDate":"2020-05-23"},{"lineNumber":131,"author":{"gitId":"JiaXinEu"},"content":"* `delete A0123456X` deletes the student with student id A0123456X from the list.","lastModifiedDate":"2024-02-29"},{"lineNumber":132,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":133,"author":{"gitId":"-"},"content":"### Clearing all entries : `clear`","lastModifiedDate":"2020-05-23"},{"lineNumber":134,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":135,"author":{"gitId":"-"},"content":"Clears all entries from the address book.","lastModifiedDate":"2020-05-23"},{"lineNumber":136,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":137,"author":{"gitId":"-"},"content":"Format: `clear`","lastModifiedDate":"2020-05-23"},{"lineNumber":138,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":139,"author":{"gitId":"-"},"content":"### Exiting the program : `exit`","lastModifiedDate":"2020-05-23"},{"lineNumber":140,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":141,"author":{"gitId":"-"},"content":"Exits the program.","lastModifiedDate":"2020-05-23"},{"lineNumber":142,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":143,"author":{"gitId":"-"},"content":"Format: `exit`","lastModifiedDate":"2020-05-23"},{"lineNumber":144,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":145,"author":{"gitId":"-"},"content":"### Saving the data","lastModifiedDate":"2020-05-23"},{"lineNumber":146,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":147,"author":{"gitId":"-"},"content":"AddressBook data are saved in the hard disk automatically after any command that changes the data. There is no need to save manually.","lastModifiedDate":"2020-05-23"},{"lineNumber":148,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":149,"author":{"gitId":"-"},"content":"### Editing the data file","lastModifiedDate":"2021-02-04"},{"lineNumber":150,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2021-02-04"},{"lineNumber":151,"author":{"gitId":"-"},"content":"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.","lastModifiedDate":"2023-09-08"},{"lineNumber":152,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2021-02-04"},{"lineNumber":153,"author":{"gitId":"-"},"content":"\u003cdiv markdown\u003d\"span\" class\u003d\"alert alert-warning\"\u003e:exclamation: **Caution:**","lastModifiedDate":"2021-02-04"},{"lineNumber":154,"author":{"gitId":"-"},"content":"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.\u003cbr\u003e","lastModifiedDate":"2024-02-09"},{"lineNumber":155,"author":{"gitId":"-"},"content":"Furthermore, certain edits can cause the AddressBook to behave in unexpected ways (e.g., if a value entered is outside of the acceptable range). Therefore, edit the data file only if you are confident that you can update it correctly.","lastModifiedDate":"2024-02-09"},{"lineNumber":156,"author":{"gitId":"-"},"content":"\u003c/div\u003e","lastModifiedDate":"2021-02-04"},{"lineNumber":157,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2021-02-04"},{"lineNumber":158,"author":{"gitId":"-"},"content":"### Archiving data files `[coming in v2.0]`","lastModifiedDate":"2020-05-23"},{"lineNumber":159,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":160,"author":{"gitId":"-"},"content":"_Details coming soon ..._","lastModifiedDate":"2021-02-04"},{"lineNumber":161,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":162,"author":{"gitId":"-"},"content":"--------------------------------------------------------------------------------------------------------------------","lastModifiedDate":"2020-05-23"},{"lineNumber":163,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":164,"author":{"gitId":"-"},"content":"## FAQ","lastModifiedDate":"2020-05-23"},{"lineNumber":165,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":166,"author":{"gitId":"-"},"content":"**Q**: How do I transfer my data to another Computer?\u003cbr\u003e","lastModifiedDate":"2020-05-23"},{"lineNumber":167,"author":{"gitId":"-"},"content":"**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.","lastModifiedDate":"2020-05-23"},{"lineNumber":168,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":169,"author":{"gitId":"-"},"content":"--------------------------------------------------------------------------------------------------------------------","lastModifiedDate":"2020-05-23"},{"lineNumber":170,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":171,"author":{"gitId":"-"},"content":"## Known issues","lastModifiedDate":"2023-09-08"},{"lineNumber":172,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2023-09-08"},{"lineNumber":173,"author":{"gitId":"-"},"content":"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.","lastModifiedDate":"2023-09-08"},{"lineNumber":174,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2023-09-08"},{"lineNumber":175,"author":{"gitId":"-"},"content":"--------------------------------------------------------------------------------------------------------------------","lastModifiedDate":"2023-09-08"},{"lineNumber":176,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2023-09-08"},{"lineNumber":177,"author":{"gitId":"-"},"content":"## Command summary","lastModifiedDate":"2020-05-23"},{"lineNumber":178,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":179,"author":{"gitId":"yashma-sonara"},"content":"| Action | Format, Examples |","lastModifiedDate":"2024-02-29"},{"lineNumber":180,"author":{"gitId":"yashma-sonara"},"content":"|------------|--------------------------------------------------------------------------------------------------------------------------|","lastModifiedDate":"2024-02-29"},{"lineNumber":181,"author":{"gitId":"Wongqingyee"},"content":"| **Add** | `add id/STUDENT_ID n/NAME e/EMAIL g/GRADE [t/TAG]​​` \u003cbr\u003e e.g., `add id/A01234567X n/James Ho e/e0123456@u.nus.edu g/B+` |","lastModifiedDate":"2024-02-29"},{"lineNumber":182,"author":{"gitId":"yashma-sonara"},"content":"| **Delete** | `delete id/STUDENT_ID`\u003cbr\u003e e.g., `delete A01234567X` |","lastModifiedDate":"2024-02-29"},{"lineNumber":183,"author":{"gitId":"yashma-sonara"},"content":"| **Edit** | `edit id/STUDENT_ID [g/GRADE] `\u003cbr\u003e e.g.,`edit A0123466C g/A+` |","lastModifiedDate":"2024-02-29"},{"lineNumber":184,"author":{"gitId":"JiaXinEu"},"content":"| **View** | `view id/STUDENT_ID`\u003cbr\u003e e.g., `view A0123466D` |","lastModifiedDate":"2024-02-29"},{"lineNumber":185,"author":{"gitId":"yashma-sonara"},"content":"| **Group** | `group id/STUDENT_ID_1 [id/STUDENT_ID_2] …` \u003cbr\u003e e.g., `group A1234567R, A2345678R` |","lastModifiedDate":"2024-02-29"}],"authorContributionMap":{"yashma-sonara":15,"Wongqingyee":12,"JiaXinEu":11,"-":140,"ronnnnnnnnn":7}},{"path":"docs/_sass/minima/_base.scss","fileType":"other","lines":[{"lineNumber":1,"author":{"gitId":"-"},"content":"html {","lastModifiedDate":"2020-05-23"},{"lineNumber":2,"author":{"gitId":"-"},"content":" font-size: $base-font-size;","lastModifiedDate":"2020-05-23"},{"lineNumber":3,"author":{"gitId":"-"},"content":"}","lastModifiedDate":"2020-05-23"},{"lineNumber":4,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":5,"author":{"gitId":"-"},"content":"/**","lastModifiedDate":"2020-05-23"},{"lineNumber":6,"author":{"gitId":"-"},"content":" * Reset some basic elements","lastModifiedDate":"2020-05-23"},{"lineNumber":7,"author":{"gitId":"-"},"content":" */","lastModifiedDate":"2020-05-23"},{"lineNumber":8,"author":{"gitId":"-"},"content":"body, h1, h2, h3, h4, h5, h6,","lastModifiedDate":"2020-05-23"},{"lineNumber":9,"author":{"gitId":"-"},"content":"p, blockquote, pre, hr,","lastModifiedDate":"2020-05-23"},{"lineNumber":10,"author":{"gitId":"-"},"content":"dl, dd, ol, ul, figure {","lastModifiedDate":"2020-05-23"},{"lineNumber":11,"author":{"gitId":"-"},"content":" margin: 0;","lastModifiedDate":"2020-05-23"},{"lineNumber":12,"author":{"gitId":"-"},"content":" padding: 0;","lastModifiedDate":"2020-05-23"},{"lineNumber":13,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":14,"author":{"gitId":"-"},"content":"}","lastModifiedDate":"2020-05-23"},{"lineNumber":15,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":16,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":17,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":18,"author":{"gitId":"-"},"content":"/**","lastModifiedDate":"2020-05-23"},{"lineNumber":19,"author":{"gitId":"-"},"content":" * Basic styling","lastModifiedDate":"2020-05-23"},{"lineNumber":20,"author":{"gitId":"-"},"content":" */","lastModifiedDate":"2020-05-23"},{"lineNumber":21,"author":{"gitId":"-"},"content":"body {","lastModifiedDate":"2020-05-23"},{"lineNumber":22,"author":{"gitId":"-"},"content":" font: $base-font-weight #{$base-font-size}/#{$base-line-height} $base-font-family;","lastModifiedDate":"2020-05-23"},{"lineNumber":23,"author":{"gitId":"-"},"content":" color: $text-color;","lastModifiedDate":"2020-05-23"},{"lineNumber":24,"author":{"gitId":"-"},"content":" background-color: $background-color;","lastModifiedDate":"2020-05-23"},{"lineNumber":25,"author":{"gitId":"-"},"content":" -webkit-text-size-adjust: 100%;","lastModifiedDate":"2020-05-23"},{"lineNumber":26,"author":{"gitId":"-"},"content":" -webkit-font-feature-settings: \"kern\" 1;","lastModifiedDate":"2020-05-23"},{"lineNumber":27,"author":{"gitId":"-"},"content":" -moz-font-feature-settings: \"kern\" 1;","lastModifiedDate":"2020-05-23"},{"lineNumber":28,"author":{"gitId":"-"},"content":" -o-font-feature-settings: \"kern\" 1;","lastModifiedDate":"2020-05-23"},{"lineNumber":29,"author":{"gitId":"-"},"content":" font-feature-settings: \"kern\" 1;","lastModifiedDate":"2020-05-23"},{"lineNumber":30,"author":{"gitId":"-"},"content":" font-kerning: normal;","lastModifiedDate":"2020-05-23"},{"lineNumber":31,"author":{"gitId":"-"},"content":" display: flex;","lastModifiedDate":"2020-05-23"},{"lineNumber":32,"author":{"gitId":"-"},"content":" min-height: 100vh;","lastModifiedDate":"2020-05-23"},{"lineNumber":33,"author":{"gitId":"-"},"content":" flex-direction: column;","lastModifiedDate":"2020-05-23"},{"lineNumber":34,"author":{"gitId":"-"},"content":" overflow-wrap: break-word;","lastModifiedDate":"2020-05-23"},{"lineNumber":35,"author":{"gitId":"-"},"content":"}","lastModifiedDate":"2020-05-23"},{"lineNumber":36,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":37,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":38,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":39,"author":{"gitId":"-"},"content":"/**","lastModifiedDate":"2020-05-23"},{"lineNumber":40,"author":{"gitId":"-"},"content":" * Set `margin-bottom` to maintain vertical rhythm","lastModifiedDate":"2020-05-23"},{"lineNumber":41,"author":{"gitId":"-"},"content":" */","lastModifiedDate":"2020-05-23"},{"lineNumber":42,"author":{"gitId":"-"},"content":"h1, h2, h3, h4, h5, h6,","lastModifiedDate":"2020-05-23"},{"lineNumber":43,"author":{"gitId":"-"},"content":"p, blockquote, pre,","lastModifiedDate":"2020-05-23"},{"lineNumber":44,"author":{"gitId":"-"},"content":"ul, ol, dl, figure,","lastModifiedDate":"2020-05-23"},{"lineNumber":45,"author":{"gitId":"-"},"content":"%vertical-rhythm {","lastModifiedDate":"2020-05-23"},{"lineNumber":46,"author":{"gitId":"-"},"content":" margin-bottom: $spacing-unit / 2;","lastModifiedDate":"2020-05-23"},{"lineNumber":47,"author":{"gitId":"-"},"content":"}","lastModifiedDate":"2020-05-23"},{"lineNumber":48,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":49,"author":{"gitId":"-"},"content":"hr {","lastModifiedDate":"2020-05-23"},{"lineNumber":50,"author":{"gitId":"-"},"content":" margin-top: $spacing-unit;","lastModifiedDate":"2020-05-23"},{"lineNumber":51,"author":{"gitId":"-"},"content":" margin-bottom: $spacing-unit;","lastModifiedDate":"2020-05-23"},{"lineNumber":52,"author":{"gitId":"-"},"content":"}","lastModifiedDate":"2020-05-23"},{"lineNumber":53,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":54,"author":{"gitId":"-"},"content":"/**","lastModifiedDate":"2020-05-23"},{"lineNumber":55,"author":{"gitId":"-"},"content":" * `main` element","lastModifiedDate":"2020-05-23"},{"lineNumber":56,"author":{"gitId":"-"},"content":" */","lastModifiedDate":"2020-05-23"},{"lineNumber":57,"author":{"gitId":"-"},"content":"main {","lastModifiedDate":"2020-05-23"},{"lineNumber":58,"author":{"gitId":"-"},"content":" display: block; /* Default value of `display` of `main` element is \u0027inline\u0027 in IE 11. */","lastModifiedDate":"2020-05-23"},{"lineNumber":59,"author":{"gitId":"-"},"content":"}","lastModifiedDate":"2020-05-23"},{"lineNumber":60,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":61,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":62,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":63,"author":{"gitId":"-"},"content":"/**","lastModifiedDate":"2020-05-23"},{"lineNumber":64,"author":{"gitId":"-"},"content":" * Images","lastModifiedDate":"2020-05-23"},{"lineNumber":65,"author":{"gitId":"-"},"content":" */","lastModifiedDate":"2020-05-23"},{"lineNumber":66,"author":{"gitId":"-"},"content":"img {","lastModifiedDate":"2020-05-23"},{"lineNumber":67,"author":{"gitId":"-"},"content":" max-width: 100%;","lastModifiedDate":"2020-05-23"},{"lineNumber":68,"author":{"gitId":"-"},"content":" vertical-align: middle;","lastModifiedDate":"2020-05-23"},{"lineNumber":69,"author":{"gitId":"-"},"content":"}","lastModifiedDate":"2020-05-23"},{"lineNumber":70,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":71,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":72,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":73,"author":{"gitId":"-"},"content":"/**","lastModifiedDate":"2020-05-23"},{"lineNumber":74,"author":{"gitId":"-"},"content":" * Figures","lastModifiedDate":"2020-05-23"},{"lineNumber":75,"author":{"gitId":"-"},"content":" */","lastModifiedDate":"2020-05-23"},{"lineNumber":76,"author":{"gitId":"-"},"content":"figure \u003e img {","lastModifiedDate":"2020-05-23"},{"lineNumber":77,"author":{"gitId":"-"},"content":" display: block;","lastModifiedDate":"2020-05-23"},{"lineNumber":78,"author":{"gitId":"-"},"content":"}","lastModifiedDate":"2020-05-23"},{"lineNumber":79,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":80,"author":{"gitId":"-"},"content":"figcaption {","lastModifiedDate":"2020-05-23"},{"lineNumber":81,"author":{"gitId":"-"},"content":" font-size: $small-font-size;","lastModifiedDate":"2020-05-23"},{"lineNumber":82,"author":{"gitId":"-"},"content":"}","lastModifiedDate":"2020-05-23"},{"lineNumber":83,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":84,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":85,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":86,"author":{"gitId":"-"},"content":"/**","lastModifiedDate":"2020-05-23"},{"lineNumber":87,"author":{"gitId":"-"},"content":" * Lists","lastModifiedDate":"2020-05-23"},{"lineNumber":88,"author":{"gitId":"-"},"content":" */","lastModifiedDate":"2020-05-23"},{"lineNumber":89,"author":{"gitId":"-"},"content":"ul, ol {","lastModifiedDate":"2020-05-23"},{"lineNumber":90,"author":{"gitId":"-"},"content":" margin-left: $spacing-unit;","lastModifiedDate":"2020-05-23"},{"lineNumber":91,"author":{"gitId":"-"},"content":"}","lastModifiedDate":"2020-05-23"},{"lineNumber":92,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":93,"author":{"gitId":"-"},"content":"li {","lastModifiedDate":"2020-05-23"},{"lineNumber":94,"author":{"gitId":"-"},"content":" \u003e ul,","lastModifiedDate":"2020-05-23"},{"lineNumber":95,"author":{"gitId":"-"},"content":" \u003e ol {","lastModifiedDate":"2020-05-23"},{"lineNumber":96,"author":{"gitId":"-"},"content":" margin-bottom: 0;","lastModifiedDate":"2020-05-23"},{"lineNumber":97,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2020-05-23"},{"lineNumber":98,"author":{"gitId":"-"},"content":"}","lastModifiedDate":"2020-05-23"},{"lineNumber":99,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":100,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":101,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":102,"author":{"gitId":"-"},"content":"/**","lastModifiedDate":"2020-05-23"},{"lineNumber":103,"author":{"gitId":"-"},"content":" * Headings","lastModifiedDate":"2020-05-23"},{"lineNumber":104,"author":{"gitId":"-"},"content":" */","lastModifiedDate":"2020-05-23"},{"lineNumber":105,"author":{"gitId":"-"},"content":"h1, h2, h3, h4, h5, h6 {","lastModifiedDate":"2020-05-23"},{"lineNumber":106,"author":{"gitId":"-"},"content":" font-weight: $base-font-weight;","lastModifiedDate":"2020-05-23"},{"lineNumber":107,"author":{"gitId":"-"},"content":"}","lastModifiedDate":"2020-05-23"},{"lineNumber":108,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":109,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":110,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":111,"author":{"gitId":"-"},"content":"/**","lastModifiedDate":"2020-05-23"},{"lineNumber":112,"author":{"gitId":"-"},"content":" * Links","lastModifiedDate":"2020-05-23"},{"lineNumber":113,"author":{"gitId":"-"},"content":" */","lastModifiedDate":"2020-05-23"},{"lineNumber":114,"author":{"gitId":"-"},"content":"a {","lastModifiedDate":"2020-05-23"},{"lineNumber":115,"author":{"gitId":"-"},"content":" color: $link-base-color;","lastModifiedDate":"2020-05-23"},{"lineNumber":116,"author":{"gitId":"-"},"content":" text-decoration: none;","lastModifiedDate":"2020-05-23"},{"lineNumber":117,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":118,"author":{"gitId":"-"},"content":" \u0026:visited {","lastModifiedDate":"2020-05-23"},{"lineNumber":119,"author":{"gitId":"-"},"content":" color: $link-visited-color;","lastModifiedDate":"2020-05-23"},{"lineNumber":120,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2020-05-23"},{"lineNumber":121,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":122,"author":{"gitId":"-"},"content":" \u0026:hover {","lastModifiedDate":"2020-05-23"},{"lineNumber":123,"author":{"gitId":"-"},"content":" color: $text-color;","lastModifiedDate":"2020-05-23"},{"lineNumber":124,"author":{"gitId":"-"},"content":" text-decoration: underline;","lastModifiedDate":"2020-05-23"},{"lineNumber":125,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2020-05-23"},{"lineNumber":126,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":127,"author":{"gitId":"-"},"content":" .social-media-list \u0026:hover {","lastModifiedDate":"2020-05-23"},{"lineNumber":128,"author":{"gitId":"-"},"content":" text-decoration: none;","lastModifiedDate":"2020-05-23"},{"lineNumber":129,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":130,"author":{"gitId":"-"},"content":" .username {","lastModifiedDate":"2020-05-23"},{"lineNumber":131,"author":{"gitId":"-"},"content":" text-decoration: underline;","lastModifiedDate":"2020-05-23"},{"lineNumber":132,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2020-05-23"},{"lineNumber":133,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2020-05-23"},{"lineNumber":134,"author":{"gitId":"-"},"content":"}","lastModifiedDate":"2020-05-23"},{"lineNumber":135,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":136,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":137,"author":{"gitId":"-"},"content":"/**","lastModifiedDate":"2020-05-23"},{"lineNumber":138,"author":{"gitId":"-"},"content":" * Blockquotes","lastModifiedDate":"2020-05-23"},{"lineNumber":139,"author":{"gitId":"-"},"content":" */","lastModifiedDate":"2020-05-23"},{"lineNumber":140,"author":{"gitId":"-"},"content":"blockquote {","lastModifiedDate":"2020-05-23"},{"lineNumber":141,"author":{"gitId":"-"},"content":" color: $brand-color;","lastModifiedDate":"2020-05-23"},{"lineNumber":142,"author":{"gitId":"-"},"content":" border-left: 4px solid $brand-color-light;","lastModifiedDate":"2020-05-23"},{"lineNumber":143,"author":{"gitId":"-"},"content":" padding-left: $spacing-unit / 2;","lastModifiedDate":"2020-05-23"},{"lineNumber":144,"author":{"gitId":"-"},"content":" @include relative-font-size(1.125);","lastModifiedDate":"2020-05-23"},{"lineNumber":145,"author":{"gitId":"-"},"content":" font-style: italic;","lastModifiedDate":"2020-05-23"},{"lineNumber":146,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":147,"author":{"gitId":"-"},"content":" \u003e :last-child {","lastModifiedDate":"2020-05-23"},{"lineNumber":148,"author":{"gitId":"-"},"content":" margin-bottom: 0;","lastModifiedDate":"2020-05-23"},{"lineNumber":149,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2020-05-23"},{"lineNumber":150,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":151,"author":{"gitId":"-"},"content":" i, em {","lastModifiedDate":"2020-05-23"},{"lineNumber":152,"author":{"gitId":"-"},"content":" font-style: normal;","lastModifiedDate":"2020-05-23"},{"lineNumber":153,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2020-05-23"},{"lineNumber":154,"author":{"gitId":"-"},"content":"}","lastModifiedDate":"2020-05-23"},{"lineNumber":155,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":156,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":157,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":158,"author":{"gitId":"-"},"content":"/**","lastModifiedDate":"2020-05-23"},{"lineNumber":159,"author":{"gitId":"-"},"content":" * Code formatting","lastModifiedDate":"2020-05-23"},{"lineNumber":160,"author":{"gitId":"-"},"content":" */","lastModifiedDate":"2020-05-23"},{"lineNumber":161,"author":{"gitId":"-"},"content":"pre,","lastModifiedDate":"2020-05-23"},{"lineNumber":162,"author":{"gitId":"-"},"content":"code {","lastModifiedDate":"2020-05-23"},{"lineNumber":163,"author":{"gitId":"-"},"content":" font-family: $code-font-family;","lastModifiedDate":"2020-05-23"},{"lineNumber":164,"author":{"gitId":"-"},"content":" font-size: 0.9375em;","lastModifiedDate":"2020-05-23"},{"lineNumber":165,"author":{"gitId":"-"},"content":" border: 1px solid $brand-color-light;","lastModifiedDate":"2020-05-23"},{"lineNumber":166,"author":{"gitId":"-"},"content":" border-radius: 3px;","lastModifiedDate":"2020-05-23"},{"lineNumber":167,"author":{"gitId":"-"},"content":" background-color: $code-background-color;","lastModifiedDate":"2020-05-23"},{"lineNumber":168,"author":{"gitId":"-"},"content":"}","lastModifiedDate":"2020-05-23"},{"lineNumber":169,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":170,"author":{"gitId":"-"},"content":"code {","lastModifiedDate":"2020-05-23"},{"lineNumber":171,"author":{"gitId":"-"},"content":" padding: 1px 5px;","lastModifiedDate":"2020-05-23"},{"lineNumber":172,"author":{"gitId":"-"},"content":"}","lastModifiedDate":"2020-05-23"},{"lineNumber":173,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":174,"author":{"gitId":"-"},"content":"pre {","lastModifiedDate":"2020-05-23"},{"lineNumber":175,"author":{"gitId":"-"},"content":" padding: 8px 12px;","lastModifiedDate":"2020-05-23"},{"lineNumber":176,"author":{"gitId":"-"},"content":" overflow-x: auto;","lastModifiedDate":"2020-05-23"},{"lineNumber":177,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":178,"author":{"gitId":"-"},"content":" \u003e code {","lastModifiedDate":"2020-05-23"},{"lineNumber":179,"author":{"gitId":"-"},"content":" border: 0;","lastModifiedDate":"2020-05-23"},{"lineNumber":180,"author":{"gitId":"-"},"content":" padding-right: 0;","lastModifiedDate":"2020-05-23"},{"lineNumber":181,"author":{"gitId":"-"},"content":" padding-left: 0;","lastModifiedDate":"2020-05-23"},{"lineNumber":182,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2020-05-23"},{"lineNumber":183,"author":{"gitId":"-"},"content":"}","lastModifiedDate":"2020-05-23"},{"lineNumber":184,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":185,"author":{"gitId":"-"},"content":".highlight {","lastModifiedDate":"2020-05-23"},{"lineNumber":186,"author":{"gitId":"-"},"content":" border-radius: 3px;","lastModifiedDate":"2020-05-23"},{"lineNumber":187,"author":{"gitId":"-"},"content":" background: $code-background-color;","lastModifiedDate":"2020-05-23"},{"lineNumber":188,"author":{"gitId":"-"},"content":" @extend %vertical-rhythm;","lastModifiedDate":"2020-05-23"},{"lineNumber":189,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":190,"author":{"gitId":"-"},"content":" .highlighter-rouge \u0026 {","lastModifiedDate":"2020-05-23"},{"lineNumber":191,"author":{"gitId":"-"},"content":" background: $code-background-color;","lastModifiedDate":"2020-05-23"},{"lineNumber":192,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2020-05-23"},{"lineNumber":193,"author":{"gitId":"-"},"content":"}","lastModifiedDate":"2020-05-23"},{"lineNumber":194,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":195,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":196,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":197,"author":{"gitId":"-"},"content":"/**","lastModifiedDate":"2020-05-23"},{"lineNumber":198,"author":{"gitId":"-"},"content":" * Wrapper","lastModifiedDate":"2020-05-23"},{"lineNumber":199,"author":{"gitId":"-"},"content":" */","lastModifiedDate":"2020-05-23"},{"lineNumber":200,"author":{"gitId":"-"},"content":".wrapper {","lastModifiedDate":"2020-05-23"},{"lineNumber":201,"author":{"gitId":"-"},"content":" max-width: calc(#{$content-width} - (#{$spacing-unit}));","lastModifiedDate":"2020-05-23"},{"lineNumber":202,"author":{"gitId":"-"},"content":" margin-right: auto;","lastModifiedDate":"2020-05-23"},{"lineNumber":203,"author":{"gitId":"-"},"content":" margin-left: auto;","lastModifiedDate":"2020-05-23"},{"lineNumber":204,"author":{"gitId":"-"},"content":" padding-right: $spacing-unit / 2;","lastModifiedDate":"2020-05-23"},{"lineNumber":205,"author":{"gitId":"-"},"content":" padding-left: $spacing-unit / 2;","lastModifiedDate":"2020-05-23"},{"lineNumber":206,"author":{"gitId":"-"},"content":" @extend %clearfix;","lastModifiedDate":"2020-05-23"},{"lineNumber":207,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":208,"author":{"gitId":"-"},"content":" @media screen and (min-width: $on-large) {","lastModifiedDate":"2020-05-23"},{"lineNumber":209,"author":{"gitId":"-"},"content":" max-width: calc(#{$content-width} - (#{$spacing-unit} * 2));","lastModifiedDate":"2020-05-23"},{"lineNumber":210,"author":{"gitId":"-"},"content":" padding-right: $spacing-unit;","lastModifiedDate":"2020-05-23"},{"lineNumber":211,"author":{"gitId":"-"},"content":" padding-left: $spacing-unit;","lastModifiedDate":"2020-05-23"},{"lineNumber":212,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2020-05-23"},{"lineNumber":213,"author":{"gitId":"-"},"content":"}","lastModifiedDate":"2020-05-23"},{"lineNumber":214,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":215,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":216,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":217,"author":{"gitId":"-"},"content":"/**","lastModifiedDate":"2020-05-23"},{"lineNumber":218,"author":{"gitId":"-"},"content":" * Clearfix","lastModifiedDate":"2020-05-23"},{"lineNumber":219,"author":{"gitId":"-"},"content":" */","lastModifiedDate":"2020-05-23"},{"lineNumber":220,"author":{"gitId":"-"},"content":"%clearfix:after {","lastModifiedDate":"2020-05-23"},{"lineNumber":221,"author":{"gitId":"-"},"content":" content: \"\";","lastModifiedDate":"2020-05-23"},{"lineNumber":222,"author":{"gitId":"-"},"content":" display: table;","lastModifiedDate":"2020-05-23"},{"lineNumber":223,"author":{"gitId":"-"},"content":" clear: both;","lastModifiedDate":"2020-05-23"},{"lineNumber":224,"author":{"gitId":"-"},"content":"}","lastModifiedDate":"2020-05-23"},{"lineNumber":225,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":226,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":227,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":228,"author":{"gitId":"-"},"content":"/**","lastModifiedDate":"2020-05-23"},{"lineNumber":229,"author":{"gitId":"-"},"content":" * Icons","lastModifiedDate":"2020-05-23"},{"lineNumber":230,"author":{"gitId":"-"},"content":" */","lastModifiedDate":"2020-05-23"},{"lineNumber":231,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":232,"author":{"gitId":"-"},"content":".orange {","lastModifiedDate":"2020-05-23"},{"lineNumber":233,"author":{"gitId":"-"},"content":" color: #f66a0a;","lastModifiedDate":"2020-05-23"},{"lineNumber":234,"author":{"gitId":"-"},"content":"}","lastModifiedDate":"2020-05-23"},{"lineNumber":235,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":236,"author":{"gitId":"-"},"content":".grey {","lastModifiedDate":"2020-05-23"},{"lineNumber":237,"author":{"gitId":"-"},"content":" color: #828282;","lastModifiedDate":"2020-05-23"},{"lineNumber":238,"author":{"gitId":"-"},"content":"}","lastModifiedDate":"2020-05-23"},{"lineNumber":239,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":240,"author":{"gitId":"-"},"content":"/**","lastModifiedDate":"2020-05-23"},{"lineNumber":241,"author":{"gitId":"-"},"content":" * Tables","lastModifiedDate":"2020-05-23"},{"lineNumber":242,"author":{"gitId":"-"},"content":" */","lastModifiedDate":"2020-05-23"},{"lineNumber":243,"author":{"gitId":"-"},"content":"table {","lastModifiedDate":"2020-05-23"},{"lineNumber":244,"author":{"gitId":"-"},"content":" margin-bottom: $spacing-unit;","lastModifiedDate":"2020-05-23"},{"lineNumber":245,"author":{"gitId":"-"},"content":" width: 100%;","lastModifiedDate":"2020-05-23"},{"lineNumber":246,"author":{"gitId":"-"},"content":" text-align: $table-text-align;","lastModifiedDate":"2020-05-23"},{"lineNumber":247,"author":{"gitId":"-"},"content":" color: $table-text-color;","lastModifiedDate":"2020-05-23"},{"lineNumber":248,"author":{"gitId":"-"},"content":" border-collapse: collapse;","lastModifiedDate":"2020-05-23"},{"lineNumber":249,"author":{"gitId":"-"},"content":" border: 1px solid $table-border-color;","lastModifiedDate":"2020-05-23"},{"lineNumber":250,"author":{"gitId":"-"},"content":" tr {","lastModifiedDate":"2020-05-23"},{"lineNumber":251,"author":{"gitId":"-"},"content":" \u0026:nth-child(even) {","lastModifiedDate":"2020-05-23"},{"lineNumber":252,"author":{"gitId":"-"},"content":" background-color: $table-zebra-color;","lastModifiedDate":"2020-05-23"},{"lineNumber":253,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2020-05-23"},{"lineNumber":254,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2020-05-23"},{"lineNumber":255,"author":{"gitId":"-"},"content":" th, td {","lastModifiedDate":"2020-05-23"},{"lineNumber":256,"author":{"gitId":"-"},"content":" padding: ($spacing-unit / 3) ($spacing-unit / 2);","lastModifiedDate":"2020-05-23"},{"lineNumber":257,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2020-05-23"},{"lineNumber":258,"author":{"gitId":"-"},"content":" th {","lastModifiedDate":"2020-05-23"},{"lineNumber":259,"author":{"gitId":"-"},"content":" background-color: $table-header-bg-color;","lastModifiedDate":"2020-05-23"},{"lineNumber":260,"author":{"gitId":"-"},"content":" border: 1px solid $table-header-border;","lastModifiedDate":"2020-05-23"},{"lineNumber":261,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2020-05-23"},{"lineNumber":262,"author":{"gitId":"-"},"content":" td {","lastModifiedDate":"2020-05-23"},{"lineNumber":263,"author":{"gitId":"-"},"content":" border: 1px solid $table-border-color;","lastModifiedDate":"2020-05-23"},{"lineNumber":264,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2020-05-23"},{"lineNumber":265,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":266,"author":{"gitId":"-"},"content":" @include media-query($on-laptop) {","lastModifiedDate":"2020-05-23"},{"lineNumber":267,"author":{"gitId":"-"},"content":" display: block;","lastModifiedDate":"2020-05-23"},{"lineNumber":268,"author":{"gitId":"-"},"content":" overflow-x: auto;","lastModifiedDate":"2020-05-23"},{"lineNumber":269,"author":{"gitId":"-"},"content":" -webkit-overflow-scrolling: touch;","lastModifiedDate":"2020-05-23"},{"lineNumber":270,"author":{"gitId":"-"},"content":" -ms-overflow-style: -ms-autohiding-scrollbar;","lastModifiedDate":"2020-05-23"},{"lineNumber":271,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2020-05-23"},{"lineNumber":272,"author":{"gitId":"-"},"content":"}","lastModifiedDate":"2020-05-23"},{"lineNumber":273,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2021-01-11"},{"lineNumber":274,"author":{"gitId":"-"},"content":"@media print {","lastModifiedDate":"2021-01-12"},{"lineNumber":275,"author":{"gitId":"-"},"content":" /**","lastModifiedDate":"2021-01-11"},{"lineNumber":276,"author":{"gitId":"-"},"content":" * Prevents page break from cutting through content when printing","lastModifiedDate":"2021-01-12"},{"lineNumber":277,"author":{"gitId":"-"},"content":" */","lastModifiedDate":"2021-01-11"},{"lineNumber":278,"author":{"gitId":"-"},"content":" body {","lastModifiedDate":"2021-01-11"},{"lineNumber":279,"author":{"gitId":"-"},"content":" display: block;","lastModifiedDate":"2021-01-11"},{"lineNumber":280,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2021-01-11"},{"lineNumber":281,"author":{"gitId":"-"},"content":" /**","lastModifiedDate":"2021-01-12"},{"lineNumber":282,"author":{"gitId":"-"},"content":" * Replaces the top navigation menu with the project name when printing","lastModifiedDate":"2021-01-12"},{"lineNumber":283,"author":{"gitId":"-"},"content":" */","lastModifiedDate":"2021-01-12"},{"lineNumber":284,"author":{"gitId":"-"},"content":" .site-header .wrapper {","lastModifiedDate":"2021-01-12"},{"lineNumber":285,"author":{"gitId":"-"},"content":" display: none;","lastModifiedDate":"2021-01-12"},{"lineNumber":286,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2021-01-12"},{"lineNumber":287,"author":{"gitId":"-"},"content":" .site-header {","lastModifiedDate":"2021-01-12"},{"lineNumber":288,"author":{"gitId":"-"},"content":" text-align: center;","lastModifiedDate":"2021-01-12"},{"lineNumber":289,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2021-01-12"},{"lineNumber":290,"author":{"gitId":"-"},"content":" .site-header:before {","lastModifiedDate":"2021-01-12"},{"lineNumber":291,"author":{"gitId":"Wongqingyee"},"content":" content: \"TeachStack\";","lastModifiedDate":"2024-02-29"},{"lineNumber":292,"author":{"gitId":"-"},"content":" font-size: 32px;","lastModifiedDate":"2021-01-12"},{"lineNumber":293,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2021-01-11"},{"lineNumber":294,"author":{"gitId":"-"},"content":"}","lastModifiedDate":"2021-01-12"},{"lineNumber":295,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2021-01-12"}],"authorContributionMap":{"Wongqingyee":1,"-":294}},{"path":"docs/team/jiaxineu.md","fileType":"docs","lines":[{"lineNumber":1,"author":{"gitId":"JiaXinEu"},"content":"---","lastModifiedDate":"2024-02-29"},{"lineNumber":2,"author":{"gitId":"JiaXinEu"},"content":"layout: page","lastModifiedDate":"2024-02-29"},{"lineNumber":3,"author":{"gitId":"JiaXinEu"},"content":"title: Jia Xin Eu\u0027s Project Portfolio Page","lastModifiedDate":"2024-02-29"},{"lineNumber":4,"author":{"gitId":"JiaXinEu"},"content":"---","lastModifiedDate":"2024-02-29"},{"lineNumber":5,"author":{"gitId":"JiaXinEu"},"content":"","lastModifiedDate":"2024-02-29"},{"lineNumber":6,"author":{"gitId":"JiaXinEu"},"content":"### Project: TeachStack","lastModifiedDate":"2024-02-29"},{"lineNumber":7,"author":{"gitId":"JiaXinEu"},"content":"","lastModifiedDate":"2024-02-29"},{"lineNumber":8,"author":{"gitId":"JiaXinEu"},"content":"TeachStack 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.","lastModifiedDate":"2024-02-29"},{"lineNumber":9,"author":{"gitId":"JiaXinEu"},"content":"","lastModifiedDate":"2024-02-29"},{"lineNumber":10,"author":{"gitId":"JiaXinEu"},"content":"Given below are my contributions to the project.","lastModifiedDate":"2024-02-29"},{"lineNumber":11,"author":{"gitId":"JiaXinEu"},"content":"","lastModifiedDate":"2024-02-29"},{"lineNumber":12,"author":{"gitId":"JiaXinEu"},"content":"* **New Feature**:","lastModifiedDate":"2024-02-29"},{"lineNumber":13,"author":{"gitId":"JiaXinEu"},"content":"* **Code contributed**:","lastModifiedDate":"2024-02-29"},{"lineNumber":14,"author":{"gitId":"JiaXinEu"},"content":"* **Project management**:","lastModifiedDate":"2024-02-29"},{"lineNumber":15,"author":{"gitId":"JiaXinEu"},"content":"* **Enhancements to existing features**:","lastModifiedDate":"2024-02-29"},{"lineNumber":16,"author":{"gitId":"JiaXinEu"},"content":"* **Documentation**:","lastModifiedDate":"2024-02-29"},{"lineNumber":17,"author":{"gitId":"JiaXinEu"},"content":"* **Community**:","lastModifiedDate":"2024-02-29"},{"lineNumber":18,"author":{"gitId":"JiaXinEu"},"content":"* **Tools**:","lastModifiedDate":"2024-02-29"},{"lineNumber":19,"author":{"gitId":"JiaXinEu"},"content":" * Integrated a new Github plugin (CircleCI) to the team repo","lastModifiedDate":"2024-02-29"}],"authorContributionMap":{"JiaXinEu":19}}] +[{"path":"README.md","fileType":"docs","lines":[{"lineNumber":1,"author":{"gitId":"Wongqingyee"},"content":"[![CI Status](https://github.com/AY2324S2-CS2103T-T09-1/tp/workflows/Java%20CI/badge.svg)](https://github.com/AY2324S2-CS2103T-T09-1/tp/actions)","lastModifiedDate":"2024-02-29"},{"lineNumber":2,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":3,"author":{"gitId":"-"},"content":"[![codecov](https://codecov.io/gh/AY2324S2-CS2103T-T09-1/tp/graph/badge.svg?token\u003d7WFJBKE6LA)](https://codecov.io/gh/AY2324S2-CS2103T-T09-1/tp)","lastModifiedDate":"2024-02-19"},{"lineNumber":4,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2024-02-19"},{"lineNumber":5,"author":{"gitId":"-"},"content":"![Ui](docs/images/Ui.png)","lastModifiedDate":"2020-05-23"},{"lineNumber":6,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":7,"author":{"gitId":"willowisp01"},"content":"* This is **an app for CS instructors that helps manage weaker students**.\u003cbr\u003e","lastModifiedDate":"2024-02-29"},{"lineNumber":8,"author":{"gitId":"willowisp01"},"content":"* The project is based on an ongoing software project for a desktop application (called _AddressBook_) used for managing contact details. We have made several enhancements to it (see example usages).","lastModifiedDate":"2024-02-29"},{"lineNumber":9,"author":{"gitId":"willowisp01"},"content":"","lastModifiedDate":"2024-02-29"},{"lineNumber":10,"author":{"gitId":"willowisp01"},"content":"* Example usages:","lastModifiedDate":"2024-02-29"},{"lineNumber":11,"author":{"gitId":"willowisp01"},"content":" * forming focus groups of weaker students","lastModifiedDate":"2024-02-29"},{"lineNumber":12,"author":{"gitId":"willowisp01"},"content":" * visualising the performance of weaker students over time","lastModifiedDate":"2024-02-29"},{"lineNumber":13,"author":{"gitId":"willowisp01"},"content":" * dedicating tutors and other resources to helping weaker students","lastModifiedDate":"2024-02-29"},{"lineNumber":14,"author":{"gitId":"willowisp01"},"content":"","lastModifiedDate":"2024-02-29"},{"lineNumber":15,"author":{"gitId":"willowisp01"},"content":"* It is **written in OOP fashion**. It provides a **well-written** code base of around 10k LOC.","lastModifiedDate":"2024-02-29"},{"lineNumber":16,"author":{"gitId":"-"},"content":"* It comes with a **reasonable level of user and developer documentation**.","lastModifiedDate":"2020-05-23"},{"lineNumber":17,"author":{"gitId":"willowisp01"},"content":"* It is named **“TeachStack”** as a pun on heap and stack.","lastModifiedDate":"2024-02-29"},{"lineNumber":18,"author":{"gitId":"willowisp01"},"content":"","lastModifiedDate":"2024-02-29"},{"lineNumber":19,"author":{"gitId":"JiaXinEu"},"content":"* For the detailed documentation of this project, see the **[TeachStack Product Website](https://ay2324s2-cs2103t-t09-1.github.io/tp/)**.","lastModifiedDate":"2024-02-29"},{"lineNumber":20,"author":{"gitId":"JiaXinEu"},"content":"* This project is based on the AddressBook-Level3 project created by the [SE-EDU initiative](https://se-education.org).","lastModifiedDate":"2024-02-29"}],"authorContributionMap":{"willowisp01":11,"Wongqingyee":1,"JiaXinEu":2,"-":6}},{"path":"docs/AboutUs.md","fileType":"docs","lines":[{"lineNumber":1,"author":{"gitId":"-"},"content":"---","lastModifiedDate":"2020-05-23"},{"lineNumber":2,"author":{"gitId":"-"},"content":"layout: page","lastModifiedDate":"2020-05-23"},{"lineNumber":3,"author":{"gitId":"-"},"content":"title: About Us","lastModifiedDate":"2020-05-23"},{"lineNumber":4,"author":{"gitId":"-"},"content":"---","lastModifiedDate":"2020-05-23"},{"lineNumber":5,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":6,"author":{"gitId":"-"},"content":"We are a team based in the [School of Computing, National University of Singapore](http://www.comp.nus.edu.sg).","lastModifiedDate":"2020-05-23"},{"lineNumber":7,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":8,"author":{"gitId":"-"},"content":"You can reach us at the email `seer[at]comp.nus.edu.sg`","lastModifiedDate":"2020-06-17"},{"lineNumber":9,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-06-17"},{"lineNumber":10,"author":{"gitId":"-"},"content":"## Project team","lastModifiedDate":"2020-06-07"},{"lineNumber":11,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":12,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2024-02-29"},{"lineNumber":13,"author":{"gitId":"JiaXinEu"},"content":"### Eu Jia Xin","lastModifiedDate":"2024-02-29"},{"lineNumber":14,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":15,"author":{"gitId":"JiaXinEu"},"content":"\u003cimg src\u003d\"images/jiaxineu.png\" width\u003d\"200px\"\u003e","lastModifiedDate":"2024-02-29"},{"lineNumber":16,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":17,"author":{"gitId":"JiaXinEu"},"content":"[[github](https://github.com/JiaXinEu)]","lastModifiedDate":"2024-02-29"},{"lineNumber":18,"author":{"gitId":"JiaXinEu"},"content":"[[portfolio](team/jiaxineu.md)]","lastModifiedDate":"2024-02-29"},{"lineNumber":19,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":20,"author":{"gitId":"-"},"content":"* Role: Project Advisor","lastModifiedDate":"2020-05-23"},{"lineNumber":21,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":22,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":23,"author":{"gitId":"yashma-sonara"},"content":"### Yashma Sonara","lastModifiedDate":"2024-02-29"},{"lineNumber":24,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":25,"author":{"gitId":"yashma-sonara"},"content":"\u003cimg src\u003d\"images/yashma-sonara.png\" width\u003d\"200px\"\u003e","lastModifiedDate":"2024-02-29"},{"lineNumber":26,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":27,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":28,"author":{"gitId":"yashma-sonara"},"content":"[[github](https://github.com/yashma-sonara)]","lastModifiedDate":"2024-02-29"},{"lineNumber":29,"author":{"gitId":"-"},"content":"[[portfolio](team/johndoe.md)]","lastModifiedDate":"2020-05-23"},{"lineNumber":30,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":31,"author":{"gitId":"-"},"content":"* Role: Team Lead","lastModifiedDate":"2020-05-23"},{"lineNumber":32,"author":{"gitId":"-"},"content":"* Responsibilities: UI","lastModifiedDate":"2020-05-23"},{"lineNumber":33,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":34,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":35,"author":{"gitId":"ronnnnnnnnn"},"content":"### Ronn Ng","lastModifiedDate":"2024-02-29"},{"lineNumber":36,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":37,"author":{"gitId":"ronnnnnnnnn"},"content":"\u003cimg src\u003d\"images/ronnnnnnnnn.png\" width\u003d\"200px\"\u003e","lastModifiedDate":"2024-02-29"},{"lineNumber":38,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":39,"author":{"gitId":"ronnnnnnnnn"},"content":"[[github](http://github.com/ronnnnnnnnn)] [[portfolio](team/johndoe.md)]","lastModifiedDate":"2024-02-29"},{"lineNumber":40,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":41,"author":{"gitId":"-"},"content":"* Role: Developer","lastModifiedDate":"2020-05-23"},{"lineNumber":42,"author":{"gitId":"-"},"content":"* Responsibilities: Data","lastModifiedDate":"2020-05-23"},{"lineNumber":43,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":44,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":45,"author":{"gitId":"Wongqingyee"},"content":"### Wong Qing Yee","lastModifiedDate":"2024-02-29"},{"lineNumber":46,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":47,"author":{"gitId":"Wongqingyee"},"content":"\u003cimg src\u003d\"images/wongqingyee.png\" width\u003d\"200px\"\u003e","lastModifiedDate":"2024-02-29"},{"lineNumber":48,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":49,"author":{"gitId":"Wongqingyee"},"content":"[[github](http://github.com/Wongqingyee)]","lastModifiedDate":"2024-02-29"},{"lineNumber":50,"author":{"gitId":"-"},"content":"[[portfolio](team/johndoe.md)]","lastModifiedDate":"2020-05-23"},{"lineNumber":51,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":52,"author":{"gitId":"-"},"content":"* Role: Developer","lastModifiedDate":"2020-05-23"},{"lineNumber":53,"author":{"gitId":"-"},"content":"* Responsibilities: Dev Ops + Threading","lastModifiedDate":"2020-05-23"},{"lineNumber":54,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":55,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":56,"author":{"gitId":"willowisp01"},"content":"### Zhuo En","lastModifiedDate":"2024-02-29"},{"lineNumber":57,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":58,"author":{"gitId":"willowisp01"},"content":"\u003cimg src\u003d\"images/willowisp01.png\" width\u003d\"200px\"\u003e","lastModifiedDate":"2024-02-29"},{"lineNumber":59,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":60,"author":{"gitId":"willowisp01"},"content":"[[github](https://github.com/willowisp01)]","lastModifiedDate":"2024-02-29"},{"lineNumber":61,"author":{"gitId":"-"},"content":"[[portfolio](team/johndoe.md)]","lastModifiedDate":"2020-05-23"},{"lineNumber":62,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":63,"author":{"gitId":"-"},"content":"* Role: Developer","lastModifiedDate":"2020-05-23"},{"lineNumber":64,"author":{"gitId":"-"},"content":"* Responsibilities: UI","lastModifiedDate":"2020-05-23"}],"authorContributionMap":{"yashma-sonara":3,"willowisp01":3,"Wongqingyee":3,"JiaXinEu":4,"-":48,"ronnnnnnnnn":3}},{"path":"docs/DeveloperGuide.md","fileType":"docs","lines":[{"lineNumber":1,"author":{"gitId":"-"},"content":"---","lastModifiedDate":"2020-05-23"},{"lineNumber":2,"author":{"gitId":"-"},"content":"layout: page","lastModifiedDate":"2020-05-23"},{"lineNumber":3,"author":{"gitId":"-"},"content":"title: Developer Guide","lastModifiedDate":"2020-05-23"},{"lineNumber":4,"author":{"gitId":"-"},"content":"---","lastModifiedDate":"2020-05-23"},{"lineNumber":5,"author":{"gitId":"-"},"content":"* Table of Contents","lastModifiedDate":"2020-05-23"},{"lineNumber":6,"author":{"gitId":"-"},"content":"{:toc}","lastModifiedDate":"2020-05-23"},{"lineNumber":7,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":8,"author":{"gitId":"-"},"content":"--------------------------------------------------------------------------------------------------------------------","lastModifiedDate":"2020-05-23"},{"lineNumber":9,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2021-07-30"},{"lineNumber":10,"author":{"gitId":"-"},"content":"## **Acknowledgements**","lastModifiedDate":"2021-07-30"},{"lineNumber":11,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2021-07-30"},{"lineNumber":12,"author":{"gitId":"-"},"content":"* {list here sources of all reused/adapted ideas, code, documentation, and third-party libraries -- include links to the original source as well}","lastModifiedDate":"2021-07-30"},{"lineNumber":13,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2021-07-30"},{"lineNumber":14,"author":{"gitId":"-"},"content":"--------------------------------------------------------------------------------------------------------------------","lastModifiedDate":"2021-07-30"},{"lineNumber":15,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":16,"author":{"gitId":"-"},"content":"## **Setting up, getting started**","lastModifiedDate":"2020-05-23"},{"lineNumber":17,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":18,"author":{"gitId":"-"},"content":"Refer to the guide [_Setting up and getting started_](SettingUp.md).","lastModifiedDate":"2020-05-23"},{"lineNumber":19,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":20,"author":{"gitId":"-"},"content":"--------------------------------------------------------------------------------------------------------------------","lastModifiedDate":"2020-05-23"},{"lineNumber":21,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":22,"author":{"gitId":"-"},"content":"## **Design**","lastModifiedDate":"2020-05-23"},{"lineNumber":23,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":24,"author":{"gitId":"-"},"content":"\u003cdiv markdown\u003d\"span\" class\u003d\"alert alert-primary\"\u003e","lastModifiedDate":"2021-07-31"},{"lineNumber":25,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":26,"author":{"gitId":"-"},"content":":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.","lastModifiedDate":"2023-09-03"},{"lineNumber":27,"author":{"gitId":"-"},"content":"\u003c/div\u003e","lastModifiedDate":"2021-07-31"},{"lineNumber":28,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":29,"author":{"gitId":"-"},"content":"### Architecture","lastModifiedDate":"2021-07-31"},{"lineNumber":30,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":31,"author":{"gitId":"-"},"content":"\u003cimg src\u003d\"images/ArchitectureDiagram.png\" width\u003d\"280\" /\u003e","lastModifiedDate":"2021-07-31"},{"lineNumber":32,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":33,"author":{"gitId":"-"},"content":"The ***Architecture Diagram*** given above explains the high-level design of the App.","lastModifiedDate":"2021-07-31"},{"lineNumber":34,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":35,"author":{"gitId":"-"},"content":"Given below is a quick overview of main components and how they interact with each other.","lastModifiedDate":"2021-07-31"},{"lineNumber":36,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2021-07-31"},{"lineNumber":37,"author":{"gitId":"-"},"content":"**Main components of the architecture**","lastModifiedDate":"2021-07-31"},{"lineNumber":38,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":39,"author":{"gitId":"-"},"content":"**`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.","lastModifiedDate":"2023-09-03"},{"lineNumber":40,"author":{"gitId":"-"},"content":"* At app launch, it initializes the other components in the correct sequence, and connects them up with each other.","lastModifiedDate":"2023-09-03"},{"lineNumber":41,"author":{"gitId":"-"},"content":"* At shut down, it shuts down the other components and invokes cleanup methods where necessary.","lastModifiedDate":"2023-09-03"},{"lineNumber":42,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":43,"author":{"gitId":"-"},"content":"The bulk of the app\u0027s work is done by the following four components:","lastModifiedDate":"2023-09-03"},{"lineNumber":44,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":45,"author":{"gitId":"-"},"content":"* [**`UI`**](#ui-component): The UI of the App.","lastModifiedDate":"2020-05-23"},{"lineNumber":46,"author":{"gitId":"-"},"content":"* [**`Logic`**](#logic-component): The command executor.","lastModifiedDate":"2020-05-23"},{"lineNumber":47,"author":{"gitId":"-"},"content":"* [**`Model`**](#model-component): Holds the data of the App in memory.","lastModifiedDate":"2020-05-23"},{"lineNumber":48,"author":{"gitId":"-"},"content":"* [**`Storage`**](#storage-component): Reads data from, and writes data to, the hard disk.","lastModifiedDate":"2020-05-23"},{"lineNumber":49,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":50,"author":{"gitId":"-"},"content":"[**`Commons`**](#common-classes) represents a collection of classes used by multiple other components.","lastModifiedDate":"2023-09-03"},{"lineNumber":51,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":52,"author":{"gitId":"-"},"content":"**How the architecture components interact with each other**","lastModifiedDate":"2020-05-23"},{"lineNumber":53,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":54,"author":{"gitId":"-"},"content":"The *Sequence Diagram* below shows how the components interact with each other for the scenario where the user issues the command `delete 1`.","lastModifiedDate":"2020-05-23"},{"lineNumber":55,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":56,"author":{"gitId":"-"},"content":"\u003cimg src\u003d\"images/ArchitectureSequenceDiagram.png\" width\u003d\"574\" /\u003e","lastModifiedDate":"2020-06-07"},{"lineNumber":57,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":58,"author":{"gitId":"-"},"content":"Each of the four main components (also shown in the diagram above),","lastModifiedDate":"2021-07-31"},{"lineNumber":59,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2021-07-31"},{"lineNumber":60,"author":{"gitId":"-"},"content":"* defines its *API* in an `interface` with the same name as the Component.","lastModifiedDate":"2021-07-31"},{"lineNumber":61,"author":{"gitId":"-"},"content":"* implements its functionality using a concrete `{Component Name}Manager` class (which follows the corresponding API `interface` mentioned in the previous point.","lastModifiedDate":"2021-07-31"},{"lineNumber":62,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2021-07-31"},{"lineNumber":63,"author":{"gitId":"-"},"content":"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\u0027s being coupled to the implementation of a component), as illustrated in the (partial) class diagram below.","lastModifiedDate":"2021-07-31"},{"lineNumber":64,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2021-07-31"},{"lineNumber":65,"author":{"gitId":"-"},"content":"\u003cimg src\u003d\"images/ComponentManagers.png\" width\u003d\"300\" /\u003e","lastModifiedDate":"2021-07-31"},{"lineNumber":66,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2021-07-31"},{"lineNumber":67,"author":{"gitId":"-"},"content":"The sections below give more details of each component.","lastModifiedDate":"2020-05-23"},{"lineNumber":68,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":69,"author":{"gitId":"-"},"content":"### UI component","lastModifiedDate":"2020-05-23"},{"lineNumber":70,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":71,"author":{"gitId":"-"},"content":"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)","lastModifiedDate":"2021-07-31"},{"lineNumber":72,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":73,"author":{"gitId":"-"},"content":"![Structure of the UI Component](images/UiClassDiagram.png)","lastModifiedDate":"2021-07-31"},{"lineNumber":74,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":75,"author":{"gitId":"-"},"content":"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.","lastModifiedDate":"2021-07-31"},{"lineNumber":76,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":77,"author":{"gitId":"-"},"content":"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)","lastModifiedDate":"2021-07-31"},{"lineNumber":78,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":79,"author":{"gitId":"-"},"content":"The `UI` component,","lastModifiedDate":"2020-05-23"},{"lineNumber":80,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":81,"author":{"gitId":"-"},"content":"* executes user commands using the `Logic` component.","lastModifiedDate":"2021-07-31"},{"lineNumber":82,"author":{"gitId":"-"},"content":"* listens for changes to `Model` data so that the UI can be updated with the modified data.","lastModifiedDate":"2021-07-31"},{"lineNumber":83,"author":{"gitId":"-"},"content":"* keeps a reference to the `Logic` component, because the `UI` relies on the `Logic` to execute commands.","lastModifiedDate":"2021-07-31"},{"lineNumber":84,"author":{"gitId":"-"},"content":"* depends on some classes in the `Model` component, as it displays `Person` object residing in the `Model`.","lastModifiedDate":"2021-07-31"},{"lineNumber":85,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":86,"author":{"gitId":"-"},"content":"### Logic component","lastModifiedDate":"2020-05-23"},{"lineNumber":87,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":88,"author":{"gitId":"-"},"content":"**API** : [`Logic.java`](https://github.com/se-edu/addressbook-level3/tree/master/src/main/java/seedu/address/logic/Logic.java)","lastModifiedDate":"2021-07-31"},{"lineNumber":89,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":90,"author":{"gitId":"-"},"content":"Here\u0027s a (partial) class diagram of the `Logic` component:","lastModifiedDate":"2021-07-31"},{"lineNumber":91,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":92,"author":{"gitId":"-"},"content":"\u003cimg src\u003d\"images/LogicClassDiagram.png\" width\u003d\"550\"/\u003e","lastModifiedDate":"2021-07-31"},{"lineNumber":93,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":94,"author":{"gitId":"-"},"content":"The sequence diagram below illustrates the interactions within the `Logic` component, taking `execute(\"delete 1\")` API call as an example.","lastModifiedDate":"2023-09-03"},{"lineNumber":95,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":96,"author":{"gitId":"-"},"content":"![Interactions Inside the Logic Component for the `delete 1` Command](images/DeleteSequenceDiagram.png)","lastModifiedDate":"2020-05-23"},{"lineNumber":97,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":98,"author":{"gitId":"-"},"content":"\u003cdiv markdown\u003d\"span\" class\u003d\"alert alert-info\"\u003e:information_source: **Note:** The lifeline for `DeleteCommandParser` should end at the destroy marker (X) but due to a limitation of PlantUML, the lifeline continues till the end of diagram.","lastModifiedDate":"2024-02-09"},{"lineNumber":99,"author":{"gitId":"-"},"content":"\u003c/div\u003e","lastModifiedDate":"2020-05-23"},{"lineNumber":100,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":101,"author":{"gitId":"-"},"content":"How the `Logic` component works:","lastModifiedDate":"2023-09-03"},{"lineNumber":102,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2023-09-03"},{"lineNumber":103,"author":{"gitId":"-"},"content":"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.","lastModifiedDate":"2023-09-03"},{"lineNumber":104,"author":{"gitId":"-"},"content":"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`.","lastModifiedDate":"2023-09-03"},{"lineNumber":105,"author":{"gitId":"-"},"content":"1. The command can communicate with the `Model` when it is executed (e.g. to delete a person).\u003cbr\u003e","lastModifiedDate":"2024-02-09"},{"lineNumber":106,"author":{"gitId":"-"},"content":" Note that although this is shown as a single step in the diagram above (for simplicity), in the code it can take several interactions (between the command object and the `Model`) to achieve.","lastModifiedDate":"2024-02-09"},{"lineNumber":107,"author":{"gitId":"-"},"content":"1. The result of the command execution is encapsulated as a `CommandResult` object which is returned back from `Logic`.","lastModifiedDate":"2023-09-03"},{"lineNumber":108,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2023-09-03"},{"lineNumber":109,"author":{"gitId":"-"},"content":"Here are the other classes in `Logic` (omitted from the class diagram above) that are used for parsing a user command:","lastModifiedDate":"2021-07-31"},{"lineNumber":110,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2021-07-31"},{"lineNumber":111,"author":{"gitId":"-"},"content":"\u003cimg src\u003d\"images/ParserClasses.png\" width\u003d\"600\"/\u003e","lastModifiedDate":"2021-07-31"},{"lineNumber":112,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":113,"author":{"gitId":"-"},"content":"How the parsing works:","lastModifiedDate":"2021-07-31"},{"lineNumber":114,"author":{"gitId":"-"},"content":"* 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.","lastModifiedDate":"2021-07-31"},{"lineNumber":115,"author":{"gitId":"-"},"content":"* 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.","lastModifiedDate":"2021-07-31"},{"lineNumber":116,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":117,"author":{"gitId":"-"},"content":"### Model component","lastModifiedDate":"2021-07-31"},{"lineNumber":118,"author":{"gitId":"-"},"content":"**API** : [`Model.java`](https://github.com/se-edu/addressbook-level3/tree/master/src/main/java/seedu/address/model/Model.java)","lastModifiedDate":"2020-05-23"},{"lineNumber":119,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":120,"author":{"gitId":"-"},"content":"\u003cimg src\u003d\"images/ModelClassDiagram.png\" width\u003d\"450\" /\u003e","lastModifiedDate":"2021-07-31"},{"lineNumber":121,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":122,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":123,"author":{"gitId":"-"},"content":"The `Model` component,","lastModifiedDate":"2021-07-31"},{"lineNumber":124,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":125,"author":{"gitId":"-"},"content":"* stores the address book data i.e., all `Person` objects (which are contained in a `UniquePersonList` object).","lastModifiedDate":"2021-07-31"},{"lineNumber":126,"author":{"gitId":"-"},"content":"* stores the currently \u0027selected\u0027 `Person` objects (e.g., results of a search query) as a separate _filtered_ list which is exposed to outsiders as an unmodifiable `ObservableList\u003cPerson\u003e` that can be \u0027observed\u0027 e.g. the UI can be bound to this list so that the UI automatically updates when the data in the list change.","lastModifiedDate":"2021-07-31"},{"lineNumber":127,"author":{"gitId":"-"},"content":"* stores a `UserPref` object that represents the user’s preferences. This is exposed to the outside as a `ReadOnlyUserPref` objects.","lastModifiedDate":"2021-07-31"},{"lineNumber":128,"author":{"gitId":"-"},"content":"* 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)","lastModifiedDate":"2021-07-31"},{"lineNumber":129,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2021-07-31"},{"lineNumber":130,"author":{"gitId":"-"},"content":"\u003cdiv markdown\u003d\"span\" class\u003d\"alert alert-info\"\u003e: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.\u003cbr\u003e","lastModifiedDate":"2021-07-31"},{"lineNumber":131,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2021-07-31"},{"lineNumber":132,"author":{"gitId":"-"},"content":"\u003cimg src\u003d\"images/BetterModelClassDiagram.png\" width\u003d\"450\" /\u003e","lastModifiedDate":"2021-07-31"},{"lineNumber":133,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":134,"author":{"gitId":"-"},"content":"\u003c/div\u003e","lastModifiedDate":"2020-05-23"},{"lineNumber":135,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":136,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":137,"author":{"gitId":"-"},"content":"### Storage component","lastModifiedDate":"2020-05-23"},{"lineNumber":138,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":139,"author":{"gitId":"-"},"content":"**API** : [`Storage.java`](https://github.com/se-edu/addressbook-level3/tree/master/src/main/java/seedu/address/storage/Storage.java)","lastModifiedDate":"2020-05-23"},{"lineNumber":140,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":141,"author":{"gitId":"-"},"content":"\u003cimg src\u003d\"images/StorageClassDiagram.png\" width\u003d\"550\" /\u003e","lastModifiedDate":"2021-07-31"},{"lineNumber":142,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2021-07-31"},{"lineNumber":143,"author":{"gitId":"-"},"content":"The `Storage` component,","lastModifiedDate":"2020-05-23"},{"lineNumber":144,"author":{"gitId":"-"},"content":"* can save both address book data and user preference data in JSON format, and read them back into corresponding objects.","lastModifiedDate":"2023-09-03"},{"lineNumber":145,"author":{"gitId":"-"},"content":"* inherits from both `AddressBookStorage` and `UserPrefStorage`, which means it can be treated as either one (if only the functionality of only one is needed).","lastModifiedDate":"2021-07-31"},{"lineNumber":146,"author":{"gitId":"-"},"content":"* depends on some classes in the `Model` component (because the `Storage` component\u0027s job is to save/retrieve objects that belong to the `Model`)","lastModifiedDate":"2021-07-21"},{"lineNumber":147,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":148,"author":{"gitId":"-"},"content":"### Common classes","lastModifiedDate":"2020-05-23"},{"lineNumber":149,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":150,"author":{"gitId":"-"},"content":"Classes used by multiple components are in the `seedu.addressbook.commons` package.","lastModifiedDate":"2020-05-23"},{"lineNumber":151,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":152,"author":{"gitId":"-"},"content":"--------------------------------------------------------------------------------------------------------------------","lastModifiedDate":"2020-05-23"},{"lineNumber":153,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":154,"author":{"gitId":"-"},"content":"## **Implementation**","lastModifiedDate":"2020-05-23"},{"lineNumber":155,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":156,"author":{"gitId":"-"},"content":"This section describes some noteworthy details on how certain features are implemented.","lastModifiedDate":"2020-05-23"},{"lineNumber":157,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":158,"author":{"gitId":"-"},"content":"### \\[Proposed\\] Undo/redo feature","lastModifiedDate":"2020-06-07"},{"lineNumber":159,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":160,"author":{"gitId":"-"},"content":"#### Proposed Implementation","lastModifiedDate":"2020-05-23"},{"lineNumber":161,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":162,"author":{"gitId":"-"},"content":"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:","lastModifiedDate":"2020-05-23"},{"lineNumber":163,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":164,"author":{"gitId":"-"},"content":"* `VersionedAddressBook#commit()` — Saves the current address book state in its history.","lastModifiedDate":"2020-05-23"},{"lineNumber":165,"author":{"gitId":"-"},"content":"* `VersionedAddressBook#undo()` — Restores the previous address book state from its history.","lastModifiedDate":"2020-05-23"},{"lineNumber":166,"author":{"gitId":"-"},"content":"* `VersionedAddressBook#redo()` — Restores a previously undone address book state from its history.","lastModifiedDate":"2020-05-23"},{"lineNumber":167,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":168,"author":{"gitId":"-"},"content":"These operations are exposed in the `Model` interface as `Model#commitAddressBook()`, `Model#undoAddressBook()` and `Model#redoAddressBook()` respectively.","lastModifiedDate":"2020-05-23"},{"lineNumber":169,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":170,"author":{"gitId":"-"},"content":"Given below is an example usage scenario and how the undo/redo mechanism behaves at each step.","lastModifiedDate":"2020-05-23"},{"lineNumber":171,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":172,"author":{"gitId":"-"},"content":"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.","lastModifiedDate":"2020-05-23"},{"lineNumber":173,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":174,"author":{"gitId":"-"},"content":"![UndoRedoState0](images/UndoRedoState0.png)","lastModifiedDate":"2020-05-23"},{"lineNumber":175,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":176,"author":{"gitId":"-"},"content":"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.","lastModifiedDate":"2020-05-23"},{"lineNumber":177,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":178,"author":{"gitId":"-"},"content":"![UndoRedoState1](images/UndoRedoState1.png)","lastModifiedDate":"2020-05-23"},{"lineNumber":179,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":180,"author":{"gitId":"-"},"content":"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`.","lastModifiedDate":"2020-05-23"},{"lineNumber":181,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":182,"author":{"gitId":"-"},"content":"![UndoRedoState2](images/UndoRedoState2.png)","lastModifiedDate":"2020-05-23"},{"lineNumber":183,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":184,"author":{"gitId":"-"},"content":"\u003cdiv markdown\u003d\"span\" class\u003d\"alert alert-info\"\u003e: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`.","lastModifiedDate":"2020-05-23"},{"lineNumber":185,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":186,"author":{"gitId":"-"},"content":"\u003c/div\u003e","lastModifiedDate":"2020-05-23"},{"lineNumber":187,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":188,"author":{"gitId":"-"},"content":"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.","lastModifiedDate":"2020-05-23"},{"lineNumber":189,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":190,"author":{"gitId":"-"},"content":"![UndoRedoState3](images/UndoRedoState3.png)","lastModifiedDate":"2020-05-23"},{"lineNumber":191,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":192,"author":{"gitId":"-"},"content":"\u003cdiv markdown\u003d\"span\" class\u003d\"alert alert-info\"\u003e: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","lastModifiedDate":"2020-05-23"},{"lineNumber":193,"author":{"gitId":"-"},"content":"than attempting to perform the undo.","lastModifiedDate":"2020-05-23"},{"lineNumber":194,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":195,"author":{"gitId":"-"},"content":"\u003c/div\u003e","lastModifiedDate":"2020-05-23"},{"lineNumber":196,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":197,"author":{"gitId":"-"},"content":"The following sequence diagram shows how an undo operation goes through the `Logic` component:","lastModifiedDate":"2024-02-09"},{"lineNumber":198,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":199,"author":{"gitId":"-"},"content":"![UndoSequenceDiagram](images/UndoSequenceDiagram-Logic.png)","lastModifiedDate":"2024-02-09"},{"lineNumber":200,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":201,"author":{"gitId":"-"},"content":"\u003cdiv markdown\u003d\"span\" class\u003d\"alert alert-info\"\u003e: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.","lastModifiedDate":"2020-05-23"},{"lineNumber":202,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":203,"author":{"gitId":"-"},"content":"\u003c/div\u003e","lastModifiedDate":"2020-05-23"},{"lineNumber":204,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":205,"author":{"gitId":"-"},"content":"Similarly, how an undo operation goes through the `Model` component is shown below:","lastModifiedDate":"2024-02-09"},{"lineNumber":206,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2024-02-09"},{"lineNumber":207,"author":{"gitId":"-"},"content":"![UndoSequenceDiagram](images/UndoSequenceDiagram-Model.png)","lastModifiedDate":"2024-02-09"},{"lineNumber":208,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2024-02-09"},{"lineNumber":209,"author":{"gitId":"-"},"content":"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.","lastModifiedDate":"2020-05-23"},{"lineNumber":210,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":211,"author":{"gitId":"-"},"content":"\u003cdiv markdown\u003d\"span\" class\u003d\"alert alert-info\"\u003e: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.","lastModifiedDate":"2020-05-23"},{"lineNumber":212,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":213,"author":{"gitId":"-"},"content":"\u003c/div\u003e","lastModifiedDate":"2020-05-23"},{"lineNumber":214,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":215,"author":{"gitId":"-"},"content":"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.","lastModifiedDate":"2020-05-23"},{"lineNumber":216,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":217,"author":{"gitId":"-"},"content":"![UndoRedoState4](images/UndoRedoState4.png)","lastModifiedDate":"2020-05-23"},{"lineNumber":218,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":219,"author":{"gitId":"-"},"content":"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.","lastModifiedDate":"2020-05-23"},{"lineNumber":220,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":221,"author":{"gitId":"-"},"content":"![UndoRedoState5](images/UndoRedoState5.png)","lastModifiedDate":"2020-05-23"},{"lineNumber":222,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":223,"author":{"gitId":"-"},"content":"The following activity diagram summarizes what happens when a user executes a new command:","lastModifiedDate":"2020-05-23"},{"lineNumber":224,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":225,"author":{"gitId":"-"},"content":"\u003cimg src\u003d\"images/CommitActivityDiagram.png\" width\u003d\"250\" /\u003e","lastModifiedDate":"2021-07-31"},{"lineNumber":226,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":227,"author":{"gitId":"-"},"content":"#### Design considerations:","lastModifiedDate":"2021-07-31"},{"lineNumber":228,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":229,"author":{"gitId":"-"},"content":"**Aspect: How undo \u0026 redo executes:**","lastModifiedDate":"2021-07-31"},{"lineNumber":230,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":231,"author":{"gitId":"-"},"content":"* **Alternative 1 (current choice):** Saves the entire address book.","lastModifiedDate":"2020-05-23"},{"lineNumber":232,"author":{"gitId":"-"},"content":" * Pros: Easy to implement.","lastModifiedDate":"2020-05-23"},{"lineNumber":233,"author":{"gitId":"-"},"content":" * Cons: May have performance issues in terms of memory usage.","lastModifiedDate":"2020-05-23"},{"lineNumber":234,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":235,"author":{"gitId":"-"},"content":"* **Alternative 2:** Individual command knows how to undo/redo by","lastModifiedDate":"2020-05-23"},{"lineNumber":236,"author":{"gitId":"-"},"content":" itself.","lastModifiedDate":"2020-05-23"},{"lineNumber":237,"author":{"gitId":"-"},"content":" * Pros: Will use less memory (e.g. for `delete`, just save the person being deleted).","lastModifiedDate":"2020-05-23"},{"lineNumber":238,"author":{"gitId":"-"},"content":" * Cons: We must ensure that the implementation of each individual command are correct.","lastModifiedDate":"2020-05-23"},{"lineNumber":239,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":240,"author":{"gitId":"-"},"content":"_{more aspects and alternatives to be added}_","lastModifiedDate":"2020-05-23"},{"lineNumber":241,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":242,"author":{"gitId":"-"},"content":"### \\[Proposed\\] Data archiving","lastModifiedDate":"2020-05-23"},{"lineNumber":243,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":244,"author":{"gitId":"-"},"content":"_{Explain here how the data archiving feature will be implemented}_","lastModifiedDate":"2020-05-23"},{"lineNumber":245,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":246,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":247,"author":{"gitId":"-"},"content":"--------------------------------------------------------------------------------------------------------------------","lastModifiedDate":"2020-05-23"},{"lineNumber":248,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":249,"author":{"gitId":"-"},"content":"## **Documentation, logging, testing, configuration, dev-ops**","lastModifiedDate":"2020-06-07"},{"lineNumber":250,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":251,"author":{"gitId":"-"},"content":"* [Documentation guide](Documentation.md)","lastModifiedDate":"2020-06-07"},{"lineNumber":252,"author":{"gitId":"-"},"content":"* [Testing guide](Testing.md)","lastModifiedDate":"2020-06-07"},{"lineNumber":253,"author":{"gitId":"-"},"content":"* [Logging guide](Logging.md)","lastModifiedDate":"2020-06-07"},{"lineNumber":254,"author":{"gitId":"-"},"content":"* [Configuration guide](Configuration.md)","lastModifiedDate":"2020-06-07"},{"lineNumber":255,"author":{"gitId":"-"},"content":"* [DevOps guide](DevOps.md)","lastModifiedDate":"2020-06-07"},{"lineNumber":256,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":257,"author":{"gitId":"-"},"content":"--------------------------------------------------------------------------------------------------------------------","lastModifiedDate":"2020-05-23"},{"lineNumber":258,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":259,"author":{"gitId":"-"},"content":"## **Appendix: Requirements**","lastModifiedDate":"2020-05-23"},{"lineNumber":260,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":261,"author":{"gitId":"-"},"content":"### Product scope","lastModifiedDate":"2020-05-23"},{"lineNumber":262,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":263,"author":{"gitId":"-"},"content":"**Target user profile**:","lastModifiedDate":"2020-05-23"},{"lineNumber":264,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":265,"author":{"gitId":"ronnnnnnnnn"},"content":"* is an instructor for a CS-related course","lastModifiedDate":"2024-02-29"},{"lineNumber":266,"author":{"gitId":"ronnnnnnnnn"},"content":"* is organised and efficient","lastModifiedDate":"2024-02-29"},{"lineNumber":267,"author":{"gitId":"ronnnnnnnnn"},"content":"* prefers desktop apps over other types","lastModifiedDate":"2024-02-29"},{"lineNumber":268,"author":{"gitId":"-"},"content":"* can type fast","lastModifiedDate":"2020-05-23"},{"lineNumber":269,"author":{"gitId":"-"},"content":"* prefers typing to mouse interactions","lastModifiedDate":"2020-05-26"},{"lineNumber":270,"author":{"gitId":"-"},"content":"* is reasonably comfortable using CLI apps","lastModifiedDate":"2020-05-23"},{"lineNumber":271,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":272,"author":{"gitId":"ronnnnnnnnn"},"content":"**Value proposition**: keep track of the details of weaker students, allowing the instructor to pay more attention to them","lastModifiedDate":"2024-02-29"},{"lineNumber":273,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":274,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":275,"author":{"gitId":"-"},"content":"### User stories","lastModifiedDate":"2020-06-07"},{"lineNumber":276,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":277,"author":{"gitId":"-"},"content":"Priorities: High (must have) - `* * *`, Medium (nice to have) - `* *`, Low (unlikely to have) - `*`","lastModifiedDate":"2020-05-23"},{"lineNumber":278,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":279,"author":{"gitId":"-"},"content":"| Priority | As a …​ | I want to …​ | So that I can…​ |","lastModifiedDate":"2020-05-23"},{"lineNumber":280,"author":{"gitId":"willowisp01"},"content":"|----------|-------------------------------------|----------------------------------------------------|----------------------------------------------------|","lastModifiedDate":"2024-02-29"},{"lineNumber":281,"author":{"gitId":"willowisp01"},"content":"| `* * *` | Course Instructor who can type fast | enter new students’ information using command line | store the information efficiently |","lastModifiedDate":"2024-02-29"},{"lineNumber":282,"author":{"gitId":"willowisp01"},"content":"| `* * *` | Course Instructor | put students into groups | tell which group each of the students are in |","lastModifiedDate":"2024-02-29"},{"lineNumber":283,"author":{"gitId":"willowisp01"},"content":"| `* * *` | Course Instructor | access student’s contact information | communicate with them easily |","lastModifiedDate":"2024-02-29"},{"lineNumber":284,"author":{"gitId":"willowisp01"},"content":"| `* *` | Course Instructor | delete student details on command line | remove students no longer in class |","lastModifiedDate":"2024-02-29"},{"lineNumber":285,"author":{"gitId":"willowisp01"},"content":"| `* * *` | Seasoned Course Instructor | view a single student’s details | identify students of note |","lastModifiedDate":"2024-02-29"},{"lineNumber":286,"author":{"gitId":"willowisp01"},"content":"| `* *` | Course Instructor | edit students’ info | update their info if it changes |","lastModifiedDate":"2024-02-29"},{"lineNumber":287,"author":{"gitId":"willowisp01"},"content":"","lastModifiedDate":"2024-02-29"},{"lineNumber":288,"author":{"gitId":"willowisp01"},"content":"*{More to be added -- this is the minimum viable product for v1.2}*","lastModifiedDate":"2024-02-29"},{"lineNumber":289,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":290,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":291,"author":{"gitId":"-"},"content":"### Use cases","lastModifiedDate":"2020-06-07"},{"lineNumber":292,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":293,"author":{"gitId":"JiaXinEu"},"content":"(For all use cases below, the **System** is the `TeachStack` and the **Actor** is the `user`, unless specified otherwise)","lastModifiedDate":"2024-02-29"},{"lineNumber":294,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":295,"author":{"gitId":"JiaXinEu"},"content":"**Use case: Delete a student**","lastModifiedDate":"2024-02-29"},{"lineNumber":296,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":297,"author":{"gitId":"-"},"content":"**MSS**","lastModifiedDate":"2020-05-23"},{"lineNumber":298,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":299,"author":{"gitId":"JiaXinEu"},"content":"1. User requests to list students","lastModifiedDate":"2024-02-29"},{"lineNumber":300,"author":{"gitId":"JiaXinEu"},"content":"2. TeachStack shows a list of students","lastModifiedDate":"2024-02-29"},{"lineNumber":301,"author":{"gitId":"JiaXinEu"},"content":"3. User requests to delete a specific student in the list","lastModifiedDate":"2024-02-29"},{"lineNumber":302,"author":{"gitId":"JiaXinEu"},"content":"4. TeachStack deletes the student","lastModifiedDate":"2024-02-29"},{"lineNumber":303,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":304,"author":{"gitId":"-"},"content":" Use case ends.","lastModifiedDate":"2020-05-23"},{"lineNumber":305,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":306,"author":{"gitId":"-"},"content":"**Extensions**","lastModifiedDate":"2020-05-23"},{"lineNumber":307,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":308,"author":{"gitId":"-"},"content":"* 2a. The list is empty.","lastModifiedDate":"2020-05-23"},{"lineNumber":309,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":310,"author":{"gitId":"-"},"content":" Use case ends.","lastModifiedDate":"2020-05-23"},{"lineNumber":311,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":312,"author":{"gitId":"JiaXinEu"},"content":"* 3a. The given student id is invalid.","lastModifiedDate":"2024-02-29"},{"lineNumber":313,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":314,"author":{"gitId":"JiaXinEu"},"content":" * 3a1. TeachStack displays an error message.","lastModifiedDate":"2024-02-29"},{"lineNumber":315,"author":{"gitId":"JiaXinEu"},"content":"","lastModifiedDate":"2024-02-29"},{"lineNumber":316,"author":{"gitId":"JiaXinEu"},"content":" Use case resumes at step 2.","lastModifiedDate":"2024-02-29"},{"lineNumber":317,"author":{"gitId":"JiaXinEu"},"content":"","lastModifiedDate":"2024-02-29"},{"lineNumber":318,"author":{"gitId":"JiaXinEu"},"content":"**Use case: Add a student**","lastModifiedDate":"2024-02-29"},{"lineNumber":319,"author":{"gitId":"JiaXinEu"},"content":"","lastModifiedDate":"2024-02-29"},{"lineNumber":320,"author":{"gitId":"JiaXinEu"},"content":"**MSS**","lastModifiedDate":"2024-02-29"},{"lineNumber":321,"author":{"gitId":"JiaXinEu"},"content":"","lastModifiedDate":"2024-02-29"},{"lineNumber":322,"author":{"gitId":"JiaXinEu"},"content":"1. User requests to add a student","lastModifiedDate":"2024-02-29"},{"lineNumber":323,"author":{"gitId":"JiaXinEu"},"content":"2. TeachStack adds a new student to the list","lastModifiedDate":"2024-02-29"},{"lineNumber":324,"author":{"gitId":"JiaXinEu"},"content":"","lastModifiedDate":"2024-02-29"},{"lineNumber":325,"author":{"gitId":"JiaXinEu"},"content":" Use case ends.","lastModifiedDate":"2024-02-29"},{"lineNumber":326,"author":{"gitId":"JiaXinEu"},"content":"","lastModifiedDate":"2024-02-29"},{"lineNumber":327,"author":{"gitId":"JiaXinEu"},"content":"**Extensions**","lastModifiedDate":"2024-02-29"},{"lineNumber":328,"author":{"gitId":"JiaXinEu"},"content":"","lastModifiedDate":"2024-02-29"},{"lineNumber":329,"author":{"gitId":"JiaXinEu"},"content":"* 1a. The value given for any parameter is invalid.","lastModifiedDate":"2024-02-29"},{"lineNumber":330,"author":{"gitId":"JiaXinEu"},"content":" * 1a1. TeachStack displays an error message.","lastModifiedDate":"2024-02-29"},{"lineNumber":331,"author":{"gitId":"JiaXinEu"},"content":"","lastModifiedDate":"2024-02-29"},{"lineNumber":332,"author":{"gitId":"JiaXinEu"},"content":" Use case ends.","lastModifiedDate":"2024-02-29"},{"lineNumber":333,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2024-02-29"},{"lineNumber":334,"author":{"gitId":"JiaXinEu"},"content":"**Use case: Form a group of students**","lastModifiedDate":"2024-02-29"},{"lineNumber":335,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2024-02-29"},{"lineNumber":336,"author":{"gitId":"-"},"content":"**MSS**","lastModifiedDate":"2024-02-29"},{"lineNumber":337,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2024-02-29"},{"lineNumber":338,"author":{"gitId":"JiaXinEu"},"content":"1. User requests to list students","lastModifiedDate":"2024-02-29"},{"lineNumber":339,"author":{"gitId":"JiaXinEu"},"content":"2. TeachStack shows a list of students","lastModifiedDate":"2024-02-29"},{"lineNumber":340,"author":{"gitId":"JiaXinEu"},"content":"3. User requests to group specific students in the list","lastModifiedDate":"2024-02-29"},{"lineNumber":341,"author":{"gitId":"JiaXinEu"},"content":"4. TeachStack groups the student","lastModifiedDate":"2024-02-29"},{"lineNumber":342,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2024-02-29"},{"lineNumber":343,"author":{"gitId":"-"},"content":" Use case ends.","lastModifiedDate":"2024-02-29"},{"lineNumber":344,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2024-02-29"},{"lineNumber":345,"author":{"gitId":"-"},"content":"**Extensions**","lastModifiedDate":"2024-02-29"},{"lineNumber":346,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2024-02-29"},{"lineNumber":347,"author":{"gitId":"-"},"content":"* 2a. The list is empty.","lastModifiedDate":"2024-02-29"},{"lineNumber":348,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2024-02-29"},{"lineNumber":349,"author":{"gitId":"-"},"content":" Use case ends.","lastModifiedDate":"2024-02-29"},{"lineNumber":350,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2024-02-29"},{"lineNumber":351,"author":{"gitId":"JiaXinEu"},"content":"* 3a. The given student id is invalid.","lastModifiedDate":"2024-02-29"},{"lineNumber":352,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2024-02-29"},{"lineNumber":353,"author":{"gitId":"JiaXinEu"},"content":" * 3a1. TeachStack displays an error message.","lastModifiedDate":"2024-02-29"},{"lineNumber":354,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":355,"author":{"gitId":"-"},"content":" Use case resumes at step 2.","lastModifiedDate":"2020-05-23"},{"lineNumber":356,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":357,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":358,"author":{"gitId":"-"},"content":"### Non-Functional Requirements","lastModifiedDate":"2020-05-23"},{"lineNumber":359,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":360,"author":{"gitId":"-"},"content":"1. Should work on any _mainstream OS_ as long as it has Java `11` or above installed.","lastModifiedDate":"2020-05-23"},{"lineNumber":361,"author":{"gitId":"-"},"content":"2. Should be able to hold up to 1000 persons without a noticeable sluggishness in performance for typical usage.","lastModifiedDate":"2020-05-23"},{"lineNumber":362,"author":{"gitId":"JiaXinEu"},"content":"3. Should not lose data up to the latest operation in case of accidental close of application.","lastModifiedDate":"2024-03-08"},{"lineNumber":363,"author":{"gitId":"JiaXinEu"},"content":"4. 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.","lastModifiedDate":"2024-03-08"},{"lineNumber":364,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":365,"author":{"gitId":"-"},"content":"*{More to be added}*","lastModifiedDate":"2020-05-23"},{"lineNumber":366,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":367,"author":{"gitId":"-"},"content":"### Glossary","lastModifiedDate":"2020-05-23"},{"lineNumber":368,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":369,"author":{"gitId":"-"},"content":"* **Mainstream OS**: Windows, Linux, Unix, MacOS","lastModifiedDate":"2024-02-09"},{"lineNumber":370,"author":{"gitId":"-"},"content":"* **Private contact detail**: A contact detail that is not meant to be shared with others","lastModifiedDate":"2020-05-23"},{"lineNumber":371,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":372,"author":{"gitId":"-"},"content":"--------------------------------------------------------------------------------------------------------------------","lastModifiedDate":"2020-05-23"},{"lineNumber":373,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":374,"author":{"gitId":"-"},"content":"## **Appendix: Instructions for manual testing**","lastModifiedDate":"2020-05-23"},{"lineNumber":375,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":376,"author":{"gitId":"-"},"content":"Given below are instructions to test the app manually.","lastModifiedDate":"2020-05-23"},{"lineNumber":377,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":378,"author":{"gitId":"-"},"content":"\u003cdiv markdown\u003d\"span\" class\u003d\"alert alert-info\"\u003e:information_source: **Note:** These instructions only provide a starting point for testers to work on;","lastModifiedDate":"2020-05-23"},{"lineNumber":379,"author":{"gitId":"-"},"content":"testers are expected to do more *exploratory* testing.","lastModifiedDate":"2020-05-23"},{"lineNumber":380,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":381,"author":{"gitId":"-"},"content":"\u003c/div\u003e","lastModifiedDate":"2020-05-23"},{"lineNumber":382,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":383,"author":{"gitId":"-"},"content":"### Launch and shutdown","lastModifiedDate":"2020-05-23"},{"lineNumber":384,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":385,"author":{"gitId":"-"},"content":"1. Initial launch","lastModifiedDate":"2020-05-23"},{"lineNumber":386,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":387,"author":{"gitId":"-"},"content":" 1. Download the jar file and copy into an empty folder","lastModifiedDate":"2020-05-23"},{"lineNumber":388,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":389,"author":{"gitId":"-"},"content":" 1. Double-click the jar file Expected: Shows the GUI with a set of sample contacts. The window size may not be optimum.","lastModifiedDate":"2020-05-23"},{"lineNumber":390,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":391,"author":{"gitId":"-"},"content":"1. Saving window preferences","lastModifiedDate":"2020-05-23"},{"lineNumber":392,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":393,"author":{"gitId":"-"},"content":" 1. Resize the window to an optimum size. Move the window to a different location. Close the window.","lastModifiedDate":"2020-05-23"},{"lineNumber":394,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":395,"author":{"gitId":"-"},"content":" 1. Re-launch the app by double-clicking the jar file.\u003cbr\u003e","lastModifiedDate":"2020-05-23"},{"lineNumber":396,"author":{"gitId":"-"},"content":" Expected: The most recent window size and location is retained.","lastModifiedDate":"2020-05-23"},{"lineNumber":397,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":398,"author":{"gitId":"-"},"content":"1. _{ more test cases …​ }_","lastModifiedDate":"2020-05-23"},{"lineNumber":399,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":400,"author":{"gitId":"-"},"content":"### Deleting a person","lastModifiedDate":"2020-05-23"},{"lineNumber":401,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":402,"author":{"gitId":"-"},"content":"1. Deleting a person while all persons are being shown","lastModifiedDate":"2020-05-23"},{"lineNumber":403,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":404,"author":{"gitId":"-"},"content":" 1. Prerequisites: List all persons using the `list` command. Multiple persons in the list.","lastModifiedDate":"2020-05-23"},{"lineNumber":405,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":406,"author":{"gitId":"-"},"content":" 1. Test case: `delete 1`\u003cbr\u003e","lastModifiedDate":"2020-05-23"},{"lineNumber":407,"author":{"gitId":"-"},"content":" 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.","lastModifiedDate":"2020-05-23"},{"lineNumber":408,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":409,"author":{"gitId":"-"},"content":" 1. Test case: `delete 0`\u003cbr\u003e","lastModifiedDate":"2020-05-23"},{"lineNumber":410,"author":{"gitId":"-"},"content":" Expected: No person is deleted. Error details shown in the status message. Status bar remains the same.","lastModifiedDate":"2020-05-23"},{"lineNumber":411,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":412,"author":{"gitId":"-"},"content":" 1. Other incorrect delete commands to try: `delete`, `delete x`, `...` (where x is larger than the list size)\u003cbr\u003e","lastModifiedDate":"2020-05-23"},{"lineNumber":413,"author":{"gitId":"-"},"content":" Expected: Similar to previous.","lastModifiedDate":"2020-05-23"},{"lineNumber":414,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":415,"author":{"gitId":"-"},"content":"1. _{ more test cases …​ }_","lastModifiedDate":"2020-05-23"},{"lineNumber":416,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":417,"author":{"gitId":"-"},"content":"### Saving data","lastModifiedDate":"2020-05-23"},{"lineNumber":418,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":419,"author":{"gitId":"-"},"content":"1. Dealing with missing/corrupted data files","lastModifiedDate":"2020-05-23"},{"lineNumber":420,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":421,"author":{"gitId":"-"},"content":" 1. _{explain how to simulate a missing/corrupted file, and the expected behavior}_","lastModifiedDate":"2020-05-23"},{"lineNumber":422,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":423,"author":{"gitId":"-"},"content":"1. _{ more test cases …​ }_","lastModifiedDate":"2020-05-23"}],"authorContributionMap":{"willowisp01":9,"JiaXinEu":35,"-":375,"ronnnnnnnnn":4}},{"path":"docs/UserGuide.md","fileType":"docs","lines":[{"lineNumber":1,"author":{"gitId":"-"},"content":"---","lastModifiedDate":"2020-05-23"},{"lineNumber":2,"author":{"gitId":"-"},"content":"layout: page","lastModifiedDate":"2020-05-23"},{"lineNumber":3,"author":{"gitId":"-"},"content":"title: User Guide","lastModifiedDate":"2020-05-23"},{"lineNumber":4,"author":{"gitId":"-"},"content":"---","lastModifiedDate":"2020-05-23"},{"lineNumber":5,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":6,"author":{"gitId":"ronnnnnnnnn"},"content":"TeachStack 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, TeachStack can get your contact management tasks done faster than traditional GUI apps.","lastModifiedDate":"2024-03-08"},{"lineNumber":7,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":8,"author":{"gitId":"-"},"content":"* Table of Contents","lastModifiedDate":"2020-05-23"},{"lineNumber":9,"author":{"gitId":"-"},"content":" {:toc}","lastModifiedDate":"2020-05-23"},{"lineNumber":10,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":11,"author":{"gitId":"-"},"content":"--------------------------------------------------------------------------------------------------------------------","lastModifiedDate":"2020-05-23"},{"lineNumber":12,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":13,"author":{"gitId":"-"},"content":"## Quick start","lastModifiedDate":"2020-05-23"},{"lineNumber":14,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":15,"author":{"gitId":"-"},"content":"1. Ensure you have Java `11` or above installed in your Computer.","lastModifiedDate":"2020-05-23"},{"lineNumber":16,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":17,"author":{"gitId":"ronnnnnnnnn"},"content":"1. Download the latest `TeachStack.jar` from [here](https://github.com/AY2324S2-CS2103T-T09-1/tp/releases).","lastModifiedDate":"2024-03-08"},{"lineNumber":18,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":19,"author":{"gitId":"ronnnnnnnnn"},"content":"1. Copy the file to the folder you want to use as the _home folder_ for your TeachStack.","lastModifiedDate":"2024-03-08"},{"lineNumber":20,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":21,"author":{"gitId":"Wongqingyee"},"content":"1. Open a command terminal, `cd` into the folder you put the jar file in, and use the `java -jar TeachStack.jar` command to run the application.\u003cbr\u003e","lastModifiedDate":"2024-02-29"},{"lineNumber":22,"author":{"gitId":"-"},"content":" A GUI similar to the below should appear in a few seconds. Note how the app contains some sample data.\u003cbr\u003e","lastModifiedDate":"2023-01-01"},{"lineNumber":23,"author":{"gitId":"-"},"content":" ![Ui](images/Ui.png)","lastModifiedDate":"2020-05-23"},{"lineNumber":24,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":25,"author":{"gitId":"-"},"content":"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.\u003cbr\u003e","lastModifiedDate":"2020-05-23"},{"lineNumber":26,"author":{"gitId":"-"},"content":" Some example commands you can try:","lastModifiedDate":"2020-05-23"},{"lineNumber":27,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":28,"author":{"gitId":"-"},"content":" * `list` : Lists all contacts.","lastModifiedDate":"2023-01-01"},{"lineNumber":29,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":30,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":31,"author":{"gitId":"JiaXinEu"},"content":"* `add id/A01234567H n/John Doe e/e0123456@u.nus.edu` : Adds a student named `John Doe` to the list.","lastModifiedDate":"2024-02-29"},{"lineNumber":32,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":33,"author":{"gitId":"JiaXinEu"},"content":"* `delete A0123456X` : Deletes the student with student id A0123456X from the list.","lastModifiedDate":"2024-02-29"},{"lineNumber":34,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":35,"author":{"gitId":"JiaXinEu"},"content":"* `clear` : Deletes all students.","lastModifiedDate":"2024-02-29"},{"lineNumber":36,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":37,"author":{"gitId":"-"},"content":"* `exit` : Exits the app.","lastModifiedDate":"2023-01-01"},{"lineNumber":38,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":39,"author":{"gitId":"-"},"content":"1. Refer to the [Features](#features) below for details of each command.","lastModifiedDate":"2020-05-23"},{"lineNumber":40,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":41,"author":{"gitId":"-"},"content":"--------------------------------------------------------------------------------------------------------------------","lastModifiedDate":"2020-05-23"},{"lineNumber":42,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":43,"author":{"gitId":"-"},"content":"## Features","lastModifiedDate":"2020-05-23"},{"lineNumber":44,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":45,"author":{"gitId":"-"},"content":"\u003cdiv markdown\u003d\"block\" class\u003d\"alert alert-info\"\u003e","lastModifiedDate":"2020-05-23"},{"lineNumber":46,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":47,"author":{"gitId":"-"},"content":"**:information_source: Notes about the command format:**\u003cbr\u003e","lastModifiedDate":"2020-05-23"},{"lineNumber":48,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":49,"author":{"gitId":"-"},"content":"* Words in `UPPER_CASE` are the parameters to be supplied by the user.\u003cbr\u003e","lastModifiedDate":"2020-05-23"},{"lineNumber":50,"author":{"gitId":"-"},"content":" e.g. in `add n/NAME`, `NAME` is a parameter which can be used as `add n/John Doe`.","lastModifiedDate":"2020-05-23"},{"lineNumber":51,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":52,"author":{"gitId":"-"},"content":"* Items in square brackets are optional.\u003cbr\u003e","lastModifiedDate":"2020-05-23"},{"lineNumber":53,"author":{"gitId":"-"},"content":" e.g `n/NAME [t/TAG]` can be used as `n/John Doe t/friend` or as `n/John Doe`.","lastModifiedDate":"2020-05-23"},{"lineNumber":54,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":55,"author":{"gitId":"Wongqingyee"},"content":"* Parameters must be in specified order.\u003cbr\u003e","lastModifiedDate":"2024-02-29"},{"lineNumber":56,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":57,"author":{"gitId":"-"},"content":"* Extraneous parameters for commands that do not take in parameters (such as `help`, `list`, `exit` and `clear`) will be ignored.\u003cbr\u003e","lastModifiedDate":"2021-02-03"},{"lineNumber":58,"author":{"gitId":"-"},"content":" e.g. if the command specifies `help 123`, it will be interpreted as `help`.","lastModifiedDate":"2021-02-03"},{"lineNumber":59,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2021-02-03"},{"lineNumber":60,"author":{"gitId":"-"},"content":"* 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.","lastModifiedDate":"2023-06-26"},{"lineNumber":61,"author":{"gitId":"-"},"content":"\u003c/div\u003e","lastModifiedDate":"2020-05-23"},{"lineNumber":62,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":63,"author":{"gitId":"-"},"content":"### Viewing help : `help`","lastModifiedDate":"2020-05-23"},{"lineNumber":64,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":65,"author":{"gitId":"-"},"content":"Shows a message explaning how to access the help page.","lastModifiedDate":"2020-05-23"},{"lineNumber":66,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":67,"author":{"gitId":"-"},"content":"![help message](images/helpMessage.png)","lastModifiedDate":"2020-05-23"},{"lineNumber":68,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":69,"author":{"gitId":"-"},"content":"Format: `help`","lastModifiedDate":"2020-05-23"},{"lineNumber":70,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":71,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":72,"author":{"gitId":"-"},"content":"### Adding a person: `add`","lastModifiedDate":"2020-05-23"},{"lineNumber":73,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":74,"author":{"gitId":"ronnnnnnnnn"},"content":"Adds student details to the list of students.","lastModifiedDate":"2024-03-08"},{"lineNumber":75,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":76,"author":{"gitId":"Wongqingyee"},"content":"Format: `add id/STUDENT_ID n/NAME e/EMAIL g/GRADE [t/TAG]​`","lastModifiedDate":"2024-02-29"},{"lineNumber":77,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":78,"author":{"gitId":"Wongqingyee"},"content":"* Name, student_id, grade, and email must have.","lastModifiedDate":"2024-02-29"},{"lineNumber":79,"author":{"gitId":"Wongqingyee"},"content":"* Name can be case-insensitive, eg. john doe, JOHN DOE same as John Doe","lastModifiedDate":"2024-02-29"},{"lineNumber":80,"author":{"gitId":"Wongqingyee"},"content":"* Email must have the correct format and string length of 8 for the email username eg. e0000000@u.nus.edu","lastModifiedDate":"2024-02-29"},{"lineNumber":81,"author":{"gitId":"Wongqingyee"},"content":"* Grade: [A+, A, A-, B+, B, B-, C+, C, D+, D, F]","lastModifiedDate":"2024-02-29"},{"lineNumber":82,"author":{"gitId":"Wongqingyee"},"content":"* Student_id must start with A and end with a letter, string length of 9 eg. A0000000X","lastModifiedDate":"2024-02-29"},{"lineNumber":83,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":84,"author":{"gitId":"-"},"content":"Examples:","lastModifiedDate":"2020-05-23"},{"lineNumber":85,"author":{"gitId":"Wongqingyee"},"content":"* `add id/A01234567H n/John Doe e/e0123456@u.nus.edu`","lastModifiedDate":"2024-02-29"},{"lineNumber":86,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2024-02-29"},{"lineNumber":87,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":88,"author":{"gitId":"-"},"content":"### Editing a person : `edit`","lastModifiedDate":"2020-05-23"},{"lineNumber":89,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":90,"author":{"gitId":"ronnnnnnnnn"},"content":"Edits an existing person in the list of students.","lastModifiedDate":"2024-03-08"},{"lineNumber":91,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":92,"author":{"gitId":"yashma-sonara"},"content":"Format: `edit [id/STUDENT_ID] [e/EMAIL] `","lastModifiedDate":"2024-02-29"},{"lineNumber":93,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":94,"author":{"gitId":"yashma-sonara"},"content":"* Edits the person with the specified `STUDENT_ID`. The STUDENT_ID refers to the unique alphanumeric sequence assigned to a person shown in the displayed person list. The student_id **must be 9 digits long","lastModifiedDate":"2024-02-29"},{"lineNumber":95,"author":{"gitId":"yashma-sonara"},"content":"* Only 1 field may be provided.","lastModifiedDate":"2024-02-29"},{"lineNumber":96,"author":{"gitId":"yashma-sonara"},"content":"* Existing value will be updated to the input value.","lastModifiedDate":"2024-02-29"},{"lineNumber":97,"author":{"gitId":"yashma-sonara"},"content":"* Name can be case-insensitive, eg. john doe, JOHN DOE same as John Doe","lastModifiedDate":"2024-02-29"},{"lineNumber":98,"author":{"gitId":"yashma-sonara"},"content":"* Email must have the correct domain (@u.nus.edu) and string length of 8 for the email username eg. e0000000@u.nus.edu","lastModifiedDate":"2024-02-29"},{"lineNumber":99,"author":{"gitId":"yashma-sonara"},"content":"* Grade may be of values: [A+, A, A-, B+, B, B-, C+, C, D+, D, F]","lastModifiedDate":"2024-02-29"},{"lineNumber":100,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":101,"author":{"gitId":"-"},"content":"Examples:","lastModifiedDate":"2020-05-23"},{"lineNumber":102,"author":{"gitId":"yashma-sonara"},"content":"* `edit id/A0123456X e/johndoe@example.com` Edits the email address of the person with student_id \u003d A0123456X to be `e1234567@u.nus.edu`.","lastModifiedDate":"2024-02-29"},{"lineNumber":103,"author":{"gitId":"yashma-sonara"},"content":"* `edit id/A2233445X n/Betsy Crower` Edits the name of the person with student_id \u003d A2233445X to be `Betsy Crower`.","lastModifiedDate":"2024-02-29"},{"lineNumber":104,"author":{"gitId":"yashma-sonara"},"content":"","lastModifiedDate":"2024-02-29"},{"lineNumber":105,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":106,"author":{"gitId":"ronnnnnnnnn"},"content":"### Viewing students by name: `view`","lastModifiedDate":"2024-02-29"},{"lineNumber":107,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":108,"author":{"gitId":"ronnnnnnnnn"},"content":"Shows the detailed information of the student with the specified student_id.","lastModifiedDate":"2024-02-29"},{"lineNumber":109,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":110,"author":{"gitId":"ronnnnnnnnn"},"content":"Format: `view STUDENT_ID`","lastModifiedDate":"2024-02-29"},{"lineNumber":111,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":112,"author":{"gitId":"ronnnnnnnnn"},"content":"* Returns the detailed information of the student with the corresponding `STUDENT_ID`.","lastModifiedDate":"2024-02-29"},{"lineNumber":113,"author":{"gitId":"ronnnnnnnnn"},"content":"* The `STUDENT_ID` is case-insensitive.","lastModifiedDate":"2024-02-29"},{"lineNumber":114,"author":{"gitId":"ronnnnnnnnn"},"content":"* The `STUDENT_ID` starts with A and ends with a letter and it must be 9 characters long.","lastModifiedDate":"2024-02-29"},{"lineNumber":115,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":116,"author":{"gitId":"-"},"content":"Examples:","lastModifiedDate":"2020-05-23"},{"lineNumber":117,"author":{"gitId":"ronnnnnnnnn"},"content":"* `view A0123456X` Shows the detailed information of the student with `STUDENT_ID \u003d A0123456X`","lastModifiedDate":"2024-02-29"},{"lineNumber":118,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":119,"author":{"gitId":"-"},"content":"### Deleting a person : `delete`","lastModifiedDate":"2020-05-23"},{"lineNumber":120,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":121,"author":{"gitId":"JiaXinEu"},"content":"Deletes the specified student from the list.","lastModifiedDate":"2024-02-29"},{"lineNumber":122,"author":{"gitId":"JiaXinEu"},"content":"","lastModifiedDate":"2024-02-29"},{"lineNumber":123,"author":{"gitId":"JiaXinEu"},"content":"Format: `delete STUDENT_ID`","lastModifiedDate":"2024-02-29"},{"lineNumber":124,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":125,"author":{"gitId":"JiaXinEu"},"content":"* Deletes the person at the specified `STUDENT_ID`.","lastModifiedDate":"2024-02-29"},{"lineNumber":126,"author":{"gitId":"JiaXinEu"},"content":"* The STUDENT_ID refers to the id corresponding to the student in the list.","lastModifiedDate":"2024-02-29"},{"lineNumber":127,"author":{"gitId":"JiaXinEu"},"content":"* The STUDENT_ID is case-insensitive, must be a String starting with ‘A’ and ending with any letter, with a total length of 9","lastModifiedDate":"2024-02-29"},{"lineNumber":128,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":129,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":130,"author":{"gitId":"-"},"content":"Examples:","lastModifiedDate":"2020-05-23"},{"lineNumber":131,"author":{"gitId":"JiaXinEu"},"content":"* `delete A0123456X` deletes the student with student id A0123456X from the list.","lastModifiedDate":"2024-02-29"},{"lineNumber":132,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":133,"author":{"gitId":"-"},"content":"### Clearing all entries : `clear`","lastModifiedDate":"2020-05-23"},{"lineNumber":134,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":135,"author":{"gitId":"ronnnnnnnnn"},"content":"Clears all entries from the list of students.","lastModifiedDate":"2024-03-08"},{"lineNumber":136,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":137,"author":{"gitId":"-"},"content":"Format: `clear`","lastModifiedDate":"2020-05-23"},{"lineNumber":138,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":139,"author":{"gitId":"-"},"content":"### Exiting the program : `exit`","lastModifiedDate":"2020-05-23"},{"lineNumber":140,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":141,"author":{"gitId":"-"},"content":"Exits the program.","lastModifiedDate":"2020-05-23"},{"lineNumber":142,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":143,"author":{"gitId":"-"},"content":"Format: `exit`","lastModifiedDate":"2020-05-23"},{"lineNumber":144,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":145,"author":{"gitId":"-"},"content":"### Saving the data","lastModifiedDate":"2020-05-23"},{"lineNumber":146,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":147,"author":{"gitId":"ronnnnnnnnn"},"content":"TeachStack data is saved in the hard disk automatically after any command that changes the data. There is no need to save manually.","lastModifiedDate":"2024-03-08"},{"lineNumber":148,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":149,"author":{"gitId":"-"},"content":"### Editing the data file","lastModifiedDate":"2021-02-04"},{"lineNumber":150,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2021-02-04"},{"lineNumber":151,"author":{"gitId":"ronnnnnnnnn"},"content":"TeachStack data is saved automatically as a JSON file `[JAR file location]/data/teachstack.json`. Advanced users are welcome to update data directly by editing that data file.","lastModifiedDate":"2024-03-08"},{"lineNumber":152,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2021-02-04"},{"lineNumber":153,"author":{"gitId":"-"},"content":"\u003cdiv markdown\u003d\"span\" class\u003d\"alert alert-warning\"\u003e:exclamation: **Caution:**","lastModifiedDate":"2021-02-04"},{"lineNumber":154,"author":{"gitId":"ronnnnnnnnn"},"content":"If your changes to the data file makes its format invalid, TeachStack 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.\u003cbr\u003e","lastModifiedDate":"2024-03-08"},{"lineNumber":155,"author":{"gitId":"ronnnnnnnnn"},"content":"Furthermore, certain edits can cause the TeachStack to behave in unexpected ways (e.g., if a value entered is outside of the acceptable range). Therefore, edit the data file only if you are confident that you can update it correctly.","lastModifiedDate":"2024-03-08"},{"lineNumber":156,"author":{"gitId":"-"},"content":"\u003c/div\u003e","lastModifiedDate":"2021-02-04"},{"lineNumber":157,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2021-02-04"},{"lineNumber":158,"author":{"gitId":"-"},"content":"### Archiving data files `[coming in v2.0]`","lastModifiedDate":"2020-05-23"},{"lineNumber":159,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":160,"author":{"gitId":"-"},"content":"_Details coming soon ..._","lastModifiedDate":"2021-02-04"},{"lineNumber":161,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":162,"author":{"gitId":"-"},"content":"--------------------------------------------------------------------------------------------------------------------","lastModifiedDate":"2020-05-23"},{"lineNumber":163,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":164,"author":{"gitId":"-"},"content":"## FAQ","lastModifiedDate":"2020-05-23"},{"lineNumber":165,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":166,"author":{"gitId":"-"},"content":"**Q**: How do I transfer my data to another Computer?\u003cbr\u003e","lastModifiedDate":"2020-05-23"},{"lineNumber":167,"author":{"gitId":"ronnnnnnnnn"},"content":"**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 TeachStack home folder.","lastModifiedDate":"2024-03-08"},{"lineNumber":168,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":169,"author":{"gitId":"-"},"content":"--------------------------------------------------------------------------------------------------------------------","lastModifiedDate":"2020-05-23"},{"lineNumber":170,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":171,"author":{"gitId":"-"},"content":"## Known issues","lastModifiedDate":"2023-09-08"},{"lineNumber":172,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2023-09-08"},{"lineNumber":173,"author":{"gitId":"-"},"content":"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.","lastModifiedDate":"2023-09-08"},{"lineNumber":174,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2023-09-08"},{"lineNumber":175,"author":{"gitId":"-"},"content":"--------------------------------------------------------------------------------------------------------------------","lastModifiedDate":"2023-09-08"},{"lineNumber":176,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2023-09-08"},{"lineNumber":177,"author":{"gitId":"-"},"content":"## Command summary","lastModifiedDate":"2020-05-23"},{"lineNumber":178,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":179,"author":{"gitId":"yashma-sonara"},"content":"| Action | Format, Examples |","lastModifiedDate":"2024-02-29"},{"lineNumber":180,"author":{"gitId":"yashma-sonara"},"content":"|------------|--------------------------------------------------------------------------------------------------------------------------|","lastModifiedDate":"2024-02-29"},{"lineNumber":181,"author":{"gitId":"Wongqingyee"},"content":"| **Add** | `add id/STUDENT_ID n/NAME e/EMAIL g/GRADE [t/TAG]​​` \u003cbr\u003e e.g., `add id/A01234567X n/James Ho e/e0123456@u.nus.edu g/B+` |","lastModifiedDate":"2024-02-29"},{"lineNumber":182,"author":{"gitId":"yashma-sonara"},"content":"| **Delete** | `delete id/STUDENT_ID`\u003cbr\u003e e.g., `delete A01234567X` |","lastModifiedDate":"2024-02-29"},{"lineNumber":183,"author":{"gitId":"yashma-sonara"},"content":"| **Edit** | `edit id/STUDENT_ID [g/GRADE] `\u003cbr\u003e e.g.,`edit A0123466C g/A+` |","lastModifiedDate":"2024-02-29"},{"lineNumber":184,"author":{"gitId":"JiaXinEu"},"content":"| **View** | `view id/STUDENT_ID`\u003cbr\u003e e.g., `view A0123466D` |","lastModifiedDate":"2024-02-29"},{"lineNumber":185,"author":{"gitId":"yashma-sonara"},"content":"| **Group** | `group id/STUDENT_ID_1 [id/STUDENT_ID_2] …` \u003cbr\u003e e.g., `group A1234567R, A2345678R` |","lastModifiedDate":"2024-02-29"}],"authorContributionMap":{"yashma-sonara":15,"Wongqingyee":10,"JiaXinEu":11,"-":131,"ronnnnnnnnn":18}},{"path":"docs/_sass/minima/_base.scss","fileType":"other","lines":[{"lineNumber":1,"author":{"gitId":"-"},"content":"html {","lastModifiedDate":"2020-05-23"},{"lineNumber":2,"author":{"gitId":"-"},"content":" font-size: $base-font-size;","lastModifiedDate":"2020-05-23"},{"lineNumber":3,"author":{"gitId":"-"},"content":"}","lastModifiedDate":"2020-05-23"},{"lineNumber":4,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":5,"author":{"gitId":"-"},"content":"/**","lastModifiedDate":"2020-05-23"},{"lineNumber":6,"author":{"gitId":"-"},"content":" * Reset some basic elements","lastModifiedDate":"2020-05-23"},{"lineNumber":7,"author":{"gitId":"-"},"content":" */","lastModifiedDate":"2020-05-23"},{"lineNumber":8,"author":{"gitId":"-"},"content":"body, h1, h2, h3, h4, h5, h6,","lastModifiedDate":"2020-05-23"},{"lineNumber":9,"author":{"gitId":"-"},"content":"p, blockquote, pre, hr,","lastModifiedDate":"2020-05-23"},{"lineNumber":10,"author":{"gitId":"-"},"content":"dl, dd, ol, ul, figure {","lastModifiedDate":"2020-05-23"},{"lineNumber":11,"author":{"gitId":"-"},"content":" margin: 0;","lastModifiedDate":"2020-05-23"},{"lineNumber":12,"author":{"gitId":"-"},"content":" padding: 0;","lastModifiedDate":"2020-05-23"},{"lineNumber":13,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":14,"author":{"gitId":"-"},"content":"}","lastModifiedDate":"2020-05-23"},{"lineNumber":15,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":16,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":17,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":18,"author":{"gitId":"-"},"content":"/**","lastModifiedDate":"2020-05-23"},{"lineNumber":19,"author":{"gitId":"-"},"content":" * Basic styling","lastModifiedDate":"2020-05-23"},{"lineNumber":20,"author":{"gitId":"-"},"content":" */","lastModifiedDate":"2020-05-23"},{"lineNumber":21,"author":{"gitId":"-"},"content":"body {","lastModifiedDate":"2020-05-23"},{"lineNumber":22,"author":{"gitId":"-"},"content":" font: $base-font-weight #{$base-font-size}/#{$base-line-height} $base-font-family;","lastModifiedDate":"2020-05-23"},{"lineNumber":23,"author":{"gitId":"-"},"content":" color: $text-color;","lastModifiedDate":"2020-05-23"},{"lineNumber":24,"author":{"gitId":"-"},"content":" background-color: $background-color;","lastModifiedDate":"2020-05-23"},{"lineNumber":25,"author":{"gitId":"-"},"content":" -webkit-text-size-adjust: 100%;","lastModifiedDate":"2020-05-23"},{"lineNumber":26,"author":{"gitId":"-"},"content":" -webkit-font-feature-settings: \"kern\" 1;","lastModifiedDate":"2020-05-23"},{"lineNumber":27,"author":{"gitId":"-"},"content":" -moz-font-feature-settings: \"kern\" 1;","lastModifiedDate":"2020-05-23"},{"lineNumber":28,"author":{"gitId":"-"},"content":" -o-font-feature-settings: \"kern\" 1;","lastModifiedDate":"2020-05-23"},{"lineNumber":29,"author":{"gitId":"-"},"content":" font-feature-settings: \"kern\" 1;","lastModifiedDate":"2020-05-23"},{"lineNumber":30,"author":{"gitId":"-"},"content":" font-kerning: normal;","lastModifiedDate":"2020-05-23"},{"lineNumber":31,"author":{"gitId":"-"},"content":" display: flex;","lastModifiedDate":"2020-05-23"},{"lineNumber":32,"author":{"gitId":"-"},"content":" min-height: 100vh;","lastModifiedDate":"2020-05-23"},{"lineNumber":33,"author":{"gitId":"-"},"content":" flex-direction: column;","lastModifiedDate":"2020-05-23"},{"lineNumber":34,"author":{"gitId":"-"},"content":" overflow-wrap: break-word;","lastModifiedDate":"2020-05-23"},{"lineNumber":35,"author":{"gitId":"-"},"content":"}","lastModifiedDate":"2020-05-23"},{"lineNumber":36,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":37,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":38,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":39,"author":{"gitId":"-"},"content":"/**","lastModifiedDate":"2020-05-23"},{"lineNumber":40,"author":{"gitId":"-"},"content":" * Set `margin-bottom` to maintain vertical rhythm","lastModifiedDate":"2020-05-23"},{"lineNumber":41,"author":{"gitId":"-"},"content":" */","lastModifiedDate":"2020-05-23"},{"lineNumber":42,"author":{"gitId":"-"},"content":"h1, h2, h3, h4, h5, h6,","lastModifiedDate":"2020-05-23"},{"lineNumber":43,"author":{"gitId":"-"},"content":"p, blockquote, pre,","lastModifiedDate":"2020-05-23"},{"lineNumber":44,"author":{"gitId":"-"},"content":"ul, ol, dl, figure,","lastModifiedDate":"2020-05-23"},{"lineNumber":45,"author":{"gitId":"-"},"content":"%vertical-rhythm {","lastModifiedDate":"2020-05-23"},{"lineNumber":46,"author":{"gitId":"-"},"content":" margin-bottom: $spacing-unit / 2;","lastModifiedDate":"2020-05-23"},{"lineNumber":47,"author":{"gitId":"-"},"content":"}","lastModifiedDate":"2020-05-23"},{"lineNumber":48,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":49,"author":{"gitId":"-"},"content":"hr {","lastModifiedDate":"2020-05-23"},{"lineNumber":50,"author":{"gitId":"-"},"content":" margin-top: $spacing-unit;","lastModifiedDate":"2020-05-23"},{"lineNumber":51,"author":{"gitId":"-"},"content":" margin-bottom: $spacing-unit;","lastModifiedDate":"2020-05-23"},{"lineNumber":52,"author":{"gitId":"-"},"content":"}","lastModifiedDate":"2020-05-23"},{"lineNumber":53,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":54,"author":{"gitId":"-"},"content":"/**","lastModifiedDate":"2020-05-23"},{"lineNumber":55,"author":{"gitId":"-"},"content":" * `main` element","lastModifiedDate":"2020-05-23"},{"lineNumber":56,"author":{"gitId":"-"},"content":" */","lastModifiedDate":"2020-05-23"},{"lineNumber":57,"author":{"gitId":"-"},"content":"main {","lastModifiedDate":"2020-05-23"},{"lineNumber":58,"author":{"gitId":"-"},"content":" display: block; /* Default value of `display` of `main` element is \u0027inline\u0027 in IE 11. */","lastModifiedDate":"2020-05-23"},{"lineNumber":59,"author":{"gitId":"-"},"content":"}","lastModifiedDate":"2020-05-23"},{"lineNumber":60,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":61,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":62,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":63,"author":{"gitId":"-"},"content":"/**","lastModifiedDate":"2020-05-23"},{"lineNumber":64,"author":{"gitId":"-"},"content":" * Images","lastModifiedDate":"2020-05-23"},{"lineNumber":65,"author":{"gitId":"-"},"content":" */","lastModifiedDate":"2020-05-23"},{"lineNumber":66,"author":{"gitId":"-"},"content":"img {","lastModifiedDate":"2020-05-23"},{"lineNumber":67,"author":{"gitId":"-"},"content":" max-width: 100%;","lastModifiedDate":"2020-05-23"},{"lineNumber":68,"author":{"gitId":"-"},"content":" vertical-align: middle;","lastModifiedDate":"2020-05-23"},{"lineNumber":69,"author":{"gitId":"-"},"content":"}","lastModifiedDate":"2020-05-23"},{"lineNumber":70,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":71,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":72,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":73,"author":{"gitId":"-"},"content":"/**","lastModifiedDate":"2020-05-23"},{"lineNumber":74,"author":{"gitId":"-"},"content":" * Figures","lastModifiedDate":"2020-05-23"},{"lineNumber":75,"author":{"gitId":"-"},"content":" */","lastModifiedDate":"2020-05-23"},{"lineNumber":76,"author":{"gitId":"-"},"content":"figure \u003e img {","lastModifiedDate":"2020-05-23"},{"lineNumber":77,"author":{"gitId":"-"},"content":" display: block;","lastModifiedDate":"2020-05-23"},{"lineNumber":78,"author":{"gitId":"-"},"content":"}","lastModifiedDate":"2020-05-23"},{"lineNumber":79,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":80,"author":{"gitId":"-"},"content":"figcaption {","lastModifiedDate":"2020-05-23"},{"lineNumber":81,"author":{"gitId":"-"},"content":" font-size: $small-font-size;","lastModifiedDate":"2020-05-23"},{"lineNumber":82,"author":{"gitId":"-"},"content":"}","lastModifiedDate":"2020-05-23"},{"lineNumber":83,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":84,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":85,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":86,"author":{"gitId":"-"},"content":"/**","lastModifiedDate":"2020-05-23"},{"lineNumber":87,"author":{"gitId":"-"},"content":" * Lists","lastModifiedDate":"2020-05-23"},{"lineNumber":88,"author":{"gitId":"-"},"content":" */","lastModifiedDate":"2020-05-23"},{"lineNumber":89,"author":{"gitId":"-"},"content":"ul, ol {","lastModifiedDate":"2020-05-23"},{"lineNumber":90,"author":{"gitId":"-"},"content":" margin-left: $spacing-unit;","lastModifiedDate":"2020-05-23"},{"lineNumber":91,"author":{"gitId":"-"},"content":"}","lastModifiedDate":"2020-05-23"},{"lineNumber":92,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":93,"author":{"gitId":"-"},"content":"li {","lastModifiedDate":"2020-05-23"},{"lineNumber":94,"author":{"gitId":"-"},"content":" \u003e ul,","lastModifiedDate":"2020-05-23"},{"lineNumber":95,"author":{"gitId":"-"},"content":" \u003e ol {","lastModifiedDate":"2020-05-23"},{"lineNumber":96,"author":{"gitId":"-"},"content":" margin-bottom: 0;","lastModifiedDate":"2020-05-23"},{"lineNumber":97,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2020-05-23"},{"lineNumber":98,"author":{"gitId":"-"},"content":"}","lastModifiedDate":"2020-05-23"},{"lineNumber":99,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":100,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":101,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":102,"author":{"gitId":"-"},"content":"/**","lastModifiedDate":"2020-05-23"},{"lineNumber":103,"author":{"gitId":"-"},"content":" * Headings","lastModifiedDate":"2020-05-23"},{"lineNumber":104,"author":{"gitId":"-"},"content":" */","lastModifiedDate":"2020-05-23"},{"lineNumber":105,"author":{"gitId":"-"},"content":"h1, h2, h3, h4, h5, h6 {","lastModifiedDate":"2020-05-23"},{"lineNumber":106,"author":{"gitId":"-"},"content":" font-weight: $base-font-weight;","lastModifiedDate":"2020-05-23"},{"lineNumber":107,"author":{"gitId":"-"},"content":"}","lastModifiedDate":"2020-05-23"},{"lineNumber":108,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":109,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":110,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":111,"author":{"gitId":"-"},"content":"/**","lastModifiedDate":"2020-05-23"},{"lineNumber":112,"author":{"gitId":"-"},"content":" * Links","lastModifiedDate":"2020-05-23"},{"lineNumber":113,"author":{"gitId":"-"},"content":" */","lastModifiedDate":"2020-05-23"},{"lineNumber":114,"author":{"gitId":"-"},"content":"a {","lastModifiedDate":"2020-05-23"},{"lineNumber":115,"author":{"gitId":"-"},"content":" color: $link-base-color;","lastModifiedDate":"2020-05-23"},{"lineNumber":116,"author":{"gitId":"-"},"content":" text-decoration: none;","lastModifiedDate":"2020-05-23"},{"lineNumber":117,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":118,"author":{"gitId":"-"},"content":" \u0026:visited {","lastModifiedDate":"2020-05-23"},{"lineNumber":119,"author":{"gitId":"-"},"content":" color: $link-visited-color;","lastModifiedDate":"2020-05-23"},{"lineNumber":120,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2020-05-23"},{"lineNumber":121,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":122,"author":{"gitId":"-"},"content":" \u0026:hover {","lastModifiedDate":"2020-05-23"},{"lineNumber":123,"author":{"gitId":"-"},"content":" color: $text-color;","lastModifiedDate":"2020-05-23"},{"lineNumber":124,"author":{"gitId":"-"},"content":" text-decoration: underline;","lastModifiedDate":"2020-05-23"},{"lineNumber":125,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2020-05-23"},{"lineNumber":126,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":127,"author":{"gitId":"-"},"content":" .social-media-list \u0026:hover {","lastModifiedDate":"2020-05-23"},{"lineNumber":128,"author":{"gitId":"-"},"content":" text-decoration: none;","lastModifiedDate":"2020-05-23"},{"lineNumber":129,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":130,"author":{"gitId":"-"},"content":" .username {","lastModifiedDate":"2020-05-23"},{"lineNumber":131,"author":{"gitId":"-"},"content":" text-decoration: underline;","lastModifiedDate":"2020-05-23"},{"lineNumber":132,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2020-05-23"},{"lineNumber":133,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2020-05-23"},{"lineNumber":134,"author":{"gitId":"-"},"content":"}","lastModifiedDate":"2020-05-23"},{"lineNumber":135,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":136,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":137,"author":{"gitId":"-"},"content":"/**","lastModifiedDate":"2020-05-23"},{"lineNumber":138,"author":{"gitId":"-"},"content":" * Blockquotes","lastModifiedDate":"2020-05-23"},{"lineNumber":139,"author":{"gitId":"-"},"content":" */","lastModifiedDate":"2020-05-23"},{"lineNumber":140,"author":{"gitId":"-"},"content":"blockquote {","lastModifiedDate":"2020-05-23"},{"lineNumber":141,"author":{"gitId":"-"},"content":" color: $brand-color;","lastModifiedDate":"2020-05-23"},{"lineNumber":142,"author":{"gitId":"-"},"content":" border-left: 4px solid $brand-color-light;","lastModifiedDate":"2020-05-23"},{"lineNumber":143,"author":{"gitId":"-"},"content":" padding-left: $spacing-unit / 2;","lastModifiedDate":"2020-05-23"},{"lineNumber":144,"author":{"gitId":"-"},"content":" @include relative-font-size(1.125);","lastModifiedDate":"2020-05-23"},{"lineNumber":145,"author":{"gitId":"-"},"content":" font-style: italic;","lastModifiedDate":"2020-05-23"},{"lineNumber":146,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":147,"author":{"gitId":"-"},"content":" \u003e :last-child {","lastModifiedDate":"2020-05-23"},{"lineNumber":148,"author":{"gitId":"-"},"content":" margin-bottom: 0;","lastModifiedDate":"2020-05-23"},{"lineNumber":149,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2020-05-23"},{"lineNumber":150,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":151,"author":{"gitId":"-"},"content":" i, em {","lastModifiedDate":"2020-05-23"},{"lineNumber":152,"author":{"gitId":"-"},"content":" font-style: normal;","lastModifiedDate":"2020-05-23"},{"lineNumber":153,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2020-05-23"},{"lineNumber":154,"author":{"gitId":"-"},"content":"}","lastModifiedDate":"2020-05-23"},{"lineNumber":155,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":156,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":157,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":158,"author":{"gitId":"-"},"content":"/**","lastModifiedDate":"2020-05-23"},{"lineNumber":159,"author":{"gitId":"-"},"content":" * Code formatting","lastModifiedDate":"2020-05-23"},{"lineNumber":160,"author":{"gitId":"-"},"content":" */","lastModifiedDate":"2020-05-23"},{"lineNumber":161,"author":{"gitId":"-"},"content":"pre,","lastModifiedDate":"2020-05-23"},{"lineNumber":162,"author":{"gitId":"-"},"content":"code {","lastModifiedDate":"2020-05-23"},{"lineNumber":163,"author":{"gitId":"-"},"content":" font-family: $code-font-family;","lastModifiedDate":"2020-05-23"},{"lineNumber":164,"author":{"gitId":"-"},"content":" font-size: 0.9375em;","lastModifiedDate":"2020-05-23"},{"lineNumber":165,"author":{"gitId":"-"},"content":" border: 1px solid $brand-color-light;","lastModifiedDate":"2020-05-23"},{"lineNumber":166,"author":{"gitId":"-"},"content":" border-radius: 3px;","lastModifiedDate":"2020-05-23"},{"lineNumber":167,"author":{"gitId":"-"},"content":" background-color: $code-background-color;","lastModifiedDate":"2020-05-23"},{"lineNumber":168,"author":{"gitId":"-"},"content":"}","lastModifiedDate":"2020-05-23"},{"lineNumber":169,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":170,"author":{"gitId":"-"},"content":"code {","lastModifiedDate":"2020-05-23"},{"lineNumber":171,"author":{"gitId":"-"},"content":" padding: 1px 5px;","lastModifiedDate":"2020-05-23"},{"lineNumber":172,"author":{"gitId":"-"},"content":"}","lastModifiedDate":"2020-05-23"},{"lineNumber":173,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":174,"author":{"gitId":"-"},"content":"pre {","lastModifiedDate":"2020-05-23"},{"lineNumber":175,"author":{"gitId":"-"},"content":" padding: 8px 12px;","lastModifiedDate":"2020-05-23"},{"lineNumber":176,"author":{"gitId":"-"},"content":" overflow-x: auto;","lastModifiedDate":"2020-05-23"},{"lineNumber":177,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":178,"author":{"gitId":"-"},"content":" \u003e code {","lastModifiedDate":"2020-05-23"},{"lineNumber":179,"author":{"gitId":"-"},"content":" border: 0;","lastModifiedDate":"2020-05-23"},{"lineNumber":180,"author":{"gitId":"-"},"content":" padding-right: 0;","lastModifiedDate":"2020-05-23"},{"lineNumber":181,"author":{"gitId":"-"},"content":" padding-left: 0;","lastModifiedDate":"2020-05-23"},{"lineNumber":182,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2020-05-23"},{"lineNumber":183,"author":{"gitId":"-"},"content":"}","lastModifiedDate":"2020-05-23"},{"lineNumber":184,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":185,"author":{"gitId":"-"},"content":".highlight {","lastModifiedDate":"2020-05-23"},{"lineNumber":186,"author":{"gitId":"-"},"content":" border-radius: 3px;","lastModifiedDate":"2020-05-23"},{"lineNumber":187,"author":{"gitId":"-"},"content":" background: $code-background-color;","lastModifiedDate":"2020-05-23"},{"lineNumber":188,"author":{"gitId":"-"},"content":" @extend %vertical-rhythm;","lastModifiedDate":"2020-05-23"},{"lineNumber":189,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":190,"author":{"gitId":"-"},"content":" .highlighter-rouge \u0026 {","lastModifiedDate":"2020-05-23"},{"lineNumber":191,"author":{"gitId":"-"},"content":" background: $code-background-color;","lastModifiedDate":"2020-05-23"},{"lineNumber":192,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2020-05-23"},{"lineNumber":193,"author":{"gitId":"-"},"content":"}","lastModifiedDate":"2020-05-23"},{"lineNumber":194,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":195,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":196,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":197,"author":{"gitId":"-"},"content":"/**","lastModifiedDate":"2020-05-23"},{"lineNumber":198,"author":{"gitId":"-"},"content":" * Wrapper","lastModifiedDate":"2020-05-23"},{"lineNumber":199,"author":{"gitId":"-"},"content":" */","lastModifiedDate":"2020-05-23"},{"lineNumber":200,"author":{"gitId":"-"},"content":".wrapper {","lastModifiedDate":"2020-05-23"},{"lineNumber":201,"author":{"gitId":"-"},"content":" max-width: calc(#{$content-width} - (#{$spacing-unit}));","lastModifiedDate":"2020-05-23"},{"lineNumber":202,"author":{"gitId":"-"},"content":" margin-right: auto;","lastModifiedDate":"2020-05-23"},{"lineNumber":203,"author":{"gitId":"-"},"content":" margin-left: auto;","lastModifiedDate":"2020-05-23"},{"lineNumber":204,"author":{"gitId":"-"},"content":" padding-right: $spacing-unit / 2;","lastModifiedDate":"2020-05-23"},{"lineNumber":205,"author":{"gitId":"-"},"content":" padding-left: $spacing-unit / 2;","lastModifiedDate":"2020-05-23"},{"lineNumber":206,"author":{"gitId":"-"},"content":" @extend %clearfix;","lastModifiedDate":"2020-05-23"},{"lineNumber":207,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":208,"author":{"gitId":"-"},"content":" @media screen and (min-width: $on-large) {","lastModifiedDate":"2020-05-23"},{"lineNumber":209,"author":{"gitId":"-"},"content":" max-width: calc(#{$content-width} - (#{$spacing-unit} * 2));","lastModifiedDate":"2020-05-23"},{"lineNumber":210,"author":{"gitId":"-"},"content":" padding-right: $spacing-unit;","lastModifiedDate":"2020-05-23"},{"lineNumber":211,"author":{"gitId":"-"},"content":" padding-left: $spacing-unit;","lastModifiedDate":"2020-05-23"},{"lineNumber":212,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2020-05-23"},{"lineNumber":213,"author":{"gitId":"-"},"content":"}","lastModifiedDate":"2020-05-23"},{"lineNumber":214,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":215,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":216,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":217,"author":{"gitId":"-"},"content":"/**","lastModifiedDate":"2020-05-23"},{"lineNumber":218,"author":{"gitId":"-"},"content":" * Clearfix","lastModifiedDate":"2020-05-23"},{"lineNumber":219,"author":{"gitId":"-"},"content":" */","lastModifiedDate":"2020-05-23"},{"lineNumber":220,"author":{"gitId":"-"},"content":"%clearfix:after {","lastModifiedDate":"2020-05-23"},{"lineNumber":221,"author":{"gitId":"-"},"content":" content: \"\";","lastModifiedDate":"2020-05-23"},{"lineNumber":222,"author":{"gitId":"-"},"content":" display: table;","lastModifiedDate":"2020-05-23"},{"lineNumber":223,"author":{"gitId":"-"},"content":" clear: both;","lastModifiedDate":"2020-05-23"},{"lineNumber":224,"author":{"gitId":"-"},"content":"}","lastModifiedDate":"2020-05-23"},{"lineNumber":225,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":226,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":227,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":228,"author":{"gitId":"-"},"content":"/**","lastModifiedDate":"2020-05-23"},{"lineNumber":229,"author":{"gitId":"-"},"content":" * Icons","lastModifiedDate":"2020-05-23"},{"lineNumber":230,"author":{"gitId":"-"},"content":" */","lastModifiedDate":"2020-05-23"},{"lineNumber":231,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":232,"author":{"gitId":"-"},"content":".orange {","lastModifiedDate":"2020-05-23"},{"lineNumber":233,"author":{"gitId":"-"},"content":" color: #f66a0a;","lastModifiedDate":"2020-05-23"},{"lineNumber":234,"author":{"gitId":"-"},"content":"}","lastModifiedDate":"2020-05-23"},{"lineNumber":235,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":236,"author":{"gitId":"-"},"content":".grey {","lastModifiedDate":"2020-05-23"},{"lineNumber":237,"author":{"gitId":"-"},"content":" color: #828282;","lastModifiedDate":"2020-05-23"},{"lineNumber":238,"author":{"gitId":"-"},"content":"}","lastModifiedDate":"2020-05-23"},{"lineNumber":239,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":240,"author":{"gitId":"-"},"content":"/**","lastModifiedDate":"2020-05-23"},{"lineNumber":241,"author":{"gitId":"-"},"content":" * Tables","lastModifiedDate":"2020-05-23"},{"lineNumber":242,"author":{"gitId":"-"},"content":" */","lastModifiedDate":"2020-05-23"},{"lineNumber":243,"author":{"gitId":"-"},"content":"table {","lastModifiedDate":"2020-05-23"},{"lineNumber":244,"author":{"gitId":"-"},"content":" margin-bottom: $spacing-unit;","lastModifiedDate":"2020-05-23"},{"lineNumber":245,"author":{"gitId":"-"},"content":" width: 100%;","lastModifiedDate":"2020-05-23"},{"lineNumber":246,"author":{"gitId":"-"},"content":" text-align: $table-text-align;","lastModifiedDate":"2020-05-23"},{"lineNumber":247,"author":{"gitId":"-"},"content":" color: $table-text-color;","lastModifiedDate":"2020-05-23"},{"lineNumber":248,"author":{"gitId":"-"},"content":" border-collapse: collapse;","lastModifiedDate":"2020-05-23"},{"lineNumber":249,"author":{"gitId":"-"},"content":" border: 1px solid $table-border-color;","lastModifiedDate":"2020-05-23"},{"lineNumber":250,"author":{"gitId":"-"},"content":" tr {","lastModifiedDate":"2020-05-23"},{"lineNumber":251,"author":{"gitId":"-"},"content":" \u0026:nth-child(even) {","lastModifiedDate":"2020-05-23"},{"lineNumber":252,"author":{"gitId":"-"},"content":" background-color: $table-zebra-color;","lastModifiedDate":"2020-05-23"},{"lineNumber":253,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2020-05-23"},{"lineNumber":254,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2020-05-23"},{"lineNumber":255,"author":{"gitId":"-"},"content":" th, td {","lastModifiedDate":"2020-05-23"},{"lineNumber":256,"author":{"gitId":"-"},"content":" padding: ($spacing-unit / 3) ($spacing-unit / 2);","lastModifiedDate":"2020-05-23"},{"lineNumber":257,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2020-05-23"},{"lineNumber":258,"author":{"gitId":"-"},"content":" th {","lastModifiedDate":"2020-05-23"},{"lineNumber":259,"author":{"gitId":"-"},"content":" background-color: $table-header-bg-color;","lastModifiedDate":"2020-05-23"},{"lineNumber":260,"author":{"gitId":"-"},"content":" border: 1px solid $table-header-border;","lastModifiedDate":"2020-05-23"},{"lineNumber":261,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2020-05-23"},{"lineNumber":262,"author":{"gitId":"-"},"content":" td {","lastModifiedDate":"2020-05-23"},{"lineNumber":263,"author":{"gitId":"-"},"content":" border: 1px solid $table-border-color;","lastModifiedDate":"2020-05-23"},{"lineNumber":264,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2020-05-23"},{"lineNumber":265,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":266,"author":{"gitId":"-"},"content":" @include media-query($on-laptop) {","lastModifiedDate":"2020-05-23"},{"lineNumber":267,"author":{"gitId":"-"},"content":" display: block;","lastModifiedDate":"2020-05-23"},{"lineNumber":268,"author":{"gitId":"-"},"content":" overflow-x: auto;","lastModifiedDate":"2020-05-23"},{"lineNumber":269,"author":{"gitId":"-"},"content":" -webkit-overflow-scrolling: touch;","lastModifiedDate":"2020-05-23"},{"lineNumber":270,"author":{"gitId":"-"},"content":" -ms-overflow-style: -ms-autohiding-scrollbar;","lastModifiedDate":"2020-05-23"},{"lineNumber":271,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2020-05-23"},{"lineNumber":272,"author":{"gitId":"-"},"content":"}","lastModifiedDate":"2020-05-23"},{"lineNumber":273,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2021-01-11"},{"lineNumber":274,"author":{"gitId":"-"},"content":"@media print {","lastModifiedDate":"2021-01-12"},{"lineNumber":275,"author":{"gitId":"-"},"content":" /**","lastModifiedDate":"2021-01-11"},{"lineNumber":276,"author":{"gitId":"-"},"content":" * Prevents page break from cutting through content when printing","lastModifiedDate":"2021-01-12"},{"lineNumber":277,"author":{"gitId":"-"},"content":" */","lastModifiedDate":"2021-01-11"},{"lineNumber":278,"author":{"gitId":"-"},"content":" body {","lastModifiedDate":"2021-01-11"},{"lineNumber":279,"author":{"gitId":"-"},"content":" display: block;","lastModifiedDate":"2021-01-11"},{"lineNumber":280,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2021-01-11"},{"lineNumber":281,"author":{"gitId":"-"},"content":" /**","lastModifiedDate":"2021-01-12"},{"lineNumber":282,"author":{"gitId":"-"},"content":" * Replaces the top navigation menu with the project name when printing","lastModifiedDate":"2021-01-12"},{"lineNumber":283,"author":{"gitId":"-"},"content":" */","lastModifiedDate":"2021-01-12"},{"lineNumber":284,"author":{"gitId":"-"},"content":" .site-header .wrapper {","lastModifiedDate":"2021-01-12"},{"lineNumber":285,"author":{"gitId":"-"},"content":" display: none;","lastModifiedDate":"2021-01-12"},{"lineNumber":286,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2021-01-12"},{"lineNumber":287,"author":{"gitId":"-"},"content":" .site-header {","lastModifiedDate":"2021-01-12"},{"lineNumber":288,"author":{"gitId":"-"},"content":" text-align: center;","lastModifiedDate":"2021-01-12"},{"lineNumber":289,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2021-01-12"},{"lineNumber":290,"author":{"gitId":"-"},"content":" .site-header:before {","lastModifiedDate":"2021-01-12"},{"lineNumber":291,"author":{"gitId":"Wongqingyee"},"content":" content: \"TeachStack\";","lastModifiedDate":"2024-02-29"},{"lineNumber":292,"author":{"gitId":"-"},"content":" font-size: 32px;","lastModifiedDate":"2021-01-12"},{"lineNumber":293,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2021-01-11"},{"lineNumber":294,"author":{"gitId":"-"},"content":"}","lastModifiedDate":"2021-01-12"},{"lineNumber":295,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2021-01-12"}],"authorContributionMap":{"Wongqingyee":1,"-":294}},{"path":"docs/team/jiaxineu.md","fileType":"docs","lines":[{"lineNumber":1,"author":{"gitId":"JiaXinEu"},"content":"---","lastModifiedDate":"2024-02-29"},{"lineNumber":2,"author":{"gitId":"JiaXinEu"},"content":"layout: page","lastModifiedDate":"2024-02-29"},{"lineNumber":3,"author":{"gitId":"JiaXinEu"},"content":"title: Jia Xin Eu\u0027s Project Portfolio Page","lastModifiedDate":"2024-02-29"},{"lineNumber":4,"author":{"gitId":"JiaXinEu"},"content":"---","lastModifiedDate":"2024-02-29"},{"lineNumber":5,"author":{"gitId":"JiaXinEu"},"content":"","lastModifiedDate":"2024-02-29"},{"lineNumber":6,"author":{"gitId":"JiaXinEu"},"content":"### Project: TeachStack","lastModifiedDate":"2024-02-29"},{"lineNumber":7,"author":{"gitId":"JiaXinEu"},"content":"","lastModifiedDate":"2024-02-29"},{"lineNumber":8,"author":{"gitId":"JiaXinEu"},"content":"TeachStack 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.","lastModifiedDate":"2024-02-29"},{"lineNumber":9,"author":{"gitId":"JiaXinEu"},"content":"","lastModifiedDate":"2024-02-29"},{"lineNumber":10,"author":{"gitId":"JiaXinEu"},"content":"Given below are my contributions to the project.","lastModifiedDate":"2024-02-29"},{"lineNumber":11,"author":{"gitId":"JiaXinEu"},"content":"","lastModifiedDate":"2024-02-29"},{"lineNumber":12,"author":{"gitId":"JiaXinEu"},"content":"* **New Feature**:","lastModifiedDate":"2024-02-29"},{"lineNumber":13,"author":{"gitId":"JiaXinEu"},"content":"* **Code contributed**:","lastModifiedDate":"2024-02-29"},{"lineNumber":14,"author":{"gitId":"JiaXinEu"},"content":"* **Project management**:","lastModifiedDate":"2024-02-29"},{"lineNumber":15,"author":{"gitId":"JiaXinEu"},"content":"* **Enhancements to existing features**:","lastModifiedDate":"2024-02-29"},{"lineNumber":16,"author":{"gitId":"JiaXinEu"},"content":"* **Documentation**:","lastModifiedDate":"2024-02-29"},{"lineNumber":17,"author":{"gitId":"JiaXinEu"},"content":"* **Community**:","lastModifiedDate":"2024-02-29"},{"lineNumber":18,"author":{"gitId":"JiaXinEu"},"content":"* **Tools**:","lastModifiedDate":"2024-02-29"},{"lineNumber":19,"author":{"gitId":"JiaXinEu"},"content":" * Integrated a new Github plugin (CircleCI) to the team repo","lastModifiedDate":"2024-02-29"}],"authorContributionMap":{"JiaXinEu":19}}] diff --git a/AY2324S2-CS2103T-T09-1_tp_master/commits.json b/AY2324S2-CS2103T-T09-1_tp_master/commits.json index 7e4ca648..a51a2863 100644 --- a/AY2324S2-CS2103T-T09-1_tp_master/commits.json +++ b/AY2324S2-CS2103T-T09-1_tp_master/commits.json @@ -1 +1 @@ -{"authorDailyContributionsMap":{"yashma-sonara":[{"date":"2024-02-29","commitResults":[{"hash":"8b21ea083578a777ef6963d95670f52c40f47578","isMergeCommit":false,"messageTitle":"Update AboutMe details","messageBody":"","fileTypesAndContributionMap":{"docs":{"insertions":5,"deletions":5}}},{"hash":"93264b56505f34d5436886966c5bc32a7401e724","isMergeCommit":true,"messageTitle":"Merge branch \u0027master\u0027 into branch-UpdateAboutUs","messageBody":"","fileTypesAndContributionMap":{}},{"hash":"e0b65f6ce8e5556865d377fd182b0b653c8725ab","isMergeCommit":false,"messageTitle":"Add documentation for edit","messageBody":"","fileTypesAndContributionMap":{"docs":{"insertions":10,"deletions":15}}},{"hash":"fd91c29d1929d07ee3d036f97be62e79c3b60516","isMergeCommit":true,"messageTitle":"Merge pull request #1 from yashma-sonara/branch-UpdateUG","messageBody":"Add documentation for edit","fileTypesAndContributionMap":{}},{"hash":"b5a546474b8690dfcdae7d8241de1bdfd005e510","isMergeCommit":false,"messageTitle":"Fix command summary","messageBody":"","fileTypesAndContributionMap":{"docs":{"insertions":7,"deletions":9}}},{"hash":"49c45f433b79b4e7bdcc5b20deae5f49dd55d382","isMergeCommit":true,"messageTitle":"Merge branch \u0027master\u0027 of https://github.com/yashma-sonara/tp","messageBody":"","fileTypesAndContributionMap":{}},{"hash":"35560c96bb8c15543b8d373922ee5c1730bd7cb6","isMergeCommit":false,"messageTitle":"Fix edit description","messageBody":"","fileTypesAndContributionMap":{"docs":{"insertions":1,"deletions":1}}},{"hash":"e102c120a1b2ff4a463dd4361f66437ff076e057","isMergeCommit":false,"messageTitle":"Fix edit issues","messageBody":"","fileTypesAndContributionMap":{"docs":{"insertions":1,"deletions":1}}},{"hash":"7a782cdbee41766c48da279a3fba6c90cab2f74d","isMergeCommit":true,"messageTitle":"Merge pull request #17 from JiaXinEu/branch-UpdateUG","messageBody":"Update user guide for delete feature","fileTypesAndContributionMap":{}},{"hash":"7ee113a8d9ecf417cebfe7cf1ce9a18382820b93","isMergeCommit":true,"messageTitle":"Merge pull request #21 from JiaXinEu/branch-UpdateDG","messageBody":"Add use cases for a few representative user stories","fileTypesAndContributionMap":{}}]}],"willowisp01":[{"date":"2024-02-29","commitResults":[{"hash":"8e2d1e0f6c4d5455d3eda4290b9d24b170bd8ba8","isMergeCommit":false,"messageTitle":"Update zhuoen aboutus","messageBody":"","fileTypesAndContributionMap":{"docs":{"insertions":3,"deletions":3}}},{"hash":"7f2512bf22d6f266c24641169bcf060fa97bf6fe","isMergeCommit":true,"messageTitle":"Merge pull request #4 from ronnnnnnnnn/branch-AboutUs","messageBody":"Add personal details","fileTypesAndContributionMap":{}},{"hash":"9e2ab16b4b146ebb5b7c70179a1fcba0a89763ea","isMergeCommit":true,"messageTitle":"Merge pull request #5 from willowisp01/about-us-zhuoen","messageBody":"Update zhuoen aboutus","fileTypesAndContributionMap":{}},{"hash":"cd08ed3d5f712e75c324ccfe58c2e7ad42f3a62b","isMergeCommit":true,"messageTitle":"Merge pull request #8 from JiaXinEu/branch-ABoutUs","messageBody":"Update details on AboutUs page","fileTypesAndContributionMap":{}},{"hash":"c38e93cba0dd0f0c650711ff81b81deb28d0f777","isMergeCommit":true,"messageTitle":"Merge pull request #6 from yashma-sonara/branch-UpdateAboutUs","messageBody":"Update AboutMe details","fileTypesAndContributionMap":{}},{"hash":"a1ea9e55a56c12f8035ac03564f2d4d78d01f2d8","isMergeCommit":false,"messageTitle":"Update README","messageBody":"","fileTypesAndContributionMap":{"docs":{"insertions":13,"deletions":10}}},{"hash":"2227683f7ded7a68d83ddbf576e5fd1ba1f20f16","isMergeCommit":false,"messageTitle":"Update user stories","messageBody":"","fileTypesAndContributionMap":{"docs":{"insertions":10,"deletions":9}}},{"hash":"60bf68dcf977b5fc0bc7dc1040e062fa21f4410f","isMergeCommit":true,"messageTitle":"Merged","messageBody":"","fileTypesAndContributionMap":{}},{"hash":"d8163396b7b915f5248fa76b27ecc8ad742d377b","isMergeCommit":true,"messageTitle":"Merge pull request #16 from willowisp01/update-readme","messageBody":"Update README","fileTypesAndContributionMap":{}},{"hash":"ca4fac3f55669337719397e45542b51c18ceff71","isMergeCommit":false,"messageTitle":"Update docs/DeveloperGuide.md","messageBody":"Co-authored-by: JiaXinEu \u003c108446221+JiaXinEu@users.noreply.github.com\u003e","fileTypesAndContributionMap":{"docs":{"insertions":2,"deletions":2}}},{"hash":"33bc6edf23d865e5b7be44d3c1bf58281de38760","isMergeCommit":false,"messageTitle":"Update docs/DeveloperGuide.md","messageBody":"Co-authored-by: JiaXinEu \u003c108446221+JiaXinEu@users.noreply.github.com\u003e","fileTypesAndContributionMap":{"docs":{"insertions":2,"deletions":2}}},{"hash":"bb014713119bdefe053eb8ce0237651eb519c447","isMergeCommit":true,"messageTitle":"Merge pull request #15 from willowisp01/update-user-stories","messageBody":"Update user stories","fileTypesAndContributionMap":{}},{"hash":"39e464e119f91cb771b85f68dffef1392091a53c","isMergeCommit":true,"messageTitle":"Merge pull request #20 from Wongqingyee/branch-site-wide-settings","messageBody":"Update the name for project website","fileTypesAndContributionMap":{}},{"hash":"46e12ac4f4c679bb0cb186fa045af3d66561e171","isMergeCommit":true,"messageTitle":"Merge pull request #22 from JiaXinEu/branch-Update-SitewideSettings","messageBody":"Update title and repository on config.yml for website","fileTypesAndContributionMap":{}}]}],"Wongqingyee":[{"date":"2024-02-29","commitResults":[{"hash":"c7c01419555090bac59e0041e85b821e908080d3","isMergeCommit":false,"messageTitle":"Update AboutUs.md","messageBody":"","fileTypesAndContributionMap":{"docs":{"insertions":3,"deletions":3}}},{"hash":"d2cb7490ad27b0656bb716d3c3b501f5f90be250","isMergeCommit":true,"messageTitle":"Merge branch \u0027master\u0027 into branch-AboutUs","messageBody":"","fileTypesAndContributionMap":{}},{"hash":"1cc06d7055987b49b20a09eb0b932985490b9c5a","isMergeCommit":true,"messageTitle":"Merge pull request #7 from Wongqingyee/branch-AboutUs","messageBody":"Update AboutUs.md","fileTypesAndContributionMap":{}},{"hash":"02d5619593836b1d644b1c2aefee34a5f01ea215","isMergeCommit":false,"messageTitle":"Update the add feature","messageBody":"","fileTypesAndContributionMap":{"docs":{"insertions":10,"deletions":12}}},{"hash":"eb8692ae31f8db56cebf331b6beaed3bb9fd801f","isMergeCommit":false,"messageTitle":"Update the Java CI link","messageBody":"","fileTypesAndContributionMap":{"docs":{"insertions":1,"deletions":1}}},{"hash":"5394b75ecc128705fd340e2bee4e24442e598eda","isMergeCommit":false,"messageTitle":"Update the Quick start in the UG","messageBody":"","fileTypesAndContributionMap":{"docs":{"insertions":2,"deletions":2}}},{"hash":"117610cad2339c73d615ea33f476001d662ea590","isMergeCommit":true,"messageTitle":"Merge branch \u0027master\u0027 into branch-README","messageBody":"","fileTypesAndContributionMap":{}},{"hash":"77aeb103e6123c330c9fc15f395959ee7355427e","isMergeCommit":true,"messageTitle":"Merge pull request #13 from Wongqingyee/branch-README","messageBody":"Update the Java CI link","fileTypesAndContributionMap":{}},{"hash":"f532e8c92dcc7c07defa94a2bfe73f403db1e0be","isMergeCommit":false,"messageTitle":"Update the format for the email under command summary","messageBody":"","fileTypesAndContributionMap":{"docs":{"insertions":1,"deletions":1}}},{"hash":"b7b1fa4a377d942dfe651c8817b4bf8e81117a68","isMergeCommit":true,"messageTitle":"Merge pull request #34 from JiaXinEu/branch-UpdateUG","messageBody":"Update view command on user guide","fileTypesAndContributionMap":{}}]}],"JiaXinEu":[{"date":"2024-02-29","commitResults":[{"hash":"536eb720103280bbb7a54e0ed9010342a3ee6fd9","isMergeCommit":false,"messageTitle":"Update details on AboutUs page","messageBody":"","fileTypesAndContributionMap":{"docs":{"insertions":23,"deletions":4}}},{"hash":"35e29af94b3029c4dad8ca7085c9db2404d1fcb1","isMergeCommit":false,"messageTitle":"Update links to match the project","messageBody":"","fileTypesAndContributionMap":{"docs":{"insertions":3,"deletions":3}}},{"hash":"009e9c8b692f5e1186f9458628edbb2957f13f5c","isMergeCommit":false,"messageTitle":"Update user guide for delete feature","messageBody":"","fileTypesAndContributionMap":{"docs":{"insertions":10,"deletions":9}}},{"hash":"5f993ac50e341d3825288ee82c48c40b17dd8d25","isMergeCommit":false,"messageTitle":"Update quick start on user guide","messageBody":"","fileTypesAndContributionMap":{"docs":{"insertions":1,"deletions":1}}},{"hash":"55301f589b82d2d248cb9b3d4039b022deb099aa","isMergeCommit":false,"messageTitle":"Add use cases for a few representative user stories","messageBody":"","fileTypesAndContributionMap":{"docs":{"insertions":47,"deletions":9}}},{"hash":"a47aacf11f78229d546522b7f8bc4c58f9cd7472","isMergeCommit":true,"messageTitle":"Merge pull request #14 from Wongqingyee/branch-UG","messageBody":"Update the add feature","fileTypesAndContributionMap":{}},{"hash":"c62543a347258de01805dd9d8ea048d22e9d4ad4","isMergeCommit":true,"messageTitle":"Merge pull request #18 from yashma-sonara/branch-UpdateDG","messageBody":"Update UG","fileTypesAndContributionMap":{}},{"hash":"4683358f08086c310998f5567b24f41ecc55b4bc","isMergeCommit":true,"messageTitle":"Merge pull request #19 from ronnnnnnnnn/branch-Docs","messageBody":"Update documentation","fileTypesAndContributionMap":{}},{"hash":"f7c84c8ef5565b8a21d9cc42fd388cccaa545243","isMergeCommit":false,"messageTitle":"Update view command on user guide","messageBody":"","fileTypesAndContributionMap":{"docs":{"insertions":1,"deletions":1}}}]}],"ronnnnnnnnn":[{"date":"2024-02-29","commitResults":[{"hash":"6f0a27cda3f25340d681470edd77839b72bd3f05","isMergeCommit":false,"messageTitle":"Add personal details","messageBody":"","fileTypesAndContributionMap":{"docs":{"insertions":3,"deletions":3}}},{"hash":"2f11dc9946835acd0b8cefee2a7ada3d89a51ad0","isMergeCommit":false,"messageTitle":"Update UserGuide.md","messageBody":"","fileTypesAndContributionMap":{"docs":{"insertions":7,"deletions":12}}},{"hash":"18b7b249e9ce8ea95f67da4e15511b2c38375033","isMergeCommit":false,"messageTitle":"Update DeveloperGuide.md","messageBody":"","fileTypesAndContributionMap":{"docs":{"insertions":4,"deletions":3}}},{"hash":"61b463d998f48f196cdd7bee5ca5578cfaf31d60","isMergeCommit":true,"messageTitle":"Merge pull request #12 from JiaXinEu/branch-README","messageBody":"Update links to match the project","fileTypesAndContributionMap":{}},{"hash":"f4daa569d04d18beee6f5c531d9c30182ce69797","isMergeCommit":true,"messageTitle":"Merge pull request #23 from Wongqingyee/master","messageBody":"Update the format for the email under command summary","fileTypesAndContributionMap":{}}]}]},"authorFileTypeContributionMap":{"yashma-sonara":{"docs":18,"functional-code":0,"test-code":0},"willowisp01":{"docs":23,"functional-code":0,"test-code":0},"Wongqingyee":{"docs":16,"functional-code":0,"test-code":0,"other":1},"JiaXinEu":{"docs":69,"functional-code":0,"test-code":0},"ronnnnnnnnn":{"docs":14,"functional-code":0,"test-code":0}},"authorContributionVariance":{"yashma-sonara":370.40817,"willowisp01":384.0,"Wongqingyee":158.69388,"JiaXinEu":1536.0,"ronnnnnnnnn":125.38776},"authorDisplayNameMap":{"yashma-sonara":"CS2103T-T09-1 SONA..SHMA","willowisp01":"CS2103T-T09-1 TAN ..O EN","Wongqingyee":"CS2103T-T09-1 WONG.. YEE","JiaXinEu":"CS2103T-T09-1 EU J.. XIN","ronnnnnnnnn":"CS2103T-T09-1 RONN..KEAT"}} +{"authorDailyContributionsMap":{"yashma-sonara":[{"date":"2024-02-29","commitResults":[{"hash":"8b21ea083578a777ef6963d95670f52c40f47578","isMergeCommit":false,"messageTitle":"Update AboutMe details","messageBody":"","fileTypesAndContributionMap":{"docs":{"insertions":5,"deletions":5}}},{"hash":"93264b56505f34d5436886966c5bc32a7401e724","isMergeCommit":true,"messageTitle":"Merge branch \u0027master\u0027 into branch-UpdateAboutUs","messageBody":"","fileTypesAndContributionMap":{}},{"hash":"e0b65f6ce8e5556865d377fd182b0b653c8725ab","isMergeCommit":false,"messageTitle":"Add documentation for edit","messageBody":"","fileTypesAndContributionMap":{"docs":{"insertions":10,"deletions":15}}},{"hash":"fd91c29d1929d07ee3d036f97be62e79c3b60516","isMergeCommit":true,"messageTitle":"Merge pull request #1 from yashma-sonara/branch-UpdateUG","messageBody":"Add documentation for edit","fileTypesAndContributionMap":{}},{"hash":"b5a546474b8690dfcdae7d8241de1bdfd005e510","isMergeCommit":false,"messageTitle":"Fix command summary","messageBody":"","fileTypesAndContributionMap":{"docs":{"insertions":7,"deletions":9}}},{"hash":"49c45f433b79b4e7bdcc5b20deae5f49dd55d382","isMergeCommit":true,"messageTitle":"Merge branch \u0027master\u0027 of https://github.com/yashma-sonara/tp","messageBody":"","fileTypesAndContributionMap":{}},{"hash":"35560c96bb8c15543b8d373922ee5c1730bd7cb6","isMergeCommit":false,"messageTitle":"Fix edit description","messageBody":"","fileTypesAndContributionMap":{"docs":{"insertions":1,"deletions":1}}},{"hash":"e102c120a1b2ff4a463dd4361f66437ff076e057","isMergeCommit":false,"messageTitle":"Fix edit issues","messageBody":"","fileTypesAndContributionMap":{"docs":{"insertions":1,"deletions":1}}},{"hash":"7a782cdbee41766c48da279a3fba6c90cab2f74d","isMergeCommit":true,"messageTitle":"Merge pull request #17 from JiaXinEu/branch-UpdateUG","messageBody":"Update user guide for delete feature","fileTypesAndContributionMap":{}},{"hash":"7ee113a8d9ecf417cebfe7cf1ce9a18382820b93","isMergeCommit":true,"messageTitle":"Merge pull request #21 from JiaXinEu/branch-UpdateDG","messageBody":"Add use cases for a few representative user stories","fileTypesAndContributionMap":{}}]}],"willowisp01":[{"date":"2024-02-29","commitResults":[{"hash":"8e2d1e0f6c4d5455d3eda4290b9d24b170bd8ba8","isMergeCommit":false,"messageTitle":"Update zhuoen aboutus","messageBody":"","fileTypesAndContributionMap":{"docs":{"insertions":3,"deletions":3}}},{"hash":"7f2512bf22d6f266c24641169bcf060fa97bf6fe","isMergeCommit":true,"messageTitle":"Merge pull request #4 from ronnnnnnnnn/branch-AboutUs","messageBody":"Add personal details","fileTypesAndContributionMap":{}},{"hash":"9e2ab16b4b146ebb5b7c70179a1fcba0a89763ea","isMergeCommit":true,"messageTitle":"Merge pull request #5 from willowisp01/about-us-zhuoen","messageBody":"Update zhuoen aboutus","fileTypesAndContributionMap":{}},{"hash":"cd08ed3d5f712e75c324ccfe58c2e7ad42f3a62b","isMergeCommit":true,"messageTitle":"Merge pull request #8 from JiaXinEu/branch-ABoutUs","messageBody":"Update details on AboutUs page","fileTypesAndContributionMap":{}},{"hash":"c38e93cba0dd0f0c650711ff81b81deb28d0f777","isMergeCommit":true,"messageTitle":"Merge pull request #6 from yashma-sonara/branch-UpdateAboutUs","messageBody":"Update AboutMe details","fileTypesAndContributionMap":{}},{"hash":"a1ea9e55a56c12f8035ac03564f2d4d78d01f2d8","isMergeCommit":false,"messageTitle":"Update README","messageBody":"","fileTypesAndContributionMap":{"docs":{"insertions":13,"deletions":10}}},{"hash":"2227683f7ded7a68d83ddbf576e5fd1ba1f20f16","isMergeCommit":false,"messageTitle":"Update user stories","messageBody":"","fileTypesAndContributionMap":{"docs":{"insertions":10,"deletions":9}}},{"hash":"60bf68dcf977b5fc0bc7dc1040e062fa21f4410f","isMergeCommit":true,"messageTitle":"Merged","messageBody":"","fileTypesAndContributionMap":{}},{"hash":"d8163396b7b915f5248fa76b27ecc8ad742d377b","isMergeCommit":true,"messageTitle":"Merge pull request #16 from willowisp01/update-readme","messageBody":"Update README","fileTypesAndContributionMap":{}},{"hash":"ca4fac3f55669337719397e45542b51c18ceff71","isMergeCommit":false,"messageTitle":"Update docs/DeveloperGuide.md","messageBody":"Co-authored-by: JiaXinEu \u003c108446221+JiaXinEu@users.noreply.github.com\u003e","fileTypesAndContributionMap":{"docs":{"insertions":2,"deletions":2}}},{"hash":"33bc6edf23d865e5b7be44d3c1bf58281de38760","isMergeCommit":false,"messageTitle":"Update docs/DeveloperGuide.md","messageBody":"Co-authored-by: JiaXinEu \u003c108446221+JiaXinEu@users.noreply.github.com\u003e","fileTypesAndContributionMap":{"docs":{"insertions":2,"deletions":2}}},{"hash":"bb014713119bdefe053eb8ce0237651eb519c447","isMergeCommit":true,"messageTitle":"Merge pull request #15 from willowisp01/update-user-stories","messageBody":"Update user stories","fileTypesAndContributionMap":{}},{"hash":"39e464e119f91cb771b85f68dffef1392091a53c","isMergeCommit":true,"messageTitle":"Merge pull request #20 from Wongqingyee/branch-site-wide-settings","messageBody":"Update the name for project website","fileTypesAndContributionMap":{}},{"hash":"46e12ac4f4c679bb0cb186fa045af3d66561e171","isMergeCommit":true,"messageTitle":"Merge pull request #22 from JiaXinEu/branch-Update-SitewideSettings","messageBody":"Update title and repository on config.yml for website","fileTypesAndContributionMap":{}}]}],"Wongqingyee":[{"date":"2024-02-29","commitResults":[{"hash":"c7c01419555090bac59e0041e85b821e908080d3","isMergeCommit":false,"messageTitle":"Update AboutUs.md","messageBody":"","fileTypesAndContributionMap":{"docs":{"insertions":3,"deletions":3}}},{"hash":"d2cb7490ad27b0656bb716d3c3b501f5f90be250","isMergeCommit":true,"messageTitle":"Merge branch \u0027master\u0027 into branch-AboutUs","messageBody":"","fileTypesAndContributionMap":{}},{"hash":"1cc06d7055987b49b20a09eb0b932985490b9c5a","isMergeCommit":true,"messageTitle":"Merge pull request #7 from Wongqingyee/branch-AboutUs","messageBody":"Update AboutUs.md","fileTypesAndContributionMap":{}},{"hash":"02d5619593836b1d644b1c2aefee34a5f01ea215","isMergeCommit":false,"messageTitle":"Update the add feature","messageBody":"","fileTypesAndContributionMap":{"docs":{"insertions":10,"deletions":12}}},{"hash":"eb8692ae31f8db56cebf331b6beaed3bb9fd801f","isMergeCommit":false,"messageTitle":"Update the Java CI link","messageBody":"","fileTypesAndContributionMap":{"docs":{"insertions":1,"deletions":1}}},{"hash":"5394b75ecc128705fd340e2bee4e24442e598eda","isMergeCommit":false,"messageTitle":"Update the Quick start in the UG","messageBody":"","fileTypesAndContributionMap":{"docs":{"insertions":2,"deletions":2}}},{"hash":"117610cad2339c73d615ea33f476001d662ea590","isMergeCommit":true,"messageTitle":"Merge branch \u0027master\u0027 into branch-README","messageBody":"","fileTypesAndContributionMap":{}},{"hash":"77aeb103e6123c330c9fc15f395959ee7355427e","isMergeCommit":true,"messageTitle":"Merge pull request #13 from Wongqingyee/branch-README","messageBody":"Update the Java CI link","fileTypesAndContributionMap":{}},{"hash":"f532e8c92dcc7c07defa94a2bfe73f403db1e0be","isMergeCommit":false,"messageTitle":"Update the format for the email under command summary","messageBody":"","fileTypesAndContributionMap":{"docs":{"insertions":1,"deletions":1}}},{"hash":"b7b1fa4a377d942dfe651c8817b4bf8e81117a68","isMergeCommit":true,"messageTitle":"Merge pull request #34 from JiaXinEu/branch-UpdateUG","messageBody":"Update view command on user guide","fileTypesAndContributionMap":{}}]}],"JiaXinEu":[{"date":"2024-02-29","commitResults":[{"hash":"536eb720103280bbb7a54e0ed9010342a3ee6fd9","isMergeCommit":false,"messageTitle":"Update details on AboutUs page","messageBody":"","fileTypesAndContributionMap":{"docs":{"insertions":23,"deletions":4}}},{"hash":"35e29af94b3029c4dad8ca7085c9db2404d1fcb1","isMergeCommit":false,"messageTitle":"Update links to match the project","messageBody":"","fileTypesAndContributionMap":{"docs":{"insertions":3,"deletions":3}}},{"hash":"009e9c8b692f5e1186f9458628edbb2957f13f5c","isMergeCommit":false,"messageTitle":"Update user guide for delete feature","messageBody":"","fileTypesAndContributionMap":{"docs":{"insertions":10,"deletions":9}}},{"hash":"5f993ac50e341d3825288ee82c48c40b17dd8d25","isMergeCommit":false,"messageTitle":"Update quick start on user guide","messageBody":"","fileTypesAndContributionMap":{"docs":{"insertions":1,"deletions":1}}},{"hash":"55301f589b82d2d248cb9b3d4039b022deb099aa","isMergeCommit":false,"messageTitle":"Add use cases for a few representative user stories","messageBody":"","fileTypesAndContributionMap":{"docs":{"insertions":47,"deletions":9}}},{"hash":"a47aacf11f78229d546522b7f8bc4c58f9cd7472","isMergeCommit":true,"messageTitle":"Merge pull request #14 from Wongqingyee/branch-UG","messageBody":"Update the add feature","fileTypesAndContributionMap":{}},{"hash":"c62543a347258de01805dd9d8ea048d22e9d4ad4","isMergeCommit":true,"messageTitle":"Merge pull request #18 from yashma-sonara/branch-UpdateDG","messageBody":"Update UG","fileTypesAndContributionMap":{}},{"hash":"4683358f08086c310998f5567b24f41ecc55b4bc","isMergeCommit":true,"messageTitle":"Merge pull request #19 from ronnnnnnnnn/branch-Docs","messageBody":"Update documentation","fileTypesAndContributionMap":{}},{"hash":"f7c84c8ef5565b8a21d9cc42fd388cccaa545243","isMergeCommit":false,"messageTitle":"Update view command on user guide","messageBody":"","fileTypesAndContributionMap":{"docs":{"insertions":1,"deletions":1}}}]},{"date":"2024-03-08","commitResults":[{"hash":"be644ed8a99823eb0109d793a8281e6d36597df0","isMergeCommit":false,"messageTitle":"Update NFR section in DG","messageBody":"","fileTypesAndContributionMap":{"docs":{"insertions":2,"deletions":1}}},{"hash":"8236bfdfa5f6c1bcbe20fffde1bee80f36392183","isMergeCommit":true,"messageTitle":"Merge pull request #44 from ronnnnnnnnn/branch-remove-AB3","messageBody":"Remove traces of AB3 in UserGuide","fileTypesAndContributionMap":{}}]}],"ronnnnnnnnn":[{"date":"2024-02-29","commitResults":[{"hash":"6f0a27cda3f25340d681470edd77839b72bd3f05","isMergeCommit":false,"messageTitle":"Add personal details","messageBody":"","fileTypesAndContributionMap":{"docs":{"insertions":3,"deletions":3}}},{"hash":"2f11dc9946835acd0b8cefee2a7ada3d89a51ad0","isMergeCommit":false,"messageTitle":"Update UserGuide.md","messageBody":"","fileTypesAndContributionMap":{"docs":{"insertions":7,"deletions":12}}},{"hash":"18b7b249e9ce8ea95f67da4e15511b2c38375033","isMergeCommit":false,"messageTitle":"Update DeveloperGuide.md","messageBody":"","fileTypesAndContributionMap":{"docs":{"insertions":4,"deletions":3}}},{"hash":"61b463d998f48f196cdd7bee5ca5578cfaf31d60","isMergeCommit":true,"messageTitle":"Merge pull request #12 from JiaXinEu/branch-README","messageBody":"Update links to match the project","fileTypesAndContributionMap":{}},{"hash":"f4daa569d04d18beee6f5c531d9c30182ce69797","isMergeCommit":true,"messageTitle":"Merge pull request #23 from Wongqingyee/master","messageBody":"Update the format for the email under command summary","fileTypesAndContributionMap":{}}]},{"date":"2024-03-08","commitResults":[{"hash":"07dbd25d80d74ae5fd1901676d9277618eac1589","isMergeCommit":true,"messageTitle":"Merge pull request #43 from JiaXinEu/branch-UpdateDG-NFR","messageBody":"Update NFR section in DG","fileTypesAndContributionMap":{}},{"hash":"3641ef22360b9ef7dabe7e03288e3a086bb91711","isMergeCommit":false,"messageTitle":"Remove traces of AB3 in UserGuide","messageBody":"","fileTypesAndContributionMap":{"docs":{"insertions":17,"deletions":17}}}]}]},"authorFileTypeContributionMap":{"yashma-sonara":{"docs":18,"functional-code":0,"test-code":0},"willowisp01":{"docs":23,"functional-code":0,"test-code":0},"Wongqingyee":{"docs":14,"functional-code":0,"test-code":0,"other":1},"JiaXinEu":{"docs":71,"functional-code":0,"test-code":0},"ronnnnnnnnn":{"docs":25,"functional-code":0,"test-code":0}},"authorContributionVariance":{"yashma-sonara":188.22215,"willowisp01":195.12888,"Wongqingyee":80.64,"JiaXinEu":778.0887,"ronnnnnnnnn":125.973335},"authorDisplayNameMap":{"yashma-sonara":"CS2103T-T09-1 SONA..SHMA","willowisp01":"CS2103T-T09-1 TAN ..O EN","Wongqingyee":"CS2103T-T09-1 WONG.. YEE","JiaXinEu":"CS2103T-T09-1 EU J.. XIN","ronnnnnnnnn":"CS2103T-T09-1 RONN..KEAT"}} diff --git a/AY2324S2-CS2103T-T09-2_tp_master/authorship.json b/AY2324S2-CS2103T-T09-2_tp_master/authorship.json index 02f92315..7cf1d8a8 100644 --- a/AY2324S2-CS2103T-T09-2_tp_master/authorship.json +++ b/AY2324S2-CS2103T-T09-2_tp_master/authorship.json @@ -1 +1 @@ -[{"path":"README.md","fileType":"docs","lines":[{"lineNumber":1,"author":{"gitId":"kailinteoo"},"content":"[![CI Status](https://github.com/se-edu/addressbook-level3/workflows/Java%20CI/badge.svg)](https://github.com/AY2324S2-CS2103T-T09-2/tp/actions)","lastModifiedDate":"2024-03-06"},{"lineNumber":2,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":3,"author":{"gitId":"-"},"content":"[![codecov](https://codecov.io/gh/AY2324S2-CS2103T-T09-2/tp/graph/badge.svg?token\u003dBMICX593IT)](https://codecov.io/gh/AY2324S2-CS2103T-T09-2/tp)","lastModifiedDate":"2024-02-17"},{"lineNumber":4,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2024-02-17"},{"lineNumber":5,"author":{"gitId":"-"},"content":"![Ui](docs/images/Ui.png)","lastModifiedDate":"2020-05-23"},{"lineNumber":6,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":7,"author":{"gitId":"kailinteoo"},"content":"# Introduction","lastModifiedDate":"2024-03-06"},{"lineNumber":8,"author":{"gitId":"kailinteoo"},"content":"Welcome to BookKeeper, your solution for efficient customer management for **small business owners in the crochet","lastModifiedDate":"2024-03-06"},{"lineNumber":9,"author":{"gitId":"kailinteoo"},"content":"industry**. \u003cbr\u003e","lastModifiedDate":"2024-03-06"},{"lineNumber":10,"author":{"gitId":"kailinteoo"},"content":"","lastModifiedDate":"2024-03-06"},{"lineNumber":11,"author":{"gitId":"kailinteoo"},"content":"This application is designed to streamline customer lists and enhance productivity for individuals operating","lastModifiedDate":"2024-03-06"},{"lineNumber":12,"author":{"gitId":"kailinteoo"},"content":"small businesses with limited resources and manpower. With BookKeeper, you can easily manage customer information, track","lastModifiedDate":"2024-03-06"},{"lineNumber":13,"author":{"gitId":"kailinteoo"},"content":"orders, and personalize your customer interactions, all through a user-friendly command-line interface.","lastModifiedDate":"2024-03-06"},{"lineNumber":14,"author":{"gitId":"kailinteoo"},"content":"","lastModifiedDate":"2024-03-06"},{"lineNumber":15,"author":{"gitId":"kailinteoo"},"content":"For the detailed documentation of this project, see the [BookKeeper](https://ay2324s2-cs2103t-t09-2.github.io/tp/).","lastModifiedDate":"2024-03-06"},{"lineNumber":16,"author":{"gitId":"kailinteoo"},"content":"","lastModifiedDate":"2024-03-06"},{"lineNumber":17,"author":{"gitId":"kailinteoo"},"content":"# Acknowledgement","lastModifiedDate":"2024-03-06"},{"lineNumber":18,"author":{"gitId":"kailinteoo"},"content":"","lastModifiedDate":"2024-03-06"},{"lineNumber":19,"author":{"gitId":"kailinteoo"},"content":"The project simulates an ongoing software project for a desktop application (called _AddressBook_) used for managing","lastModifiedDate":"2024-03-06"},{"lineNumber":20,"author":{"gitId":"-"},"content":" contact details.","lastModifiedDate":"2024-02-17"},{"lineNumber":21,"author":{"gitId":"kailinteoo"},"content":"* It is written in OOP fashion. ","lastModifiedDate":"2024-03-06"},{"lineNumber":22,"author":{"gitId":"kailinteoo"},"content":"* It provides a reasonably well-written code base bigger (around 6 KLoC)","lastModifiedDate":"2024-03-06"},{"lineNumber":23,"author":{"gitId":"kailinteoo"},"content":"* It comes with a reasonable level of user and developer documentation.","lastModifiedDate":"2024-03-06"},{"lineNumber":24,"author":{"gitId":"kailinteoo"},"content":"","lastModifiedDate":"2024-03-06"},{"lineNumber":25,"author":{"gitId":"kailinteoo"},"content":"This project is based on the AddressBook Level-3 project and is a part of the [se-education.org](https://se-education.org/addressbook-level3) initiative.","lastModifiedDate":"2024-03-06"},{"lineNumber":26,"author":{"gitId":"kailinteoo"},"content":"","lastModifiedDate":"2024-03-06"},{"lineNumber":27,"author":{"gitId":"kailinteoo"},"content":"# Features","lastModifiedDate":"2024-03-06"},{"lineNumber":28,"author":{"gitId":"kailinteoo"},"content":"","lastModifiedDate":"2024-03-06"},{"lineNumber":29,"author":{"gitId":"kailinteoo"},"content":"## Customer Feature","lastModifiedDate":"2024-03-06"},{"lineNumber":30,"author":{"gitId":"kailinteoo"},"content":"","lastModifiedDate":"2024-03-06"},{"lineNumber":31,"author":{"gitId":"kailinteoo"},"content":"### 1. Add Customer","lastModifiedDate":"2024-03-06"},{"lineNumber":32,"author":{"gitId":"kailinteoo"},"content":"Adds a customer to the customer\u0027s storage.","lastModifiedDate":"2024-03-06"},{"lineNumber":33,"author":{"gitId":"kailinteoo"},"content":"","lastModifiedDate":"2024-03-06"},{"lineNumber":34,"author":{"gitId":"kailinteoo"},"content":"Example: `add \u003ccustomer name\u003e`","lastModifiedDate":"2024-03-06"},{"lineNumber":35,"author":{"gitId":"kailinteoo"},"content":"","lastModifiedDate":"2024-03-06"},{"lineNumber":36,"author":{"gitId":"kailinteoo"},"content":"Expected output:","lastModifiedDate":"2024-03-06"},{"lineNumber":37,"author":{"gitId":"kailinteoo"},"content":"```","lastModifiedDate":"2024-03-06"},{"lineNumber":38,"author":{"gitId":"kailinteoo"},"content":"Successfully added \u003ccustomer name\u003e to your list!","lastModifiedDate":"2024-03-06"},{"lineNumber":39,"author":{"gitId":"kailinteoo"},"content":"```","lastModifiedDate":"2024-03-06"},{"lineNumber":40,"author":{"gitId":"kailinteoo"},"content":"","lastModifiedDate":"2024-03-06"},{"lineNumber":41,"author":{"gitId":"kailinteoo"},"content":"### 2. Delete Customer","lastModifiedDate":"2024-03-06"},{"lineNumber":42,"author":{"gitId":"kailinteoo"},"content":"Delete selected customer from the customer\u0027s storage.","lastModifiedDate":"2024-03-06"},{"lineNumber":43,"author":{"gitId":"kailinteoo"},"content":"","lastModifiedDate":"2024-03-06"},{"lineNumber":44,"author":{"gitId":"kailinteoo"},"content":"Example: `delete \u003ccustomer name\u003e`","lastModifiedDate":"2024-03-06"},{"lineNumber":45,"author":{"gitId":"kailinteoo"},"content":"","lastModifiedDate":"2024-03-06"},{"lineNumber":46,"author":{"gitId":"kailinteoo"},"content":"Expected output:","lastModifiedDate":"2024-03-06"},{"lineNumber":47,"author":{"gitId":"kailinteoo"},"content":"```","lastModifiedDate":"2024-03-06"},{"lineNumber":48,"author":{"gitId":"kailinteoo"},"content":"Successfully removed \u003ccustomer name\u003e from the list","lastModifiedDate":"2024-03-06"},{"lineNumber":49,"author":{"gitId":"kailinteoo"},"content":"```","lastModifiedDate":"2024-03-06"},{"lineNumber":50,"author":{"gitId":"kailinteoo"},"content":"","lastModifiedDate":"2024-03-06"},{"lineNumber":51,"author":{"gitId":"kailinteoo"},"content":"### 3. Edit Customer","lastModifiedDate":"2024-03-06"},{"lineNumber":52,"author":{"gitId":"kailinteoo"},"content":"Edit selected customer information by adding more information such as Age, Phone Number, Past purchased record, ","lastModifiedDate":"2024-03-06"},{"lineNumber":53,"author":{"gitId":"kailinteoo"},"content":"Birthday, Address.","lastModifiedDate":"2024-03-06"},{"lineNumber":54,"author":{"gitId":"kailinteoo"},"content":"","lastModifiedDate":"2024-03-06"},{"lineNumber":55,"author":{"gitId":"kailinteoo"},"content":"Example: `edit \u003ccustomer name\u003e`","lastModifiedDate":"2024-03-06"},{"lineNumber":56,"author":{"gitId":"kailinteoo"},"content":"","lastModifiedDate":"2024-03-06"},{"lineNumber":57,"author":{"gitId":"kailinteoo"},"content":"Expected output:","lastModifiedDate":"2024-03-06"},{"lineNumber":58,"author":{"gitId":"kailinteoo"},"content":"```","lastModifiedDate":"2024-03-06"},{"lineNumber":59,"author":{"gitId":"kailinteoo"},"content":"Successfully edit \u003ccustomer name\u003e information","lastModifiedDate":"2024-03-06"},{"lineNumber":60,"author":{"gitId":"kailinteoo"},"content":"```","lastModifiedDate":"2024-03-06"},{"lineNumber":61,"author":{"gitId":"kailinteoo"},"content":"","lastModifiedDate":"2024-03-06"},{"lineNumber":62,"author":{"gitId":"kailinteoo"},"content":"### 4. VIP Customer","lastModifiedDate":"2024-03-06"},{"lineNumber":63,"author":{"gitId":"kailinteoo"},"content":"Indicating that this specific customer is important.","lastModifiedDate":"2024-03-06"},{"lineNumber":64,"author":{"gitId":"kailinteoo"},"content":"","lastModifiedDate":"2024-03-06"},{"lineNumber":65,"author":{"gitId":"kailinteoo"},"content":"Example: `vip \u003ccustomer name\u003e`","lastModifiedDate":"2024-03-06"},{"lineNumber":66,"author":{"gitId":"kailinteoo"},"content":"","lastModifiedDate":"2024-03-06"},{"lineNumber":67,"author":{"gitId":"kailinteoo"},"content":"Expected output:","lastModifiedDate":"2024-03-06"},{"lineNumber":68,"author":{"gitId":"kailinteoo"},"content":"```","lastModifiedDate":"2024-03-06"},{"lineNumber":69,"author":{"gitId":"kailinteoo"},"content":"Successfully set \u003ccustomer name\u003e as VIP","lastModifiedDate":"2024-03-06"},{"lineNumber":70,"author":{"gitId":"kailinteoo"},"content":"```","lastModifiedDate":"2024-03-06"},{"lineNumber":71,"author":{"gitId":"kailinteoo"},"content":"","lastModifiedDate":"2024-03-06"},{"lineNumber":72,"author":{"gitId":"kailinteoo"},"content":"## Order Feature","lastModifiedDate":"2024-03-06"},{"lineNumber":73,"author":{"gitId":"kailinteoo"},"content":"","lastModifiedDate":"2024-03-06"},{"lineNumber":74,"author":{"gitId":"kailinteoo"},"content":"### 1. Add Order","lastModifiedDate":"2024-03-06"},{"lineNumber":75,"author":{"gitId":"kailinteoo"},"content":"Adds a order into the order\u0027s storage, together with the customer name.","lastModifiedDate":"2024-03-06"},{"lineNumber":76,"author":{"gitId":"kailinteoo"},"content":"","lastModifiedDate":"2024-03-06"},{"lineNumber":77,"author":{"gitId":"kailinteoo"},"content":"Example: `add \u003ccustomer name, order, due date\u003e`","lastModifiedDate":"2024-03-06"},{"lineNumber":78,"author":{"gitId":"kailinteoo"},"content":"","lastModifiedDate":"2024-03-06"},{"lineNumber":79,"author":{"gitId":"kailinteoo"},"content":"Expected output:","lastModifiedDate":"2024-03-06"},{"lineNumber":80,"author":{"gitId":"kailinteoo"},"content":"```","lastModifiedDate":"2024-03-06"},{"lineNumber":81,"author":{"gitId":"kailinteoo"},"content":"An order has been added for \u003ccustomer name\u003e","lastModifiedDate":"2024-03-06"},{"lineNumber":82,"author":{"gitId":"kailinteoo"},"content":"```","lastModifiedDate":"2024-03-06"},{"lineNumber":83,"author":{"gitId":"kailinteoo"},"content":"","lastModifiedDate":"2024-03-06"},{"lineNumber":84,"author":{"gitId":"kailinteoo"},"content":"### 2. Delete Order","lastModifiedDate":"2024-03-06"},{"lineNumber":85,"author":{"gitId":"kailinteoo"},"content":"Delete order of the specific customer.","lastModifiedDate":"2024-03-06"},{"lineNumber":86,"author":{"gitId":"kailinteoo"},"content":"","lastModifiedDate":"2024-03-06"},{"lineNumber":87,"author":{"gitId":"kailinteoo"},"content":"Example: `delete \u003ccustomer name, order\u003e`","lastModifiedDate":"2024-03-06"},{"lineNumber":88,"author":{"gitId":"kailinteoo"},"content":"","lastModifiedDate":"2024-03-06"},{"lineNumber":89,"author":{"gitId":"kailinteoo"},"content":"Expected output:","lastModifiedDate":"2024-03-06"},{"lineNumber":90,"author":{"gitId":"kailinteoo"},"content":"```","lastModifiedDate":"2024-03-06"},{"lineNumber":91,"author":{"gitId":"kailinteoo"},"content":"\u003ccustomer name\u003e order of \u003c(order item)\u003e has been cancelled","lastModifiedDate":"2024-03-06"},{"lineNumber":92,"author":{"gitId":"kailinteoo"},"content":"```","lastModifiedDate":"2024-03-06"},{"lineNumber":93,"author":{"gitId":"kailinteoo"},"content":"","lastModifiedDate":"2024-03-06"},{"lineNumber":94,"author":{"gitId":"kailinteoo"},"content":"### 3. Edit Order","lastModifiedDate":"2024-03-06"},{"lineNumber":95,"author":{"gitId":"kailinteoo"},"content":"Edit the customer\u0027s order.","lastModifiedDate":"2024-03-06"},{"lineNumber":96,"author":{"gitId":"kailinteoo"},"content":"","lastModifiedDate":"2024-03-06"},{"lineNumber":97,"author":{"gitId":"kailinteoo"},"content":"Example: `edit \u003ccustomer name, old order, new order\u003e`","lastModifiedDate":"2024-03-06"},{"lineNumber":98,"author":{"gitId":"kailinteoo"},"content":"","lastModifiedDate":"2024-03-06"},{"lineNumber":99,"author":{"gitId":"kailinteoo"},"content":"Expected output:","lastModifiedDate":"2024-03-06"},{"lineNumber":100,"author":{"gitId":"kailinteoo"},"content":"```","lastModifiedDate":"2024-03-06"},{"lineNumber":101,"author":{"gitId":"kailinteoo"},"content":"Successfully edit \u003ccustomer name\u003e order","lastModifiedDate":"2024-03-06"},{"lineNumber":102,"author":{"gitId":"kailinteoo"},"content":"```","lastModifiedDate":"2024-03-06"},{"lineNumber":103,"author":{"gitId":"kailinteoo"},"content":"","lastModifiedDate":"2024-03-06"},{"lineNumber":104,"author":{"gitId":"kailinteoo"},"content":"### 4. Prioritize Order","lastModifiedDate":"2024-03-06"},{"lineNumber":105,"author":{"gitId":"kailinteoo"},"content":"Prioritize the customer\u0027 order.","lastModifiedDate":"2024-03-06"},{"lineNumber":106,"author":{"gitId":"kailinteoo"},"content":"","lastModifiedDate":"2024-03-06"},{"lineNumber":107,"author":{"gitId":"kailinteoo"},"content":"Example: `prioritize \u003ccustomer name, order\u003e`","lastModifiedDate":"2024-03-06"},{"lineNumber":108,"author":{"gitId":"kailinteoo"},"content":"","lastModifiedDate":"2024-03-06"},{"lineNumber":109,"author":{"gitId":"kailinteoo"},"content":"Expected output:","lastModifiedDate":"2024-03-06"},{"lineNumber":110,"author":{"gitId":"kailinteoo"},"content":"```","lastModifiedDate":"2024-03-06"},{"lineNumber":111,"author":{"gitId":"kailinteoo"},"content":"Successfully prioritized \u003ccustomer name, order\u003e","lastModifiedDate":"2024-03-06"},{"lineNumber":112,"author":{"gitId":"kailinteoo"},"content":"```","lastModifiedDate":"2024-03-06"},{"lineNumber":113,"author":{"gitId":"kailinteoo"},"content":"","lastModifiedDate":"2024-03-06"},{"lineNumber":114,"author":{"gitId":"kailinteoo"},"content":"## Viewing Feature","lastModifiedDate":"2024-03-06"},{"lineNumber":115,"author":{"gitId":"kailinteoo"},"content":"","lastModifiedDate":"2024-03-06"},{"lineNumber":116,"author":{"gitId":"kailinteoo"},"content":"### 1. View Customer Detail","lastModifiedDate":"2024-03-06"},{"lineNumber":117,"author":{"gitId":"kailinteoo"},"content":"View customer information, such as Name, Age, Phone Number, Past purchase record, Birthday, Address.","lastModifiedDate":"2024-03-06"},{"lineNumber":118,"author":{"gitId":"kailinteoo"},"content":"","lastModifiedDate":"2024-03-06"},{"lineNumber":119,"author":{"gitId":"kailinteoo"},"content":"Example: `view \u003ccustomer name\u003e`","lastModifiedDate":"2024-03-06"},{"lineNumber":120,"author":{"gitId":"kailinteoo"},"content":"","lastModifiedDate":"2024-03-06"},{"lineNumber":121,"author":{"gitId":"kailinteoo"},"content":"Expected output:","lastModifiedDate":"2024-03-06"},{"lineNumber":122,"author":{"gitId":"kailinteoo"},"content":"```","lastModifiedDate":"2024-03-06"},{"lineNumber":123,"author":{"gitId":"kailinteoo"},"content":"Jasper Tan info: [...]","lastModifiedDate":"2024-03-06"},{"lineNumber":124,"author":{"gitId":"kailinteoo"},"content":"Tan Qing Yong info : [...]","lastModifiedDate":"2024-03-06"},{"lineNumber":125,"author":{"gitId":"kailinteoo"},"content":"```","lastModifiedDate":"2024-03-06"},{"lineNumber":126,"author":{"gitId":"kailinteoo"},"content":"","lastModifiedDate":"2024-03-06"},{"lineNumber":127,"author":{"gitId":"kailinteoo"},"content":"### 2. View Order Detail","lastModifiedDate":"2024-03-06"},{"lineNumber":128,"author":{"gitId":"kailinteoo"},"content":"View Order information, such as order by when, who order, quantity.","lastModifiedDate":"2024-03-06"},{"lineNumber":129,"author":{"gitId":"kailinteoo"},"content":"","lastModifiedDate":"2024-03-06"},{"lineNumber":130,"author":{"gitId":"kailinteoo"},"content":"Example: `view \u003corder\u003e`","lastModifiedDate":"2024-03-06"},{"lineNumber":131,"author":{"gitId":"kailinteoo"},"content":"","lastModifiedDate":"2024-03-06"},{"lineNumber":132,"author":{"gitId":"kailinteoo"},"content":"Expected output:","lastModifiedDate":"2024-03-06"},{"lineNumber":133,"author":{"gitId":"kailinteoo"},"content":"```","lastModifiedDate":"2024-03-06"},{"lineNumber":134,"author":{"gitId":"kailinteoo"},"content":"Frog Crochet: ","lastModifiedDate":"2024-03-06"},{"lineNumber":135,"author":{"gitId":"kailinteoo"},"content":"1. total of \u003cquantity\u003e order by \u003ccustomer name\u003e on \u003cdate\u003e ","lastModifiedDate":"2024-03-06"},{"lineNumber":136,"author":{"gitId":"kailinteoo"},"content":"2. total of \u003cquantity\u003e order by \u003ccustomer name\u003e on \u003cdate\u003e ","lastModifiedDate":"2024-03-06"},{"lineNumber":137,"author":{"gitId":"kailinteoo"},"content":"[...]","lastModifiedDate":"2024-03-06"},{"lineNumber":138,"author":{"gitId":"kailinteoo"},"content":"```","lastModifiedDate":"2024-03-06"},{"lineNumber":139,"author":{"gitId":"kailinteoo"},"content":"","lastModifiedDate":"2024-03-06"},{"lineNumber":140,"author":{"gitId":"kailinteoo"},"content":"### 3. View Statistics","lastModifiedDate":"2024-03-06"},{"lineNumber":141,"author":{"gitId":"kailinteoo"},"content":"Show how many orders has been completed.","lastModifiedDate":"2024-03-06"},{"lineNumber":142,"author":{"gitId":"kailinteoo"},"content":"","lastModifiedDate":"2024-03-06"},{"lineNumber":143,"author":{"gitId":"kailinteoo"},"content":"Example: `stat`","lastModifiedDate":"2024-03-06"},{"lineNumber":144,"author":{"gitId":"kailinteoo"},"content":"","lastModifiedDate":"2024-03-06"},{"lineNumber":145,"author":{"gitId":"kailinteoo"},"content":"Expected output:","lastModifiedDate":"2024-03-06"},{"lineNumber":146,"author":{"gitId":"kailinteoo"},"content":"```","lastModifiedDate":"2024-03-06"},{"lineNumber":147,"author":{"gitId":"kailinteoo"},"content":"\u003ca list of stat\u003e","lastModifiedDate":"2024-03-06"},{"lineNumber":148,"author":{"gitId":"kailinteoo"},"content":"```","lastModifiedDate":"2024-03-06"},{"lineNumber":149,"author":{"gitId":"kailinteoo"},"content":"","lastModifiedDate":"2024-03-06"},{"lineNumber":150,"author":{"gitId":"kailinteoo"},"content":"### 4. View Ranking","lastModifiedDate":"2024-03-06"},{"lineNumber":151,"author":{"gitId":"kailinteoo"},"content":"View which crochet sell the best and total sell quantity.","lastModifiedDate":"2024-03-06"},{"lineNumber":152,"author":{"gitId":"kailinteoo"},"content":"","lastModifiedDate":"2024-03-06"},{"lineNumber":153,"author":{"gitId":"kailinteoo"},"content":"Example: `view ranking`","lastModifiedDate":"2024-03-06"},{"lineNumber":154,"author":{"gitId":"kailinteoo"},"content":"","lastModifiedDate":"2024-03-06"},{"lineNumber":155,"author":{"gitId":"kailinteoo"},"content":"Expected output:","lastModifiedDate":"2024-03-06"},{"lineNumber":156,"author":{"gitId":"kailinteoo"},"content":"```","lastModifiedDate":"2024-03-06"},{"lineNumber":157,"author":{"gitId":"kailinteoo"},"content":"Top 1: Frog Crochet, total sold of \u003cquantity\u003e ","lastModifiedDate":"2024-03-06"},{"lineNumber":158,"author":{"gitId":"kailinteoo"},"content":"[...]","lastModifiedDate":"2024-03-06"},{"lineNumber":159,"author":{"gitId":"kailinteoo"},"content":"```","lastModifiedDate":"2024-03-06"},{"lineNumber":160,"author":{"gitId":"kailinteoo"},"content":"","lastModifiedDate":"2024-03-06"},{"lineNumber":161,"author":{"gitId":"kailinteoo"},"content":"## Sorting Feature","lastModifiedDate":"2024-03-06"},{"lineNumber":162,"author":{"gitId":"kailinteoo"},"content":"","lastModifiedDate":"2024-03-06"},{"lineNumber":163,"author":{"gitId":"kailinteoo"},"content":"### 1. Sort Order by Date","lastModifiedDate":"2024-03-06"},{"lineNumber":164,"author":{"gitId":"kailinteoo"},"content":"Sort when the order is due based on the date (excluding prioritize order).","lastModifiedDate":"2024-03-06"},{"lineNumber":165,"author":{"gitId":"kailinteoo"},"content":"","lastModifiedDate":"2024-03-06"},{"lineNumber":166,"author":{"gitId":"kailinteoo"},"content":"Example: `sort orderdate`","lastModifiedDate":"2024-03-06"},{"lineNumber":167,"author":{"gitId":"kailinteoo"},"content":"","lastModifiedDate":"2024-03-06"},{"lineNumber":168,"author":{"gitId":"kailinteoo"},"content":"Expected output:","lastModifiedDate":"2024-03-06"},{"lineNumber":169,"author":{"gitId":"kailinteoo"},"content":"```","lastModifiedDate":"2024-03-06"},{"lineNumber":170,"author":{"gitId":"kailinteoo"},"content":"1. Jasper Tan, frog crochet, 24 Feb 2024 ","lastModifiedDate":"2024-03-06"},{"lineNumber":171,"author":{"gitId":"kailinteoo"},"content":"2. Tan Qin Yong, pig crochet, 1 Apr 2024 ","lastModifiedDate":"2024-03-06"},{"lineNumber":172,"author":{"gitId":"kailinteoo"},"content":"[...]","lastModifiedDate":"2024-03-06"},{"lineNumber":173,"author":{"gitId":"kailinteoo"},"content":"```","lastModifiedDate":"2024-03-06"},{"lineNumber":174,"author":{"gitId":"kailinteoo"},"content":"","lastModifiedDate":"2024-03-06"},{"lineNumber":175,"author":{"gitId":"kailinteoo"},"content":"### 2. Sort Order by order type","lastModifiedDate":"2024-03-06"},{"lineNumber":176,"author":{"gitId":"kailinteoo"},"content":"Sort depending on what kind of order.","lastModifiedDate":"2024-03-06"},{"lineNumber":177,"author":{"gitId":"kailinteoo"},"content":"","lastModifiedDate":"2024-03-06"},{"lineNumber":178,"author":{"gitId":"kailinteoo"},"content":"Example: `sort ordertype`","lastModifiedDate":"2024-03-06"},{"lineNumber":179,"author":{"gitId":"kailinteoo"},"content":"","lastModifiedDate":"2024-03-06"},{"lineNumber":180,"author":{"gitId":"kailinteoo"},"content":"Expected output:","lastModifiedDate":"2024-03-06"},{"lineNumber":181,"author":{"gitId":"kailinteoo"},"content":"```","lastModifiedDate":"2024-03-06"},{"lineNumber":182,"author":{"gitId":"kailinteoo"},"content":"Frog Crochet:","lastModifiedDate":"2024-03-06"},{"lineNumber":183,"author":{"gitId":"kailinteoo"},"content":"1. Jasper Tan, 24 Feb 2024 ","lastModifiedDate":"2024-03-06"},{"lineNumber":184,"author":{"gitId":"kailinteoo"},"content":"2. QinYong, 1 Apr 2024 ","lastModifiedDate":"2024-03-06"},{"lineNumber":185,"author":{"gitId":"kailinteoo"},"content":"[...]","lastModifiedDate":"2024-03-06"},{"lineNumber":186,"author":{"gitId":"kailinteoo"},"content":"```","lastModifiedDate":"2024-03-06"},{"lineNumber":187,"author":{"gitId":"kailinteoo"},"content":"","lastModifiedDate":"2024-03-06"},{"lineNumber":188,"author":{"gitId":"kailinteoo"},"content":"### 3. Sort Customer name by alphabetical order","lastModifiedDate":"2024-03-06"},{"lineNumber":189,"author":{"gitId":"kailinteoo"},"content":"sort the customer list.","lastModifiedDate":"2024-03-06"},{"lineNumber":190,"author":{"gitId":"kailinteoo"},"content":"","lastModifiedDate":"2024-03-06"},{"lineNumber":191,"author":{"gitId":"kailinteoo"},"content":"Example: `sort customer`","lastModifiedDate":"2024-03-06"},{"lineNumber":192,"author":{"gitId":"kailinteoo"},"content":"","lastModifiedDate":"2024-03-06"},{"lineNumber":193,"author":{"gitId":"kailinteoo"},"content":"Expected output:","lastModifiedDate":"2024-03-06"},{"lineNumber":194,"author":{"gitId":"kailinteoo"},"content":"```","lastModifiedDate":"2024-03-06"},{"lineNumber":195,"author":{"gitId":"kailinteoo"},"content":"1. Jasper Tan","lastModifiedDate":"2024-03-06"},{"lineNumber":196,"author":{"gitId":"kailinteoo"},"content":"2. Tan Qing Yong ","lastModifiedDate":"2024-03-06"},{"lineNumber":197,"author":{"gitId":"kailinteoo"},"content":"[...]","lastModifiedDate":"2024-03-06"},{"lineNumber":198,"author":{"gitId":"kailinteoo"},"content":"```","lastModifiedDate":"2024-03-06"},{"lineNumber":199,"author":{"gitId":"kailinteoo"},"content":"","lastModifiedDate":"2024-03-06"},{"lineNumber":200,"author":{"gitId":"kailinteoo"},"content":"## Notification/ Reminder/ Deadline/ Progress Tracker","lastModifiedDate":"2024-03-06"},{"lineNumber":201,"author":{"gitId":"kailinteoo"},"content":"","lastModifiedDate":"2024-03-06"},{"lineNumber":202,"author":{"gitId":"kailinteoo"},"content":"### 1. Deadline approaching soon for an order (within a week)","lastModifiedDate":"2024-03-06"},{"lineNumber":203,"author":{"gitId":"kailinteoo"},"content":"Send notification when order is due within a week.","lastModifiedDate":"2024-03-06"},{"lineNumber":204,"author":{"gitId":"kailinteoo"},"content":"","lastModifiedDate":"2024-03-06"},{"lineNumber":205,"author":{"gitId":"kailinteoo"},"content":"### 2. Progress Bar","lastModifiedDate":"2024-03-06"},{"lineNumber":206,"author":{"gitId":"kailinteoo"},"content":"Show how many order left to be done.","lastModifiedDate":"2024-03-06"},{"lineNumber":207,"author":{"gitId":"kailinteoo"},"content":"","lastModifiedDate":"2024-03-06"},{"lineNumber":208,"author":{"gitId":"kailinteoo"},"content":"Example: `progress`","lastModifiedDate":"2024-03-06"},{"lineNumber":209,"author":{"gitId":"kailinteoo"},"content":"","lastModifiedDate":"2024-03-06"},{"lineNumber":210,"author":{"gitId":"kailinteoo"},"content":"Expected output:","lastModifiedDate":"2024-03-06"},{"lineNumber":211,"author":{"gitId":"kailinteoo"},"content":"```","lastModifiedDate":"2024-03-06"},{"lineNumber":212,"author":{"gitId":"kailinteoo"},"content":"Left \u003cquantity\u003e ","lastModifiedDate":"2024-03-06"},{"lineNumber":213,"author":{"gitId":"kailinteoo"},"content":"Done \u003cquantity\u003e ","lastModifiedDate":"2024-03-06"},{"lineNumber":214,"author":{"gitId":"kailinteoo"},"content":"Pending \u003cQuantity\u003e\"","lastModifiedDate":"2024-03-06"},{"lineNumber":215,"author":{"gitId":"kailinteoo"},"content":"```","lastModifiedDate":"2024-03-06"},{"lineNumber":216,"author":{"gitId":"kailinteoo"},"content":"","lastModifiedDate":"2024-03-06"},{"lineNumber":217,"author":{"gitId":"kailinteoo"},"content":"## Usage Help","lastModifiedDate":"2024-03-06"},{"lineNumber":218,"author":{"gitId":"kailinteoo"},"content":"","lastModifiedDate":"2024-03-06"},{"lineNumber":219,"author":{"gitId":"kailinteoo"},"content":"### 1. Autocomplete","lastModifiedDate":"2024-03-06"},{"lineNumber":220,"author":{"gitId":"kailinteoo"},"content":"Show all possible next commands based on currently keyed in values.","lastModifiedDate":"2024-03-06"},{"lineNumber":221,"author":{"gitId":"kailinteoo"},"content":"","lastModifiedDate":"2024-03-06"},{"lineNumber":222,"author":{"gitId":"kailinteoo"},"content":"Expected output:","lastModifiedDate":"2024-03-06"},{"lineNumber":223,"author":{"gitId":"kailinteoo"},"content":"```","lastModifiedDate":"2024-03-06"},{"lineNumber":224,"author":{"gitId":"kailinteoo"},"content":"/modi(fy)","lastModifiedDate":"2024-03-06"},{"lineNumber":225,"author":{"gitId":"kailinteoo"},"content":"```","lastModifiedDate":"2024-03-06"},{"lineNumber":226,"author":{"gitId":"kailinteoo"},"content":"","lastModifiedDate":"2024-03-06"},{"lineNumber":227,"author":{"gitId":"kailinteoo"},"content":"### 2. User manual","lastModifiedDate":"2024-03-06"},{"lineNumber":228,"author":{"gitId":"kailinteoo"},"content":"Shows a list of commands that can be used.","lastModifiedDate":"2024-03-06"},{"lineNumber":229,"author":{"gitId":"kailinteoo"},"content":"","lastModifiedDate":"2024-03-06"},{"lineNumber":230,"author":{"gitId":"kailinteoo"},"content":"Example: `help`","lastModifiedDate":"2024-03-06"},{"lineNumber":231,"author":{"gitId":"kailinteoo"},"content":"","lastModifiedDate":"2024-03-06"},{"lineNumber":232,"author":{"gitId":"kailinteoo"},"content":"Expected output:","lastModifiedDate":"2024-03-06"},{"lineNumber":233,"author":{"gitId":"kailinteoo"},"content":"```","lastModifiedDate":"2024-03-06"},{"lineNumber":234,"author":{"gitId":"kailinteoo"},"content":"Commands list: ","lastModifiedDate":"2024-03-06"},{"lineNumber":235,"author":{"gitId":"kailinteoo"},"content":"1. add. Adds a new customer to the list. Example: \"add...\" ","lastModifiedDate":"2024-03-06"},{"lineNumber":236,"author":{"gitId":"kailinteoo"},"content":"[...]","lastModifiedDate":"2024-03-06"},{"lineNumber":237,"author":{"gitId":"kailinteoo"},"content":"```","lastModifiedDate":"2024-03-06"},{"lineNumber":238,"author":{"gitId":"kailinteoo"},"content":"","lastModifiedDate":"2024-03-06"}],"authorContributionMap":{"kailinteoo":232,"-":6}},{"path":"config/pre-commit-setup/add_hook.bat","fileType":"other","lines":[{"lineNumber":1,"author":{"gitId":"rertyy"},"content":"@echo off","lastModifiedDate":"2024-03-07"},{"lineNumber":2,"author":{"gitId":"rertyy"},"content":"SETLOCAL EnableDelayedExpansion","lastModifiedDate":"2024-03-07"},{"lineNumber":3,"author":{"gitId":"rertyy"},"content":"","lastModifiedDate":"2024-03-07"},{"lineNumber":4,"author":{"gitId":"rertyy"},"content":"REM Define relative path to .git/hooks","lastModifiedDate":"2024-03-07"},{"lineNumber":5,"author":{"gitId":"rertyy"},"content":"SET \"hooksDir\u003d../../.git/hooks\"","lastModifiedDate":"2024-03-07"},{"lineNumber":6,"author":{"gitId":"rertyy"},"content":"","lastModifiedDate":"2024-03-07"},{"lineNumber":7,"author":{"gitId":"rertyy"},"content":"REM Check if .git/hooks directory exists, if not create it","lastModifiedDate":"2024-03-07"},{"lineNumber":8,"author":{"gitId":"rertyy"},"content":"IF NOT EXIST \"!hooksDir!\" (","lastModifiedDate":"2024-03-07"},{"lineNumber":9,"author":{"gitId":"rertyy"},"content":" mkdir \"!hooksDir!\"","lastModifiedDate":"2024-03-07"},{"lineNumber":10,"author":{"gitId":"rertyy"},"content":" echo Created directory: !hooksDir!","lastModifiedDate":"2024-03-07"},{"lineNumber":11,"author":{"gitId":"rertyy"},"content":")","lastModifiedDate":"2024-03-07"},{"lineNumber":12,"author":{"gitId":"rertyy"},"content":"","lastModifiedDate":"2024-03-07"},{"lineNumber":13,"author":{"gitId":"rertyy"},"content":"REM Check if pre-commit hook already exists","lastModifiedDate":"2024-03-07"},{"lineNumber":14,"author":{"gitId":"rertyy"},"content":"IF EXIST \"!hooksDir!/pre-commit\" (","lastModifiedDate":"2024-03-07"},{"lineNumber":15,"author":{"gitId":"rertyy"},"content":" REM Backup existing pre-commit hook","lastModifiedDate":"2024-03-07"},{"lineNumber":16,"author":{"gitId":"rertyy"},"content":" copy /Y \"!hooksDir!/pre-commit\" \"!hooksDir!/pre-commit.bak\"","lastModifiedDate":"2024-03-07"},{"lineNumber":17,"author":{"gitId":"rertyy"},"content":" echo Existing pre-commit hook backed up to: !hooksDir!/pre-commit.bak","lastModifiedDate":"2024-03-07"},{"lineNumber":18,"author":{"gitId":"rertyy"},"content":")","lastModifiedDate":"2024-03-07"},{"lineNumber":19,"author":{"gitId":"rertyy"},"content":"","lastModifiedDate":"2024-03-07"},{"lineNumber":20,"author":{"gitId":"rertyy"},"content":"REM Copy the new pre-commit hook","lastModifiedDate":"2024-03-07"},{"lineNumber":21,"author":{"gitId":"rertyy"},"content":"copy /Y \"pre-commit\" \"!hooksDir!/pre-commit\"","lastModifiedDate":"2024-03-07"},{"lineNumber":22,"author":{"gitId":"rertyy"},"content":"","lastModifiedDate":"2024-03-07"},{"lineNumber":23,"author":{"gitId":"rertyy"},"content":"echo New pre-commit hook setup complete.","lastModifiedDate":"2024-03-07"}],"authorContributionMap":{"rertyy":23}},{"path":"config/pre-commit-setup/add_hook.sh","fileType":"other","lines":[{"lineNumber":1,"author":{"gitId":"rertyy"},"content":"#!/bin/bash","lastModifiedDate":"2024-03-07"},{"lineNumber":2,"author":{"gitId":"rertyy"},"content":"","lastModifiedDate":"2024-03-07"},{"lineNumber":3,"author":{"gitId":"rertyy"},"content":"# Define relative path to .git/hooks","lastModifiedDate":"2024-03-07"},{"lineNumber":4,"author":{"gitId":"rertyy"},"content":"hooksDir\u003d\"../../.git/hooks\"","lastModifiedDate":"2024-03-07"},{"lineNumber":5,"author":{"gitId":"rertyy"},"content":"","lastModifiedDate":"2024-03-07"},{"lineNumber":6,"author":{"gitId":"rertyy"},"content":"# Check if .git/hooks directory exists, if not create it","lastModifiedDate":"2024-03-07"},{"lineNumber":7,"author":{"gitId":"rertyy"},"content":"if [ ! -d \"$hooksDir\" ]; then","lastModifiedDate":"2024-03-07"},{"lineNumber":8,"author":{"gitId":"rertyy"},"content":" mkdir -p \"$hooksDir\"","lastModifiedDate":"2024-03-07"},{"lineNumber":9,"author":{"gitId":"rertyy"},"content":" echo \"Created directory: $hooksDir\"","lastModifiedDate":"2024-03-07"},{"lineNumber":10,"author":{"gitId":"rertyy"},"content":"fi","lastModifiedDate":"2024-03-07"},{"lineNumber":11,"author":{"gitId":"rertyy"},"content":"","lastModifiedDate":"2024-03-07"},{"lineNumber":12,"author":{"gitId":"rertyy"},"content":"# Check if pre-commit hook already exists","lastModifiedDate":"2024-03-07"},{"lineNumber":13,"author":{"gitId":"rertyy"},"content":"if [ -f \"$hooksDir/pre-commit\" ]; then","lastModifiedDate":"2024-03-07"},{"lineNumber":14,"author":{"gitId":"rertyy"},"content":" # Backup existing pre-commit hook","lastModifiedDate":"2024-03-07"},{"lineNumber":15,"author":{"gitId":"rertyy"},"content":" cp \"$hooksDir/pre-commit\" \"$hooksDir/pre-commit.bak\"","lastModifiedDate":"2024-03-07"},{"lineNumber":16,"author":{"gitId":"rertyy"},"content":" echo \"Existing pre-commit hook backed up to: $hooksDir/pre-commit.bak\"","lastModifiedDate":"2024-03-07"},{"lineNumber":17,"author":{"gitId":"rertyy"},"content":"fi","lastModifiedDate":"2024-03-07"},{"lineNumber":18,"author":{"gitId":"rertyy"},"content":"","lastModifiedDate":"2024-03-07"},{"lineNumber":19,"author":{"gitId":"rertyy"},"content":"# Copy the new pre-commit hook","lastModifiedDate":"2024-03-07"},{"lineNumber":20,"author":{"gitId":"rertyy"},"content":"cp \"pre-commit\" \"$hooksDir/pre-commit\"","lastModifiedDate":"2024-03-07"},{"lineNumber":21,"author":{"gitId":"rertyy"},"content":"","lastModifiedDate":"2024-03-07"},{"lineNumber":22,"author":{"gitId":"rertyy"},"content":"echo \"New pre-commit hook setup complete.\"","lastModifiedDate":"2024-03-07"}],"authorContributionMap":{"rertyy":22}},{"path":"docs/AboutUs.md","fileType":"docs","lines":[{"lineNumber":1,"author":{"gitId":"kailinteoo"},"content":"# About Us:","lastModifiedDate":"2024-03-06"},{"lineNumber":2,"author":{"gitId":"kailinteoo"},"content":"Welcome to BookKeeper, your trusted companion in customer management for small crochet businesses. We understand the ","lastModifiedDate":"2024-03-06"},{"lineNumber":3,"author":{"gitId":"kailinteoo"},"content":"challenges faced by entrepreneurs like you who are passionate about crafting beautiful items and connecting with","lastModifiedDate":"2024-03-06"},{"lineNumber":4,"author":{"gitId":"kailinteoo"},"content":"customers. BookKeeper is here to simplify your workflow, empower your business, and help you thrive in the world of","lastModifiedDate":"2024-03-06"},{"lineNumber":5,"author":{"gitId":"kailinteoo"},"content":"crochet!","lastModifiedDate":"2024-03-06"},{"lineNumber":6,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":7,"author":{"gitId":"kailinteoo"},"content":"## Product Name: BookKeeper","lastModifiedDate":"2024-03-06"},{"lineNumber":8,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":9,"author":{"gitId":"kailinteoo"},"content":"## Target Users","lastModifiedDate":"2024-03-06"},{"lineNumber":10,"author":{"gitId":"kailinteoo"},"content":"Our target users are small business owners across various industries who are looking for efficient ways to manage their ","lastModifiedDate":"2024-03-06"},{"lineNumber":11,"author":{"gitId":"kailinteoo"},"content":"customer lists and streamline their customer management processes. These individuals typically operate businesses with ","lastModifiedDate":"2024-03-06"},{"lineNumber":12,"author":{"gitId":"kailinteoo"},"content":"limited resources and manpower, making it essential for them to optimize their workflows and maximize productivity.","lastModifiedDate":"2024-03-06"},{"lineNumber":13,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-06-17"},{"lineNumber":14,"author":{"gitId":"kailinteoo"},"content":"## Purpose","lastModifiedDate":"2024-03-06"},{"lineNumber":15,"author":{"gitId":"kailinteoo"},"content":"In the bustling world of a small business, time is precious. BookKeeper aims to provide a seamless solution for managing","lastModifiedDate":"2024-03-06"},{"lineNumber":16,"author":{"gitId":"kailinteoo"},"content":"customer relationships, allowing you to focus on what matters most - creating and selling your craft. Our platform","lastModifiedDate":"2024-03-06"},{"lineNumber":17,"author":{"gitId":"kailinteoo"},"content":"offers a user-friendly interface and powerful features to streamline your workflow, saving your time and effort.","lastModifiedDate":"2024-03-06"},{"lineNumber":18,"author":{"gitId":"kailinteoo"},"content":"","lastModifiedDate":"2024-03-06"},{"lineNumber":19,"author":{"gitId":"kailinteoo"},"content":"## Unique Selling Point","lastModifiedDate":"2024-03-06"},{"lineNumber":20,"author":{"gitId":"kailinteoo"},"content":"### Centralized Platform","lastModifiedDate":"2024-03-06"},{"lineNumber":21,"author":{"gitId":"kailinteoo"},"content":"Say goodbye to scattered customer lists and spreadsheets. BookKeeper offers a centralized platform to store and search","lastModifiedDate":"2024-03-06"},{"lineNumber":22,"author":{"gitId":"kailinteoo"},"content":"for clients, keeping all your important information in one place.","lastModifiedDate":"2024-03-06"},{"lineNumber":23,"author":{"gitId":"kailinteoo"},"content":"","lastModifiedDate":"2024-03-06"},{"lineNumber":24,"author":{"gitId":"kailinteoo"},"content":"### Efficiency","lastModifiedDate":"2024-03-06"},{"lineNumber":25,"author":{"gitId":"kailinteoo"},"content":"With a command-line interface, our application is faster and more efficient than traditional methods like CRMs or","lastModifiedDate":"2024-03-06"},{"lineNumber":26,"author":{"gitId":"kailinteoo"},"content":"Excel sheets. Spend less time navigating complex menus and more time serving your customers.","lastModifiedDate":"2024-03-06"},{"lineNumber":27,"author":{"gitId":"kailinteoo"},"content":"","lastModifiedDate":"2024-03-06"},{"lineNumber":28,"author":{"gitId":"kailinteoo"},"content":"### Tailored for Crochet Businesses","lastModifiedDate":"2024-03-06"},{"lineNumber":29,"author":{"gitId":"kailinteoo"},"content":"We understand the unique needs of crochet businesses, which is why our platform offers customizable fields, customizable","lastModifiedDate":"2024-03-06"},{"lineNumber":30,"author":{"gitId":"kailinteoo"},"content":"tags, and integration with e-commerce platforms.","lastModifiedDate":"2024-03-06"},{"lineNumber":31,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2024-03-06"},{"lineNumber":32,"author":{"gitId":"kailinteoo"},"content":"### Cost-effective","lastModifiedDate":"2024-03-06"},{"lineNumber":33,"author":{"gitId":"kailinteoo"},"content":"BookKeeper is designed to be cost-effective and easy to use, perfect for businesses with limited resources. Maximize","lastModifiedDate":"2024-03-06"},{"lineNumber":34,"author":{"gitId":"kailinteoo"},"content":"productivity without breaking the bank.","lastModifiedDate":"2024-03-06"},{"lineNumber":35,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":36,"author":{"gitId":"kailinteoo"},"content":"## Value Proposition","lastModifiedDate":"2024-03-06"},{"lineNumber":37,"author":{"gitId":"kailinteoo"},"content":"For small business owners launching services, organizing customer lists can be challenging. Our address book offers a ","lastModifiedDate":"2024-03-06"},{"lineNumber":38,"author":{"gitId":"kailinteoo"},"content":"centralized platform to store and search for clients, streamlining customer management. With a command-line interface, ","lastModifiedDate":"2024-03-06"},{"lineNumber":39,"author":{"gitId":"kailinteoo"},"content":"our application is faster and more efficient than inputting data into other systems like CRMs or Microsoft Excel.","lastModifiedDate":"2024-03-06"},{"lineNumber":40,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":41,"author":{"gitId":"kailinteoo"},"content":"## Team Information","lastModifiedDate":"2024-03-06"},{"lineNumber":42,"author":{"gitId":"kailinteoo"},"content":"","lastModifiedDate":"2024-03-06"},{"lineNumber":43,"author":{"gitId":"kailinteoo"},"content":"We are a team based in the [School of Computing, National University of Singapore](http://www.comp.nus.edu.sg).","lastModifiedDate":"2024-03-06"},{"lineNumber":44,"author":{"gitId":"kailinteoo"},"content":"","lastModifiedDate":"2024-03-06"},{"lineNumber":45,"author":{"gitId":"kailinteoo"},"content":"You can reach us at the email ","lastModifiedDate":"2024-03-06"},{"lineNumber":46,"author":{"gitId":"kailinteoo"},"content":"`jaspertan@u.nus.edu` `e0967851@u.nus.edu` `ian.tung@u.nus.edu` `e0959354@u.nus.edu`","lastModifiedDate":"2024-03-06"},{"lineNumber":47,"author":{"gitId":"kailinteoo"},"content":"","lastModifiedDate":"2024-03-06"},{"lineNumber":48,"author":{"gitId":"kailinteoo"},"content":"## Project team","lastModifiedDate":"2024-03-06"},{"lineNumber":49,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":50,"author":{"gitId":"kailinteoo"},"content":"### Jasper Tan Zu Xiang","lastModifiedDate":"2024-03-06"},{"lineNumber":51,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":52,"author":{"gitId":"kailinteoo"},"content":"\u003cimg src\u003d\"images/jaspertzx.png\" width\u003d\"200px\" height\u003d\"225px\"\u003e","lastModifiedDate":"2024-03-07"},{"lineNumber":53,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":54,"author":{"gitId":"kailinteoo"},"content":"[[github](https://github.com/Jaspertzx)]","lastModifiedDate":"2024-03-06"},{"lineNumber":55,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":56,"author":{"gitId":"kailinteoo"},"content":"* Role: Front-End Developer","lastModifiedDate":"2024-03-06"},{"lineNumber":57,"author":{"gitId":"kailinteoo"},"content":"* Responsibilities: Specialize in creating the user interface and user experience of the BookKeeper application. Ensure ","lastModifiedDate":"2024-03-06"},{"lineNumber":58,"author":{"gitId":"kailinteoo"},"content":"that the application is visually appealing, responsive, and easy to navigate for users.","lastModifiedDate":"2024-03-06"},{"lineNumber":59,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":60,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":61,"author":{"gitId":"kailinteoo"},"content":"### Goh Ying Xuan, Shavonne","lastModifiedDate":"2024-03-06"},{"lineNumber":62,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":63,"author":{"gitId":"kailinteoo"},"content":"\u003cimg src\u003d\"images/shavonneg.png\" width\u003d\"200px\" height\u003d\"225px\"\u003e","lastModifiedDate":"2024-03-06"},{"lineNumber":64,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":65,"author":{"gitId":"kailinteoo"},"content":"[[github](http://github.com/shavonneg)]","lastModifiedDate":"2024-03-06"},{"lineNumber":66,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":67,"author":{"gitId":"kailinteoo"},"content":"* Role: UI/UX Designer","lastModifiedDate":"2024-03-06"},{"lineNumber":68,"author":{"gitId":"kailinteoo"},"content":"* Responsibilities: Creating a seamless and intuitive user experience for the BookKeeper application. Conduct user","lastModifiedDate":"2024-03-06"},{"lineNumber":69,"author":{"gitId":"kailinteoo"},"content":"research, create wireframes and prototypes, and design user interfaces that are visually appealing and easy to use. ","lastModifiedDate":"2024-03-06"},{"lineNumber":70,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":71,"author":{"gitId":"kailinteoo"},"content":"### Tung Zhi Yong, Ian","lastModifiedDate":"2024-03-06"},{"lineNumber":72,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":73,"author":{"gitId":"kailinteoo"},"content":"\u003cimg src\u003d\"images/rertyy.png\" width\u003d\"200px\" height\u003d\"225px\"\u003e","lastModifiedDate":"2024-03-06"},{"lineNumber":74,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":75,"author":{"gitId":"kailinteoo"},"content":"[[github](http://github.com/rertyy)]","lastModifiedDate":"2024-03-06"},{"lineNumber":76,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":77,"author":{"gitId":"kailinteoo"},"content":"* Role: Full-Stack Developer","lastModifiedDate":"2024-03-06"},{"lineNumber":78,"author":{"gitId":"kailinteoo"},"content":"* Responsibilities: Proficient in both front-end and back-end development. Handle tasks ranging from designing user","lastModifiedDate":"2024-03-06"},{"lineNumber":79,"author":{"gitId":"kailinteoo"},"content":"interfaces to implementing server-side logic and managing database.","lastModifiedDate":"2024-03-06"},{"lineNumber":80,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":81,"author":{"gitId":"kailinteoo"},"content":"### Kailin Teo","lastModifiedDate":"2024-03-06"},{"lineNumber":82,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":83,"author":{"gitId":"kailinteoo"},"content":"\u003cimg src\u003d\"images/kailinteoo.png\" width\u003d\"200px\" height\u003d\"225px\"\u003e","lastModifiedDate":"2024-03-06"},{"lineNumber":84,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":85,"author":{"gitId":"kailinteoo"},"content":"[[github](http://github.com/kailinteoo)]","lastModifiedDate":"2024-03-06"},{"lineNumber":86,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":87,"author":{"gitId":"kailinteoo"},"content":"* Role: Back-End Developer","lastModifiedDate":"2024-03-06"},{"lineNumber":88,"author":{"gitId":"kailinteoo"},"content":"* Responsibilities: Focus on building the server-side components of the BookKeeper application. Handle tasks such as","lastModifiedDate":"2024-03-06"},{"lineNumber":89,"author":{"gitId":"kailinteoo"},"content":"implementing business logic, managing databases, and ensuring the security and scalability of the application. ","lastModifiedDate":"2024-03-06"}],"authorContributionMap":{"kailinteoo":66,"-":23}},{"path":"docs/DeveloperGuide.md","fileType":"docs","lines":[{"lineNumber":1,"author":{"gitId":"-"},"content":"---","lastModifiedDate":"2020-05-23"},{"lineNumber":2,"author":{"gitId":"-"},"content":"layout: page","lastModifiedDate":"2020-05-23"},{"lineNumber":3,"author":{"gitId":"-"},"content":"title: Developer Guide","lastModifiedDate":"2020-05-23"},{"lineNumber":4,"author":{"gitId":"-"},"content":"---","lastModifiedDate":"2020-05-23"},{"lineNumber":5,"author":{"gitId":"rertyy"},"content":"","lastModifiedDate":"2024-03-02"},{"lineNumber":6,"author":{"gitId":"-"},"content":"* Table of Contents","lastModifiedDate":"2020-05-23"},{"lineNumber":7,"author":{"gitId":"-"},"content":" {:toc}","lastModifiedDate":"2020-05-23"},{"lineNumber":8,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":9,"author":{"gitId":"-"},"content":"--------------------------------------------------------------------------------------------------------------------","lastModifiedDate":"2020-05-23"},{"lineNumber":10,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2021-07-30"},{"lineNumber":11,"author":{"gitId":"-"},"content":"## **Acknowledgements**","lastModifiedDate":"2021-07-30"},{"lineNumber":12,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2021-07-30"},{"lineNumber":13,"author":{"gitId":"rertyy"},"content":"* {list here sources of all reused/adapted ideas, code, documentation, and third-party libraries -- include links to the","lastModifiedDate":"2024-03-02"},{"lineNumber":14,"author":{"gitId":"rertyy"},"content":" original source as well}","lastModifiedDate":"2024-03-02"},{"lineNumber":15,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2021-07-30"},{"lineNumber":16,"author":{"gitId":"-"},"content":"--------------------------------------------------------------------------------------------------------------------","lastModifiedDate":"2021-07-30"},{"lineNumber":17,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":18,"author":{"gitId":"-"},"content":"## **Setting up, getting started**","lastModifiedDate":"2020-05-23"},{"lineNumber":19,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":20,"author":{"gitId":"-"},"content":"Refer to the guide [_Setting up and getting started_](SettingUp.md).","lastModifiedDate":"2020-05-23"},{"lineNumber":21,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":22,"author":{"gitId":"-"},"content":"--------------------------------------------------------------------------------------------------------------------","lastModifiedDate":"2020-05-23"},{"lineNumber":23,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":24,"author":{"gitId":"-"},"content":"## **Design**","lastModifiedDate":"2020-05-23"},{"lineNumber":25,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":26,"author":{"gitId":"-"},"content":"\u003cdiv markdown\u003d\"span\" class\u003d\"alert alert-primary\"\u003e","lastModifiedDate":"2021-07-31"},{"lineNumber":27,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":28,"author":{"gitId":"rertyy"},"content":":bulb: **Tip:** The `.puml` files used to create diagrams in this document `docs/diagrams` folder. Refer to the [","lastModifiedDate":"2024-03-02"},{"lineNumber":29,"author":{"gitId":"rertyy"},"content":"_PlantUML Tutorial_ at se-edu/guides](https://se-education.org/guides/tutorials/plantUml.html) to learn how to create","lastModifiedDate":"2024-03-02"},{"lineNumber":30,"author":{"gitId":"rertyy"},"content":"and edit diagrams.","lastModifiedDate":"2024-03-02"},{"lineNumber":31,"author":{"gitId":"-"},"content":"\u003c/div\u003e","lastModifiedDate":"2021-07-31"},{"lineNumber":32,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":33,"author":{"gitId":"-"},"content":"### Architecture","lastModifiedDate":"2021-07-31"},{"lineNumber":34,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":35,"author":{"gitId":"-"},"content":"\u003cimg src\u003d\"images/ArchitectureDiagram.png\" width\u003d\"280\" /\u003e","lastModifiedDate":"2021-07-31"},{"lineNumber":36,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":37,"author":{"gitId":"-"},"content":"The ***Architecture Diagram*** given above explains the high-level design of the App.","lastModifiedDate":"2021-07-31"},{"lineNumber":38,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":39,"author":{"gitId":"-"},"content":"Given below is a quick overview of main components and how they interact with each other.","lastModifiedDate":"2021-07-31"},{"lineNumber":40,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2021-07-31"},{"lineNumber":41,"author":{"gitId":"-"},"content":"**Main components of the architecture**","lastModifiedDate":"2021-07-31"},{"lineNumber":42,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":43,"author":{"gitId":"rertyy"},"content":"**`Main`** (consisting of","lastModifiedDate":"2024-03-02"},{"lineNumber":44,"author":{"gitId":"rertyy"},"content":"classes [`Main`](https://github.com/se-edu/addressbook-level3/tree/master/src/main/java/seedu/address/Main.java)","lastModifiedDate":"2024-03-02"},{"lineNumber":45,"author":{"gitId":"rertyy"},"content":"and [`MainApp`](https://github.com/se-edu/addressbook-level3/tree/master/src/main/java/seedu/address/MainApp.java)) is","lastModifiedDate":"2024-03-02"},{"lineNumber":46,"author":{"gitId":"rertyy"},"content":"in charge of the app launch and shut down.","lastModifiedDate":"2024-03-02"},{"lineNumber":47,"author":{"gitId":"rertyy"},"content":"","lastModifiedDate":"2024-03-02"},{"lineNumber":48,"author":{"gitId":"-"},"content":"* At app launch, it initializes the other components in the correct sequence, and connects them up with each other.","lastModifiedDate":"2023-09-03"},{"lineNumber":49,"author":{"gitId":"-"},"content":"* At shut down, it shuts down the other components and invokes cleanup methods where necessary.","lastModifiedDate":"2023-09-03"},{"lineNumber":50,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":51,"author":{"gitId":"-"},"content":"The bulk of the app\u0027s work is done by the following four components:","lastModifiedDate":"2023-09-03"},{"lineNumber":52,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":53,"author":{"gitId":"-"},"content":"* [**`UI`**](#ui-component): The UI of the App.","lastModifiedDate":"2020-05-23"},{"lineNumber":54,"author":{"gitId":"-"},"content":"* [**`Logic`**](#logic-component): The command executor.","lastModifiedDate":"2020-05-23"},{"lineNumber":55,"author":{"gitId":"-"},"content":"* [**`Model`**](#model-component): Holds the data of the App in memory.","lastModifiedDate":"2020-05-23"},{"lineNumber":56,"author":{"gitId":"-"},"content":"* [**`Storage`**](#storage-component): Reads data from, and writes data to, the hard disk.","lastModifiedDate":"2020-05-23"},{"lineNumber":57,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":58,"author":{"gitId":"-"},"content":"[**`Commons`**](#common-classes) represents a collection of classes used by multiple other components.","lastModifiedDate":"2023-09-03"},{"lineNumber":59,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":60,"author":{"gitId":"-"},"content":"**How the architecture components interact with each other**","lastModifiedDate":"2020-05-23"},{"lineNumber":61,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":62,"author":{"gitId":"rertyy"},"content":"The *Sequence Diagram* below shows how the components interact with each other for the scenario where the user issues","lastModifiedDate":"2024-03-02"},{"lineNumber":63,"author":{"gitId":"rertyy"},"content":"the command `delete 1`.","lastModifiedDate":"2024-03-02"},{"lineNumber":64,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":65,"author":{"gitId":"-"},"content":"\u003cimg src\u003d\"images/ArchitectureSequenceDiagram.png\" width\u003d\"574\" /\u003e","lastModifiedDate":"2020-06-07"},{"lineNumber":66,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":67,"author":{"gitId":"-"},"content":"Each of the four main components (also shown in the diagram above),","lastModifiedDate":"2021-07-31"},{"lineNumber":68,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2021-07-31"},{"lineNumber":69,"author":{"gitId":"-"},"content":"* defines its *API* in an `interface` with the same name as the Component.","lastModifiedDate":"2021-07-31"},{"lineNumber":70,"author":{"gitId":"rertyy"},"content":"* implements its functionality using a concrete `{Component Name}Manager` class (which follows the corresponding","lastModifiedDate":"2024-03-02"},{"lineNumber":71,"author":{"gitId":"rertyy"},"content":" API `interface` mentioned in the previous point.","lastModifiedDate":"2024-03-02"},{"lineNumber":72,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2021-07-31"},{"lineNumber":73,"author":{"gitId":"rertyy"},"content":"For example, the `Logic` component defines its API in the `Logic.java` interface and implements its functionality using","lastModifiedDate":"2024-03-02"},{"lineNumber":74,"author":{"gitId":"rertyy"},"content":"the `LogicManager.java` class which follows the `Logic` interface. Other components interact with a given component","lastModifiedDate":"2024-03-02"},{"lineNumber":75,"author":{"gitId":"rertyy"},"content":"through its interface rather than the concrete class (reason: to prevent outside component\u0027s being coupled to the","lastModifiedDate":"2024-03-02"},{"lineNumber":76,"author":{"gitId":"rertyy"},"content":"implementation of a component), as illustrated in the (partial) class diagram below.","lastModifiedDate":"2024-03-02"},{"lineNumber":77,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2021-07-31"},{"lineNumber":78,"author":{"gitId":"-"},"content":"\u003cimg src\u003d\"images/ComponentManagers.png\" width\u003d\"300\" /\u003e","lastModifiedDate":"2021-07-31"},{"lineNumber":79,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2021-07-31"},{"lineNumber":80,"author":{"gitId":"-"},"content":"The sections below give more details of each component.","lastModifiedDate":"2020-05-23"},{"lineNumber":81,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":82,"author":{"gitId":"-"},"content":"### UI component","lastModifiedDate":"2020-05-23"},{"lineNumber":83,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":84,"author":{"gitId":"rertyy"},"content":"The **API** of this component is specified","lastModifiedDate":"2024-03-02"},{"lineNumber":85,"author":{"gitId":"rertyy"},"content":"in [`Ui.java`](https://github.com/se-edu/addressbook-level3/tree/master/src/main/java/seedu/address/ui/Ui.java)","lastModifiedDate":"2024-03-02"},{"lineNumber":86,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":87,"author":{"gitId":"-"},"content":"![Structure of the UI Component](images/UiClassDiagram.png)","lastModifiedDate":"2021-07-31"},{"lineNumber":88,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":89,"author":{"gitId":"rertyy"},"content":"The UI consists of a `MainWindow` that is made up of parts","lastModifiedDate":"2024-03-02"},{"lineNumber":90,"author":{"gitId":"rertyy"},"content":"e.g.`CommandBox`, `ResultDisplay`, `PersonListPanel`, `StatusBarFooter` etc. All these, including the `MainWindow`,","lastModifiedDate":"2024-03-02"},{"lineNumber":91,"author":{"gitId":"rertyy"},"content":"inherit from the abstract `UiPart` class which captures the commonalities between classes that represent parts of the","lastModifiedDate":"2024-03-02"},{"lineNumber":92,"author":{"gitId":"rertyy"},"content":"visible GUI.","lastModifiedDate":"2024-03-02"},{"lineNumber":93,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":94,"author":{"gitId":"rertyy"},"content":"The `UI` component uses the JavaFx UI framework. The layout of these UI parts are defined in matching `.fxml` files that","lastModifiedDate":"2024-03-02"},{"lineNumber":95,"author":{"gitId":"rertyy"},"content":"are in the `src/main/resources/view` folder. For example, the layout of","lastModifiedDate":"2024-03-02"},{"lineNumber":96,"author":{"gitId":"rertyy"},"content":"the [`MainWindow`](https://github.com/se-edu/addressbook-level3/tree/master/src/main/java/seedu/address/ui/MainWindow.java)","lastModifiedDate":"2024-03-02"},{"lineNumber":97,"author":{"gitId":"rertyy"},"content":"is specified","lastModifiedDate":"2024-03-02"},{"lineNumber":98,"author":{"gitId":"rertyy"},"content":"in [`MainWindow.fxml`](https://github.com/se-edu/addressbook-level3/tree/master/src/main/resources/view/MainWindow.fxml)","lastModifiedDate":"2024-03-02"},{"lineNumber":99,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":100,"author":{"gitId":"-"},"content":"The `UI` component,","lastModifiedDate":"2020-05-23"},{"lineNumber":101,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":102,"author":{"gitId":"-"},"content":"* executes user commands using the `Logic` component.","lastModifiedDate":"2021-07-31"},{"lineNumber":103,"author":{"gitId":"-"},"content":"* listens for changes to `Model` data so that the UI can be updated with the modified data.","lastModifiedDate":"2021-07-31"},{"lineNumber":104,"author":{"gitId":"-"},"content":"* keeps a reference to the `Logic` component, because the `UI` relies on the `Logic` to execute commands.","lastModifiedDate":"2021-07-31"},{"lineNumber":105,"author":{"gitId":"-"},"content":"* depends on some classes in the `Model` component, as it displays `Person` object residing in the `Model`.","lastModifiedDate":"2021-07-31"},{"lineNumber":106,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":107,"author":{"gitId":"-"},"content":"### Logic component","lastModifiedDate":"2020-05-23"},{"lineNumber":108,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":109,"author":{"gitId":"rertyy"},"content":"**API","lastModifiedDate":"2024-03-02"},{"lineNumber":110,"author":{"gitId":"rertyy"},"content":"** : [`Logic.java`](https://github.com/se-edu/addressbook-level3/tree/master/src/main/java/seedu/address/logic/Logic.java)","lastModifiedDate":"2024-03-02"},{"lineNumber":111,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":112,"author":{"gitId":"-"},"content":"Here\u0027s a (partial) class diagram of the `Logic` component:","lastModifiedDate":"2021-07-31"},{"lineNumber":113,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":114,"author":{"gitId":"-"},"content":"\u003cimg src\u003d\"images/LogicClassDiagram.png\" width\u003d\"550\"/\u003e","lastModifiedDate":"2021-07-31"},{"lineNumber":115,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":116,"author":{"gitId":"rertyy"},"content":"The sequence diagram below illustrates the interactions within the `Logic` component, taking `execute(\"delete 1\")` API","lastModifiedDate":"2024-03-02"},{"lineNumber":117,"author":{"gitId":"rertyy"},"content":"call as an example.","lastModifiedDate":"2024-03-02"},{"lineNumber":118,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":119,"author":{"gitId":"-"},"content":"![Interactions Inside the Logic Component for the `delete 1` Command](images/DeleteSequenceDiagram.png)","lastModifiedDate":"2020-05-23"},{"lineNumber":120,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":121,"author":{"gitId":"-"},"content":"\u003cdiv markdown\u003d\"span\" class\u003d\"alert alert-info\"\u003e:information_source: **Note:** The lifeline for `DeleteCommandParser` should end at the destroy marker (X) but due to a limitation of PlantUML, the lifeline continues till the end of diagram.","lastModifiedDate":"2024-02-09"},{"lineNumber":122,"author":{"gitId":"-"},"content":"\u003c/div\u003e","lastModifiedDate":"2020-05-23"},{"lineNumber":123,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":124,"author":{"gitId":"-"},"content":"How the `Logic` component works:","lastModifiedDate":"2023-09-03"},{"lineNumber":125,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2023-09-03"},{"lineNumber":126,"author":{"gitId":"rertyy"},"content":"1. When `Logic` is called upon to execute a command, it is passed to an `AddressBookParser` object which in turn creates","lastModifiedDate":"2024-03-02"},{"lineNumber":127,"author":{"gitId":"rertyy"},"content":" a parser that matches the command (e.g., `DeleteCommandParser`) and uses it to parse the command.","lastModifiedDate":"2024-03-02"},{"lineNumber":128,"author":{"gitId":"rertyy"},"content":"1. This results in a `Command` object (more precisely, an object of one of its subclasses e.g., `DeleteCommand`) which","lastModifiedDate":"2024-03-02"},{"lineNumber":129,"author":{"gitId":"rertyy"},"content":" is executed by the `LogicManager`.","lastModifiedDate":"2024-03-02"},{"lineNumber":130,"author":{"gitId":"-"},"content":"1. The command can communicate with the `Model` when it is executed (e.g. to delete a person).\u003cbr\u003e","lastModifiedDate":"2024-02-09"},{"lineNumber":131,"author":{"gitId":"rertyy"},"content":" Note that although this is shown as a single step in the diagram above (for simplicity), in the code it can take","lastModifiedDate":"2024-03-02"},{"lineNumber":132,"author":{"gitId":"rertyy"},"content":" several interactions (between the command object and the `Model`) to achieve.","lastModifiedDate":"2024-03-02"},{"lineNumber":133,"author":{"gitId":"-"},"content":"1. The result of the command execution is encapsulated as a `CommandResult` object which is returned back from `Logic`.","lastModifiedDate":"2023-09-03"},{"lineNumber":134,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2023-09-03"},{"lineNumber":135,"author":{"gitId":"-"},"content":"Here are the other classes in `Logic` (omitted from the class diagram above) that are used for parsing a user command:","lastModifiedDate":"2021-07-31"},{"lineNumber":136,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2021-07-31"},{"lineNumber":137,"author":{"gitId":"-"},"content":"\u003cimg src\u003d\"images/ParserClasses.png\" width\u003d\"600\"/\u003e","lastModifiedDate":"2021-07-31"},{"lineNumber":138,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":139,"author":{"gitId":"-"},"content":"How the parsing works:","lastModifiedDate":"2021-07-31"},{"lineNumber":140,"author":{"gitId":"rertyy"},"content":"","lastModifiedDate":"2024-03-02"},{"lineNumber":141,"author":{"gitId":"rertyy"},"content":"* When called upon to parse a user command, the `AddressBookParser` class creates an `XYZCommandParser` (`XYZ` is a","lastModifiedDate":"2024-03-02"},{"lineNumber":142,"author":{"gitId":"rertyy"},"content":" placeholder for the specific command name e.g., `AddCommandParser`) which uses the other classes shown above to parse","lastModifiedDate":"2024-03-02"},{"lineNumber":143,"author":{"gitId":"rertyy"},"content":" the user command and create a `XYZCommand` object (e.g., `AddCommand`) which the `AddressBookParser` returns back as","lastModifiedDate":"2024-03-02"},{"lineNumber":144,"author":{"gitId":"rertyy"},"content":" a `Command` object.","lastModifiedDate":"2024-03-02"},{"lineNumber":145,"author":{"gitId":"rertyy"},"content":"* All `XYZCommandParser` classes (e.g., `AddCommandParser`, `DeleteCommandParser`, ...) inherit from the `Parser`","lastModifiedDate":"2024-03-02"},{"lineNumber":146,"author":{"gitId":"rertyy"},"content":" interface so that they can be treated similarly where possible e.g, during testing.","lastModifiedDate":"2024-03-02"},{"lineNumber":147,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":148,"author":{"gitId":"-"},"content":"### Model component","lastModifiedDate":"2021-07-31"},{"lineNumber":149,"author":{"gitId":"rertyy"},"content":"","lastModifiedDate":"2024-03-02"},{"lineNumber":150,"author":{"gitId":"rertyy"},"content":"**API","lastModifiedDate":"2024-03-02"},{"lineNumber":151,"author":{"gitId":"rertyy"},"content":"** : [`Model.java`](https://github.com/se-edu/addressbook-level3/tree/master/src/main/java/seedu/address/model/Model.java)","lastModifiedDate":"2024-03-02"},{"lineNumber":152,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":153,"author":{"gitId":"-"},"content":"\u003cimg src\u003d\"images/ModelClassDiagram.png\" width\u003d\"450\" /\u003e","lastModifiedDate":"2021-07-31"},{"lineNumber":154,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":155,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":156,"author":{"gitId":"-"},"content":"The `Model` component,","lastModifiedDate":"2021-07-31"},{"lineNumber":157,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":158,"author":{"gitId":"-"},"content":"* stores the address book data i.e., all `Person` objects (which are contained in a `UniquePersonList` object).","lastModifiedDate":"2021-07-31"},{"lineNumber":159,"author":{"gitId":"rertyy"},"content":"* stores the currently \u0027selected\u0027 `Person` objects (e.g., results of a search query) as a separate _filtered_ list which","lastModifiedDate":"2024-03-02"},{"lineNumber":160,"author":{"gitId":"rertyy"},"content":" is exposed to outsiders as an unmodifiable `ObservableList\u003cPerson\u003e` that can be \u0027observed\u0027 e.g. the UI can be bound to","lastModifiedDate":"2024-03-02"},{"lineNumber":161,"author":{"gitId":"rertyy"},"content":" this list so that the UI automatically updates when the data in the list change.","lastModifiedDate":"2024-03-02"},{"lineNumber":162,"author":{"gitId":"rertyy"},"content":"* stores a `UserPref` object that represents the user’s preferences. This is exposed to the outside as","lastModifiedDate":"2024-03-02"},{"lineNumber":163,"author":{"gitId":"rertyy"},"content":" a `ReadOnlyUserPref` objects.","lastModifiedDate":"2024-03-02"},{"lineNumber":164,"author":{"gitId":"rertyy"},"content":"* does not depend on any of the other three components (as the `Model` represents data entities of the domain, they","lastModifiedDate":"2024-03-02"},{"lineNumber":165,"author":{"gitId":"rertyy"},"content":" should make sense on their own without depending on other components)","lastModifiedDate":"2024-03-02"},{"lineNumber":166,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2021-07-31"},{"lineNumber":167,"author":{"gitId":"-"},"content":"\u003cdiv markdown\u003d\"span\" class\u003d\"alert alert-info\"\u003e: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.\u003cbr\u003e","lastModifiedDate":"2021-07-31"},{"lineNumber":168,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2021-07-31"},{"lineNumber":169,"author":{"gitId":"-"},"content":"\u003cimg src\u003d\"images/BetterModelClassDiagram.png\" width\u003d\"450\" /\u003e","lastModifiedDate":"2021-07-31"},{"lineNumber":170,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":171,"author":{"gitId":"-"},"content":"\u003c/div\u003e","lastModifiedDate":"2020-05-23"},{"lineNumber":172,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":173,"author":{"gitId":"-"},"content":"### Storage component","lastModifiedDate":"2020-05-23"},{"lineNumber":174,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":175,"author":{"gitId":"rertyy"},"content":"**API","lastModifiedDate":"2024-03-02"},{"lineNumber":176,"author":{"gitId":"rertyy"},"content":"** : [`Storage.java`](https://github.com/se-edu/addressbook-level3/tree/master/src/main/java/seedu/address/storage/Storage.java)","lastModifiedDate":"2024-03-02"},{"lineNumber":177,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":178,"author":{"gitId":"-"},"content":"\u003cimg src\u003d\"images/StorageClassDiagram.png\" width\u003d\"550\" /\u003e","lastModifiedDate":"2021-07-31"},{"lineNumber":179,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2021-07-31"},{"lineNumber":180,"author":{"gitId":"-"},"content":"The `Storage` component,","lastModifiedDate":"2020-05-23"},{"lineNumber":181,"author":{"gitId":"rertyy"},"content":"","lastModifiedDate":"2024-03-02"},{"lineNumber":182,"author":{"gitId":"rertyy"},"content":"* can save both address book data and user preference data in JSON format, and read them back into corresponding","lastModifiedDate":"2024-03-02"},{"lineNumber":183,"author":{"gitId":"rertyy"},"content":" objects.","lastModifiedDate":"2024-03-02"},{"lineNumber":184,"author":{"gitId":"rertyy"},"content":"* inherits from both `AddressBookStorage` and `UserPrefStorage`, which means it can be treated as either one (if only","lastModifiedDate":"2024-03-02"},{"lineNumber":185,"author":{"gitId":"rertyy"},"content":" the functionality of only one is needed).","lastModifiedDate":"2024-03-02"},{"lineNumber":186,"author":{"gitId":"rertyy"},"content":"* depends on some classes in the `Model` component (because the `Storage` component\u0027s job is to save/retrieve objects","lastModifiedDate":"2024-03-02"},{"lineNumber":187,"author":{"gitId":"rertyy"},"content":" that belong to the `Model`)","lastModifiedDate":"2024-03-02"},{"lineNumber":188,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":189,"author":{"gitId":"-"},"content":"### Common classes","lastModifiedDate":"2020-05-23"},{"lineNumber":190,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":191,"author":{"gitId":"-"},"content":"Classes used by multiple components are in the `seedu.addressbook.commons` package.","lastModifiedDate":"2020-05-23"},{"lineNumber":192,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":193,"author":{"gitId":"-"},"content":"--------------------------------------------------------------------------------------------------------------------","lastModifiedDate":"2020-05-23"},{"lineNumber":194,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":195,"author":{"gitId":"-"},"content":"## **Implementation**","lastModifiedDate":"2020-05-23"},{"lineNumber":196,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":197,"author":{"gitId":"-"},"content":"This section describes some noteworthy details on how certain features are implemented.","lastModifiedDate":"2020-05-23"},{"lineNumber":198,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":199,"author":{"gitId":"-"},"content":"### \\[Proposed\\] Undo/redo feature","lastModifiedDate":"2020-06-07"},{"lineNumber":200,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":201,"author":{"gitId":"-"},"content":"#### Proposed Implementation","lastModifiedDate":"2020-05-23"},{"lineNumber":202,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":203,"author":{"gitId":"rertyy"},"content":"The proposed undo/redo mechanism is facilitated by `VersionedAddressBook`. It extends `AddressBook` with an undo/redo","lastModifiedDate":"2024-03-02"},{"lineNumber":204,"author":{"gitId":"rertyy"},"content":"history, stored internally as an `addressBookStateList` and `currentStatePointer`. Additionally, it implements the","lastModifiedDate":"2024-03-02"},{"lineNumber":205,"author":{"gitId":"rertyy"},"content":"following operations:","lastModifiedDate":"2024-03-02"},{"lineNumber":206,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":207,"author":{"gitId":"rertyy"},"content":"* `VersionedAddressBook#commit()`— Saves the current address book state in its history.","lastModifiedDate":"2024-03-02"},{"lineNumber":208,"author":{"gitId":"rertyy"},"content":"* `VersionedAddressBook#undo()`— Restores the previous address book state from its history.","lastModifiedDate":"2024-03-02"},{"lineNumber":209,"author":{"gitId":"rertyy"},"content":"* `VersionedAddressBook#redo()`— Restores a previously undone address book state from its history.","lastModifiedDate":"2024-03-02"},{"lineNumber":210,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":211,"author":{"gitId":"rertyy"},"content":"These operations are exposed in the `Model` interface as `Model#commitAddressBook()`, `Model#undoAddressBook()`","lastModifiedDate":"2024-03-02"},{"lineNumber":212,"author":{"gitId":"rertyy"},"content":"and `Model#redoAddressBook()` respectively.","lastModifiedDate":"2024-03-02"},{"lineNumber":213,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":214,"author":{"gitId":"-"},"content":"Given below is an example usage scenario and how the undo/redo mechanism behaves at each step.","lastModifiedDate":"2020-05-23"},{"lineNumber":215,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":216,"author":{"gitId":"rertyy"},"content":"Step 1. The user launches the application for the first time. The `VersionedAddressBook` will be initialized with the","lastModifiedDate":"2024-03-02"},{"lineNumber":217,"author":{"gitId":"rertyy"},"content":"initial address book state, and the `currentStatePointer` pointing to that single address book state.","lastModifiedDate":"2024-03-02"},{"lineNumber":218,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":219,"author":{"gitId":"-"},"content":"![UndoRedoState0](images/UndoRedoState0.png)","lastModifiedDate":"2020-05-23"},{"lineNumber":220,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":221,"author":{"gitId":"rertyy"},"content":"Step 2. The user executes `delete 5` command to delete the 5th person in the address book. The `delete` command","lastModifiedDate":"2024-03-02"},{"lineNumber":222,"author":{"gitId":"rertyy"},"content":"calls `Model#commitAddressBook()`, causing the modified state of the address book after the `delete 5` command executes","lastModifiedDate":"2024-03-02"},{"lineNumber":223,"author":{"gitId":"rertyy"},"content":"to be saved in the `addressBookStateList`, and the `currentStatePointer` is shifted to the newly inserted address book","lastModifiedDate":"2024-03-02"},{"lineNumber":224,"author":{"gitId":"rertyy"},"content":"state.","lastModifiedDate":"2024-03-02"},{"lineNumber":225,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":226,"author":{"gitId":"-"},"content":"![UndoRedoState1](images/UndoRedoState1.png)","lastModifiedDate":"2020-05-23"},{"lineNumber":227,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":228,"author":{"gitId":"rertyy"},"content":"Step 3. The user executes `add n/David …​` to add a new person. The `add` command also","lastModifiedDate":"2024-03-02"},{"lineNumber":229,"author":{"gitId":"rertyy"},"content":"calls `Model#commitAddressBook()`, causing another modified address book state to be saved into","lastModifiedDate":"2024-03-02"},{"lineNumber":230,"author":{"gitId":"rertyy"},"content":"the `addressBookStateList`.","lastModifiedDate":"2024-03-02"},{"lineNumber":231,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":232,"author":{"gitId":"-"},"content":"![UndoRedoState2](images/UndoRedoState2.png)","lastModifiedDate":"2020-05-23"},{"lineNumber":233,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":234,"author":{"gitId":"-"},"content":"\u003cdiv markdown\u003d\"span\" class\u003d\"alert alert-info\"\u003e: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`.","lastModifiedDate":"2020-05-23"},{"lineNumber":235,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":236,"author":{"gitId":"-"},"content":"\u003c/div\u003e","lastModifiedDate":"2020-05-23"},{"lineNumber":237,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":238,"author":{"gitId":"rertyy"},"content":"Step 4. The user now decides that adding the person was a mistake, and decides to undo that action by executing","lastModifiedDate":"2024-03-02"},{"lineNumber":239,"author":{"gitId":"rertyy"},"content":"the `undo` command. The `undo` command will call `Model#undoAddressBook()`, which will shift the `currentStatePointer`","lastModifiedDate":"2024-03-02"},{"lineNumber":240,"author":{"gitId":"rertyy"},"content":"once to the left, pointing it to the previous address book state, and restores the address book to that state.","lastModifiedDate":"2024-03-02"},{"lineNumber":241,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":242,"author":{"gitId":"-"},"content":"![UndoRedoState3](images/UndoRedoState3.png)","lastModifiedDate":"2020-05-23"},{"lineNumber":243,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":244,"author":{"gitId":"-"},"content":"\u003cdiv markdown\u003d\"span\" class\u003d\"alert alert-info\"\u003e: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","lastModifiedDate":"2020-05-23"},{"lineNumber":245,"author":{"gitId":"-"},"content":"than attempting to perform the undo.","lastModifiedDate":"2020-05-23"},{"lineNumber":246,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":247,"author":{"gitId":"-"},"content":"\u003c/div\u003e","lastModifiedDate":"2020-05-23"},{"lineNumber":248,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":249,"author":{"gitId":"-"},"content":"The following sequence diagram shows how an undo operation goes through the `Logic` component:","lastModifiedDate":"2024-02-09"},{"lineNumber":250,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":251,"author":{"gitId":"-"},"content":"![UndoSequenceDiagram](images/UndoSequenceDiagram-Logic.png)","lastModifiedDate":"2024-02-09"},{"lineNumber":252,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":253,"author":{"gitId":"-"},"content":"\u003cdiv markdown\u003d\"span\" class\u003d\"alert alert-info\"\u003e: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.","lastModifiedDate":"2020-05-23"},{"lineNumber":254,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":255,"author":{"gitId":"-"},"content":"\u003c/div\u003e","lastModifiedDate":"2020-05-23"},{"lineNumber":256,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":257,"author":{"gitId":"-"},"content":"Similarly, how an undo operation goes through the `Model` component is shown below:","lastModifiedDate":"2024-02-09"},{"lineNumber":258,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2024-02-09"},{"lineNumber":259,"author":{"gitId":"-"},"content":"![UndoSequenceDiagram](images/UndoSequenceDiagram-Model.png)","lastModifiedDate":"2024-02-09"},{"lineNumber":260,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2024-02-09"},{"lineNumber":261,"author":{"gitId":"rertyy"},"content":"The `redo` command does the opposite — it calls `Model#redoAddressBook()`, which shifts the `currentStatePointer` once","lastModifiedDate":"2024-03-02"},{"lineNumber":262,"author":{"gitId":"rertyy"},"content":"to the right, pointing to the previously undone state, and restores the address book to that state.","lastModifiedDate":"2024-03-02"},{"lineNumber":263,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":264,"author":{"gitId":"-"},"content":"\u003cdiv markdown\u003d\"span\" class\u003d\"alert alert-info\"\u003e: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.","lastModifiedDate":"2020-05-23"},{"lineNumber":265,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":266,"author":{"gitId":"-"},"content":"\u003c/div\u003e","lastModifiedDate":"2020-05-23"},{"lineNumber":267,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":268,"author":{"gitId":"rertyy"},"content":"Step 5. The user then decides to execute the command `list`. Commands that do not modify the address book, such","lastModifiedDate":"2024-03-02"},{"lineNumber":269,"author":{"gitId":"rertyy"},"content":"as `list`, will usually not call `Model#commitAddressBook()`, `Model#undoAddressBook()` or `Model#redoAddressBook()`.","lastModifiedDate":"2024-03-02"},{"lineNumber":270,"author":{"gitId":"rertyy"},"content":"Thus, the `addressBookStateList` remains unchanged.","lastModifiedDate":"2024-03-02"},{"lineNumber":271,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":272,"author":{"gitId":"-"},"content":"![UndoRedoState4](images/UndoRedoState4.png)","lastModifiedDate":"2020-05-23"},{"lineNumber":273,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":274,"author":{"gitId":"rertyy"},"content":"Step 6. The user executes `clear`, which calls `Model#commitAddressBook()`. Since the `currentStatePointer` is not","lastModifiedDate":"2024-03-02"},{"lineNumber":275,"author":{"gitId":"rertyy"},"content":"pointing at the end of the `addressBookStateList`, all address book states after the `currentStatePointer` will be","lastModifiedDate":"2024-03-02"},{"lineNumber":276,"author":{"gitId":"rertyy"},"content":"purged. Reason: It no longer makes sense to redo the `add n/David …​` command. This is the behavior that most modern","lastModifiedDate":"2024-03-02"},{"lineNumber":277,"author":{"gitId":"rertyy"},"content":"desktop applications follow.","lastModifiedDate":"2024-03-02"},{"lineNumber":278,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":279,"author":{"gitId":"-"},"content":"![UndoRedoState5](images/UndoRedoState5.png)","lastModifiedDate":"2020-05-23"},{"lineNumber":280,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":281,"author":{"gitId":"-"},"content":"The following activity diagram summarizes what happens when a user executes a new command:","lastModifiedDate":"2020-05-23"},{"lineNumber":282,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":283,"author":{"gitId":"-"},"content":"\u003cimg src\u003d\"images/CommitActivityDiagram.png\" width\u003d\"250\" /\u003e","lastModifiedDate":"2021-07-31"},{"lineNumber":284,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":285,"author":{"gitId":"-"},"content":"#### Design considerations:","lastModifiedDate":"2021-07-31"},{"lineNumber":286,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":287,"author":{"gitId":"-"},"content":"**Aspect: How undo \u0026 redo executes:**","lastModifiedDate":"2021-07-31"},{"lineNumber":288,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":289,"author":{"gitId":"-"},"content":"* **Alternative 1 (current choice):** Saves the entire address book.","lastModifiedDate":"2020-05-23"},{"lineNumber":290,"author":{"gitId":"-"},"content":" * Pros: Easy to implement.","lastModifiedDate":"2020-05-23"},{"lineNumber":291,"author":{"gitId":"-"},"content":" * Cons: May have performance issues in terms of memory usage.","lastModifiedDate":"2020-05-23"},{"lineNumber":292,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":293,"author":{"gitId":"-"},"content":"* **Alternative 2:** Individual command knows how to undo/redo by","lastModifiedDate":"2020-05-23"},{"lineNumber":294,"author":{"gitId":"-"},"content":" itself.","lastModifiedDate":"2020-05-23"},{"lineNumber":295,"author":{"gitId":"-"},"content":" * Pros: Will use less memory (e.g. for `delete`, just save the person being deleted).","lastModifiedDate":"2020-05-23"},{"lineNumber":296,"author":{"gitId":"-"},"content":" * Cons: We must ensure that the implementation of each individual command are correct.","lastModifiedDate":"2020-05-23"},{"lineNumber":297,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":298,"author":{"gitId":"-"},"content":"_{more aspects and alternatives to be added}_","lastModifiedDate":"2020-05-23"},{"lineNumber":299,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":300,"author":{"gitId":"-"},"content":"### \\[Proposed\\] Data archiving","lastModifiedDate":"2020-05-23"},{"lineNumber":301,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":302,"author":{"gitId":"-"},"content":"_{Explain here how the data archiving feature will be implemented}_","lastModifiedDate":"2020-05-23"},{"lineNumber":303,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":304,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":305,"author":{"gitId":"-"},"content":"--------------------------------------------------------------------------------------------------------------------","lastModifiedDate":"2020-05-23"},{"lineNumber":306,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":307,"author":{"gitId":"-"},"content":"## **Documentation, logging, testing, configuration, dev-ops**","lastModifiedDate":"2020-06-07"},{"lineNumber":308,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":309,"author":{"gitId":"-"},"content":"* [Documentation guide](Documentation.md)","lastModifiedDate":"2020-06-07"},{"lineNumber":310,"author":{"gitId":"-"},"content":"* [Testing guide](Testing.md)","lastModifiedDate":"2020-06-07"},{"lineNumber":311,"author":{"gitId":"-"},"content":"* [Logging guide](Logging.md)","lastModifiedDate":"2020-06-07"},{"lineNumber":312,"author":{"gitId":"-"},"content":"* [Configuration guide](Configuration.md)","lastModifiedDate":"2020-06-07"},{"lineNumber":313,"author":{"gitId":"-"},"content":"* [DevOps guide](DevOps.md)","lastModifiedDate":"2020-06-07"},{"lineNumber":314,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":315,"author":{"gitId":"-"},"content":"--------------------------------------------------------------------------------------------------------------------","lastModifiedDate":"2020-05-23"},{"lineNumber":316,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":317,"author":{"gitId":"-"},"content":"## **Appendix: Requirements**","lastModifiedDate":"2020-05-23"},{"lineNumber":318,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":319,"author":{"gitId":"-"},"content":"### Product scope","lastModifiedDate":"2020-05-23"},{"lineNumber":320,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":321,"author":{"gitId":"-"},"content":"**Target user profile**:","lastModifiedDate":"2020-05-23"},{"lineNumber":322,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":323,"author":{"gitId":"-"},"content":"* has a need to manage a significant number of contacts","lastModifiedDate":"2020-05-23"},{"lineNumber":324,"author":{"gitId":"-"},"content":"* prefer desktop apps over other types","lastModifiedDate":"2020-05-23"},{"lineNumber":325,"author":{"gitId":"-"},"content":"* can type fast","lastModifiedDate":"2020-05-23"},{"lineNumber":326,"author":{"gitId":"-"},"content":"* prefers typing to mouse interactions","lastModifiedDate":"2020-05-26"},{"lineNumber":327,"author":{"gitId":"-"},"content":"* is reasonably comfortable using CLI apps","lastModifiedDate":"2020-05-23"},{"lineNumber":328,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":329,"author":{"gitId":"-"},"content":"**Value proposition**: manage contacts faster than a typical mouse/GUI driven app","lastModifiedDate":"2020-05-23"},{"lineNumber":330,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":331,"author":{"gitId":"-"},"content":"### User stories","lastModifiedDate":"2020-06-07"},{"lineNumber":332,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":333,"author":{"gitId":"-"},"content":"Priorities: High (must have) - `* * *`, Medium (nice to have) - `* *`, Low (unlikely to have) - `*`","lastModifiedDate":"2020-05-23"},{"lineNumber":334,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":335,"author":{"gitId":"Jaspertzx"},"content":"| Priority | As a … | I want to … | So that I can… |","lastModifiedDate":"2024-03-05"},{"lineNumber":336,"author":{"gitId":"rertyy"},"content":"|----------|----------------------------------|--------------------------------------------------------------------------|----------------------------------------------------------------------------------------------------------------|","lastModifiedDate":"2024-03-07"},{"lineNumber":337,"author":{"gitId":"Jaspertzx"},"content":"| `* * *` | Small business owner | easily add new customers to my address book | keep track of all my clients\u0027 information in one place. |","lastModifiedDate":"2024-03-05"},{"lineNumber":338,"author":{"gitId":"Jaspertzx"},"content":"| `* * *` | Crocheter | have a search function | quickly find specific customers when I need to reference their details. |","lastModifiedDate":"2024-03-05"},{"lineNumber":339,"author":{"gitId":"Jaspertzx"},"content":"| `* * *` | Busy entrepreneur | be accessible via a command-line interface | efficiently manage my customer list without navigating through complex menus. |","lastModifiedDate":"2024-03-05"},{"lineNumber":340,"author":{"gitId":"Jaspertzx"},"content":"| `* * *` | Crochet business owner | have customizable fields | record specific details about each customer, such as their favorite colors or special requests. |","lastModifiedDate":"2024-03-05"},{"lineNumber":341,"author":{"gitId":"Jaspertzx"},"content":"| `* * *` | Small business owner | be cost-effective and easy to use | maximize productivity without investing in expensive CRM systems. |","lastModifiedDate":"2024-03-05"},{"lineNumber":342,"author":{"gitId":"Jaspertzx"},"content":"| `* * *` | Crochet business owner | have data backup and synchronization capabilities | access my customer information from multiple devices and ensure its security. |","lastModifiedDate":"2024-03-05"},{"lineNumber":343,"author":{"gitId":"Jaspertzx"},"content":"| `* * *` | Small business owner | have secure access controls and permissions settings | restrict sensitive information and ensure data privacy compliance. |","lastModifiedDate":"2024-03-05"},{"lineNumber":344,"author":{"gitId":"Jaspertzx"},"content":"| `* *` | Crochet business owner | categorize my customers | tailor my marketing efforts accordingly based on factors like their preferred crochet items or past purchases. |","lastModifiedDate":"2024-03-05"},{"lineNumber":345,"author":{"gitId":"Jaspertzx"},"content":"| `* *` | Small business owner | generate reports on customer activity | analyze trends and make informed business decisions based on order history and frequency of purchases. |","lastModifiedDate":"2024-03-05"},{"lineNumber":346,"author":{"gitId":"Jaspertzx"},"content":"| `* *` | Small business owner | have a reminder feature | stay organized and follow up with customers on important dates, such as birthdays or anniversaries. |","lastModifiedDate":"2024-03-05"},{"lineNumber":347,"author":{"gitId":"Jaspertzx"},"content":"| `* *` | Small business owner | have customizable templates for invoices and receipts | easily generate and send professional-looking documents to my customers. |","lastModifiedDate":"2024-03-05"},{"lineNumber":348,"author":{"gitId":"Jaspertzx"},"content":"| `* *` | Crocheter offering custom orders | have a notes section for each customer | record specific preferences and requirements for their projects. |","lastModifiedDate":"2024-03-05"},{"lineNumber":349,"author":{"gitId":"Jaspertzx"},"content":"| `* *` | Small business owner | integrate with accounting software | easily track expenses related to each customer and maintain accurate financial records. |","lastModifiedDate":"2024-03-05"},{"lineNumber":350,"author":{"gitId":"Jaspertzx"},"content":"| `*` | Crocheter | have a mobile-friendly interface | easily access customer information on the go and process orders efficiently. |","lastModifiedDate":"2024-03-05"},{"lineNumber":351,"author":{"gitId":"Jaspertzx"},"content":"| `*` | Crocheter | integrate with my email client | send personalized messages and promotions to my customers directly from the platform. |","lastModifiedDate":"2024-03-05"},{"lineNumber":352,"author":{"gitId":"Jaspertzx"},"content":"| `*` | Crocheter | integrate with e-commerce platforms | automatically sync customer data and manage orders efficiently when participating in online marketplaces. |","lastModifiedDate":"2024-03-05"},{"lineNumber":353,"author":{"gitId":"Jaspertzx"},"content":"| `*` | Crochet business owner | track communication history with customers | provide personalized and timely customer service including emails and phone calls. |","lastModifiedDate":"2024-03-05"},{"lineNumber":354,"author":{"gitId":"Jaspertzx"},"content":"| `*` | Crochet business owner | support multiple user accounts with shared access | my team members can collaborate on managing customer relationships. |","lastModifiedDate":"2024-03-05"},{"lineNumber":355,"author":{"gitId":"Jaspertzx"},"content":"| `*` | Crocheter | have a scheduling feature | manage registrations and communicate updates with attendees seamlessly. |","lastModifiedDate":"2024-03-05"},{"lineNumber":356,"author":{"gitId":"Jaspertzx"},"content":"| `*` | Crocheter | have a feature for scanning and capturing customer contact information | grow my mailing list and follow up with potential leads quickly. |","lastModifiedDate":"2024-03-05"},{"lineNumber":357,"author":{"gitId":"Jaspertzx"},"content":"| `*` | Crocheter | integrate with social media platforms | easily connect with customers and engage with them through various channels. |","lastModifiedDate":"2024-03-05"},{"lineNumber":358,"author":{"gitId":"Jaspertzx"},"content":"| `*` | Crochet business owner | provide insights into customer demographics and preferences | tailor my product offerings and marketing campaigns to target specific audiences effectively. |","lastModifiedDate":"2024-03-05"},{"lineNumber":359,"author":{"gitId":"Jaspertzx"},"content":"| `*` | Small business owner | provide analytics and insights on customer behavior | continuously improve my products and services to meet customer needs based on purchase patterns and feedback. |","lastModifiedDate":"2024-03-05"},{"lineNumber":360,"author":{"gitId":"Jaspertzx"},"content":"| `*` | Crochet business owner | provide insights into customer satisfaction through feedback and reviews | address any concerns and improve the overall customer experience. |","lastModifiedDate":"2024-03-05"},{"lineNumber":361,"author":{"gitId":"Jaspertzx"},"content":"| `*` | Small business owner | offer customizable tags or labels for customers | segment my audience and target specific groups with tailored marketing campaigns. |","lastModifiedDate":"2024-03-05"},{"lineNumber":362,"author":{"gitId":"Jaspertzx"},"content":"| `*` | Busy entrepreneur | have a good out of the box experience | immediately use the application without needing to configure it for my own needs. |","lastModifiedDate":"2024-03-05"},{"lineNumber":363,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":364,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2024-03-07"},{"lineNumber":365,"author":{"gitId":"-"},"content":"### Use cases","lastModifiedDate":"2020-06-07"},{"lineNumber":366,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":367,"author":{"gitId":"rertyy"},"content":"(For all use cases below, the **System** is the `AddressBook` and the **Actor** is the `user`, unless specified","lastModifiedDate":"2024-03-02"},{"lineNumber":368,"author":{"gitId":"rertyy"},"content":"otherwise)","lastModifiedDate":"2024-03-02"},{"lineNumber":369,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":370,"author":{"gitId":"-"},"content":"**Use case: Delete a person**","lastModifiedDate":"2020-05-23"},{"lineNumber":371,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":372,"author":{"gitId":"-"},"content":"**MSS**","lastModifiedDate":"2020-05-23"},{"lineNumber":373,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":374,"author":{"gitId":"rertyy"},"content":"1. User requests to list persons.","lastModifiedDate":"2024-03-07"},{"lineNumber":375,"author":{"gitId":"rertyy"},"content":"2. AddressBook shows a list of persons.","lastModifiedDate":"2024-03-07"},{"lineNumber":376,"author":{"gitId":"rertyy"},"content":"3. User requests to delete a specific person in the list.","lastModifiedDate":"2024-03-07"},{"lineNumber":377,"author":{"gitId":"rertyy"},"content":"4. AddressBook deletes the person.","lastModifiedDate":"2024-03-07"},{"lineNumber":378,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":379,"author":{"gitId":"-"},"content":" Use case ends.","lastModifiedDate":"2020-05-23"},{"lineNumber":380,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":381,"author":{"gitId":"-"},"content":"**Extensions**","lastModifiedDate":"2020-05-23"},{"lineNumber":382,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":383,"author":{"gitId":"-"},"content":"* 2a. The list is empty.","lastModifiedDate":"2020-05-23"},{"lineNumber":384,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":385,"author":{"gitId":"-"},"content":" Use case ends.","lastModifiedDate":"2020-05-23"},{"lineNumber":386,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":387,"author":{"gitId":"-"},"content":"* 3a. The given index is invalid.","lastModifiedDate":"2020-05-23"},{"lineNumber":388,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":389,"author":{"gitId":"-"},"content":" * 3a1. AddressBook shows an error message.","lastModifiedDate":"2020-05-23"},{"lineNumber":390,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":391,"author":{"gitId":"-"},"content":" Use case resumes at step 2.","lastModifiedDate":"2020-05-23"},{"lineNumber":392,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":393,"author":{"gitId":"rertyy"},"content":"**Use case: Add a person**","lastModifiedDate":"2024-03-02"},{"lineNumber":394,"author":{"gitId":"rertyy"},"content":"","lastModifiedDate":"2024-03-02"},{"lineNumber":395,"author":{"gitId":"rertyy"},"content":"**MSS**","lastModifiedDate":"2024-03-02"},{"lineNumber":396,"author":{"gitId":"rertyy"},"content":"","lastModifiedDate":"2024-03-02"},{"lineNumber":397,"author":{"gitId":"rertyy"},"content":"1. User requests to add a person.","lastModifiedDate":"2024-03-07"},{"lineNumber":398,"author":{"gitId":"rertyy"},"content":"2. AddressBook adds a person.","lastModifiedDate":"2024-03-07"},{"lineNumber":399,"author":{"gitId":"rertyy"},"content":"3. AddressBook shows the added person.","lastModifiedDate":"2024-03-07"},{"lineNumber":400,"author":{"gitId":"rertyy"},"content":"","lastModifiedDate":"2024-03-02"},{"lineNumber":401,"author":{"gitId":"rertyy"},"content":" Use case ends.","lastModifiedDate":"2024-03-02"},{"lineNumber":402,"author":{"gitId":"rertyy"},"content":"","lastModifiedDate":"2024-03-02"},{"lineNumber":403,"author":{"gitId":"rertyy"},"content":"**Extensions**","lastModifiedDate":"2024-03-02"},{"lineNumber":404,"author":{"gitId":"rertyy"},"content":"","lastModifiedDate":"2024-03-02"},{"lineNumber":405,"author":{"gitId":"rertyy"},"content":"* 2a. The person already exists.","lastModifiedDate":"2024-03-02"},{"lineNumber":406,"author":{"gitId":"rertyy"},"content":"","lastModifiedDate":"2024-03-02"},{"lineNumber":407,"author":{"gitId":"rertyy"},"content":" * 2a1. AddressBook shows an error message.","lastModifiedDate":"2024-03-02"},{"lineNumber":408,"author":{"gitId":"rertyy"},"content":"","lastModifiedDate":"2024-03-02"},{"lineNumber":409,"author":{"gitId":"rertyy"},"content":" Use case resumes at step 1.","lastModifiedDate":"2024-03-02"},{"lineNumber":410,"author":{"gitId":"rertyy"},"content":"","lastModifiedDate":"2024-03-02"},{"lineNumber":411,"author":{"gitId":"rertyy"},"content":"* 2b. The person details are invalid.","lastModifiedDate":"2024-03-02"},{"lineNumber":412,"author":{"gitId":"rertyy"},"content":"","lastModifiedDate":"2024-03-02"},{"lineNumber":413,"author":{"gitId":"rertyy"},"content":" * 2b1. AddressBook shows an error message.","lastModifiedDate":"2024-03-02"},{"lineNumber":414,"author":{"gitId":"rertyy"},"content":"","lastModifiedDate":"2024-03-02"},{"lineNumber":415,"author":{"gitId":"rertyy"},"content":" Use case resumes at step 1.","lastModifiedDate":"2024-03-02"},{"lineNumber":416,"author":{"gitId":"rertyy"},"content":"","lastModifiedDate":"2024-03-02"},{"lineNumber":417,"author":{"gitId":"rertyy"},"content":"**Use case: Edit a person**","lastModifiedDate":"2024-03-07"},{"lineNumber":418,"author":{"gitId":"rertyy"},"content":"","lastModifiedDate":"2024-03-07"},{"lineNumber":419,"author":{"gitId":"rertyy"},"content":"**MSS**","lastModifiedDate":"2024-03-07"},{"lineNumber":420,"author":{"gitId":"rertyy"},"content":"","lastModifiedDate":"2024-03-07"},{"lineNumber":421,"author":{"gitId":"rertyy"},"content":"1. User requests to edit a person.","lastModifiedDate":"2024-03-07"},{"lineNumber":422,"author":{"gitId":"rertyy"},"content":"2. AddressBook shows the person to be edited.","lastModifiedDate":"2024-03-07"},{"lineNumber":423,"author":{"gitId":"rertyy"},"content":"3. User edits the person.","lastModifiedDate":"2024-03-07"},{"lineNumber":424,"author":{"gitId":"rertyy"},"content":"4. AddressBook shows the edited person.","lastModifiedDate":"2024-03-07"},{"lineNumber":425,"author":{"gitId":"rertyy"},"content":"","lastModifiedDate":"2024-03-07"},{"lineNumber":426,"author":{"gitId":"rertyy"},"content":" Use case ends.","lastModifiedDate":"2024-03-07"},{"lineNumber":427,"author":{"gitId":"rertyy"},"content":"","lastModifiedDate":"2024-03-07"},{"lineNumber":428,"author":{"gitId":"rertyy"},"content":"**Extensions**","lastModifiedDate":"2024-03-07"},{"lineNumber":429,"author":{"gitId":"rertyy"},"content":"","lastModifiedDate":"2024-03-07"},{"lineNumber":430,"author":{"gitId":"rertyy"},"content":"* 2a. The person does not exist.","lastModifiedDate":"2024-03-07"},{"lineNumber":431,"author":{"gitId":"rertyy"},"content":"","lastModifiedDate":"2024-03-07"},{"lineNumber":432,"author":{"gitId":"rertyy"},"content":" * 2a1. AddressBook shows an error message.","lastModifiedDate":"2024-03-07"},{"lineNumber":433,"author":{"gitId":"rertyy"},"content":" * 2a2. AddressBook shows a list of persons with similar names.","lastModifiedDate":"2024-03-07"},{"lineNumber":434,"author":{"gitId":"rertyy"},"content":"","lastModifiedDate":"2024-03-07"},{"lineNumber":435,"author":{"gitId":"rertyy"},"content":" Use case resumes at step 1.","lastModifiedDate":"2024-03-07"},{"lineNumber":436,"author":{"gitId":"rertyy"},"content":"* 3a. The person details are invalid.","lastModifiedDate":"2024-03-07"},{"lineNumber":437,"author":{"gitId":"rertyy"},"content":"","lastModifiedDate":"2024-03-07"},{"lineNumber":438,"author":{"gitId":"rertyy"},"content":" * 3a1. AddressBook shows an error message.","lastModifiedDate":"2024-03-07"},{"lineNumber":439,"author":{"gitId":"rertyy"},"content":"","lastModifiedDate":"2024-03-07"},{"lineNumber":440,"author":{"gitId":"rertyy"},"content":" Use case resumes at step 2.","lastModifiedDate":"2024-03-07"},{"lineNumber":441,"author":{"gitId":"rertyy"},"content":"* 3b. The person details are unchanged.","lastModifiedDate":"2024-03-07"},{"lineNumber":442,"author":{"gitId":"rertyy"},"content":"","lastModifiedDate":"2024-03-07"},{"lineNumber":443,"author":{"gitId":"rertyy"},"content":" * 3b1. AddressBook shows a message indicating no changes are made.","lastModifiedDate":"2024-03-07"},{"lineNumber":444,"author":{"gitId":"rertyy"},"content":"","lastModifiedDate":"2024-03-07"},{"lineNumber":445,"author":{"gitId":"rertyy"},"content":" Use case resumes at step 2.","lastModifiedDate":"2024-03-07"},{"lineNumber":446,"author":{"gitId":"rertyy"},"content":"","lastModifiedDate":"2024-03-07"},{"lineNumber":447,"author":{"gitId":"rertyy"},"content":"**Use case: Find a person**","lastModifiedDate":"2024-03-02"},{"lineNumber":448,"author":{"gitId":"rertyy"},"content":"","lastModifiedDate":"2024-03-02"},{"lineNumber":449,"author":{"gitId":"rertyy"},"content":"**MSS**","lastModifiedDate":"2024-03-02"},{"lineNumber":450,"author":{"gitId":"rertyy"},"content":"","lastModifiedDate":"2024-03-02"},{"lineNumber":451,"author":{"gitId":"rertyy"},"content":"1. User requests to find a person by name.","lastModifiedDate":"2024-03-07"},{"lineNumber":452,"author":{"gitId":"rertyy"},"content":"2. AddressBook shows a list of persons whose names contain the given keyword.","lastModifiedDate":"2024-03-07"},{"lineNumber":453,"author":{"gitId":"rertyy"},"content":"","lastModifiedDate":"2024-03-02"},{"lineNumber":454,"author":{"gitId":"rertyy"},"content":" Use case ends.","lastModifiedDate":"2024-03-02"},{"lineNumber":455,"author":{"gitId":"rertyy"},"content":"","lastModifiedDate":"2024-03-02"},{"lineNumber":456,"author":{"gitId":"rertyy"},"content":"**Extensions**","lastModifiedDate":"2024-03-02"},{"lineNumber":457,"author":{"gitId":"rertyy"},"content":"","lastModifiedDate":"2024-03-02"},{"lineNumber":458,"author":{"gitId":"rertyy"},"content":"* 2a. No person is found.","lastModifiedDate":"2024-03-02"},{"lineNumber":459,"author":{"gitId":"rertyy"},"content":"","lastModifiedDate":"2024-03-02"},{"lineNumber":460,"author":{"gitId":"rertyy"},"content":" * 2a1. AddressBook shows a message indicating no person is found.","lastModifiedDate":"2024-03-02"},{"lineNumber":461,"author":{"gitId":"rertyy"},"content":" * 2a2. AddressBook shows the list of persons with similar names.","lastModifiedDate":"2024-03-07"},{"lineNumber":462,"author":{"gitId":"rertyy"},"content":"","lastModifiedDate":"2024-03-02"},{"lineNumber":463,"author":{"gitId":"rertyy"},"content":" Use case ends.","lastModifiedDate":"2024-03-02"},{"lineNumber":464,"author":{"gitId":"rertyy"},"content":"","lastModifiedDate":"2024-03-02"},{"lineNumber":465,"author":{"gitId":"rertyy"},"content":"**Use case: Filter categories**","lastModifiedDate":"2024-03-02"},{"lineNumber":466,"author":{"gitId":"rertyy"},"content":"","lastModifiedDate":"2024-03-02"},{"lineNumber":467,"author":{"gitId":"rertyy"},"content":"**MSS**","lastModifiedDate":"2024-03-02"},{"lineNumber":468,"author":{"gitId":"rertyy"},"content":"","lastModifiedDate":"2024-03-02"},{"lineNumber":469,"author":{"gitId":"rertyy"},"content":"1. User requests to filter categories.","lastModifiedDate":"2024-03-07"},{"lineNumber":470,"author":{"gitId":"rertyy"},"content":"2. AddressBook shows a list of persons with the given category.","lastModifiedDate":"2024-03-07"},{"lineNumber":471,"author":{"gitId":"rertyy"},"content":"","lastModifiedDate":"2024-03-07"},{"lineNumber":472,"author":{"gitId":"rertyy"},"content":" Use case ends.","lastModifiedDate":"2024-03-07"},{"lineNumber":473,"author":{"gitId":"rertyy"},"content":"","lastModifiedDate":"2024-03-07"},{"lineNumber":474,"author":{"gitId":"rertyy"},"content":"**Use case: Sort by order**","lastModifiedDate":"2024-03-07"},{"lineNumber":475,"author":{"gitId":"rertyy"},"content":"","lastModifiedDate":"2024-03-07"},{"lineNumber":476,"author":{"gitId":"rertyy"},"content":"**MSS**","lastModifiedDate":"2024-03-07"},{"lineNumber":477,"author":{"gitId":"rertyy"},"content":"","lastModifiedDate":"2024-03-07"},{"lineNumber":478,"author":{"gitId":"rertyy"},"content":"1. User requests to sort by order.","lastModifiedDate":"2024-03-07"},{"lineNumber":479,"author":{"gitId":"rertyy"},"content":"2. AddressBook shows a list of persons sorted by the given order.","lastModifiedDate":"2024-03-07"},{"lineNumber":480,"author":{"gitId":"rertyy"},"content":"","lastModifiedDate":"2024-03-02"},{"lineNumber":481,"author":{"gitId":"rertyy"},"content":" Use case ends.","lastModifiedDate":"2024-03-02"},{"lineNumber":482,"author":{"gitId":"rertyy"},"content":"","lastModifiedDate":"2024-03-02"},{"lineNumber":483,"author":{"gitId":"rertyy"},"content":"**Use case: Show help**","lastModifiedDate":"2024-03-02"},{"lineNumber":484,"author":{"gitId":"rertyy"},"content":"","lastModifiedDate":"2024-03-02"},{"lineNumber":485,"author":{"gitId":"rertyy"},"content":"**MSS**","lastModifiedDate":"2024-03-02"},{"lineNumber":486,"author":{"gitId":"rertyy"},"content":"","lastModifiedDate":"2024-03-02"},{"lineNumber":487,"author":{"gitId":"rertyy"},"content":"1. User requests to show help.","lastModifiedDate":"2024-03-07"},{"lineNumber":488,"author":{"gitId":"rertyy"},"content":"2. AddressBook shows a help page.","lastModifiedDate":"2024-03-07"},{"lineNumber":489,"author":{"gitId":"rertyy"},"content":"","lastModifiedDate":"2024-03-02"},{"lineNumber":490,"author":{"gitId":"rertyy"},"content":" Use case ends.","lastModifiedDate":"2024-03-02"},{"lineNumber":491,"author":{"gitId":"rertyy"},"content":"","lastModifiedDate":"2024-03-02"},{"lineNumber":492,"author":{"gitId":"rertyy"},"content":"**Use case: Clear all entries**","lastModifiedDate":"2024-03-02"},{"lineNumber":493,"author":{"gitId":"rertyy"},"content":"","lastModifiedDate":"2024-03-02"},{"lineNumber":494,"author":{"gitId":"rertyy"},"content":"**MSS**","lastModifiedDate":"2024-03-02"},{"lineNumber":495,"author":{"gitId":"rertyy"},"content":"","lastModifiedDate":"2024-03-02"},{"lineNumber":496,"author":{"gitId":"rertyy"},"content":"1. User requests to clear all entries.","lastModifiedDate":"2024-03-07"},{"lineNumber":497,"author":{"gitId":"rertyy"},"content":"2. AddressBook clears all entries.","lastModifiedDate":"2024-03-07"},{"lineNumber":498,"author":{"gitId":"rertyy"},"content":"","lastModifiedDate":"2024-03-02"},{"lineNumber":499,"author":{"gitId":"rertyy"},"content":" Use case ends.","lastModifiedDate":"2024-03-02"},{"lineNumber":500,"author":{"gitId":"rertyy"},"content":"","lastModifiedDate":"2024-03-02"},{"lineNumber":501,"author":{"gitId":"rertyy"},"content":"**Use case: Exit the program**","lastModifiedDate":"2024-03-02"},{"lineNumber":502,"author":{"gitId":"rertyy"},"content":"","lastModifiedDate":"2024-03-02"},{"lineNumber":503,"author":{"gitId":"rertyy"},"content":"**MSS**","lastModifiedDate":"2024-03-02"},{"lineNumber":504,"author":{"gitId":"rertyy"},"content":"","lastModifiedDate":"2024-03-02"},{"lineNumber":505,"author":{"gitId":"rertyy"},"content":"1. User requests to exit the program.","lastModifiedDate":"2024-03-07"},{"lineNumber":506,"author":{"gitId":"rertyy"},"content":"2. AddressBook exits.","lastModifiedDate":"2024-03-07"},{"lineNumber":507,"author":{"gitId":"rertyy"},"content":"","lastModifiedDate":"2024-03-07"},{"lineNumber":508,"author":{"gitId":"rertyy"},"content":" Use case ends.","lastModifiedDate":"2024-03-07"},{"lineNumber":509,"author":{"gitId":"rertyy"},"content":"","lastModifiedDate":"2024-03-07"},{"lineNumber":510,"author":{"gitId":"rertyy"},"content":"**Use case: Import data**","lastModifiedDate":"2024-03-07"},{"lineNumber":511,"author":{"gitId":"rertyy"},"content":"","lastModifiedDate":"2024-03-07"},{"lineNumber":512,"author":{"gitId":"rertyy"},"content":"**MSS**","lastModifiedDate":"2024-03-07"},{"lineNumber":513,"author":{"gitId":"rertyy"},"content":"","lastModifiedDate":"2024-03-07"},{"lineNumber":514,"author":{"gitId":"rertyy"},"content":"1. User requests to view locally saved data.","lastModifiedDate":"2024-03-07"},{"lineNumber":515,"author":{"gitId":"rertyy"},"content":"2. AddressBook opens location of saved data.","lastModifiedDate":"2024-03-07"},{"lineNumber":516,"author":{"gitId":"rertyy"},"content":"3. User stores new data to local file.","lastModifiedDate":"2024-03-07"},{"lineNumber":517,"author":{"gitId":"rertyy"},"content":"4. AddressBook imports data from file.","lastModifiedDate":"2024-03-07"},{"lineNumber":518,"author":{"gitId":"rertyy"},"content":"","lastModifiedDate":"2024-03-02"},{"lineNumber":519,"author":{"gitId":"rertyy"},"content":" Use case ends.","lastModifiedDate":"2024-03-02"},{"lineNumber":520,"author":{"gitId":"rertyy"},"content":"","lastModifiedDate":"2024-03-02"},{"lineNumber":521,"author":{"gitId":"rertyy"},"content":"**Extensions**","lastModifiedDate":"2024-03-07"},{"lineNumber":522,"author":{"gitId":"rertyy"},"content":"","lastModifiedDate":"2024-03-07"},{"lineNumber":523,"author":{"gitId":"rertyy"},"content":"* 4a. The data is invalid.","lastModifiedDate":"2024-03-07"},{"lineNumber":524,"author":{"gitId":"rertyy"},"content":"","lastModifiedDate":"2024-03-07"},{"lineNumber":525,"author":{"gitId":"rertyy"},"content":" * 4a1. AddressBook shows an error message.","lastModifiedDate":"2024-03-07"},{"lineNumber":526,"author":{"gitId":"rertyy"},"content":"","lastModifiedDate":"2024-03-07"},{"lineNumber":527,"author":{"gitId":"rertyy"},"content":" Use case resumes at step 1.","lastModifiedDate":"2024-03-07"},{"lineNumber":528,"author":{"gitId":"rertyy"},"content":"","lastModifiedDate":"2024-03-07"},{"lineNumber":529,"author":{"gitId":"rertyy"},"content":"**Use case: Export data**","lastModifiedDate":"2024-03-02"},{"lineNumber":530,"author":{"gitId":"rertyy"},"content":"","lastModifiedDate":"2024-03-02"},{"lineNumber":531,"author":{"gitId":"rertyy"},"content":"**MSS**","lastModifiedDate":"2024-03-02"},{"lineNumber":532,"author":{"gitId":"rertyy"},"content":"","lastModifiedDate":"2024-03-02"},{"lineNumber":533,"author":{"gitId":"rertyy"},"content":"1. User requests to export data.","lastModifiedDate":"2024-03-07"},{"lineNumber":534,"author":{"gitId":"rertyy"},"content":"2. AddressBook opens locally saved file.","lastModifiedDate":"2024-03-07"},{"lineNumber":535,"author":{"gitId":"rertyy"},"content":"","lastModifiedDate":"2024-03-07"},{"lineNumber":536,"author":{"gitId":"rertyy"},"content":" Use case ends.","lastModifiedDate":"2024-03-07"},{"lineNumber":537,"author":{"gitId":"rertyy"},"content":"","lastModifiedDate":"2024-03-07"},{"lineNumber":538,"author":{"gitId":"rertyy"},"content":"**Use case: Add order**","lastModifiedDate":"2024-03-07"},{"lineNumber":539,"author":{"gitId":"rertyy"},"content":"","lastModifiedDate":"2024-03-07"},{"lineNumber":540,"author":{"gitId":"rertyy"},"content":"**MSS**","lastModifiedDate":"2024-03-07"},{"lineNumber":541,"author":{"gitId":"rertyy"},"content":"","lastModifiedDate":"2024-03-07"},{"lineNumber":542,"author":{"gitId":"rertyy"},"content":"1. User requests to add an order.","lastModifiedDate":"2024-03-07"},{"lineNumber":543,"author":{"gitId":"rertyy"},"content":"2. AddressBook adds an order.","lastModifiedDate":"2024-03-07"},{"lineNumber":544,"author":{"gitId":"rertyy"},"content":"","lastModifiedDate":"2024-03-07"},{"lineNumber":545,"author":{"gitId":"rertyy"},"content":" Use case ends.","lastModifiedDate":"2024-03-07"},{"lineNumber":546,"author":{"gitId":"rertyy"},"content":"","lastModifiedDate":"2024-03-07"},{"lineNumber":547,"author":{"gitId":"rertyy"},"content":"**Extensions**","lastModifiedDate":"2024-03-07"},{"lineNumber":548,"author":{"gitId":"rertyy"},"content":"","lastModifiedDate":"2024-03-07"},{"lineNumber":549,"author":{"gitId":"rertyy"},"content":"* 2a. The order already exists.","lastModifiedDate":"2024-03-07"},{"lineNumber":550,"author":{"gitId":"rertyy"},"content":"","lastModifiedDate":"2024-03-07"},{"lineNumber":551,"author":{"gitId":"rertyy"},"content":" * 2a1. AddressBook shows an error message.","lastModifiedDate":"2024-03-07"},{"lineNumber":552,"author":{"gitId":"rertyy"},"content":"","lastModifiedDate":"2024-03-07"},{"lineNumber":553,"author":{"gitId":"rertyy"},"content":" Use case resumes at step 1.","lastModifiedDate":"2024-03-07"},{"lineNumber":554,"author":{"gitId":"rertyy"},"content":"* 2b. The order details are invalid.","lastModifiedDate":"2024-03-07"},{"lineNumber":555,"author":{"gitId":"rertyy"},"content":"","lastModifiedDate":"2024-03-07"},{"lineNumber":556,"author":{"gitId":"rertyy"},"content":" * 2b1. AddressBook shows an error message.","lastModifiedDate":"2024-03-07"},{"lineNumber":557,"author":{"gitId":"rertyy"},"content":"","lastModifiedDate":"2024-03-07"},{"lineNumber":558,"author":{"gitId":"rertyy"},"content":" Use case resumes at step 1.","lastModifiedDate":"2024-03-07"},{"lineNumber":559,"author":{"gitId":"rertyy"},"content":"","lastModifiedDate":"2024-03-07"},{"lineNumber":560,"author":{"gitId":"rertyy"},"content":"**Use case: Edit order**","lastModifiedDate":"2024-03-07"},{"lineNumber":561,"author":{"gitId":"rertyy"},"content":"","lastModifiedDate":"2024-03-07"},{"lineNumber":562,"author":{"gitId":"rertyy"},"content":"**MSS**","lastModifiedDate":"2024-03-07"},{"lineNumber":563,"author":{"gitId":"rertyy"},"content":"","lastModifiedDate":"2024-03-07"},{"lineNumber":564,"author":{"gitId":"rertyy"},"content":"1. User requests to edit an order.","lastModifiedDate":"2024-03-07"},{"lineNumber":565,"author":{"gitId":"rertyy"},"content":"2. AddressBook shows the order to be edited.","lastModifiedDate":"2024-03-07"},{"lineNumber":566,"author":{"gitId":"rertyy"},"content":"3. User edits the order.","lastModifiedDate":"2024-03-07"},{"lineNumber":567,"author":{"gitId":"rertyy"},"content":"4. AddressBook shows the edited order.","lastModifiedDate":"2024-03-07"},{"lineNumber":568,"author":{"gitId":"rertyy"},"content":"","lastModifiedDate":"2024-03-07"},{"lineNumber":569,"author":{"gitId":"rertyy"},"content":" Use case ends.","lastModifiedDate":"2024-03-07"},{"lineNumber":570,"author":{"gitId":"rertyy"},"content":"","lastModifiedDate":"2024-03-07"},{"lineNumber":571,"author":{"gitId":"rertyy"},"content":"**Extensions**","lastModifiedDate":"2024-03-07"},{"lineNumber":572,"author":{"gitId":"rertyy"},"content":"","lastModifiedDate":"2024-03-07"},{"lineNumber":573,"author":{"gitId":"rertyy"},"content":"* 2a. The order does not exist.","lastModifiedDate":"2024-03-07"},{"lineNumber":574,"author":{"gitId":"rertyy"},"content":"","lastModifiedDate":"2024-03-07"},{"lineNumber":575,"author":{"gitId":"rertyy"},"content":" * 2a1. AddressBook shows an error message.","lastModifiedDate":"2024-03-07"},{"lineNumber":576,"author":{"gitId":"rertyy"},"content":" * 2a2. AddressBook shows a list of orders with similar names.","lastModifiedDate":"2024-03-07"},{"lineNumber":577,"author":{"gitId":"rertyy"},"content":"","lastModifiedDate":"2024-03-07"},{"lineNumber":578,"author":{"gitId":"rertyy"},"content":" Use case resumes at step 1.","lastModifiedDate":"2024-03-07"},{"lineNumber":579,"author":{"gitId":"rertyy"},"content":"* 3a. The order details are invalid.","lastModifiedDate":"2024-03-07"},{"lineNumber":580,"author":{"gitId":"rertyy"},"content":"","lastModifiedDate":"2024-03-07"},{"lineNumber":581,"author":{"gitId":"rertyy"},"content":" * 3a1. AddressBook shows an error message.","lastModifiedDate":"2024-03-07"},{"lineNumber":582,"author":{"gitId":"rertyy"},"content":"","lastModifiedDate":"2024-03-07"},{"lineNumber":583,"author":{"gitId":"rertyy"},"content":" Use case resumes at step 2.","lastModifiedDate":"2024-03-07"},{"lineNumber":584,"author":{"gitId":"rertyy"},"content":"* 3b. The order details are unchanged.","lastModifiedDate":"2024-03-07"},{"lineNumber":585,"author":{"gitId":"rertyy"},"content":"","lastModifiedDate":"2024-03-07"},{"lineNumber":586,"author":{"gitId":"rertyy"},"content":" * 3b1. AddressBook shows a message indicating no changes are made.","lastModifiedDate":"2024-03-07"},{"lineNumber":587,"author":{"gitId":"rertyy"},"content":"","lastModifiedDate":"2024-03-07"},{"lineNumber":588,"author":{"gitId":"rertyy"},"content":" Use case resumes at step 2.","lastModifiedDate":"2024-03-07"},{"lineNumber":589,"author":{"gitId":"rertyy"},"content":"","lastModifiedDate":"2024-03-07"},{"lineNumber":590,"author":{"gitId":"rertyy"},"content":"**Use case: Delete order**","lastModifiedDate":"2024-03-07"},{"lineNumber":591,"author":{"gitId":"rertyy"},"content":"","lastModifiedDate":"2024-03-07"},{"lineNumber":592,"author":{"gitId":"rertyy"},"content":"**MSS**","lastModifiedDate":"2024-03-07"},{"lineNumber":593,"author":{"gitId":"rertyy"},"content":"","lastModifiedDate":"2024-03-07"},{"lineNumber":594,"author":{"gitId":"rertyy"},"content":"1. User requests to delete an order.","lastModifiedDate":"2024-03-07"},{"lineNumber":595,"author":{"gitId":"rertyy"},"content":"2. AddressBook deletes the order.","lastModifiedDate":"2024-03-07"},{"lineNumber":596,"author":{"gitId":"rertyy"},"content":"","lastModifiedDate":"2024-03-07"},{"lineNumber":597,"author":{"gitId":"rertyy"},"content":" Use case ends.","lastModifiedDate":"2024-03-07"},{"lineNumber":598,"author":{"gitId":"rertyy"},"content":"","lastModifiedDate":"2024-03-07"},{"lineNumber":599,"author":{"gitId":"rertyy"},"content":"**Extensions**","lastModifiedDate":"2024-03-07"},{"lineNumber":600,"author":{"gitId":"rertyy"},"content":"","lastModifiedDate":"2024-03-07"},{"lineNumber":601,"author":{"gitId":"rertyy"},"content":"* 2a. The order does not exist.","lastModifiedDate":"2024-03-07"},{"lineNumber":602,"author":{"gitId":"rertyy"},"content":"","lastModifiedDate":"2024-03-07"},{"lineNumber":603,"author":{"gitId":"rertyy"},"content":" * 2a1. AddressBook shows an error message.","lastModifiedDate":"2024-03-07"},{"lineNumber":604,"author":{"gitId":"rertyy"},"content":"","lastModifiedDate":"2024-03-07"},{"lineNumber":605,"author":{"gitId":"rertyy"},"content":" Use case resumes at step 1.","lastModifiedDate":"2024-03-07"},{"lineNumber":606,"author":{"gitId":"rertyy"},"content":"","lastModifiedDate":"2024-03-07"},{"lineNumber":607,"author":{"gitId":"rertyy"},"content":"**Use case: Prioritize order**","lastModifiedDate":"2024-03-07"},{"lineNumber":608,"author":{"gitId":"rertyy"},"content":"","lastModifiedDate":"2024-03-07"},{"lineNumber":609,"author":{"gitId":"rertyy"},"content":"**MSS**","lastModifiedDate":"2024-03-07"},{"lineNumber":610,"author":{"gitId":"rertyy"},"content":"","lastModifiedDate":"2024-03-07"},{"lineNumber":611,"author":{"gitId":"rertyy"},"content":"1. User requests to prioritize an order.","lastModifiedDate":"2024-03-07"},{"lineNumber":612,"author":{"gitId":"rertyy"},"content":"2. AddressBook shows the prioritized order.","lastModifiedDate":"2024-03-07"},{"lineNumber":613,"author":{"gitId":"rertyy"},"content":"","lastModifiedDate":"2024-03-02"},{"lineNumber":614,"author":{"gitId":"rertyy"},"content":" Use case ends.","lastModifiedDate":"2024-03-02"},{"lineNumber":615,"author":{"gitId":"rertyy"},"content":"","lastModifiedDate":"2024-03-02"},{"lineNumber":616,"author":{"gitId":"rertyy"},"content":"**Extensions**","lastModifiedDate":"2024-03-02"},{"lineNumber":617,"author":{"gitId":"rertyy"},"content":"","lastModifiedDate":"2024-03-02"},{"lineNumber":618,"author":{"gitId":"rertyy"},"content":"* 2a. The order does not exist.","lastModifiedDate":"2024-03-07"},{"lineNumber":619,"author":{"gitId":"rertyy"},"content":"","lastModifiedDate":"2024-03-02"},{"lineNumber":620,"author":{"gitId":"rertyy"},"content":" * 2a1. AddressBook shows an error message.","lastModifiedDate":"2024-03-02"},{"lineNumber":621,"author":{"gitId":"rertyy"},"content":"","lastModifiedDate":"2024-03-02"},{"lineNumber":622,"author":{"gitId":"rertyy"},"content":" Use case resumes at step 1.","lastModifiedDate":"2024-03-02"},{"lineNumber":623,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":624,"author":{"gitId":"-"},"content":"### Non-Functional Requirements","lastModifiedDate":"2020-05-23"},{"lineNumber":625,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":626,"author":{"gitId":"-"},"content":"1. Should work on any _mainstream OS_ as long as it has Java `11` or above installed.","lastModifiedDate":"2020-05-23"},{"lineNumber":627,"author":{"gitId":"-"},"content":"2. Should be able to hold up to 1000 persons without a noticeable sluggishness in performance for typical usage.","lastModifiedDate":"2020-05-23"},{"lineNumber":628,"author":{"gitId":"-"},"content":"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.","lastModifiedDate":"2020-05-23"},{"lineNumber":629,"author":{"gitId":"shavonneg"},"content":"4. Should provide clear and informative error messages to users in case of unexpected errors. Additionally, detailed logs should be maintained for system administrators to troubleshoot issues effectively.","lastModifiedDate":"2024-03-05"},{"lineNumber":630,"author":{"gitId":"shavonneg"},"content":"5. Application architecture should be scalable to accommodate future growth in terms of users and data volume, without compromising performance.","lastModifiedDate":"2024-03-05"},{"lineNumber":631,"author":{"gitId":"shavonneg"},"content":"6. Automated backups of critical data should be performed, and there should be a documented and tested procedure for data recovery in case of system failures or data loss.","lastModifiedDate":"2024-03-05"},{"lineNumber":632,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":633,"author":{"gitId":"-"},"content":"### Glossary","lastModifiedDate":"2020-05-23"},{"lineNumber":634,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":635,"author":{"gitId":"-"},"content":"* **Mainstream OS**: Windows, Linux, Unix, MacOS","lastModifiedDate":"2024-02-09"},{"lineNumber":636,"author":{"gitId":"-"},"content":"* **Private contact detail**: A contact detail that is not meant to be shared with others","lastModifiedDate":"2020-05-23"},{"lineNumber":637,"author":{"gitId":"shavonneg"},"content":"* **Application architecture**: Describes the patterns and techniques used to design and build an application","lastModifiedDate":"2024-03-05"},{"lineNumber":638,"author":{"gitId":"shavonneg"},"content":"* **System administrators**: Professionals responsible for managing, configuring, and ensuring the proper operation of computer systems and servers","lastModifiedDate":"2024-03-05"},{"lineNumber":639,"author":{"gitId":"shavonneg"},"content":"* **Detailed logs**: Records that track events, operations, errors, and other significant activities that occur within a software system or application.","lastModifiedDate":"2024-03-05"},{"lineNumber":640,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":641,"author":{"gitId":"-"},"content":"--------------------------------------------------------------------------------------------------------------------","lastModifiedDate":"2020-05-23"},{"lineNumber":642,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":643,"author":{"gitId":"-"},"content":"## **Appendix: Instructions for manual testing**","lastModifiedDate":"2020-05-23"},{"lineNumber":644,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":645,"author":{"gitId":"-"},"content":"Given below are instructions to test the app manually.","lastModifiedDate":"2020-05-23"},{"lineNumber":646,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":647,"author":{"gitId":"-"},"content":"\u003cdiv markdown\u003d\"span\" class\u003d\"alert alert-info\"\u003e:information_source: **Note:** These instructions only provide a starting point for testers to work on;","lastModifiedDate":"2020-05-23"},{"lineNumber":648,"author":{"gitId":"-"},"content":"testers are expected to do more *exploratory* testing.","lastModifiedDate":"2020-05-23"},{"lineNumber":649,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":650,"author":{"gitId":"-"},"content":"\u003c/div\u003e","lastModifiedDate":"2020-05-23"},{"lineNumber":651,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":652,"author":{"gitId":"-"},"content":"### Launch and shutdown","lastModifiedDate":"2020-05-23"},{"lineNumber":653,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":654,"author":{"gitId":"-"},"content":"1. Initial launch","lastModifiedDate":"2020-05-23"},{"lineNumber":655,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":656,"author":{"gitId":"-"},"content":" 1. Download the jar file and copy into an empty folder","lastModifiedDate":"2020-05-23"},{"lineNumber":657,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":658,"author":{"gitId":"rertyy"},"content":" 1. Double-click the jar file Expected: Shows the GUI with a set of sample contacts. The window size may not be","lastModifiedDate":"2024-03-02"},{"lineNumber":659,"author":{"gitId":"rertyy"},"content":" optimum.","lastModifiedDate":"2024-03-02"},{"lineNumber":660,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":661,"author":{"gitId":"-"},"content":"1. Saving window preferences","lastModifiedDate":"2020-05-23"},{"lineNumber":662,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":663,"author":{"gitId":"-"},"content":" 1. Resize the window to an optimum size. Move the window to a different location. Close the window.","lastModifiedDate":"2020-05-23"},{"lineNumber":664,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":665,"author":{"gitId":"-"},"content":" 1. Re-launch the app by double-clicking the jar file.\u003cbr\u003e","lastModifiedDate":"2020-05-23"},{"lineNumber":666,"author":{"gitId":"-"},"content":" Expected: The most recent window size and location is retained.","lastModifiedDate":"2020-05-23"},{"lineNumber":667,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":668,"author":{"gitId":"-"},"content":"1. _{ more test cases …​ }_","lastModifiedDate":"2020-05-23"},{"lineNumber":669,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":670,"author":{"gitId":"-"},"content":"### Deleting a person","lastModifiedDate":"2020-05-23"},{"lineNumber":671,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":672,"author":{"gitId":"-"},"content":"1. Deleting a person while all persons are being shown","lastModifiedDate":"2020-05-23"},{"lineNumber":673,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":674,"author":{"gitId":"-"},"content":" 1. Prerequisites: List all persons using the `list` command. Multiple persons in the list.","lastModifiedDate":"2020-05-23"},{"lineNumber":675,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":676,"author":{"gitId":"-"},"content":" 1. Test case: `delete 1`\u003cbr\u003e","lastModifiedDate":"2020-05-23"},{"lineNumber":677,"author":{"gitId":"rertyy"},"content":" Expected: First contact is deleted from the list. Details of the deleted contact shown in the status message.","lastModifiedDate":"2024-03-02"},{"lineNumber":678,"author":{"gitId":"rertyy"},"content":" Timestamp in the status bar is updated.","lastModifiedDate":"2024-03-02"},{"lineNumber":679,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":680,"author":{"gitId":"-"},"content":" 1. Test case: `delete 0`\u003cbr\u003e","lastModifiedDate":"2020-05-23"},{"lineNumber":681,"author":{"gitId":"-"},"content":" Expected: No person is deleted. Error details shown in the status message. Status bar remains the same.","lastModifiedDate":"2020-05-23"},{"lineNumber":682,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":683,"author":{"gitId":"-"},"content":" 1. Other incorrect delete commands to try: `delete`, `delete x`, `...` (where x is larger than the list size)\u003cbr\u003e","lastModifiedDate":"2020-05-23"},{"lineNumber":684,"author":{"gitId":"-"},"content":" Expected: Similar to previous.","lastModifiedDate":"2020-05-23"},{"lineNumber":685,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":686,"author":{"gitId":"-"},"content":"1. _{ more test cases …​ }_","lastModifiedDate":"2020-05-23"},{"lineNumber":687,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":688,"author":{"gitId":"-"},"content":"### Saving data","lastModifiedDate":"2020-05-23"},{"lineNumber":689,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":690,"author":{"gitId":"-"},"content":"1. Dealing with missing/corrupted data files","lastModifiedDate":"2020-05-23"},{"lineNumber":691,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":692,"author":{"gitId":"-"},"content":" 1. _{explain how to simulate a missing/corrupted file, and the expected behavior}_","lastModifiedDate":"2020-05-23"},{"lineNumber":693,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":694,"author":{"gitId":"-"},"content":"1. _{ more test cases …​ }_","lastModifiedDate":"2020-05-23"}],"authorContributionMap":{"shavonneg":6,"rertyy":336,"Jaspertzx":27,"-":325}}] +[{"path":"README.md","fileType":"docs","lines":[{"lineNumber":1,"author":{"gitId":"kailinteoo"},"content":"[![CI Status](https://github.com/se-edu/addressbook-level3/workflows/Java%20CI/badge.svg)](https://github.com/AY2324S2-CS2103T-T09-2/tp/actions)","lastModifiedDate":"2024-03-06"},{"lineNumber":2,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":3,"author":{"gitId":"-"},"content":"[![codecov](https://codecov.io/gh/AY2324S2-CS2103T-T09-2/tp/graph/badge.svg?token\u003dBMICX593IT)](https://codecov.io/gh/AY2324S2-CS2103T-T09-2/tp)","lastModifiedDate":"2024-02-17"},{"lineNumber":4,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2024-02-17"},{"lineNumber":5,"author":{"gitId":"-"},"content":"![Ui](docs/images/Ui.png)","lastModifiedDate":"2020-05-23"},{"lineNumber":6,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":7,"author":{"gitId":"kailinteoo"},"content":"# Introduction","lastModifiedDate":"2024-03-06"},{"lineNumber":8,"author":{"gitId":"kailinteoo"},"content":"Welcome to BookKeeper, your solution for efficient customer management for **small business owners in the crochet","lastModifiedDate":"2024-03-06"},{"lineNumber":9,"author":{"gitId":"kailinteoo"},"content":"industry**. \u003cbr\u003e","lastModifiedDate":"2024-03-06"},{"lineNumber":10,"author":{"gitId":"kailinteoo"},"content":"","lastModifiedDate":"2024-03-06"},{"lineNumber":11,"author":{"gitId":"kailinteoo"},"content":"This application is designed to streamline customer lists and enhance productivity for individuals operating","lastModifiedDate":"2024-03-06"},{"lineNumber":12,"author":{"gitId":"kailinteoo"},"content":"small businesses with limited resources and manpower. With BookKeeper, you can easily manage customer information, track","lastModifiedDate":"2024-03-06"},{"lineNumber":13,"author":{"gitId":"kailinteoo"},"content":"orders, and personalize your customer interactions, all through a user-friendly command-line interface.","lastModifiedDate":"2024-03-06"},{"lineNumber":14,"author":{"gitId":"kailinteoo"},"content":"","lastModifiedDate":"2024-03-06"},{"lineNumber":15,"author":{"gitId":"kailinteoo"},"content":"For the detailed documentation of this project, see the [BookKeeper](https://ay2324s2-cs2103t-t09-2.github.io/tp/).","lastModifiedDate":"2024-03-06"},{"lineNumber":16,"author":{"gitId":"kailinteoo"},"content":"","lastModifiedDate":"2024-03-06"},{"lineNumber":17,"author":{"gitId":"kailinteoo"},"content":"# Acknowledgement","lastModifiedDate":"2024-03-06"},{"lineNumber":18,"author":{"gitId":"kailinteoo"},"content":"","lastModifiedDate":"2024-03-06"},{"lineNumber":19,"author":{"gitId":"kailinteoo"},"content":"The project simulates an ongoing software project for a desktop application (called _AddressBook_) used for managing","lastModifiedDate":"2024-03-06"},{"lineNumber":20,"author":{"gitId":"-"},"content":" contact details.","lastModifiedDate":"2024-02-17"},{"lineNumber":21,"author":{"gitId":"kailinteoo"},"content":"* It is written in OOP fashion. ","lastModifiedDate":"2024-03-06"},{"lineNumber":22,"author":{"gitId":"kailinteoo"},"content":"* It provides a reasonably well-written code base bigger (around 6 KLoC)","lastModifiedDate":"2024-03-06"},{"lineNumber":23,"author":{"gitId":"kailinteoo"},"content":"* It comes with a reasonable level of user and developer documentation.","lastModifiedDate":"2024-03-06"},{"lineNumber":24,"author":{"gitId":"kailinteoo"},"content":"","lastModifiedDate":"2024-03-06"},{"lineNumber":25,"author":{"gitId":"kailinteoo"},"content":"This project is based on the AddressBook Level-3 project and is a part of the [se-education.org](https://se-education.org/addressbook-level3) initiative.","lastModifiedDate":"2024-03-06"},{"lineNumber":26,"author":{"gitId":"kailinteoo"},"content":"","lastModifiedDate":"2024-03-06"},{"lineNumber":27,"author":{"gitId":"kailinteoo"},"content":"# Features","lastModifiedDate":"2024-03-06"},{"lineNumber":28,"author":{"gitId":"kailinteoo"},"content":"","lastModifiedDate":"2024-03-06"},{"lineNumber":29,"author":{"gitId":"kailinteoo"},"content":"## Customer Feature","lastModifiedDate":"2024-03-06"},{"lineNumber":30,"author":{"gitId":"kailinteoo"},"content":"","lastModifiedDate":"2024-03-06"},{"lineNumber":31,"author":{"gitId":"kailinteoo"},"content":"### 1. Add Customer","lastModifiedDate":"2024-03-06"},{"lineNumber":32,"author":{"gitId":"kailinteoo"},"content":"Adds a customer to the customer\u0027s storage.","lastModifiedDate":"2024-03-06"},{"lineNumber":33,"author":{"gitId":"kailinteoo"},"content":"","lastModifiedDate":"2024-03-06"},{"lineNumber":34,"author":{"gitId":"kailinteoo"},"content":"Example: `add \u003ccustomer name\u003e`","lastModifiedDate":"2024-03-06"},{"lineNumber":35,"author":{"gitId":"kailinteoo"},"content":"","lastModifiedDate":"2024-03-06"},{"lineNumber":36,"author":{"gitId":"kailinteoo"},"content":"Expected output:","lastModifiedDate":"2024-03-06"},{"lineNumber":37,"author":{"gitId":"kailinteoo"},"content":"```","lastModifiedDate":"2024-03-06"},{"lineNumber":38,"author":{"gitId":"kailinteoo"},"content":"Successfully added \u003ccustomer name\u003e to your list!","lastModifiedDate":"2024-03-06"},{"lineNumber":39,"author":{"gitId":"kailinteoo"},"content":"```","lastModifiedDate":"2024-03-06"},{"lineNumber":40,"author":{"gitId":"kailinteoo"},"content":"","lastModifiedDate":"2024-03-06"},{"lineNumber":41,"author":{"gitId":"kailinteoo"},"content":"### 2. Delete Customer","lastModifiedDate":"2024-03-06"},{"lineNumber":42,"author":{"gitId":"kailinteoo"},"content":"Delete selected customer from the customer\u0027s storage.","lastModifiedDate":"2024-03-06"},{"lineNumber":43,"author":{"gitId":"kailinteoo"},"content":"","lastModifiedDate":"2024-03-06"},{"lineNumber":44,"author":{"gitId":"kailinteoo"},"content":"Example: `delete \u003ccustomer name\u003e`","lastModifiedDate":"2024-03-06"},{"lineNumber":45,"author":{"gitId":"kailinteoo"},"content":"","lastModifiedDate":"2024-03-06"},{"lineNumber":46,"author":{"gitId":"kailinteoo"},"content":"Expected output:","lastModifiedDate":"2024-03-06"},{"lineNumber":47,"author":{"gitId":"kailinteoo"},"content":"```","lastModifiedDate":"2024-03-06"},{"lineNumber":48,"author":{"gitId":"kailinteoo"},"content":"Successfully removed \u003ccustomer name\u003e from the list","lastModifiedDate":"2024-03-06"},{"lineNumber":49,"author":{"gitId":"kailinteoo"},"content":"```","lastModifiedDate":"2024-03-06"},{"lineNumber":50,"author":{"gitId":"kailinteoo"},"content":"","lastModifiedDate":"2024-03-06"},{"lineNumber":51,"author":{"gitId":"kailinteoo"},"content":"### 3. Edit Customer","lastModifiedDate":"2024-03-06"},{"lineNumber":52,"author":{"gitId":"kailinteoo"},"content":"Edit selected customer information by adding more information such as Age, Phone Number, Past purchased record, ","lastModifiedDate":"2024-03-06"},{"lineNumber":53,"author":{"gitId":"kailinteoo"},"content":"Birthday, Address.","lastModifiedDate":"2024-03-06"},{"lineNumber":54,"author":{"gitId":"kailinteoo"},"content":"","lastModifiedDate":"2024-03-06"},{"lineNumber":55,"author":{"gitId":"kailinteoo"},"content":"Example: `edit \u003ccustomer name\u003e`","lastModifiedDate":"2024-03-06"},{"lineNumber":56,"author":{"gitId":"kailinteoo"},"content":"","lastModifiedDate":"2024-03-06"},{"lineNumber":57,"author":{"gitId":"kailinteoo"},"content":"Expected output:","lastModifiedDate":"2024-03-06"},{"lineNumber":58,"author":{"gitId":"kailinteoo"},"content":"```","lastModifiedDate":"2024-03-06"},{"lineNumber":59,"author":{"gitId":"kailinteoo"},"content":"Successfully edit \u003ccustomer name\u003e information","lastModifiedDate":"2024-03-06"},{"lineNumber":60,"author":{"gitId":"kailinteoo"},"content":"```","lastModifiedDate":"2024-03-06"},{"lineNumber":61,"author":{"gitId":"kailinteoo"},"content":"","lastModifiedDate":"2024-03-06"},{"lineNumber":62,"author":{"gitId":"kailinteoo"},"content":"### 4. VIP Customer","lastModifiedDate":"2024-03-06"},{"lineNumber":63,"author":{"gitId":"kailinteoo"},"content":"Indicating that this specific customer is important.","lastModifiedDate":"2024-03-06"},{"lineNumber":64,"author":{"gitId":"kailinteoo"},"content":"","lastModifiedDate":"2024-03-06"},{"lineNumber":65,"author":{"gitId":"kailinteoo"},"content":"Example: `vip \u003ccustomer name\u003e`","lastModifiedDate":"2024-03-06"},{"lineNumber":66,"author":{"gitId":"kailinteoo"},"content":"","lastModifiedDate":"2024-03-06"},{"lineNumber":67,"author":{"gitId":"kailinteoo"},"content":"Expected output:","lastModifiedDate":"2024-03-06"},{"lineNumber":68,"author":{"gitId":"kailinteoo"},"content":"```","lastModifiedDate":"2024-03-06"},{"lineNumber":69,"author":{"gitId":"kailinteoo"},"content":"Successfully set \u003ccustomer name\u003e as VIP","lastModifiedDate":"2024-03-06"},{"lineNumber":70,"author":{"gitId":"kailinteoo"},"content":"```","lastModifiedDate":"2024-03-06"},{"lineNumber":71,"author":{"gitId":"kailinteoo"},"content":"","lastModifiedDate":"2024-03-06"},{"lineNumber":72,"author":{"gitId":"kailinteoo"},"content":"## Order Feature","lastModifiedDate":"2024-03-06"},{"lineNumber":73,"author":{"gitId":"kailinteoo"},"content":"","lastModifiedDate":"2024-03-06"},{"lineNumber":74,"author":{"gitId":"kailinteoo"},"content":"### 1. Add Order","lastModifiedDate":"2024-03-06"},{"lineNumber":75,"author":{"gitId":"kailinteoo"},"content":"Adds a order into the order\u0027s storage, together with the customer name.","lastModifiedDate":"2024-03-06"},{"lineNumber":76,"author":{"gitId":"kailinteoo"},"content":"","lastModifiedDate":"2024-03-06"},{"lineNumber":77,"author":{"gitId":"kailinteoo"},"content":"Example: `add \u003ccustomer name, order, due date\u003e`","lastModifiedDate":"2024-03-06"},{"lineNumber":78,"author":{"gitId":"kailinteoo"},"content":"","lastModifiedDate":"2024-03-06"},{"lineNumber":79,"author":{"gitId":"kailinteoo"},"content":"Expected output:","lastModifiedDate":"2024-03-06"},{"lineNumber":80,"author":{"gitId":"kailinteoo"},"content":"```","lastModifiedDate":"2024-03-06"},{"lineNumber":81,"author":{"gitId":"kailinteoo"},"content":"An order has been added for \u003ccustomer name\u003e","lastModifiedDate":"2024-03-06"},{"lineNumber":82,"author":{"gitId":"kailinteoo"},"content":"```","lastModifiedDate":"2024-03-06"},{"lineNumber":83,"author":{"gitId":"kailinteoo"},"content":"","lastModifiedDate":"2024-03-06"},{"lineNumber":84,"author":{"gitId":"kailinteoo"},"content":"### 2. Delete Order","lastModifiedDate":"2024-03-06"},{"lineNumber":85,"author":{"gitId":"kailinteoo"},"content":"Delete order of the specific customer.","lastModifiedDate":"2024-03-06"},{"lineNumber":86,"author":{"gitId":"kailinteoo"},"content":"","lastModifiedDate":"2024-03-06"},{"lineNumber":87,"author":{"gitId":"kailinteoo"},"content":"Example: `delete \u003ccustomer name, order\u003e`","lastModifiedDate":"2024-03-06"},{"lineNumber":88,"author":{"gitId":"kailinteoo"},"content":"","lastModifiedDate":"2024-03-06"},{"lineNumber":89,"author":{"gitId":"kailinteoo"},"content":"Expected output:","lastModifiedDate":"2024-03-06"},{"lineNumber":90,"author":{"gitId":"kailinteoo"},"content":"```","lastModifiedDate":"2024-03-06"},{"lineNumber":91,"author":{"gitId":"kailinteoo"},"content":"\u003ccustomer name\u003e order of \u003c(order item)\u003e has been cancelled","lastModifiedDate":"2024-03-06"},{"lineNumber":92,"author":{"gitId":"kailinteoo"},"content":"```","lastModifiedDate":"2024-03-06"},{"lineNumber":93,"author":{"gitId":"kailinteoo"},"content":"","lastModifiedDate":"2024-03-06"},{"lineNumber":94,"author":{"gitId":"kailinteoo"},"content":"### 3. Edit Order","lastModifiedDate":"2024-03-06"},{"lineNumber":95,"author":{"gitId":"kailinteoo"},"content":"Edit the customer\u0027s order.","lastModifiedDate":"2024-03-06"},{"lineNumber":96,"author":{"gitId":"kailinteoo"},"content":"","lastModifiedDate":"2024-03-06"},{"lineNumber":97,"author":{"gitId":"kailinteoo"},"content":"Example: `edit \u003ccustomer name, old order, new order\u003e`","lastModifiedDate":"2024-03-06"},{"lineNumber":98,"author":{"gitId":"kailinteoo"},"content":"","lastModifiedDate":"2024-03-06"},{"lineNumber":99,"author":{"gitId":"kailinteoo"},"content":"Expected output:","lastModifiedDate":"2024-03-06"},{"lineNumber":100,"author":{"gitId":"kailinteoo"},"content":"```","lastModifiedDate":"2024-03-06"},{"lineNumber":101,"author":{"gitId":"kailinteoo"},"content":"Successfully edit \u003ccustomer name\u003e order","lastModifiedDate":"2024-03-06"},{"lineNumber":102,"author":{"gitId":"kailinteoo"},"content":"```","lastModifiedDate":"2024-03-06"},{"lineNumber":103,"author":{"gitId":"kailinteoo"},"content":"","lastModifiedDate":"2024-03-06"},{"lineNumber":104,"author":{"gitId":"kailinteoo"},"content":"### 4. Prioritize Order","lastModifiedDate":"2024-03-06"},{"lineNumber":105,"author":{"gitId":"kailinteoo"},"content":"Prioritize the customer\u0027 order.","lastModifiedDate":"2024-03-06"},{"lineNumber":106,"author":{"gitId":"kailinteoo"},"content":"","lastModifiedDate":"2024-03-06"},{"lineNumber":107,"author":{"gitId":"kailinteoo"},"content":"Example: `prioritize \u003ccustomer name, order\u003e`","lastModifiedDate":"2024-03-06"},{"lineNumber":108,"author":{"gitId":"kailinteoo"},"content":"","lastModifiedDate":"2024-03-06"},{"lineNumber":109,"author":{"gitId":"kailinteoo"},"content":"Expected output:","lastModifiedDate":"2024-03-06"},{"lineNumber":110,"author":{"gitId":"kailinteoo"},"content":"```","lastModifiedDate":"2024-03-06"},{"lineNumber":111,"author":{"gitId":"kailinteoo"},"content":"Successfully prioritized \u003ccustomer name, order\u003e","lastModifiedDate":"2024-03-06"},{"lineNumber":112,"author":{"gitId":"kailinteoo"},"content":"```","lastModifiedDate":"2024-03-06"},{"lineNumber":113,"author":{"gitId":"kailinteoo"},"content":"","lastModifiedDate":"2024-03-06"},{"lineNumber":114,"author":{"gitId":"kailinteoo"},"content":"## Viewing Feature","lastModifiedDate":"2024-03-06"},{"lineNumber":115,"author":{"gitId":"kailinteoo"},"content":"","lastModifiedDate":"2024-03-06"},{"lineNumber":116,"author":{"gitId":"kailinteoo"},"content":"### 1. View Customer Detail","lastModifiedDate":"2024-03-06"},{"lineNumber":117,"author":{"gitId":"kailinteoo"},"content":"View customer information, such as Name, Age, Phone Number, Past purchase record, Birthday, Address.","lastModifiedDate":"2024-03-06"},{"lineNumber":118,"author":{"gitId":"kailinteoo"},"content":"","lastModifiedDate":"2024-03-06"},{"lineNumber":119,"author":{"gitId":"kailinteoo"},"content":"Example: `view \u003ccustomer name\u003e`","lastModifiedDate":"2024-03-06"},{"lineNumber":120,"author":{"gitId":"kailinteoo"},"content":"","lastModifiedDate":"2024-03-06"},{"lineNumber":121,"author":{"gitId":"kailinteoo"},"content":"Expected output:","lastModifiedDate":"2024-03-06"},{"lineNumber":122,"author":{"gitId":"kailinteoo"},"content":"```","lastModifiedDate":"2024-03-06"},{"lineNumber":123,"author":{"gitId":"kailinteoo"},"content":"Jasper Tan info: [...]","lastModifiedDate":"2024-03-06"},{"lineNumber":124,"author":{"gitId":"kailinteoo"},"content":"Tan Qing Yong info : [...]","lastModifiedDate":"2024-03-06"},{"lineNumber":125,"author":{"gitId":"kailinteoo"},"content":"```","lastModifiedDate":"2024-03-06"},{"lineNumber":126,"author":{"gitId":"kailinteoo"},"content":"","lastModifiedDate":"2024-03-06"},{"lineNumber":127,"author":{"gitId":"kailinteoo"},"content":"### 2. View Order Detail","lastModifiedDate":"2024-03-06"},{"lineNumber":128,"author":{"gitId":"kailinteoo"},"content":"View Order information, such as order by when, who order, quantity.","lastModifiedDate":"2024-03-06"},{"lineNumber":129,"author":{"gitId":"kailinteoo"},"content":"","lastModifiedDate":"2024-03-06"},{"lineNumber":130,"author":{"gitId":"kailinteoo"},"content":"Example: `view \u003corder\u003e`","lastModifiedDate":"2024-03-06"},{"lineNumber":131,"author":{"gitId":"kailinteoo"},"content":"","lastModifiedDate":"2024-03-06"},{"lineNumber":132,"author":{"gitId":"kailinteoo"},"content":"Expected output:","lastModifiedDate":"2024-03-06"},{"lineNumber":133,"author":{"gitId":"kailinteoo"},"content":"```","lastModifiedDate":"2024-03-06"},{"lineNumber":134,"author":{"gitId":"kailinteoo"},"content":"Frog Crochet: ","lastModifiedDate":"2024-03-06"},{"lineNumber":135,"author":{"gitId":"kailinteoo"},"content":"1. total of \u003cquantity\u003e order by \u003ccustomer name\u003e on \u003cdate\u003e ","lastModifiedDate":"2024-03-06"},{"lineNumber":136,"author":{"gitId":"kailinteoo"},"content":"2. total of \u003cquantity\u003e order by \u003ccustomer name\u003e on \u003cdate\u003e ","lastModifiedDate":"2024-03-06"},{"lineNumber":137,"author":{"gitId":"kailinteoo"},"content":"[...]","lastModifiedDate":"2024-03-06"},{"lineNumber":138,"author":{"gitId":"kailinteoo"},"content":"```","lastModifiedDate":"2024-03-06"},{"lineNumber":139,"author":{"gitId":"kailinteoo"},"content":"","lastModifiedDate":"2024-03-06"},{"lineNumber":140,"author":{"gitId":"kailinteoo"},"content":"### 3. View Statistics","lastModifiedDate":"2024-03-06"},{"lineNumber":141,"author":{"gitId":"kailinteoo"},"content":"Show how many orders has been completed.","lastModifiedDate":"2024-03-06"},{"lineNumber":142,"author":{"gitId":"kailinteoo"},"content":"","lastModifiedDate":"2024-03-06"},{"lineNumber":143,"author":{"gitId":"kailinteoo"},"content":"Example: `stat`","lastModifiedDate":"2024-03-06"},{"lineNumber":144,"author":{"gitId":"kailinteoo"},"content":"","lastModifiedDate":"2024-03-06"},{"lineNumber":145,"author":{"gitId":"kailinteoo"},"content":"Expected output:","lastModifiedDate":"2024-03-06"},{"lineNumber":146,"author":{"gitId":"kailinteoo"},"content":"```","lastModifiedDate":"2024-03-06"},{"lineNumber":147,"author":{"gitId":"kailinteoo"},"content":"\u003ca list of stat\u003e","lastModifiedDate":"2024-03-06"},{"lineNumber":148,"author":{"gitId":"kailinteoo"},"content":"```","lastModifiedDate":"2024-03-06"},{"lineNumber":149,"author":{"gitId":"kailinteoo"},"content":"","lastModifiedDate":"2024-03-06"},{"lineNumber":150,"author":{"gitId":"kailinteoo"},"content":"### 4. View Ranking","lastModifiedDate":"2024-03-06"},{"lineNumber":151,"author":{"gitId":"kailinteoo"},"content":"View which crochet sell the best and total sell quantity.","lastModifiedDate":"2024-03-06"},{"lineNumber":152,"author":{"gitId":"kailinteoo"},"content":"","lastModifiedDate":"2024-03-06"},{"lineNumber":153,"author":{"gitId":"kailinteoo"},"content":"Example: `view ranking`","lastModifiedDate":"2024-03-06"},{"lineNumber":154,"author":{"gitId":"kailinteoo"},"content":"","lastModifiedDate":"2024-03-06"},{"lineNumber":155,"author":{"gitId":"kailinteoo"},"content":"Expected output:","lastModifiedDate":"2024-03-06"},{"lineNumber":156,"author":{"gitId":"kailinteoo"},"content":"```","lastModifiedDate":"2024-03-06"},{"lineNumber":157,"author":{"gitId":"kailinteoo"},"content":"Top 1: Frog Crochet, total sold of \u003cquantity\u003e ","lastModifiedDate":"2024-03-06"},{"lineNumber":158,"author":{"gitId":"kailinteoo"},"content":"[...]","lastModifiedDate":"2024-03-06"},{"lineNumber":159,"author":{"gitId":"kailinteoo"},"content":"```","lastModifiedDate":"2024-03-06"},{"lineNumber":160,"author":{"gitId":"kailinteoo"},"content":"","lastModifiedDate":"2024-03-06"},{"lineNumber":161,"author":{"gitId":"kailinteoo"},"content":"## Sorting Feature","lastModifiedDate":"2024-03-06"},{"lineNumber":162,"author":{"gitId":"kailinteoo"},"content":"","lastModifiedDate":"2024-03-06"},{"lineNumber":163,"author":{"gitId":"kailinteoo"},"content":"### 1. Sort Order by Date","lastModifiedDate":"2024-03-06"},{"lineNumber":164,"author":{"gitId":"kailinteoo"},"content":"Sort when the order is due based on the date (excluding prioritize order).","lastModifiedDate":"2024-03-06"},{"lineNumber":165,"author":{"gitId":"kailinteoo"},"content":"","lastModifiedDate":"2024-03-06"},{"lineNumber":166,"author":{"gitId":"kailinteoo"},"content":"Example: `sort orderdate`","lastModifiedDate":"2024-03-06"},{"lineNumber":167,"author":{"gitId":"kailinteoo"},"content":"","lastModifiedDate":"2024-03-06"},{"lineNumber":168,"author":{"gitId":"kailinteoo"},"content":"Expected output:","lastModifiedDate":"2024-03-06"},{"lineNumber":169,"author":{"gitId":"kailinteoo"},"content":"```","lastModifiedDate":"2024-03-06"},{"lineNumber":170,"author":{"gitId":"kailinteoo"},"content":"1. Jasper Tan, frog crochet, 24 Feb 2024 ","lastModifiedDate":"2024-03-06"},{"lineNumber":171,"author":{"gitId":"kailinteoo"},"content":"2. Tan Qin Yong, pig crochet, 1 Apr 2024 ","lastModifiedDate":"2024-03-06"},{"lineNumber":172,"author":{"gitId":"kailinteoo"},"content":"[...]","lastModifiedDate":"2024-03-06"},{"lineNumber":173,"author":{"gitId":"kailinteoo"},"content":"```","lastModifiedDate":"2024-03-06"},{"lineNumber":174,"author":{"gitId":"kailinteoo"},"content":"","lastModifiedDate":"2024-03-06"},{"lineNumber":175,"author":{"gitId":"kailinteoo"},"content":"### 2. Sort Order by order type","lastModifiedDate":"2024-03-06"},{"lineNumber":176,"author":{"gitId":"kailinteoo"},"content":"Sort depending on what kind of order.","lastModifiedDate":"2024-03-06"},{"lineNumber":177,"author":{"gitId":"kailinteoo"},"content":"","lastModifiedDate":"2024-03-06"},{"lineNumber":178,"author":{"gitId":"kailinteoo"},"content":"Example: `sort ordertype`","lastModifiedDate":"2024-03-06"},{"lineNumber":179,"author":{"gitId":"kailinteoo"},"content":"","lastModifiedDate":"2024-03-06"},{"lineNumber":180,"author":{"gitId":"kailinteoo"},"content":"Expected output:","lastModifiedDate":"2024-03-06"},{"lineNumber":181,"author":{"gitId":"kailinteoo"},"content":"```","lastModifiedDate":"2024-03-06"},{"lineNumber":182,"author":{"gitId":"kailinteoo"},"content":"Frog Crochet:","lastModifiedDate":"2024-03-06"},{"lineNumber":183,"author":{"gitId":"kailinteoo"},"content":"1. Jasper Tan, 24 Feb 2024 ","lastModifiedDate":"2024-03-06"},{"lineNumber":184,"author":{"gitId":"kailinteoo"},"content":"2. QinYong, 1 Apr 2024 ","lastModifiedDate":"2024-03-06"},{"lineNumber":185,"author":{"gitId":"kailinteoo"},"content":"[...]","lastModifiedDate":"2024-03-06"},{"lineNumber":186,"author":{"gitId":"kailinteoo"},"content":"```","lastModifiedDate":"2024-03-06"},{"lineNumber":187,"author":{"gitId":"kailinteoo"},"content":"","lastModifiedDate":"2024-03-06"},{"lineNumber":188,"author":{"gitId":"kailinteoo"},"content":"### 3. Sort Customer name by alphabetical order","lastModifiedDate":"2024-03-06"},{"lineNumber":189,"author":{"gitId":"kailinteoo"},"content":"sort the customer list.","lastModifiedDate":"2024-03-06"},{"lineNumber":190,"author":{"gitId":"kailinteoo"},"content":"","lastModifiedDate":"2024-03-06"},{"lineNumber":191,"author":{"gitId":"kailinteoo"},"content":"Example: `sort customer`","lastModifiedDate":"2024-03-06"},{"lineNumber":192,"author":{"gitId":"kailinteoo"},"content":"","lastModifiedDate":"2024-03-06"},{"lineNumber":193,"author":{"gitId":"kailinteoo"},"content":"Expected output:","lastModifiedDate":"2024-03-06"},{"lineNumber":194,"author":{"gitId":"kailinteoo"},"content":"```","lastModifiedDate":"2024-03-06"},{"lineNumber":195,"author":{"gitId":"kailinteoo"},"content":"1. Jasper Tan","lastModifiedDate":"2024-03-06"},{"lineNumber":196,"author":{"gitId":"kailinteoo"},"content":"2. Tan Qing Yong ","lastModifiedDate":"2024-03-06"},{"lineNumber":197,"author":{"gitId":"kailinteoo"},"content":"[...]","lastModifiedDate":"2024-03-06"},{"lineNumber":198,"author":{"gitId":"kailinteoo"},"content":"```","lastModifiedDate":"2024-03-06"},{"lineNumber":199,"author":{"gitId":"kailinteoo"},"content":"","lastModifiedDate":"2024-03-06"},{"lineNumber":200,"author":{"gitId":"kailinteoo"},"content":"## Notification/ Reminder/ Deadline/ Progress Tracker","lastModifiedDate":"2024-03-06"},{"lineNumber":201,"author":{"gitId":"kailinteoo"},"content":"","lastModifiedDate":"2024-03-06"},{"lineNumber":202,"author":{"gitId":"kailinteoo"},"content":"### 1. Deadline approaching soon for an order (within a week)","lastModifiedDate":"2024-03-06"},{"lineNumber":203,"author":{"gitId":"kailinteoo"},"content":"Send notification when order is due within a week.","lastModifiedDate":"2024-03-06"},{"lineNumber":204,"author":{"gitId":"kailinteoo"},"content":"","lastModifiedDate":"2024-03-06"},{"lineNumber":205,"author":{"gitId":"kailinteoo"},"content":"### 2. Progress Bar","lastModifiedDate":"2024-03-06"},{"lineNumber":206,"author":{"gitId":"kailinteoo"},"content":"Show how many order left to be done.","lastModifiedDate":"2024-03-06"},{"lineNumber":207,"author":{"gitId":"kailinteoo"},"content":"","lastModifiedDate":"2024-03-06"},{"lineNumber":208,"author":{"gitId":"kailinteoo"},"content":"Example: `progress`","lastModifiedDate":"2024-03-06"},{"lineNumber":209,"author":{"gitId":"kailinteoo"},"content":"","lastModifiedDate":"2024-03-06"},{"lineNumber":210,"author":{"gitId":"kailinteoo"},"content":"Expected output:","lastModifiedDate":"2024-03-06"},{"lineNumber":211,"author":{"gitId":"kailinteoo"},"content":"```","lastModifiedDate":"2024-03-06"},{"lineNumber":212,"author":{"gitId":"kailinteoo"},"content":"Left \u003cquantity\u003e ","lastModifiedDate":"2024-03-06"},{"lineNumber":213,"author":{"gitId":"kailinteoo"},"content":"Done \u003cquantity\u003e ","lastModifiedDate":"2024-03-06"},{"lineNumber":214,"author":{"gitId":"kailinteoo"},"content":"Pending \u003cQuantity\u003e\"","lastModifiedDate":"2024-03-06"},{"lineNumber":215,"author":{"gitId":"kailinteoo"},"content":"```","lastModifiedDate":"2024-03-06"},{"lineNumber":216,"author":{"gitId":"kailinteoo"},"content":"","lastModifiedDate":"2024-03-06"},{"lineNumber":217,"author":{"gitId":"kailinteoo"},"content":"## Usage Help","lastModifiedDate":"2024-03-06"},{"lineNumber":218,"author":{"gitId":"kailinteoo"},"content":"","lastModifiedDate":"2024-03-06"},{"lineNumber":219,"author":{"gitId":"kailinteoo"},"content":"### 1. Autocomplete","lastModifiedDate":"2024-03-06"},{"lineNumber":220,"author":{"gitId":"kailinteoo"},"content":"Show all possible next commands based on currently keyed in values.","lastModifiedDate":"2024-03-06"},{"lineNumber":221,"author":{"gitId":"kailinteoo"},"content":"","lastModifiedDate":"2024-03-06"},{"lineNumber":222,"author":{"gitId":"kailinteoo"},"content":"Expected output:","lastModifiedDate":"2024-03-06"},{"lineNumber":223,"author":{"gitId":"kailinteoo"},"content":"```","lastModifiedDate":"2024-03-06"},{"lineNumber":224,"author":{"gitId":"kailinteoo"},"content":"/modi(fy)","lastModifiedDate":"2024-03-06"},{"lineNumber":225,"author":{"gitId":"kailinteoo"},"content":"```","lastModifiedDate":"2024-03-06"},{"lineNumber":226,"author":{"gitId":"kailinteoo"},"content":"","lastModifiedDate":"2024-03-06"},{"lineNumber":227,"author":{"gitId":"kailinteoo"},"content":"### 2. User manual","lastModifiedDate":"2024-03-06"},{"lineNumber":228,"author":{"gitId":"kailinteoo"},"content":"Shows a list of commands that can be used.","lastModifiedDate":"2024-03-06"},{"lineNumber":229,"author":{"gitId":"kailinteoo"},"content":"","lastModifiedDate":"2024-03-06"},{"lineNumber":230,"author":{"gitId":"kailinteoo"},"content":"Example: `help`","lastModifiedDate":"2024-03-06"},{"lineNumber":231,"author":{"gitId":"kailinteoo"},"content":"","lastModifiedDate":"2024-03-06"},{"lineNumber":232,"author":{"gitId":"kailinteoo"},"content":"Expected output:","lastModifiedDate":"2024-03-06"},{"lineNumber":233,"author":{"gitId":"kailinteoo"},"content":"```","lastModifiedDate":"2024-03-06"},{"lineNumber":234,"author":{"gitId":"kailinteoo"},"content":"Commands list: ","lastModifiedDate":"2024-03-06"},{"lineNumber":235,"author":{"gitId":"kailinteoo"},"content":"1. add. Adds a new customer to the list. Example: \"add...\" ","lastModifiedDate":"2024-03-06"},{"lineNumber":236,"author":{"gitId":"kailinteoo"},"content":"[...]","lastModifiedDate":"2024-03-06"},{"lineNumber":237,"author":{"gitId":"kailinteoo"},"content":"```","lastModifiedDate":"2024-03-06"},{"lineNumber":238,"author":{"gitId":"kailinteoo"},"content":"","lastModifiedDate":"2024-03-06"}],"authorContributionMap":{"kailinteoo":232,"-":6}},{"path":"config/pre-commit-setup/add_hook.bat","fileType":"other","lines":[{"lineNumber":1,"author":{"gitId":"rertyy"},"content":"@echo off","lastModifiedDate":"2024-03-07"},{"lineNumber":2,"author":{"gitId":"rertyy"},"content":"SETLOCAL EnableDelayedExpansion","lastModifiedDate":"2024-03-07"},{"lineNumber":3,"author":{"gitId":"rertyy"},"content":"","lastModifiedDate":"2024-03-07"},{"lineNumber":4,"author":{"gitId":"rertyy"},"content":"REM Define relative path to .git/hooks","lastModifiedDate":"2024-03-07"},{"lineNumber":5,"author":{"gitId":"rertyy"},"content":"SET \"hooksDir\u003d../../.git/hooks\"","lastModifiedDate":"2024-03-07"},{"lineNumber":6,"author":{"gitId":"rertyy"},"content":"","lastModifiedDate":"2024-03-07"},{"lineNumber":7,"author":{"gitId":"rertyy"},"content":"REM Check if .git/hooks directory exists, if not create it","lastModifiedDate":"2024-03-07"},{"lineNumber":8,"author":{"gitId":"rertyy"},"content":"IF NOT EXIST \"!hooksDir!\" (","lastModifiedDate":"2024-03-07"},{"lineNumber":9,"author":{"gitId":"rertyy"},"content":" mkdir \"!hooksDir!\"","lastModifiedDate":"2024-03-07"},{"lineNumber":10,"author":{"gitId":"rertyy"},"content":" echo Created directory: !hooksDir!","lastModifiedDate":"2024-03-07"},{"lineNumber":11,"author":{"gitId":"rertyy"},"content":")","lastModifiedDate":"2024-03-07"},{"lineNumber":12,"author":{"gitId":"rertyy"},"content":"","lastModifiedDate":"2024-03-07"},{"lineNumber":13,"author":{"gitId":"rertyy"},"content":"REM Check if pre-commit hook already exists","lastModifiedDate":"2024-03-07"},{"lineNumber":14,"author":{"gitId":"rertyy"},"content":"IF EXIST \"!hooksDir!/pre-commit\" (","lastModifiedDate":"2024-03-07"},{"lineNumber":15,"author":{"gitId":"rertyy"},"content":" REM Backup existing pre-commit hook","lastModifiedDate":"2024-03-07"},{"lineNumber":16,"author":{"gitId":"rertyy"},"content":" copy /Y \"!hooksDir!/pre-commit\" \"!hooksDir!/pre-commit.bak\"","lastModifiedDate":"2024-03-07"},{"lineNumber":17,"author":{"gitId":"rertyy"},"content":" echo Existing pre-commit hook backed up to: !hooksDir!/pre-commit.bak","lastModifiedDate":"2024-03-07"},{"lineNumber":18,"author":{"gitId":"rertyy"},"content":")","lastModifiedDate":"2024-03-07"},{"lineNumber":19,"author":{"gitId":"rertyy"},"content":"","lastModifiedDate":"2024-03-07"},{"lineNumber":20,"author":{"gitId":"rertyy"},"content":"REM Copy the new pre-commit hook","lastModifiedDate":"2024-03-07"},{"lineNumber":21,"author":{"gitId":"rertyy"},"content":"copy /Y \"pre-commit\" \"!hooksDir!/pre-commit\"","lastModifiedDate":"2024-03-07"},{"lineNumber":22,"author":{"gitId":"rertyy"},"content":"","lastModifiedDate":"2024-03-07"},{"lineNumber":23,"author":{"gitId":"rertyy"},"content":"echo New pre-commit hook setup complete.","lastModifiedDate":"2024-03-07"}],"authorContributionMap":{"rertyy":23}},{"path":"config/pre-commit-setup/add_hook.sh","fileType":"other","lines":[{"lineNumber":1,"author":{"gitId":"rertyy"},"content":"#!/bin/bash","lastModifiedDate":"2024-03-07"},{"lineNumber":2,"author":{"gitId":"rertyy"},"content":"","lastModifiedDate":"2024-03-07"},{"lineNumber":3,"author":{"gitId":"rertyy"},"content":"# Define relative path to .git/hooks","lastModifiedDate":"2024-03-07"},{"lineNumber":4,"author":{"gitId":"rertyy"},"content":"hooksDir\u003d\"../../.git/hooks\"","lastModifiedDate":"2024-03-07"},{"lineNumber":5,"author":{"gitId":"rertyy"},"content":"","lastModifiedDate":"2024-03-07"},{"lineNumber":6,"author":{"gitId":"rertyy"},"content":"# Check if .git/hooks directory exists, if not create it","lastModifiedDate":"2024-03-07"},{"lineNumber":7,"author":{"gitId":"rertyy"},"content":"if [ ! -d \"$hooksDir\" ]; then","lastModifiedDate":"2024-03-07"},{"lineNumber":8,"author":{"gitId":"rertyy"},"content":" mkdir -p \"$hooksDir\"","lastModifiedDate":"2024-03-07"},{"lineNumber":9,"author":{"gitId":"rertyy"},"content":" echo \"Created directory: $hooksDir\"","lastModifiedDate":"2024-03-07"},{"lineNumber":10,"author":{"gitId":"rertyy"},"content":"fi","lastModifiedDate":"2024-03-07"},{"lineNumber":11,"author":{"gitId":"rertyy"},"content":"","lastModifiedDate":"2024-03-07"},{"lineNumber":12,"author":{"gitId":"rertyy"},"content":"# Check if pre-commit hook already exists","lastModifiedDate":"2024-03-07"},{"lineNumber":13,"author":{"gitId":"rertyy"},"content":"if [ -f \"$hooksDir/pre-commit\" ]; then","lastModifiedDate":"2024-03-07"},{"lineNumber":14,"author":{"gitId":"rertyy"},"content":" # Backup existing pre-commit hook","lastModifiedDate":"2024-03-07"},{"lineNumber":15,"author":{"gitId":"rertyy"},"content":" cp \"$hooksDir/pre-commit\" \"$hooksDir/pre-commit.bak\"","lastModifiedDate":"2024-03-07"},{"lineNumber":16,"author":{"gitId":"rertyy"},"content":" echo \"Existing pre-commit hook backed up to: $hooksDir/pre-commit.bak\"","lastModifiedDate":"2024-03-07"},{"lineNumber":17,"author":{"gitId":"rertyy"},"content":"fi","lastModifiedDate":"2024-03-07"},{"lineNumber":18,"author":{"gitId":"rertyy"},"content":"","lastModifiedDate":"2024-03-07"},{"lineNumber":19,"author":{"gitId":"rertyy"},"content":"# Copy the new pre-commit hook","lastModifiedDate":"2024-03-07"},{"lineNumber":20,"author":{"gitId":"rertyy"},"content":"cp \"pre-commit\" \"$hooksDir/pre-commit\"","lastModifiedDate":"2024-03-07"},{"lineNumber":21,"author":{"gitId":"rertyy"},"content":"","lastModifiedDate":"2024-03-07"},{"lineNumber":22,"author":{"gitId":"rertyy"},"content":"echo \"New pre-commit hook setup complete.\"","lastModifiedDate":"2024-03-07"}],"authorContributionMap":{"rertyy":22}},{"path":"docs/AboutUs.md","fileType":"docs","lines":[{"lineNumber":1,"author":{"gitId":"kailinteoo"},"content":"# About Us:","lastModifiedDate":"2024-03-06"},{"lineNumber":2,"author":{"gitId":"kailinteoo"},"content":"Welcome to BookKeeper, your trusted companion in customer management for small crochet businesses. We understand the ","lastModifiedDate":"2024-03-06"},{"lineNumber":3,"author":{"gitId":"kailinteoo"},"content":"challenges faced by entrepreneurs like you who are passionate about crafting beautiful items and connecting with","lastModifiedDate":"2024-03-06"},{"lineNumber":4,"author":{"gitId":"kailinteoo"},"content":"customers. BookKeeper is here to simplify your workflow, empower your business, and help you thrive in the world of","lastModifiedDate":"2024-03-06"},{"lineNumber":5,"author":{"gitId":"kailinteoo"},"content":"crochet!","lastModifiedDate":"2024-03-06"},{"lineNumber":6,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":7,"author":{"gitId":"kailinteoo"},"content":"## Product Name: BookKeeper","lastModifiedDate":"2024-03-06"},{"lineNumber":8,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":9,"author":{"gitId":"kailinteoo"},"content":"## Target Users","lastModifiedDate":"2024-03-06"},{"lineNumber":10,"author":{"gitId":"kailinteoo"},"content":"Our target users are small business owners across various industries who are looking for efficient ways to manage their ","lastModifiedDate":"2024-03-06"},{"lineNumber":11,"author":{"gitId":"kailinteoo"},"content":"customer lists and streamline their customer management processes. These individuals typically operate businesses with ","lastModifiedDate":"2024-03-06"},{"lineNumber":12,"author":{"gitId":"kailinteoo"},"content":"limited resources and manpower, making it essential for them to optimize their workflows and maximize productivity.","lastModifiedDate":"2024-03-06"},{"lineNumber":13,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-06-17"},{"lineNumber":14,"author":{"gitId":"kailinteoo"},"content":"## Purpose","lastModifiedDate":"2024-03-06"},{"lineNumber":15,"author":{"gitId":"kailinteoo"},"content":"In the bustling world of a small business, time is precious. BookKeeper aims to provide a seamless solution for managing","lastModifiedDate":"2024-03-06"},{"lineNumber":16,"author":{"gitId":"kailinteoo"},"content":"customer relationships, allowing you to focus on what matters most - creating and selling your craft. Our platform","lastModifiedDate":"2024-03-06"},{"lineNumber":17,"author":{"gitId":"kailinteoo"},"content":"offers a user-friendly interface and powerful features to streamline your workflow, saving your time and effort.","lastModifiedDate":"2024-03-06"},{"lineNumber":18,"author":{"gitId":"kailinteoo"},"content":"","lastModifiedDate":"2024-03-06"},{"lineNumber":19,"author":{"gitId":"kailinteoo"},"content":"## Unique Selling Point","lastModifiedDate":"2024-03-06"},{"lineNumber":20,"author":{"gitId":"kailinteoo"},"content":"### Centralized Platform","lastModifiedDate":"2024-03-06"},{"lineNumber":21,"author":{"gitId":"kailinteoo"},"content":"Say goodbye to scattered customer lists and spreadsheets. BookKeeper offers a centralized platform to store and search","lastModifiedDate":"2024-03-06"},{"lineNumber":22,"author":{"gitId":"kailinteoo"},"content":"for clients, keeping all your important information in one place.","lastModifiedDate":"2024-03-06"},{"lineNumber":23,"author":{"gitId":"kailinteoo"},"content":"","lastModifiedDate":"2024-03-06"},{"lineNumber":24,"author":{"gitId":"kailinteoo"},"content":"### Efficiency","lastModifiedDate":"2024-03-06"},{"lineNumber":25,"author":{"gitId":"kailinteoo"},"content":"With a command-line interface, our application is faster and more efficient than traditional methods like CRMs or","lastModifiedDate":"2024-03-06"},{"lineNumber":26,"author":{"gitId":"kailinteoo"},"content":"Excel sheets. Spend less time navigating complex menus and more time serving your customers.","lastModifiedDate":"2024-03-06"},{"lineNumber":27,"author":{"gitId":"kailinteoo"},"content":"","lastModifiedDate":"2024-03-06"},{"lineNumber":28,"author":{"gitId":"kailinteoo"},"content":"### Tailored for Crochet Businesses","lastModifiedDate":"2024-03-06"},{"lineNumber":29,"author":{"gitId":"kailinteoo"},"content":"We understand the unique needs of crochet businesses, which is why our platform offers customizable fields, customizable","lastModifiedDate":"2024-03-06"},{"lineNumber":30,"author":{"gitId":"kailinteoo"},"content":"tags, and integration with e-commerce platforms.","lastModifiedDate":"2024-03-06"},{"lineNumber":31,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2024-03-06"},{"lineNumber":32,"author":{"gitId":"kailinteoo"},"content":"### Cost-effective","lastModifiedDate":"2024-03-06"},{"lineNumber":33,"author":{"gitId":"kailinteoo"},"content":"BookKeeper is designed to be cost-effective and easy to use, perfect for businesses with limited resources. Maximize","lastModifiedDate":"2024-03-06"},{"lineNumber":34,"author":{"gitId":"kailinteoo"},"content":"productivity without breaking the bank.","lastModifiedDate":"2024-03-06"},{"lineNumber":35,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":36,"author":{"gitId":"kailinteoo"},"content":"## Value Proposition","lastModifiedDate":"2024-03-06"},{"lineNumber":37,"author":{"gitId":"kailinteoo"},"content":"For small business owners launching services, organizing customer lists can be challenging. Our address book offers a ","lastModifiedDate":"2024-03-06"},{"lineNumber":38,"author":{"gitId":"kailinteoo"},"content":"centralized platform to store and search for clients, streamlining customer management. With a command-line interface, ","lastModifiedDate":"2024-03-06"},{"lineNumber":39,"author":{"gitId":"kailinteoo"},"content":"our application is faster and more efficient than inputting data into other systems like CRMs or Microsoft Excel.","lastModifiedDate":"2024-03-06"},{"lineNumber":40,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":41,"author":{"gitId":"kailinteoo"},"content":"## Team Information","lastModifiedDate":"2024-03-06"},{"lineNumber":42,"author":{"gitId":"kailinteoo"},"content":"","lastModifiedDate":"2024-03-06"},{"lineNumber":43,"author":{"gitId":"kailinteoo"},"content":"We are a team based in the [School of Computing, National University of Singapore](http://www.comp.nus.edu.sg).","lastModifiedDate":"2024-03-06"},{"lineNumber":44,"author":{"gitId":"kailinteoo"},"content":"","lastModifiedDate":"2024-03-06"},{"lineNumber":45,"author":{"gitId":"kailinteoo"},"content":"You can reach us at the email ","lastModifiedDate":"2024-03-06"},{"lineNumber":46,"author":{"gitId":"kailinteoo"},"content":"`jaspertan@u.nus.edu` `e0967851@u.nus.edu` `ian.tung@u.nus.edu` `e0959354@u.nus.edu`","lastModifiedDate":"2024-03-06"},{"lineNumber":47,"author":{"gitId":"kailinteoo"},"content":"","lastModifiedDate":"2024-03-06"},{"lineNumber":48,"author":{"gitId":"kailinteoo"},"content":"## Project team","lastModifiedDate":"2024-03-06"},{"lineNumber":49,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":50,"author":{"gitId":"kailinteoo"},"content":"### Jasper Tan Zu Xiang","lastModifiedDate":"2024-03-06"},{"lineNumber":51,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":52,"author":{"gitId":"kailinteoo"},"content":"\u003cimg src\u003d\"images/jaspertzx.png\" width\u003d\"200px\" height\u003d\"225px\"\u003e","lastModifiedDate":"2024-03-07"},{"lineNumber":53,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":54,"author":{"gitId":"kailinteoo"},"content":"[[github](https://github.com/Jaspertzx)]","lastModifiedDate":"2024-03-06"},{"lineNumber":55,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":56,"author":{"gitId":"kailinteoo"},"content":"* Role: Front-End Developer","lastModifiedDate":"2024-03-06"},{"lineNumber":57,"author":{"gitId":"kailinteoo"},"content":"* Responsibilities: Specialize in creating the user interface and user experience of the BookKeeper application. Ensure ","lastModifiedDate":"2024-03-06"},{"lineNumber":58,"author":{"gitId":"kailinteoo"},"content":"that the application is visually appealing, responsive, and easy to navigate for users.","lastModifiedDate":"2024-03-06"},{"lineNumber":59,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":60,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":61,"author":{"gitId":"kailinteoo"},"content":"### Goh Ying Xuan, Shavonne","lastModifiedDate":"2024-03-06"},{"lineNumber":62,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":63,"author":{"gitId":"kailinteoo"},"content":"\u003cimg src\u003d\"images/shavonneg.png\" width\u003d\"200px\" height\u003d\"225px\"\u003e","lastModifiedDate":"2024-03-06"},{"lineNumber":64,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":65,"author":{"gitId":"kailinteoo"},"content":"[[github](http://github.com/shavonneg)]","lastModifiedDate":"2024-03-06"},{"lineNumber":66,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":67,"author":{"gitId":"kailinteoo"},"content":"* Role: UI/UX Designer","lastModifiedDate":"2024-03-06"},{"lineNumber":68,"author":{"gitId":"kailinteoo"},"content":"* Responsibilities: Creating a seamless and intuitive user experience for the BookKeeper application. Conduct user","lastModifiedDate":"2024-03-06"},{"lineNumber":69,"author":{"gitId":"kailinteoo"},"content":"research, create wireframes and prototypes, and design user interfaces that are visually appealing and easy to use. ","lastModifiedDate":"2024-03-06"},{"lineNumber":70,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":71,"author":{"gitId":"kailinteoo"},"content":"### Tung Zhi Yong, Ian","lastModifiedDate":"2024-03-06"},{"lineNumber":72,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":73,"author":{"gitId":"kailinteoo"},"content":"\u003cimg src\u003d\"images/rertyy.png\" width\u003d\"200px\" height\u003d\"225px\"\u003e","lastModifiedDate":"2024-03-06"},{"lineNumber":74,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":75,"author":{"gitId":"kailinteoo"},"content":"[[github](http://github.com/rertyy)]","lastModifiedDate":"2024-03-06"},{"lineNumber":76,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":77,"author":{"gitId":"kailinteoo"},"content":"* Role: Full-Stack Developer","lastModifiedDate":"2024-03-06"},{"lineNumber":78,"author":{"gitId":"kailinteoo"},"content":"* Responsibilities: Proficient in both front-end and back-end development. Handle tasks ranging from designing user","lastModifiedDate":"2024-03-06"},{"lineNumber":79,"author":{"gitId":"kailinteoo"},"content":"interfaces to implementing server-side logic and managing database.","lastModifiedDate":"2024-03-06"},{"lineNumber":80,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":81,"author":{"gitId":"kailinteoo"},"content":"### Kailin Teo","lastModifiedDate":"2024-03-06"},{"lineNumber":82,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":83,"author":{"gitId":"kailinteoo"},"content":"\u003cimg src\u003d\"images/kailinteoo.png\" width\u003d\"200px\" height\u003d\"225px\"\u003e","lastModifiedDate":"2024-03-06"},{"lineNumber":84,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":85,"author":{"gitId":"kailinteoo"},"content":"[[github](http://github.com/kailinteoo)]","lastModifiedDate":"2024-03-06"},{"lineNumber":86,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":87,"author":{"gitId":"kailinteoo"},"content":"* Role: Back-End Developer","lastModifiedDate":"2024-03-06"},{"lineNumber":88,"author":{"gitId":"kailinteoo"},"content":"* Responsibilities: Focus on building the server-side components of the BookKeeper application. Handle tasks such as","lastModifiedDate":"2024-03-06"},{"lineNumber":89,"author":{"gitId":"kailinteoo"},"content":"implementing business logic, managing databases, and ensuring the security and scalability of the application. ","lastModifiedDate":"2024-03-06"}],"authorContributionMap":{"kailinteoo":66,"-":23}},{"path":"docs/DeveloperGuide.md","fileType":"docs","lines":[{"lineNumber":1,"author":{"gitId":"-"},"content":"---","lastModifiedDate":"2020-05-23"},{"lineNumber":2,"author":{"gitId":"-"},"content":"layout: page","lastModifiedDate":"2020-05-23"},{"lineNumber":3,"author":{"gitId":"-"},"content":"title: Developer Guide","lastModifiedDate":"2020-05-23"},{"lineNumber":4,"author":{"gitId":"-"},"content":"---","lastModifiedDate":"2020-05-23"},{"lineNumber":5,"author":{"gitId":"rertyy"},"content":"","lastModifiedDate":"2024-03-02"},{"lineNumber":6,"author":{"gitId":"-"},"content":"* Table of Contents","lastModifiedDate":"2020-05-23"},{"lineNumber":7,"author":{"gitId":"-"},"content":" {:toc}","lastModifiedDate":"2020-05-23"},{"lineNumber":8,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":9,"author":{"gitId":"-"},"content":"--------------------------------------------------------------------------------------------------------------------","lastModifiedDate":"2020-05-23"},{"lineNumber":10,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2021-07-30"},{"lineNumber":11,"author":{"gitId":"-"},"content":"## **Acknowledgements**","lastModifiedDate":"2021-07-30"},{"lineNumber":12,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2021-07-30"},{"lineNumber":13,"author":{"gitId":"rertyy"},"content":"* {list here sources of all reused/adapted ideas, code, documentation, and third-party libraries -- include links to the","lastModifiedDate":"2024-03-02"},{"lineNumber":14,"author":{"gitId":"rertyy"},"content":" original source as well}","lastModifiedDate":"2024-03-02"},{"lineNumber":15,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2021-07-30"},{"lineNumber":16,"author":{"gitId":"-"},"content":"--------------------------------------------------------------------------------------------------------------------","lastModifiedDate":"2021-07-30"},{"lineNumber":17,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":18,"author":{"gitId":"-"},"content":"## **Setting up, getting started**","lastModifiedDate":"2020-05-23"},{"lineNumber":19,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":20,"author":{"gitId":"-"},"content":"Refer to the guide [_Setting up and getting started_](SettingUp.md).","lastModifiedDate":"2020-05-23"},{"lineNumber":21,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":22,"author":{"gitId":"-"},"content":"--------------------------------------------------------------------------------------------------------------------","lastModifiedDate":"2020-05-23"},{"lineNumber":23,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":24,"author":{"gitId":"-"},"content":"## **Design**","lastModifiedDate":"2020-05-23"},{"lineNumber":25,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":26,"author":{"gitId":"-"},"content":"\u003cdiv markdown\u003d\"span\" class\u003d\"alert alert-primary\"\u003e","lastModifiedDate":"2021-07-31"},{"lineNumber":27,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":28,"author":{"gitId":"rertyy"},"content":":bulb: **Tip:** The `.puml` files used to create diagrams in this document `docs/diagrams` folder. Refer to the [","lastModifiedDate":"2024-03-02"},{"lineNumber":29,"author":{"gitId":"rertyy"},"content":"_PlantUML Tutorial_ at se-edu/guides](https://se-education.org/guides/tutorials/plantUml.html) to learn how to create","lastModifiedDate":"2024-03-02"},{"lineNumber":30,"author":{"gitId":"rertyy"},"content":"and edit diagrams.","lastModifiedDate":"2024-03-02"},{"lineNumber":31,"author":{"gitId":"-"},"content":"\u003c/div\u003e","lastModifiedDate":"2021-07-31"},{"lineNumber":32,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":33,"author":{"gitId":"-"},"content":"### Architecture","lastModifiedDate":"2021-07-31"},{"lineNumber":34,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":35,"author":{"gitId":"-"},"content":"\u003cimg src\u003d\"images/ArchitectureDiagram.png\" width\u003d\"280\" /\u003e","lastModifiedDate":"2021-07-31"},{"lineNumber":36,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":37,"author":{"gitId":"-"},"content":"The ***Architecture Diagram*** given above explains the high-level design of the App.","lastModifiedDate":"2021-07-31"},{"lineNumber":38,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":39,"author":{"gitId":"-"},"content":"Given below is a quick overview of main components and how they interact with each other.","lastModifiedDate":"2021-07-31"},{"lineNumber":40,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2021-07-31"},{"lineNumber":41,"author":{"gitId":"-"},"content":"**Main components of the architecture**","lastModifiedDate":"2021-07-31"},{"lineNumber":42,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":43,"author":{"gitId":"rertyy"},"content":"**`Main`** (consisting of","lastModifiedDate":"2024-03-02"},{"lineNumber":44,"author":{"gitId":"rertyy"},"content":"classes [`Main`](https://github.com/se-edu/addressbook-level3/tree/master/src/main/java/seedu/address/Main.java)","lastModifiedDate":"2024-03-02"},{"lineNumber":45,"author":{"gitId":"rertyy"},"content":"and [`MainApp`](https://github.com/se-edu/addressbook-level3/tree/master/src/main/java/seedu/address/MainApp.java)) is","lastModifiedDate":"2024-03-02"},{"lineNumber":46,"author":{"gitId":"rertyy"},"content":"in charge of the app launch and shut down.","lastModifiedDate":"2024-03-02"},{"lineNumber":47,"author":{"gitId":"rertyy"},"content":"","lastModifiedDate":"2024-03-02"},{"lineNumber":48,"author":{"gitId":"-"},"content":"* At app launch, it initializes the other components in the correct sequence, and connects them up with each other.","lastModifiedDate":"2023-09-03"},{"lineNumber":49,"author":{"gitId":"-"},"content":"* At shut down, it shuts down the other components and invokes cleanup methods where necessary.","lastModifiedDate":"2023-09-03"},{"lineNumber":50,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":51,"author":{"gitId":"-"},"content":"The bulk of the app\u0027s work is done by the following four components:","lastModifiedDate":"2023-09-03"},{"lineNumber":52,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":53,"author":{"gitId":"-"},"content":"* [**`UI`**](#ui-component): The UI of the App.","lastModifiedDate":"2020-05-23"},{"lineNumber":54,"author":{"gitId":"-"},"content":"* [**`Logic`**](#logic-component): The command executor.","lastModifiedDate":"2020-05-23"},{"lineNumber":55,"author":{"gitId":"-"},"content":"* [**`Model`**](#model-component): Holds the data of the App in memory.","lastModifiedDate":"2020-05-23"},{"lineNumber":56,"author":{"gitId":"-"},"content":"* [**`Storage`**](#storage-component): Reads data from, and writes data to, the hard disk.","lastModifiedDate":"2020-05-23"},{"lineNumber":57,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":58,"author":{"gitId":"-"},"content":"[**`Commons`**](#common-classes) represents a collection of classes used by multiple other components.","lastModifiedDate":"2023-09-03"},{"lineNumber":59,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":60,"author":{"gitId":"-"},"content":"**How the architecture components interact with each other**","lastModifiedDate":"2020-05-23"},{"lineNumber":61,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":62,"author":{"gitId":"rertyy"},"content":"The *Sequence Diagram* below shows how the components interact with each other for the scenario where the user issues","lastModifiedDate":"2024-03-02"},{"lineNumber":63,"author":{"gitId":"rertyy"},"content":"the command `delete 1`.","lastModifiedDate":"2024-03-02"},{"lineNumber":64,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":65,"author":{"gitId":"-"},"content":"\u003cimg src\u003d\"images/ArchitectureSequenceDiagram.png\" width\u003d\"574\" /\u003e","lastModifiedDate":"2020-06-07"},{"lineNumber":66,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":67,"author":{"gitId":"-"},"content":"Each of the four main components (also shown in the diagram above),","lastModifiedDate":"2021-07-31"},{"lineNumber":68,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2021-07-31"},{"lineNumber":69,"author":{"gitId":"-"},"content":"* defines its *API* in an `interface` with the same name as the Component.","lastModifiedDate":"2021-07-31"},{"lineNumber":70,"author":{"gitId":"rertyy"},"content":"* implements its functionality using a concrete `{Component Name}Manager` class (which follows the corresponding","lastModifiedDate":"2024-03-02"},{"lineNumber":71,"author":{"gitId":"rertyy"},"content":" API `interface` mentioned in the previous point.","lastModifiedDate":"2024-03-02"},{"lineNumber":72,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2021-07-31"},{"lineNumber":73,"author":{"gitId":"rertyy"},"content":"For example, the `Logic` component defines its API in the `Logic.java` interface and implements its functionality using","lastModifiedDate":"2024-03-02"},{"lineNumber":74,"author":{"gitId":"rertyy"},"content":"the `LogicManager.java` class which follows the `Logic` interface. Other components interact with a given component","lastModifiedDate":"2024-03-02"},{"lineNumber":75,"author":{"gitId":"rertyy"},"content":"through its interface rather than the concrete class (reason: to prevent outside component\u0027s being coupled to the","lastModifiedDate":"2024-03-02"},{"lineNumber":76,"author":{"gitId":"rertyy"},"content":"implementation of a component), as illustrated in the (partial) class diagram below.","lastModifiedDate":"2024-03-02"},{"lineNumber":77,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2021-07-31"},{"lineNumber":78,"author":{"gitId":"-"},"content":"\u003cimg src\u003d\"images/ComponentManagers.png\" width\u003d\"300\" /\u003e","lastModifiedDate":"2021-07-31"},{"lineNumber":79,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2021-07-31"},{"lineNumber":80,"author":{"gitId":"-"},"content":"The sections below give more details of each component.","lastModifiedDate":"2020-05-23"},{"lineNumber":81,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":82,"author":{"gitId":"-"},"content":"### UI component","lastModifiedDate":"2020-05-23"},{"lineNumber":83,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":84,"author":{"gitId":"rertyy"},"content":"The **API** of this component is specified","lastModifiedDate":"2024-03-02"},{"lineNumber":85,"author":{"gitId":"rertyy"},"content":"in [`Ui.java`](https://github.com/se-edu/addressbook-level3/tree/master/src/main/java/seedu/address/ui/Ui.java)","lastModifiedDate":"2024-03-02"},{"lineNumber":86,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":87,"author":{"gitId":"-"},"content":"![Structure of the UI Component](images/UiClassDiagram.png)","lastModifiedDate":"2021-07-31"},{"lineNumber":88,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":89,"author":{"gitId":"rertyy"},"content":"The UI consists of a `MainWindow` that is made up of parts","lastModifiedDate":"2024-03-02"},{"lineNumber":90,"author":{"gitId":"rertyy"},"content":"e.g.`CommandBox`, `ResultDisplay`, `PersonListPanel`, `StatusBarFooter` etc. All these, including the `MainWindow`,","lastModifiedDate":"2024-03-02"},{"lineNumber":91,"author":{"gitId":"rertyy"},"content":"inherit from the abstract `UiPart` class which captures the commonalities between classes that represent parts of the","lastModifiedDate":"2024-03-02"},{"lineNumber":92,"author":{"gitId":"rertyy"},"content":"visible GUI.","lastModifiedDate":"2024-03-02"},{"lineNumber":93,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":94,"author":{"gitId":"rertyy"},"content":"The `UI` component uses the JavaFx UI framework. The layout of these UI parts are defined in matching `.fxml` files that","lastModifiedDate":"2024-03-02"},{"lineNumber":95,"author":{"gitId":"rertyy"},"content":"are in the `src/main/resources/view` folder. For example, the layout of","lastModifiedDate":"2024-03-02"},{"lineNumber":96,"author":{"gitId":"rertyy"},"content":"the [`MainWindow`](https://github.com/se-edu/addressbook-level3/tree/master/src/main/java/seedu/address/ui/MainWindow.java)","lastModifiedDate":"2024-03-02"},{"lineNumber":97,"author":{"gitId":"rertyy"},"content":"is specified","lastModifiedDate":"2024-03-02"},{"lineNumber":98,"author":{"gitId":"rertyy"},"content":"in [`MainWindow.fxml`](https://github.com/se-edu/addressbook-level3/tree/master/src/main/resources/view/MainWindow.fxml)","lastModifiedDate":"2024-03-02"},{"lineNumber":99,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":100,"author":{"gitId":"-"},"content":"The `UI` component,","lastModifiedDate":"2020-05-23"},{"lineNumber":101,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":102,"author":{"gitId":"-"},"content":"* executes user commands using the `Logic` component.","lastModifiedDate":"2021-07-31"},{"lineNumber":103,"author":{"gitId":"-"},"content":"* listens for changes to `Model` data so that the UI can be updated with the modified data.","lastModifiedDate":"2021-07-31"},{"lineNumber":104,"author":{"gitId":"-"},"content":"* keeps a reference to the `Logic` component, because the `UI` relies on the `Logic` to execute commands.","lastModifiedDate":"2021-07-31"},{"lineNumber":105,"author":{"gitId":"-"},"content":"* depends on some classes in the `Model` component, as it displays `Person` object residing in the `Model`.","lastModifiedDate":"2021-07-31"},{"lineNumber":106,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":107,"author":{"gitId":"-"},"content":"### Logic component","lastModifiedDate":"2020-05-23"},{"lineNumber":108,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":109,"author":{"gitId":"rertyy"},"content":"**API","lastModifiedDate":"2024-03-02"},{"lineNumber":110,"author":{"gitId":"rertyy"},"content":"** : [`Logic.java`](https://github.com/se-edu/addressbook-level3/tree/master/src/main/java/seedu/address/logic/Logic.java)","lastModifiedDate":"2024-03-02"},{"lineNumber":111,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":112,"author":{"gitId":"-"},"content":"Here\u0027s a (partial) class diagram of the `Logic` component:","lastModifiedDate":"2021-07-31"},{"lineNumber":113,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":114,"author":{"gitId":"-"},"content":"\u003cimg src\u003d\"images/LogicClassDiagram.png\" width\u003d\"550\"/\u003e","lastModifiedDate":"2021-07-31"},{"lineNumber":115,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":116,"author":{"gitId":"rertyy"},"content":"The sequence diagram below illustrates the interactions within the `Logic` component, taking `execute(\"delete 1\")` API","lastModifiedDate":"2024-03-02"},{"lineNumber":117,"author":{"gitId":"rertyy"},"content":"call as an example.","lastModifiedDate":"2024-03-02"},{"lineNumber":118,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":119,"author":{"gitId":"-"},"content":"![Interactions Inside the Logic Component for the `delete 1` Command](images/DeleteSequenceDiagram.png)","lastModifiedDate":"2020-05-23"},{"lineNumber":120,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":121,"author":{"gitId":"-"},"content":"\u003cdiv markdown\u003d\"span\" class\u003d\"alert alert-info\"\u003e:information_source: **Note:** The lifeline for `DeleteCommandParser` should end at the destroy marker (X) but due to a limitation of PlantUML, the lifeline continues till the end of diagram.","lastModifiedDate":"2024-02-09"},{"lineNumber":122,"author":{"gitId":"-"},"content":"\u003c/div\u003e","lastModifiedDate":"2020-05-23"},{"lineNumber":123,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":124,"author":{"gitId":"-"},"content":"How the `Logic` component works:","lastModifiedDate":"2023-09-03"},{"lineNumber":125,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2023-09-03"},{"lineNumber":126,"author":{"gitId":"rertyy"},"content":"1. When `Logic` is called upon to execute a command, it is passed to an `AddressBookParser` object which in turn creates","lastModifiedDate":"2024-03-02"},{"lineNumber":127,"author":{"gitId":"rertyy"},"content":" a parser that matches the command (e.g., `DeleteCommandParser`) and uses it to parse the command.","lastModifiedDate":"2024-03-02"},{"lineNumber":128,"author":{"gitId":"rertyy"},"content":"1. This results in a `Command` object (more precisely, an object of one of its subclasses e.g., `DeleteCommand`) which","lastModifiedDate":"2024-03-02"},{"lineNumber":129,"author":{"gitId":"rertyy"},"content":" is executed by the `LogicManager`.","lastModifiedDate":"2024-03-02"},{"lineNumber":130,"author":{"gitId":"-"},"content":"1. The command can communicate with the `Model` when it is executed (e.g. to delete a person).\u003cbr\u003e","lastModifiedDate":"2024-02-09"},{"lineNumber":131,"author":{"gitId":"rertyy"},"content":" Note that although this is shown as a single step in the diagram above (for simplicity), in the code it can take","lastModifiedDate":"2024-03-02"},{"lineNumber":132,"author":{"gitId":"rertyy"},"content":" several interactions (between the command object and the `Model`) to achieve.","lastModifiedDate":"2024-03-02"},{"lineNumber":133,"author":{"gitId":"-"},"content":"1. The result of the command execution is encapsulated as a `CommandResult` object which is returned back from `Logic`.","lastModifiedDate":"2023-09-03"},{"lineNumber":134,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2023-09-03"},{"lineNumber":135,"author":{"gitId":"-"},"content":"Here are the other classes in `Logic` (omitted from the class diagram above) that are used for parsing a user command:","lastModifiedDate":"2021-07-31"},{"lineNumber":136,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2021-07-31"},{"lineNumber":137,"author":{"gitId":"-"},"content":"\u003cimg src\u003d\"images/ParserClasses.png\" width\u003d\"600\"/\u003e","lastModifiedDate":"2021-07-31"},{"lineNumber":138,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":139,"author":{"gitId":"-"},"content":"How the parsing works:","lastModifiedDate":"2021-07-31"},{"lineNumber":140,"author":{"gitId":"rertyy"},"content":"","lastModifiedDate":"2024-03-02"},{"lineNumber":141,"author":{"gitId":"rertyy"},"content":"* When called upon to parse a user command, the `AddressBookParser` class creates an `XYZCommandParser` (`XYZ` is a","lastModifiedDate":"2024-03-02"},{"lineNumber":142,"author":{"gitId":"rertyy"},"content":" placeholder for the specific command name e.g., `AddCommandParser`) which uses the other classes shown above to parse","lastModifiedDate":"2024-03-02"},{"lineNumber":143,"author":{"gitId":"rertyy"},"content":" the user command and create a `XYZCommand` object (e.g., `AddCommand`) which the `AddressBookParser` returns back as","lastModifiedDate":"2024-03-02"},{"lineNumber":144,"author":{"gitId":"rertyy"},"content":" a `Command` object.","lastModifiedDate":"2024-03-02"},{"lineNumber":145,"author":{"gitId":"rertyy"},"content":"* All `XYZCommandParser` classes (e.g., `AddCommandParser`, `DeleteCommandParser`, ...) inherit from the `Parser`","lastModifiedDate":"2024-03-02"},{"lineNumber":146,"author":{"gitId":"rertyy"},"content":" interface so that they can be treated similarly where possible e.g, during testing.","lastModifiedDate":"2024-03-02"},{"lineNumber":147,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":148,"author":{"gitId":"-"},"content":"### Model component","lastModifiedDate":"2021-07-31"},{"lineNumber":149,"author":{"gitId":"rertyy"},"content":"","lastModifiedDate":"2024-03-02"},{"lineNumber":150,"author":{"gitId":"rertyy"},"content":"**API","lastModifiedDate":"2024-03-02"},{"lineNumber":151,"author":{"gitId":"rertyy"},"content":"** : [`Model.java`](https://github.com/se-edu/addressbook-level3/tree/master/src/main/java/seedu/address/model/Model.java)","lastModifiedDate":"2024-03-02"},{"lineNumber":152,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":153,"author":{"gitId":"-"},"content":"\u003cimg src\u003d\"images/ModelClassDiagram.png\" width\u003d\"450\" /\u003e","lastModifiedDate":"2021-07-31"},{"lineNumber":154,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":155,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":156,"author":{"gitId":"-"},"content":"The `Model` component,","lastModifiedDate":"2021-07-31"},{"lineNumber":157,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":158,"author":{"gitId":"-"},"content":"* stores the address book data i.e., all `Person` objects (which are contained in a `UniquePersonList` object).","lastModifiedDate":"2021-07-31"},{"lineNumber":159,"author":{"gitId":"rertyy"},"content":"* stores the currently \u0027selected\u0027 `Person` objects (e.g., results of a search query) as a separate _filtered_ list which","lastModifiedDate":"2024-03-02"},{"lineNumber":160,"author":{"gitId":"rertyy"},"content":" is exposed to outsiders as an unmodifiable `ObservableList\u003cPerson\u003e` that can be \u0027observed\u0027 e.g. the UI can be bound to","lastModifiedDate":"2024-03-02"},{"lineNumber":161,"author":{"gitId":"rertyy"},"content":" this list so that the UI automatically updates when the data in the list change.","lastModifiedDate":"2024-03-02"},{"lineNumber":162,"author":{"gitId":"rertyy"},"content":"* stores a `UserPref` object that represents the user’s preferences. This is exposed to the outside as","lastModifiedDate":"2024-03-02"},{"lineNumber":163,"author":{"gitId":"rertyy"},"content":" a `ReadOnlyUserPref` objects.","lastModifiedDate":"2024-03-02"},{"lineNumber":164,"author":{"gitId":"rertyy"},"content":"* does not depend on any of the other three components (as the `Model` represents data entities of the domain, they","lastModifiedDate":"2024-03-02"},{"lineNumber":165,"author":{"gitId":"rertyy"},"content":" should make sense on their own without depending on other components)","lastModifiedDate":"2024-03-02"},{"lineNumber":166,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2021-07-31"},{"lineNumber":167,"author":{"gitId":"-"},"content":"\u003cdiv markdown\u003d\"span\" class\u003d\"alert alert-info\"\u003e: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.\u003cbr\u003e","lastModifiedDate":"2021-07-31"},{"lineNumber":168,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2021-07-31"},{"lineNumber":169,"author":{"gitId":"-"},"content":"\u003cimg src\u003d\"images/BetterModelClassDiagram.png\" width\u003d\"450\" /\u003e","lastModifiedDate":"2021-07-31"},{"lineNumber":170,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":171,"author":{"gitId":"-"},"content":"\u003c/div\u003e","lastModifiedDate":"2020-05-23"},{"lineNumber":172,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":173,"author":{"gitId":"-"},"content":"### Storage component","lastModifiedDate":"2020-05-23"},{"lineNumber":174,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":175,"author":{"gitId":"rertyy"},"content":"**API","lastModifiedDate":"2024-03-02"},{"lineNumber":176,"author":{"gitId":"rertyy"},"content":"** : [`Storage.java`](https://github.com/se-edu/addressbook-level3/tree/master/src/main/java/seedu/address/storage/Storage.java)","lastModifiedDate":"2024-03-02"},{"lineNumber":177,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":178,"author":{"gitId":"-"},"content":"\u003cimg src\u003d\"images/StorageClassDiagram.png\" width\u003d\"550\" /\u003e","lastModifiedDate":"2021-07-31"},{"lineNumber":179,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2021-07-31"},{"lineNumber":180,"author":{"gitId":"-"},"content":"The `Storage` component,","lastModifiedDate":"2020-05-23"},{"lineNumber":181,"author":{"gitId":"rertyy"},"content":"","lastModifiedDate":"2024-03-02"},{"lineNumber":182,"author":{"gitId":"rertyy"},"content":"* can save both address book data and user preference data in JSON format, and read them back into corresponding","lastModifiedDate":"2024-03-02"},{"lineNumber":183,"author":{"gitId":"rertyy"},"content":" objects.","lastModifiedDate":"2024-03-02"},{"lineNumber":184,"author":{"gitId":"rertyy"},"content":"* inherits from both `AddressBookStorage` and `UserPrefStorage`, which means it can be treated as either one (if only","lastModifiedDate":"2024-03-02"},{"lineNumber":185,"author":{"gitId":"rertyy"},"content":" the functionality of only one is needed).","lastModifiedDate":"2024-03-02"},{"lineNumber":186,"author":{"gitId":"rertyy"},"content":"* depends on some classes in the `Model` component (because the `Storage` component\u0027s job is to save/retrieve objects","lastModifiedDate":"2024-03-02"},{"lineNumber":187,"author":{"gitId":"rertyy"},"content":" that belong to the `Model`)","lastModifiedDate":"2024-03-02"},{"lineNumber":188,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":189,"author":{"gitId":"-"},"content":"### Common classes","lastModifiedDate":"2020-05-23"},{"lineNumber":190,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":191,"author":{"gitId":"-"},"content":"Classes used by multiple components are in the `seedu.addressbook.commons` package.","lastModifiedDate":"2020-05-23"},{"lineNumber":192,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":193,"author":{"gitId":"-"},"content":"--------------------------------------------------------------------------------------------------------------------","lastModifiedDate":"2020-05-23"},{"lineNumber":194,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":195,"author":{"gitId":"-"},"content":"## **Implementation**","lastModifiedDate":"2020-05-23"},{"lineNumber":196,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":197,"author":{"gitId":"-"},"content":"This section describes some noteworthy details on how certain features are implemented.","lastModifiedDate":"2020-05-23"},{"lineNumber":198,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":199,"author":{"gitId":"-"},"content":"### \\[Proposed\\] Undo/redo feature","lastModifiedDate":"2020-06-07"},{"lineNumber":200,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":201,"author":{"gitId":"-"},"content":"#### Proposed Implementation","lastModifiedDate":"2020-05-23"},{"lineNumber":202,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":203,"author":{"gitId":"rertyy"},"content":"The proposed undo/redo mechanism is facilitated by `VersionedAddressBook`. It extends `AddressBook` with an undo/redo","lastModifiedDate":"2024-03-02"},{"lineNumber":204,"author":{"gitId":"rertyy"},"content":"history, stored internally as an `addressBookStateList` and `currentStatePointer`. Additionally, it implements the","lastModifiedDate":"2024-03-02"},{"lineNumber":205,"author":{"gitId":"rertyy"},"content":"following operations:","lastModifiedDate":"2024-03-02"},{"lineNumber":206,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":207,"author":{"gitId":"rertyy"},"content":"* `VersionedAddressBook#commit()`— Saves the current address book state in its history.","lastModifiedDate":"2024-03-02"},{"lineNumber":208,"author":{"gitId":"rertyy"},"content":"* `VersionedAddressBook#undo()`— Restores the previous address book state from its history.","lastModifiedDate":"2024-03-02"},{"lineNumber":209,"author":{"gitId":"rertyy"},"content":"* `VersionedAddressBook#redo()`— Restores a previously undone address book state from its history.","lastModifiedDate":"2024-03-02"},{"lineNumber":210,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":211,"author":{"gitId":"rertyy"},"content":"These operations are exposed in the `Model` interface as `Model#commitAddressBook()`, `Model#undoAddressBook()`","lastModifiedDate":"2024-03-02"},{"lineNumber":212,"author":{"gitId":"rertyy"},"content":"and `Model#redoAddressBook()` respectively.","lastModifiedDate":"2024-03-02"},{"lineNumber":213,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":214,"author":{"gitId":"-"},"content":"Given below is an example usage scenario and how the undo/redo mechanism behaves at each step.","lastModifiedDate":"2020-05-23"},{"lineNumber":215,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":216,"author":{"gitId":"rertyy"},"content":"Step 1. The user launches the application for the first time. The `VersionedAddressBook` will be initialized with the","lastModifiedDate":"2024-03-02"},{"lineNumber":217,"author":{"gitId":"rertyy"},"content":"initial address book state, and the `currentStatePointer` pointing to that single address book state.","lastModifiedDate":"2024-03-02"},{"lineNumber":218,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":219,"author":{"gitId":"-"},"content":"![UndoRedoState0](images/UndoRedoState0.png)","lastModifiedDate":"2020-05-23"},{"lineNumber":220,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":221,"author":{"gitId":"rertyy"},"content":"Step 2. The user executes `delete 5` command to delete the 5th person in the address book. The `delete` command","lastModifiedDate":"2024-03-02"},{"lineNumber":222,"author":{"gitId":"rertyy"},"content":"calls `Model#commitAddressBook()`, causing the modified state of the address book after the `delete 5` command executes","lastModifiedDate":"2024-03-02"},{"lineNumber":223,"author":{"gitId":"rertyy"},"content":"to be saved in the `addressBookStateList`, and the `currentStatePointer` is shifted to the newly inserted address book","lastModifiedDate":"2024-03-02"},{"lineNumber":224,"author":{"gitId":"rertyy"},"content":"state.","lastModifiedDate":"2024-03-02"},{"lineNumber":225,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":226,"author":{"gitId":"-"},"content":"![UndoRedoState1](images/UndoRedoState1.png)","lastModifiedDate":"2020-05-23"},{"lineNumber":227,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":228,"author":{"gitId":"rertyy"},"content":"Step 3. The user executes `add n/David …​` to add a new person. The `add` command also","lastModifiedDate":"2024-03-02"},{"lineNumber":229,"author":{"gitId":"rertyy"},"content":"calls `Model#commitAddressBook()`, causing another modified address book state to be saved into","lastModifiedDate":"2024-03-02"},{"lineNumber":230,"author":{"gitId":"rertyy"},"content":"the `addressBookStateList`.","lastModifiedDate":"2024-03-02"},{"lineNumber":231,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":232,"author":{"gitId":"-"},"content":"![UndoRedoState2](images/UndoRedoState2.png)","lastModifiedDate":"2020-05-23"},{"lineNumber":233,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":234,"author":{"gitId":"-"},"content":"\u003cdiv markdown\u003d\"span\" class\u003d\"alert alert-info\"\u003e: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`.","lastModifiedDate":"2020-05-23"},{"lineNumber":235,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":236,"author":{"gitId":"-"},"content":"\u003c/div\u003e","lastModifiedDate":"2020-05-23"},{"lineNumber":237,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":238,"author":{"gitId":"rertyy"},"content":"Step 4. The user now decides that adding the person was a mistake, and decides to undo that action by executing","lastModifiedDate":"2024-03-02"},{"lineNumber":239,"author":{"gitId":"rertyy"},"content":"the `undo` command. The `undo` command will call `Model#undoAddressBook()`, which will shift the `currentStatePointer`","lastModifiedDate":"2024-03-02"},{"lineNumber":240,"author":{"gitId":"rertyy"},"content":"once to the left, pointing it to the previous address book state, and restores the address book to that state.","lastModifiedDate":"2024-03-02"},{"lineNumber":241,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":242,"author":{"gitId":"-"},"content":"![UndoRedoState3](images/UndoRedoState3.png)","lastModifiedDate":"2020-05-23"},{"lineNumber":243,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":244,"author":{"gitId":"-"},"content":"\u003cdiv markdown\u003d\"span\" class\u003d\"alert alert-info\"\u003e: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","lastModifiedDate":"2020-05-23"},{"lineNumber":245,"author":{"gitId":"-"},"content":"than attempting to perform the undo.","lastModifiedDate":"2020-05-23"},{"lineNumber":246,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":247,"author":{"gitId":"-"},"content":"\u003c/div\u003e","lastModifiedDate":"2020-05-23"},{"lineNumber":248,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":249,"author":{"gitId":"-"},"content":"The following sequence diagram shows how an undo operation goes through the `Logic` component:","lastModifiedDate":"2024-02-09"},{"lineNumber":250,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":251,"author":{"gitId":"-"},"content":"![UndoSequenceDiagram](images/UndoSequenceDiagram-Logic.png)","lastModifiedDate":"2024-02-09"},{"lineNumber":252,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":253,"author":{"gitId":"-"},"content":"\u003cdiv markdown\u003d\"span\" class\u003d\"alert alert-info\"\u003e: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.","lastModifiedDate":"2020-05-23"},{"lineNumber":254,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":255,"author":{"gitId":"-"},"content":"\u003c/div\u003e","lastModifiedDate":"2020-05-23"},{"lineNumber":256,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":257,"author":{"gitId":"-"},"content":"Similarly, how an undo operation goes through the `Model` component is shown below:","lastModifiedDate":"2024-02-09"},{"lineNumber":258,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2024-02-09"},{"lineNumber":259,"author":{"gitId":"-"},"content":"![UndoSequenceDiagram](images/UndoSequenceDiagram-Model.png)","lastModifiedDate":"2024-02-09"},{"lineNumber":260,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2024-02-09"},{"lineNumber":261,"author":{"gitId":"rertyy"},"content":"The `redo` command does the opposite — it calls `Model#redoAddressBook()`, which shifts the `currentStatePointer` once","lastModifiedDate":"2024-03-02"},{"lineNumber":262,"author":{"gitId":"rertyy"},"content":"to the right, pointing to the previously undone state, and restores the address book to that state.","lastModifiedDate":"2024-03-02"},{"lineNumber":263,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":264,"author":{"gitId":"-"},"content":"\u003cdiv markdown\u003d\"span\" class\u003d\"alert alert-info\"\u003e: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.","lastModifiedDate":"2020-05-23"},{"lineNumber":265,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":266,"author":{"gitId":"-"},"content":"\u003c/div\u003e","lastModifiedDate":"2020-05-23"},{"lineNumber":267,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":268,"author":{"gitId":"rertyy"},"content":"Step 5. The user then decides to execute the command `list`. Commands that do not modify the address book, such","lastModifiedDate":"2024-03-02"},{"lineNumber":269,"author":{"gitId":"rertyy"},"content":"as `list`, will usually not call `Model#commitAddressBook()`, `Model#undoAddressBook()` or `Model#redoAddressBook()`.","lastModifiedDate":"2024-03-02"},{"lineNumber":270,"author":{"gitId":"rertyy"},"content":"Thus, the `addressBookStateList` remains unchanged.","lastModifiedDate":"2024-03-02"},{"lineNumber":271,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":272,"author":{"gitId":"-"},"content":"![UndoRedoState4](images/UndoRedoState4.png)","lastModifiedDate":"2020-05-23"},{"lineNumber":273,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":274,"author":{"gitId":"rertyy"},"content":"Step 6. The user executes `clear`, which calls `Model#commitAddressBook()`. Since the `currentStatePointer` is not","lastModifiedDate":"2024-03-02"},{"lineNumber":275,"author":{"gitId":"rertyy"},"content":"pointing at the end of the `addressBookStateList`, all address book states after the `currentStatePointer` will be","lastModifiedDate":"2024-03-02"},{"lineNumber":276,"author":{"gitId":"rertyy"},"content":"purged. Reason: It no longer makes sense to redo the `add n/David …​` command. This is the behavior that most modern","lastModifiedDate":"2024-03-02"},{"lineNumber":277,"author":{"gitId":"rertyy"},"content":"desktop applications follow.","lastModifiedDate":"2024-03-02"},{"lineNumber":278,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":279,"author":{"gitId":"-"},"content":"![UndoRedoState5](images/UndoRedoState5.png)","lastModifiedDate":"2020-05-23"},{"lineNumber":280,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":281,"author":{"gitId":"-"},"content":"The following activity diagram summarizes what happens when a user executes a new command:","lastModifiedDate":"2020-05-23"},{"lineNumber":282,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":283,"author":{"gitId":"-"},"content":"\u003cimg src\u003d\"images/CommitActivityDiagram.png\" width\u003d\"250\" /\u003e","lastModifiedDate":"2021-07-31"},{"lineNumber":284,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":285,"author":{"gitId":"-"},"content":"#### Design considerations:","lastModifiedDate":"2021-07-31"},{"lineNumber":286,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":287,"author":{"gitId":"-"},"content":"**Aspect: How undo \u0026 redo executes:**","lastModifiedDate":"2021-07-31"},{"lineNumber":288,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":289,"author":{"gitId":"-"},"content":"* **Alternative 1 (current choice):** Saves the entire address book.","lastModifiedDate":"2020-05-23"},{"lineNumber":290,"author":{"gitId":"-"},"content":" * Pros: Easy to implement.","lastModifiedDate":"2020-05-23"},{"lineNumber":291,"author":{"gitId":"-"},"content":" * Cons: May have performance issues in terms of memory usage.","lastModifiedDate":"2020-05-23"},{"lineNumber":292,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":293,"author":{"gitId":"-"},"content":"* **Alternative 2:** Individual command knows how to undo/redo by","lastModifiedDate":"2020-05-23"},{"lineNumber":294,"author":{"gitId":"-"},"content":" itself.","lastModifiedDate":"2020-05-23"},{"lineNumber":295,"author":{"gitId":"-"},"content":" * Pros: Will use less memory (e.g. for `delete`, just save the person being deleted).","lastModifiedDate":"2020-05-23"},{"lineNumber":296,"author":{"gitId":"-"},"content":" * Cons: We must ensure that the implementation of each individual command are correct.","lastModifiedDate":"2020-05-23"},{"lineNumber":297,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":298,"author":{"gitId":"-"},"content":"_{more aspects and alternatives to be added}_","lastModifiedDate":"2020-05-23"},{"lineNumber":299,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":300,"author":{"gitId":"-"},"content":"### \\[Proposed\\] Data archiving","lastModifiedDate":"2020-05-23"},{"lineNumber":301,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":302,"author":{"gitId":"-"},"content":"_{Explain here how the data archiving feature will be implemented}_","lastModifiedDate":"2020-05-23"},{"lineNumber":303,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":304,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":305,"author":{"gitId":"-"},"content":"--------------------------------------------------------------------------------------------------------------------","lastModifiedDate":"2020-05-23"},{"lineNumber":306,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":307,"author":{"gitId":"-"},"content":"## **Documentation, logging, testing, configuration, dev-ops**","lastModifiedDate":"2020-06-07"},{"lineNumber":308,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":309,"author":{"gitId":"-"},"content":"* [Documentation guide](Documentation.md)","lastModifiedDate":"2020-06-07"},{"lineNumber":310,"author":{"gitId":"-"},"content":"* [Testing guide](Testing.md)","lastModifiedDate":"2020-06-07"},{"lineNumber":311,"author":{"gitId":"-"},"content":"* [Logging guide](Logging.md)","lastModifiedDate":"2020-06-07"},{"lineNumber":312,"author":{"gitId":"-"},"content":"* [Configuration guide](Configuration.md)","lastModifiedDate":"2020-06-07"},{"lineNumber":313,"author":{"gitId":"-"},"content":"* [DevOps guide](DevOps.md)","lastModifiedDate":"2020-06-07"},{"lineNumber":314,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":315,"author":{"gitId":"-"},"content":"--------------------------------------------------------------------------------------------------------------------","lastModifiedDate":"2020-05-23"},{"lineNumber":316,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":317,"author":{"gitId":"-"},"content":"## **Appendix: Requirements**","lastModifiedDate":"2020-05-23"},{"lineNumber":318,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":319,"author":{"gitId":"-"},"content":"### Product scope","lastModifiedDate":"2020-05-23"},{"lineNumber":320,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":321,"author":{"gitId":"-"},"content":"**Target user profile**:","lastModifiedDate":"2020-05-23"},{"lineNumber":322,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":323,"author":{"gitId":"kailinteoo"},"content":"* Small business owners in the crochet industry.","lastModifiedDate":"2024-03-08"},{"lineNumber":324,"author":{"gitId":"kailinteoo"},"content":"* Prefers efficient ways to manage customer lists.","lastModifiedDate":"2024-03-08"},{"lineNumber":325,"author":{"gitId":"kailinteoo"},"content":"* Values productivity and time-saving solutions.","lastModifiedDate":"2024-03-08"},{"lineNumber":326,"author":{"gitId":"kailinteoo"},"content":"","lastModifiedDate":"2024-03-08"},{"lineNumber":327,"author":{"gitId":"kailinteoo"},"content":"**User Needs and Preferences**:","lastModifiedDate":"2024-03-08"},{"lineNumber":328,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2024-03-08"},{"lineNumber":329,"author":{"gitId":"kailinteoo"},"content":"* Efficient Customer Management:","lastModifiedDate":"2024-03-08"},{"lineNumber":330,"author":{"gitId":"kailinteoo"},"content":" * Can organize and manage customer lists effectively.","lastModifiedDate":"2024-03-08"},{"lineNumber":331,"author":{"gitId":"kailinteoo"},"content":" * Prefers streamlined processes for handling customer information.","lastModifiedDate":"2024-03-08"},{"lineNumber":332,"author":{"gitId":"kailinteoo"},"content":" * Values tools that optimize workflows and save time.","lastModifiedDate":"2024-03-08"},{"lineNumber":333,"author":{"gitId":"kailinteoo"},"content":"* Mobile Accessibility:","lastModifiedDate":"2024-03-08"},{"lineNumber":334,"author":{"gitId":"kailinteoo"},"content":" * Appreciates the ability to access customer information on the go.","lastModifiedDate":"2024-03-08"},{"lineNumber":335,"author":{"gitId":"kailinteoo"},"content":" * Values mobile-friendly features for managing orders and inquiries efficiently.","lastModifiedDate":"2024-03-08"},{"lineNumber":336,"author":{"gitId":"kailinteoo"},"content":"* Data Security and Backup:","lastModifiedDate":"2024-03-08"},{"lineNumber":337,"author":{"gitId":"kailinteoo"},"content":" * Values secure access controls and data privacy compliance.","lastModifiedDate":"2024-03-08"},{"lineNumber":338,"author":{"gitId":"kailinteoo"},"content":" * Prefers applications with backup and synchronization capabilities for data integrity.","lastModifiedDate":"2024-03-08"},{"lineNumber":339,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2024-03-08"},{"lineNumber":340,"author":{"gitId":"kailinteoo"},"content":"**Value proposition**:","lastModifiedDate":"2024-03-08"},{"lineNumber":341,"author":{"gitId":"kailinteoo"},"content":"* manage contacts faster than a typical mouse/GUI driven app.","lastModifiedDate":"2024-03-08"},{"lineNumber":342,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":343,"author":{"gitId":"-"},"content":"### User stories","lastModifiedDate":"2020-06-07"},{"lineNumber":344,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":345,"author":{"gitId":"-"},"content":"Priorities: High (must have) - `* * *`, Medium (nice to have) - `* *`, Low (unlikely to have) - `*`","lastModifiedDate":"2020-05-23"},{"lineNumber":346,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":347,"author":{"gitId":"Jaspertzx"},"content":"| Priority | As a … | I want to … | So that I can… |","lastModifiedDate":"2024-03-05"},{"lineNumber":348,"author":{"gitId":"rertyy"},"content":"|----------|----------------------------------|--------------------------------------------------------------------------|----------------------------------------------------------------------------------------------------------------|","lastModifiedDate":"2024-03-07"},{"lineNumber":349,"author":{"gitId":"Jaspertzx"},"content":"| `* * *` | Small business owner | easily add new customers to my address book | keep track of all my clients\u0027 information in one place. |","lastModifiedDate":"2024-03-05"},{"lineNumber":350,"author":{"gitId":"Jaspertzx"},"content":"| `* * *` | Crocheter | have a search function | quickly find specific customers when I need to reference their details. |","lastModifiedDate":"2024-03-05"},{"lineNumber":351,"author":{"gitId":"Jaspertzx"},"content":"| `* * *` | Busy entrepreneur | be accessible via a command-line interface | efficiently manage my customer list without navigating through complex menus. |","lastModifiedDate":"2024-03-05"},{"lineNumber":352,"author":{"gitId":"Jaspertzx"},"content":"| `* * *` | Crochet business owner | have customizable fields | record specific details about each customer, such as their favorite colors or special requests. |","lastModifiedDate":"2024-03-05"},{"lineNumber":353,"author":{"gitId":"Jaspertzx"},"content":"| `* * *` | Small business owner | be cost-effective and easy to use | maximize productivity without investing in expensive CRM systems. |","lastModifiedDate":"2024-03-05"},{"lineNumber":354,"author":{"gitId":"Jaspertzx"},"content":"| `* * *` | Crochet business owner | have data backup and synchronization capabilities | access my customer information from multiple devices and ensure its security. |","lastModifiedDate":"2024-03-05"},{"lineNumber":355,"author":{"gitId":"Jaspertzx"},"content":"| `* * *` | Small business owner | have secure access controls and permissions settings | restrict sensitive information and ensure data privacy compliance. |","lastModifiedDate":"2024-03-05"},{"lineNumber":356,"author":{"gitId":"Jaspertzx"},"content":"| `* *` | Crochet business owner | categorize my customers | tailor my marketing efforts accordingly based on factors like their preferred crochet items or past purchases. |","lastModifiedDate":"2024-03-05"},{"lineNumber":357,"author":{"gitId":"Jaspertzx"},"content":"| `* *` | Small business owner | generate reports on customer activity | analyze trends and make informed business decisions based on order history and frequency of purchases. |","lastModifiedDate":"2024-03-05"},{"lineNumber":358,"author":{"gitId":"Jaspertzx"},"content":"| `* *` | Small business owner | have a reminder feature | stay organized and follow up with customers on important dates, such as birthdays or anniversaries. |","lastModifiedDate":"2024-03-05"},{"lineNumber":359,"author":{"gitId":"Jaspertzx"},"content":"| `* *` | Small business owner | have customizable templates for invoices and receipts | easily generate and send professional-looking documents to my customers. |","lastModifiedDate":"2024-03-05"},{"lineNumber":360,"author":{"gitId":"Jaspertzx"},"content":"| `* *` | Crocheter offering custom orders | have a notes section for each customer | record specific preferences and requirements for their projects. |","lastModifiedDate":"2024-03-05"},{"lineNumber":361,"author":{"gitId":"Jaspertzx"},"content":"| `* *` | Small business owner | integrate with accounting software | easily track expenses related to each customer and maintain accurate financial records. |","lastModifiedDate":"2024-03-05"},{"lineNumber":362,"author":{"gitId":"Jaspertzx"},"content":"| `*` | Crocheter | have a mobile-friendly interface | easily access customer information on the go and process orders efficiently. |","lastModifiedDate":"2024-03-05"},{"lineNumber":363,"author":{"gitId":"Jaspertzx"},"content":"| `*` | Crocheter | integrate with my email client | send personalized messages and promotions to my customers directly from the platform. |","lastModifiedDate":"2024-03-05"},{"lineNumber":364,"author":{"gitId":"Jaspertzx"},"content":"| `*` | Crocheter | integrate with e-commerce platforms | automatically sync customer data and manage orders efficiently when participating in online marketplaces. |","lastModifiedDate":"2024-03-05"},{"lineNumber":365,"author":{"gitId":"Jaspertzx"},"content":"| `*` | Crochet business owner | track communication history with customers | provide personalized and timely customer service including emails and phone calls. |","lastModifiedDate":"2024-03-05"},{"lineNumber":366,"author":{"gitId":"Jaspertzx"},"content":"| `*` | Crochet business owner | support multiple user accounts with shared access | my team members can collaborate on managing customer relationships. |","lastModifiedDate":"2024-03-05"},{"lineNumber":367,"author":{"gitId":"Jaspertzx"},"content":"| `*` | Crocheter | have a scheduling feature | manage registrations and communicate updates with attendees seamlessly. |","lastModifiedDate":"2024-03-05"},{"lineNumber":368,"author":{"gitId":"Jaspertzx"},"content":"| `*` | Crocheter | have a feature for scanning and capturing customer contact information | grow my mailing list and follow up with potential leads quickly. |","lastModifiedDate":"2024-03-05"},{"lineNumber":369,"author":{"gitId":"Jaspertzx"},"content":"| `*` | Crocheter | integrate with social media platforms | easily connect with customers and engage with them through various channels. |","lastModifiedDate":"2024-03-05"},{"lineNumber":370,"author":{"gitId":"Jaspertzx"},"content":"| `*` | Crochet business owner | provide insights into customer demographics and preferences | tailor my product offerings and marketing campaigns to target specific audiences effectively. |","lastModifiedDate":"2024-03-05"},{"lineNumber":371,"author":{"gitId":"Jaspertzx"},"content":"| `*` | Small business owner | provide analytics and insights on customer behavior | continuously improve my products and services to meet customer needs based on purchase patterns and feedback. |","lastModifiedDate":"2024-03-05"},{"lineNumber":372,"author":{"gitId":"Jaspertzx"},"content":"| `*` | Crochet business owner | provide insights into customer satisfaction through feedback and reviews | address any concerns and improve the overall customer experience. |","lastModifiedDate":"2024-03-05"},{"lineNumber":373,"author":{"gitId":"Jaspertzx"},"content":"| `*` | Small business owner | offer customizable tags or labels for customers | segment my audience and target specific groups with tailored marketing campaigns. |","lastModifiedDate":"2024-03-05"},{"lineNumber":374,"author":{"gitId":"Jaspertzx"},"content":"| `*` | Busy entrepreneur | have a good out of the box experience | immediately use the application without needing to configure it for my own needs. |","lastModifiedDate":"2024-03-05"},{"lineNumber":375,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":376,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2024-03-07"},{"lineNumber":377,"author":{"gitId":"-"},"content":"### Use cases","lastModifiedDate":"2020-06-07"},{"lineNumber":378,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":379,"author":{"gitId":"rertyy"},"content":"(For all use cases below, the **System** is the `AddressBook` and the **Actor** is the `user`, unless specified","lastModifiedDate":"2024-03-02"},{"lineNumber":380,"author":{"gitId":"rertyy"},"content":"otherwise)","lastModifiedDate":"2024-03-02"},{"lineNumber":381,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":382,"author":{"gitId":"-"},"content":"**Use case: Delete a person**","lastModifiedDate":"2020-05-23"},{"lineNumber":383,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":384,"author":{"gitId":"-"},"content":"**MSS**","lastModifiedDate":"2020-05-23"},{"lineNumber":385,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":386,"author":{"gitId":"rertyy"},"content":"1. User requests to list persons.","lastModifiedDate":"2024-03-07"},{"lineNumber":387,"author":{"gitId":"rertyy"},"content":"2. AddressBook shows a list of persons.","lastModifiedDate":"2024-03-07"},{"lineNumber":388,"author":{"gitId":"rertyy"},"content":"3. User requests to delete a specific person in the list.","lastModifiedDate":"2024-03-07"},{"lineNumber":389,"author":{"gitId":"rertyy"},"content":"4. AddressBook deletes the person.","lastModifiedDate":"2024-03-07"},{"lineNumber":390,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":391,"author":{"gitId":"-"},"content":" Use case ends.","lastModifiedDate":"2020-05-23"},{"lineNumber":392,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":393,"author":{"gitId":"-"},"content":"**Extensions**","lastModifiedDate":"2020-05-23"},{"lineNumber":394,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":395,"author":{"gitId":"-"},"content":"* 2a. The list is empty.","lastModifiedDate":"2020-05-23"},{"lineNumber":396,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":397,"author":{"gitId":"-"},"content":" Use case ends.","lastModifiedDate":"2020-05-23"},{"lineNumber":398,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":399,"author":{"gitId":"-"},"content":"* 3a. The given index is invalid.","lastModifiedDate":"2020-05-23"},{"lineNumber":400,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":401,"author":{"gitId":"-"},"content":" * 3a1. AddressBook shows an error message.","lastModifiedDate":"2020-05-23"},{"lineNumber":402,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":403,"author":{"gitId":"-"},"content":" Use case resumes at step 2.","lastModifiedDate":"2020-05-23"},{"lineNumber":404,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":405,"author":{"gitId":"rertyy"},"content":"**Use case: Add a person**","lastModifiedDate":"2024-03-02"},{"lineNumber":406,"author":{"gitId":"rertyy"},"content":"","lastModifiedDate":"2024-03-02"},{"lineNumber":407,"author":{"gitId":"rertyy"},"content":"**MSS**","lastModifiedDate":"2024-03-02"},{"lineNumber":408,"author":{"gitId":"rertyy"},"content":"","lastModifiedDate":"2024-03-02"},{"lineNumber":409,"author":{"gitId":"rertyy"},"content":"1. User requests to add a person.","lastModifiedDate":"2024-03-07"},{"lineNumber":410,"author":{"gitId":"rertyy"},"content":"2. AddressBook adds a person.","lastModifiedDate":"2024-03-07"},{"lineNumber":411,"author":{"gitId":"rertyy"},"content":"3. AddressBook shows the added person.","lastModifiedDate":"2024-03-07"},{"lineNumber":412,"author":{"gitId":"rertyy"},"content":"","lastModifiedDate":"2024-03-02"},{"lineNumber":413,"author":{"gitId":"rertyy"},"content":" Use case ends.","lastModifiedDate":"2024-03-02"},{"lineNumber":414,"author":{"gitId":"rertyy"},"content":"","lastModifiedDate":"2024-03-02"},{"lineNumber":415,"author":{"gitId":"rertyy"},"content":"**Extensions**","lastModifiedDate":"2024-03-02"},{"lineNumber":416,"author":{"gitId":"rertyy"},"content":"","lastModifiedDate":"2024-03-02"},{"lineNumber":417,"author":{"gitId":"rertyy"},"content":"* 2a. The person already exists.","lastModifiedDate":"2024-03-02"},{"lineNumber":418,"author":{"gitId":"rertyy"},"content":"","lastModifiedDate":"2024-03-02"},{"lineNumber":419,"author":{"gitId":"rertyy"},"content":" * 2a1. AddressBook shows an error message.","lastModifiedDate":"2024-03-02"},{"lineNumber":420,"author":{"gitId":"rertyy"},"content":"","lastModifiedDate":"2024-03-02"},{"lineNumber":421,"author":{"gitId":"rertyy"},"content":" Use case resumes at step 1.","lastModifiedDate":"2024-03-02"},{"lineNumber":422,"author":{"gitId":"rertyy"},"content":"","lastModifiedDate":"2024-03-02"},{"lineNumber":423,"author":{"gitId":"rertyy"},"content":"* 2b. The person details are invalid.","lastModifiedDate":"2024-03-02"},{"lineNumber":424,"author":{"gitId":"rertyy"},"content":"","lastModifiedDate":"2024-03-02"},{"lineNumber":425,"author":{"gitId":"rertyy"},"content":" * 2b1. AddressBook shows an error message.","lastModifiedDate":"2024-03-02"},{"lineNumber":426,"author":{"gitId":"rertyy"},"content":"","lastModifiedDate":"2024-03-02"},{"lineNumber":427,"author":{"gitId":"rertyy"},"content":" Use case resumes at step 1.","lastModifiedDate":"2024-03-02"},{"lineNumber":428,"author":{"gitId":"rertyy"},"content":"","lastModifiedDate":"2024-03-02"},{"lineNumber":429,"author":{"gitId":"rertyy"},"content":"**Use case: Edit a person**","lastModifiedDate":"2024-03-07"},{"lineNumber":430,"author":{"gitId":"rertyy"},"content":"","lastModifiedDate":"2024-03-07"},{"lineNumber":431,"author":{"gitId":"rertyy"},"content":"**MSS**","lastModifiedDate":"2024-03-07"},{"lineNumber":432,"author":{"gitId":"rertyy"},"content":"","lastModifiedDate":"2024-03-07"},{"lineNumber":433,"author":{"gitId":"rertyy"},"content":"1. User requests to edit a person.","lastModifiedDate":"2024-03-07"},{"lineNumber":434,"author":{"gitId":"rertyy"},"content":"2. AddressBook shows the person to be edited.","lastModifiedDate":"2024-03-07"},{"lineNumber":435,"author":{"gitId":"rertyy"},"content":"3. User edits the person.","lastModifiedDate":"2024-03-07"},{"lineNumber":436,"author":{"gitId":"rertyy"},"content":"4. AddressBook shows the edited person.","lastModifiedDate":"2024-03-07"},{"lineNumber":437,"author":{"gitId":"rertyy"},"content":"","lastModifiedDate":"2024-03-07"},{"lineNumber":438,"author":{"gitId":"rertyy"},"content":" Use case ends.","lastModifiedDate":"2024-03-07"},{"lineNumber":439,"author":{"gitId":"rertyy"},"content":"","lastModifiedDate":"2024-03-07"},{"lineNumber":440,"author":{"gitId":"rertyy"},"content":"**Extensions**","lastModifiedDate":"2024-03-07"},{"lineNumber":441,"author":{"gitId":"rertyy"},"content":"","lastModifiedDate":"2024-03-07"},{"lineNumber":442,"author":{"gitId":"rertyy"},"content":"* 2a. The person does not exist.","lastModifiedDate":"2024-03-07"},{"lineNumber":443,"author":{"gitId":"rertyy"},"content":"","lastModifiedDate":"2024-03-07"},{"lineNumber":444,"author":{"gitId":"rertyy"},"content":" * 2a1. AddressBook shows an error message.","lastModifiedDate":"2024-03-07"},{"lineNumber":445,"author":{"gitId":"rertyy"},"content":" * 2a2. AddressBook shows a list of persons with similar names.","lastModifiedDate":"2024-03-07"},{"lineNumber":446,"author":{"gitId":"rertyy"},"content":"","lastModifiedDate":"2024-03-07"},{"lineNumber":447,"author":{"gitId":"rertyy"},"content":" Use case resumes at step 1.","lastModifiedDate":"2024-03-07"},{"lineNumber":448,"author":{"gitId":"rertyy"},"content":"* 3a. The person details are invalid.","lastModifiedDate":"2024-03-07"},{"lineNumber":449,"author":{"gitId":"rertyy"},"content":"","lastModifiedDate":"2024-03-07"},{"lineNumber":450,"author":{"gitId":"rertyy"},"content":" * 3a1. AddressBook shows an error message.","lastModifiedDate":"2024-03-07"},{"lineNumber":451,"author":{"gitId":"rertyy"},"content":"","lastModifiedDate":"2024-03-07"},{"lineNumber":452,"author":{"gitId":"rertyy"},"content":" Use case resumes at step 2.","lastModifiedDate":"2024-03-07"},{"lineNumber":453,"author":{"gitId":"rertyy"},"content":"* 3b. The person details are unchanged.","lastModifiedDate":"2024-03-07"},{"lineNumber":454,"author":{"gitId":"rertyy"},"content":"","lastModifiedDate":"2024-03-07"},{"lineNumber":455,"author":{"gitId":"rertyy"},"content":" * 3b1. AddressBook shows a message indicating no changes are made.","lastModifiedDate":"2024-03-07"},{"lineNumber":456,"author":{"gitId":"rertyy"},"content":"","lastModifiedDate":"2024-03-07"},{"lineNumber":457,"author":{"gitId":"rertyy"},"content":" Use case resumes at step 2.","lastModifiedDate":"2024-03-07"},{"lineNumber":458,"author":{"gitId":"rertyy"},"content":"","lastModifiedDate":"2024-03-07"},{"lineNumber":459,"author":{"gitId":"rertyy"},"content":"**Use case: Find a person**","lastModifiedDate":"2024-03-02"},{"lineNumber":460,"author":{"gitId":"rertyy"},"content":"","lastModifiedDate":"2024-03-02"},{"lineNumber":461,"author":{"gitId":"rertyy"},"content":"**MSS**","lastModifiedDate":"2024-03-02"},{"lineNumber":462,"author":{"gitId":"rertyy"},"content":"","lastModifiedDate":"2024-03-02"},{"lineNumber":463,"author":{"gitId":"rertyy"},"content":"1. User requests to find a person by name.","lastModifiedDate":"2024-03-07"},{"lineNumber":464,"author":{"gitId":"rertyy"},"content":"2. AddressBook shows a list of persons whose names contain the given keyword.","lastModifiedDate":"2024-03-07"},{"lineNumber":465,"author":{"gitId":"rertyy"},"content":"","lastModifiedDate":"2024-03-02"},{"lineNumber":466,"author":{"gitId":"rertyy"},"content":" Use case ends.","lastModifiedDate":"2024-03-02"},{"lineNumber":467,"author":{"gitId":"rertyy"},"content":"","lastModifiedDate":"2024-03-02"},{"lineNumber":468,"author":{"gitId":"rertyy"},"content":"**Extensions**","lastModifiedDate":"2024-03-02"},{"lineNumber":469,"author":{"gitId":"rertyy"},"content":"","lastModifiedDate":"2024-03-02"},{"lineNumber":470,"author":{"gitId":"rertyy"},"content":"* 2a. No person is found.","lastModifiedDate":"2024-03-02"},{"lineNumber":471,"author":{"gitId":"rertyy"},"content":"","lastModifiedDate":"2024-03-02"},{"lineNumber":472,"author":{"gitId":"rertyy"},"content":" * 2a1. AddressBook shows a message indicating no person is found.","lastModifiedDate":"2024-03-02"},{"lineNumber":473,"author":{"gitId":"rertyy"},"content":" * 2a2. AddressBook shows the list of persons with similar names.","lastModifiedDate":"2024-03-07"},{"lineNumber":474,"author":{"gitId":"rertyy"},"content":"","lastModifiedDate":"2024-03-02"},{"lineNumber":475,"author":{"gitId":"rertyy"},"content":" Use case ends.","lastModifiedDate":"2024-03-02"},{"lineNumber":476,"author":{"gitId":"rertyy"},"content":"","lastModifiedDate":"2024-03-02"},{"lineNumber":477,"author":{"gitId":"rertyy"},"content":"**Use case: Filter categories**","lastModifiedDate":"2024-03-02"},{"lineNumber":478,"author":{"gitId":"rertyy"},"content":"","lastModifiedDate":"2024-03-02"},{"lineNumber":479,"author":{"gitId":"rertyy"},"content":"**MSS**","lastModifiedDate":"2024-03-02"},{"lineNumber":480,"author":{"gitId":"rertyy"},"content":"","lastModifiedDate":"2024-03-02"},{"lineNumber":481,"author":{"gitId":"rertyy"},"content":"1. User requests to filter categories.","lastModifiedDate":"2024-03-07"},{"lineNumber":482,"author":{"gitId":"rertyy"},"content":"2. AddressBook shows a list of persons with the given category.","lastModifiedDate":"2024-03-07"},{"lineNumber":483,"author":{"gitId":"rertyy"},"content":"","lastModifiedDate":"2024-03-07"},{"lineNumber":484,"author":{"gitId":"rertyy"},"content":" Use case ends.","lastModifiedDate":"2024-03-07"},{"lineNumber":485,"author":{"gitId":"rertyy"},"content":"","lastModifiedDate":"2024-03-07"},{"lineNumber":486,"author":{"gitId":"rertyy"},"content":"**Use case: Sort by order**","lastModifiedDate":"2024-03-07"},{"lineNumber":487,"author":{"gitId":"rertyy"},"content":"","lastModifiedDate":"2024-03-07"},{"lineNumber":488,"author":{"gitId":"rertyy"},"content":"**MSS**","lastModifiedDate":"2024-03-07"},{"lineNumber":489,"author":{"gitId":"rertyy"},"content":"","lastModifiedDate":"2024-03-07"},{"lineNumber":490,"author":{"gitId":"rertyy"},"content":"1. User requests to sort by order.","lastModifiedDate":"2024-03-07"},{"lineNumber":491,"author":{"gitId":"rertyy"},"content":"2. AddressBook shows a list of persons sorted by the given order.","lastModifiedDate":"2024-03-07"},{"lineNumber":492,"author":{"gitId":"rertyy"},"content":"","lastModifiedDate":"2024-03-02"},{"lineNumber":493,"author":{"gitId":"rertyy"},"content":" Use case ends.","lastModifiedDate":"2024-03-02"},{"lineNumber":494,"author":{"gitId":"rertyy"},"content":"","lastModifiedDate":"2024-03-02"},{"lineNumber":495,"author":{"gitId":"rertyy"},"content":"**Use case: Show help**","lastModifiedDate":"2024-03-02"},{"lineNumber":496,"author":{"gitId":"rertyy"},"content":"","lastModifiedDate":"2024-03-02"},{"lineNumber":497,"author":{"gitId":"rertyy"},"content":"**MSS**","lastModifiedDate":"2024-03-02"},{"lineNumber":498,"author":{"gitId":"rertyy"},"content":"","lastModifiedDate":"2024-03-02"},{"lineNumber":499,"author":{"gitId":"rertyy"},"content":"1. User requests to show help.","lastModifiedDate":"2024-03-07"},{"lineNumber":500,"author":{"gitId":"rertyy"},"content":"2. AddressBook shows a help page.","lastModifiedDate":"2024-03-07"},{"lineNumber":501,"author":{"gitId":"rertyy"},"content":"","lastModifiedDate":"2024-03-02"},{"lineNumber":502,"author":{"gitId":"rertyy"},"content":" Use case ends.","lastModifiedDate":"2024-03-02"},{"lineNumber":503,"author":{"gitId":"rertyy"},"content":"","lastModifiedDate":"2024-03-02"},{"lineNumber":504,"author":{"gitId":"rertyy"},"content":"**Use case: Clear all entries**","lastModifiedDate":"2024-03-02"},{"lineNumber":505,"author":{"gitId":"rertyy"},"content":"","lastModifiedDate":"2024-03-02"},{"lineNumber":506,"author":{"gitId":"rertyy"},"content":"**MSS**","lastModifiedDate":"2024-03-02"},{"lineNumber":507,"author":{"gitId":"rertyy"},"content":"","lastModifiedDate":"2024-03-02"},{"lineNumber":508,"author":{"gitId":"rertyy"},"content":"1. User requests to clear all entries.","lastModifiedDate":"2024-03-07"},{"lineNumber":509,"author":{"gitId":"rertyy"},"content":"2. AddressBook clears all entries.","lastModifiedDate":"2024-03-07"},{"lineNumber":510,"author":{"gitId":"rertyy"},"content":"","lastModifiedDate":"2024-03-02"},{"lineNumber":511,"author":{"gitId":"rertyy"},"content":" Use case ends.","lastModifiedDate":"2024-03-02"},{"lineNumber":512,"author":{"gitId":"rertyy"},"content":"","lastModifiedDate":"2024-03-02"},{"lineNumber":513,"author":{"gitId":"rertyy"},"content":"**Use case: Exit the program**","lastModifiedDate":"2024-03-02"},{"lineNumber":514,"author":{"gitId":"rertyy"},"content":"","lastModifiedDate":"2024-03-02"},{"lineNumber":515,"author":{"gitId":"rertyy"},"content":"**MSS**","lastModifiedDate":"2024-03-02"},{"lineNumber":516,"author":{"gitId":"rertyy"},"content":"","lastModifiedDate":"2024-03-02"},{"lineNumber":517,"author":{"gitId":"rertyy"},"content":"1. User requests to exit the program.","lastModifiedDate":"2024-03-07"},{"lineNumber":518,"author":{"gitId":"rertyy"},"content":"2. AddressBook exits.","lastModifiedDate":"2024-03-07"},{"lineNumber":519,"author":{"gitId":"rertyy"},"content":"","lastModifiedDate":"2024-03-07"},{"lineNumber":520,"author":{"gitId":"rertyy"},"content":" Use case ends.","lastModifiedDate":"2024-03-07"},{"lineNumber":521,"author":{"gitId":"rertyy"},"content":"","lastModifiedDate":"2024-03-07"},{"lineNumber":522,"author":{"gitId":"rertyy"},"content":"**Use case: Import data**","lastModifiedDate":"2024-03-07"},{"lineNumber":523,"author":{"gitId":"rertyy"},"content":"","lastModifiedDate":"2024-03-07"},{"lineNumber":524,"author":{"gitId":"rertyy"},"content":"**MSS**","lastModifiedDate":"2024-03-07"},{"lineNumber":525,"author":{"gitId":"rertyy"},"content":"","lastModifiedDate":"2024-03-07"},{"lineNumber":526,"author":{"gitId":"rertyy"},"content":"1. User requests to view locally saved data.","lastModifiedDate":"2024-03-07"},{"lineNumber":527,"author":{"gitId":"rertyy"},"content":"2. AddressBook opens location of saved data.","lastModifiedDate":"2024-03-07"},{"lineNumber":528,"author":{"gitId":"rertyy"},"content":"3. User stores new data to local file.","lastModifiedDate":"2024-03-07"},{"lineNumber":529,"author":{"gitId":"rertyy"},"content":"4. AddressBook imports data from file.","lastModifiedDate":"2024-03-07"},{"lineNumber":530,"author":{"gitId":"rertyy"},"content":"","lastModifiedDate":"2024-03-02"},{"lineNumber":531,"author":{"gitId":"rertyy"},"content":" Use case ends.","lastModifiedDate":"2024-03-02"},{"lineNumber":532,"author":{"gitId":"rertyy"},"content":"","lastModifiedDate":"2024-03-02"},{"lineNumber":533,"author":{"gitId":"rertyy"},"content":"**Extensions**","lastModifiedDate":"2024-03-07"},{"lineNumber":534,"author":{"gitId":"rertyy"},"content":"","lastModifiedDate":"2024-03-07"},{"lineNumber":535,"author":{"gitId":"rertyy"},"content":"* 4a. The data is invalid.","lastModifiedDate":"2024-03-07"},{"lineNumber":536,"author":{"gitId":"rertyy"},"content":"","lastModifiedDate":"2024-03-07"},{"lineNumber":537,"author":{"gitId":"rertyy"},"content":" * 4a1. AddressBook shows an error message.","lastModifiedDate":"2024-03-07"},{"lineNumber":538,"author":{"gitId":"rertyy"},"content":"","lastModifiedDate":"2024-03-07"},{"lineNumber":539,"author":{"gitId":"rertyy"},"content":" Use case resumes at step 1.","lastModifiedDate":"2024-03-07"},{"lineNumber":540,"author":{"gitId":"rertyy"},"content":"","lastModifiedDate":"2024-03-07"},{"lineNumber":541,"author":{"gitId":"rertyy"},"content":"**Use case: Export data**","lastModifiedDate":"2024-03-02"},{"lineNumber":542,"author":{"gitId":"rertyy"},"content":"","lastModifiedDate":"2024-03-02"},{"lineNumber":543,"author":{"gitId":"rertyy"},"content":"**MSS**","lastModifiedDate":"2024-03-02"},{"lineNumber":544,"author":{"gitId":"rertyy"},"content":"","lastModifiedDate":"2024-03-02"},{"lineNumber":545,"author":{"gitId":"rertyy"},"content":"1. User requests to export data.","lastModifiedDate":"2024-03-07"},{"lineNumber":546,"author":{"gitId":"rertyy"},"content":"2. AddressBook opens locally saved file.","lastModifiedDate":"2024-03-07"},{"lineNumber":547,"author":{"gitId":"rertyy"},"content":"","lastModifiedDate":"2024-03-07"},{"lineNumber":548,"author":{"gitId":"rertyy"},"content":" Use case ends.","lastModifiedDate":"2024-03-07"},{"lineNumber":549,"author":{"gitId":"rertyy"},"content":"","lastModifiedDate":"2024-03-07"},{"lineNumber":550,"author":{"gitId":"rertyy"},"content":"**Use case: Add order**","lastModifiedDate":"2024-03-07"},{"lineNumber":551,"author":{"gitId":"rertyy"},"content":"","lastModifiedDate":"2024-03-07"},{"lineNumber":552,"author":{"gitId":"rertyy"},"content":"**MSS**","lastModifiedDate":"2024-03-07"},{"lineNumber":553,"author":{"gitId":"rertyy"},"content":"","lastModifiedDate":"2024-03-07"},{"lineNumber":554,"author":{"gitId":"rertyy"},"content":"1. User requests to add an order.","lastModifiedDate":"2024-03-07"},{"lineNumber":555,"author":{"gitId":"rertyy"},"content":"2. AddressBook adds an order.","lastModifiedDate":"2024-03-07"},{"lineNumber":556,"author":{"gitId":"rertyy"},"content":"","lastModifiedDate":"2024-03-07"},{"lineNumber":557,"author":{"gitId":"rertyy"},"content":" Use case ends.","lastModifiedDate":"2024-03-07"},{"lineNumber":558,"author":{"gitId":"rertyy"},"content":"","lastModifiedDate":"2024-03-07"},{"lineNumber":559,"author":{"gitId":"rertyy"},"content":"**Extensions**","lastModifiedDate":"2024-03-07"},{"lineNumber":560,"author":{"gitId":"rertyy"},"content":"","lastModifiedDate":"2024-03-07"},{"lineNumber":561,"author":{"gitId":"rertyy"},"content":"* 2a. The order already exists.","lastModifiedDate":"2024-03-07"},{"lineNumber":562,"author":{"gitId":"rertyy"},"content":"","lastModifiedDate":"2024-03-07"},{"lineNumber":563,"author":{"gitId":"rertyy"},"content":" * 2a1. AddressBook shows an error message.","lastModifiedDate":"2024-03-07"},{"lineNumber":564,"author":{"gitId":"rertyy"},"content":"","lastModifiedDate":"2024-03-07"},{"lineNumber":565,"author":{"gitId":"rertyy"},"content":" Use case resumes at step 1.","lastModifiedDate":"2024-03-07"},{"lineNumber":566,"author":{"gitId":"rertyy"},"content":"* 2b. The order details are invalid.","lastModifiedDate":"2024-03-07"},{"lineNumber":567,"author":{"gitId":"rertyy"},"content":"","lastModifiedDate":"2024-03-07"},{"lineNumber":568,"author":{"gitId":"rertyy"},"content":" * 2b1. AddressBook shows an error message.","lastModifiedDate":"2024-03-07"},{"lineNumber":569,"author":{"gitId":"rertyy"},"content":"","lastModifiedDate":"2024-03-07"},{"lineNumber":570,"author":{"gitId":"rertyy"},"content":" Use case resumes at step 1.","lastModifiedDate":"2024-03-07"},{"lineNumber":571,"author":{"gitId":"rertyy"},"content":"","lastModifiedDate":"2024-03-07"},{"lineNumber":572,"author":{"gitId":"rertyy"},"content":"**Use case: Edit order**","lastModifiedDate":"2024-03-07"},{"lineNumber":573,"author":{"gitId":"rertyy"},"content":"","lastModifiedDate":"2024-03-07"},{"lineNumber":574,"author":{"gitId":"rertyy"},"content":"**MSS**","lastModifiedDate":"2024-03-07"},{"lineNumber":575,"author":{"gitId":"rertyy"},"content":"","lastModifiedDate":"2024-03-07"},{"lineNumber":576,"author":{"gitId":"rertyy"},"content":"1. User requests to edit an order.","lastModifiedDate":"2024-03-07"},{"lineNumber":577,"author":{"gitId":"rertyy"},"content":"2. AddressBook shows the order to be edited.","lastModifiedDate":"2024-03-07"},{"lineNumber":578,"author":{"gitId":"rertyy"},"content":"3. User edits the order.","lastModifiedDate":"2024-03-07"},{"lineNumber":579,"author":{"gitId":"rertyy"},"content":"4. AddressBook shows the edited order.","lastModifiedDate":"2024-03-07"},{"lineNumber":580,"author":{"gitId":"rertyy"},"content":"","lastModifiedDate":"2024-03-07"},{"lineNumber":581,"author":{"gitId":"rertyy"},"content":" Use case ends.","lastModifiedDate":"2024-03-07"},{"lineNumber":582,"author":{"gitId":"rertyy"},"content":"","lastModifiedDate":"2024-03-07"},{"lineNumber":583,"author":{"gitId":"rertyy"},"content":"**Extensions**","lastModifiedDate":"2024-03-07"},{"lineNumber":584,"author":{"gitId":"rertyy"},"content":"","lastModifiedDate":"2024-03-07"},{"lineNumber":585,"author":{"gitId":"rertyy"},"content":"* 2a. The order does not exist.","lastModifiedDate":"2024-03-07"},{"lineNumber":586,"author":{"gitId":"rertyy"},"content":"","lastModifiedDate":"2024-03-07"},{"lineNumber":587,"author":{"gitId":"rertyy"},"content":" * 2a1. AddressBook shows an error message.","lastModifiedDate":"2024-03-07"},{"lineNumber":588,"author":{"gitId":"rertyy"},"content":" * 2a2. AddressBook shows a list of orders with similar names.","lastModifiedDate":"2024-03-07"},{"lineNumber":589,"author":{"gitId":"rertyy"},"content":"","lastModifiedDate":"2024-03-07"},{"lineNumber":590,"author":{"gitId":"rertyy"},"content":" Use case resumes at step 1.","lastModifiedDate":"2024-03-07"},{"lineNumber":591,"author":{"gitId":"rertyy"},"content":"* 3a. The order details are invalid.","lastModifiedDate":"2024-03-07"},{"lineNumber":592,"author":{"gitId":"rertyy"},"content":"","lastModifiedDate":"2024-03-07"},{"lineNumber":593,"author":{"gitId":"rertyy"},"content":" * 3a1. AddressBook shows an error message.","lastModifiedDate":"2024-03-07"},{"lineNumber":594,"author":{"gitId":"rertyy"},"content":"","lastModifiedDate":"2024-03-07"},{"lineNumber":595,"author":{"gitId":"rertyy"},"content":" Use case resumes at step 2.","lastModifiedDate":"2024-03-07"},{"lineNumber":596,"author":{"gitId":"rertyy"},"content":"* 3b. The order details are unchanged.","lastModifiedDate":"2024-03-07"},{"lineNumber":597,"author":{"gitId":"rertyy"},"content":"","lastModifiedDate":"2024-03-07"},{"lineNumber":598,"author":{"gitId":"rertyy"},"content":" * 3b1. AddressBook shows a message indicating no changes are made.","lastModifiedDate":"2024-03-07"},{"lineNumber":599,"author":{"gitId":"rertyy"},"content":"","lastModifiedDate":"2024-03-07"},{"lineNumber":600,"author":{"gitId":"rertyy"},"content":" Use case resumes at step 2.","lastModifiedDate":"2024-03-07"},{"lineNumber":601,"author":{"gitId":"rertyy"},"content":"","lastModifiedDate":"2024-03-07"},{"lineNumber":602,"author":{"gitId":"rertyy"},"content":"**Use case: Delete order**","lastModifiedDate":"2024-03-07"},{"lineNumber":603,"author":{"gitId":"rertyy"},"content":"","lastModifiedDate":"2024-03-07"},{"lineNumber":604,"author":{"gitId":"rertyy"},"content":"**MSS**","lastModifiedDate":"2024-03-07"},{"lineNumber":605,"author":{"gitId":"rertyy"},"content":"","lastModifiedDate":"2024-03-07"},{"lineNumber":606,"author":{"gitId":"rertyy"},"content":"1. User requests to delete an order.","lastModifiedDate":"2024-03-07"},{"lineNumber":607,"author":{"gitId":"rertyy"},"content":"2. AddressBook deletes the order.","lastModifiedDate":"2024-03-07"},{"lineNumber":608,"author":{"gitId":"rertyy"},"content":"","lastModifiedDate":"2024-03-07"},{"lineNumber":609,"author":{"gitId":"rertyy"},"content":" Use case ends.","lastModifiedDate":"2024-03-07"},{"lineNumber":610,"author":{"gitId":"rertyy"},"content":"","lastModifiedDate":"2024-03-07"},{"lineNumber":611,"author":{"gitId":"rertyy"},"content":"**Extensions**","lastModifiedDate":"2024-03-07"},{"lineNumber":612,"author":{"gitId":"rertyy"},"content":"","lastModifiedDate":"2024-03-07"},{"lineNumber":613,"author":{"gitId":"rertyy"},"content":"* 2a. The order does not exist.","lastModifiedDate":"2024-03-07"},{"lineNumber":614,"author":{"gitId":"rertyy"},"content":"","lastModifiedDate":"2024-03-07"},{"lineNumber":615,"author":{"gitId":"rertyy"},"content":" * 2a1. AddressBook shows an error message.","lastModifiedDate":"2024-03-07"},{"lineNumber":616,"author":{"gitId":"rertyy"},"content":"","lastModifiedDate":"2024-03-07"},{"lineNumber":617,"author":{"gitId":"rertyy"},"content":" Use case resumes at step 1.","lastModifiedDate":"2024-03-07"},{"lineNumber":618,"author":{"gitId":"rertyy"},"content":"","lastModifiedDate":"2024-03-07"},{"lineNumber":619,"author":{"gitId":"rertyy"},"content":"**Use case: Prioritize order**","lastModifiedDate":"2024-03-07"},{"lineNumber":620,"author":{"gitId":"rertyy"},"content":"","lastModifiedDate":"2024-03-07"},{"lineNumber":621,"author":{"gitId":"rertyy"},"content":"**MSS**","lastModifiedDate":"2024-03-07"},{"lineNumber":622,"author":{"gitId":"rertyy"},"content":"","lastModifiedDate":"2024-03-07"},{"lineNumber":623,"author":{"gitId":"rertyy"},"content":"1. User requests to prioritize an order.","lastModifiedDate":"2024-03-07"},{"lineNumber":624,"author":{"gitId":"rertyy"},"content":"2. AddressBook shows the prioritized order.","lastModifiedDate":"2024-03-07"},{"lineNumber":625,"author":{"gitId":"rertyy"},"content":"","lastModifiedDate":"2024-03-02"},{"lineNumber":626,"author":{"gitId":"rertyy"},"content":" Use case ends.","lastModifiedDate":"2024-03-02"},{"lineNumber":627,"author":{"gitId":"rertyy"},"content":"","lastModifiedDate":"2024-03-02"},{"lineNumber":628,"author":{"gitId":"rertyy"},"content":"**Extensions**","lastModifiedDate":"2024-03-02"},{"lineNumber":629,"author":{"gitId":"rertyy"},"content":"","lastModifiedDate":"2024-03-02"},{"lineNumber":630,"author":{"gitId":"rertyy"},"content":"* 2a. The order does not exist.","lastModifiedDate":"2024-03-07"},{"lineNumber":631,"author":{"gitId":"rertyy"},"content":"","lastModifiedDate":"2024-03-02"},{"lineNumber":632,"author":{"gitId":"rertyy"},"content":" * 2a1. AddressBook shows an error message.","lastModifiedDate":"2024-03-02"},{"lineNumber":633,"author":{"gitId":"rertyy"},"content":"","lastModifiedDate":"2024-03-02"},{"lineNumber":634,"author":{"gitId":"rertyy"},"content":" Use case resumes at step 1.","lastModifiedDate":"2024-03-02"},{"lineNumber":635,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":636,"author":{"gitId":"-"},"content":"### Non-Functional Requirements","lastModifiedDate":"2020-05-23"},{"lineNumber":637,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":638,"author":{"gitId":"-"},"content":"1. Should work on any _mainstream OS_ as long as it has Java `11` or above installed.","lastModifiedDate":"2020-05-23"},{"lineNumber":639,"author":{"gitId":"-"},"content":"2. Should be able to hold up to 1000 persons without a noticeable sluggishness in performance for typical usage.","lastModifiedDate":"2020-05-23"},{"lineNumber":640,"author":{"gitId":"-"},"content":"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.","lastModifiedDate":"2020-05-23"},{"lineNumber":641,"author":{"gitId":"shavonneg"},"content":"4. Should provide clear and informative error messages to users in case of unexpected errors. Additionally, detailed logs should be maintained for system administrators to troubleshoot issues effectively.","lastModifiedDate":"2024-03-05"},{"lineNumber":642,"author":{"gitId":"shavonneg"},"content":"5. Application architecture should be scalable to accommodate future growth in terms of users and data volume, without compromising performance.","lastModifiedDate":"2024-03-05"},{"lineNumber":643,"author":{"gitId":"shavonneg"},"content":"6. Automated backups of critical data should be performed, and there should be a documented and tested procedure for data recovery in case of system failures or data loss.","lastModifiedDate":"2024-03-05"},{"lineNumber":644,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":645,"author":{"gitId":"-"},"content":"### Glossary","lastModifiedDate":"2020-05-23"},{"lineNumber":646,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":647,"author":{"gitId":"-"},"content":"* **Mainstream OS**: Windows, Linux, Unix, MacOS","lastModifiedDate":"2024-02-09"},{"lineNumber":648,"author":{"gitId":"-"},"content":"* **Private contact detail**: A contact detail that is not meant to be shared with others","lastModifiedDate":"2020-05-23"},{"lineNumber":649,"author":{"gitId":"shavonneg"},"content":"* **Application architecture**: Describes the patterns and techniques used to design and build an application","lastModifiedDate":"2024-03-05"},{"lineNumber":650,"author":{"gitId":"shavonneg"},"content":"* **System administrators**: Professionals responsible for managing, configuring, and ensuring the proper operation of computer systems and servers","lastModifiedDate":"2024-03-05"},{"lineNumber":651,"author":{"gitId":"shavonneg"},"content":"* **Detailed logs**: Records that track events, operations, errors, and other significant activities that occur within a software system or application.","lastModifiedDate":"2024-03-05"},{"lineNumber":652,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":653,"author":{"gitId":"-"},"content":"--------------------------------------------------------------------------------------------------------------------","lastModifiedDate":"2020-05-23"},{"lineNumber":654,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":655,"author":{"gitId":"-"},"content":"## **Appendix: Instructions for manual testing**","lastModifiedDate":"2020-05-23"},{"lineNumber":656,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":657,"author":{"gitId":"-"},"content":"Given below are instructions to test the app manually.","lastModifiedDate":"2020-05-23"},{"lineNumber":658,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":659,"author":{"gitId":"-"},"content":"\u003cdiv markdown\u003d\"span\" class\u003d\"alert alert-info\"\u003e:information_source: **Note:** These instructions only provide a starting point for testers to work on;","lastModifiedDate":"2020-05-23"},{"lineNumber":660,"author":{"gitId":"-"},"content":"testers are expected to do more *exploratory* testing.","lastModifiedDate":"2020-05-23"},{"lineNumber":661,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":662,"author":{"gitId":"-"},"content":"\u003c/div\u003e","lastModifiedDate":"2020-05-23"},{"lineNumber":663,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":664,"author":{"gitId":"-"},"content":"### Launch and shutdown","lastModifiedDate":"2020-05-23"},{"lineNumber":665,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":666,"author":{"gitId":"-"},"content":"1. Initial launch","lastModifiedDate":"2020-05-23"},{"lineNumber":667,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":668,"author":{"gitId":"-"},"content":" 1. Download the jar file and copy into an empty folder","lastModifiedDate":"2020-05-23"},{"lineNumber":669,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":670,"author":{"gitId":"rertyy"},"content":" 1. Double-click the jar file Expected: Shows the GUI with a set of sample contacts. The window size may not be","lastModifiedDate":"2024-03-02"},{"lineNumber":671,"author":{"gitId":"rertyy"},"content":" optimum.","lastModifiedDate":"2024-03-02"},{"lineNumber":672,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":673,"author":{"gitId":"-"},"content":"1. Saving window preferences","lastModifiedDate":"2020-05-23"},{"lineNumber":674,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":675,"author":{"gitId":"-"},"content":" 1. Resize the window to an optimum size. Move the window to a different location. Close the window.","lastModifiedDate":"2020-05-23"},{"lineNumber":676,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":677,"author":{"gitId":"-"},"content":" 1. Re-launch the app by double-clicking the jar file.\u003cbr\u003e","lastModifiedDate":"2020-05-23"},{"lineNumber":678,"author":{"gitId":"-"},"content":" Expected: The most recent window size and location is retained.","lastModifiedDate":"2020-05-23"},{"lineNumber":679,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":680,"author":{"gitId":"-"},"content":"1. _{ more test cases …​ }_","lastModifiedDate":"2020-05-23"},{"lineNumber":681,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":682,"author":{"gitId":"-"},"content":"### Deleting a person","lastModifiedDate":"2020-05-23"},{"lineNumber":683,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":684,"author":{"gitId":"-"},"content":"1. Deleting a person while all persons are being shown","lastModifiedDate":"2020-05-23"},{"lineNumber":685,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":686,"author":{"gitId":"-"},"content":" 1. Prerequisites: List all persons using the `list` command. Multiple persons in the list.","lastModifiedDate":"2020-05-23"},{"lineNumber":687,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":688,"author":{"gitId":"-"},"content":" 1. Test case: `delete 1`\u003cbr\u003e","lastModifiedDate":"2020-05-23"},{"lineNumber":689,"author":{"gitId":"rertyy"},"content":" Expected: First contact is deleted from the list. Details of the deleted contact shown in the status message.","lastModifiedDate":"2024-03-02"},{"lineNumber":690,"author":{"gitId":"rertyy"},"content":" Timestamp in the status bar is updated.","lastModifiedDate":"2024-03-02"},{"lineNumber":691,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":692,"author":{"gitId":"-"},"content":" 1. Test case: `delete 0`\u003cbr\u003e","lastModifiedDate":"2020-05-23"},{"lineNumber":693,"author":{"gitId":"-"},"content":" Expected: No person is deleted. Error details shown in the status message. Status bar remains the same.","lastModifiedDate":"2020-05-23"},{"lineNumber":694,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":695,"author":{"gitId":"-"},"content":" 1. Other incorrect delete commands to try: `delete`, `delete x`, `...` (where x is larger than the list size)\u003cbr\u003e","lastModifiedDate":"2020-05-23"},{"lineNumber":696,"author":{"gitId":"-"},"content":" Expected: Similar to previous.","lastModifiedDate":"2020-05-23"},{"lineNumber":697,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":698,"author":{"gitId":"-"},"content":"1. _{ more test cases …​ }_","lastModifiedDate":"2020-05-23"},{"lineNumber":699,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":700,"author":{"gitId":"-"},"content":"### Saving data","lastModifiedDate":"2020-05-23"},{"lineNumber":701,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":702,"author":{"gitId":"-"},"content":"1. Dealing with missing/corrupted data files","lastModifiedDate":"2020-05-23"},{"lineNumber":703,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":704,"author":{"gitId":"-"},"content":" 1. _{explain how to simulate a missing/corrupted file, and the expected behavior}_","lastModifiedDate":"2020-05-23"},{"lineNumber":705,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":706,"author":{"gitId":"-"},"content":"1. _{ more test cases …​ }_","lastModifiedDate":"2020-05-23"}],"authorContributionMap":{"kailinteoo":17,"shavonneg":6,"rertyy":336,"Jaspertzx":27,"-":320}}] diff --git a/AY2324S2-CS2103T-T09-2_tp_master/commits.json b/AY2324S2-CS2103T-T09-2_tp_master/commits.json index c9fc9b8f..1ae3de94 100644 --- a/AY2324S2-CS2103T-T09-2_tp_master/commits.json +++ b/AY2324S2-CS2103T-T09-2_tp_master/commits.json @@ -1 +1 @@ -{"authorDailyContributionsMap":{"kailinteoo":[{"date":"2024-03-06","commitResults":[{"hash":"a744f151cd8a507f50a1383abe87b7df1385297e","isMergeCommit":false,"messageTitle":"Update AboutUs and README pages, add UI mockup and build status badge","messageBody":"AboutUs Page:\n- Updated team member details and roles\n- Added profile photos for each member\n- Followed specified format for photo filenames\n\nREADME Page:\n- Updated project details and content to match project\n- Added UI mockup image as docs/images/Ui.png\n\nBuild Status Badge:\n- Updated GitHub Actions build status badge link to reflect team repo\u0027s build status\n\nAcknowledgement:\n- Acknowledged original source of code\n\nThis commit reflects updates made to various pages in the project repository to match our project details and specifications.\n","fileTypesAndContributionMap":{"docs":{"insertions":299,"deletions":51}}},{"hash":"abe2e20ffcfe3f81accf49fd79952588492bda9c","isMergeCommit":false,"messageTitle":"Update README with project details","messageBody":"This commit reflects changes made to the README\nto update project details and information.\nThe README now accurately reflects our project and\nits specifications.\n","fileTypesAndContributionMap":{"docs":{"insertions":20,"deletions":20}}},{"hash":"fb026213c29c5b2af1b3f556987bc19caa3747c0","isMergeCommit":true,"messageTitle":"Merge pull request #34 from Jaspertzx/master","messageBody":"Update User Stories","fileTypesAndContributionMap":{}},{"hash":"8437a8090717b851aeabf17070fefa95c15e07ab","isMergeCommit":false,"messageTitle":"Edit AboutUs.md to fix src image name","messageBody":"","fileTypesAndContributionMap":{"docs":{"insertions":1,"deletions":1}}}]},{"date":"2024-03-07","commitResults":[{"hash":"f50ba2526224ae911f7dfa106770112f3b4bf9b0","isMergeCommit":false,"messageTitle":"Edit AboutUs.md and docs","messageBody":"","fileTypesAndContributionMap":{"docs":{"insertions":1,"deletions":2}}},{"hash":"aba87293ce836ef1d1b948649856252c0bf58bc9","isMergeCommit":false,"messageTitle":"Edit AboutUs.md and Docs for img","messageBody":"","fileTypesAndContributionMap":{"docs":{"insertions":1,"deletions":1}}},{"hash":"9718e9c917dbd6b7ce7a4b6ac6b7a1bc6bc8cb0a","isMergeCommit":true,"messageTitle":"Merge pull request #39 from shavonneg/update-developer-guide","messageBody":"Update DeveloperGuide.md","fileTypesAndContributionMap":{}},{"hash":"ca44e9112929688b8a84728570666efdb5a6f5de","isMergeCommit":true,"messageTitle":"Merge pull request #43 from Jaspertzx/add-User-Story","messageBody":"Update DeveloperGuide","fileTypesAndContributionMap":{}}]}],"shavonneg":[{"date":"2024-03-05","commitResults":[{"hash":"6e3d411176696a3a0eda9c4a150912ce44958fc0","isMergeCommit":false,"messageTitle":"Update DeveloperGuide.md","messageBody":"","fileTypesAndContributionMap":{"docs":{"insertions":6,"deletions":2}}}]}],"rertyy":[{"date":"2024-03-02","commitResults":[{"hash":"7f84ac622f18004b140984fa1771492c72d3d1d6","isMergeCommit":false,"messageTitle":"Add use cases for base entries and export","messageBody":"","fileTypesAndContributionMap":{"docs":{"insertions":227,"deletions":73}}}]},{"date":"2024-03-06","commitResults":[{"hash":"cfbcd5756f0b6da60db0dc6d821a4866b53e3a3c","isMergeCommit":true,"messageTitle":"Merge branch \u0027master\u0027 into add-use-cases-to-dg","messageBody":"# Conflicts:\n#\tdocs/DeveloperGuide.md\n","fileTypesAndContributionMap":{}}]},{"date":"2024-03-07","commitResults":[{"hash":"b944847798b8c94092a99e26958b3327ef5bb88f","isMergeCommit":false,"messageTitle":"Add remaining use cases for new features","messageBody":"","fileTypesAndContributionMap":{"docs":{"insertions":185,"deletions":51}}},{"hash":"c4f2d2bc199eab99289d62934b01da79d549d9d2","isMergeCommit":false,"messageTitle":"Add pre-commit hook","messageBody":"","fileTypesAndContributionMap":{"other":{"insertions":45,"deletions":0}}}]}],"Jaspertzx":[{"date":"2024-03-05","commitResults":[{"hash":"8756614a0c823f135b58cce0c52e4973404ef1d2","isMergeCommit":false,"messageTitle":"Update User Stories","messageBody":"The user stories does not align with our overall\nobjective of creating a mini-CRM system.\n\nThis may make the overall project very confusing\nif other developers were to see the developer\nguide and not see the updated user stories.\n\nUpdate the user stories to match what my group\nis trying to attain.\n\nThis will be more accurate to what we would like\nto achieve the next few weeks, and also to meet\nthe requirements of this module.\n\nNo other reference.\n","fileTypesAndContributionMap":{"docs":{"insertions":28,"deletions":8}}}]},{"date":"2024-03-06","commitResults":[{"hash":"63d17a7aafc0ec241a136fdda3d6821a45985120","isMergeCommit":true,"messageTitle":"Merge pull request #1","messageBody":"Update User Stories","fileTypesAndContributionMap":{}},{"hash":"1c8ad53b94ee17d57487e8d421ba4eb8acc86d77","isMergeCommit":true,"messageTitle":"Merge pull request #32 from kailinteoo/website-adapted","messageBody":"Update AboutUs and README pages","fileTypesAndContributionMap":{}},{"hash":"e942a25746e0bc8e4d58a683fd7ada68e4a2ee68","isMergeCommit":true,"messageTitle":"Merge pull request #38 from kailinteoo/website-adapted","messageBody":"Edit AboutUs.md to fix src image name","fileTypesAndContributionMap":{}}]},{"date":"2024-03-07","commitResults":[{"hash":"29330376b0c04158a86a5581e52934eca30d502c","isMergeCommit":true,"messageTitle":"Merge pull request #40 from kailinteoo/website-adapted","messageBody":"Website adapted","fileTypesAndContributionMap":{}},{"hash":"7dc666abc2df1777c63757cde229aa43a779d8d3","isMergeCommit":false,"messageTitle":"Update DeveloperGuide","messageBody":"Fix the wrong tabs on the bottom of the user stories.\n","fileTypesAndContributionMap":{"docs":{"insertions":0,"deletions":2}}},{"hash":"9f75204cf745ab8543ee75a65fd127382016191c","isMergeCommit":true,"messageTitle":"Merge branch \u0027master\u0027 into add-use-cases-to-dg","messageBody":"","fileTypesAndContributionMap":{}},{"hash":"bc8bae5d0307567fae49d476e36b16877e1b403a","isMergeCommit":true,"messageTitle":"Merge pull request #30 from rertyy/add-use-cases-to-dg","messageBody":"Add use cases","fileTypesAndContributionMap":{}}]},{"date":"2024-03-08","commitResults":[{"hash":"d3de404326b4d81655a3dc9d2698519fb7fd3ac6","isMergeCommit":true,"messageTitle":"Merge pull request #42 from rertyy/add-precommit","messageBody":"Add pre-commit hook","fileTypesAndContributionMap":{}},{"hash":"b0ffda7ac662359202e55165dac221d3146b5ec9","isMergeCommit":true,"messageTitle":"Merge pull request #41 from rertyy/update-editorconfig","messageBody":"Remove unused filetypes for .editorconfig","fileTypesAndContributionMap":{}}]}]},"authorFileTypeContributionMap":{"kailinteoo":{"docs":298,"functional-code":0,"test-code":0},"shavonneg":{"docs":6,"functional-code":0,"test-code":0},"rertyy":{"docs":336,"functional-code":0,"test-code":0,"other":45},"Jaspertzx":{"docs":27,"functional-code":0,"test-code":0}},"authorContributionVariance":{"kailinteoo":9545.448,"shavonneg":3.982222,"rertyy":9763.796,"Jaspertzx":80.248886},"authorDisplayNameMap":{"kailinteoo":"CS2103T-T09-2 KAIL.. TEO","shavonneg":"CS2103T-T09-2 GOH ..ONNE","rertyy":"CS2103T-T09-2 TUNG.. IAN","Jaspertzx":"CS2103T-T09-2 JASP..IANG"}} +{"authorDailyContributionsMap":{"kailinteoo":[{"date":"2024-03-06","commitResults":[{"hash":"a744f151cd8a507f50a1383abe87b7df1385297e","isMergeCommit":false,"messageTitle":"Update AboutUs and README pages, add UI mockup and build status badge","messageBody":"AboutUs Page:\n- Updated team member details and roles\n- Added profile photos for each member\n- Followed specified format for photo filenames\n\nREADME Page:\n- Updated project details and content to match project\n- Added UI mockup image as docs/images/Ui.png\n\nBuild Status Badge:\n- Updated GitHub Actions build status badge link to reflect team repo\u0027s build status\n\nAcknowledgement:\n- Acknowledged original source of code\n\nThis commit reflects updates made to various pages in the project repository to match our project details and specifications.\n","fileTypesAndContributionMap":{"docs":{"insertions":299,"deletions":51}}},{"hash":"abe2e20ffcfe3f81accf49fd79952588492bda9c","isMergeCommit":false,"messageTitle":"Update README with project details","messageBody":"This commit reflects changes made to the README\nto update project details and information.\nThe README now accurately reflects our project and\nits specifications.\n","fileTypesAndContributionMap":{"docs":{"insertions":20,"deletions":20}}},{"hash":"fb026213c29c5b2af1b3f556987bc19caa3747c0","isMergeCommit":true,"messageTitle":"Merge pull request #34 from Jaspertzx/master","messageBody":"Update User Stories","fileTypesAndContributionMap":{}},{"hash":"8437a8090717b851aeabf17070fefa95c15e07ab","isMergeCommit":false,"messageTitle":"Edit AboutUs.md to fix src image name","messageBody":"","fileTypesAndContributionMap":{"docs":{"insertions":1,"deletions":1}}}]},{"date":"2024-03-07","commitResults":[{"hash":"f50ba2526224ae911f7dfa106770112f3b4bf9b0","isMergeCommit":false,"messageTitle":"Edit AboutUs.md and docs","messageBody":"","fileTypesAndContributionMap":{"docs":{"insertions":1,"deletions":2}}},{"hash":"aba87293ce836ef1d1b948649856252c0bf58bc9","isMergeCommit":false,"messageTitle":"Edit AboutUs.md and Docs for img","messageBody":"","fileTypesAndContributionMap":{"docs":{"insertions":1,"deletions":1}}},{"hash":"9718e9c917dbd6b7ce7a4b6ac6b7a1bc6bc8cb0a","isMergeCommit":true,"messageTitle":"Merge pull request #39 from shavonneg/update-developer-guide","messageBody":"Update DeveloperGuide.md","fileTypesAndContributionMap":{}},{"hash":"ca44e9112929688b8a84728570666efdb5a6f5de","isMergeCommit":true,"messageTitle":"Merge pull request #43 from Jaspertzx/add-User-Story","messageBody":"Update DeveloperGuide","fileTypesAndContributionMap":{}}]},{"date":"2024-03-08","commitResults":[{"hash":"395234a009982dad28c6095ee4e51c851b591a29","isMergeCommit":true,"messageTitle":"Merge pull request #46 from Jaspertzx/fix_userguide","messageBody":"Update User Guide","fileTypesAndContributionMap":{}},{"hash":"d1d23a9e4e9ccb1bb0c07694ce6311dfb15b637a","isMergeCommit":false,"messageTitle":"Resolve DG.md product scope","messageBody":"","fileTypesAndContributionMap":{"docs":{"insertions":19,"deletions":7}}}]}],"shavonneg":[{"date":"2024-03-05","commitResults":[{"hash":"6e3d411176696a3a0eda9c4a150912ce44958fc0","isMergeCommit":false,"messageTitle":"Update DeveloperGuide.md","messageBody":"","fileTypesAndContributionMap":{"docs":{"insertions":6,"deletions":2}}}]}],"rertyy":[{"date":"2024-03-02","commitResults":[{"hash":"7f84ac622f18004b140984fa1771492c72d3d1d6","isMergeCommit":false,"messageTitle":"Add use cases for base entries and export","messageBody":"","fileTypesAndContributionMap":{"docs":{"insertions":227,"deletions":73}}}]},{"date":"2024-03-06","commitResults":[{"hash":"cfbcd5756f0b6da60db0dc6d821a4866b53e3a3c","isMergeCommit":true,"messageTitle":"Merge branch \u0027master\u0027 into add-use-cases-to-dg","messageBody":"# Conflicts:\n#\tdocs/DeveloperGuide.md\n","fileTypesAndContributionMap":{}}]},{"date":"2024-03-07","commitResults":[{"hash":"b944847798b8c94092a99e26958b3327ef5bb88f","isMergeCommit":false,"messageTitle":"Add remaining use cases for new features","messageBody":"","fileTypesAndContributionMap":{"docs":{"insertions":185,"deletions":51}}},{"hash":"c4f2d2bc199eab99289d62934b01da79d549d9d2","isMergeCommit":false,"messageTitle":"Add pre-commit hook","messageBody":"","fileTypesAndContributionMap":{"other":{"insertions":45,"deletions":0}}}]}],"Jaspertzx":[{"date":"2024-03-05","commitResults":[{"hash":"8756614a0c823f135b58cce0c52e4973404ef1d2","isMergeCommit":false,"messageTitle":"Update User Stories","messageBody":"The user stories does not align with our overall\nobjective of creating a mini-CRM system.\n\nThis may make the overall project very confusing\nif other developers were to see the developer\nguide and not see the updated user stories.\n\nUpdate the user stories to match what my group\nis trying to attain.\n\nThis will be more accurate to what we would like\nto achieve the next few weeks, and also to meet\nthe requirements of this module.\n\nNo other reference.\n","fileTypesAndContributionMap":{"docs":{"insertions":28,"deletions":8}}}]},{"date":"2024-03-06","commitResults":[{"hash":"63d17a7aafc0ec241a136fdda3d6821a45985120","isMergeCommit":true,"messageTitle":"Merge pull request #1","messageBody":"Update User Stories","fileTypesAndContributionMap":{}},{"hash":"1c8ad53b94ee17d57487e8d421ba4eb8acc86d77","isMergeCommit":true,"messageTitle":"Merge pull request #32 from kailinteoo/website-adapted","messageBody":"Update AboutUs and README pages","fileTypesAndContributionMap":{}},{"hash":"e942a25746e0bc8e4d58a683fd7ada68e4a2ee68","isMergeCommit":true,"messageTitle":"Merge pull request #38 from kailinteoo/website-adapted","messageBody":"Edit AboutUs.md to fix src image name","fileTypesAndContributionMap":{}}]},{"date":"2024-03-07","commitResults":[{"hash":"29330376b0c04158a86a5581e52934eca30d502c","isMergeCommit":true,"messageTitle":"Merge pull request #40 from kailinteoo/website-adapted","messageBody":"Website adapted","fileTypesAndContributionMap":{}},{"hash":"7dc666abc2df1777c63757cde229aa43a779d8d3","isMergeCommit":false,"messageTitle":"Update DeveloperGuide","messageBody":"Fix the wrong tabs on the bottom of the user stories.\n","fileTypesAndContributionMap":{"docs":{"insertions":0,"deletions":2}}},{"hash":"9f75204cf745ab8543ee75a65fd127382016191c","isMergeCommit":true,"messageTitle":"Merge branch \u0027master\u0027 into add-use-cases-to-dg","messageBody":"","fileTypesAndContributionMap":{}},{"hash":"bc8bae5d0307567fae49d476e36b16877e1b403a","isMergeCommit":true,"messageTitle":"Merge pull request #30 from rertyy/add-use-cases-to-dg","messageBody":"Add use cases","fileTypesAndContributionMap":{}}]},{"date":"2024-03-08","commitResults":[{"hash":"d3de404326b4d81655a3dc9d2698519fb7fd3ac6","isMergeCommit":true,"messageTitle":"Merge pull request #42 from rertyy/add-precommit","messageBody":"Add pre-commit hook","fileTypesAndContributionMap":{}},{"hash":"b0ffda7ac662359202e55165dac221d3146b5ec9","isMergeCommit":true,"messageTitle":"Merge pull request #41 from rertyy/update-editorconfig","messageBody":"Remove unused filetypes for .editorconfig","fileTypesAndContributionMap":{}},{"hash":"8f83d2c774190f987ccd2e7c70de50a8a96cfc1a","isMergeCommit":false,"messageTitle":"Update User Guide","messageBody":"","fileTypesAndContributionMap":{"docs":{"insertions":1,"deletions":1}}},{"hash":"46dfec926dddec9c15fb43e4ffca510a0dcca028","isMergeCommit":true,"messageTitle":"Merge pull request #47 from kailinteoo/resolve_dg","messageBody":"Resolve DG.md product scope","fileTypesAndContributionMap":{}}]}]},"authorFileTypeContributionMap":{"kailinteoo":{"docs":315,"functional-code":0,"test-code":0},"shavonneg":{"docs":6,"functional-code":0,"test-code":0},"rertyy":{"docs":336,"functional-code":0,"test-code":0,"other":45},"Jaspertzx":{"docs":27,"functional-code":0,"test-code":0}},"authorContributionVariance":{"kailinteoo":9495.76,"shavonneg":3.982222,"rertyy":9763.796,"Jaspertzx":79.82222},"authorDisplayNameMap":{"kailinteoo":"CS2103T-T09-2 KAIL.. TEO","shavonneg":"CS2103T-T09-2 GOH ..ONNE","rertyy":"CS2103T-T09-2 TUNG.. IAN","Jaspertzx":"CS2103T-T09-2 JASP..IANG"}} diff --git a/AY2324S2-CS2103T-T10-2_tp_master/authorship.json b/AY2324S2-CS2103T-T10-2_tp_master/authorship.json index cc636115..dad39484 100644 --- a/AY2324S2-CS2103T-T10-2_tp_master/authorship.json +++ b/AY2324S2-CS2103T-T10-2_tp_master/authorship.json @@ -1 +1 @@ -[{"path":"docs/AboutUs.md","fileType":"docs","lines":[{"lineNumber":1,"author":{"gitId":"-"},"content":"---","lastModifiedDate":"2020-05-23"},{"lineNumber":2,"author":{"gitId":"-"},"content":" layout: default.md","lastModifiedDate":"2023-09-12"},{"lineNumber":3,"author":{"gitId":"-"},"content":" title: \"About Us\"","lastModifiedDate":"2023-09-12"},{"lineNumber":4,"author":{"gitId":"-"},"content":"---","lastModifiedDate":"2020-05-23"},{"lineNumber":5,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":6,"author":{"gitId":"-"},"content":"# About Us","lastModifiedDate":"2023-09-12"},{"lineNumber":7,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2023-09-12"},{"lineNumber":8,"author":{"gitId":"minreiseah"},"content":"We are a team based in the [School of Computing, National University of Singapore](http://www.comp.nus.edu.sg). To learn good software engineering practies, we have different team leads each week. This week\u0027s team lead is Shuyuan.","lastModifiedDate":"2024-03-07"},{"lineNumber":9,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":10,"author":{"gitId":"-"},"content":"You can reach us at the email `seer[at]comp.nus.edu.sg`","lastModifiedDate":"2020-06-17"},{"lineNumber":11,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-06-17"},{"lineNumber":12,"author":{"gitId":"-"},"content":"## Project team","lastModifiedDate":"2020-06-07"},{"lineNumber":13,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":14,"author":{"gitId":"minreiseah"},"content":"### Boan","lastModifiedDate":"2024-03-07"},{"lineNumber":15,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":16,"author":{"gitId":"-"},"content":"\u003cimg src\u003d\"images/johndoe.png\" width\u003d\"200px\"\u003e","lastModifiedDate":"2020-06-17"},{"lineNumber":17,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":18,"author":{"gitId":"-"},"content":"[[homepage](http://www.comp.nus.edu.sg/~damithch)]","lastModifiedDate":"2020-05-23"},{"lineNumber":19,"author":{"gitId":"-"},"content":"[[github](https://github.com/johndoe)]","lastModifiedDate":"2020-06-17"},{"lineNumber":20,"author":{"gitId":"-"},"content":"[[portfolio](team/johndoe.md)]","lastModifiedDate":"2020-05-23"},{"lineNumber":21,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":22,"author":{"gitId":"minreiseah"},"content":"* Role: Algorithms \u0026 Data Structures","lastModifiedDate":"2024-03-07"},{"lineNumber":23,"author":{"gitId":"minreiseah"},"content":"* Responsibilities: Algorithms \u0026 Data Structures","lastModifiedDate":"2024-03-07"},{"lineNumber":24,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":25,"author":{"gitId":"minreiseah"},"content":"### Jun Yuan","lastModifiedDate":"2024-03-07"},{"lineNumber":26,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":27,"author":{"gitId":"chengjunyuan"},"content":"\u003cimg src\u003d\"images/chengjunyuan.png\" width\u003d\"200px\"\u003e","lastModifiedDate":"2024-03-07"},{"lineNumber":28,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":29,"author":{"gitId":"chengjunyuan"},"content":"[[github](https://github.com/chengjunyuan)] [[linkedin](https://www.linkedin.com/in/jun-yuan-cheng-2867931a9/)]","lastModifiedDate":"2024-03-07"},{"lineNumber":30,"author":{"gitId":"chengjunyuan"},"content":"","lastModifiedDate":"2024-03-07"},{"lineNumber":31,"author":{"gitId":"chengjunyuan"},"content":"Interested in computational biology and bioinformatics!","lastModifiedDate":"2024-03-07"},{"lineNumber":32,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":33,"author":{"gitId":"-"},"content":"* Role: Team Lead","lastModifiedDate":"2020-05-23"},{"lineNumber":34,"author":{"gitId":"-"},"content":"* Responsibilities: UI","lastModifiedDate":"2020-05-23"},{"lineNumber":35,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":36,"author":{"gitId":"minreiseah"},"content":"### Min Rei","lastModifiedDate":"2024-03-07"},{"lineNumber":37,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":38,"author":{"gitId":"minreiseah"},"content":"\u003cimg src\u003d\"images/minreiseah.png\" width\u003d\"200px\"\u003e","lastModifiedDate":"2024-03-07"},{"lineNumber":39,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":40,"author":{"gitId":"minreiseah"},"content":"[[github](http://github.com/minreiseah)] [[portfolio](team/minrei.md)]","lastModifiedDate":"2024-03-07"},{"lineNumber":41,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":42,"author":{"gitId":"-"},"content":"* Role: Developer","lastModifiedDate":"2020-05-23"},{"lineNumber":43,"author":{"gitId":"-"},"content":"* Responsibilities: Data","lastModifiedDate":"2020-05-23"},{"lineNumber":44,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":45,"author":{"gitId":"minreiseah"},"content":"### Sampson","lastModifiedDate":"2024-03-07"},{"lineNumber":46,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":47,"author":{"gitId":"SampsonYe1999"},"content":"\u003cimg src\u003d\"images/sampsonye1999.png\" width\u003d\"200px\"\u003e","lastModifiedDate":"2024-03-07"},{"lineNumber":48,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":49,"author":{"gitId":"SampsonYe1999"},"content":"[[github](http://github.com/SampsonYe1999)]","lastModifiedDate":"2024-03-07"},{"lineNumber":50,"author":{"gitId":"SampsonYe1999"},"content":"[[portfolio](team/sampsonye.md)]","lastModifiedDate":"2024-03-07"},{"lineNumber":51,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":52,"author":{"gitId":"-"},"content":"* Role: Developer","lastModifiedDate":"2020-05-23"},{"lineNumber":53,"author":{"gitId":"-"},"content":"* Responsibilities: Dev Ops + Threading","lastModifiedDate":"2020-05-23"},{"lineNumber":54,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":55,"author":{"gitId":"minreiseah"},"content":"### Shuyuan","lastModifiedDate":"2024-03-07"},{"lineNumber":56,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":57,"author":{"gitId":"legionlegion"},"content":"\u003cimg src\u003d\"images/legionlegion.png\" width\u003d\"200px\"\u003e","lastModifiedDate":"2024-03-07"},{"lineNumber":58,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":59,"author":{"gitId":"legionlegion"},"content":"[[github](http://github.com/legionlegion)]","lastModifiedDate":"2024-03-07"},{"lineNumber":60,"author":{"gitId":"legionlegion"},"content":"[[portfolio](team/legionlegion.md)]","lastModifiedDate":"2024-03-07"},{"lineNumber":61,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":62,"author":{"gitId":"-"},"content":"* Role: Developer","lastModifiedDate":"2020-05-23"},{"lineNumber":63,"author":{"gitId":"-"},"content":"* Responsibilities: UI","lastModifiedDate":"2020-05-23"}],"authorContributionMap":{"legionlegion":3,"minreiseah":10,"chengjunyuan":4,"-":43,"SampsonYe1999":3}}] +[{"path":"README.md","fileType":"docs","lines":[{"lineNumber":1,"author":{"gitId":"qinboan"},"content":"# RAPID TRACER","lastModifiedDate":"2024-03-08"},{"lineNumber":2,"author":{"gitId":"-"},"content":"[![codecov](https://codecov.io/gh/AY2324S2-CS2103T-T10-2/tp/graph/badge.svg?token\u003d1R92MZ3PFL)](https://codecov.io/gh/AY2324S2-CS2103T-T10-2/tp)","lastModifiedDate":"2024-02-21"},{"lineNumber":3,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2024-02-21"},{"lineNumber":4,"author":{"gitId":"qinboan"},"content":"[![CI Status](https://github.com/AY2324S2-CS2103T-T10-2/tp/workflows/Java%20CI/badge.svg)](https://github.com/AY2324S2-CS2103T-T10-2/tp/actions)","lastModifiedDate":"2024-03-08"},{"lineNumber":5,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":6,"author":{"gitId":"-"},"content":"![Ui](docs/images/Ui.png)","lastModifiedDate":"2020-05-23"},{"lineNumber":7,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":8,"author":{"gitId":"qinboan"},"content":"## Introduction","lastModifiedDate":"2024-03-08"},{"lineNumber":9,"author":{"gitId":"qinboan"},"content":"","lastModifiedDate":"2024-03-08"},{"lineNumber":10,"author":{"gitId":"qinboan"},"content":"RapidTracer is a pioneering software solution designed specifically for healthcare professionals like Mr. Surya, a seasoned clinical clerk. In environments where rapid and accurate contact tracing is crucial for controlling infectious disease outbreaks, RapidTracer stands out as a vital tool.","lastModifiedDate":"2024-03-08"},{"lineNumber":11,"author":{"gitId":"qinboan"},"content":"","lastModifiedDate":"2024-03-08"},{"lineNumber":12,"author":{"gitId":"qinboan"},"content":"## Background","lastModifiedDate":"2024-03-08"},{"lineNumber":13,"author":{"gitId":"qinboan"},"content":"","lastModifiedDate":"2024-03-08"},{"lineNumber":14,"author":{"gitId":"qinboan"},"content":"Mr. Surya, a clinical counter clerk, faces daily challenges in managing extensive patient data and identifying potential transmission chains swiftly. His responsibilities include:","lastModifiedDate":"2024-03-08"},{"lineNumber":15,"author":{"gitId":"qinboan"},"content":"","lastModifiedDate":"2024-03-08"},{"lineNumber":16,"author":{"gitId":"qinboan"},"content":"- Administering administrative tasks and contact tracing for both patients and staff.","lastModifiedDate":"2024-03-08"},{"lineNumber":17,"author":{"gitId":"qinboan"},"content":"- Handling large volumes of patient data including contact histories, contact numbers, and dates of visit.","lastModifiedDate":"2024-03-08"},{"lineNumber":18,"author":{"gitId":"qinboan"},"content":"- Rapidly identifying potential transmission chains to prevent outbreaks within the community.","lastModifiedDate":"2024-03-08"},{"lineNumber":19,"author":{"gitId":"qinboan"},"content":"","lastModifiedDate":"2024-03-08"},{"lineNumber":20,"author":{"gitId":"qinboan"},"content":"An expert in navigating excel sheets, Mr. Surya requires a solution that complements his fast typing skills and allows for quick navigation and manipulation of datasets, preferably using keyboard commands for enhanced efficiency.","lastModifiedDate":"2024-03-08"},{"lineNumber":21,"author":{"gitId":"qinboan"},"content":"","lastModifiedDate":"2024-03-08"},{"lineNumber":22,"author":{"gitId":"qinboan"},"content":"## Value Proposition","lastModifiedDate":"2024-03-08"},{"lineNumber":23,"author":{"gitId":"qinboan"},"content":"","lastModifiedDate":"2024-03-08"},{"lineNumber":24,"author":{"gitId":"qinboan"},"content":"RapidTracer offers a unique solution, combining a simple and intuitive Graphical User Interface (GUI) with a keyboard-driven interface reminiscent of Vim’s efficiency. It is tailored to meet the specific needs of healthcare professionals engaged in contact tracing. Our solution stands out by:","lastModifiedDate":"2024-03-08"},{"lineNumber":25,"author":{"gitId":"qinboan"},"content":"","lastModifiedDate":"2024-03-08"},{"lineNumber":26,"author":{"gitId":"qinboan"},"content":"- Providing a user-friendly tool that is more efficient than traditional Excel spreadsheets for managing large volumes of patient records and data.","lastModifiedDate":"2024-03-08"},{"lineNumber":27,"author":{"gitId":"qinboan"},"content":"- Offering swift navigation through complex patient data and contact histories, catering specifically to the needs of users like Dr. Surya.","lastModifiedDate":"2024-03-08"},{"lineNumber":28,"author":{"gitId":"qinboan"},"content":"- Ensuring a keyboard-driven interface that enhances speed and reduces reliance on a mouse.","lastModifiedDate":"2024-03-08"},{"lineNumber":29,"author":{"gitId":"qinboan"},"content":"- Supporting the loading and storing of large datasets, crucial for comprehensive contact tracing.","lastModifiedDate":"2024-03-08"},{"lineNumber":30,"author":{"gitId":"qinboan"},"content":"- Optimizing workflows to reduce administrative burdens, allowing healthcare professionals to focus more on critical aspects of patient care and outbreak management.","lastModifiedDate":"2024-03-08"},{"lineNumber":31,"author":{"gitId":"qinboan"},"content":"","lastModifiedDate":"2024-03-08"},{"lineNumber":32,"author":{"gitId":"qinboan"},"content":"RapidTracer is not just a tool; it\u0027s an extension of the healthcare professional’s workflow, enhancing public health responses and significantly simplifying the process of contact tracing.","lastModifiedDate":"2024-03-08"},{"lineNumber":33,"author":{"gitId":"qinboan"},"content":"","lastModifiedDate":"2024-03-08"},{"lineNumber":34,"author":{"gitId":"qinboan"},"content":"","lastModifiedDate":"2024-03-08"},{"lineNumber":35,"author":{"gitId":"qinboan"},"content":"## Features","lastModifiedDate":"2024-03-08"},{"lineNumber":36,"author":{"gitId":"qinboan"},"content":"","lastModifiedDate":"2024-03-08"},{"lineNumber":37,"author":{"gitId":"qinboan"},"content":"- **Intuitive GUI**: Easy to navigate and designed for efficiency.","lastModifiedDate":"2024-03-08"},{"lineNumber":38,"author":{"gitId":"qinboan"},"content":"- **Keyboard-Driven Commands**: Tailored for fast typers, reducing the need for a mouse.","lastModifiedDate":"2024-03-08"},{"lineNumber":39,"author":{"gitId":"qinboan"},"content":"- **Efficient Data Management**: Streamlines handling of large datasets.","lastModifiedDate":"2024-03-08"},{"lineNumber":40,"author":{"gitId":"qinboan"},"content":"- **Optimized Contact Tracing Workflows**: Focuses on key functionalities needed in a clinical setting.","lastModifiedDate":"2024-03-08"},{"lineNumber":41,"author":{"gitId":"qinboan"},"content":"- **Vim-like Efficiency**: Familiar to those comfortable with keyboard shortcuts.","lastModifiedDate":"2024-03-08"},{"lineNumber":42,"author":{"gitId":"qinboan"},"content":"","lastModifiedDate":"2024-03-08"},{"lineNumber":43,"author":{"gitId":"qinboan"},"content":"## License","lastModifiedDate":"2024-03-08"},{"lineNumber":44,"author":{"gitId":"qinboan"},"content":"","lastModifiedDate":"2024-03-08"},{"lineNumber":45,"author":{"gitId":"qinboan"},"content":"MIT License","lastModifiedDate":"2024-03-08"},{"lineNumber":46,"author":{"gitId":"qinboan"},"content":"","lastModifiedDate":"2024-03-08"},{"lineNumber":47,"author":{"gitId":"qinboan"},"content":"## Contact","lastModifiedDate":"2024-03-08"},{"lineNumber":48,"author":{"gitId":"qinboan"},"content":"","lastModifiedDate":"2024-03-08"},{"lineNumber":49,"author":{"gitId":"qinboan"},"content":"For support or inquiries, please contact us at minrei.seah@u.nus.edu.","lastModifiedDate":"2024-03-08"},{"lineNumber":50,"author":{"gitId":"qinboan"},"content":"","lastModifiedDate":"2024-03-08"},{"lineNumber":51,"author":{"gitId":"qinboan"},"content":"---","lastModifiedDate":"2024-03-08"},{"lineNumber":52,"author":{"gitId":"qinboan"},"content":"","lastModifiedDate":"2024-03-08"},{"lineNumber":53,"author":{"gitId":"qinboan"},"content":"RapidTracer – Empowering healthcare professionals in the fight against infectious diseases.","lastModifiedDate":"2024-03-08"},{"lineNumber":54,"author":{"gitId":"qinboan"},"content":"","lastModifiedDate":"2024-03-08"},{"lineNumber":55,"author":{"gitId":"qinboan"},"content":"This project is based on the AddressBook-Level3 project created by the [SE-EDU initiative](https://se-education.org).","lastModifiedDate":"2024-03-08"}],"authorContributionMap":{"qinboan":50,"-":5}},{"path":"docs/AboutUs.md","fileType":"docs","lines":[{"lineNumber":1,"author":{"gitId":"-"},"content":"---","lastModifiedDate":"2020-05-23"},{"lineNumber":2,"author":{"gitId":"-"},"content":" layout: default.md","lastModifiedDate":"2023-09-12"},{"lineNumber":3,"author":{"gitId":"-"},"content":" title: \"About Us\"","lastModifiedDate":"2023-09-12"},{"lineNumber":4,"author":{"gitId":"-"},"content":"---","lastModifiedDate":"2020-05-23"},{"lineNumber":5,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":6,"author":{"gitId":"-"},"content":"# About Us","lastModifiedDate":"2023-09-12"},{"lineNumber":7,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2023-09-12"},{"lineNumber":8,"author":{"gitId":"minreiseah"},"content":"We are a team based in the [School of Computing, National University of Singapore](http://www.comp.nus.edu.sg). To learn good software engineering practies, we have different team leads each week. This week\u0027s team lead is Shuyuan.","lastModifiedDate":"2024-03-07"},{"lineNumber":9,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":10,"author":{"gitId":"-"},"content":"You can reach us at the email `seer[at]comp.nus.edu.sg`","lastModifiedDate":"2020-06-17"},{"lineNumber":11,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-06-17"},{"lineNumber":12,"author":{"gitId":"-"},"content":"## Project team","lastModifiedDate":"2020-06-07"},{"lineNumber":13,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":14,"author":{"gitId":"minreiseah"},"content":"### Boan","lastModifiedDate":"2024-03-07"},{"lineNumber":15,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":16,"author":{"gitId":"qinboan"},"content":"\u003cimg src\u003d\"images/qinboan.png\" width\u003d\"200px\"\u003e","lastModifiedDate":"2024-03-08"},{"lineNumber":17,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":18,"author":{"gitId":"-"},"content":"[[homepage](http://www.comp.nus.edu.sg/~damithch)]","lastModifiedDate":"2020-05-23"},{"lineNumber":19,"author":{"gitId":"qinboan"},"content":"[[github](https://github.com/qinboan)]","lastModifiedDate":"2024-03-08"},{"lineNumber":20,"author":{"gitId":"-"},"content":"[[portfolio](team/johndoe.md)]","lastModifiedDate":"2020-05-23"},{"lineNumber":21,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":22,"author":{"gitId":"minreiseah"},"content":"* Role: Algorithms \u0026 Data Structures","lastModifiedDate":"2024-03-07"},{"lineNumber":23,"author":{"gitId":"minreiseah"},"content":"* Responsibilities: Algorithms \u0026 Data Structures","lastModifiedDate":"2024-03-07"},{"lineNumber":24,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":25,"author":{"gitId":"minreiseah"},"content":"### Jun Yuan","lastModifiedDate":"2024-03-07"},{"lineNumber":26,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":27,"author":{"gitId":"chengjunyuan"},"content":"\u003cimg src\u003d\"images/chengjunyuan.png\" width\u003d\"200px\"\u003e","lastModifiedDate":"2024-03-07"},{"lineNumber":28,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":29,"author":{"gitId":"chengjunyuan"},"content":"[[github](https://github.com/chengjunyuan)] [[linkedin](https://www.linkedin.com/in/jun-yuan-cheng-2867931a9/)]","lastModifiedDate":"2024-03-07"},{"lineNumber":30,"author":{"gitId":"chengjunyuan"},"content":"","lastModifiedDate":"2024-03-07"},{"lineNumber":31,"author":{"gitId":"chengjunyuan"},"content":"Interested in computational biology and bioinformatics!","lastModifiedDate":"2024-03-07"},{"lineNumber":32,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":33,"author":{"gitId":"-"},"content":"* Role: Team Lead","lastModifiedDate":"2020-05-23"},{"lineNumber":34,"author":{"gitId":"-"},"content":"* Responsibilities: UI","lastModifiedDate":"2020-05-23"},{"lineNumber":35,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":36,"author":{"gitId":"minreiseah"},"content":"### Min Rei","lastModifiedDate":"2024-03-07"},{"lineNumber":37,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":38,"author":{"gitId":"minreiseah"},"content":"\u003cimg src\u003d\"images/minreiseah.png\" width\u003d\"200px\"\u003e","lastModifiedDate":"2024-03-07"},{"lineNumber":39,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":40,"author":{"gitId":"minreiseah"},"content":"[[github](http://github.com/minreiseah)] [[portfolio](team/minrei.md)]","lastModifiedDate":"2024-03-07"},{"lineNumber":41,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":42,"author":{"gitId":"-"},"content":"* Role: Developer","lastModifiedDate":"2020-05-23"},{"lineNumber":43,"author":{"gitId":"-"},"content":"* Responsibilities: Data","lastModifiedDate":"2020-05-23"},{"lineNumber":44,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":45,"author":{"gitId":"minreiseah"},"content":"### Sampson","lastModifiedDate":"2024-03-07"},{"lineNumber":46,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":47,"author":{"gitId":"SampsonYe1999"},"content":"\u003cimg src\u003d\"images/sampsonye1999.png\" width\u003d\"200px\"\u003e","lastModifiedDate":"2024-03-07"},{"lineNumber":48,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":49,"author":{"gitId":"SampsonYe1999"},"content":"[[github](http://github.com/SampsonYe1999)]","lastModifiedDate":"2024-03-07"},{"lineNumber":50,"author":{"gitId":"SampsonYe1999"},"content":"[[portfolio](team/sampsonye.md)]","lastModifiedDate":"2024-03-07"},{"lineNumber":51,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":52,"author":{"gitId":"-"},"content":"* Role: Developer","lastModifiedDate":"2020-05-23"},{"lineNumber":53,"author":{"gitId":"-"},"content":"* Responsibilities: Dev Ops + Threading","lastModifiedDate":"2020-05-23"},{"lineNumber":54,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":55,"author":{"gitId":"minreiseah"},"content":"### Shuyuan","lastModifiedDate":"2024-03-07"},{"lineNumber":56,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":57,"author":{"gitId":"legionlegion"},"content":"\u003cimg src\u003d\"images/legionlegion.png\" width\u003d\"200px\"\u003e","lastModifiedDate":"2024-03-07"},{"lineNumber":58,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":59,"author":{"gitId":"legionlegion"},"content":"[[github](http://github.com/legionlegion)]","lastModifiedDate":"2024-03-07"},{"lineNumber":60,"author":{"gitId":"legionlegion"},"content":"[[portfolio](team/legionlegion.md)]","lastModifiedDate":"2024-03-07"},{"lineNumber":61,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":62,"author":{"gitId":"-"},"content":"* Role: Developer","lastModifiedDate":"2020-05-23"},{"lineNumber":63,"author":{"gitId":"-"},"content":"* Responsibilities: UI","lastModifiedDate":"2020-05-23"}],"authorContributionMap":{"legionlegion":3,"minreiseah":10,"qinboan":2,"chengjunyuan":4,"-":41,"SampsonYe1999":3}},{"path":"docs/DevOps.md","fileType":"docs","lines":[{"lineNumber":1,"author":{"gitId":"-"},"content":"---","lastModifiedDate":"2020-05-23"},{"lineNumber":2,"author":{"gitId":"-"},"content":" layout: default.md","lastModifiedDate":"2023-09-12"},{"lineNumber":3,"author":{"gitId":"-"},"content":" title: \"DevOps guide\"","lastModifiedDate":"2023-09-12"},{"lineNumber":4,"author":{"gitId":"-"},"content":" pageNav: 3","lastModifiedDate":"2023-09-12"},{"lineNumber":5,"author":{"gitId":"-"},"content":"---","lastModifiedDate":"2020-05-23"},{"lineNumber":6,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":7,"author":{"gitId":"-"},"content":"# DevOps guide","lastModifiedDate":"2023-09-12"},{"lineNumber":8,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":9,"author":{"gitId":"-"},"content":"\u003c!-- * Table of Contents --\u003e","lastModifiedDate":"2023-09-12"},{"lineNumber":10,"author":{"gitId":"-"},"content":"\u003cpage-nav-print /\u003e","lastModifiedDate":"2023-09-12"},{"lineNumber":11,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2023-09-12"},{"lineNumber":12,"author":{"gitId":"-"},"content":"\u003c!-- -------------------------------------------------------------------------------------------------------------------- --\u003e","lastModifiedDate":"2023-09-12"},{"lineNumber":13,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":14,"author":{"gitId":"minreiseah"},"content":"## Github Forking Workflow","lastModifiedDate":"2024-03-07"},{"lineNumber":15,"author":{"gitId":"minreiseah"},"content":"","lastModifiedDate":"2024-03-07"},{"lineNumber":16,"author":{"gitId":"minreiseah"},"content":"### Making Changes","lastModifiedDate":"2024-03-07"},{"lineNumber":17,"author":{"gitId":"minreiseah"},"content":"1. Create branch on fork (local)","lastModifiedDate":"2024-03-07"},{"lineNumber":18,"author":{"gitId":"minreiseah"},"content":"2. Push branch to fork (remote: github)","lastModifiedDate":"2024-03-07"},{"lineNumber":19,"author":{"gitId":"minreiseah"},"content":"3. Create pr from fork (remote) to main (remote)","lastModifiedDate":"2024-03-07"},{"lineNumber":20,"author":{"gitId":"minreiseah"},"content":"4. Merge pr onto main (remote)","lastModifiedDate":"2024-03-07"},{"lineNumber":21,"author":{"gitId":"minreiseah"},"content":"","lastModifiedDate":"2024-03-07"},{"lineNumber":22,"author":{"gitId":"minreiseah"},"content":"Note:","lastModifiedDate":"2024-03-07"},{"lineNumber":23,"author":{"gitId":"minreiseah"},"content":"- When to create PRs? ONLY from FORK\u0027s feature-branch to MAIN. there is no need to make PRs WITHIN the fork, only from fork -\u003e main.","lastModifiedDate":"2024-03-07"},{"lineNumber":24,"author":{"gitId":"minreiseah"},"content":"","lastModifiedDate":"2024-03-07"},{"lineNumber":25,"author":{"gitId":"minreiseah"},"content":"### Updating Local Fork","lastModifiedDate":"2024-03-07"},{"lineNumber":26,"author":{"gitId":"minreiseah"},"content":"1. First, ensure that you did git remote add upstream https://github.com/AY2324S2-CS2103T-T10-2/tp.git","lastModifiedDate":"2024-03-07"},{"lineNumber":27,"author":{"gitId":"minreiseah"},"content":" - So now you have two remotes on github (origin: the fork, upstream: the main)","lastModifiedDate":"2024-03-07"},{"lineNumber":28,"author":{"gitId":"minreiseah"},"content":"2. To update your local forked branch: git pull upstream main. ","lastModifiedDate":"2024-03-07"},{"lineNumber":29,"author":{"gitId":"minreiseah"},"content":" - If you\u0027re working on a branch, then make sure you merge changes from main to that branch; i.e. git checkout that branch, then git merge main.","lastModifiedDate":"2024-03-07"},{"lineNumber":30,"author":{"gitId":"minreiseah"},"content":"3. Once you\u0027re ready, just push the BRANCH to your fork (remote).","lastModifiedDate":"2024-03-07"},{"lineNumber":31,"author":{"gitId":"minreiseah"},"content":"","lastModifiedDate":"2024-03-07"},{"lineNumber":32,"author":{"gitId":"-"},"content":"## Build automation","lastModifiedDate":"2020-05-23"},{"lineNumber":33,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":34,"author":{"gitId":"-"},"content":"This project uses Gradle for **build automation and dependency management**. **You are recommended to read [this Gradle Tutorial from the se-edu/guides](https://se-education.org/guides/tutorials/gradle.html)**.","lastModifiedDate":"2020-06-07"},{"lineNumber":35,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-26"},{"lineNumber":36,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-26"},{"lineNumber":37,"author":{"gitId":"-"},"content":"Given below are how to use Gradle for some important project tasks.","lastModifiedDate":"2020-05-26"},{"lineNumber":38,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-26"},{"lineNumber":39,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-26"},{"lineNumber":40,"author":{"gitId":"-"},"content":"* **`clean`**: Deletes the files created during the previous build tasks (e.g. files in the `build` folder).\u003cbr\u003e","lastModifiedDate":"2020-05-26"},{"lineNumber":41,"author":{"gitId":"-"},"content":" e.g. `./gradlew clean`","lastModifiedDate":"2020-05-26"},{"lineNumber":42,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-26"},{"lineNumber":43,"author":{"gitId":"-"},"content":"* **`shadowJar`**: Uses the ShadowJar plugin to creat a fat JAR file in the `build/lib` folder, *if the current file is outdated*.\u003cbr\u003e","lastModifiedDate":"2020-05-26"},{"lineNumber":44,"author":{"gitId":"-"},"content":" e.g. `./gradlew shadowJar`.","lastModifiedDate":"2020-05-26"},{"lineNumber":45,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-26"},{"lineNumber":46,"author":{"gitId":"-"},"content":"* **`run`**: Builds and runs the application.\u003cbr\u003e","lastModifiedDate":"2020-05-26"},{"lineNumber":47,"author":{"gitId":"-"},"content":" **`runShadow`**: Builds the application as a fat JAR, and then runs it.","lastModifiedDate":"2020-05-26"},{"lineNumber":48,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-26"},{"lineNumber":49,"author":{"gitId":"-"},"content":"* **`checkstyleMain`**: Runs the code style check for the main code base.\u003cbr\u003e","lastModifiedDate":"2020-05-26"},{"lineNumber":50,"author":{"gitId":"-"},"content":" **`checkstyleTest`**: Runs the code style check for the test code base.","lastModifiedDate":"2020-05-26"},{"lineNumber":51,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-26"},{"lineNumber":52,"author":{"gitId":"-"},"content":"* **`test`**: Runs all tests.","lastModifiedDate":"2023-01-01"},{"lineNumber":53,"author":{"gitId":"-"},"content":" * `./gradlew test` — Runs all tests","lastModifiedDate":"2020-05-26"},{"lineNumber":54,"author":{"gitId":"-"},"content":" * `./gradlew clean test` — Cleans the project and runs tests","lastModifiedDate":"2020-05-26"},{"lineNumber":55,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":56,"author":{"gitId":"-"},"content":"--------------------------------------------------------------------------------------------------------------------","lastModifiedDate":"2020-05-23"},{"lineNumber":57,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":58,"author":{"gitId":"-"},"content":"## Continuous integration (CI)","lastModifiedDate":"2020-05-23"},{"lineNumber":59,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":60,"author":{"gitId":"-"},"content":"This project uses GitHub Actions for CI. The project comes with the necessary GitHub Actions configurations files (in the `.github/workflows` folder). No further setting up required.","lastModifiedDate":"2020-05-23"},{"lineNumber":61,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":62,"author":{"gitId":"-"},"content":"### Code coverage","lastModifiedDate":"2020-08-07"},{"lineNumber":63,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-08-07"},{"lineNumber":64,"author":{"gitId":"-"},"content":"As part of CI, this project uses Codecov to generate coverage reports. When CI runs, it will generate code coverage data (based on the tests run by CI) and upload that data to the CodeCov website, which in turn can provide you more info about the coverage of your tests.","lastModifiedDate":"2023-02-02"},{"lineNumber":65,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-08-07"},{"lineNumber":66,"author":{"gitId":"-"},"content":"However, because Codecov is known to run into intermittent problems (e.g., report upload fails) due to issues on the Codecov service side, the CI is configured to pass even if the Codecov task failed. Therefore, developers are advised to check the code coverage levels periodically and take corrective actions if the coverage level falls below desired levels.","lastModifiedDate":"2023-02-02"},{"lineNumber":67,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-08-07"},{"lineNumber":68,"author":{"gitId":"-"},"content":"To enable Codecov for forks of this project, follow the steps given in [this se-edu guide](https://se-education.org/guides/tutorials/codecov.html).","lastModifiedDate":"2023-02-02"},{"lineNumber":69,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2023-01-01"},{"lineNumber":70,"author":{"gitId":"-"},"content":"### Repository-wide checks","lastModifiedDate":"2020-07-28"},{"lineNumber":71,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-07-28"},{"lineNumber":72,"author":{"gitId":"-"},"content":"In addition to running Gradle checks, CI includes some repository-wide checks. Unlike the Gradle checks which only cover files used in the build process, these repository-wide checks cover all files in the repository. They check for repository rules which are hard to enforce on development machines such as line ending requirements.","lastModifiedDate":"2020-07-28"},{"lineNumber":73,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-07-28"},{"lineNumber":74,"author":{"gitId":"-"},"content":"These checks are implemented as POSIX shell scripts, and thus can only be run on POSIX-compliant operating systems such as macOS and Linux. To run all checks locally on these operating systems, execute the following in the repository root directory:","lastModifiedDate":"2020-07-28"},{"lineNumber":75,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-07-28"},{"lineNumber":76,"author":{"gitId":"-"},"content":"`./config/travis/run-checks.sh`","lastModifiedDate":"2020-07-28"},{"lineNumber":77,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-07-28"},{"lineNumber":78,"author":{"gitId":"-"},"content":"Any warnings or errors will be printed out to the console.","lastModifiedDate":"2020-07-28"},{"lineNumber":79,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-07-28"},{"lineNumber":80,"author":{"gitId":"-"},"content":"**If adding new checks:**","lastModifiedDate":"2020-07-28"},{"lineNumber":81,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-07-28"},{"lineNumber":82,"author":{"gitId":"-"},"content":"* Checks are implemented as executable `check-*` scripts within the `.github` directory. The `run-checks.sh` script will automatically pick up and run files named as such. That is, you can add more such files if you need and the CI will do the rest.","lastModifiedDate":"2020-07-28"},{"lineNumber":83,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-07-28"},{"lineNumber":84,"author":{"gitId":"-"},"content":"* Check scripts should print out errors in the format `SEVERITY:FILENAME:LINE: MESSAGE`","lastModifiedDate":"2020-07-28"},{"lineNumber":85,"author":{"gitId":"-"},"content":" * SEVERITY is either ERROR or WARN.","lastModifiedDate":"2020-07-28"},{"lineNumber":86,"author":{"gitId":"-"},"content":" * FILENAME is the path to the file relative to the current directory.","lastModifiedDate":"2020-07-28"},{"lineNumber":87,"author":{"gitId":"-"},"content":" * LINE is the line of the file where the error occurred and MESSAGE is the message explaining the error.","lastModifiedDate":"2020-07-28"},{"lineNumber":88,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-07-28"},{"lineNumber":89,"author":{"gitId":"-"},"content":"* Check scripts must exit with a non-zero exit code if any errors occur.","lastModifiedDate":"2020-07-28"},{"lineNumber":90,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-07-28"},{"lineNumber":91,"author":{"gitId":"-"},"content":"--------------------------------------------------------------------------------------------------------------------","lastModifiedDate":"2020-05-23"},{"lineNumber":92,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":93,"author":{"gitId":"-"},"content":"## Making a release","lastModifiedDate":"2020-05-23"},{"lineNumber":94,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":95,"author":{"gitId":"-"},"content":"Here are the steps to create a new release.","lastModifiedDate":"2020-05-23"},{"lineNumber":96,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":97,"author":{"gitId":"-"},"content":"1. Update the version number in [`MainApp.java`](https://github.com/se-edu/addressbook-level3/tree/master/src/main/java/seedu/address/MainApp.java).","lastModifiedDate":"2020-05-23"},{"lineNumber":98,"author":{"gitId":"-"},"content":"1. Generate a fat JAR file using Gradle (i.e., `gradlew shadowJar`).","lastModifiedDate":"2021-08-30"},{"lineNumber":99,"author":{"gitId":"-"},"content":"1. Tag the repo with the version number. e.g. `v0.1`","lastModifiedDate":"2020-05-23"},{"lineNumber":100,"author":{"gitId":"-"},"content":"1. [Create a new release using GitHub](https://help.github.com/articles/creating-releases/). Upload the JAR file you created.","lastModifiedDate":"2020-05-26"}],"authorContributionMap":{"minreiseah":18,"-":82}},{"path":"docs/DeveloperGuide.md","fileType":"docs","lines":[{"lineNumber":1,"author":{"gitId":"-"},"content":"---","lastModifiedDate":"2020-05-23"},{"lineNumber":2,"author":{"gitId":"-"},"content":" layout: default.md","lastModifiedDate":"2023-09-12"},{"lineNumber":3,"author":{"gitId":"-"},"content":" title: \"Developer Guide\"","lastModifiedDate":"2023-09-12"},{"lineNumber":4,"author":{"gitId":"-"},"content":" pageNav: 3","lastModifiedDate":"2023-09-12"},{"lineNumber":5,"author":{"gitId":"-"},"content":"---","lastModifiedDate":"2020-05-23"},{"lineNumber":6,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2023-09-12"},{"lineNumber":7,"author":{"gitId":"chengjunyuan"},"content":"# Rapid Tracer Developer Guide","lastModifiedDate":"2024-03-07"},{"lineNumber":8,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2023-09-12"},{"lineNumber":9,"author":{"gitId":"-"},"content":"\u003c!-- * Table of Contents --\u003e","lastModifiedDate":"2023-09-12"},{"lineNumber":10,"author":{"gitId":"-"},"content":"\u003cpage-nav-print /\u003e","lastModifiedDate":"2023-09-12"},{"lineNumber":11,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":12,"author":{"gitId":"-"},"content":"--------------------------------------------------------------------------------------------------------------------","lastModifiedDate":"2020-05-23"},{"lineNumber":13,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2021-07-30"},{"lineNumber":14,"author":{"gitId":"-"},"content":"## **Acknowledgements**","lastModifiedDate":"2021-07-30"},{"lineNumber":15,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2021-07-30"},{"lineNumber":16,"author":{"gitId":"chengjunyuan"},"content":"This project was adapted from [AB3](https://se-education.org/addressbook-level3/), the source code of which can be found [here](https://github.com/nus-cs2103-AY2324S2/tp).","lastModifiedDate":"2024-03-08"},{"lineNumber":17,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2021-07-30"},{"lineNumber":18,"author":{"gitId":"-"},"content":"--------------------------------------------------------------------------------------------------------------------","lastModifiedDate":"2021-07-30"},{"lineNumber":19,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":20,"author":{"gitId":"-"},"content":"## **Setting up, getting started**","lastModifiedDate":"2020-05-23"},{"lineNumber":21,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":22,"author":{"gitId":"-"},"content":"Refer to the guide [_Setting up and getting started_](SettingUp.md).","lastModifiedDate":"2020-05-23"},{"lineNumber":23,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":24,"author":{"gitId":"-"},"content":"--------------------------------------------------------------------------------------------------------------------","lastModifiedDate":"2020-05-23"},{"lineNumber":25,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":26,"author":{"gitId":"-"},"content":"## **Design**","lastModifiedDate":"2020-05-23"},{"lineNumber":27,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":28,"author":{"gitId":"-"},"content":"### Architecture","lastModifiedDate":"2021-07-31"},{"lineNumber":29,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":30,"author":{"gitId":"-"},"content":"\u003cpuml src\u003d\"diagrams/ArchitectureDiagram.puml\" width\u003d\"280\" /\u003e","lastModifiedDate":"2023-09-12"},{"lineNumber":31,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":32,"author":{"gitId":"-"},"content":"The ***Architecture Diagram*** given above explains the high-level design of the App.","lastModifiedDate":"2021-07-31"},{"lineNumber":33,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":34,"author":{"gitId":"-"},"content":"Given below is a quick overview of main components and how they interact with each other.","lastModifiedDate":"2021-07-31"},{"lineNumber":35,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2021-07-31"},{"lineNumber":36,"author":{"gitId":"-"},"content":"**Main components of the architecture**","lastModifiedDate":"2021-07-31"},{"lineNumber":37,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":38,"author":{"gitId":"-"},"content":"**`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.","lastModifiedDate":"2023-09-03"},{"lineNumber":39,"author":{"gitId":"-"},"content":"* At app launch, it initializes the other components in the correct sequence, and connects them up with each other.","lastModifiedDate":"2023-09-03"},{"lineNumber":40,"author":{"gitId":"-"},"content":"* At shut down, it shuts down the other components and invokes cleanup methods where necessary.","lastModifiedDate":"2023-09-03"},{"lineNumber":41,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":42,"author":{"gitId":"-"},"content":"The bulk of the app\u0027s work is done by the following four components:","lastModifiedDate":"2023-09-03"},{"lineNumber":43,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":44,"author":{"gitId":"-"},"content":"* [**`UI`**](#ui-component): The UI of the App.","lastModifiedDate":"2020-05-23"},{"lineNumber":45,"author":{"gitId":"-"},"content":"* [**`Logic`**](#logic-component): The command executor.","lastModifiedDate":"2020-05-23"},{"lineNumber":46,"author":{"gitId":"-"},"content":"* [**`Model`**](#model-component): Holds the data of the App in memory.","lastModifiedDate":"2020-05-23"},{"lineNumber":47,"author":{"gitId":"-"},"content":"* [**`Storage`**](#storage-component): Reads data from, and writes data to, the hard disk.","lastModifiedDate":"2020-05-23"},{"lineNumber":48,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":49,"author":{"gitId":"-"},"content":"[**`Commons`**](#common-classes) represents a collection of classes used by multiple other components.","lastModifiedDate":"2023-09-03"},{"lineNumber":50,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":51,"author":{"gitId":"-"},"content":"**How the architecture components interact with each other**","lastModifiedDate":"2020-05-23"},{"lineNumber":52,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":53,"author":{"gitId":"-"},"content":"The *Sequence Diagram* below shows how the components interact with each other for the scenario where the user issues the command `delete 1`.","lastModifiedDate":"2020-05-23"},{"lineNumber":54,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":55,"author":{"gitId":"-"},"content":"\u003cpuml src\u003d\"diagrams/ArchitectureSequenceDiagram.puml\" width\u003d\"574\" /\u003e","lastModifiedDate":"2023-09-12"},{"lineNumber":56,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":57,"author":{"gitId":"-"},"content":"Each of the four main components (also shown in the diagram above),","lastModifiedDate":"2021-07-31"},{"lineNumber":58,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2021-07-31"},{"lineNumber":59,"author":{"gitId":"-"},"content":"* defines its *API* in an `interface` with the same name as the Component.","lastModifiedDate":"2021-07-31"},{"lineNumber":60,"author":{"gitId":"-"},"content":"* implements its functionality using a concrete `{Component Name}Manager` class (which follows the corresponding API `interface` mentioned in the previous point.","lastModifiedDate":"2021-07-31"},{"lineNumber":61,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2021-07-31"},{"lineNumber":62,"author":{"gitId":"-"},"content":"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\u0027s being coupled to the implementation of a component), as illustrated in the (partial) class diagram below.","lastModifiedDate":"2021-07-31"},{"lineNumber":63,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2021-07-31"},{"lineNumber":64,"author":{"gitId":"-"},"content":"\u003cpuml src\u003d\"diagrams/ComponentManagers.puml\" width\u003d\"300\" /\u003e","lastModifiedDate":"2023-09-12"},{"lineNumber":65,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2021-07-31"},{"lineNumber":66,"author":{"gitId":"-"},"content":"The sections below give more details of each component.","lastModifiedDate":"2020-05-23"},{"lineNumber":67,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":68,"author":{"gitId":"-"},"content":"### UI component","lastModifiedDate":"2020-05-23"},{"lineNumber":69,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":70,"author":{"gitId":"-"},"content":"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)","lastModifiedDate":"2021-07-31"},{"lineNumber":71,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":72,"author":{"gitId":"-"},"content":"\u003cpuml src\u003d\"diagrams/UiClassDiagram.puml\" alt\u003d\"Structure of the UI Component\"/\u003e","lastModifiedDate":"2023-09-12"},{"lineNumber":73,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":74,"author":{"gitId":"-"},"content":"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.","lastModifiedDate":"2021-07-31"},{"lineNumber":75,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":76,"author":{"gitId":"-"},"content":"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)","lastModifiedDate":"2021-07-31"},{"lineNumber":77,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":78,"author":{"gitId":"-"},"content":"The `UI` component,","lastModifiedDate":"2020-05-23"},{"lineNumber":79,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":80,"author":{"gitId":"-"},"content":"* executes user commands using the `Logic` component.","lastModifiedDate":"2021-07-31"},{"lineNumber":81,"author":{"gitId":"-"},"content":"* listens for changes to `Model` data so that the UI can be updated with the modified data.","lastModifiedDate":"2021-07-31"},{"lineNumber":82,"author":{"gitId":"-"},"content":"* keeps a reference to the `Logic` component, because the `UI` relies on the `Logic` to execute commands.","lastModifiedDate":"2021-07-31"},{"lineNumber":83,"author":{"gitId":"-"},"content":"* depends on some classes in the `Model` component, as it displays `Person` object residing in the `Model`.","lastModifiedDate":"2021-07-31"},{"lineNumber":84,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":85,"author":{"gitId":"-"},"content":"### Logic component","lastModifiedDate":"2020-05-23"},{"lineNumber":86,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":87,"author":{"gitId":"-"},"content":"**API** : [`Logic.java`](https://github.com/se-edu/addressbook-level3/tree/master/src/main/java/seedu/address/logic/Logic.java)","lastModifiedDate":"2021-07-31"},{"lineNumber":88,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":89,"author":{"gitId":"-"},"content":"Here\u0027s a (partial) class diagram of the `Logic` component:","lastModifiedDate":"2021-07-31"},{"lineNumber":90,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":91,"author":{"gitId":"-"},"content":"\u003cpuml src\u003d\"diagrams/LogicClassDiagram.puml\" width\u003d\"550\"/\u003e","lastModifiedDate":"2023-09-12"},{"lineNumber":92,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":93,"author":{"gitId":"-"},"content":"The sequence diagram below illustrates the interactions within the `Logic` component, taking `execute(\"delete 1\")` API call as an example.","lastModifiedDate":"2023-09-03"},{"lineNumber":94,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":95,"author":{"gitId":"-"},"content":"\u003cpuml src\u003d\"diagrams/DeleteSequenceDiagram.puml\" alt\u003d\"Interactions Inside the Logic Component for the `delete 1` Command\" /\u003e","lastModifiedDate":"2023-09-12"},{"lineNumber":96,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2023-09-12"},{"lineNumber":97,"author":{"gitId":"-"},"content":"\u003cbox type\u003d\"info\" seamless\u003e","lastModifiedDate":"2023-09-12"},{"lineNumber":98,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":99,"author":{"gitId":"-"},"content":"**Note:** The lifeline for `DeleteCommandParser` should end at the destroy marker (X) but due to a limitation of PlantUML, the lifeline continues till the end of diagram.","lastModifiedDate":"2023-09-12"},{"lineNumber":100,"author":{"gitId":"-"},"content":"\u003c/box\u003e","lastModifiedDate":"2023-09-12"},{"lineNumber":101,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":102,"author":{"gitId":"-"},"content":"How the `Logic` component works:","lastModifiedDate":"2023-09-03"},{"lineNumber":103,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2023-09-03"},{"lineNumber":104,"author":{"gitId":"-"},"content":"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.","lastModifiedDate":"2023-09-03"},{"lineNumber":105,"author":{"gitId":"-"},"content":"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`.","lastModifiedDate":"2023-09-03"},{"lineNumber":106,"author":{"gitId":"-"},"content":"1. The command can communicate with the `Model` when it is executed (e.g. to delete a person).\u003cbr\u003e","lastModifiedDate":"2024-02-09"},{"lineNumber":107,"author":{"gitId":"-"},"content":" Note that although this is shown as a single step in the diagram above (for simplicity), in the code it can take several interactions (between the command object and the `Model`) to achieve.","lastModifiedDate":"2024-02-09"},{"lineNumber":108,"author":{"gitId":"-"},"content":"1. The result of the command execution is encapsulated as a `CommandResult` object which is returned back from `Logic`.","lastModifiedDate":"2023-09-03"},{"lineNumber":109,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2023-09-03"},{"lineNumber":110,"author":{"gitId":"-"},"content":"Here are the other classes in `Logic` (omitted from the class diagram above) that are used for parsing a user command:","lastModifiedDate":"2021-07-31"},{"lineNumber":111,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2021-07-31"},{"lineNumber":112,"author":{"gitId":"-"},"content":"\u003cpuml src\u003d\"diagrams/ParserClasses.puml\" width\u003d\"600\"/\u003e","lastModifiedDate":"2023-09-12"},{"lineNumber":113,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":114,"author":{"gitId":"-"},"content":"How the parsing works:","lastModifiedDate":"2021-07-31"},{"lineNumber":115,"author":{"gitId":"-"},"content":"* 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.","lastModifiedDate":"2021-07-31"},{"lineNumber":116,"author":{"gitId":"-"},"content":"* 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.","lastModifiedDate":"2021-07-31"},{"lineNumber":117,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":118,"author":{"gitId":"-"},"content":"### Model component","lastModifiedDate":"2021-07-31"},{"lineNumber":119,"author":{"gitId":"-"},"content":"**API** : [`Model.java`](https://github.com/se-edu/addressbook-level3/tree/master/src/main/java/seedu/address/model/Model.java)","lastModifiedDate":"2020-05-23"},{"lineNumber":120,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":121,"author":{"gitId":"-"},"content":"\u003cpuml src\u003d\"diagrams/ModelClassDiagram.puml\" width\u003d\"450\" /\u003e","lastModifiedDate":"2023-09-12"},{"lineNumber":122,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":123,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":124,"author":{"gitId":"-"},"content":"The `Model` component,","lastModifiedDate":"2021-07-31"},{"lineNumber":125,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":126,"author":{"gitId":"-"},"content":"* stores the address book data i.e., all `Person` objects (which are contained in a `UniquePersonList` object).","lastModifiedDate":"2021-07-31"},{"lineNumber":127,"author":{"gitId":"-"},"content":"* stores the currently \u0027selected\u0027 `Person` objects (e.g., results of a search query) as a separate _filtered_ list which is exposed to outsiders as an unmodifiable `ObservableList\u003cPerson\u003e` that can be \u0027observed\u0027 e.g. the UI can be bound to this list so that the UI automatically updates when the data in the list change.","lastModifiedDate":"2021-07-31"},{"lineNumber":128,"author":{"gitId":"-"},"content":"* stores a `UserPref` object that represents the user’s preferences. This is exposed to the outside as a `ReadOnlyUserPref` objects.","lastModifiedDate":"2021-07-31"},{"lineNumber":129,"author":{"gitId":"-"},"content":"* 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)","lastModifiedDate":"2021-07-31"},{"lineNumber":130,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2021-07-31"},{"lineNumber":131,"author":{"gitId":"-"},"content":"\u003cbox type\u003d\"info\" seamless\u003e","lastModifiedDate":"2023-09-12"},{"lineNumber":132,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2023-09-12"},{"lineNumber":133,"author":{"gitId":"-"},"content":"**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.\u003cbr\u003e","lastModifiedDate":"2023-09-12"},{"lineNumber":134,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2021-07-31"},{"lineNumber":135,"author":{"gitId":"-"},"content":"\u003cpuml src\u003d\"diagrams/BetterModelClassDiagram.puml\" width\u003d\"450\" /\u003e","lastModifiedDate":"2023-09-12"},{"lineNumber":136,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":137,"author":{"gitId":"-"},"content":"\u003c/box\u003e","lastModifiedDate":"2023-09-12"},{"lineNumber":138,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":139,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":140,"author":{"gitId":"-"},"content":"### Storage component","lastModifiedDate":"2020-05-23"},{"lineNumber":141,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":142,"author":{"gitId":"-"},"content":"**API** : [`Storage.java`](https://github.com/se-edu/addressbook-level3/tree/master/src/main/java/seedu/address/storage/Storage.java)","lastModifiedDate":"2020-05-23"},{"lineNumber":143,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":144,"author":{"gitId":"-"},"content":"\u003cpuml src\u003d\"diagrams/StorageClassDiagram.puml\" width\u003d\"550\" /\u003e","lastModifiedDate":"2023-09-12"},{"lineNumber":145,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2021-07-31"},{"lineNumber":146,"author":{"gitId":"-"},"content":"The `Storage` component,","lastModifiedDate":"2020-05-23"},{"lineNumber":147,"author":{"gitId":"-"},"content":"* can save both address book data and user preference data in JSON format, and read them back into corresponding objects.","lastModifiedDate":"2023-09-03"},{"lineNumber":148,"author":{"gitId":"-"},"content":"* inherits from both `AddressBookStorage` and `UserPrefStorage`, which means it can be treated as either one (if only the functionality of only one is needed).","lastModifiedDate":"2021-07-31"},{"lineNumber":149,"author":{"gitId":"-"},"content":"* depends on some classes in the `Model` component (because the `Storage` component\u0027s job is to save/retrieve objects that belong to the `Model`)","lastModifiedDate":"2021-07-21"},{"lineNumber":150,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":151,"author":{"gitId":"-"},"content":"### Common classes","lastModifiedDate":"2020-05-23"},{"lineNumber":152,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":153,"author":{"gitId":"-"},"content":"Classes used by multiple components are in the `seedu.addressbook.commons` package.","lastModifiedDate":"2020-05-23"},{"lineNumber":154,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":155,"author":{"gitId":"-"},"content":"--------------------------------------------------------------------------------------------------------------------","lastModifiedDate":"2020-05-23"},{"lineNumber":156,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":157,"author":{"gitId":"-"},"content":"## **Implementation**","lastModifiedDate":"2020-05-23"},{"lineNumber":158,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":159,"author":{"gitId":"-"},"content":"This section describes some noteworthy details on how certain features are implemented.","lastModifiedDate":"2020-05-23"},{"lineNumber":160,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":161,"author":{"gitId":"-"},"content":"### \\[Proposed\\] Undo/redo feature","lastModifiedDate":"2020-06-07"},{"lineNumber":162,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":163,"author":{"gitId":"-"},"content":"#### Proposed Implementation","lastModifiedDate":"2020-05-23"},{"lineNumber":164,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":165,"author":{"gitId":"-"},"content":"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:","lastModifiedDate":"2020-05-23"},{"lineNumber":166,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":167,"author":{"gitId":"-"},"content":"* `VersionedAddressBook#commit()` — Saves the current address book state in its history.","lastModifiedDate":"2020-05-23"},{"lineNumber":168,"author":{"gitId":"-"},"content":"* `VersionedAddressBook#undo()` — Restores the previous address book state from its history.","lastModifiedDate":"2020-05-23"},{"lineNumber":169,"author":{"gitId":"-"},"content":"* `VersionedAddressBook#redo()` — Restores a previously undone address book state from its history.","lastModifiedDate":"2020-05-23"},{"lineNumber":170,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":171,"author":{"gitId":"-"},"content":"These operations are exposed in the `Model` interface as `Model#commitAddressBook()`, `Model#undoAddressBook()` and `Model#redoAddressBook()` respectively.","lastModifiedDate":"2020-05-23"},{"lineNumber":172,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":173,"author":{"gitId":"-"},"content":"Given below is an example usage scenario and how the undo/redo mechanism behaves at each step.","lastModifiedDate":"2020-05-23"},{"lineNumber":174,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":175,"author":{"gitId":"-"},"content":"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.","lastModifiedDate":"2020-05-23"},{"lineNumber":176,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":177,"author":{"gitId":"-"},"content":"\u003cpuml src\u003d\"diagrams/UndoRedoState0.puml\" alt\u003d\"UndoRedoState0\" /\u003e","lastModifiedDate":"2023-09-12"},{"lineNumber":178,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":179,"author":{"gitId":"-"},"content":"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.","lastModifiedDate":"2020-05-23"},{"lineNumber":180,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":181,"author":{"gitId":"-"},"content":"\u003cpuml src\u003d\"diagrams/UndoRedoState1.puml\" alt\u003d\"UndoRedoState1\" /\u003e","lastModifiedDate":"2023-09-12"},{"lineNumber":182,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":183,"author":{"gitId":"-"},"content":"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`.","lastModifiedDate":"2020-05-23"},{"lineNumber":184,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":185,"author":{"gitId":"-"},"content":"\u003cpuml src\u003d\"diagrams/UndoRedoState2.puml\" alt\u003d\"UndoRedoState2\" /\u003e","lastModifiedDate":"2023-09-12"},{"lineNumber":186,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":187,"author":{"gitId":"-"},"content":"\u003cbox type\u003d\"info\" seamless\u003e","lastModifiedDate":"2023-09-12"},{"lineNumber":188,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":189,"author":{"gitId":"-"},"content":"**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`.","lastModifiedDate":"2023-09-12"},{"lineNumber":190,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2023-09-12"},{"lineNumber":191,"author":{"gitId":"-"},"content":"\u003c/box\u003e","lastModifiedDate":"2023-09-12"},{"lineNumber":192,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":193,"author":{"gitId":"-"},"content":"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.","lastModifiedDate":"2020-05-23"},{"lineNumber":194,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":195,"author":{"gitId":"-"},"content":"\u003cpuml src\u003d\"diagrams/UndoRedoState3.puml\" alt\u003d\"UndoRedoState3\" /\u003e","lastModifiedDate":"2023-09-12"},{"lineNumber":196,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2023-09-12"},{"lineNumber":197,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2023-09-12"},{"lineNumber":198,"author":{"gitId":"-"},"content":"\u003cbox type\u003d\"info\" seamless\u003e","lastModifiedDate":"2023-09-12"},{"lineNumber":199,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":200,"author":{"gitId":"-"},"content":"**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","lastModifiedDate":"2023-09-12"},{"lineNumber":201,"author":{"gitId":"-"},"content":"than attempting to perform the undo.","lastModifiedDate":"2020-05-23"},{"lineNumber":202,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":203,"author":{"gitId":"-"},"content":"\u003c/box\u003e","lastModifiedDate":"2023-09-12"},{"lineNumber":204,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":205,"author":{"gitId":"-"},"content":"The following sequence diagram shows how an undo operation goes through the `Logic` component:","lastModifiedDate":"2024-02-09"},{"lineNumber":206,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":207,"author":{"gitId":"-"},"content":"\u003cpuml src\u003d\"diagrams/UndoSequenceDiagram-Logic.puml\" alt\u003d\"UndoSequenceDiagram-Logic\" /\u003e","lastModifiedDate":"2023-09-12"},{"lineNumber":208,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":209,"author":{"gitId":"-"},"content":"\u003cbox type\u003d\"info\" seamless\u003e","lastModifiedDate":"2023-09-12"},{"lineNumber":210,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":211,"author":{"gitId":"-"},"content":"**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.","lastModifiedDate":"2023-09-12"},{"lineNumber":212,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2023-09-12"},{"lineNumber":213,"author":{"gitId":"-"},"content":"\u003c/box\u003e","lastModifiedDate":"2023-09-12"},{"lineNumber":214,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":215,"author":{"gitId":"-"},"content":"Similarly, how an undo operation goes through the `Model` component is shown below:","lastModifiedDate":"2024-02-09"},{"lineNumber":216,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2024-02-09"},{"lineNumber":217,"author":{"gitId":"-"},"content":"\u003cpuml src\u003d\"diagrams/UndoSequenceDiagram-Model.puml\" alt\u003d\"UndoSequenceDiagram-Model\" /\u003e","lastModifiedDate":"2023-09-12"},{"lineNumber":218,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2024-02-09"},{"lineNumber":219,"author":{"gitId":"-"},"content":"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.","lastModifiedDate":"2020-05-23"},{"lineNumber":220,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":221,"author":{"gitId":"-"},"content":"\u003cbox type\u003d\"info\" seamless\u003e","lastModifiedDate":"2023-09-12"},{"lineNumber":222,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2023-09-12"},{"lineNumber":223,"author":{"gitId":"-"},"content":"**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.","lastModifiedDate":"2023-09-12"},{"lineNumber":224,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":225,"author":{"gitId":"-"},"content":"\u003c/box\u003e","lastModifiedDate":"2023-09-12"},{"lineNumber":226,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":227,"author":{"gitId":"-"},"content":"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.","lastModifiedDate":"2020-05-23"},{"lineNumber":228,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":229,"author":{"gitId":"-"},"content":"\u003cpuml src\u003d\"diagrams/UndoRedoState4.puml\" alt\u003d\"UndoRedoState4\" /\u003e","lastModifiedDate":"2023-09-12"},{"lineNumber":230,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":231,"author":{"gitId":"-"},"content":"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.","lastModifiedDate":"2020-05-23"},{"lineNumber":232,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":233,"author":{"gitId":"-"},"content":"\u003cpuml src\u003d\"diagrams/UndoRedoState5.puml\" alt\u003d\"UndoRedoState5\" /\u003e","lastModifiedDate":"2023-09-12"},{"lineNumber":234,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":235,"author":{"gitId":"-"},"content":"The following activity diagram summarizes what happens when a user executes a new command:","lastModifiedDate":"2020-05-23"},{"lineNumber":236,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":237,"author":{"gitId":"-"},"content":"\u003cpuml src\u003d\"diagrams/CommitActivityDiagram.puml\" width\u003d\"250\" /\u003e","lastModifiedDate":"2023-09-12"},{"lineNumber":238,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":239,"author":{"gitId":"-"},"content":"#### Design considerations:","lastModifiedDate":"2021-07-31"},{"lineNumber":240,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":241,"author":{"gitId":"-"},"content":"**Aspect: How undo \u0026 redo executes:**","lastModifiedDate":"2021-07-31"},{"lineNumber":242,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":243,"author":{"gitId":"-"},"content":"* **Alternative 1 (current choice):** Saves the entire address book.","lastModifiedDate":"2020-05-23"},{"lineNumber":244,"author":{"gitId":"-"},"content":" * Pros: Easy to implement.","lastModifiedDate":"2020-05-23"},{"lineNumber":245,"author":{"gitId":"-"},"content":" * Cons: May have performance issues in terms of memory usage.","lastModifiedDate":"2020-05-23"},{"lineNumber":246,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":247,"author":{"gitId":"-"},"content":"* **Alternative 2:** Individual command knows how to undo/redo by","lastModifiedDate":"2020-05-23"},{"lineNumber":248,"author":{"gitId":"-"},"content":" itself.","lastModifiedDate":"2020-05-23"},{"lineNumber":249,"author":{"gitId":"-"},"content":" * Pros: Will use less memory (e.g. for `delete`, just save the person being deleted).","lastModifiedDate":"2020-05-23"},{"lineNumber":250,"author":{"gitId":"-"},"content":" * Cons: We must ensure that the implementation of each individual command are correct.","lastModifiedDate":"2020-05-23"},{"lineNumber":251,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":252,"author":{"gitId":"-"},"content":"_{more aspects and alternatives to be added}_","lastModifiedDate":"2020-05-23"},{"lineNumber":253,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":254,"author":{"gitId":"-"},"content":"### \\[Proposed\\] Data archiving","lastModifiedDate":"2020-05-23"},{"lineNumber":255,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":256,"author":{"gitId":"-"},"content":"_{Explain here how the data archiving feature will be implemented}_","lastModifiedDate":"2020-05-23"},{"lineNumber":257,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":258,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":259,"author":{"gitId":"-"},"content":"--------------------------------------------------------------------------------------------------------------------","lastModifiedDate":"2020-05-23"},{"lineNumber":260,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":261,"author":{"gitId":"-"},"content":"## **Documentation, logging, testing, configuration, dev-ops**","lastModifiedDate":"2020-06-07"},{"lineNumber":262,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":263,"author":{"gitId":"-"},"content":"* [Documentation guide](Documentation.md)","lastModifiedDate":"2020-06-07"},{"lineNumber":264,"author":{"gitId":"-"},"content":"* [Testing guide](Testing.md)","lastModifiedDate":"2020-06-07"},{"lineNumber":265,"author":{"gitId":"-"},"content":"* [Logging guide](Logging.md)","lastModifiedDate":"2020-06-07"},{"lineNumber":266,"author":{"gitId":"-"},"content":"* [Configuration guide](Configuration.md)","lastModifiedDate":"2020-06-07"},{"lineNumber":267,"author":{"gitId":"-"},"content":"* [DevOps guide](DevOps.md)","lastModifiedDate":"2020-06-07"},{"lineNumber":268,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":269,"author":{"gitId":"-"},"content":"--------------------------------------------------------------------------------------------------------------------","lastModifiedDate":"2020-05-23"},{"lineNumber":270,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":271,"author":{"gitId":"-"},"content":"## **Appendix: Requirements**","lastModifiedDate":"2020-05-23"},{"lineNumber":272,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":273,"author":{"gitId":"-"},"content":"### Product scope","lastModifiedDate":"2020-05-23"},{"lineNumber":274,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":275,"author":{"gitId":"-"},"content":"**Target user profile**:","lastModifiedDate":"2020-05-23"},{"lineNumber":276,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":277,"author":{"gitId":"-"},"content":"* has a need to manage a significant number of contacts","lastModifiedDate":"2020-05-23"},{"lineNumber":278,"author":{"gitId":"-"},"content":"* prefer desktop apps over other types","lastModifiedDate":"2020-05-23"},{"lineNumber":279,"author":{"gitId":"-"},"content":"* can type fast","lastModifiedDate":"2020-05-23"},{"lineNumber":280,"author":{"gitId":"-"},"content":"* prefers typing to mouse interactions","lastModifiedDate":"2020-05-26"},{"lineNumber":281,"author":{"gitId":"-"},"content":"* is reasonably comfortable using CLI apps","lastModifiedDate":"2020-05-23"},{"lineNumber":282,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":283,"author":{"gitId":"-"},"content":"**Value proposition**: manage contacts faster than a typical mouse/GUI driven app","lastModifiedDate":"2020-05-23"},{"lineNumber":284,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":285,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":286,"author":{"gitId":"-"},"content":"### User stories","lastModifiedDate":"2020-06-07"},{"lineNumber":287,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":288,"author":{"gitId":"-"},"content":"Priorities: High (must have) - `* * *`, Medium (nice to have) - `* *`, Low (unlikely to have) - `*`","lastModifiedDate":"2020-05-23"},{"lineNumber":289,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":290,"author":{"gitId":"-"},"content":"| Priority | As a …​ | I want to …​ | So that I can…​ |","lastModifiedDate":"2020-05-23"},{"lineNumber":291,"author":{"gitId":"chengjunyuan"},"content":"|----------|--------------------------------------------|------------------------|------------------------------------------------------------------------|","lastModifiedDate":"2024-03-07"},{"lineNumber":292,"author":{"gitId":"-"},"content":"| `* * *` | new user | see usage instructions | refer to instructions when I forget how to use the App |","lastModifiedDate":"2020-05-23"},{"lineNumber":293,"author":{"gitId":"-"},"content":"| `* * *` | user | add a new person | |","lastModifiedDate":"2020-05-23"},{"lineNumber":294,"author":{"gitId":"-"},"content":"| `* * *` | user | delete a person | remove entries that I no longer need |","lastModifiedDate":"2020-05-23"},{"lineNumber":295,"author":{"gitId":"-"},"content":"| `* * *` | user | find a person by name | locate details of persons without having to go through the entire list |","lastModifiedDate":"2020-05-23"},{"lineNumber":296,"author":{"gitId":"chengjunyuan"},"content":"| `* * *` | user | update contact details | keep track of their current details |","lastModifiedDate":"2024-03-07"},{"lineNumber":297,"author":{"gitId":"-"},"content":"| `*` | user with many persons in the address book | sort persons by name | locate a person easily |","lastModifiedDate":"2020-05-23"},{"lineNumber":298,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":299,"author":{"gitId":"-"},"content":"*{More to be added}*","lastModifiedDate":"2020-05-23"},{"lineNumber":300,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":301,"author":{"gitId":"-"},"content":"### Use cases","lastModifiedDate":"2020-06-07"},{"lineNumber":302,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":303,"author":{"gitId":"-"},"content":"(For all use cases below, the **System** is the `AddressBook` and the **Actor** is the `user`, unless specified otherwise)","lastModifiedDate":"2020-05-23"},{"lineNumber":304,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":305,"author":{"gitId":"-"},"content":"**Use case: Delete a person**","lastModifiedDate":"2020-05-23"},{"lineNumber":306,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":307,"author":{"gitId":"-"},"content":"**MSS**","lastModifiedDate":"2020-05-23"},{"lineNumber":308,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":309,"author":{"gitId":"-"},"content":"1. User requests to list persons","lastModifiedDate":"2020-05-23"},{"lineNumber":310,"author":{"gitId":"chengjunyuan"},"content":"2. Rapid Tracer shows a list of persons","lastModifiedDate":"2024-03-07"},{"lineNumber":311,"author":{"gitId":"-"},"content":"3. User requests to delete a specific person in the list","lastModifiedDate":"2020-05-23"},{"lineNumber":312,"author":{"gitId":"chengjunyuan"},"content":"4. Rapid Tracer deletes the person","lastModifiedDate":"2024-03-07"},{"lineNumber":313,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":314,"author":{"gitId":"-"},"content":" Use case ends.","lastModifiedDate":"2020-05-23"},{"lineNumber":315,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":316,"author":{"gitId":"-"},"content":"**Extensions**","lastModifiedDate":"2020-05-23"},{"lineNumber":317,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":318,"author":{"gitId":"-"},"content":"* 2a. The list is empty.","lastModifiedDate":"2020-05-23"},{"lineNumber":319,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":320,"author":{"gitId":"-"},"content":" Use case ends.","lastModifiedDate":"2020-05-23"},{"lineNumber":321,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":322,"author":{"gitId":"-"},"content":"* 3a. The given index is invalid.","lastModifiedDate":"2020-05-23"},{"lineNumber":323,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":324,"author":{"gitId":"chengjunyuan"},"content":" * 3a1. Rapid Tracer shows an error message.","lastModifiedDate":"2024-03-07"},{"lineNumber":325,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":326,"author":{"gitId":"-"},"content":" Use case resumes at step 2.","lastModifiedDate":"2020-05-23"},{"lineNumber":327,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":328,"author":{"gitId":"-"},"content":"*{More to be added}*","lastModifiedDate":"2020-05-23"},{"lineNumber":329,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":330,"author":{"gitId":"-"},"content":"### Non-Functional Requirements","lastModifiedDate":"2020-05-23"},{"lineNumber":331,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":332,"author":{"gitId":"chengjunyuan"},"content":"1. 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.","lastModifiedDate":"2024-03-08"},{"lineNumber":333,"author":{"gitId":"chengjunyuan"},"content":"2. Should save backups of patient and appointment data at regular intervals (once every time the app is opened), in order to facilitate disaster recovery processes.","lastModifiedDate":"2024-03-08"},{"lineNumber":334,"author":{"gitId":"chengjunyuan"},"content":"3. Should work on any *mainstream OS* as long as it has Java `11` or above installed. For Mac users, it should minimally work on any Mac which has been set up according to the advisory [here](https://nus-cs2103-ay2324s2.github.io/website/admin/programmingLanguages.html#programming-language).","lastModifiedDate":"2024-03-08"},{"lineNumber":335,"author":{"gitId":"chengjunyuan"},"content":"4. Should be able to hold up to 1000 contacts without a noticeable sluggishness in performance for typical usage.","lastModifiedDate":"2024-03-08"},{"lineNumber":336,"author":{"gitId":"chengjunyuan"},"content":"5. Should be able to hold up to 10000 appointments without a noticeable sluggishness in performance for typical usage.","lastModifiedDate":"2024-03-08"},{"lineNumber":337,"author":{"gitId":"chengjunyuan"},"content":"6. Should have the ability to import patient and appointment data stored in common formats, such as CSV or JSON.","lastModifiedDate":"2024-03-08"},{"lineNumber":338,"author":{"gitId":"chengjunyuan"},"content":"7. Should have comprehensive documentation for both users and developers in the form of a User and Developer Guide respectively.","lastModifiedDate":"2024-03-08"},{"lineNumber":339,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":340,"author":{"gitId":"-"},"content":"*{More to be added}*","lastModifiedDate":"2020-05-23"},{"lineNumber":341,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":342,"author":{"gitId":"-"},"content":"### Glossary","lastModifiedDate":"2020-05-23"},{"lineNumber":343,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":344,"author":{"gitId":"-"},"content":"* **Mainstream OS**: Windows, Linux, Unix, MacOS","lastModifiedDate":"2024-02-09"},{"lineNumber":345,"author":{"gitId":"-"},"content":"* **Private contact detail**: A contact detail that is not meant to be shared with others","lastModifiedDate":"2020-05-23"},{"lineNumber":346,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":347,"author":{"gitId":"-"},"content":"--------------------------------------------------------------------------------------------------------------------","lastModifiedDate":"2020-05-23"},{"lineNumber":348,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":349,"author":{"gitId":"-"},"content":"## **Appendix: Instructions for manual testing**","lastModifiedDate":"2020-05-23"},{"lineNumber":350,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":351,"author":{"gitId":"-"},"content":"Given below are instructions to test the app manually.","lastModifiedDate":"2020-05-23"},{"lineNumber":352,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":353,"author":{"gitId":"-"},"content":"\u003cbox type\u003d\"info\" seamless\u003e","lastModifiedDate":"2023-09-12"},{"lineNumber":354,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2023-09-12"},{"lineNumber":355,"author":{"gitId":"-"},"content":"**Note:** These instructions only provide a starting point for testers to work on;","lastModifiedDate":"2023-09-12"},{"lineNumber":356,"author":{"gitId":"-"},"content":"testers are expected to do more *exploratory* testing.","lastModifiedDate":"2020-05-23"},{"lineNumber":357,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":358,"author":{"gitId":"-"},"content":"\u003c/box\u003e","lastModifiedDate":"2023-09-12"},{"lineNumber":359,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":360,"author":{"gitId":"-"},"content":"### Launch and shutdown","lastModifiedDate":"2020-05-23"},{"lineNumber":361,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":362,"author":{"gitId":"-"},"content":"1. Initial launch","lastModifiedDate":"2020-05-23"},{"lineNumber":363,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":364,"author":{"gitId":"-"},"content":" 1. Download the jar file and copy into an empty folder","lastModifiedDate":"2020-05-23"},{"lineNumber":365,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":366,"author":{"gitId":"-"},"content":" 1. Double-click the jar file Expected: Shows the GUI with a set of sample contacts. The window size may not be optimum.","lastModifiedDate":"2020-05-23"},{"lineNumber":367,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":368,"author":{"gitId":"-"},"content":"1. Saving window preferences","lastModifiedDate":"2020-05-23"},{"lineNumber":369,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":370,"author":{"gitId":"-"},"content":" 1. Resize the window to an optimum size. Move the window to a different location. Close the window.","lastModifiedDate":"2020-05-23"},{"lineNumber":371,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":372,"author":{"gitId":"-"},"content":" 1. Re-launch the app by double-clicking the jar file.\u003cbr\u003e","lastModifiedDate":"2020-05-23"},{"lineNumber":373,"author":{"gitId":"-"},"content":" Expected: The most recent window size and location is retained.","lastModifiedDate":"2020-05-23"},{"lineNumber":374,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":375,"author":{"gitId":"-"},"content":"1. _{ more test cases …​ }_","lastModifiedDate":"2020-05-23"},{"lineNumber":376,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":377,"author":{"gitId":"-"},"content":"### Deleting a person","lastModifiedDate":"2020-05-23"},{"lineNumber":378,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":379,"author":{"gitId":"-"},"content":"1. Deleting a person while all persons are being shown","lastModifiedDate":"2020-05-23"},{"lineNumber":380,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":381,"author":{"gitId":"-"},"content":" 1. Prerequisites: List all persons using the `list` command. Multiple persons in the list.","lastModifiedDate":"2020-05-23"},{"lineNumber":382,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":383,"author":{"gitId":"-"},"content":" 1. Test case: `delete 1`\u003cbr\u003e","lastModifiedDate":"2020-05-23"},{"lineNumber":384,"author":{"gitId":"-"},"content":" 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.","lastModifiedDate":"2020-05-23"},{"lineNumber":385,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":386,"author":{"gitId":"-"},"content":" 1. Test case: `delete 0`\u003cbr\u003e","lastModifiedDate":"2020-05-23"},{"lineNumber":387,"author":{"gitId":"-"},"content":" Expected: No person is deleted. Error details shown in the status message. Status bar remains the same.","lastModifiedDate":"2020-05-23"},{"lineNumber":388,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":389,"author":{"gitId":"-"},"content":" 1. Other incorrect delete commands to try: `delete`, `delete x`, `...` (where x is larger than the list size)\u003cbr\u003e","lastModifiedDate":"2020-05-23"},{"lineNumber":390,"author":{"gitId":"-"},"content":" Expected: Similar to previous.","lastModifiedDate":"2020-05-23"},{"lineNumber":391,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":392,"author":{"gitId":"-"},"content":"1. _{ more test cases …​ }_","lastModifiedDate":"2020-05-23"},{"lineNumber":393,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":394,"author":{"gitId":"-"},"content":"### Saving data","lastModifiedDate":"2020-05-23"},{"lineNumber":395,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":396,"author":{"gitId":"-"},"content":"1. Dealing with missing/corrupted data files","lastModifiedDate":"2020-05-23"},{"lineNumber":397,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":398,"author":{"gitId":"-"},"content":" 1. _{explain how to simulate a missing/corrupted file, and the expected behavior}_","lastModifiedDate":"2020-05-23"},{"lineNumber":399,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":400,"author":{"gitId":"-"},"content":"1. _{ more test cases …​ }_","lastModifiedDate":"2020-05-23"}],"authorContributionMap":{"chengjunyuan":14,"-":386}},{"path":"docs/UserGuide.md","fileType":"docs","lines":[{"lineNumber":1,"author":{"gitId":"-"},"content":"---","lastModifiedDate":"2020-05-23"},{"lineNumber":2,"author":{"gitId":"-"},"content":" layout: default.md","lastModifiedDate":"2023-09-12"},{"lineNumber":3,"author":{"gitId":"-"},"content":" title: \"User Guide\"","lastModifiedDate":"2023-09-12"},{"lineNumber":4,"author":{"gitId":"-"},"content":" pageNav: 3","lastModifiedDate":"2023-09-12"},{"lineNumber":5,"author":{"gitId":"-"},"content":"---","lastModifiedDate":"2020-05-23"},{"lineNumber":6,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":7,"author":{"gitId":"minreiseah"},"content":"# Rapid Tracer","lastModifiedDate":"2024-03-08"},{"lineNumber":8,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":9,"author":{"gitId":"minreiseah"},"content":"RapidTracer offers a fast-paced GUI for clinic managers to handle contacts and appointments. It combines:","lastModifiedDate":"2024-03-08"},{"lineNumber":10,"author":{"gitId":"minreiseah"},"content":"- Simple and intuitive GUI","lastModifiedDate":"2024-03-08"},{"lineNumber":11,"author":{"gitId":"minreiseah"},"content":"- Quick to use for fast typers","lastModifiedDate":"2024-03-08"},{"lineNumber":12,"author":{"gitId":"minreiseah"},"content":"- Instead of using Excel spreadsheets which tends to end up with too much redundant information (everything for everyone), and offers way too many features that a specific user like Dr Surya will not use, RapidTracer is catered to Dr Surya’s context and field of work (everything for someone).","lastModifiedDate":"2024-03-08"},{"lineNumber":13,"author":{"gitId":"minreiseah"},"content":"- Swiftly navigation through complex patient data and contact histories.","lastModifiedDate":"2024-03-08"},{"lineNumber":14,"author":{"gitId":"minreiseah"},"content":"- A keyboard-driven interface that mirrors the efficiency of Vim","lastModifiedDate":"2024-03-08"},{"lineNumber":15,"author":{"gitId":"minreiseah"},"content":"- The ability to load and store large datasets","lastModifiedDate":"2024-03-08"},{"lineNumber":16,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2023-09-12"},{"lineNumber":17,"author":{"gitId":"-"},"content":"\u003c!-- * Table of Contents --\u003e","lastModifiedDate":"2023-09-12"},{"lineNumber":18,"author":{"gitId":"-"},"content":"\u003cpage-nav-print /\u003e","lastModifiedDate":"2023-09-12"},{"lineNumber":19,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":20,"author":{"gitId":"-"},"content":"--------------------------------------------------------------------------------------------------------------------","lastModifiedDate":"2020-05-23"},{"lineNumber":21,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":22,"author":{"gitId":"-"},"content":"## Quick start","lastModifiedDate":"2020-05-23"},{"lineNumber":23,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":24,"author":{"gitId":"-"},"content":"1. Ensure you have Java `11` or above installed in your Computer.","lastModifiedDate":"2020-05-23"},{"lineNumber":25,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":26,"author":{"gitId":"-"},"content":"--------------------------------------------------------------------------------------------------------------------","lastModifiedDate":"2020-05-23"},{"lineNumber":27,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":28,"author":{"gitId":"-"},"content":"## Features","lastModifiedDate":"2020-05-23"},{"lineNumber":29,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":30,"author":{"gitId":"minreiseah"},"content":"- Creating, Reading, Updating, Deleting Contacts","lastModifiedDate":"2024-03-08"},{"lineNumber":31,"author":{"gitId":"minreiseah"},"content":"- Creating, Reading, Updating, Deleting Appointments","lastModifiedDate":"2024-03-08"},{"lineNumber":32,"author":{"gitId":"minreiseah"},"content":"- Searching contacts and appointments","lastModifiedDate":"2024-03-08"},{"lineNumber":33,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":34,"author":{"gitId":"minreiseah"},"content":"## Commands","lastModifiedDate":"2024-03-08"},{"lineNumber":35,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":36,"author":{"gitId":"minreiseah"},"content":"### General Commands","lastModifiedDate":"2024-03-08"},{"lineNumber":37,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":38,"author":{"gitId":"minreiseah"},"content":"#### Viewing help : `help`","lastModifiedDate":"2024-03-08"},{"lineNumber":39,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":40,"author":{"gitId":"minreiseah"},"content":"#### Exiting program : `exit`","lastModifiedDate":"2024-03-08"},{"lineNumber":41,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":42,"author":{"gitId":"minreiseah"},"content":"### Contact Commands","lastModifiedDate":"2024-03-08"},{"lineNumber":43,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2021-02-03"},{"lineNumber":44,"author":{"gitId":"minreiseah"},"content":"#### Adding a contact: `add`","lastModifiedDate":"2024-03-08"},{"lineNumber":45,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":46,"author":{"gitId":"minreiseah"},"content":"Adds a new contact to RapidTracer.","lastModifiedDate":"2024-03-08"},{"lineNumber":47,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":48,"author":{"gitId":"minreiseah"},"content":"Format: `add n/NAME p/PHONE_NUMBER [a/ADDRESS] [t/TAG] [d/DATE] [s/START_TIME] [e/END_TIME]`","lastModifiedDate":"2024-03-08"},{"lineNumber":49,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":50,"author":{"gitId":"minreiseah"},"content":"- Commands in [brackets] are optional parameters.","lastModifiedDate":"2024-03-08"},{"lineNumber":51,"author":{"gitId":"minreiseah"},"content":"- The name to be added “NAME” can only contain alphabets. Most normal people don’t have numbers in their names.","lastModifiedDate":"2024-03-08"},{"lineNumber":52,"author":{"gitId":"minreiseah"},"content":"- Parameters may be typed in any order.","lastModifiedDate":"2024-03-08"},{"lineNumber":53,"author":{"gitId":"minreiseah"},"content":"- On the implementation side, adding w/o date and times just creates one contact object. Else, it creates one contact object and appointment object and links them.","lastModifiedDate":"2024-03-08"},{"lineNumber":54,"author":{"gitId":"minreiseah"},"content":"- If [d/DATE] is not given, assume the current date.","lastModifiedDate":"2024-03-08"},{"lineNumber":55,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":56,"author":{"gitId":"minreiseah"},"content":"#### Listing contacts: `list`","lastModifiedDate":"2024-03-08"},{"lineNumber":57,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":58,"author":{"gitId":"minreiseah"},"content":"Shows a list of all contacts in RapidTracer.","lastModifiedDate":"2024-03-08"},{"lineNumber":59,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":60,"author":{"gitId":"minreiseah"},"content":"#### Editing contact: `edit`","lastModifiedDate":"2024-03-08"},{"lineNumber":61,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":62,"author":{"gitId":"minreiseah"},"content":"Edits an existing contact’s details in RapidTracer. This does not deal with user appointments.","lastModifiedDate":"2024-03-08"},{"lineNumber":63,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":64,"author":{"gitId":"minreiseah"},"content":"Format: `edit INDEX [n/NAME] [p/PHONE_NUMBER] [a/ADDRESS] [t/TAG]`","lastModifiedDate":"2024-03-08"},{"lineNumber":65,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":66,"author":{"gitId":"minreiseah"},"content":"- Edits the contact at the specified INDEX.","lastModifiedDate":"2024-03-08"},{"lineNumber":67,"author":{"gitId":"minreiseah"},"content":"- INDEX is a positive integer that is currently displayed on the screen.","lastModifiedDate":"2024-03-08"},{"lineNumber":68,"author":{"gitId":"minreiseah"},"content":"- Only one INDEX can be edited at a time.","lastModifiedDate":"2024-03-08"},{"lineNumber":69,"author":{"gitId":"minreiseah"},"content":"- At least one of the optional fields must be provided.","lastModifiedDate":"2024-03-08"},{"lineNumber":70,"author":{"gitId":"minreiseah"},"content":"- Existing values will be updated to the input values.","lastModifiedDate":"2024-03-08"},{"lineNumber":71,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2023-09-12"},{"lineNumber":72,"author":{"gitId":"minreiseah"},"content":"#### Searching for contacts: `find`","lastModifiedDate":"2024-03-08"},{"lineNumber":73,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":74,"author":{"gitId":"minreiseah"},"content":"Shows a list of contacts in RapidTracer matching the description provided. Found searches must meet ALL keywords.","lastModifiedDate":"2024-03-08"},{"lineNumber":75,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":76,"author":{"gitId":"minreiseah"},"content":"Format: `find KEYWORD [MORE_KEYWORDS]`","lastModifiedDate":"2024-03-08"},{"lineNumber":77,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":78,"author":{"gitId":"minreiseah"},"content":"- The KEYWORD searched is case-insensitive.","lastModifiedDate":"2024-03-08"},{"lineNumber":79,"author":{"gitId":"minreiseah"},"content":"- Order of keywords does not matter.","lastModifiedDate":"2024-03-08"},{"lineNumber":80,"author":{"gitId":"minreiseah"},"content":"- Possible keyword types:","lastModifiedDate":"2024-03-08"},{"lineNumber":81,"author":{"gitId":"minreiseah"},"content":" - NAME","lastModifiedDate":"2024-03-08"},{"lineNumber":82,"author":{"gitId":"minreiseah"},"content":" - PHONE_NUMBER","lastModifiedDate":"2024-03-08"},{"lineNumber":83,"author":{"gitId":"minreiseah"},"content":" - ADDRESS","lastModifiedDate":"2024-03-08"},{"lineNumber":84,"author":{"gitId":"minreiseah"},"content":" - TAG","lastModifiedDate":"2024-03-08"},{"lineNumber":85,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":86,"author":{"gitId":"minreiseah"},"content":"#### Deleting contacts: `delete`","lastModifiedDate":"2024-03-08"},{"lineNumber":87,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":88,"author":{"gitId":"minreiseah"},"content":"Deletes the specified contact from the given index.","lastModifiedDate":"2024-03-08"},{"lineNumber":89,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":90,"author":{"gitId":"minreiseah"},"content":"Format: `delete INDEX`","lastModifiedDate":"2024-03-08"},{"lineNumber":91,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":92,"author":{"gitId":"minreiseah"},"content":"- Deletes the contact at the specified INDEX.","lastModifiedDate":"2024-03-08"},{"lineNumber":93,"author":{"gitId":"minreiseah"},"content":"- INDEX is a positive integer that is currently displayed on the screen.","lastModifiedDate":"2024-03-08"},{"lineNumber":94,"author":{"gitId":"minreiseah"},"content":"- Only one INDEX can be deleted at a time.","lastModifiedDate":"2024-03-08"},{"lineNumber":95,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":96,"author":{"gitId":"minreiseah"},"content":"### Appointment Commands","lastModifiedDate":"2024-03-08"},{"lineNumber":97,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":98,"author":{"gitId":"minreiseah"},"content":"#### Adding appointment: `add appt`","lastModifiedDate":"2024-03-08"},{"lineNumber":99,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":100,"author":{"gitId":"minreiseah"},"content":"Adds an appointment for a user.","lastModifiedDate":"2024-03-08"},{"lineNumber":101,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":102,"author":{"gitId":"minreiseah"},"content":"Format: `appt INDEX DATE``","lastModifiedDate":"2024-03-08"},{"lineNumber":103,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":104,"author":{"gitId":"minreiseah"},"content":"- Adds an appointment to the contact at the specified INDEX.","lastModifiedDate":"2024-03-08"},{"lineNumber":105,"author":{"gitId":"minreiseah"},"content":"- INDEX is a positive integer displayed on the screen.","lastModifiedDate":"2024-03-08"},{"lineNumber":106,"author":{"gitId":"minreiseah"},"content":"- DATE must be in the following formats:","lastModifiedDate":"2024-03-08"},{"lineNumber":107,"author":{"gitId":"minreiseah"},"content":" - dd/MM/yyyy","lastModifiedDate":"2024-03-08"},{"lineNumber":108,"author":{"gitId":"minreiseah"},"content":" - dd/MM/yyyy (HH:mm)","lastModifiedDate":"2024-03-08"},{"lineNumber":109,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":110,"author":{"gitId":"minreiseah"},"content":"#### Listing appointments: `list appt`","lastModifiedDate":"2024-03-08"},{"lineNumber":111,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":112,"author":{"gitId":"minreiseah"},"content":"Shows a list of all appointments in RapidTracer.","lastModifiedDate":"2024-03-08"},{"lineNumber":113,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":114,"author":{"gitId":"minreiseah"},"content":"Format: `list appt`","lastModifiedDate":"2024-03-08"},{"lineNumber":115,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":116,"author":{"gitId":"minreiseah"},"content":"#### Editing appointment: `edit appt`","lastModifiedDate":"2024-03-08"},{"lineNumber":117,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":118,"author":{"gitId":"minreiseah"},"content":"Edits the appointment at the specified INDEX","lastModifiedDate":"2024-03-08"},{"lineNumber":119,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":120,"author":{"gitId":"minreiseah"},"content":"Format: `edit appt INDEX [s/START_TIME] [e/END_TIME]`","lastModifiedDate":"2024-03-08"},{"lineNumber":121,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":122,"author":{"gitId":"minreiseah"},"content":"- INDEX is a positive integer that is currently displayed on the screen.","lastModifiedDate":"2024-03-08"},{"lineNumber":123,"author":{"gitId":"minreiseah"},"content":"- Only one INDEX can be edited at a time.","lastModifiedDate":"2024-03-08"},{"lineNumber":124,"author":{"gitId":"minreiseah"},"content":"- At least one of the optional fields must be provided.","lastModifiedDate":"2024-03-08"},{"lineNumber":125,"author":{"gitId":"minreiseah"},"content":"- Existing values will be updated to the input values.","lastModifiedDate":"2024-03-08"},{"lineNumber":126,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":127,"author":{"gitId":"minreiseah"},"content":"#### Finding appointment: `find appt`","lastModifiedDate":"2024-03-08"},{"lineNumber":128,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":129,"author":{"gitId":"minreiseah"},"content":"Shows a list of appointments in RapidTracer matching the keywords provided. Found searches must match ALL keywords.","lastModifiedDate":"2024-03-08"},{"lineNumber":130,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":131,"author":{"gitId":"minreiseah"},"content":"Format: `find appt KEYWORD [MORE_KEYWORDS]`","lastModifiedDate":"2024-03-08"},{"lineNumber":132,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2021-02-04"},{"lineNumber":133,"author":{"gitId":"minreiseah"},"content":"- The KEYWORD searched is case-insensitive.","lastModifiedDate":"2024-03-08"},{"lineNumber":134,"author":{"gitId":"minreiseah"},"content":"- Order of keywords does not matter.","lastModifiedDate":"2024-03-08"},{"lineNumber":135,"author":{"gitId":"minreiseah"},"content":"- Possible keyword types:","lastModifiedDate":"2024-03-08"},{"lineNumber":136,"author":{"gitId":"minreiseah"},"content":" - NAME","lastModifiedDate":"2024-03-08"},{"lineNumber":137,"author":{"gitId":"minreiseah"},"content":" - PHONE_NUMBER","lastModifiedDate":"2024-03-08"},{"lineNumber":138,"author":{"gitId":"minreiseah"},"content":" - ADDRESS","lastModifiedDate":"2024-03-08"},{"lineNumber":139,"author":{"gitId":"minreiseah"},"content":" - TAG","lastModifiedDate":"2024-03-08"},{"lineNumber":140,"author":{"gitId":"minreiseah"},"content":" - DATE","lastModifiedDate":"2024-03-08"},{"lineNumber":141,"author":{"gitId":"minreiseah"},"content":" - START_DATE END_DATE","lastModifiedDate":"2024-03-08"},{"lineNumber":142,"author":{"gitId":"minreiseah"},"content":" - DATE START_TIME END_TIME","lastModifiedDate":"2024-03-08"},{"lineNumber":143,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2021-02-04"},{"lineNumber":144,"author":{"gitId":"minreiseah"},"content":"#### Deleting appointment: `delete`","lastModifiedDate":"2024-03-08"},{"lineNumber":145,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2023-09-12"},{"lineNumber":146,"author":{"gitId":"minreiseah"},"content":"Deletes the specified appointment from the given index.","lastModifiedDate":"2024-03-08"},{"lineNumber":147,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2021-02-04"},{"lineNumber":148,"author":{"gitId":"minreiseah"},"content":"Format: `delete INDEX`","lastModifiedDate":"2024-03-08"},{"lineNumber":149,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":150,"author":{"gitId":"minreiseah"},"content":"- Deletes the appointment at the specified INDEX.","lastModifiedDate":"2024-03-08"},{"lineNumber":151,"author":{"gitId":"minreiseah"},"content":"- Note: delete is generic (it just deletes the object at the specified index)","lastModifiedDate":"2024-03-08"},{"lineNumber":152,"author":{"gitId":"minreiseah"},"content":"- INDEX is a positive integer that is currently displayed on the screen.","lastModifiedDate":"2024-03-08"},{"lineNumber":153,"author":{"gitId":"minreiseah"},"content":"- Only one INDEX can be deleted at a time.","lastModifiedDate":"2024-03-08"},{"lineNumber":154,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":155,"author":{"gitId":"-"},"content":"--------------------------------------------------------------------------------------------------------------------","lastModifiedDate":"2020-05-23"},{"lineNumber":156,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":157,"author":{"gitId":"-"},"content":"## FAQ","lastModifiedDate":"2020-05-23"},{"lineNumber":158,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":159,"author":{"gitId":"-"},"content":"**Q**: How do I transfer my data to another Computer?\u003cbr\u003e","lastModifiedDate":"2020-05-23"},{"lineNumber":160,"author":{"gitId":"minreiseah"},"content":"**A**: Copy paste.","lastModifiedDate":"2024-03-08"},{"lineNumber":161,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":162,"author":{"gitId":"chengjunyuan"},"content":"**Q**: A command is not working, what am I doing wrong?\u003cbr\u003e","lastModifiedDate":"2024-03-08"},{"lineNumber":163,"author":{"gitId":"chengjunyuan"},"content":"**A**: There\u0027s a chance that the feature is still under development. We will fix it!","lastModifiedDate":"2024-03-08"},{"lineNumber":164,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2024-03-08"},{"lineNumber":165,"author":{"gitId":"-"},"content":"--------------------------------------------------------------------------------------------------------------------","lastModifiedDate":"2020-05-23"},{"lineNumber":166,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":167,"author":{"gitId":"-"},"content":"## Known issues","lastModifiedDate":"2023-09-08"},{"lineNumber":168,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2023-09-08"},{"lineNumber":169,"author":{"gitId":"-"},"content":"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.","lastModifiedDate":"2023-09-08"},{"lineNumber":170,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2023-09-08"},{"lineNumber":171,"author":{"gitId":"-"},"content":"--------------------------------------------------------------------------------------------------------------------","lastModifiedDate":"2023-09-08"},{"lineNumber":172,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2023-09-08"},{"lineNumber":173,"author":{"gitId":"-"},"content":"## Command summary","lastModifiedDate":"2020-05-23"},{"lineNumber":174,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":175,"author":{"gitId":"-"},"content":"Action | Format, Examples","lastModifiedDate":"2020-05-23"},{"lineNumber":176,"author":{"gitId":"-"},"content":"-----------|----------------------------------------------------------------------------------------------------------------------------------------------------------------------","lastModifiedDate":"2023-09-12"},{"lineNumber":177,"author":{"gitId":"chengjunyuan"},"content":"WIP | WIP","lastModifiedDate":"2024-03-08"}],"authorContributionMap":{"minreiseah":90,"chengjunyuan":3,"-":84}},{"path":"docs/index.md","fileType":"docs","lines":[{"lineNumber":1,"author":{"gitId":"-"},"content":"---","lastModifiedDate":"2020-05-23"},{"lineNumber":2,"author":{"gitId":"-"},"content":" layout: default.md","lastModifiedDate":"2023-09-12"},{"lineNumber":3,"author":{"gitId":"-"},"content":" title: \"\"","lastModifiedDate":"2023-09-12"},{"lineNumber":4,"author":{"gitId":"-"},"content":"---","lastModifiedDate":"2020-05-23"},{"lineNumber":5,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":6,"author":{"gitId":"minreiseah"},"content":"# Rapid Tracer","lastModifiedDate":"2024-03-08"},{"lineNumber":7,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2024-03-08"},{"lineNumber":8,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2023-09-12"},{"lineNumber":9,"author":{"gitId":"minreiseah"},"content":"[![CI Status](https://github.com/AY2324S2-CS2103T-T10-2/tp/workflows/Java%20CI/badge.svg)](https://github.com/AY2324S2-CS2103T-T10-2/tp/actions)","lastModifiedDate":"2024-03-08"},{"lineNumber":10,"author":{"gitId":"minreiseah"},"content":"[![codecov](https://codecov.io/gh/AY2324S2-CS2103T-T10-2/tp/graph/badge.svg?token\u003d1R92MZ3PFL)](https://codecov.io/gh/AY2324S2-CS2103T-T10-2/tp)","lastModifiedDate":"2024-03-08"},{"lineNumber":11,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":12,"author":{"gitId":"-"},"content":"![Ui](images/Ui.png)","lastModifiedDate":"2020-05-23"},{"lineNumber":13,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":14,"author":{"gitId":"minreiseah"},"content":"* If you are interested in using RapidTracer, head over to the [_Quick Start_ section of the **User Guide**](UserGuide.html#quick-start).","lastModifiedDate":"2024-03-08"},{"lineNumber":15,"author":{"gitId":"minreiseah"},"content":"* If you are interested about developing RapidTracer, the [**Developer Guide**](DeveloperGuide.html) is a good place to start.","lastModifiedDate":"2024-03-08"},{"lineNumber":16,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":17,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":18,"author":{"gitId":"-"},"content":"**Acknowledgements**","lastModifiedDate":"2020-05-23"},{"lineNumber":19,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":20,"author":{"gitId":"-"},"content":"* Libraries used: [JavaFX](https://openjfx.io/), [Jackson](https://github.com/FasterXML/jackson), [JUnit5](https://github.com/junit-team/junit5)","lastModifiedDate":"2020-05-23"}],"authorContributionMap":{"minreiseah":5,"-":15}}] diff --git a/AY2324S2-CS2103T-T10-2_tp_master/commits.json b/AY2324S2-CS2103T-T10-2_tp_master/commits.json index c86d5db0..4d4fdea3 100644 --- a/AY2324S2-CS2103T-T10-2_tp_master/commits.json +++ b/AY2324S2-CS2103T-T10-2_tp_master/commits.json @@ -1 +1 @@ -{"authorDailyContributionsMap":{"legionlegion":[{"date":"2024-03-07","commitResults":[{"hash":"92830c9c52894fd709dc7fca550e13a11fdb2f32","isMergeCommit":true,"messageTitle":"Merge pull request #11 from SampsonYe1999/update-aboutus","messageBody":"Update profile picture in aboutUs","fileTypesAndContributionMap":{}},{"hash":"ec8edd974b2c34bb248ecd9164c4fb0ae0f66bbc","isMergeCommit":false,"messageTitle":"Update Aboutus page with Shuyuan info","messageBody":"","fileTypesAndContributionMap":{"docs":{"insertions":3,"deletions":3}}},{"hash":"957dbdee2155576b9afb1798c0836dcc66606eae","isMergeCommit":true,"messageTitle":"Merge branch \u0027master\u0027 of https://github.com/AY2324S2-CS2103T-T10-2/tp into docs-update-shuyuan","messageBody":"","fileTypesAndContributionMap":{}},{"hash":"2d56259f6c13c2ee65d8c2f48871608229abfb14","isMergeCommit":true,"messageTitle":"Merge pull request #13 from legionlegion/docs-update-shuyuan","messageBody":"Docs: Update Shuyuan details","fileTypesAndContributionMap":{}},{"hash":"c87a8da7c612a2c3896bef2b00eef8696c99437e","isMergeCommit":true,"messageTitle":"Merge pull request #14 from chengjunyuan/docs-update-junyuan","messageBody":"Update docs with picture and description","fileTypesAndContributionMap":{}}]}],"minreiseah":[{"date":"2024-03-07","commitResults":[{"hash":"4dbea4d28055c20bad0628b601d5641060de988e","isMergeCommit":false,"messageTitle":"Docs: Update AboutUs-MinRei","messageBody":"","fileTypesAndContributionMap":{"docs":{"insertions":10,"deletions":9}}},{"hash":"e4d9323f553717b48aa3641a3b12249766bd011f","isMergeCommit":true,"messageTitle":"Merge pull request #7 from minreiseah/docs-minrei-profile","messageBody":"Docs: Update AboutUs-MinRei","fileTypesAndContributionMap":{}},{"hash":"d8108bd1377b40724c068db2774dc0a556007de3","isMergeCommit":false,"messageTitle":"Docs: Update profile photo name","messageBody":"","fileTypesAndContributionMap":{"docs":{"insertions":1,"deletions":1}}}]}],"qinboan":[],"chengjunyuan":[{"date":"2024-03-07","commitResults":[{"hash":"1bac1c7aa6f9ebb4de01d35d13cfdf15a77acc69","isMergeCommit":true,"messageTitle":"Merge pull request #10 from minreiseah/docs-update-minrei","messageBody":"Docs: Update profile photo name","fileTypesAndContributionMap":{}},{"hash":"03709a73b6e020278e35f276687a4d4811426083","isMergeCommit":false,"messageTitle":"Update docs with picture and description","messageBody":"","fileTypesAndContributionMap":{"docs":{"insertions":4,"deletions":3}}}]}],"SampsonYe1999":[{"date":"2024-03-07","commitResults":[{"hash":"c5d962e7592063722fad1e9b3e982e4b82e23a5b","isMergeCommit":false,"messageTitle":"Update profile picture in aboutUs","messageBody":"","fileTypesAndContributionMap":{"docs":{"insertions":3,"deletions":3}}}]}]},"authorFileTypeContributionMap":{"legionlegion":{"docs":3,"functional-code":0,"test-code":0},"minreiseah":{"docs":10,"functional-code":0,"test-code":0},"qinboan":{"docs":0,"functional-code":0,"test-code":0},"chengjunyuan":{"docs":4,"functional-code":0,"test-code":0},"SampsonYe1999":{"docs":3,"functional-code":0,"test-code":0}},"authorContributionVariance":{"legionlegion":2.3877552,"minreiseah":29.25,"qinboan":0.0,"chengjunyuan":3.25,"SampsonYe1999":2.3877552},"authorDisplayNameMap":{"legionlegion":"CS2103T-T10-2 CUI ..YUAN","minreiseah":"CS2103T-T10-2 SEAH..-REI","qinboan":"CS2103T-T10-2 QIN ..BOAN","chengjunyuan":"CS2103T-T10-2 CHEN..YUAN","SampsonYe1999":"CS2103T-T10-2 YE K..HANG"}} +{"authorDailyContributionsMap":{"legionlegion":[{"date":"2024-03-07","commitResults":[{"hash":"92830c9c52894fd709dc7fca550e13a11fdb2f32","isMergeCommit":true,"messageTitle":"Merge pull request #11 from SampsonYe1999/update-aboutus","messageBody":"Update profile picture in aboutUs","fileTypesAndContributionMap":{}},{"hash":"ec8edd974b2c34bb248ecd9164c4fb0ae0f66bbc","isMergeCommit":false,"messageTitle":"Update Aboutus page with Shuyuan info","messageBody":"","fileTypesAndContributionMap":{"docs":{"insertions":3,"deletions":3}}},{"hash":"957dbdee2155576b9afb1798c0836dcc66606eae","isMergeCommit":true,"messageTitle":"Merge branch \u0027master\u0027 of https://github.com/AY2324S2-CS2103T-T10-2/tp into docs-update-shuyuan","messageBody":"","fileTypesAndContributionMap":{}},{"hash":"2d56259f6c13c2ee65d8c2f48871608229abfb14","isMergeCommit":true,"messageTitle":"Merge pull request #13 from legionlegion/docs-update-shuyuan","messageBody":"Docs: Update Shuyuan details","fileTypesAndContributionMap":{}},{"hash":"c87a8da7c612a2c3896bef2b00eef8696c99437e","isMergeCommit":true,"messageTitle":"Merge pull request #14 from chengjunyuan/docs-update-junyuan","messageBody":"Update docs with picture and description","fileTypesAndContributionMap":{}}]},{"date":"2024-03-08","commitResults":[{"hash":"f26443c68dfe375cf90a44ef8df6ca470377cf83","isMergeCommit":true,"messageTitle":"Merge pull request #8 from minreiseah/docs-devops","messageBody":"Docs: Add github workflow","fileTypesAndContributionMap":{}},{"hash":"dd961d3c70d4b94ffde4837ddc13c3f47f959b09","isMergeCommit":true,"messageTitle":"Merge pull request #15 from chengjunyuan/update-ug","messageBody":"Update UG and DG","fileTypesAndContributionMap":{}}]}],"minreiseah":[{"date":"2024-03-07","commitResults":[{"hash":"4dbea4d28055c20bad0628b601d5641060de988e","isMergeCommit":false,"messageTitle":"Docs: Update AboutUs-MinRei","messageBody":"","fileTypesAndContributionMap":{"docs":{"insertions":10,"deletions":9}}},{"hash":"e4d9323f553717b48aa3641a3b12249766bd011f","isMergeCommit":true,"messageTitle":"Merge pull request #7 from minreiseah/docs-minrei-profile","messageBody":"Docs: Update AboutUs-MinRei","fileTypesAndContributionMap":{}},{"hash":"93e94ab7f6ee5cd83de628d7104bc7db2626f3ea","isMergeCommit":false,"messageTitle":"Docs: Add github workflow","messageBody":"","fileTypesAndContributionMap":{"docs":{"insertions":18,"deletions":0}}},{"hash":"d8108bd1377b40724c068db2774dc0a556007de3","isMergeCommit":false,"messageTitle":"Docs: Update profile photo name","messageBody":"","fileTypesAndContributionMap":{"docs":{"insertions":1,"deletions":1}}}]},{"date":"2024-03-08","commitResults":[{"hash":"1aeaed6b457c07597a0d4b998ab88d95a2d6ebe4","isMergeCommit":false,"messageTitle":"Update user guide","messageBody":"","fileTypesAndContributionMap":{"docs":{"insertions":90,"deletions":121}}},{"hash":"ff918dd1f701064b4c0ba07068c53394e5e3b1a0","isMergeCommit":false,"messageTitle":"Remove traces of AB3","messageBody":"","fileTypesAndContributionMap":{"docs":{"insertions":5,"deletions":6}}},{"hash":"eb37c9316c12bcdd4c7184f75e76260e9d583666","isMergeCommit":false,"messageTitle":"Update index.md","messageBody":"","fileTypesAndContributionMap":{"docs":{"insertions":2,"deletions":2}}},{"hash":"e32dd76f7e98c642d157475f846b74f4dbf32571","isMergeCommit":true,"messageTitle":"Merge pull request #23 from minreiseah/docs-user-guide","messageBody":"Update user guide","fileTypesAndContributionMap":{}}]}],"qinboan":[{"date":"2024-03-08","commitResults":[{"hash":"5198812b583848919a686ea372f04c08a7e84cb2","isMergeCommit":false,"messageTitle":"Update AboutUs-Boan","messageBody":"","fileTypesAndContributionMap":{"docs":{"insertions":1,"deletions":1}}},{"hash":"a7b5ee8b344b09456fa5079aa5d95d025e2860cf","isMergeCommit":false,"messageTitle":"Update AboutUs-Boan","messageBody":"","fileTypesAndContributionMap":{"docs":{"insertions":1,"deletions":1}}},{"hash":"c5798bed244b8b6317a9cfccf3ac4f4fb56263c0","isMergeCommit":true,"messageTitle":"Merge pull request #20 from qinboan/docs-aboutus-boan","messageBody":"Docs aboutUs Boan","fileTypesAndContributionMap":{}},{"hash":"d371200362d4524c33d87ecadeefc192372fdfaf","isMergeCommit":false,"messageTitle":"Update README.md","messageBody":"","fileTypesAndContributionMap":{"docs":{"insertions":50,"deletions":14}}},{"hash":"7b9cec87459876e1967cfa0e3369e18091abbf3e","isMergeCommit":false,"messageTitle":"add new line in end of README","messageBody":"","fileTypesAndContributionMap":{"docs":{"insertions":1,"deletions":1}}},{"hash":"a9add40ae607309ab1aea98251dd22c84491da55","isMergeCommit":true,"messageTitle":"Merge pull request #21 from qinboan/docs-README","messageBody":"Update README.md","fileTypesAndContributionMap":{}}]}],"chengjunyuan":[{"date":"2024-03-07","commitResults":[{"hash":"1bac1c7aa6f9ebb4de01d35d13cfdf15a77acc69","isMergeCommit":true,"messageTitle":"Merge pull request #10 from minreiseah/docs-update-minrei","messageBody":"Docs: Update profile photo name","fileTypesAndContributionMap":{}},{"hash":"03709a73b6e020278e35f276687a4d4811426083","isMergeCommit":false,"messageTitle":"Update docs with picture and description","messageBody":"","fileTypesAndContributionMap":{"docs":{"insertions":4,"deletions":3}}},{"hash":"a2f4ca72097e229edf3f548fe99b40040fcde1f9","isMergeCommit":false,"messageTitle":"Update UG and DG to remove AB3","messageBody":"","fileTypesAndContributionMap":{"docs":{"insertions":20,"deletions":20}}}]},{"date":"2024-03-08","commitResults":[{"hash":"e289b6da18252a2f4f28cef2b93a891330141f72","isMergeCommit":true,"messageTitle":"Merge branch \u0027master\u0027 into update-ug","messageBody":"","fileTypesAndContributionMap":{}},{"hash":"b3bbbf286ce595a8f49199baeaa1cad5d70bf327","isMergeCommit":false,"messageTitle":"Update NFRs in DG","messageBody":"","fileTypesAndContributionMap":{"docs":{"insertions":16,"deletions":8}}},{"hash":"2322950cadb2d0c0f0d28ac410b8963ac031aced","isMergeCommit":false,"messageTitle":"Update UserGuide.md","messageBody":"","fileTypesAndContributionMap":{"docs":{"insertions":3,"deletions":3}}},{"hash":"0305ac23214b41b5eced82732b76ea6057216021","isMergeCommit":true,"messageTitle":"Merge pull request #24 from chengjunyuan/update-dg-18","messageBody":"Update NFRs in DG","fileTypesAndContributionMap":{}}]}],"SampsonYe1999":[{"date":"2024-03-07","commitResults":[{"hash":"c5d962e7592063722fad1e9b3e982e4b82e23a5b","isMergeCommit":false,"messageTitle":"Update profile picture in aboutUs","messageBody":"","fileTypesAndContributionMap":{"docs":{"insertions":3,"deletions":3}}}]}]},"authorFileTypeContributionMap":{"legionlegion":{"docs":3,"functional-code":0,"test-code":0},"minreiseah":{"docs":123,"functional-code":0,"test-code":0},"qinboan":{"docs":52,"functional-code":0,"test-code":0},"chengjunyuan":{"docs":21,"functional-code":0,"test-code":0},"SampsonYe1999":{"docs":3,"functional-code":0,"test-code":0}},"authorContributionVariance":{"legionlegion":2.24,"minreiseah":3194.3555,"qinboan":304.8889,"chengjunyuan":180.91556,"SampsonYe1999":2.24},"authorDisplayNameMap":{"legionlegion":"CS2103T-T10-2 CUI ..YUAN","minreiseah":"CS2103T-T10-2 SEAH..-REI","qinboan":"CS2103T-T10-2 QIN ..BOAN","chengjunyuan":"CS2103T-T10-2 CHEN..YUAN","SampsonYe1999":"CS2103T-T10-2 YE K..HANG"}} diff --git a/AY2324S2-CS2103T-T11-4_tp_master/authorship.json b/AY2324S2-CS2103T-T11-4_tp_master/authorship.json index 7902873b..f37e58de 100644 --- a/AY2324S2-CS2103T-T11-4_tp_master/authorship.json +++ b/AY2324S2-CS2103T-T11-4_tp_master/authorship.json @@ -1 +1 @@ -[{"path":"README.md","fileType":"docs","lines":[{"lineNumber":1,"author":{"gitId":"yyccbb"},"content":"[![codecov](https://codecov.io/gh/AY2324S2-CS2103T-T11-4/tp/graph/badge.svg?token\u003dYS8FHD1IQM)](https://codecov.io/gh/AY2324S2-CS2103T-T11-4/tp)","lastModifiedDate":"2024-03-07"},{"lineNumber":2,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":3,"author":{"gitId":"-"},"content":"![Ui](docs/images/Ui.png)","lastModifiedDate":"2020-05-23"},{"lineNumber":4,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":5,"author":{"gitId":"yyccbb"},"content":"* **TrAcker** is a student software engineering project that aims to create an application to help Head Teaching","lastModifiedDate":"2024-03-07"},{"lineNumber":6,"author":{"gitId":"yyccbb"},"content":" Assistants (Head TAs) track the records of other teaching assistants (TAs) and students.","lastModifiedDate":"2024-03-07"},{"lineNumber":7,"author":{"gitId":"-"},"content":" Example usages:","lastModifiedDate":"2020-05-23"},{"lineNumber":8,"author":{"gitId":"yyccbb"},"content":" * Add/delete contact details of TAs and students","lastModifiedDate":"2024-03-07"},{"lineNumber":9,"author":{"gitId":"yyccbb"},"content":" * Update contact details of TAs and students","lastModifiedDate":"2024-03-07"},{"lineNumber":10,"author":{"gitId":"yyccbb"},"content":" * Edit tags which reflect the attendance of students","lastModifiedDate":"2024-03-07"},{"lineNumber":11,"author":{"gitId":"yyccbb"},"content":"","lastModifiedDate":"2024-03-07"},{"lineNumber":12,"author":{"gitId":"yyccbb"},"content":"* This project is based on the AddressBook-Level3 project created by the [SE-EDU initiative](https://se-education.org).","lastModifiedDate":"2024-03-07"}],"authorContributionMap":{"yyccbb":8,"-":4}},{"path":"docs/AboutUs.md","fileType":"docs","lines":[{"lineNumber":1,"author":{"gitId":"-"},"content":"---","lastModifiedDate":"2020-05-23"},{"lineNumber":2,"author":{"gitId":"-"},"content":"layout: page","lastModifiedDate":"2020-05-23"},{"lineNumber":3,"author":{"gitId":"-"},"content":"title: About Us","lastModifiedDate":"2020-05-23"},{"lineNumber":4,"author":{"gitId":"-"},"content":"---","lastModifiedDate":"2020-05-23"},{"lineNumber":5,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":6,"author":{"gitId":"-"},"content":"We are a team based in the [School of Computing, National University of Singapore](http://www.comp.nus.edu.sg).","lastModifiedDate":"2020-05-23"},{"lineNumber":7,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":8,"author":{"gitId":"-"},"content":"You can reach us at the email `seer[at]comp.nus.edu.sg`","lastModifiedDate":"2020-06-17"},{"lineNumber":9,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-06-17"},{"lineNumber":10,"author":{"gitId":"-"},"content":"## Project team","lastModifiedDate":"2020-06-07"},{"lineNumber":11,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":12,"author":{"gitId":"kaitinghh"},"content":"### Ho Kai Ting","lastModifiedDate":"2024-03-07"},{"lineNumber":13,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":14,"author":{"gitId":"kaitinghh"},"content":"\u003cimg src\u003d\"images/kaiting.png\" width\u003d\"200px\"\u003e","lastModifiedDate":"2024-03-07"},{"lineNumber":15,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":16,"author":{"gitId":"kaitinghh"},"content":"[[github](https://github.com/kaitinghh)]","lastModifiedDate":"2024-03-07"},{"lineNumber":17,"author":{"gitId":"kaitinghh"},"content":"[[portfolio](team/kaiting.md)]","lastModifiedDate":"2024-03-07"},{"lineNumber":18,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":19,"author":{"gitId":"kaitinghh"},"content":"* Role: Developer","lastModifiedDate":"2024-03-07"},{"lineNumber":20,"author":{"gitId":"kaitinghh"},"content":"* Responsibilities: ","lastModifiedDate":"2024-03-07"},{"lineNumber":21,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":22,"author":{"gitId":"wang-xinrong"},"content":"### Wang Xinrong","lastModifiedDate":"2024-03-07"},{"lineNumber":23,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":24,"author":{"gitId":"wang-xinrong"},"content":"\u003cimg src\u003d\"images/wang-xinrong.png\" width\u003d\"200px\"\u003e","lastModifiedDate":"2024-03-07"},{"lineNumber":25,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":26,"author":{"gitId":"wang-xinrong"},"content":"[[github](http://github.com/wang-xinrong)]","lastModifiedDate":"2024-03-07"},{"lineNumber":27,"author":{"gitId":"wang-xinrong"},"content":"[[portfolio](team/wangxinrong.md)]","lastModifiedDate":"2024-03-07"},{"lineNumber":28,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":29,"author":{"gitId":"wang-xinrong"},"content":"* Role: Developer","lastModifiedDate":"2024-03-07"},{"lineNumber":30,"author":{"gitId":"-"},"content":"* Responsibilities: UI","lastModifiedDate":"2020-05-23"},{"lineNumber":31,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":32,"author":{"gitId":"wongkj12"},"content":"### Wong Kai Jie","lastModifiedDate":"2024-03-07"},{"lineNumber":33,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":34,"author":{"gitId":"wongkj12"},"content":"\u003cimg src\u003d\"images/wongkj12.jpg\" width\u003d\"200px\"\u003e","lastModifiedDate":"2024-03-07"},{"lineNumber":35,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":36,"author":{"gitId":"wongkj12"},"content":"[[github](http://github.com/wongkj12)] [[portfolio](team/wongkj12.md)]","lastModifiedDate":"2024-03-07"},{"lineNumber":37,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":38,"author":{"gitId":"-"},"content":"* Role: Developer","lastModifiedDate":"2020-05-23"},{"lineNumber":39,"author":{"gitId":"-"},"content":"* Responsibilities: Data","lastModifiedDate":"2020-05-23"},{"lineNumber":40,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":41,"author":{"gitId":"wang-xinrong"},"content":"### Yong Kotaro","lastModifiedDate":"2024-03-07"},{"lineNumber":42,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":43,"author":{"gitId":"wang-xinrong"},"content":"\u003cimg src\u003d\"images/yongkotaro.png\" width\u003d\"200px\"\u003e","lastModifiedDate":"2024-03-07"},{"lineNumber":44,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":45,"author":{"gitId":"wang-xinrong"},"content":"[[github](http://github.com/yongkotaro)]","lastModifiedDate":"2024-03-07"},{"lineNumber":46,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":47,"author":{"gitId":"-"},"content":"* Role: Developer","lastModifiedDate":"2020-05-23"},{"lineNumber":48,"author":{"gitId":"wang-xinrong"},"content":"* Responsibilities: UI","lastModifiedDate":"2024-03-07"},{"lineNumber":49,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":50,"author":{"gitId":"yyccbb"},"content":"### Yu Chenbo","lastModifiedDate":"2024-03-07"},{"lineNumber":51,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":52,"author":{"gitId":"yyccbb"},"content":"\u003cimg src\u003d\"images/yyccbb.png\" width\u003d\"200px\"\u003e","lastModifiedDate":"2024-03-07"},{"lineNumber":53,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":54,"author":{"gitId":"yyccbb"},"content":"[[github](http://github.com/yyccbb)]","lastModifiedDate":"2024-03-07"},{"lineNumber":55,"author":{"gitId":"yyccbb"},"content":"[[portfolio](team/yyccbb)]","lastModifiedDate":"2024-03-07"},{"lineNumber":56,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":57,"author":{"gitId":"-"},"content":"* Role: Developer","lastModifiedDate":"2020-05-23"},{"lineNumber":58,"author":{"gitId":"yyccbb"},"content":"* Responsibilities: Project Structure","lastModifiedDate":"2024-03-07"}],"authorContributionMap":{"yyccbb":5,"wongkj12":3,"kaitinghh":6,"wang-xinrong":9,"-":35}},{"path":"docs/DeveloperGuide.md","fileType":"docs","lines":[{"lineNumber":1,"author":{"gitId":"-"},"content":"---","lastModifiedDate":"2020-05-23"},{"lineNumber":2,"author":{"gitId":"-"},"content":"layout: page","lastModifiedDate":"2020-05-23"},{"lineNumber":3,"author":{"gitId":"-"},"content":"title: Developer Guide","lastModifiedDate":"2020-05-23"},{"lineNumber":4,"author":{"gitId":"-"},"content":"---","lastModifiedDate":"2020-05-23"},{"lineNumber":5,"author":{"gitId":"-"},"content":"* Table of Contents","lastModifiedDate":"2020-05-23"},{"lineNumber":6,"author":{"gitId":"-"},"content":"{:toc}","lastModifiedDate":"2020-05-23"},{"lineNumber":7,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":8,"author":{"gitId":"-"},"content":"--------------------------------------------------------------------------------------------------------------------","lastModifiedDate":"2020-05-23"},{"lineNumber":9,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2021-07-30"},{"lineNumber":10,"author":{"gitId":"-"},"content":"## **Acknowledgements**","lastModifiedDate":"2021-07-30"},{"lineNumber":11,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2021-07-30"},{"lineNumber":12,"author":{"gitId":"-"},"content":"* {list here sources of all reused/adapted ideas, code, documentation, and third-party libraries -- include links to the original source as well}","lastModifiedDate":"2021-07-30"},{"lineNumber":13,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2021-07-30"},{"lineNumber":14,"author":{"gitId":"-"},"content":"--------------------------------------------------------------------------------------------------------------------","lastModifiedDate":"2021-07-30"},{"lineNumber":15,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":16,"author":{"gitId":"-"},"content":"## **Setting up, getting started**","lastModifiedDate":"2020-05-23"},{"lineNumber":17,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":18,"author":{"gitId":"-"},"content":"Refer to the guide [_Setting up and getting started_](SettingUp.md).","lastModifiedDate":"2020-05-23"},{"lineNumber":19,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":20,"author":{"gitId":"-"},"content":"--------------------------------------------------------------------------------------------------------------------","lastModifiedDate":"2020-05-23"},{"lineNumber":21,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":22,"author":{"gitId":"-"},"content":"## **Design**","lastModifiedDate":"2020-05-23"},{"lineNumber":23,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":24,"author":{"gitId":"-"},"content":"\u003cdiv markdown\u003d\"span\" class\u003d\"alert alert-primary\"\u003e","lastModifiedDate":"2021-07-31"},{"lineNumber":25,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":26,"author":{"gitId":"-"},"content":":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.","lastModifiedDate":"2023-09-03"},{"lineNumber":27,"author":{"gitId":"-"},"content":"\u003c/div\u003e","lastModifiedDate":"2021-07-31"},{"lineNumber":28,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":29,"author":{"gitId":"-"},"content":"### Architecture","lastModifiedDate":"2021-07-31"},{"lineNumber":30,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":31,"author":{"gitId":"-"},"content":"\u003cimg src\u003d\"images/ArchitectureDiagram.png\" width\u003d\"280\" /\u003e","lastModifiedDate":"2021-07-31"},{"lineNumber":32,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":33,"author":{"gitId":"-"},"content":"The ***Architecture Diagram*** given above explains the high-level design of the App.","lastModifiedDate":"2021-07-31"},{"lineNumber":34,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":35,"author":{"gitId":"-"},"content":"Given below is a quick overview of main components and how they interact with each other.","lastModifiedDate":"2021-07-31"},{"lineNumber":36,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2021-07-31"},{"lineNumber":37,"author":{"gitId":"-"},"content":"**Main components of the architecture**","lastModifiedDate":"2021-07-31"},{"lineNumber":38,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":39,"author":{"gitId":"-"},"content":"**`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.","lastModifiedDate":"2023-09-03"},{"lineNumber":40,"author":{"gitId":"-"},"content":"* At app launch, it initializes the other components in the correct sequence, and connects them up with each other.","lastModifiedDate":"2023-09-03"},{"lineNumber":41,"author":{"gitId":"-"},"content":"* At shut down, it shuts down the other components and invokes cleanup methods where necessary.","lastModifiedDate":"2023-09-03"},{"lineNumber":42,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":43,"author":{"gitId":"-"},"content":"The bulk of the app\u0027s work is done by the following four components:","lastModifiedDate":"2023-09-03"},{"lineNumber":44,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":45,"author":{"gitId":"-"},"content":"* [**`UI`**](#ui-component): The UI of the App.","lastModifiedDate":"2020-05-23"},{"lineNumber":46,"author":{"gitId":"-"},"content":"* [**`Logic`**](#logic-component): The command executor.","lastModifiedDate":"2020-05-23"},{"lineNumber":47,"author":{"gitId":"-"},"content":"* [**`Model`**](#model-component): Holds the data of the App in memory.","lastModifiedDate":"2020-05-23"},{"lineNumber":48,"author":{"gitId":"-"},"content":"* [**`Storage`**](#storage-component): Reads data from, and writes data to, the hard disk.","lastModifiedDate":"2020-05-23"},{"lineNumber":49,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":50,"author":{"gitId":"-"},"content":"[**`Commons`**](#common-classes) represents a collection of classes used by multiple other components.","lastModifiedDate":"2023-09-03"},{"lineNumber":51,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":52,"author":{"gitId":"-"},"content":"**How the architecture components interact with each other**","lastModifiedDate":"2020-05-23"},{"lineNumber":53,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":54,"author":{"gitId":"-"},"content":"The *Sequence Diagram* below shows how the components interact with each other for the scenario where the user issues the command `delete 1`.","lastModifiedDate":"2020-05-23"},{"lineNumber":55,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":56,"author":{"gitId":"-"},"content":"\u003cimg src\u003d\"images/ArchitectureSequenceDiagram.png\" width\u003d\"574\" /\u003e","lastModifiedDate":"2020-06-07"},{"lineNumber":57,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":58,"author":{"gitId":"-"},"content":"Each of the four main components (also shown in the diagram above),","lastModifiedDate":"2021-07-31"},{"lineNumber":59,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2021-07-31"},{"lineNumber":60,"author":{"gitId":"-"},"content":"* defines its *API* in an `interface` with the same name as the Component.","lastModifiedDate":"2021-07-31"},{"lineNumber":61,"author":{"gitId":"-"},"content":"* implements its functionality using a concrete `{Component Name}Manager` class (which follows the corresponding API `interface` mentioned in the previous point.","lastModifiedDate":"2021-07-31"},{"lineNumber":62,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2021-07-31"},{"lineNumber":63,"author":{"gitId":"-"},"content":"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\u0027s being coupled to the implementation of a component), as illustrated in the (partial) class diagram below.","lastModifiedDate":"2021-07-31"},{"lineNumber":64,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2021-07-31"},{"lineNumber":65,"author":{"gitId":"-"},"content":"\u003cimg src\u003d\"images/ComponentManagers.png\" width\u003d\"300\" /\u003e","lastModifiedDate":"2021-07-31"},{"lineNumber":66,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2021-07-31"},{"lineNumber":67,"author":{"gitId":"-"},"content":"The sections below give more details of each component.","lastModifiedDate":"2020-05-23"},{"lineNumber":68,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":69,"author":{"gitId":"-"},"content":"### UI component","lastModifiedDate":"2020-05-23"},{"lineNumber":70,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":71,"author":{"gitId":"-"},"content":"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)","lastModifiedDate":"2021-07-31"},{"lineNumber":72,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":73,"author":{"gitId":"-"},"content":"![Structure of the UI Component](images/UiClassDiagram.png)","lastModifiedDate":"2021-07-31"},{"lineNumber":74,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":75,"author":{"gitId":"-"},"content":"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.","lastModifiedDate":"2021-07-31"},{"lineNumber":76,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":77,"author":{"gitId":"-"},"content":"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)","lastModifiedDate":"2021-07-31"},{"lineNumber":78,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":79,"author":{"gitId":"-"},"content":"The `UI` component,","lastModifiedDate":"2020-05-23"},{"lineNumber":80,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":81,"author":{"gitId":"-"},"content":"* executes user commands using the `Logic` component.","lastModifiedDate":"2021-07-31"},{"lineNumber":82,"author":{"gitId":"-"},"content":"* listens for changes to `Model` data so that the UI can be updated with the modified data.","lastModifiedDate":"2021-07-31"},{"lineNumber":83,"author":{"gitId":"-"},"content":"* keeps a reference to the `Logic` component, because the `UI` relies on the `Logic` to execute commands.","lastModifiedDate":"2021-07-31"},{"lineNumber":84,"author":{"gitId":"-"},"content":"* depends on some classes in the `Model` component, as it displays `Person` object residing in the `Model`.","lastModifiedDate":"2021-07-31"},{"lineNumber":85,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":86,"author":{"gitId":"-"},"content":"### Logic component","lastModifiedDate":"2020-05-23"},{"lineNumber":87,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":88,"author":{"gitId":"-"},"content":"**API** : [`Logic.java`](https://github.com/se-edu/addressbook-level3/tree/master/src/main/java/seedu/address/logic/Logic.java)","lastModifiedDate":"2021-07-31"},{"lineNumber":89,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":90,"author":{"gitId":"-"},"content":"Here\u0027s a (partial) class diagram of the `Logic` component:","lastModifiedDate":"2021-07-31"},{"lineNumber":91,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":92,"author":{"gitId":"-"},"content":"\u003cimg src\u003d\"images/LogicClassDiagram.png\" width\u003d\"550\"/\u003e","lastModifiedDate":"2021-07-31"},{"lineNumber":93,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":94,"author":{"gitId":"-"},"content":"The sequence diagram below illustrates the interactions within the `Logic` component, taking `execute(\"delete 1\")` API call as an example.","lastModifiedDate":"2023-09-03"},{"lineNumber":95,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":96,"author":{"gitId":"-"},"content":"![Interactions Inside the Logic Component for the `delete 1` Command](images/DeleteSequenceDiagram.png)","lastModifiedDate":"2020-05-23"},{"lineNumber":97,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":98,"author":{"gitId":"-"},"content":"\u003cdiv markdown\u003d\"span\" class\u003d\"alert alert-info\"\u003e:information_source: **Note:** The lifeline for `DeleteCommandParser` should end at the destroy marker (X) but due to a limitation of PlantUML, the lifeline continues till the end of diagram.","lastModifiedDate":"2024-02-09"},{"lineNumber":99,"author":{"gitId":"-"},"content":"\u003c/div\u003e","lastModifiedDate":"2020-05-23"},{"lineNumber":100,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":101,"author":{"gitId":"-"},"content":"How the `Logic` component works:","lastModifiedDate":"2023-09-03"},{"lineNumber":102,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2023-09-03"},{"lineNumber":103,"author":{"gitId":"-"},"content":"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.","lastModifiedDate":"2023-09-03"},{"lineNumber":104,"author":{"gitId":"-"},"content":"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`.","lastModifiedDate":"2023-09-03"},{"lineNumber":105,"author":{"gitId":"-"},"content":"1. The command can communicate with the `Model` when it is executed (e.g. to delete a person).\u003cbr\u003e","lastModifiedDate":"2024-02-09"},{"lineNumber":106,"author":{"gitId":"-"},"content":" Note that although this is shown as a single step in the diagram above (for simplicity), in the code it can take several interactions (between the command object and the `Model`) to achieve.","lastModifiedDate":"2024-02-09"},{"lineNumber":107,"author":{"gitId":"-"},"content":"1. The result of the command execution is encapsulated as a `CommandResult` object which is returned back from `Logic`.","lastModifiedDate":"2023-09-03"},{"lineNumber":108,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2023-09-03"},{"lineNumber":109,"author":{"gitId":"-"},"content":"Here are the other classes in `Logic` (omitted from the class diagram above) that are used for parsing a user command:","lastModifiedDate":"2021-07-31"},{"lineNumber":110,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2021-07-31"},{"lineNumber":111,"author":{"gitId":"-"},"content":"\u003cimg src\u003d\"images/ParserClasses.png\" width\u003d\"600\"/\u003e","lastModifiedDate":"2021-07-31"},{"lineNumber":112,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":113,"author":{"gitId":"-"},"content":"How the parsing works:","lastModifiedDate":"2021-07-31"},{"lineNumber":114,"author":{"gitId":"-"},"content":"* 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.","lastModifiedDate":"2021-07-31"},{"lineNumber":115,"author":{"gitId":"-"},"content":"* 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.","lastModifiedDate":"2021-07-31"},{"lineNumber":116,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":117,"author":{"gitId":"-"},"content":"### Model component","lastModifiedDate":"2021-07-31"},{"lineNumber":118,"author":{"gitId":"-"},"content":"**API** : [`Model.java`](https://github.com/se-edu/addressbook-level3/tree/master/src/main/java/seedu/address/model/Model.java)","lastModifiedDate":"2020-05-23"},{"lineNumber":119,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":120,"author":{"gitId":"-"},"content":"\u003cimg src\u003d\"images/ModelClassDiagram.png\" width\u003d\"450\" /\u003e","lastModifiedDate":"2021-07-31"},{"lineNumber":121,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":122,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":123,"author":{"gitId":"-"},"content":"The `Model` component,","lastModifiedDate":"2021-07-31"},{"lineNumber":124,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":125,"author":{"gitId":"-"},"content":"* stores the address book data i.e., all `Person` objects (which are contained in a `UniquePersonList` object).","lastModifiedDate":"2021-07-31"},{"lineNumber":126,"author":{"gitId":"-"},"content":"* stores the currently \u0027selected\u0027 `Person` objects (e.g., results of a search query) as a separate _filtered_ list which is exposed to outsiders as an unmodifiable `ObservableList\u003cPerson\u003e` that can be \u0027observed\u0027 e.g. the UI can be bound to this list so that the UI automatically updates when the data in the list change.","lastModifiedDate":"2021-07-31"},{"lineNumber":127,"author":{"gitId":"-"},"content":"* stores a `UserPref` object that represents the user’s preferences. This is exposed to the outside as a `ReadOnlyUserPref` objects.","lastModifiedDate":"2021-07-31"},{"lineNumber":128,"author":{"gitId":"-"},"content":"* 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)","lastModifiedDate":"2021-07-31"},{"lineNumber":129,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2021-07-31"},{"lineNumber":130,"author":{"gitId":"-"},"content":"\u003cdiv markdown\u003d\"span\" class\u003d\"alert alert-info\"\u003e: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.\u003cbr\u003e","lastModifiedDate":"2021-07-31"},{"lineNumber":131,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2021-07-31"},{"lineNumber":132,"author":{"gitId":"-"},"content":"\u003cimg src\u003d\"images/BetterModelClassDiagram.png\" width\u003d\"450\" /\u003e","lastModifiedDate":"2021-07-31"},{"lineNumber":133,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":134,"author":{"gitId":"-"},"content":"\u003c/div\u003e","lastModifiedDate":"2020-05-23"},{"lineNumber":135,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":136,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":137,"author":{"gitId":"-"},"content":"### Storage component","lastModifiedDate":"2020-05-23"},{"lineNumber":138,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":139,"author":{"gitId":"-"},"content":"**API** : [`Storage.java`](https://github.com/se-edu/addressbook-level3/tree/master/src/main/java/seedu/address/storage/Storage.java)","lastModifiedDate":"2020-05-23"},{"lineNumber":140,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":141,"author":{"gitId":"-"},"content":"\u003cimg src\u003d\"images/StorageClassDiagram.png\" width\u003d\"550\" /\u003e","lastModifiedDate":"2021-07-31"},{"lineNumber":142,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2021-07-31"},{"lineNumber":143,"author":{"gitId":"-"},"content":"The `Storage` component,","lastModifiedDate":"2020-05-23"},{"lineNumber":144,"author":{"gitId":"-"},"content":"* can save both address book data and user preference data in JSON format, and read them back into corresponding objects.","lastModifiedDate":"2023-09-03"},{"lineNumber":145,"author":{"gitId":"-"},"content":"* inherits from both `AddressBookStorage` and `UserPrefStorage`, which means it can be treated as either one (if only the functionality of only one is needed).","lastModifiedDate":"2021-07-31"},{"lineNumber":146,"author":{"gitId":"-"},"content":"* depends on some classes in the `Model` component (because the `Storage` component\u0027s job is to save/retrieve objects that belong to the `Model`)","lastModifiedDate":"2021-07-21"},{"lineNumber":147,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":148,"author":{"gitId":"-"},"content":"### Common classes","lastModifiedDate":"2020-05-23"},{"lineNumber":149,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":150,"author":{"gitId":"-"},"content":"Classes used by multiple components are in the `seedu.addressbook.commons` package.","lastModifiedDate":"2020-05-23"},{"lineNumber":151,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":152,"author":{"gitId":"-"},"content":"--------------------------------------------------------------------------------------------------------------------","lastModifiedDate":"2020-05-23"},{"lineNumber":153,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":154,"author":{"gitId":"-"},"content":"## **Implementation**","lastModifiedDate":"2020-05-23"},{"lineNumber":155,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":156,"author":{"gitId":"-"},"content":"This section describes some noteworthy details on how certain features are implemented.","lastModifiedDate":"2020-05-23"},{"lineNumber":157,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":158,"author":{"gitId":"-"},"content":"### \\[Proposed\\] Undo/redo feature","lastModifiedDate":"2020-06-07"},{"lineNumber":159,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":160,"author":{"gitId":"-"},"content":"#### Proposed Implementation","lastModifiedDate":"2020-05-23"},{"lineNumber":161,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":162,"author":{"gitId":"-"},"content":"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:","lastModifiedDate":"2020-05-23"},{"lineNumber":163,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":164,"author":{"gitId":"-"},"content":"* `VersionedAddressBook#commit()` — Saves the current address book state in its history.","lastModifiedDate":"2020-05-23"},{"lineNumber":165,"author":{"gitId":"-"},"content":"* `VersionedAddressBook#undo()` — Restores the previous address book state from its history.","lastModifiedDate":"2020-05-23"},{"lineNumber":166,"author":{"gitId":"-"},"content":"* `VersionedAddressBook#redo()` — Restores a previously undone address book state from its history.","lastModifiedDate":"2020-05-23"},{"lineNumber":167,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":168,"author":{"gitId":"-"},"content":"These operations are exposed in the `Model` interface as `Model#commitAddressBook()`, `Model#undoAddressBook()` and `Model#redoAddressBook()` respectively.","lastModifiedDate":"2020-05-23"},{"lineNumber":169,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":170,"author":{"gitId":"-"},"content":"Given below is an example usage scenario and how the undo/redo mechanism behaves at each step.","lastModifiedDate":"2020-05-23"},{"lineNumber":171,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":172,"author":{"gitId":"-"},"content":"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.","lastModifiedDate":"2020-05-23"},{"lineNumber":173,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":174,"author":{"gitId":"-"},"content":"![UndoRedoState0](images/UndoRedoState0.png)","lastModifiedDate":"2020-05-23"},{"lineNumber":175,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":176,"author":{"gitId":"-"},"content":"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.","lastModifiedDate":"2020-05-23"},{"lineNumber":177,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":178,"author":{"gitId":"-"},"content":"![UndoRedoState1](images/UndoRedoState1.png)","lastModifiedDate":"2020-05-23"},{"lineNumber":179,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":180,"author":{"gitId":"-"},"content":"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`.","lastModifiedDate":"2020-05-23"},{"lineNumber":181,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":182,"author":{"gitId":"-"},"content":"![UndoRedoState2](images/UndoRedoState2.png)","lastModifiedDate":"2020-05-23"},{"lineNumber":183,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":184,"author":{"gitId":"-"},"content":"\u003cdiv markdown\u003d\"span\" class\u003d\"alert alert-info\"\u003e: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`.","lastModifiedDate":"2020-05-23"},{"lineNumber":185,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":186,"author":{"gitId":"-"},"content":"\u003c/div\u003e","lastModifiedDate":"2020-05-23"},{"lineNumber":187,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":188,"author":{"gitId":"-"},"content":"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.","lastModifiedDate":"2020-05-23"},{"lineNumber":189,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":190,"author":{"gitId":"-"},"content":"![UndoRedoState3](images/UndoRedoState3.png)","lastModifiedDate":"2020-05-23"},{"lineNumber":191,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":192,"author":{"gitId":"-"},"content":"\u003cdiv markdown\u003d\"span\" class\u003d\"alert alert-info\"\u003e: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","lastModifiedDate":"2020-05-23"},{"lineNumber":193,"author":{"gitId":"-"},"content":"than attempting to perform the undo.","lastModifiedDate":"2020-05-23"},{"lineNumber":194,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":195,"author":{"gitId":"-"},"content":"\u003c/div\u003e","lastModifiedDate":"2020-05-23"},{"lineNumber":196,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":197,"author":{"gitId":"-"},"content":"The following sequence diagram shows how an undo operation goes through the `Logic` component:","lastModifiedDate":"2024-02-09"},{"lineNumber":198,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":199,"author":{"gitId":"-"},"content":"![UndoSequenceDiagram](images/UndoSequenceDiagram-Logic.png)","lastModifiedDate":"2024-02-09"},{"lineNumber":200,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":201,"author":{"gitId":"-"},"content":"\u003cdiv markdown\u003d\"span\" class\u003d\"alert alert-info\"\u003e: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.","lastModifiedDate":"2020-05-23"},{"lineNumber":202,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":203,"author":{"gitId":"-"},"content":"\u003c/div\u003e","lastModifiedDate":"2020-05-23"},{"lineNumber":204,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":205,"author":{"gitId":"-"},"content":"Similarly, how an undo operation goes through the `Model` component is shown below:","lastModifiedDate":"2024-02-09"},{"lineNumber":206,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2024-02-09"},{"lineNumber":207,"author":{"gitId":"-"},"content":"![UndoSequenceDiagram](images/UndoSequenceDiagram-Model.png)","lastModifiedDate":"2024-02-09"},{"lineNumber":208,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2024-02-09"},{"lineNumber":209,"author":{"gitId":"-"},"content":"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.","lastModifiedDate":"2020-05-23"},{"lineNumber":210,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":211,"author":{"gitId":"-"},"content":"\u003cdiv markdown\u003d\"span\" class\u003d\"alert alert-info\"\u003e: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.","lastModifiedDate":"2020-05-23"},{"lineNumber":212,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":213,"author":{"gitId":"-"},"content":"\u003c/div\u003e","lastModifiedDate":"2020-05-23"},{"lineNumber":214,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":215,"author":{"gitId":"-"},"content":"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.","lastModifiedDate":"2020-05-23"},{"lineNumber":216,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":217,"author":{"gitId":"-"},"content":"![UndoRedoState4](images/UndoRedoState4.png)","lastModifiedDate":"2020-05-23"},{"lineNumber":218,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":219,"author":{"gitId":"-"},"content":"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.","lastModifiedDate":"2020-05-23"},{"lineNumber":220,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":221,"author":{"gitId":"-"},"content":"![UndoRedoState5](images/UndoRedoState5.png)","lastModifiedDate":"2020-05-23"},{"lineNumber":222,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":223,"author":{"gitId":"-"},"content":"The following activity diagram summarizes what happens when a user executes a new command:","lastModifiedDate":"2020-05-23"},{"lineNumber":224,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":225,"author":{"gitId":"-"},"content":"\u003cimg src\u003d\"images/CommitActivityDiagram.png\" width\u003d\"250\" /\u003e","lastModifiedDate":"2021-07-31"},{"lineNumber":226,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":227,"author":{"gitId":"-"},"content":"#### Design considerations:","lastModifiedDate":"2021-07-31"},{"lineNumber":228,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":229,"author":{"gitId":"-"},"content":"**Aspect: How undo \u0026 redo executes:**","lastModifiedDate":"2021-07-31"},{"lineNumber":230,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":231,"author":{"gitId":"-"},"content":"* **Alternative 1 (current choice):** Saves the entire address book.","lastModifiedDate":"2020-05-23"},{"lineNumber":232,"author":{"gitId":"-"},"content":" * Pros: Easy to implement.","lastModifiedDate":"2020-05-23"},{"lineNumber":233,"author":{"gitId":"-"},"content":" * Cons: May have performance issues in terms of memory usage.","lastModifiedDate":"2020-05-23"},{"lineNumber":234,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":235,"author":{"gitId":"-"},"content":"* **Alternative 2:** Individual command knows how to undo/redo by","lastModifiedDate":"2020-05-23"},{"lineNumber":236,"author":{"gitId":"-"},"content":" itself.","lastModifiedDate":"2020-05-23"},{"lineNumber":237,"author":{"gitId":"-"},"content":" * Pros: Will use less memory (e.g. for `delete`, just save the person being deleted).","lastModifiedDate":"2020-05-23"},{"lineNumber":238,"author":{"gitId":"-"},"content":" * Cons: We must ensure that the implementation of each individual command are correct.","lastModifiedDate":"2020-05-23"},{"lineNumber":239,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":240,"author":{"gitId":"-"},"content":"_{more aspects and alternatives to be added}_","lastModifiedDate":"2020-05-23"},{"lineNumber":241,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":242,"author":{"gitId":"-"},"content":"### \\[Proposed\\] Data archiving","lastModifiedDate":"2020-05-23"},{"lineNumber":243,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":244,"author":{"gitId":"-"},"content":"_{Explain here how the data archiving feature will be implemented}_","lastModifiedDate":"2020-05-23"},{"lineNumber":245,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":246,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":247,"author":{"gitId":"-"},"content":"--------------------------------------------------------------------------------------------------------------------","lastModifiedDate":"2020-05-23"},{"lineNumber":248,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":249,"author":{"gitId":"-"},"content":"## **Documentation, logging, testing, configuration, dev-ops**","lastModifiedDate":"2020-06-07"},{"lineNumber":250,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":251,"author":{"gitId":"-"},"content":"* [Documentation guide](Documentation.md)","lastModifiedDate":"2020-06-07"},{"lineNumber":252,"author":{"gitId":"-"},"content":"* [Testing guide](Testing.md)","lastModifiedDate":"2020-06-07"},{"lineNumber":253,"author":{"gitId":"-"},"content":"* [Logging guide](Logging.md)","lastModifiedDate":"2020-06-07"},{"lineNumber":254,"author":{"gitId":"-"},"content":"* [Configuration guide](Configuration.md)","lastModifiedDate":"2020-06-07"},{"lineNumber":255,"author":{"gitId":"-"},"content":"* [DevOps guide](DevOps.md)","lastModifiedDate":"2020-06-07"},{"lineNumber":256,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":257,"author":{"gitId":"-"},"content":"--------------------------------------------------------------------------------------------------------------------","lastModifiedDate":"2020-05-23"},{"lineNumber":258,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":259,"author":{"gitId":"-"},"content":"## **Appendix: Requirements**","lastModifiedDate":"2020-05-23"},{"lineNumber":260,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":261,"author":{"gitId":"-"},"content":"### Product scope","lastModifiedDate":"2020-05-23"},{"lineNumber":262,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":263,"author":{"gitId":"-"},"content":"**Target user profile**:","lastModifiedDate":"2020-05-23"},{"lineNumber":264,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":265,"author":{"gitId":"-"},"content":"* has a need to manage a significant number of contacts","lastModifiedDate":"2020-05-23"},{"lineNumber":266,"author":{"gitId":"-"},"content":"* prefer desktop apps over other types","lastModifiedDate":"2020-05-23"},{"lineNumber":267,"author":{"gitId":"-"},"content":"* can type fast","lastModifiedDate":"2020-05-23"},{"lineNumber":268,"author":{"gitId":"-"},"content":"* prefers typing to mouse interactions","lastModifiedDate":"2020-05-26"},{"lineNumber":269,"author":{"gitId":"-"},"content":"* is reasonably comfortable using CLI apps","lastModifiedDate":"2020-05-23"},{"lineNumber":270,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":271,"author":{"gitId":"-"},"content":"**Value proposition**: manage contacts faster than a typical mouse/GUI driven app","lastModifiedDate":"2020-05-23"},{"lineNumber":272,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":273,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":274,"author":{"gitId":"-"},"content":"### User stories","lastModifiedDate":"2020-06-07"},{"lineNumber":275,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":276,"author":{"gitId":"-"},"content":"Priorities: High (must have) - `* * *`, Medium (nice to have) - `* *`, Low (unlikely to have) - `*`","lastModifiedDate":"2020-05-23"},{"lineNumber":277,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":278,"author":{"gitId":"-"},"content":"| Priority | As a …​ | I want to …​ | So that I can…​ |","lastModifiedDate":"2020-05-23"},{"lineNumber":279,"author":{"gitId":"kaitinghh"},"content":"|----------|----------------------------------------------|--------------------------------------------------------------------------------------|---------------------------------------------------------------------------------------------|","lastModifiedDate":"2024-03-07"},{"lineNumber":280,"author":{"gitId":"kaitinghh"},"content":"| `* * *` | user | mark students\u0027 attendance | view attendance records easily in the app. |","lastModifiedDate":"2024-03-07"},{"lineNumber":281,"author":{"gitId":"kaitinghh"},"content":"| `* * *` | user | add a contact entry | |","lastModifiedDate":"2024-03-07"},{"lineNumber":282,"author":{"gitId":"kaitinghh"},"content":"| `* * *` | user | delete a contact entry | |","lastModifiedDate":"2024-03-07"},{"lineNumber":283,"author":{"gitId":"kaitinghh"},"content":"| `* * *` | user | add tags | |","lastModifiedDate":"2024-03-07"},{"lineNumber":284,"author":{"gitId":"kaitinghh"},"content":"| `* * *` | user | delete tags | |","lastModifiedDate":"2024-03-07"},{"lineNumber":285,"author":{"gitId":"kaitinghh"},"content":"| `* * *` | user | edit a contact entry | |","lastModifiedDate":"2024-03-07"},{"lineNumber":286,"author":{"gitId":"kaitinghh"},"content":"| `* * *` | user | search for specific contacts | easily retrieve the contact info of a student/tutor if I need to contact them. |","lastModifiedDate":"2024-03-07"},{"lineNumber":287,"author":{"gitId":"kaitinghh"},"content":"| `* * *` | user | have a basic GUI to interact with | use the app conveniently instead of in shell/terminal. |","lastModifiedDate":"2024-03-07"},{"lineNumber":288,"author":{"gitId":"kaitinghh"},"content":"| `* *` | user with many students and tutors to manage | send group emails to students/tutors | save time on gathering email addresses. |","lastModifiedDate":"2024-03-07"},{"lineNumber":289,"author":{"gitId":"kaitinghh"},"content":"| `* *` | user | organize students into classes | separate records for students from different classes. |","lastModifiedDate":"2024-03-07"},{"lineNumber":290,"author":{"gitId":"kaitinghh"},"content":"| `* *` | beginner user | access a user guide | understand the functions of the app. |","lastModifiedDate":"2024-03-07"},{"lineNumber":291,"author":{"gitId":"kaitinghh"},"content":"| `* *` | potential user exploring the app | see the app populated with sample data | get an idea of how the app is used. |","lastModifiedDate":"2024-03-07"},{"lineNumber":292,"author":{"gitId":"kaitinghh"},"content":"| `* *` | user with many students and tutors to manage | filter contacts with relevant keywords or tags | access records relevant to a specific keyword quickly. |","lastModifiedDate":"2024-03-07"},{"lineNumber":293,"author":{"gitId":"kaitinghh"},"content":"| `* *` | novice user | expect the commands to be common-sensical | pick up the app at speed. |","lastModifiedDate":"2024-03-07"},{"lineNumber":294,"author":{"gitId":"kaitinghh"},"content":"| `* *` | novice user | expect warnings to be given to irreversible actions such as batch delete contacts | will not lose my data out of unfamiliarity with the commands. |","lastModifiedDate":"2024-03-07"},{"lineNumber":295,"author":{"gitId":"kaitinghh"},"content":"| `* *` | frequent user | batch edit contacts | make similar changes to a large number of contacts quickly. |","lastModifiedDate":"2024-03-07"},{"lineNumber":296,"author":{"gitId":"kaitinghh"},"content":"| `* *` | user | see which tutors are available | quickly allocate them for replacement tutoring. |","lastModifiedDate":"2024-03-07"},{"lineNumber":297,"author":{"gitId":"kaitinghh"},"content":"| `* *` | novice user | have a sleek and simple UI | use the app easily. |","lastModifiedDate":"2024-03-07"},{"lineNumber":298,"author":{"gitId":"kaitinghh"},"content":"| `* *` | careless user | backup the last few edits | revert changes if necessary. |","lastModifiedDate":"2024-03-07"},{"lineNumber":299,"author":{"gitId":"kaitinghh"},"content":"| `* *` | user | track students\u0027 assignment progress | follow up if necessary. |","lastModifiedDate":"2024-03-07"},{"lineNumber":300,"author":{"gitId":"kaitinghh"},"content":"| `* *` | user | edit tags | easily customise existing tags for my use case. |","lastModifiedDate":"2024-03-07"},{"lineNumber":301,"author":{"gitId":"kaitinghh"},"content":"| `* *` | careless user | backup the last few edits | revert changes if necessary. |","lastModifiedDate":"2024-03-07"},{"lineNumber":302,"author":{"gitId":"kaitinghh"},"content":"| `*` | expert user | export data in .xlsx | share records with other tutors. |","lastModifiedDate":"2024-03-07"},{"lineNumber":303,"author":{"gitId":"kaitinghh"},"content":"| `*` | expert user | create shortcuts for specific commands | perform the usual tasks quickly. |","lastModifiedDate":"2024-03-07"},{"lineNumber":304,"author":{"gitId":"kaitinghh"},"content":"| `*` | user with lots of data stored | batch imports to have a timestamp | easily locate certain information based on import time, or batch delete them when obsolete. |","lastModifiedDate":"2024-03-07"},{"lineNumber":305,"author":{"gitId":"kaitinghh"},"content":"| `*` | novice user | accessible help page to remind me of command keywords | carry out tasks quickly even without remembering the command keywords. |","lastModifiedDate":"2024-03-07"},{"lineNumber":306,"author":{"gitId":"kaitinghh"},"content":"| `*` | user | generate attendance reports of the students | see who has been skipping classes. |","lastModifiedDate":"2024-03-07"},{"lineNumber":307,"author":{"gitId":"kaitinghh"},"content":"| `*` | busy user | receive reminders for upcoming classes | keep track of my upcoming lessons. |","lastModifiedDate":"2024-03-07"},{"lineNumber":308,"author":{"gitId":"kaitinghh"},"content":"| `*` | impatient user | use the app offline | use the app even when the connection is poor. |","lastModifiedDate":"2024-03-07"},{"lineNumber":309,"author":{"gitId":"kaitinghh"},"content":"| `*` | user who is familiar with cli | be able to access already executed commands | execute them again when needed without having to type everything again. |","lastModifiedDate":"2024-03-07"},{"lineNumber":310,"author":{"gitId":"kaitinghh"},"content":"| `*` | user who is familiar with cli | see a list of suggested commands after having typed the initial letters of a keyword | quickly select a command to complete and it is less likely that I misspell a command. |","lastModifiedDate":"2024-03-07"},{"lineNumber":311,"author":{"gitId":"kaitinghh"},"content":"| `*` | beginner user | GUI to be simple and self-explanatory | get familiar with the app easily. |","lastModifiedDate":"2024-03-07"},{"lineNumber":312,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":313,"author":{"gitId":"-"},"content":"### Use cases","lastModifiedDate":"2020-06-07"},{"lineNumber":314,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":315,"author":{"gitId":"wang-xinrong"},"content":"(For all use cases below, the **System** is the `TrAcker`, the **Actor** is the `user` and **persons** can be both a student and a TA unless specified otherwise)","lastModifiedDate":"2024-03-07"},{"lineNumber":316,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":317,"author":{"gitId":"-"},"content":"**Use case: Delete a person**","lastModifiedDate":"2020-05-23"},{"lineNumber":318,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":319,"author":{"gitId":"-"},"content":"**MSS**","lastModifiedDate":"2020-05-23"},{"lineNumber":320,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":321,"author":{"gitId":"-"},"content":"1. User requests to list persons","lastModifiedDate":"2020-05-23"},{"lineNumber":322,"author":{"gitId":"wang-xinrong"},"content":"2. TrAcker shows a list of persons","lastModifiedDate":"2024-03-07"},{"lineNumber":323,"author":{"gitId":"-"},"content":"3. User requests to delete a specific person in the list","lastModifiedDate":"2020-05-23"},{"lineNumber":324,"author":{"gitId":"-"},"content":"4. AddressBook deletes the person","lastModifiedDate":"2020-05-23"},{"lineNumber":325,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":326,"author":{"gitId":"-"},"content":" Use case ends.","lastModifiedDate":"2020-05-23"},{"lineNumber":327,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":328,"author":{"gitId":"-"},"content":"**Extensions**","lastModifiedDate":"2020-05-23"},{"lineNumber":329,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":330,"author":{"gitId":"-"},"content":"* 2a. The list is empty.","lastModifiedDate":"2020-05-23"},{"lineNumber":331,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":332,"author":{"gitId":"-"},"content":" Use case ends.","lastModifiedDate":"2020-05-23"},{"lineNumber":333,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":334,"author":{"gitId":"-"},"content":"* 3a. The given index is invalid.","lastModifiedDate":"2020-05-23"},{"lineNumber":335,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":336,"author":{"gitId":"wang-xinrong"},"content":" * 3a1. TrAcker shows an error message.","lastModifiedDate":"2024-03-07"},{"lineNumber":337,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":338,"author":{"gitId":"-"},"content":" Use case resumes at step 2.","lastModifiedDate":"2020-05-23"},{"lineNumber":339,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":340,"author":{"gitId":"wang-xinrong"},"content":"**Use case: Add a person**","lastModifiedDate":"2024-03-07"},{"lineNumber":341,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2024-03-07"},{"lineNumber":342,"author":{"gitId":"wang-xinrong"},"content":"**MSS**","lastModifiedDate":"2024-03-07"},{"lineNumber":343,"author":{"gitId":"wang-xinrong"},"content":"","lastModifiedDate":"2024-03-07"},{"lineNumber":344,"author":{"gitId":"wang-xinrong"},"content":"1. User requests to add a person with relevant entries such as name, phone number and email","lastModifiedDate":"2024-03-07"},{"lineNumber":345,"author":{"gitId":"wang-xinrong"},"content":"2. TrAcker adds the entry to its contact list","lastModifiedDate":"2024-03-07"},{"lineNumber":346,"author":{"gitId":"wang-xinrong"},"content":"","lastModifiedDate":"2024-03-07"},{"lineNumber":347,"author":{"gitId":"wang-xinrong"},"content":" Use case ends.","lastModifiedDate":"2024-03-07"},{"lineNumber":348,"author":{"gitId":"wang-xinrong"},"content":"","lastModifiedDate":"2024-03-07"},{"lineNumber":349,"author":{"gitId":"wang-xinrong"},"content":"**Extensions**","lastModifiedDate":"2024-03-07"},{"lineNumber":350,"author":{"gitId":"wang-xinrong"},"content":"","lastModifiedDate":"2024-03-07"},{"lineNumber":351,"author":{"gitId":"wang-xinrong"},"content":"* 1a. User inputs information in incorrect format","lastModifiedDate":"2024-03-07"},{"lineNumber":352,"author":{"gitId":"wang-xinrong"},"content":"","lastModifiedDate":"2024-03-07"},{"lineNumber":353,"author":{"gitId":"wang-xinrong"},"content":" * 1a1. TrAcker shows an error message.","lastModifiedDate":"2024-03-07"},{"lineNumber":354,"author":{"gitId":"wang-xinrong"},"content":" ","lastModifiedDate":"2024-03-07"},{"lineNumber":355,"author":{"gitId":"wang-xinrong"},"content":" Use case resumes at step 1","lastModifiedDate":"2024-03-07"},{"lineNumber":356,"author":{"gitId":"wang-xinrong"},"content":"","lastModifiedDate":"2024-03-07"},{"lineNumber":357,"author":{"gitId":"wang-xinrong"},"content":"**Use case: Search a contact**","lastModifiedDate":"2024-03-07"},{"lineNumber":358,"author":{"gitId":"wang-xinrong"},"content":"","lastModifiedDate":"2024-03-07"},{"lineNumber":359,"author":{"gitId":"wang-xinrong"},"content":"**MSS**","lastModifiedDate":"2024-03-07"},{"lineNumber":360,"author":{"gitId":"wang-xinrong"},"content":"","lastModifiedDate":"2024-03-07"},{"lineNumber":361,"author":{"gitId":"wang-xinrong"},"content":"1. User requests to search a contact by keywords (for names)","lastModifiedDate":"2024-03-07"},{"lineNumber":362,"author":{"gitId":"wang-xinrong"},"content":"2. TrAcker shows a list of contacts whose names match the keywords","lastModifiedDate":"2024-03-07"},{"lineNumber":363,"author":{"gitId":"wang-xinrong"},"content":"","lastModifiedDate":"2024-03-07"},{"lineNumber":364,"author":{"gitId":"wang-xinrong"},"content":" Use case ends.","lastModifiedDate":"2024-03-07"},{"lineNumber":365,"author":{"gitId":"wang-xinrong"},"content":"","lastModifiedDate":"2024-03-07"},{"lineNumber":366,"author":{"gitId":"wang-xinrong"},"content":"**Extensions**","lastModifiedDate":"2024-03-07"},{"lineNumber":367,"author":{"gitId":"wang-xinrong"},"content":"","lastModifiedDate":"2024-03-07"},{"lineNumber":368,"author":{"gitId":"wang-xinrong"},"content":"* 1a. No contacts have names including the specified keywords.","lastModifiedDate":"2024-03-07"},{"lineNumber":369,"author":{"gitId":"wang-xinrong"},"content":"","lastModifiedDate":"2024-03-07"},{"lineNumber":370,"author":{"gitId":"wang-xinrong"},"content":" *1a1. TrAcker shows an empty list","lastModifiedDate":"2024-03-07"},{"lineNumber":371,"author":{"gitId":"wang-xinrong"},"content":"","lastModifiedDate":"2024-03-07"},{"lineNumber":372,"author":{"gitId":"wang-xinrong"},"content":" Use case ends.","lastModifiedDate":"2024-03-07"},{"lineNumber":373,"author":{"gitId":"wang-xinrong"},"content":"","lastModifiedDate":"2024-03-07"},{"lineNumber":374,"author":{"gitId":"wang-xinrong"},"content":"**Use case: Edit a contact**","lastModifiedDate":"2024-03-07"},{"lineNumber":375,"author":{"gitId":"wang-xinrong"},"content":"","lastModifiedDate":"2024-03-07"},{"lineNumber":376,"author":{"gitId":"wang-xinrong"},"content":"**MSS**","lastModifiedDate":"2024-03-07"},{"lineNumber":377,"author":{"gitId":"wang-xinrong"},"content":"","lastModifiedDate":"2024-03-07"},{"lineNumber":378,"author":{"gitId":"wang-xinrong"},"content":"1. User requests to edit a contact with new information","lastModifiedDate":"2024-03-07"},{"lineNumber":379,"author":{"gitId":"wang-xinrong"},"content":"2. TrAcker updates the contact with specified new information","lastModifiedDate":"2024-03-07"},{"lineNumber":380,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2024-03-07"},{"lineNumber":381,"author":{"gitId":"wang-xinrong"},"content":" Use case ends.","lastModifiedDate":"2024-03-07"},{"lineNumber":382,"author":{"gitId":"wang-xinrong"},"content":"","lastModifiedDate":"2024-03-07"},{"lineNumber":383,"author":{"gitId":"wang-xinrong"},"content":"**Extensions**","lastModifiedDate":"2024-03-07"},{"lineNumber":384,"author":{"gitId":"wang-xinrong"},"content":"","lastModifiedDate":"2024-03-07"},{"lineNumber":385,"author":{"gitId":"wang-xinrong"},"content":"* 1a. User inputs new information in incorrect format","lastModifiedDate":"2024-03-07"},{"lineNumber":386,"author":{"gitId":"wang-xinrong"},"content":"","lastModifiedDate":"2024-03-07"},{"lineNumber":387,"author":{"gitId":"wang-xinrong"},"content":" * 1a1. TrAcker shows an error message.","lastModifiedDate":"2024-03-07"},{"lineNumber":388,"author":{"gitId":"wang-xinrong"},"content":"","lastModifiedDate":"2024-03-07"},{"lineNumber":389,"author":{"gitId":"wang-xinrong"},"content":" Use case resumes at step 1","lastModifiedDate":"2024-03-07"},{"lineNumber":390,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":391,"author":{"gitId":"-"},"content":"### Non-Functional Requirements","lastModifiedDate":"2020-05-23"},{"lineNumber":392,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":393,"author":{"gitId":"wongkj12"},"content":"1. **(Technical)** Should work on any _mainstream OS_ as long as it has Java `11` or above installed.","lastModifiedDate":"2024-03-07"},{"lineNumber":394,"author":{"gitId":"wongkj12"},"content":"2. **(Quality)** 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.","lastModifiedDate":"2024-03-07"},{"lineNumber":395,"author":{"gitId":"wongkj12"},"content":"3. **(Quality)** The user interface and commands should be intuitive and user-friendly, requiring minimal time to learn.","lastModifiedDate":"2024-03-07"},{"lineNumber":396,"author":{"gitId":"wongkj12"},"content":"4. **(Quality)** The app should provide clear and informative error messages in case of invalid inputs or command failures.","lastModifiedDate":"2024-03-07"},{"lineNumber":397,"author":{"gitId":"wongkj12"},"content":"5. **(Performance)** The app should respond to user actions within 0.5 seconds, ensuring smooth navigation and interaction.","lastModifiedDate":"2024-03-07"},{"lineNumber":398,"author":{"gitId":"wongkj12"},"content":"6. **(Performance)** The app should be able to support at minimum a contacts list of 200 without affecting performance.","lastModifiedDate":"2024-03-07"},{"lineNumber":399,"author":{"gitId":"wongkj12"},"content":"7. **(Performance)** The app should be able to run smoothly even on low-end hardware configurations.","lastModifiedDate":"2024-03-07"},{"lineNumber":400,"author":{"gitId":"wongkj12"},"content":"8. **(Process)** The project is expected to adhere to a schedule that adds updates incrementally at least once every two weeks.","lastModifiedDate":"2024-03-07"},{"lineNumber":401,"author":{"gitId":"wongkj12"},"content":"9. **(Project scope)** The product should be focused on the needs of our target user, head teaching assistants.","lastModifiedDate":"2024-03-07"},{"lineNumber":402,"author":{"gitId":"wongkj12"},"content":"10. **(Documentation)** Comprehensive user guide should be provided, with detailed instructions on how to use each command.","lastModifiedDate":"2024-03-07"},{"lineNumber":403,"author":{"gitId":"wongkj12"},"content":"11. **(Documentation)** Comprehensive developer guide should be created to facilitate ongoing maintenance of the app.","lastModifiedDate":"2024-03-07"},{"lineNumber":404,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":405,"author":{"gitId":"-"},"content":"### Glossary","lastModifiedDate":"2020-05-23"},{"lineNumber":406,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":407,"author":{"gitId":"-"},"content":"* **Mainstream OS**: Windows, Linux, Unix, MacOS","lastModifiedDate":"2024-02-09"},{"lineNumber":408,"author":{"gitId":"yongkotaro"},"content":"* **Tutor**: A teaching assistant for CS2103T","lastModifiedDate":"2024-03-07"},{"lineNumber":409,"author":{"gitId":"yongkotaro"},"content":"* **Student**: A student taking CS2103T","lastModifiedDate":"2024-03-07"},{"lineNumber":410,"author":{"gitId":"yongkotaro"},"content":"* **Tag**: A label that can be attached to the student. It is used to mark the attendance for a specific week.","lastModifiedDate":"2024-03-07"},{"lineNumber":411,"author":{"gitId":"yongkotaro"},"content":"* **Attendance Status**: The current state of a student\u0027s attendance. ","lastModifiedDate":"2024-03-07"},{"lineNumber":412,"author":{"gitId":"yongkotaro"},"content":"* **Contact Entry**: Contact information of either a student or a tutor, containing the name, phone number, email, and attendance status.","lastModifiedDate":"2024-03-07"},{"lineNumber":413,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":414,"author":{"gitId":"-"},"content":"--------------------------------------------------------------------------------------------------------------------","lastModifiedDate":"2020-05-23"},{"lineNumber":415,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":416,"author":{"gitId":"-"},"content":"## **Appendix: Instructions for manual testing**","lastModifiedDate":"2020-05-23"},{"lineNumber":417,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":418,"author":{"gitId":"-"},"content":"Given below are instructions to test the app manually.","lastModifiedDate":"2020-05-23"},{"lineNumber":419,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":420,"author":{"gitId":"-"},"content":"\u003cdiv markdown\u003d\"span\" class\u003d\"alert alert-info\"\u003e:information_source: **Note:** These instructions only provide a starting point for testers to work on;","lastModifiedDate":"2020-05-23"},{"lineNumber":421,"author":{"gitId":"-"},"content":"testers are expected to do more *exploratory* testing.","lastModifiedDate":"2020-05-23"},{"lineNumber":422,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":423,"author":{"gitId":"-"},"content":"\u003c/div\u003e","lastModifiedDate":"2020-05-23"},{"lineNumber":424,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":425,"author":{"gitId":"-"},"content":"### Launch and shutdown","lastModifiedDate":"2020-05-23"},{"lineNumber":426,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":427,"author":{"gitId":"-"},"content":"1. Initial launch","lastModifiedDate":"2020-05-23"},{"lineNumber":428,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":429,"author":{"gitId":"-"},"content":" 1. Download the jar file and copy into an empty folder","lastModifiedDate":"2020-05-23"},{"lineNumber":430,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":431,"author":{"gitId":"-"},"content":" 1. Double-click the jar file Expected: Shows the GUI with a set of sample contacts. The window size may not be optimum.","lastModifiedDate":"2020-05-23"},{"lineNumber":432,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":433,"author":{"gitId":"-"},"content":"1. Saving window preferences","lastModifiedDate":"2020-05-23"},{"lineNumber":434,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":435,"author":{"gitId":"-"},"content":" 1. Resize the window to an optimum size. Move the window to a different location. Close the window.","lastModifiedDate":"2020-05-23"},{"lineNumber":436,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":437,"author":{"gitId":"-"},"content":" 1. Re-launch the app by double-clicking the jar file.\u003cbr\u003e","lastModifiedDate":"2020-05-23"},{"lineNumber":438,"author":{"gitId":"-"},"content":" Expected: The most recent window size and location is retained.","lastModifiedDate":"2020-05-23"},{"lineNumber":439,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":440,"author":{"gitId":"-"},"content":"1. _{ more test cases …​ }_","lastModifiedDate":"2020-05-23"},{"lineNumber":441,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":442,"author":{"gitId":"-"},"content":"### Deleting a person","lastModifiedDate":"2020-05-23"},{"lineNumber":443,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":444,"author":{"gitId":"-"},"content":"1. Deleting a person while all persons are being shown","lastModifiedDate":"2020-05-23"},{"lineNumber":445,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":446,"author":{"gitId":"-"},"content":" 1. Prerequisites: List all persons using the `list` command. Multiple persons in the list.","lastModifiedDate":"2020-05-23"},{"lineNumber":447,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":448,"author":{"gitId":"-"},"content":" 1. Test case: `delete 1`\u003cbr\u003e","lastModifiedDate":"2020-05-23"},{"lineNumber":449,"author":{"gitId":"-"},"content":" 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.","lastModifiedDate":"2020-05-23"},{"lineNumber":450,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":451,"author":{"gitId":"-"},"content":" 1. Test case: `delete 0`\u003cbr\u003e","lastModifiedDate":"2020-05-23"},{"lineNumber":452,"author":{"gitId":"-"},"content":" Expected: No person is deleted. Error details shown in the status message. Status bar remains the same.","lastModifiedDate":"2020-05-23"},{"lineNumber":453,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":454,"author":{"gitId":"-"},"content":" 1. Other incorrect delete commands to try: `delete`, `delete x`, `...` (where x is larger than the list size)\u003cbr\u003e","lastModifiedDate":"2020-05-23"},{"lineNumber":455,"author":{"gitId":"-"},"content":" Expected: Similar to previous.","lastModifiedDate":"2020-05-23"},{"lineNumber":456,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":457,"author":{"gitId":"-"},"content":"1. _{ more test cases …​ }_","lastModifiedDate":"2020-05-23"},{"lineNumber":458,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":459,"author":{"gitId":"-"},"content":"### Saving data","lastModifiedDate":"2020-05-23"},{"lineNumber":460,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":461,"author":{"gitId":"-"},"content":"1. Dealing with missing/corrupted data files","lastModifiedDate":"2020-05-23"},{"lineNumber":462,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":463,"author":{"gitId":"-"},"content":" 1. _{explain how to simulate a missing/corrupted file, and the expected behavior}_","lastModifiedDate":"2020-05-23"},{"lineNumber":464,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":465,"author":{"gitId":"-"},"content":"1. _{ more test cases …​ }_","lastModifiedDate":"2020-05-23"}],"authorContributionMap":{"wongkj12":11,"yongkotaro":5,"kaitinghh":33,"wang-xinrong":51,"-":365}},{"path":"docs/team/kaiting.md","fileType":"docs","lines":[{"lineNumber":1,"author":{"gitId":"kaitinghh"},"content":"---","lastModifiedDate":"2024-03-07"},{"lineNumber":2,"author":{"gitId":"kaitinghh"},"content":"layout: page","lastModifiedDate":"2024-03-07"},{"lineNumber":3,"author":{"gitId":"kaitinghh"},"content":"title: Ho Kai Ting\u0027s Project Portfolio Page","lastModifiedDate":"2024-03-07"},{"lineNumber":4,"author":{"gitId":"kaitinghh"},"content":"---","lastModifiedDate":"2024-03-07"},{"lineNumber":5,"author":{"gitId":"kaitinghh"},"content":"","lastModifiedDate":"2024-03-07"},{"lineNumber":6,"author":{"gitId":"kaitinghh"},"content":"### Project: AddressBook Level 3","lastModifiedDate":"2024-03-07"},{"lineNumber":7,"author":{"gitId":"kaitinghh"},"content":"","lastModifiedDate":"2024-03-07"},{"lineNumber":8,"author":{"gitId":"kaitinghh"},"content":"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.","lastModifiedDate":"2024-03-07"},{"lineNumber":9,"author":{"gitId":"kaitinghh"},"content":"","lastModifiedDate":"2024-03-07"},{"lineNumber":10,"author":{"gitId":"kaitinghh"},"content":"Given below are my contributions to the project.","lastModifiedDate":"2024-03-07"},{"lineNumber":11,"author":{"gitId":"kaitinghh"},"content":"","lastModifiedDate":"2024-03-07"},{"lineNumber":12,"author":{"gitId":"kaitinghh"},"content":"* **New Feature**: Added the ability to undo/redo previous commands.","lastModifiedDate":"2024-03-07"},{"lineNumber":13,"author":{"gitId":"kaitinghh"},"content":" * 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.","lastModifiedDate":"2024-03-07"},{"lineNumber":14,"author":{"gitId":"kaitinghh"},"content":" * 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.","lastModifiedDate":"2024-03-07"},{"lineNumber":15,"author":{"gitId":"kaitinghh"},"content":" * 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.","lastModifiedDate":"2024-03-07"},{"lineNumber":16,"author":{"gitId":"kaitinghh"},"content":" * 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}*","lastModifiedDate":"2024-03-07"},{"lineNumber":17,"author":{"gitId":"kaitinghh"},"content":"","lastModifiedDate":"2024-03-07"},{"lineNumber":18,"author":{"gitId":"kaitinghh"},"content":"* **New Feature**: Added a history command that allows the user to navigate to previous commands using up/down keys.","lastModifiedDate":"2024-03-07"},{"lineNumber":19,"author":{"gitId":"kaitinghh"},"content":"","lastModifiedDate":"2024-03-07"},{"lineNumber":20,"author":{"gitId":"kaitinghh"},"content":"* **Code contributed**: [RepoSense link]()","lastModifiedDate":"2024-03-07"},{"lineNumber":21,"author":{"gitId":"kaitinghh"},"content":"","lastModifiedDate":"2024-03-07"},{"lineNumber":22,"author":{"gitId":"kaitinghh"},"content":"* **Project management**:","lastModifiedDate":"2024-03-07"},{"lineNumber":23,"author":{"gitId":"kaitinghh"},"content":" * Managed releases `v1.3` - `v1.5rc` (3 releases) on GitHub","lastModifiedDate":"2024-03-07"},{"lineNumber":24,"author":{"gitId":"kaitinghh"},"content":"","lastModifiedDate":"2024-03-07"},{"lineNumber":25,"author":{"gitId":"kaitinghh"},"content":"* **Enhancements to existing features**:","lastModifiedDate":"2024-03-07"},{"lineNumber":26,"author":{"gitId":"kaitinghh"},"content":" * Updated the GUI color scheme (Pull requests [\\#33](), [\\#34]())","lastModifiedDate":"2024-03-07"},{"lineNumber":27,"author":{"gitId":"kaitinghh"},"content":" * Wrote additional tests for existing features to increase coverage from 88% to 92% (Pull requests [\\#36](), [\\#38]())","lastModifiedDate":"2024-03-07"},{"lineNumber":28,"author":{"gitId":"kaitinghh"},"content":"","lastModifiedDate":"2024-03-07"},{"lineNumber":29,"author":{"gitId":"kaitinghh"},"content":"* **Documentation**:","lastModifiedDate":"2024-03-07"},{"lineNumber":30,"author":{"gitId":"kaitinghh"},"content":" * User Guide:","lastModifiedDate":"2024-03-07"},{"lineNumber":31,"author":{"gitId":"kaitinghh"},"content":" * Added documentation for the features `delete` and `find` [\\#72]()","lastModifiedDate":"2024-03-07"},{"lineNumber":32,"author":{"gitId":"kaitinghh"},"content":" * Did cosmetic tweaks to existing documentation of features `clear`, `exit`: [\\#74]()","lastModifiedDate":"2024-03-07"},{"lineNumber":33,"author":{"gitId":"kaitinghh"},"content":" * Developer Guide:","lastModifiedDate":"2024-03-07"},{"lineNumber":34,"author":{"gitId":"kaitinghh"},"content":" * Added implementation details of the `delete` feature.","lastModifiedDate":"2024-03-07"},{"lineNumber":35,"author":{"gitId":"kaitinghh"},"content":"","lastModifiedDate":"2024-03-07"},{"lineNumber":36,"author":{"gitId":"kaitinghh"},"content":"* **Community**:","lastModifiedDate":"2024-03-07"},{"lineNumber":37,"author":{"gitId":"kaitinghh"},"content":" * PRs reviewed (with non-trivial review comments): [\\#12](), [\\#32](), [\\#19](), [\\#42]()","lastModifiedDate":"2024-03-07"},{"lineNumber":38,"author":{"gitId":"kaitinghh"},"content":" * Contributed to forum discussions (examples: [1](), [2](), [3](), [4]())","lastModifiedDate":"2024-03-07"},{"lineNumber":39,"author":{"gitId":"kaitinghh"},"content":" * Reported bugs and suggestions for other teams in the class (examples: [1](), [2](), [3]())","lastModifiedDate":"2024-03-07"},{"lineNumber":40,"author":{"gitId":"kaitinghh"},"content":" * Some parts of the history feature I added was adopted by several other class mates ([1](), [2]())","lastModifiedDate":"2024-03-07"},{"lineNumber":41,"author":{"gitId":"kaitinghh"},"content":"","lastModifiedDate":"2024-03-07"},{"lineNumber":42,"author":{"gitId":"kaitinghh"},"content":"* **Tools**:","lastModifiedDate":"2024-03-07"},{"lineNumber":43,"author":{"gitId":"kaitinghh"},"content":" * Integrated a third party library (Natty) to the project ([\\#42]())","lastModifiedDate":"2024-03-07"},{"lineNumber":44,"author":{"gitId":"kaitinghh"},"content":" * Integrated a new Github plugin (CircleCI) to the team repo","lastModifiedDate":"2024-03-07"},{"lineNumber":45,"author":{"gitId":"kaitinghh"},"content":"","lastModifiedDate":"2024-03-07"},{"lineNumber":46,"author":{"gitId":"kaitinghh"},"content":"* _{you can add/remove categories in the list above}_","lastModifiedDate":"2024-03-07"}],"authorContributionMap":{"kaitinghh":46}},{"path":"docs/team/wangxinrong.md","fileType":"docs","lines":[{"lineNumber":1,"author":{"gitId":"wang-xinrong"},"content":"---","lastModifiedDate":"2024-03-07"},{"lineNumber":2,"author":{"gitId":"wang-xinrong"},"content":"layout: page","lastModifiedDate":"2024-03-07"},{"lineNumber":3,"author":{"gitId":"wang-xinrong"},"content":"title: Wang Xinrong\u0027s Project Portfolio Page","lastModifiedDate":"2024-03-07"},{"lineNumber":4,"author":{"gitId":"wang-xinrong"},"content":"---","lastModifiedDate":"2024-03-07"},{"lineNumber":5,"author":{"gitId":"wang-xinrong"},"content":"","lastModifiedDate":"2024-03-07"},{"lineNumber":6,"author":{"gitId":"wang-xinrong"},"content":"### Project: AddressBook Level 3","lastModifiedDate":"2024-03-07"},{"lineNumber":7,"author":{"gitId":"wang-xinrong"},"content":"","lastModifiedDate":"2024-03-07"},{"lineNumber":8,"author":{"gitId":"wang-xinrong"},"content":"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.","lastModifiedDate":"2024-03-07"},{"lineNumber":9,"author":{"gitId":"wang-xinrong"},"content":"","lastModifiedDate":"2024-03-07"},{"lineNumber":10,"author":{"gitId":"wang-xinrong"},"content":"Given below are my contributions to the project.","lastModifiedDate":"2024-03-07"},{"lineNumber":11,"author":{"gitId":"wang-xinrong"},"content":"","lastModifiedDate":"2024-03-07"},{"lineNumber":12,"author":{"gitId":"wang-xinrong"},"content":"* **New Feature**: Added the ability to undo/redo previous commands.","lastModifiedDate":"2024-03-07"},{"lineNumber":13,"author":{"gitId":"wang-xinrong"},"content":" * 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.","lastModifiedDate":"2024-03-07"},{"lineNumber":14,"author":{"gitId":"wang-xinrong"},"content":" * 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.","lastModifiedDate":"2024-03-07"},{"lineNumber":15,"author":{"gitId":"wang-xinrong"},"content":" * 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.","lastModifiedDate":"2024-03-07"},{"lineNumber":16,"author":{"gitId":"wang-xinrong"},"content":" * 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}*","lastModifiedDate":"2024-03-07"},{"lineNumber":17,"author":{"gitId":"wang-xinrong"},"content":"","lastModifiedDate":"2024-03-07"},{"lineNumber":18,"author":{"gitId":"wang-xinrong"},"content":"* **New Feature**: Added a history command that allows the user to navigate to previous commands using up/down keys.","lastModifiedDate":"2024-03-07"},{"lineNumber":19,"author":{"gitId":"wang-xinrong"},"content":"","lastModifiedDate":"2024-03-07"},{"lineNumber":20,"author":{"gitId":"wang-xinrong"},"content":"* **Code contributed**: [RepoSense link]()","lastModifiedDate":"2024-03-07"},{"lineNumber":21,"author":{"gitId":"wang-xinrong"},"content":"","lastModifiedDate":"2024-03-07"},{"lineNumber":22,"author":{"gitId":"wang-xinrong"},"content":"* **Project management**:","lastModifiedDate":"2024-03-07"},{"lineNumber":23,"author":{"gitId":"wang-xinrong"},"content":" * Managed releases `v1.3` - `v1.5rc` (3 releases) on GitHub","lastModifiedDate":"2024-03-07"},{"lineNumber":24,"author":{"gitId":"wang-xinrong"},"content":"","lastModifiedDate":"2024-03-07"},{"lineNumber":25,"author":{"gitId":"wang-xinrong"},"content":"* **Enhancements to existing features**:","lastModifiedDate":"2024-03-07"},{"lineNumber":26,"author":{"gitId":"wang-xinrong"},"content":" * Updated the GUI color scheme (Pull requests [\\#33](), [\\#34]())","lastModifiedDate":"2024-03-07"},{"lineNumber":27,"author":{"gitId":"wang-xinrong"},"content":" * Wrote additional tests for existing features to increase coverage from 88% to 92% (Pull requests [\\#36](), [\\#38]())","lastModifiedDate":"2024-03-07"},{"lineNumber":28,"author":{"gitId":"wang-xinrong"},"content":"","lastModifiedDate":"2024-03-07"},{"lineNumber":29,"author":{"gitId":"wang-xinrong"},"content":"* **Documentation**:","lastModifiedDate":"2024-03-07"},{"lineNumber":30,"author":{"gitId":"wang-xinrong"},"content":" * User Guide:","lastModifiedDate":"2024-03-07"},{"lineNumber":31,"author":{"gitId":"wang-xinrong"},"content":" * Added documentation for the features `delete` and `find` [\\#72]()","lastModifiedDate":"2024-03-07"},{"lineNumber":32,"author":{"gitId":"wang-xinrong"},"content":" * Did cosmetic tweaks to existing documentation of features `clear`, `exit`: [\\#74]()","lastModifiedDate":"2024-03-07"},{"lineNumber":33,"author":{"gitId":"wang-xinrong"},"content":" * Developer Guide:","lastModifiedDate":"2024-03-07"},{"lineNumber":34,"author":{"gitId":"wang-xinrong"},"content":" * Added implementation details of the `delete` feature.","lastModifiedDate":"2024-03-07"},{"lineNumber":35,"author":{"gitId":"wang-xinrong"},"content":"","lastModifiedDate":"2024-03-07"},{"lineNumber":36,"author":{"gitId":"wang-xinrong"},"content":"* **Community**:","lastModifiedDate":"2024-03-07"},{"lineNumber":37,"author":{"gitId":"wang-xinrong"},"content":" * PRs reviewed (with non-trivial review comments): [\\#12](), [\\#32](), [\\#19](), [\\#42]()","lastModifiedDate":"2024-03-07"},{"lineNumber":38,"author":{"gitId":"wang-xinrong"},"content":" * Contributed to forum discussions (examples: [1](), [2](), [3](), [4]())","lastModifiedDate":"2024-03-07"},{"lineNumber":39,"author":{"gitId":"wang-xinrong"},"content":" * Reported bugs and suggestions for other teams in the class (examples: [1](), [2](), [3]())","lastModifiedDate":"2024-03-07"},{"lineNumber":40,"author":{"gitId":"wang-xinrong"},"content":" * Some parts of the history feature I added was adopted by several other class mates ([1](), [2]())","lastModifiedDate":"2024-03-07"},{"lineNumber":41,"author":{"gitId":"wang-xinrong"},"content":"","lastModifiedDate":"2024-03-07"},{"lineNumber":42,"author":{"gitId":"wang-xinrong"},"content":"* **Tools**:","lastModifiedDate":"2024-03-07"},{"lineNumber":43,"author":{"gitId":"wang-xinrong"},"content":" * Integrated a third party library (Natty) to the project ([\\#42]())","lastModifiedDate":"2024-03-07"},{"lineNumber":44,"author":{"gitId":"wang-xinrong"},"content":" * Integrated a new Github plugin (CircleCI) to the team repo","lastModifiedDate":"2024-03-07"},{"lineNumber":45,"author":{"gitId":"wang-xinrong"},"content":"","lastModifiedDate":"2024-03-07"},{"lineNumber":46,"author":{"gitId":"wang-xinrong"},"content":"* _{you can add/remove categories in the list above}_","lastModifiedDate":"2024-03-07"}],"authorContributionMap":{"wang-xinrong":46}},{"path":"docs/team/wongkj12.md","fileType":"docs","lines":[{"lineNumber":1,"author":{"gitId":"-"},"content":"---","lastModifiedDate":"2020-05-23"},{"lineNumber":2,"author":{"gitId":"-"},"content":"layout: page","lastModifiedDate":"2020-05-23"},{"lineNumber":3,"author":{"gitId":"wongkj12"},"content":"title: Kai Jie\u0027s Project Portfolio Page","lastModifiedDate":"2024-03-07"},{"lineNumber":4,"author":{"gitId":"-"},"content":"---","lastModifiedDate":"2020-05-23"},{"lineNumber":5,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":6,"author":{"gitId":"-"},"content":"### Project: AddressBook Level 3","lastModifiedDate":"2021-07-30"},{"lineNumber":7,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":8,"author":{"gitId":"-"},"content":"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.","lastModifiedDate":"2020-05-23"},{"lineNumber":9,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":10,"author":{"gitId":"-"},"content":"Given below are my contributions to the project.","lastModifiedDate":"2020-05-23"},{"lineNumber":11,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":12,"author":{"gitId":"-"},"content":"* **New Feature**: Added the ability to undo/redo previous commands.","lastModifiedDate":"2020-05-23"},{"lineNumber":13,"author":{"gitId":"-"},"content":" * 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.","lastModifiedDate":"2020-05-23"},{"lineNumber":14,"author":{"gitId":"-"},"content":" * 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.","lastModifiedDate":"2020-05-23"},{"lineNumber":15,"author":{"gitId":"-"},"content":" * 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.","lastModifiedDate":"2020-05-23"},{"lineNumber":16,"author":{"gitId":"-"},"content":" * 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}*","lastModifiedDate":"2020-05-23"},{"lineNumber":17,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":18,"author":{"gitId":"-"},"content":"* **New Feature**: Added a history command that allows the user to navigate to previous commands using up/down keys.","lastModifiedDate":"2020-05-23"},{"lineNumber":19,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":20,"author":{"gitId":"-"},"content":"* **Code contributed**: [RepoSense link]()","lastModifiedDate":"2020-05-23"},{"lineNumber":21,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":22,"author":{"gitId":"-"},"content":"* **Project management**:","lastModifiedDate":"2020-05-23"},{"lineNumber":23,"author":{"gitId":"-"},"content":" * Managed releases `v1.3` - `v1.5rc` (3 releases) on GitHub","lastModifiedDate":"2020-05-23"},{"lineNumber":24,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":25,"author":{"gitId":"-"},"content":"* **Enhancements to existing features**:","lastModifiedDate":"2020-05-23"},{"lineNumber":26,"author":{"gitId":"-"},"content":" * Updated the GUI color scheme (Pull requests [\\#33](), [\\#34]())","lastModifiedDate":"2020-05-23"},{"lineNumber":27,"author":{"gitId":"-"},"content":" * Wrote additional tests for existing features to increase coverage from 88% to 92% (Pull requests [\\#36](), [\\#38]())","lastModifiedDate":"2020-05-23"},{"lineNumber":28,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":29,"author":{"gitId":"-"},"content":"* **Documentation**:","lastModifiedDate":"2020-05-23"},{"lineNumber":30,"author":{"gitId":"-"},"content":" * User Guide:","lastModifiedDate":"2020-05-23"},{"lineNumber":31,"author":{"gitId":"-"},"content":" * Added documentation for the features `delete` and `find` [\\#72]()","lastModifiedDate":"2020-05-23"},{"lineNumber":32,"author":{"gitId":"-"},"content":" * Did cosmetic tweaks to existing documentation of features `clear`, `exit`: [\\#74]()","lastModifiedDate":"2020-05-23"},{"lineNumber":33,"author":{"gitId":"-"},"content":" * Developer Guide:","lastModifiedDate":"2020-05-23"},{"lineNumber":34,"author":{"gitId":"-"},"content":" * Added implementation details of the `delete` feature.","lastModifiedDate":"2020-05-23"},{"lineNumber":35,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":36,"author":{"gitId":"-"},"content":"* **Community**:","lastModifiedDate":"2020-05-23"},{"lineNumber":37,"author":{"gitId":"-"},"content":" * PRs reviewed (with non-trivial review comments): [\\#12](), [\\#32](), [\\#19](), [\\#42]()","lastModifiedDate":"2020-05-23"},{"lineNumber":38,"author":{"gitId":"-"},"content":" * Contributed to forum discussions (examples: [1](), [2](), [3](), [4]())","lastModifiedDate":"2020-05-23"},{"lineNumber":39,"author":{"gitId":"-"},"content":" * Reported bugs and suggestions for other teams in the class (examples: [1](), [2](), [3]())","lastModifiedDate":"2020-05-23"},{"lineNumber":40,"author":{"gitId":"-"},"content":" * Some parts of the history feature I added was adopted by several other class mates ([1](), [2]())","lastModifiedDate":"2020-05-23"},{"lineNumber":41,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":42,"author":{"gitId":"-"},"content":"* **Tools**:","lastModifiedDate":"2020-05-23"},{"lineNumber":43,"author":{"gitId":"-"},"content":" * Integrated a third party library (Natty) to the project ([\\#42]())","lastModifiedDate":"2020-05-23"},{"lineNumber":44,"author":{"gitId":"-"},"content":" * Integrated a new Github plugin (CircleCI) to the team repo","lastModifiedDate":"2020-05-23"},{"lineNumber":45,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":46,"author":{"gitId":"-"},"content":"* _{you can add/remove categories in the list above}_","lastModifiedDate":"2020-05-23"}],"authorContributionMap":{"wongkj12":1,"-":45}}] +[{"path":"README.md","fileType":"docs","lines":[{"lineNumber":1,"author":{"gitId":"yyccbb"},"content":"[![codecov](https://codecov.io/gh/AY2324S2-CS2103T-T11-4/tp/graph/badge.svg?token\u003dYS8FHD1IQM)](https://codecov.io/gh/AY2324S2-CS2103T-T11-4/tp)","lastModifiedDate":"2024-03-07"},{"lineNumber":2,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":3,"author":{"gitId":"-"},"content":"![Ui](docs/images/Ui.png)","lastModifiedDate":"2020-05-23"},{"lineNumber":4,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":5,"author":{"gitId":"yyccbb"},"content":"* **TrAcker** is a student software engineering project that aims to create an application to help Head Teaching","lastModifiedDate":"2024-03-07"},{"lineNumber":6,"author":{"gitId":"yyccbb"},"content":" Assistants (Head TAs) track the records of other teaching assistants (TAs) and students.","lastModifiedDate":"2024-03-07"},{"lineNumber":7,"author":{"gitId":"-"},"content":" Example usages:","lastModifiedDate":"2020-05-23"},{"lineNumber":8,"author":{"gitId":"yyccbb"},"content":" * Add/delete contact details of TAs and students","lastModifiedDate":"2024-03-07"},{"lineNumber":9,"author":{"gitId":"yyccbb"},"content":" * Update contact details of TAs and students","lastModifiedDate":"2024-03-07"},{"lineNumber":10,"author":{"gitId":"yyccbb"},"content":" * Edit tags which reflect the attendance of students","lastModifiedDate":"2024-03-07"},{"lineNumber":11,"author":{"gitId":"yyccbb"},"content":"","lastModifiedDate":"2024-03-07"},{"lineNumber":12,"author":{"gitId":"yyccbb"},"content":"* This project is based on the AddressBook-Level3 project created by the [SE-EDU initiative](https://se-education.org).","lastModifiedDate":"2024-03-07"}],"authorContributionMap":{"yyccbb":8,"-":4}},{"path":"docs/AboutUs.md","fileType":"docs","lines":[{"lineNumber":1,"author":{"gitId":"-"},"content":"---","lastModifiedDate":"2020-05-23"},{"lineNumber":2,"author":{"gitId":"-"},"content":"layout: page","lastModifiedDate":"2020-05-23"},{"lineNumber":3,"author":{"gitId":"-"},"content":"title: About Us","lastModifiedDate":"2020-05-23"},{"lineNumber":4,"author":{"gitId":"-"},"content":"---","lastModifiedDate":"2020-05-23"},{"lineNumber":5,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":6,"author":{"gitId":"-"},"content":"We are a team based in the [School of Computing, National University of Singapore](http://www.comp.nus.edu.sg).","lastModifiedDate":"2020-05-23"},{"lineNumber":7,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":8,"author":{"gitId":"-"},"content":"You can reach us at the email `seer[at]comp.nus.edu.sg`","lastModifiedDate":"2020-06-17"},{"lineNumber":9,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-06-17"},{"lineNumber":10,"author":{"gitId":"-"},"content":"## Project team","lastModifiedDate":"2020-06-07"},{"lineNumber":11,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":12,"author":{"gitId":"kaitinghh"},"content":"### Ho Kai Ting","lastModifiedDate":"2024-03-07"},{"lineNumber":13,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":14,"author":{"gitId":"kaitinghh"},"content":"\u003cimg src\u003d\"images/kaitinghh.png\" width\u003d\"200px\"\u003e","lastModifiedDate":"2024-03-08"},{"lineNumber":15,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":16,"author":{"gitId":"kaitinghh"},"content":"[[github](https://github.com/kaitinghh)]","lastModifiedDate":"2024-03-07"},{"lineNumber":17,"author":{"gitId":"kaitinghh"},"content":"[[portfolio](team/kaitinghh.md)]","lastModifiedDate":"2024-03-08"},{"lineNumber":18,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":19,"author":{"gitId":"kaitinghh"},"content":"* Role: Developer","lastModifiedDate":"2024-03-07"},{"lineNumber":20,"author":{"gitId":"kaitinghh"},"content":"* Responsibilities: ","lastModifiedDate":"2024-03-07"},{"lineNumber":21,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":22,"author":{"gitId":"wang-xinrong"},"content":"### Wang Xinrong","lastModifiedDate":"2024-03-07"},{"lineNumber":23,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":24,"author":{"gitId":"wang-xinrong"},"content":"\u003cimg src\u003d\"images/wang-xinrong.png\" width\u003d\"200px\"\u003e","lastModifiedDate":"2024-03-07"},{"lineNumber":25,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":26,"author":{"gitId":"wang-xinrong"},"content":"[[github](http://github.com/wang-xinrong)]","lastModifiedDate":"2024-03-07"},{"lineNumber":27,"author":{"gitId":"wang-xinrong"},"content":"[[portfolio](team/wangxinrong.md)]","lastModifiedDate":"2024-03-07"},{"lineNumber":28,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":29,"author":{"gitId":"wang-xinrong"},"content":"* Role: Developer","lastModifiedDate":"2024-03-07"},{"lineNumber":30,"author":{"gitId":"-"},"content":"* Responsibilities: UI","lastModifiedDate":"2020-05-23"},{"lineNumber":31,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":32,"author":{"gitId":"wongkj12"},"content":"### Wong Kai Jie","lastModifiedDate":"2024-03-07"},{"lineNumber":33,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":34,"author":{"gitId":"wongkj12"},"content":"\u003cimg src\u003d\"images/wongkj12.jpg\" width\u003d\"200px\"\u003e","lastModifiedDate":"2024-03-07"},{"lineNumber":35,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":36,"author":{"gitId":"wongkj12"},"content":"[[github](http://github.com/wongkj12)] [[portfolio](team/wongkj12.md)]","lastModifiedDate":"2024-03-07"},{"lineNumber":37,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":38,"author":{"gitId":"-"},"content":"* Role: Developer","lastModifiedDate":"2020-05-23"},{"lineNumber":39,"author":{"gitId":"-"},"content":"* Responsibilities: Data","lastModifiedDate":"2020-05-23"},{"lineNumber":40,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":41,"author":{"gitId":"wang-xinrong"},"content":"### Yong Kotaro","lastModifiedDate":"2024-03-07"},{"lineNumber":42,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":43,"author":{"gitId":"wang-xinrong"},"content":"\u003cimg src\u003d\"images/yongkotaro.png\" width\u003d\"200px\"\u003e","lastModifiedDate":"2024-03-07"},{"lineNumber":44,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":45,"author":{"gitId":"wang-xinrong"},"content":"[[github](http://github.com/yongkotaro)]","lastModifiedDate":"2024-03-07"},{"lineNumber":46,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":47,"author":{"gitId":"-"},"content":"* Role: Developer","lastModifiedDate":"2020-05-23"},{"lineNumber":48,"author":{"gitId":"wang-xinrong"},"content":"* Responsibilities: UI","lastModifiedDate":"2024-03-07"},{"lineNumber":49,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":50,"author":{"gitId":"yyccbb"},"content":"### Yu Chenbo","lastModifiedDate":"2024-03-07"},{"lineNumber":51,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":52,"author":{"gitId":"yyccbb"},"content":"\u003cimg src\u003d\"images/yyccbb.png\" width\u003d\"200px\"\u003e","lastModifiedDate":"2024-03-07"},{"lineNumber":53,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":54,"author":{"gitId":"yyccbb"},"content":"[[github](http://github.com/yyccbb)]","lastModifiedDate":"2024-03-07"},{"lineNumber":55,"author":{"gitId":"yyccbb"},"content":"[[portfolio](team/yyccbb)]","lastModifiedDate":"2024-03-07"},{"lineNumber":56,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":57,"author":{"gitId":"-"},"content":"* Role: Developer","lastModifiedDate":"2020-05-23"},{"lineNumber":58,"author":{"gitId":"yyccbb"},"content":"* Responsibilities: Project Structure","lastModifiedDate":"2024-03-07"}],"authorContributionMap":{"yyccbb":5,"wongkj12":3,"kaitinghh":6,"wang-xinrong":9,"-":35}},{"path":"docs/DeveloperGuide.md","fileType":"docs","lines":[{"lineNumber":1,"author":{"gitId":"-"},"content":"---","lastModifiedDate":"2020-05-23"},{"lineNumber":2,"author":{"gitId":"-"},"content":"layout: page","lastModifiedDate":"2020-05-23"},{"lineNumber":3,"author":{"gitId":"-"},"content":"title: Developer Guide","lastModifiedDate":"2020-05-23"},{"lineNumber":4,"author":{"gitId":"-"},"content":"---","lastModifiedDate":"2020-05-23"},{"lineNumber":5,"author":{"gitId":"-"},"content":"* Table of Contents","lastModifiedDate":"2020-05-23"},{"lineNumber":6,"author":{"gitId":"-"},"content":"{:toc}","lastModifiedDate":"2020-05-23"},{"lineNumber":7,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":8,"author":{"gitId":"-"},"content":"--------------------------------------------------------------------------------------------------------------------","lastModifiedDate":"2020-05-23"},{"lineNumber":9,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2021-07-30"},{"lineNumber":10,"author":{"gitId":"-"},"content":"## **Acknowledgements**","lastModifiedDate":"2021-07-30"},{"lineNumber":11,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2021-07-30"},{"lineNumber":12,"author":{"gitId":"-"},"content":"* {list here sources of all reused/adapted ideas, code, documentation, and third-party libraries -- include links to the original source as well}","lastModifiedDate":"2021-07-30"},{"lineNumber":13,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2021-07-30"},{"lineNumber":14,"author":{"gitId":"-"},"content":"--------------------------------------------------------------------------------------------------------------------","lastModifiedDate":"2021-07-30"},{"lineNumber":15,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":16,"author":{"gitId":"-"},"content":"## **Setting up, getting started**","lastModifiedDate":"2020-05-23"},{"lineNumber":17,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":18,"author":{"gitId":"-"},"content":"Refer to the guide [_Setting up and getting started_](SettingUp.md).","lastModifiedDate":"2020-05-23"},{"lineNumber":19,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":20,"author":{"gitId":"-"},"content":"--------------------------------------------------------------------------------------------------------------------","lastModifiedDate":"2020-05-23"},{"lineNumber":21,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":22,"author":{"gitId":"-"},"content":"## **Design**","lastModifiedDate":"2020-05-23"},{"lineNumber":23,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":24,"author":{"gitId":"-"},"content":"\u003cdiv markdown\u003d\"span\" class\u003d\"alert alert-primary\"\u003e","lastModifiedDate":"2021-07-31"},{"lineNumber":25,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":26,"author":{"gitId":"-"},"content":":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.","lastModifiedDate":"2023-09-03"},{"lineNumber":27,"author":{"gitId":"-"},"content":"\u003c/div\u003e","lastModifiedDate":"2021-07-31"},{"lineNumber":28,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":29,"author":{"gitId":"-"},"content":"### Architecture","lastModifiedDate":"2021-07-31"},{"lineNumber":30,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":31,"author":{"gitId":"-"},"content":"\u003cimg src\u003d\"images/ArchitectureDiagram.png\" width\u003d\"280\" /\u003e","lastModifiedDate":"2021-07-31"},{"lineNumber":32,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":33,"author":{"gitId":"-"},"content":"The ***Architecture Diagram*** given above explains the high-level design of the App.","lastModifiedDate":"2021-07-31"},{"lineNumber":34,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":35,"author":{"gitId":"-"},"content":"Given below is a quick overview of main components and how they interact with each other.","lastModifiedDate":"2021-07-31"},{"lineNumber":36,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2021-07-31"},{"lineNumber":37,"author":{"gitId":"-"},"content":"**Main components of the architecture**","lastModifiedDate":"2021-07-31"},{"lineNumber":38,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":39,"author":{"gitId":"-"},"content":"**`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.","lastModifiedDate":"2023-09-03"},{"lineNumber":40,"author":{"gitId":"-"},"content":"* At app launch, it initializes the other components in the correct sequence, and connects them up with each other.","lastModifiedDate":"2023-09-03"},{"lineNumber":41,"author":{"gitId":"-"},"content":"* At shut down, it shuts down the other components and invokes cleanup methods where necessary.","lastModifiedDate":"2023-09-03"},{"lineNumber":42,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":43,"author":{"gitId":"-"},"content":"The bulk of the app\u0027s work is done by the following four components:","lastModifiedDate":"2023-09-03"},{"lineNumber":44,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":45,"author":{"gitId":"-"},"content":"* [**`UI`**](#ui-component): The UI of the App.","lastModifiedDate":"2020-05-23"},{"lineNumber":46,"author":{"gitId":"-"},"content":"* [**`Logic`**](#logic-component): The command executor.","lastModifiedDate":"2020-05-23"},{"lineNumber":47,"author":{"gitId":"-"},"content":"* [**`Model`**](#model-component): Holds the data of the App in memory.","lastModifiedDate":"2020-05-23"},{"lineNumber":48,"author":{"gitId":"-"},"content":"* [**`Storage`**](#storage-component): Reads data from, and writes data to, the hard disk.","lastModifiedDate":"2020-05-23"},{"lineNumber":49,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":50,"author":{"gitId":"-"},"content":"[**`Commons`**](#common-classes) represents a collection of classes used by multiple other components.","lastModifiedDate":"2023-09-03"},{"lineNumber":51,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":52,"author":{"gitId":"-"},"content":"**How the architecture components interact with each other**","lastModifiedDate":"2020-05-23"},{"lineNumber":53,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":54,"author":{"gitId":"-"},"content":"The *Sequence Diagram* below shows how the components interact with each other for the scenario where the user issues the command `delete 1`.","lastModifiedDate":"2020-05-23"},{"lineNumber":55,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":56,"author":{"gitId":"-"},"content":"\u003cimg src\u003d\"images/ArchitectureSequenceDiagram.png\" width\u003d\"574\" /\u003e","lastModifiedDate":"2020-06-07"},{"lineNumber":57,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":58,"author":{"gitId":"-"},"content":"Each of the four main components (also shown in the diagram above),","lastModifiedDate":"2021-07-31"},{"lineNumber":59,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2021-07-31"},{"lineNumber":60,"author":{"gitId":"-"},"content":"* defines its *API* in an `interface` with the same name as the Component.","lastModifiedDate":"2021-07-31"},{"lineNumber":61,"author":{"gitId":"-"},"content":"* implements its functionality using a concrete `{Component Name}Manager` class (which follows the corresponding API `interface` mentioned in the previous point.","lastModifiedDate":"2021-07-31"},{"lineNumber":62,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2021-07-31"},{"lineNumber":63,"author":{"gitId":"-"},"content":"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\u0027s being coupled to the implementation of a component), as illustrated in the (partial) class diagram below.","lastModifiedDate":"2021-07-31"},{"lineNumber":64,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2021-07-31"},{"lineNumber":65,"author":{"gitId":"-"},"content":"\u003cimg src\u003d\"images/ComponentManagers.png\" width\u003d\"300\" /\u003e","lastModifiedDate":"2021-07-31"},{"lineNumber":66,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2021-07-31"},{"lineNumber":67,"author":{"gitId":"-"},"content":"The sections below give more details of each component.","lastModifiedDate":"2020-05-23"},{"lineNumber":68,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":69,"author":{"gitId":"-"},"content":"### UI component","lastModifiedDate":"2020-05-23"},{"lineNumber":70,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":71,"author":{"gitId":"-"},"content":"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)","lastModifiedDate":"2021-07-31"},{"lineNumber":72,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":73,"author":{"gitId":"-"},"content":"![Structure of the UI Component](images/UiClassDiagram.png)","lastModifiedDate":"2021-07-31"},{"lineNumber":74,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":75,"author":{"gitId":"-"},"content":"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.","lastModifiedDate":"2021-07-31"},{"lineNumber":76,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":77,"author":{"gitId":"-"},"content":"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)","lastModifiedDate":"2021-07-31"},{"lineNumber":78,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":79,"author":{"gitId":"-"},"content":"The `UI` component,","lastModifiedDate":"2020-05-23"},{"lineNumber":80,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":81,"author":{"gitId":"-"},"content":"* executes user commands using the `Logic` component.","lastModifiedDate":"2021-07-31"},{"lineNumber":82,"author":{"gitId":"-"},"content":"* listens for changes to `Model` data so that the UI can be updated with the modified data.","lastModifiedDate":"2021-07-31"},{"lineNumber":83,"author":{"gitId":"-"},"content":"* keeps a reference to the `Logic` component, because the `UI` relies on the `Logic` to execute commands.","lastModifiedDate":"2021-07-31"},{"lineNumber":84,"author":{"gitId":"-"},"content":"* depends on some classes in the `Model` component, as it displays `Person` object residing in the `Model`.","lastModifiedDate":"2021-07-31"},{"lineNumber":85,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":86,"author":{"gitId":"-"},"content":"### Logic component","lastModifiedDate":"2020-05-23"},{"lineNumber":87,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":88,"author":{"gitId":"-"},"content":"**API** : [`Logic.java`](https://github.com/se-edu/addressbook-level3/tree/master/src/main/java/seedu/address/logic/Logic.java)","lastModifiedDate":"2021-07-31"},{"lineNumber":89,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":90,"author":{"gitId":"-"},"content":"Here\u0027s a (partial) class diagram of the `Logic` component:","lastModifiedDate":"2021-07-31"},{"lineNumber":91,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":92,"author":{"gitId":"-"},"content":"\u003cimg src\u003d\"images/LogicClassDiagram.png\" width\u003d\"550\"/\u003e","lastModifiedDate":"2021-07-31"},{"lineNumber":93,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":94,"author":{"gitId":"-"},"content":"The sequence diagram below illustrates the interactions within the `Logic` component, taking `execute(\"delete 1\")` API call as an example.","lastModifiedDate":"2023-09-03"},{"lineNumber":95,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":96,"author":{"gitId":"-"},"content":"![Interactions Inside the Logic Component for the `delete 1` Command](images/DeleteSequenceDiagram.png)","lastModifiedDate":"2020-05-23"},{"lineNumber":97,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":98,"author":{"gitId":"-"},"content":"\u003cdiv markdown\u003d\"span\" class\u003d\"alert alert-info\"\u003e:information_source: **Note:** The lifeline for `DeleteCommandParser` should end at the destroy marker (X) but due to a limitation of PlantUML, the lifeline continues till the end of diagram.","lastModifiedDate":"2024-02-09"},{"lineNumber":99,"author":{"gitId":"-"},"content":"\u003c/div\u003e","lastModifiedDate":"2020-05-23"},{"lineNumber":100,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":101,"author":{"gitId":"-"},"content":"How the `Logic` component works:","lastModifiedDate":"2023-09-03"},{"lineNumber":102,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2023-09-03"},{"lineNumber":103,"author":{"gitId":"-"},"content":"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.","lastModifiedDate":"2023-09-03"},{"lineNumber":104,"author":{"gitId":"-"},"content":"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`.","lastModifiedDate":"2023-09-03"},{"lineNumber":105,"author":{"gitId":"-"},"content":"1. The command can communicate with the `Model` when it is executed (e.g. to delete a person).\u003cbr\u003e","lastModifiedDate":"2024-02-09"},{"lineNumber":106,"author":{"gitId":"-"},"content":" Note that although this is shown as a single step in the diagram above (for simplicity), in the code it can take several interactions (between the command object and the `Model`) to achieve.","lastModifiedDate":"2024-02-09"},{"lineNumber":107,"author":{"gitId":"-"},"content":"1. The result of the command execution is encapsulated as a `CommandResult` object which is returned back from `Logic`.","lastModifiedDate":"2023-09-03"},{"lineNumber":108,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2023-09-03"},{"lineNumber":109,"author":{"gitId":"-"},"content":"Here are the other classes in `Logic` (omitted from the class diagram above) that are used for parsing a user command:","lastModifiedDate":"2021-07-31"},{"lineNumber":110,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2021-07-31"},{"lineNumber":111,"author":{"gitId":"-"},"content":"\u003cimg src\u003d\"images/ParserClasses.png\" width\u003d\"600\"/\u003e","lastModifiedDate":"2021-07-31"},{"lineNumber":112,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":113,"author":{"gitId":"-"},"content":"How the parsing works:","lastModifiedDate":"2021-07-31"},{"lineNumber":114,"author":{"gitId":"-"},"content":"* 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.","lastModifiedDate":"2021-07-31"},{"lineNumber":115,"author":{"gitId":"-"},"content":"* 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.","lastModifiedDate":"2021-07-31"},{"lineNumber":116,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":117,"author":{"gitId":"-"},"content":"### Model component","lastModifiedDate":"2021-07-31"},{"lineNumber":118,"author":{"gitId":"-"},"content":"**API** : [`Model.java`](https://github.com/se-edu/addressbook-level3/tree/master/src/main/java/seedu/address/model/Model.java)","lastModifiedDate":"2020-05-23"},{"lineNumber":119,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":120,"author":{"gitId":"-"},"content":"\u003cimg src\u003d\"images/ModelClassDiagram.png\" width\u003d\"450\" /\u003e","lastModifiedDate":"2021-07-31"},{"lineNumber":121,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":122,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":123,"author":{"gitId":"-"},"content":"The `Model` component,","lastModifiedDate":"2021-07-31"},{"lineNumber":124,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":125,"author":{"gitId":"-"},"content":"* stores the address book data i.e., all `Person` objects (which are contained in a `UniquePersonList` object).","lastModifiedDate":"2021-07-31"},{"lineNumber":126,"author":{"gitId":"-"},"content":"* stores the currently \u0027selected\u0027 `Person` objects (e.g., results of a search query) as a separate _filtered_ list which is exposed to outsiders as an unmodifiable `ObservableList\u003cPerson\u003e` that can be \u0027observed\u0027 e.g. the UI can be bound to this list so that the UI automatically updates when the data in the list change.","lastModifiedDate":"2021-07-31"},{"lineNumber":127,"author":{"gitId":"-"},"content":"* stores a `UserPref` object that represents the user’s preferences. This is exposed to the outside as a `ReadOnlyUserPref` objects.","lastModifiedDate":"2021-07-31"},{"lineNumber":128,"author":{"gitId":"-"},"content":"* 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)","lastModifiedDate":"2021-07-31"},{"lineNumber":129,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2021-07-31"},{"lineNumber":130,"author":{"gitId":"-"},"content":"\u003cdiv markdown\u003d\"span\" class\u003d\"alert alert-info\"\u003e: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.\u003cbr\u003e","lastModifiedDate":"2021-07-31"},{"lineNumber":131,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2021-07-31"},{"lineNumber":132,"author":{"gitId":"-"},"content":"\u003cimg src\u003d\"images/BetterModelClassDiagram.png\" width\u003d\"450\" /\u003e","lastModifiedDate":"2021-07-31"},{"lineNumber":133,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":134,"author":{"gitId":"-"},"content":"\u003c/div\u003e","lastModifiedDate":"2020-05-23"},{"lineNumber":135,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":136,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":137,"author":{"gitId":"-"},"content":"### Storage component","lastModifiedDate":"2020-05-23"},{"lineNumber":138,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":139,"author":{"gitId":"-"},"content":"**API** : [`Storage.java`](https://github.com/se-edu/addressbook-level3/tree/master/src/main/java/seedu/address/storage/Storage.java)","lastModifiedDate":"2020-05-23"},{"lineNumber":140,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":141,"author":{"gitId":"-"},"content":"\u003cimg src\u003d\"images/StorageClassDiagram.png\" width\u003d\"550\" /\u003e","lastModifiedDate":"2021-07-31"},{"lineNumber":142,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2021-07-31"},{"lineNumber":143,"author":{"gitId":"-"},"content":"The `Storage` component,","lastModifiedDate":"2020-05-23"},{"lineNumber":144,"author":{"gitId":"-"},"content":"* can save both address book data and user preference data in JSON format, and read them back into corresponding objects.","lastModifiedDate":"2023-09-03"},{"lineNumber":145,"author":{"gitId":"-"},"content":"* inherits from both `AddressBookStorage` and `UserPrefStorage`, which means it can be treated as either one (if only the functionality of only one is needed).","lastModifiedDate":"2021-07-31"},{"lineNumber":146,"author":{"gitId":"-"},"content":"* depends on some classes in the `Model` component (because the `Storage` component\u0027s job is to save/retrieve objects that belong to the `Model`)","lastModifiedDate":"2021-07-21"},{"lineNumber":147,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":148,"author":{"gitId":"-"},"content":"### Common classes","lastModifiedDate":"2020-05-23"},{"lineNumber":149,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":150,"author":{"gitId":"-"},"content":"Classes used by multiple components are in the `seedu.addressbook.commons` package.","lastModifiedDate":"2020-05-23"},{"lineNumber":151,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":152,"author":{"gitId":"-"},"content":"--------------------------------------------------------------------------------------------------------------------","lastModifiedDate":"2020-05-23"},{"lineNumber":153,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":154,"author":{"gitId":"-"},"content":"## **Implementation**","lastModifiedDate":"2020-05-23"},{"lineNumber":155,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":156,"author":{"gitId":"-"},"content":"This section describes some noteworthy details on how certain features are implemented.","lastModifiedDate":"2020-05-23"},{"lineNumber":157,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":158,"author":{"gitId":"-"},"content":"### \\[Proposed\\] Undo/redo feature","lastModifiedDate":"2020-06-07"},{"lineNumber":159,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":160,"author":{"gitId":"-"},"content":"#### Proposed Implementation","lastModifiedDate":"2020-05-23"},{"lineNumber":161,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":162,"author":{"gitId":"-"},"content":"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:","lastModifiedDate":"2020-05-23"},{"lineNumber":163,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":164,"author":{"gitId":"-"},"content":"* `VersionedAddressBook#commit()` — Saves the current address book state in its history.","lastModifiedDate":"2020-05-23"},{"lineNumber":165,"author":{"gitId":"-"},"content":"* `VersionedAddressBook#undo()` — Restores the previous address book state from its history.","lastModifiedDate":"2020-05-23"},{"lineNumber":166,"author":{"gitId":"-"},"content":"* `VersionedAddressBook#redo()` — Restores a previously undone address book state from its history.","lastModifiedDate":"2020-05-23"},{"lineNumber":167,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":168,"author":{"gitId":"-"},"content":"These operations are exposed in the `Model` interface as `Model#commitAddressBook()`, `Model#undoAddressBook()` and `Model#redoAddressBook()` respectively.","lastModifiedDate":"2020-05-23"},{"lineNumber":169,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":170,"author":{"gitId":"-"},"content":"Given below is an example usage scenario and how the undo/redo mechanism behaves at each step.","lastModifiedDate":"2020-05-23"},{"lineNumber":171,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":172,"author":{"gitId":"-"},"content":"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.","lastModifiedDate":"2020-05-23"},{"lineNumber":173,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":174,"author":{"gitId":"-"},"content":"![UndoRedoState0](images/UndoRedoState0.png)","lastModifiedDate":"2020-05-23"},{"lineNumber":175,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":176,"author":{"gitId":"-"},"content":"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.","lastModifiedDate":"2020-05-23"},{"lineNumber":177,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":178,"author":{"gitId":"-"},"content":"![UndoRedoState1](images/UndoRedoState1.png)","lastModifiedDate":"2020-05-23"},{"lineNumber":179,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":180,"author":{"gitId":"-"},"content":"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`.","lastModifiedDate":"2020-05-23"},{"lineNumber":181,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":182,"author":{"gitId":"-"},"content":"![UndoRedoState2](images/UndoRedoState2.png)","lastModifiedDate":"2020-05-23"},{"lineNumber":183,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":184,"author":{"gitId":"-"},"content":"\u003cdiv markdown\u003d\"span\" class\u003d\"alert alert-info\"\u003e: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`.","lastModifiedDate":"2020-05-23"},{"lineNumber":185,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":186,"author":{"gitId":"-"},"content":"\u003c/div\u003e","lastModifiedDate":"2020-05-23"},{"lineNumber":187,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":188,"author":{"gitId":"-"},"content":"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.","lastModifiedDate":"2020-05-23"},{"lineNumber":189,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":190,"author":{"gitId":"-"},"content":"![UndoRedoState3](images/UndoRedoState3.png)","lastModifiedDate":"2020-05-23"},{"lineNumber":191,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":192,"author":{"gitId":"-"},"content":"\u003cdiv markdown\u003d\"span\" class\u003d\"alert alert-info\"\u003e: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","lastModifiedDate":"2020-05-23"},{"lineNumber":193,"author":{"gitId":"-"},"content":"than attempting to perform the undo.","lastModifiedDate":"2020-05-23"},{"lineNumber":194,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":195,"author":{"gitId":"-"},"content":"\u003c/div\u003e","lastModifiedDate":"2020-05-23"},{"lineNumber":196,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":197,"author":{"gitId":"-"},"content":"The following sequence diagram shows how an undo operation goes through the `Logic` component:","lastModifiedDate":"2024-02-09"},{"lineNumber":198,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":199,"author":{"gitId":"-"},"content":"![UndoSequenceDiagram](images/UndoSequenceDiagram-Logic.png)","lastModifiedDate":"2024-02-09"},{"lineNumber":200,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":201,"author":{"gitId":"-"},"content":"\u003cdiv markdown\u003d\"span\" class\u003d\"alert alert-info\"\u003e: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.","lastModifiedDate":"2020-05-23"},{"lineNumber":202,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":203,"author":{"gitId":"-"},"content":"\u003c/div\u003e","lastModifiedDate":"2020-05-23"},{"lineNumber":204,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":205,"author":{"gitId":"-"},"content":"Similarly, how an undo operation goes through the `Model` component is shown below:","lastModifiedDate":"2024-02-09"},{"lineNumber":206,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2024-02-09"},{"lineNumber":207,"author":{"gitId":"-"},"content":"![UndoSequenceDiagram](images/UndoSequenceDiagram-Model.png)","lastModifiedDate":"2024-02-09"},{"lineNumber":208,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2024-02-09"},{"lineNumber":209,"author":{"gitId":"-"},"content":"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.","lastModifiedDate":"2020-05-23"},{"lineNumber":210,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":211,"author":{"gitId":"-"},"content":"\u003cdiv markdown\u003d\"span\" class\u003d\"alert alert-info\"\u003e: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.","lastModifiedDate":"2020-05-23"},{"lineNumber":212,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":213,"author":{"gitId":"-"},"content":"\u003c/div\u003e","lastModifiedDate":"2020-05-23"},{"lineNumber":214,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":215,"author":{"gitId":"-"},"content":"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.","lastModifiedDate":"2020-05-23"},{"lineNumber":216,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":217,"author":{"gitId":"-"},"content":"![UndoRedoState4](images/UndoRedoState4.png)","lastModifiedDate":"2020-05-23"},{"lineNumber":218,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":219,"author":{"gitId":"-"},"content":"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.","lastModifiedDate":"2020-05-23"},{"lineNumber":220,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":221,"author":{"gitId":"-"},"content":"![UndoRedoState5](images/UndoRedoState5.png)","lastModifiedDate":"2020-05-23"},{"lineNumber":222,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":223,"author":{"gitId":"-"},"content":"The following activity diagram summarizes what happens when a user executes a new command:","lastModifiedDate":"2020-05-23"},{"lineNumber":224,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":225,"author":{"gitId":"-"},"content":"\u003cimg src\u003d\"images/CommitActivityDiagram.png\" width\u003d\"250\" /\u003e","lastModifiedDate":"2021-07-31"},{"lineNumber":226,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":227,"author":{"gitId":"-"},"content":"#### Design considerations:","lastModifiedDate":"2021-07-31"},{"lineNumber":228,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":229,"author":{"gitId":"-"},"content":"**Aspect: How undo \u0026 redo executes:**","lastModifiedDate":"2021-07-31"},{"lineNumber":230,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":231,"author":{"gitId":"-"},"content":"* **Alternative 1 (current choice):** Saves the entire address book.","lastModifiedDate":"2020-05-23"},{"lineNumber":232,"author":{"gitId":"-"},"content":" * Pros: Easy to implement.","lastModifiedDate":"2020-05-23"},{"lineNumber":233,"author":{"gitId":"-"},"content":" * Cons: May have performance issues in terms of memory usage.","lastModifiedDate":"2020-05-23"},{"lineNumber":234,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":235,"author":{"gitId":"-"},"content":"* **Alternative 2:** Individual command knows how to undo/redo by","lastModifiedDate":"2020-05-23"},{"lineNumber":236,"author":{"gitId":"-"},"content":" itself.","lastModifiedDate":"2020-05-23"},{"lineNumber":237,"author":{"gitId":"-"},"content":" * Pros: Will use less memory (e.g. for `delete`, just save the person being deleted).","lastModifiedDate":"2020-05-23"},{"lineNumber":238,"author":{"gitId":"-"},"content":" * Cons: We must ensure that the implementation of each individual command are correct.","lastModifiedDate":"2020-05-23"},{"lineNumber":239,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":240,"author":{"gitId":"-"},"content":"_{more aspects and alternatives to be added}_","lastModifiedDate":"2020-05-23"},{"lineNumber":241,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":242,"author":{"gitId":"-"},"content":"### \\[Proposed\\] Data archiving","lastModifiedDate":"2020-05-23"},{"lineNumber":243,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":244,"author":{"gitId":"-"},"content":"_{Explain here how the data archiving feature will be implemented}_","lastModifiedDate":"2020-05-23"},{"lineNumber":245,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":246,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":247,"author":{"gitId":"-"},"content":"--------------------------------------------------------------------------------------------------------------------","lastModifiedDate":"2020-05-23"},{"lineNumber":248,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":249,"author":{"gitId":"-"},"content":"## **Documentation, logging, testing, configuration, dev-ops**","lastModifiedDate":"2020-06-07"},{"lineNumber":250,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":251,"author":{"gitId":"-"},"content":"* [Documentation guide](Documentation.md)","lastModifiedDate":"2020-06-07"},{"lineNumber":252,"author":{"gitId":"-"},"content":"* [Testing guide](Testing.md)","lastModifiedDate":"2020-06-07"},{"lineNumber":253,"author":{"gitId":"-"},"content":"* [Logging guide](Logging.md)","lastModifiedDate":"2020-06-07"},{"lineNumber":254,"author":{"gitId":"-"},"content":"* [Configuration guide](Configuration.md)","lastModifiedDate":"2020-06-07"},{"lineNumber":255,"author":{"gitId":"-"},"content":"* [DevOps guide](DevOps.md)","lastModifiedDate":"2020-06-07"},{"lineNumber":256,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":257,"author":{"gitId":"-"},"content":"--------------------------------------------------------------------------------------------------------------------","lastModifiedDate":"2020-05-23"},{"lineNumber":258,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":259,"author":{"gitId":"-"},"content":"## **Appendix: Requirements**","lastModifiedDate":"2020-05-23"},{"lineNumber":260,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":261,"author":{"gitId":"-"},"content":"### Product scope","lastModifiedDate":"2020-05-23"},{"lineNumber":262,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":263,"author":{"gitId":"-"},"content":"**Target user profile**:","lastModifiedDate":"2020-05-23"},{"lineNumber":264,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":265,"author":{"gitId":"-"},"content":"* has a need to manage a significant number of contacts","lastModifiedDate":"2020-05-23"},{"lineNumber":266,"author":{"gitId":"-"},"content":"* prefer desktop apps over other types","lastModifiedDate":"2020-05-23"},{"lineNumber":267,"author":{"gitId":"-"},"content":"* can type fast","lastModifiedDate":"2020-05-23"},{"lineNumber":268,"author":{"gitId":"-"},"content":"* prefers typing to mouse interactions","lastModifiedDate":"2020-05-26"},{"lineNumber":269,"author":{"gitId":"-"},"content":"* is reasonably comfortable using CLI apps","lastModifiedDate":"2020-05-23"},{"lineNumber":270,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":271,"author":{"gitId":"-"},"content":"**Value proposition**: manage contacts faster than a typical mouse/GUI driven app","lastModifiedDate":"2020-05-23"},{"lineNumber":272,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":273,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":274,"author":{"gitId":"-"},"content":"### User stories","lastModifiedDate":"2020-06-07"},{"lineNumber":275,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":276,"author":{"gitId":"-"},"content":"Priorities: High (must have) - `* * *`, Medium (nice to have) - `* *`, Low (unlikely to have) - `*`","lastModifiedDate":"2020-05-23"},{"lineNumber":277,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":278,"author":{"gitId":"-"},"content":"| Priority | As a …​ | I want to …​ | So that I can…​ |","lastModifiedDate":"2020-05-23"},{"lineNumber":279,"author":{"gitId":"kaitinghh"},"content":"|----------|----------------------------------------------|--------------------------------------------------------------------------------------|---------------------------------------------------------------------------------------------|","lastModifiedDate":"2024-03-07"},{"lineNumber":280,"author":{"gitId":"kaitinghh"},"content":"| `* * *` | user | mark students\u0027 attendance | view attendance records easily in the app. |","lastModifiedDate":"2024-03-07"},{"lineNumber":281,"author":{"gitId":"kaitinghh"},"content":"| `* * *` | user | add a contact entry | |","lastModifiedDate":"2024-03-07"},{"lineNumber":282,"author":{"gitId":"kaitinghh"},"content":"| `* * *` | user | delete a contact entry | |","lastModifiedDate":"2024-03-07"},{"lineNumber":283,"author":{"gitId":"kaitinghh"},"content":"| `* * *` | user | add tags | |","lastModifiedDate":"2024-03-07"},{"lineNumber":284,"author":{"gitId":"kaitinghh"},"content":"| `* * *` | user | delete tags | |","lastModifiedDate":"2024-03-07"},{"lineNumber":285,"author":{"gitId":"kaitinghh"},"content":"| `* * *` | user | edit a contact entry | |","lastModifiedDate":"2024-03-07"},{"lineNumber":286,"author":{"gitId":"kaitinghh"},"content":"| `* * *` | user | search for specific contacts | easily retrieve the contact info of a student/tutor if I need to contact them. |","lastModifiedDate":"2024-03-07"},{"lineNumber":287,"author":{"gitId":"kaitinghh"},"content":"| `* * *` | user | have a basic GUI to interact with | use the app conveniently instead of in shell/terminal. |","lastModifiedDate":"2024-03-07"},{"lineNumber":288,"author":{"gitId":"kaitinghh"},"content":"| `* *` | user with many students and tutors to manage | send group emails to students/tutors | save time on gathering email addresses. |","lastModifiedDate":"2024-03-07"},{"lineNumber":289,"author":{"gitId":"kaitinghh"},"content":"| `* *` | user | organize students into classes | separate records for students from different classes. |","lastModifiedDate":"2024-03-07"},{"lineNumber":290,"author":{"gitId":"kaitinghh"},"content":"| `* *` | beginner user | access a user guide | understand the functions of the app. |","lastModifiedDate":"2024-03-07"},{"lineNumber":291,"author":{"gitId":"kaitinghh"},"content":"| `* *` | potential user exploring the app | see the app populated with sample data | get an idea of how the app is used. |","lastModifiedDate":"2024-03-07"},{"lineNumber":292,"author":{"gitId":"kaitinghh"},"content":"| `* *` | user with many students and tutors to manage | filter contacts with relevant keywords or tags | access records relevant to a specific keyword quickly. |","lastModifiedDate":"2024-03-07"},{"lineNumber":293,"author":{"gitId":"kaitinghh"},"content":"| `* *` | novice user | expect the commands to be common-sensical | pick up the app at speed. |","lastModifiedDate":"2024-03-07"},{"lineNumber":294,"author":{"gitId":"kaitinghh"},"content":"| `* *` | novice user | expect warnings to be given to irreversible actions such as batch delete contacts | will not lose my data out of unfamiliarity with the commands. |","lastModifiedDate":"2024-03-07"},{"lineNumber":295,"author":{"gitId":"kaitinghh"},"content":"| `* *` | frequent user | batch edit contacts | make similar changes to a large number of contacts quickly. |","lastModifiedDate":"2024-03-07"},{"lineNumber":296,"author":{"gitId":"kaitinghh"},"content":"| `* *` | user | see which tutors are available | quickly allocate them for replacement tutoring. |","lastModifiedDate":"2024-03-07"},{"lineNumber":297,"author":{"gitId":"kaitinghh"},"content":"| `* *` | novice user | have a sleek and simple UI | use the app easily. |","lastModifiedDate":"2024-03-07"},{"lineNumber":298,"author":{"gitId":"kaitinghh"},"content":"| `* *` | careless user | backup the last few edits | revert changes if necessary. |","lastModifiedDate":"2024-03-07"},{"lineNumber":299,"author":{"gitId":"kaitinghh"},"content":"| `* *` | user | track students\u0027 assignment progress | follow up if necessary. |","lastModifiedDate":"2024-03-07"},{"lineNumber":300,"author":{"gitId":"kaitinghh"},"content":"| `* *` | user | edit tags | easily customise existing tags for my use case. |","lastModifiedDate":"2024-03-07"},{"lineNumber":301,"author":{"gitId":"kaitinghh"},"content":"| `* *` | careless user | backup the last few edits | revert changes if necessary. |","lastModifiedDate":"2024-03-07"},{"lineNumber":302,"author":{"gitId":"kaitinghh"},"content":"| `*` | expert user | export data in .xlsx | share records with other tutors. |","lastModifiedDate":"2024-03-07"},{"lineNumber":303,"author":{"gitId":"kaitinghh"},"content":"| `*` | expert user | create shortcuts for specific commands | perform the usual tasks quickly. |","lastModifiedDate":"2024-03-07"},{"lineNumber":304,"author":{"gitId":"kaitinghh"},"content":"| `*` | user with lots of data stored | batch imports to have a timestamp | easily locate certain information based on import time, or batch delete them when obsolete. |","lastModifiedDate":"2024-03-07"},{"lineNumber":305,"author":{"gitId":"kaitinghh"},"content":"| `*` | novice user | accessible help page to remind me of command keywords | carry out tasks quickly even without remembering the command keywords. |","lastModifiedDate":"2024-03-07"},{"lineNumber":306,"author":{"gitId":"kaitinghh"},"content":"| `*` | user | generate attendance reports of the students | see who has been skipping classes. |","lastModifiedDate":"2024-03-07"},{"lineNumber":307,"author":{"gitId":"kaitinghh"},"content":"| `*` | busy user | receive reminders for upcoming classes | keep track of my upcoming lessons. |","lastModifiedDate":"2024-03-07"},{"lineNumber":308,"author":{"gitId":"kaitinghh"},"content":"| `*` | impatient user | use the app offline | use the app even when the connection is poor. |","lastModifiedDate":"2024-03-07"},{"lineNumber":309,"author":{"gitId":"kaitinghh"},"content":"| `*` | user who is familiar with cli | be able to access already executed commands | execute them again when needed without having to type everything again. |","lastModifiedDate":"2024-03-07"},{"lineNumber":310,"author":{"gitId":"kaitinghh"},"content":"| `*` | user who is familiar with cli | see a list of suggested commands after having typed the initial letters of a keyword | quickly select a command to complete and it is less likely that I misspell a command. |","lastModifiedDate":"2024-03-07"},{"lineNumber":311,"author":{"gitId":"kaitinghh"},"content":"| `*` | beginner user | GUI to be simple and self-explanatory | get familiar with the app easily. |","lastModifiedDate":"2024-03-07"},{"lineNumber":312,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":313,"author":{"gitId":"-"},"content":"### Use cases","lastModifiedDate":"2020-06-07"},{"lineNumber":314,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":315,"author":{"gitId":"wang-xinrong"},"content":"(For all use cases below, the **System** is the `TrAcker`, the **Actor** is the `user` and **persons** can be both a student and a TA unless specified otherwise)","lastModifiedDate":"2024-03-07"},{"lineNumber":316,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":317,"author":{"gitId":"-"},"content":"**Use case: Delete a person**","lastModifiedDate":"2020-05-23"},{"lineNumber":318,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":319,"author":{"gitId":"-"},"content":"**MSS**","lastModifiedDate":"2020-05-23"},{"lineNumber":320,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":321,"author":{"gitId":"-"},"content":"1. User requests to list persons","lastModifiedDate":"2020-05-23"},{"lineNumber":322,"author":{"gitId":"wang-xinrong"},"content":"2. TrAcker shows a list of persons","lastModifiedDate":"2024-03-07"},{"lineNumber":323,"author":{"gitId":"-"},"content":"3. User requests to delete a specific person in the list","lastModifiedDate":"2020-05-23"},{"lineNumber":324,"author":{"gitId":"-"},"content":"4. AddressBook deletes the person","lastModifiedDate":"2020-05-23"},{"lineNumber":325,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":326,"author":{"gitId":"-"},"content":" Use case ends.","lastModifiedDate":"2020-05-23"},{"lineNumber":327,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":328,"author":{"gitId":"-"},"content":"**Extensions**","lastModifiedDate":"2020-05-23"},{"lineNumber":329,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":330,"author":{"gitId":"-"},"content":"* 2a. The list is empty.","lastModifiedDate":"2020-05-23"},{"lineNumber":331,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":332,"author":{"gitId":"-"},"content":" Use case ends.","lastModifiedDate":"2020-05-23"},{"lineNumber":333,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":334,"author":{"gitId":"-"},"content":"* 3a. The given index is invalid.","lastModifiedDate":"2020-05-23"},{"lineNumber":335,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":336,"author":{"gitId":"wang-xinrong"},"content":" * 3a1. TrAcker shows an error message.","lastModifiedDate":"2024-03-07"},{"lineNumber":337,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":338,"author":{"gitId":"-"},"content":" Use case resumes at step 2.","lastModifiedDate":"2020-05-23"},{"lineNumber":339,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":340,"author":{"gitId":"wang-xinrong"},"content":"**Use case: Add a person**","lastModifiedDate":"2024-03-07"},{"lineNumber":341,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2024-03-07"},{"lineNumber":342,"author":{"gitId":"wang-xinrong"},"content":"**MSS**","lastModifiedDate":"2024-03-07"},{"lineNumber":343,"author":{"gitId":"wang-xinrong"},"content":"","lastModifiedDate":"2024-03-07"},{"lineNumber":344,"author":{"gitId":"wang-xinrong"},"content":"1. User requests to add a person with relevant entries such as name, phone number and email","lastModifiedDate":"2024-03-07"},{"lineNumber":345,"author":{"gitId":"wang-xinrong"},"content":"2. TrAcker adds the entry to its contact list","lastModifiedDate":"2024-03-07"},{"lineNumber":346,"author":{"gitId":"wang-xinrong"},"content":"","lastModifiedDate":"2024-03-07"},{"lineNumber":347,"author":{"gitId":"wang-xinrong"},"content":" Use case ends.","lastModifiedDate":"2024-03-07"},{"lineNumber":348,"author":{"gitId":"wang-xinrong"},"content":"","lastModifiedDate":"2024-03-07"},{"lineNumber":349,"author":{"gitId":"wang-xinrong"},"content":"**Extensions**","lastModifiedDate":"2024-03-07"},{"lineNumber":350,"author":{"gitId":"wang-xinrong"},"content":"","lastModifiedDate":"2024-03-07"},{"lineNumber":351,"author":{"gitId":"wang-xinrong"},"content":"* 1a. User inputs information in incorrect format","lastModifiedDate":"2024-03-07"},{"lineNumber":352,"author":{"gitId":"wang-xinrong"},"content":"","lastModifiedDate":"2024-03-07"},{"lineNumber":353,"author":{"gitId":"wang-xinrong"},"content":" * 1a1. TrAcker shows an error message.","lastModifiedDate":"2024-03-07"},{"lineNumber":354,"author":{"gitId":"wang-xinrong"},"content":" ","lastModifiedDate":"2024-03-07"},{"lineNumber":355,"author":{"gitId":"wang-xinrong"},"content":" Use case resumes at step 1","lastModifiedDate":"2024-03-07"},{"lineNumber":356,"author":{"gitId":"wang-xinrong"},"content":"","lastModifiedDate":"2024-03-07"},{"lineNumber":357,"author":{"gitId":"wang-xinrong"},"content":"**Use case: Search a contact**","lastModifiedDate":"2024-03-07"},{"lineNumber":358,"author":{"gitId":"wang-xinrong"},"content":"","lastModifiedDate":"2024-03-07"},{"lineNumber":359,"author":{"gitId":"wang-xinrong"},"content":"**MSS**","lastModifiedDate":"2024-03-07"},{"lineNumber":360,"author":{"gitId":"wang-xinrong"},"content":"","lastModifiedDate":"2024-03-07"},{"lineNumber":361,"author":{"gitId":"wang-xinrong"},"content":"1. User requests to search a contact by keywords (for names)","lastModifiedDate":"2024-03-07"},{"lineNumber":362,"author":{"gitId":"wang-xinrong"},"content":"2. TrAcker shows a list of contacts whose names match the keywords","lastModifiedDate":"2024-03-07"},{"lineNumber":363,"author":{"gitId":"wang-xinrong"},"content":"","lastModifiedDate":"2024-03-07"},{"lineNumber":364,"author":{"gitId":"wang-xinrong"},"content":" Use case ends.","lastModifiedDate":"2024-03-07"},{"lineNumber":365,"author":{"gitId":"wang-xinrong"},"content":"","lastModifiedDate":"2024-03-07"},{"lineNumber":366,"author":{"gitId":"wang-xinrong"},"content":"**Extensions**","lastModifiedDate":"2024-03-07"},{"lineNumber":367,"author":{"gitId":"wang-xinrong"},"content":"","lastModifiedDate":"2024-03-07"},{"lineNumber":368,"author":{"gitId":"wang-xinrong"},"content":"* 1a. No contacts have names including the specified keywords.","lastModifiedDate":"2024-03-07"},{"lineNumber":369,"author":{"gitId":"wang-xinrong"},"content":"","lastModifiedDate":"2024-03-07"},{"lineNumber":370,"author":{"gitId":"wang-xinrong"},"content":" *1a1. TrAcker shows an empty list","lastModifiedDate":"2024-03-07"},{"lineNumber":371,"author":{"gitId":"wang-xinrong"},"content":"","lastModifiedDate":"2024-03-07"},{"lineNumber":372,"author":{"gitId":"wang-xinrong"},"content":" Use case ends.","lastModifiedDate":"2024-03-07"},{"lineNumber":373,"author":{"gitId":"wang-xinrong"},"content":"","lastModifiedDate":"2024-03-07"},{"lineNumber":374,"author":{"gitId":"wang-xinrong"},"content":"**Use case: Edit a contact**","lastModifiedDate":"2024-03-07"},{"lineNumber":375,"author":{"gitId":"wang-xinrong"},"content":"","lastModifiedDate":"2024-03-07"},{"lineNumber":376,"author":{"gitId":"wang-xinrong"},"content":"**MSS**","lastModifiedDate":"2024-03-07"},{"lineNumber":377,"author":{"gitId":"wang-xinrong"},"content":"","lastModifiedDate":"2024-03-07"},{"lineNumber":378,"author":{"gitId":"wang-xinrong"},"content":"1. User requests to edit a contact with new information","lastModifiedDate":"2024-03-07"},{"lineNumber":379,"author":{"gitId":"wang-xinrong"},"content":"2. TrAcker updates the contact with specified new information","lastModifiedDate":"2024-03-07"},{"lineNumber":380,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2024-03-07"},{"lineNumber":381,"author":{"gitId":"wang-xinrong"},"content":" Use case ends.","lastModifiedDate":"2024-03-07"},{"lineNumber":382,"author":{"gitId":"wang-xinrong"},"content":"","lastModifiedDate":"2024-03-07"},{"lineNumber":383,"author":{"gitId":"wang-xinrong"},"content":"**Extensions**","lastModifiedDate":"2024-03-07"},{"lineNumber":384,"author":{"gitId":"wang-xinrong"},"content":"","lastModifiedDate":"2024-03-07"},{"lineNumber":385,"author":{"gitId":"wang-xinrong"},"content":"* 1a. User inputs new information in incorrect format","lastModifiedDate":"2024-03-07"},{"lineNumber":386,"author":{"gitId":"wang-xinrong"},"content":"","lastModifiedDate":"2024-03-07"},{"lineNumber":387,"author":{"gitId":"wang-xinrong"},"content":" * 1a1. TrAcker shows an error message.","lastModifiedDate":"2024-03-07"},{"lineNumber":388,"author":{"gitId":"wang-xinrong"},"content":"","lastModifiedDate":"2024-03-07"},{"lineNumber":389,"author":{"gitId":"wang-xinrong"},"content":" Use case resumes at step 1","lastModifiedDate":"2024-03-07"},{"lineNumber":390,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":391,"author":{"gitId":"-"},"content":"### Non-Functional Requirements","lastModifiedDate":"2020-05-23"},{"lineNumber":392,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":393,"author":{"gitId":"wongkj12"},"content":"1. **(Technical)** Should work on any _mainstream OS_ as long as it has Java `11` or above installed.","lastModifiedDate":"2024-03-07"},{"lineNumber":394,"author":{"gitId":"wongkj12"},"content":"2. **(Quality)** 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.","lastModifiedDate":"2024-03-07"},{"lineNumber":395,"author":{"gitId":"wongkj12"},"content":"3. **(Quality)** The user interface and commands should be intuitive and user-friendly, requiring minimal time to learn.","lastModifiedDate":"2024-03-07"},{"lineNumber":396,"author":{"gitId":"wongkj12"},"content":"4. **(Quality)** The app should provide clear and informative error messages in case of invalid inputs or command failures.","lastModifiedDate":"2024-03-07"},{"lineNumber":397,"author":{"gitId":"wongkj12"},"content":"5. **(Performance)** The app should respond to user actions within 0.5 seconds, ensuring smooth navigation and interaction.","lastModifiedDate":"2024-03-07"},{"lineNumber":398,"author":{"gitId":"wongkj12"},"content":"6. **(Performance)** The app should be able to support at minimum a contacts list of 200 without affecting performance.","lastModifiedDate":"2024-03-07"},{"lineNumber":399,"author":{"gitId":"wongkj12"},"content":"7. **(Performance)** The app should be able to run smoothly even on low-end hardware configurations.","lastModifiedDate":"2024-03-07"},{"lineNumber":400,"author":{"gitId":"wongkj12"},"content":"8. **(Process)** The project is expected to adhere to a schedule that adds updates incrementally at least once every two weeks.","lastModifiedDate":"2024-03-07"},{"lineNumber":401,"author":{"gitId":"wongkj12"},"content":"9. **(Project scope)** The product should be focused on the needs of our target user, head teaching assistants.","lastModifiedDate":"2024-03-07"},{"lineNumber":402,"author":{"gitId":"wongkj12"},"content":"10. **(Documentation)** Comprehensive user guide should be provided, with detailed instructions on how to use each command.","lastModifiedDate":"2024-03-07"},{"lineNumber":403,"author":{"gitId":"wongkj12"},"content":"11. **(Documentation)** Comprehensive developer guide should be created to facilitate ongoing maintenance of the app.","lastModifiedDate":"2024-03-07"},{"lineNumber":404,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":405,"author":{"gitId":"-"},"content":"### Glossary","lastModifiedDate":"2020-05-23"},{"lineNumber":406,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":407,"author":{"gitId":"-"},"content":"* **Mainstream OS**: Windows, Linux, Unix, MacOS","lastModifiedDate":"2024-02-09"},{"lineNumber":408,"author":{"gitId":"yongkotaro"},"content":"* **Tutor**: A teaching assistant for CS2103T","lastModifiedDate":"2024-03-07"},{"lineNumber":409,"author":{"gitId":"yongkotaro"},"content":"* **Student**: A student taking CS2103T","lastModifiedDate":"2024-03-07"},{"lineNumber":410,"author":{"gitId":"yongkotaro"},"content":"* **Tag**: A label that can be attached to the student. It is used to mark the attendance for a specific week.","lastModifiedDate":"2024-03-07"},{"lineNumber":411,"author":{"gitId":"yongkotaro"},"content":"* **Attendance Status**: The current state of a student\u0027s attendance. ","lastModifiedDate":"2024-03-07"},{"lineNumber":412,"author":{"gitId":"yongkotaro"},"content":"* **Contact Entry**: Contact information of either a student or a tutor, containing the name, phone number, email, and attendance status.","lastModifiedDate":"2024-03-07"},{"lineNumber":413,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":414,"author":{"gitId":"-"},"content":"--------------------------------------------------------------------------------------------------------------------","lastModifiedDate":"2020-05-23"},{"lineNumber":415,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":416,"author":{"gitId":"-"},"content":"## **Appendix: Instructions for manual testing**","lastModifiedDate":"2020-05-23"},{"lineNumber":417,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":418,"author":{"gitId":"-"},"content":"Given below are instructions to test the app manually.","lastModifiedDate":"2020-05-23"},{"lineNumber":419,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":420,"author":{"gitId":"-"},"content":"\u003cdiv markdown\u003d\"span\" class\u003d\"alert alert-info\"\u003e:information_source: **Note:** These instructions only provide a starting point for testers to work on;","lastModifiedDate":"2020-05-23"},{"lineNumber":421,"author":{"gitId":"-"},"content":"testers are expected to do more *exploratory* testing.","lastModifiedDate":"2020-05-23"},{"lineNumber":422,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":423,"author":{"gitId":"-"},"content":"\u003c/div\u003e","lastModifiedDate":"2020-05-23"},{"lineNumber":424,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":425,"author":{"gitId":"-"},"content":"### Launch and shutdown","lastModifiedDate":"2020-05-23"},{"lineNumber":426,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":427,"author":{"gitId":"-"},"content":"1. Initial launch","lastModifiedDate":"2020-05-23"},{"lineNumber":428,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":429,"author":{"gitId":"-"},"content":" 1. Download the jar file and copy into an empty folder","lastModifiedDate":"2020-05-23"},{"lineNumber":430,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":431,"author":{"gitId":"-"},"content":" 1. Double-click the jar file Expected: Shows the GUI with a set of sample contacts. The window size may not be optimum.","lastModifiedDate":"2020-05-23"},{"lineNumber":432,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":433,"author":{"gitId":"-"},"content":"1. Saving window preferences","lastModifiedDate":"2020-05-23"},{"lineNumber":434,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":435,"author":{"gitId":"-"},"content":" 1. Resize the window to an optimum size. Move the window to a different location. Close the window.","lastModifiedDate":"2020-05-23"},{"lineNumber":436,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":437,"author":{"gitId":"-"},"content":" 1. Re-launch the app by double-clicking the jar file.\u003cbr\u003e","lastModifiedDate":"2020-05-23"},{"lineNumber":438,"author":{"gitId":"-"},"content":" Expected: The most recent window size and location is retained.","lastModifiedDate":"2020-05-23"},{"lineNumber":439,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":440,"author":{"gitId":"-"},"content":"1. _{ more test cases …​ }_","lastModifiedDate":"2020-05-23"},{"lineNumber":441,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":442,"author":{"gitId":"-"},"content":"### Deleting a person","lastModifiedDate":"2020-05-23"},{"lineNumber":443,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":444,"author":{"gitId":"-"},"content":"1. Deleting a person while all persons are being shown","lastModifiedDate":"2020-05-23"},{"lineNumber":445,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":446,"author":{"gitId":"-"},"content":" 1. Prerequisites: List all persons using the `list` command. Multiple persons in the list.","lastModifiedDate":"2020-05-23"},{"lineNumber":447,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":448,"author":{"gitId":"-"},"content":" 1. Test case: `delete 1`\u003cbr\u003e","lastModifiedDate":"2020-05-23"},{"lineNumber":449,"author":{"gitId":"-"},"content":" 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.","lastModifiedDate":"2020-05-23"},{"lineNumber":450,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":451,"author":{"gitId":"-"},"content":" 1. Test case: `delete 0`\u003cbr\u003e","lastModifiedDate":"2020-05-23"},{"lineNumber":452,"author":{"gitId":"-"},"content":" Expected: No person is deleted. Error details shown in the status message. Status bar remains the same.","lastModifiedDate":"2020-05-23"},{"lineNumber":453,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":454,"author":{"gitId":"-"},"content":" 1. Other incorrect delete commands to try: `delete`, `delete x`, `...` (where x is larger than the list size)\u003cbr\u003e","lastModifiedDate":"2020-05-23"},{"lineNumber":455,"author":{"gitId":"-"},"content":" Expected: Similar to previous.","lastModifiedDate":"2020-05-23"},{"lineNumber":456,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":457,"author":{"gitId":"-"},"content":"1. _{ more test cases …​ }_","lastModifiedDate":"2020-05-23"},{"lineNumber":458,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":459,"author":{"gitId":"-"},"content":"### Saving data","lastModifiedDate":"2020-05-23"},{"lineNumber":460,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":461,"author":{"gitId":"-"},"content":"1. Dealing with missing/corrupted data files","lastModifiedDate":"2020-05-23"},{"lineNumber":462,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":463,"author":{"gitId":"-"},"content":" 1. _{explain how to simulate a missing/corrupted file, and the expected behavior}_","lastModifiedDate":"2020-05-23"},{"lineNumber":464,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":465,"author":{"gitId":"-"},"content":"1. _{ more test cases …​ }_","lastModifiedDate":"2020-05-23"}],"authorContributionMap":{"wongkj12":11,"yongkotaro":5,"kaitinghh":33,"wang-xinrong":51,"-":365}},{"path":"docs/team/kaitinghh.md","fileType":"docs","lines":[{"lineNumber":1,"author":{"gitId":"kaitinghh"},"content":"---","lastModifiedDate":"2024-03-07"},{"lineNumber":2,"author":{"gitId":"kaitinghh"},"content":"layout: page","lastModifiedDate":"2024-03-07"},{"lineNumber":3,"author":{"gitId":"kaitinghh"},"content":"title: Ho Kai Ting\u0027s Project Portfolio Page","lastModifiedDate":"2024-03-07"},{"lineNumber":4,"author":{"gitId":"kaitinghh"},"content":"---","lastModifiedDate":"2024-03-07"},{"lineNumber":5,"author":{"gitId":"kaitinghh"},"content":"","lastModifiedDate":"2024-03-07"},{"lineNumber":6,"author":{"gitId":"kaitinghh"},"content":"### Project: AddressBook Level 3","lastModifiedDate":"2024-03-07"},{"lineNumber":7,"author":{"gitId":"kaitinghh"},"content":"","lastModifiedDate":"2024-03-07"},{"lineNumber":8,"author":{"gitId":"kaitinghh"},"content":"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.","lastModifiedDate":"2024-03-07"},{"lineNumber":9,"author":{"gitId":"kaitinghh"},"content":"","lastModifiedDate":"2024-03-07"},{"lineNumber":10,"author":{"gitId":"kaitinghh"},"content":"Given below are my contributions to the project.","lastModifiedDate":"2024-03-07"},{"lineNumber":11,"author":{"gitId":"kaitinghh"},"content":"","lastModifiedDate":"2024-03-07"},{"lineNumber":12,"author":{"gitId":"kaitinghh"},"content":"* **New Feature**: Added the ability to undo/redo previous commands.","lastModifiedDate":"2024-03-07"},{"lineNumber":13,"author":{"gitId":"kaitinghh"},"content":" * 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.","lastModifiedDate":"2024-03-07"},{"lineNumber":14,"author":{"gitId":"kaitinghh"},"content":" * 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.","lastModifiedDate":"2024-03-07"},{"lineNumber":15,"author":{"gitId":"kaitinghh"},"content":" * 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.","lastModifiedDate":"2024-03-07"},{"lineNumber":16,"author":{"gitId":"kaitinghh"},"content":" * 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}*","lastModifiedDate":"2024-03-07"},{"lineNumber":17,"author":{"gitId":"kaitinghh"},"content":"","lastModifiedDate":"2024-03-07"},{"lineNumber":18,"author":{"gitId":"kaitinghh"},"content":"* **New Feature**: Added a history command that allows the user to navigate to previous commands using up/down keys.","lastModifiedDate":"2024-03-07"},{"lineNumber":19,"author":{"gitId":"kaitinghh"},"content":"","lastModifiedDate":"2024-03-07"},{"lineNumber":20,"author":{"gitId":"kaitinghh"},"content":"* **Code contributed**: [RepoSense link]()","lastModifiedDate":"2024-03-07"},{"lineNumber":21,"author":{"gitId":"kaitinghh"},"content":"","lastModifiedDate":"2024-03-07"},{"lineNumber":22,"author":{"gitId":"kaitinghh"},"content":"* **Project management**:","lastModifiedDate":"2024-03-07"},{"lineNumber":23,"author":{"gitId":"kaitinghh"},"content":" * Managed releases `v1.3` - `v1.5rc` (3 releases) on GitHub","lastModifiedDate":"2024-03-07"},{"lineNumber":24,"author":{"gitId":"kaitinghh"},"content":"","lastModifiedDate":"2024-03-07"},{"lineNumber":25,"author":{"gitId":"kaitinghh"},"content":"* **Enhancements to existing features**:","lastModifiedDate":"2024-03-07"},{"lineNumber":26,"author":{"gitId":"kaitinghh"},"content":" * Updated the GUI color scheme (Pull requests [\\#33](), [\\#34]())","lastModifiedDate":"2024-03-07"},{"lineNumber":27,"author":{"gitId":"kaitinghh"},"content":" * Wrote additional tests for existing features to increase coverage from 88% to 92% (Pull requests [\\#36](), [\\#38]())","lastModifiedDate":"2024-03-07"},{"lineNumber":28,"author":{"gitId":"kaitinghh"},"content":"","lastModifiedDate":"2024-03-07"},{"lineNumber":29,"author":{"gitId":"kaitinghh"},"content":"* **Documentation**:","lastModifiedDate":"2024-03-07"},{"lineNumber":30,"author":{"gitId":"kaitinghh"},"content":" * User Guide:","lastModifiedDate":"2024-03-07"},{"lineNumber":31,"author":{"gitId":"kaitinghh"},"content":" * Added documentation for the features `delete` and `find` [\\#72]()","lastModifiedDate":"2024-03-07"},{"lineNumber":32,"author":{"gitId":"kaitinghh"},"content":" * Did cosmetic tweaks to existing documentation of features `clear`, `exit`: [\\#74]()","lastModifiedDate":"2024-03-07"},{"lineNumber":33,"author":{"gitId":"kaitinghh"},"content":" * Developer Guide:","lastModifiedDate":"2024-03-07"},{"lineNumber":34,"author":{"gitId":"kaitinghh"},"content":" * Added implementation details of the `delete` feature.","lastModifiedDate":"2024-03-07"},{"lineNumber":35,"author":{"gitId":"kaitinghh"},"content":"","lastModifiedDate":"2024-03-07"},{"lineNumber":36,"author":{"gitId":"kaitinghh"},"content":"* **Community**:","lastModifiedDate":"2024-03-07"},{"lineNumber":37,"author":{"gitId":"kaitinghh"},"content":" * PRs reviewed (with non-trivial review comments): [\\#12](), [\\#32](), [\\#19](), [\\#42]()","lastModifiedDate":"2024-03-07"},{"lineNumber":38,"author":{"gitId":"kaitinghh"},"content":" * Contributed to forum discussions (examples: [1](), [2](), [3](), [4]())","lastModifiedDate":"2024-03-07"},{"lineNumber":39,"author":{"gitId":"kaitinghh"},"content":" * Reported bugs and suggestions for other teams in the class (examples: [1](), [2](), [3]())","lastModifiedDate":"2024-03-07"},{"lineNumber":40,"author":{"gitId":"kaitinghh"},"content":" * Some parts of the history feature I added was adopted by several other class mates ([1](), [2]())","lastModifiedDate":"2024-03-07"},{"lineNumber":41,"author":{"gitId":"kaitinghh"},"content":"","lastModifiedDate":"2024-03-07"},{"lineNumber":42,"author":{"gitId":"kaitinghh"},"content":"* **Tools**:","lastModifiedDate":"2024-03-07"},{"lineNumber":43,"author":{"gitId":"kaitinghh"},"content":" * Integrated a third party library (Natty) to the project ([\\#42]())","lastModifiedDate":"2024-03-07"},{"lineNumber":44,"author":{"gitId":"kaitinghh"},"content":" * Integrated a new Github plugin (CircleCI) to the team repo","lastModifiedDate":"2024-03-07"},{"lineNumber":45,"author":{"gitId":"kaitinghh"},"content":"","lastModifiedDate":"2024-03-07"},{"lineNumber":46,"author":{"gitId":"kaitinghh"},"content":"* _{you can add/remove categories in the list above}_","lastModifiedDate":"2024-03-07"}],"authorContributionMap":{"kaitinghh":46}},{"path":"docs/team/wangxinrong.md","fileType":"docs","lines":[{"lineNumber":1,"author":{"gitId":"wang-xinrong"},"content":"---","lastModifiedDate":"2024-03-07"},{"lineNumber":2,"author":{"gitId":"wang-xinrong"},"content":"layout: page","lastModifiedDate":"2024-03-07"},{"lineNumber":3,"author":{"gitId":"wang-xinrong"},"content":"title: Wang Xinrong\u0027s Project Portfolio Page","lastModifiedDate":"2024-03-07"},{"lineNumber":4,"author":{"gitId":"wang-xinrong"},"content":"---","lastModifiedDate":"2024-03-07"},{"lineNumber":5,"author":{"gitId":"wang-xinrong"},"content":"","lastModifiedDate":"2024-03-07"},{"lineNumber":6,"author":{"gitId":"wang-xinrong"},"content":"### Project: AddressBook Level 3","lastModifiedDate":"2024-03-07"},{"lineNumber":7,"author":{"gitId":"wang-xinrong"},"content":"","lastModifiedDate":"2024-03-07"},{"lineNumber":8,"author":{"gitId":"wang-xinrong"},"content":"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.","lastModifiedDate":"2024-03-07"},{"lineNumber":9,"author":{"gitId":"wang-xinrong"},"content":"","lastModifiedDate":"2024-03-07"},{"lineNumber":10,"author":{"gitId":"wang-xinrong"},"content":"Given below are my contributions to the project.","lastModifiedDate":"2024-03-07"},{"lineNumber":11,"author":{"gitId":"wang-xinrong"},"content":"","lastModifiedDate":"2024-03-07"},{"lineNumber":12,"author":{"gitId":"wang-xinrong"},"content":"* **New Feature**: Added the ability to undo/redo previous commands.","lastModifiedDate":"2024-03-07"},{"lineNumber":13,"author":{"gitId":"wang-xinrong"},"content":" * 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.","lastModifiedDate":"2024-03-07"},{"lineNumber":14,"author":{"gitId":"wang-xinrong"},"content":" * 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.","lastModifiedDate":"2024-03-07"},{"lineNumber":15,"author":{"gitId":"wang-xinrong"},"content":" * 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.","lastModifiedDate":"2024-03-07"},{"lineNumber":16,"author":{"gitId":"wang-xinrong"},"content":" * 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}*","lastModifiedDate":"2024-03-07"},{"lineNumber":17,"author":{"gitId":"wang-xinrong"},"content":"","lastModifiedDate":"2024-03-07"},{"lineNumber":18,"author":{"gitId":"wang-xinrong"},"content":"* **New Feature**: Added a history command that allows the user to navigate to previous commands using up/down keys.","lastModifiedDate":"2024-03-07"},{"lineNumber":19,"author":{"gitId":"wang-xinrong"},"content":"","lastModifiedDate":"2024-03-07"},{"lineNumber":20,"author":{"gitId":"wang-xinrong"},"content":"* **Code contributed**: [RepoSense link]()","lastModifiedDate":"2024-03-07"},{"lineNumber":21,"author":{"gitId":"wang-xinrong"},"content":"","lastModifiedDate":"2024-03-07"},{"lineNumber":22,"author":{"gitId":"wang-xinrong"},"content":"* **Project management**:","lastModifiedDate":"2024-03-07"},{"lineNumber":23,"author":{"gitId":"wang-xinrong"},"content":" * Managed releases `v1.3` - `v1.5rc` (3 releases) on GitHub","lastModifiedDate":"2024-03-07"},{"lineNumber":24,"author":{"gitId":"wang-xinrong"},"content":"","lastModifiedDate":"2024-03-07"},{"lineNumber":25,"author":{"gitId":"wang-xinrong"},"content":"* **Enhancements to existing features**:","lastModifiedDate":"2024-03-07"},{"lineNumber":26,"author":{"gitId":"wang-xinrong"},"content":" * Updated the GUI color scheme (Pull requests [\\#33](), [\\#34]())","lastModifiedDate":"2024-03-07"},{"lineNumber":27,"author":{"gitId":"wang-xinrong"},"content":" * Wrote additional tests for existing features to increase coverage from 88% to 92% (Pull requests [\\#36](), [\\#38]())","lastModifiedDate":"2024-03-07"},{"lineNumber":28,"author":{"gitId":"wang-xinrong"},"content":"","lastModifiedDate":"2024-03-07"},{"lineNumber":29,"author":{"gitId":"wang-xinrong"},"content":"* **Documentation**:","lastModifiedDate":"2024-03-07"},{"lineNumber":30,"author":{"gitId":"wang-xinrong"},"content":" * User Guide:","lastModifiedDate":"2024-03-07"},{"lineNumber":31,"author":{"gitId":"wang-xinrong"},"content":" * Added documentation for the features `delete` and `find` [\\#72]()","lastModifiedDate":"2024-03-07"},{"lineNumber":32,"author":{"gitId":"wang-xinrong"},"content":" * Did cosmetic tweaks to existing documentation of features `clear`, `exit`: [\\#74]()","lastModifiedDate":"2024-03-07"},{"lineNumber":33,"author":{"gitId":"wang-xinrong"},"content":" * Developer Guide:","lastModifiedDate":"2024-03-07"},{"lineNumber":34,"author":{"gitId":"wang-xinrong"},"content":" * Added implementation details of the `delete` feature.","lastModifiedDate":"2024-03-07"},{"lineNumber":35,"author":{"gitId":"wang-xinrong"},"content":"","lastModifiedDate":"2024-03-07"},{"lineNumber":36,"author":{"gitId":"wang-xinrong"},"content":"* **Community**:","lastModifiedDate":"2024-03-07"},{"lineNumber":37,"author":{"gitId":"wang-xinrong"},"content":" * PRs reviewed (with non-trivial review comments): [\\#12](), [\\#32](), [\\#19](), [\\#42]()","lastModifiedDate":"2024-03-07"},{"lineNumber":38,"author":{"gitId":"wang-xinrong"},"content":" * Contributed to forum discussions (examples: [1](), [2](), [3](), [4]())","lastModifiedDate":"2024-03-07"},{"lineNumber":39,"author":{"gitId":"wang-xinrong"},"content":" * Reported bugs and suggestions for other teams in the class (examples: [1](), [2](), [3]())","lastModifiedDate":"2024-03-07"},{"lineNumber":40,"author":{"gitId":"wang-xinrong"},"content":" * Some parts of the history feature I added was adopted by several other class mates ([1](), [2]())","lastModifiedDate":"2024-03-07"},{"lineNumber":41,"author":{"gitId":"wang-xinrong"},"content":"","lastModifiedDate":"2024-03-07"},{"lineNumber":42,"author":{"gitId":"wang-xinrong"},"content":"* **Tools**:","lastModifiedDate":"2024-03-07"},{"lineNumber":43,"author":{"gitId":"wang-xinrong"},"content":" * Integrated a third party library (Natty) to the project ([\\#42]())","lastModifiedDate":"2024-03-07"},{"lineNumber":44,"author":{"gitId":"wang-xinrong"},"content":" * Integrated a new Github plugin (CircleCI) to the team repo","lastModifiedDate":"2024-03-07"},{"lineNumber":45,"author":{"gitId":"wang-xinrong"},"content":"","lastModifiedDate":"2024-03-07"},{"lineNumber":46,"author":{"gitId":"wang-xinrong"},"content":"* _{you can add/remove categories in the list above}_","lastModifiedDate":"2024-03-07"}],"authorContributionMap":{"wang-xinrong":46}},{"path":"docs/team/wongkj12.md","fileType":"docs","lines":[{"lineNumber":1,"author":{"gitId":"-"},"content":"---","lastModifiedDate":"2020-05-23"},{"lineNumber":2,"author":{"gitId":"-"},"content":"layout: page","lastModifiedDate":"2020-05-23"},{"lineNumber":3,"author":{"gitId":"wongkj12"},"content":"title: Kai Jie\u0027s Project Portfolio Page","lastModifiedDate":"2024-03-07"},{"lineNumber":4,"author":{"gitId":"-"},"content":"---","lastModifiedDate":"2020-05-23"},{"lineNumber":5,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":6,"author":{"gitId":"-"},"content":"### Project: AddressBook Level 3","lastModifiedDate":"2021-07-30"},{"lineNumber":7,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":8,"author":{"gitId":"-"},"content":"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.","lastModifiedDate":"2020-05-23"},{"lineNumber":9,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":10,"author":{"gitId":"-"},"content":"Given below are my contributions to the project.","lastModifiedDate":"2020-05-23"},{"lineNumber":11,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":12,"author":{"gitId":"-"},"content":"* **New Feature**: Added the ability to undo/redo previous commands.","lastModifiedDate":"2020-05-23"},{"lineNumber":13,"author":{"gitId":"-"},"content":" * 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.","lastModifiedDate":"2020-05-23"},{"lineNumber":14,"author":{"gitId":"-"},"content":" * 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.","lastModifiedDate":"2020-05-23"},{"lineNumber":15,"author":{"gitId":"-"},"content":" * 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.","lastModifiedDate":"2020-05-23"},{"lineNumber":16,"author":{"gitId":"-"},"content":" * 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}*","lastModifiedDate":"2020-05-23"},{"lineNumber":17,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":18,"author":{"gitId":"-"},"content":"* **New Feature**: Added a history command that allows the user to navigate to previous commands using up/down keys.","lastModifiedDate":"2020-05-23"},{"lineNumber":19,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":20,"author":{"gitId":"-"},"content":"* **Code contributed**: [RepoSense link]()","lastModifiedDate":"2020-05-23"},{"lineNumber":21,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":22,"author":{"gitId":"-"},"content":"* **Project management**:","lastModifiedDate":"2020-05-23"},{"lineNumber":23,"author":{"gitId":"-"},"content":" * Managed releases `v1.3` - `v1.5rc` (3 releases) on GitHub","lastModifiedDate":"2020-05-23"},{"lineNumber":24,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":25,"author":{"gitId":"-"},"content":"* **Enhancements to existing features**:","lastModifiedDate":"2020-05-23"},{"lineNumber":26,"author":{"gitId":"-"},"content":" * Updated the GUI color scheme (Pull requests [\\#33](), [\\#34]())","lastModifiedDate":"2020-05-23"},{"lineNumber":27,"author":{"gitId":"-"},"content":" * Wrote additional tests for existing features to increase coverage from 88% to 92% (Pull requests [\\#36](), [\\#38]())","lastModifiedDate":"2020-05-23"},{"lineNumber":28,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":29,"author":{"gitId":"-"},"content":"* **Documentation**:","lastModifiedDate":"2020-05-23"},{"lineNumber":30,"author":{"gitId":"-"},"content":" * User Guide:","lastModifiedDate":"2020-05-23"},{"lineNumber":31,"author":{"gitId":"-"},"content":" * Added documentation for the features `delete` and `find` [\\#72]()","lastModifiedDate":"2020-05-23"},{"lineNumber":32,"author":{"gitId":"-"},"content":" * Did cosmetic tweaks to existing documentation of features `clear`, `exit`: [\\#74]()","lastModifiedDate":"2020-05-23"},{"lineNumber":33,"author":{"gitId":"-"},"content":" * Developer Guide:","lastModifiedDate":"2020-05-23"},{"lineNumber":34,"author":{"gitId":"-"},"content":" * Added implementation details of the `delete` feature.","lastModifiedDate":"2020-05-23"},{"lineNumber":35,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":36,"author":{"gitId":"-"},"content":"* **Community**:","lastModifiedDate":"2020-05-23"},{"lineNumber":37,"author":{"gitId":"-"},"content":" * PRs reviewed (with non-trivial review comments): [\\#12](), [\\#32](), [\\#19](), [\\#42]()","lastModifiedDate":"2020-05-23"},{"lineNumber":38,"author":{"gitId":"-"},"content":" * Contributed to forum discussions (examples: [1](), [2](), [3](), [4]())","lastModifiedDate":"2020-05-23"},{"lineNumber":39,"author":{"gitId":"-"},"content":" * Reported bugs and suggestions for other teams in the class (examples: [1](), [2](), [3]())","lastModifiedDate":"2020-05-23"},{"lineNumber":40,"author":{"gitId":"-"},"content":" * Some parts of the history feature I added was adopted by several other class mates ([1](), [2]())","lastModifiedDate":"2020-05-23"},{"lineNumber":41,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":42,"author":{"gitId":"-"},"content":"* **Tools**:","lastModifiedDate":"2020-05-23"},{"lineNumber":43,"author":{"gitId":"-"},"content":" * Integrated a third party library (Natty) to the project ([\\#42]())","lastModifiedDate":"2020-05-23"},{"lineNumber":44,"author":{"gitId":"-"},"content":" * Integrated a new Github plugin (CircleCI) to the team repo","lastModifiedDate":"2020-05-23"},{"lineNumber":45,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":46,"author":{"gitId":"-"},"content":"* _{you can add/remove categories in the list above}_","lastModifiedDate":"2020-05-23"}],"authorContributionMap":{"wongkj12":1,"-":45}}] diff --git a/AY2324S2-CS2103T-T11-4_tp_master/commits.json b/AY2324S2-CS2103T-T11-4_tp_master/commits.json index f08c00fd..7afa2c7c 100644 --- a/AY2324S2-CS2103T-T11-4_tp_master/commits.json +++ b/AY2324S2-CS2103T-T11-4_tp_master/commits.json @@ -1 +1 @@ -{"authorDailyContributionsMap":{"yyccbb":[{"date":"2024-03-07","commitResults":[{"hash":"854408b23784302201d826c0bbd298416ee6c193","isMergeCommit":false,"messageTitle":"Update AboutUs page","messageBody":"","fileTypesAndContributionMap":{"docs":{"insertions":9,"deletions":9}}},{"hash":"da02b5d5a3b691cb987f5de5556acf7100daec5a","isMergeCommit":true,"messageTitle":"Merge pull request #9 from yyccbb/master","messageBody":"Update AboutUs page","fileTypesAndContributionMap":{}},{"hash":"8c02784cc2708e4ada8f367b13cb216a9fec4fbc","isMergeCommit":false,"messageTitle":"Update README.md","messageBody":"","fileTypesAndContributionMap":{"docs":{"insertions":7,"deletions":10}}},{"hash":"e23b77addeab0009c5f585737c306ed51d862067","isMergeCommit":true,"messageTitle":"Merge branch \u0027AY2324S2-CS2103T-T11-4:master\u0027 into master","messageBody":"","fileTypesAndContributionMap":{}},{"hash":"34affdd961128ef47b5ac050e01f0c3bc1a3c685","isMergeCommit":true,"messageTitle":"Merge branch \u0027AY2324S2-CS2103T-T11-4:master\u0027 into master","messageBody":"","fileTypesAndContributionMap":{}},{"hash":"fbceaaa3ad70d134bac51f3b5758b4011634e2c3","isMergeCommit":false,"messageTitle":"Update README.md","messageBody":"","fileTypesAndContributionMap":{"docs":{"insertions":3,"deletions":2}}}]}],"wongkj12":[{"date":"2024-03-07","commitResults":[{"hash":"aa257a82b2e4d9977eba793e70c990a85abd0c52","isMergeCommit":false,"messageTitle":"Update AboutUs.md","messageBody":"","fileTypesAndContributionMap":{"docs":{"insertions":3,"deletions":3}}},{"hash":"054c052b0501b7a3c4316fa5e2ebaacb90c18d3e","isMergeCommit":false,"messageTitle":"Update and rename johndoe.md to wongkj12.md","messageBody":"","fileTypesAndContributionMap":{"docs":{"insertions":1,"deletions":1}}},{"hash":"99221c1c361b2eada630cea94c3ca4d47f3a368c","isMergeCommit":false,"messageTitle":"Update AboutUs.md","messageBody":"","fileTypesAndContributionMap":{"docs":{"insertions":1,"deletions":1}}},{"hash":"f7c0a4c34a17b9decf39a2b3dca4de2fb2d5cea4","isMergeCommit":true,"messageTitle":"Merge branch \u0027master\u0027 into master","messageBody":"","fileTypesAndContributionMap":{}},{"hash":"71f6fbce43f059534198014de304538cd8b60830","isMergeCommit":true,"messageTitle":"Merge pull request #8 from wang-xinrong/master","messageBody":"Update AboutUs.md","fileTypesAndContributionMap":{}},{"hash":"8d25f2f4f0a87faf72dcfeac7bae12bdb3c08dae","isMergeCommit":false,"messageTitle":"Update NFR in DeveloperGuide.md","messageBody":"","fileTypesAndContributionMap":{"docs":{"insertions":11,"deletions":5}}},{"hash":"783b4ce87b8675167c4db083d9a54bfdac78e9a1","isMergeCommit":true,"messageTitle":"Merge pull request #14 from yongkotaro/master","messageBody":"Update DeveloperGuide.md","fileTypesAndContributionMap":{}}]}],"yongkotaro":[{"date":"2024-03-07","commitResults":[{"hash":"d17e9c3af91e1facf670e7158338b6f9569ce95e","isMergeCommit":false,"messageTitle":"Update AboutUs page","messageBody":"","fileTypesAndContributionMap":{"docs":{"insertions":4,"deletions":5}}},{"hash":"c9924fd97b9cb42e2e03b084932adb760067ac3f","isMergeCommit":false,"messageTitle":"Update DeveloperGuide","messageBody":"Update glossary to explain key terms used in our app.\n","fileTypesAndContributionMap":{"docs":{"insertions":5,"deletions":1}}},{"hash":"f575f22e848ee7eda850811fb97e33ff8d46a4ed","isMergeCommit":true,"messageTitle":"Merge pull request #15 from wongkj12/master","messageBody":"Update NFR in DeveloperGuide.md","fileTypesAndContributionMap":{}},{"hash":"f3c0efbc659dc016e2253ba0a331a9cc82b8df28","isMergeCommit":true,"messageTitle":"Merge pull request #16 from yyccbb/master","messageBody":"Update README.md","fileTypesAndContributionMap":{}}]}],"kaitinghh":[{"date":"2024-03-07","commitResults":[{"hash":"2c5acdad085d734bf052275bb97bdea33816edae","isMergeCommit":false,"messageTitle":"Update AboutUs page","messageBody":"","fileTypesAndContributionMap":{"docs":{"insertions":4,"deletions":4}}},{"hash":"1b1641ace2f7955c7604822961f30e17ddc489d5","isMergeCommit":false,"messageTitle":"Update AboutUs page","messageBody":"","fileTypesAndContributionMap":{"docs":{"insertions":56,"deletions":10}}},{"hash":"90ceba68fa947b56b521b73e753251dc8586db0f","isMergeCommit":true,"messageTitle":"Merge branch \u0027master\u0027 into branch-AboutUs","messageBody":"","fileTypesAndContributionMap":{}},{"hash":"5ecda7e4e8139a5da54106d8b2961de0760442e8","isMergeCommit":true,"messageTitle":"Merge pull request #7 from kaitinghh/branch-AboutUs","messageBody":"Update AboutUs Page","fileTypesAndContributionMap":{}},{"hash":"ff7e41ab2897882d71d701b911db522fe03087d2","isMergeCommit":false,"messageTitle":"Update developer guide","messageBody":"","fileTypesAndContributionMap":{"docs":{"insertions":34,"deletions":10}}},{"hash":"18f6e4683f9c8c783861a0635cedb6ba00977ec7","isMergeCommit":true,"messageTitle":"Merge pull request #18 from kaitinghh/branch-DeveloperGuide","messageBody":"Update developer guide","fileTypesAndContributionMap":{}}]}],"wang-xinrong":[{"date":"2024-03-07","commitResults":[{"hash":"70cc0a3c7f837f7ee8da77816970f4fa80c45230","isMergeCommit":false,"messageTitle":"Update AboutUs.md","messageBody":"","fileTypesAndContributionMap":{"docs":{"insertions":53,"deletions":7}}},{"hash":"ebb592fb4a9331ed41bc2316b2cec15507a0b741","isMergeCommit":false,"messageTitle":"Add EOF line","messageBody":"","fileTypesAndContributionMap":{"docs":{"insertions":3,"deletions":3}}},{"hash":"05bf798808882ccd3ed917bc38550a099e10b10d","isMergeCommit":true,"messageTitle":"Merge branch \u0027master\u0027 into master","messageBody":"","fileTypesAndContributionMap":{}},{"hash":"18065b5d8aea24073d320313f1feca20cc223c2c","isMergeCommit":true,"messageTitle":"Merge pull request #10 from wongkj12/master","messageBody":"Update AboutUs wongkj12","fileTypesAndContributionMap":{}},{"hash":"9ac036eb387fea68dd1aee63df773a773a8dd571","isMergeCommit":false,"messageTitle":"Update GitHub Link in AboutUs.md","messageBody":"","fileTypesAndContributionMap":{"docs":{"insertions":1,"deletions":1}}},{"hash":"4b6a66c0bc07c98bffcc47c819fd7f2577be69ce","isMergeCommit":true,"messageTitle":"Merge branch \u0027master\u0027 into master","messageBody":"","fileTypesAndContributionMap":{}},{"hash":"2165e1d01f46a053b4c964e6db4ca37ef63fbe35","isMergeCommit":true,"messageTitle":"Merge pull request #11 from yongkotaro/master","messageBody":"Update AboutUs.md","fileTypesAndContributionMap":{}},{"hash":"0132b31338f01137d27c496f40e2323a491b6f31","isMergeCommit":true,"messageTitle":"Merge branch \u0027master\u0027 into master","messageBody":"","fileTypesAndContributionMap":{}},{"hash":"3663250423a4c5d83990cb69c78a237815ce4798","isMergeCommit":false,"messageTitle":"Update DG use cases","messageBody":"","fileTypesAndContributionMap":{"docs":{"insertions":53,"deletions":4}}},{"hash":"ea17de3d989b684b414282c7db25babd2e87b397","isMergeCommit":true,"messageTitle":"Merge pull request #17 from wang-xinrong/master","messageBody":"Update DG use cases","tags":["v1.1"],"fileTypesAndContributionMap":{}}]}]},"authorFileTypeContributionMap":{"yyccbb":{"docs":13,"functional-code":0,"test-code":0},"wongkj12":{"docs":15,"functional-code":0,"test-code":0},"yongkotaro":{"docs":5,"functional-code":0,"test-code":0},"kaitinghh":{"docs":85,"functional-code":0,"test-code":0},"wang-xinrong":{"docs":106,"functional-code":0,"test-code":0}},"authorContributionVariance":{"yyccbb":106.122444,"wongkj12":44.83673,"yongkotaro":14.92347,"kaitinghh":923.53064,"wang-xinrong":1036.352},"authorDisplayNameMap":{"yyccbb":"CS2103T-T11-4 YU C..ENBO","wongkj12":"CS2103T-T11-4 WONG.. JIE","yongkotaro":"CS2103T-T11-4 YONG..TARO","kaitinghh":"CS2103T-T11-4 HO K..TING","wang-xinrong":"CS2103T-T11-4 WANG..RONG"}} +{"authorDailyContributionsMap":{"yyccbb":[{"date":"2024-03-07","commitResults":[{"hash":"854408b23784302201d826c0bbd298416ee6c193","isMergeCommit":false,"messageTitle":"Update AboutUs page","messageBody":"","fileTypesAndContributionMap":{"docs":{"insertions":9,"deletions":9}}},{"hash":"da02b5d5a3b691cb987f5de5556acf7100daec5a","isMergeCommit":true,"messageTitle":"Merge pull request #9 from yyccbb/master","messageBody":"Update AboutUs page","fileTypesAndContributionMap":{}},{"hash":"8c02784cc2708e4ada8f367b13cb216a9fec4fbc","isMergeCommit":false,"messageTitle":"Update README.md","messageBody":"","fileTypesAndContributionMap":{"docs":{"insertions":7,"deletions":10}}},{"hash":"e23b77addeab0009c5f585737c306ed51d862067","isMergeCommit":true,"messageTitle":"Merge branch \u0027AY2324S2-CS2103T-T11-4:master\u0027 into master","messageBody":"","fileTypesAndContributionMap":{}},{"hash":"34affdd961128ef47b5ac050e01f0c3bc1a3c685","isMergeCommit":true,"messageTitle":"Merge branch \u0027AY2324S2-CS2103T-T11-4:master\u0027 into master","messageBody":"","fileTypesAndContributionMap":{}},{"hash":"fbceaaa3ad70d134bac51f3b5758b4011634e2c3","isMergeCommit":false,"messageTitle":"Update README.md","messageBody":"","fileTypesAndContributionMap":{"docs":{"insertions":3,"deletions":2}}}]},{"date":"2024-03-08","commitResults":[{"hash":"c7032dafe0252e8ca92713c05d4957c2f8cb95a5","isMergeCommit":true,"messageTitle":"Merge pull request #20 from kaitinghh/master","messageBody":"Edit profile file names","fileTypesAndContributionMap":{}}]}],"wongkj12":[{"date":"2024-03-07","commitResults":[{"hash":"aa257a82b2e4d9977eba793e70c990a85abd0c52","isMergeCommit":false,"messageTitle":"Update AboutUs.md","messageBody":"","fileTypesAndContributionMap":{"docs":{"insertions":3,"deletions":3}}},{"hash":"054c052b0501b7a3c4316fa5e2ebaacb90c18d3e","isMergeCommit":false,"messageTitle":"Update and rename johndoe.md to wongkj12.md","messageBody":"","fileTypesAndContributionMap":{"docs":{"insertions":1,"deletions":1}}},{"hash":"99221c1c361b2eada630cea94c3ca4d47f3a368c","isMergeCommit":false,"messageTitle":"Update AboutUs.md","messageBody":"","fileTypesAndContributionMap":{"docs":{"insertions":1,"deletions":1}}},{"hash":"f7c0a4c34a17b9decf39a2b3dca4de2fb2d5cea4","isMergeCommit":true,"messageTitle":"Merge branch \u0027master\u0027 into master","messageBody":"","fileTypesAndContributionMap":{}},{"hash":"71f6fbce43f059534198014de304538cd8b60830","isMergeCommit":true,"messageTitle":"Merge pull request #8 from wang-xinrong/master","messageBody":"Update AboutUs.md","fileTypesAndContributionMap":{}},{"hash":"8d25f2f4f0a87faf72dcfeac7bae12bdb3c08dae","isMergeCommit":false,"messageTitle":"Update NFR in DeveloperGuide.md","messageBody":"","fileTypesAndContributionMap":{"docs":{"insertions":11,"deletions":5}}},{"hash":"783b4ce87b8675167c4db083d9a54bfdac78e9a1","isMergeCommit":true,"messageTitle":"Merge pull request #14 from yongkotaro/master","messageBody":"Update DeveloperGuide.md","fileTypesAndContributionMap":{}}]}],"yongkotaro":[{"date":"2024-03-07","commitResults":[{"hash":"d17e9c3af91e1facf670e7158338b6f9569ce95e","isMergeCommit":false,"messageTitle":"Update AboutUs page","messageBody":"","fileTypesAndContributionMap":{"docs":{"insertions":4,"deletions":5}}},{"hash":"c9924fd97b9cb42e2e03b084932adb760067ac3f","isMergeCommit":false,"messageTitle":"Update DeveloperGuide","messageBody":"Update glossary to explain key terms used in our app.\n","fileTypesAndContributionMap":{"docs":{"insertions":5,"deletions":1}}},{"hash":"f575f22e848ee7eda850811fb97e33ff8d46a4ed","isMergeCommit":true,"messageTitle":"Merge pull request #15 from wongkj12/master","messageBody":"Update NFR in DeveloperGuide.md","fileTypesAndContributionMap":{}},{"hash":"f3c0efbc659dc016e2253ba0a331a9cc82b8df28","isMergeCommit":true,"messageTitle":"Merge pull request #16 from yyccbb/master","messageBody":"Update README.md","fileTypesAndContributionMap":{}}]}],"kaitinghh":[{"date":"2024-03-07","commitResults":[{"hash":"2c5acdad085d734bf052275bb97bdea33816edae","isMergeCommit":false,"messageTitle":"Update AboutUs page","messageBody":"","fileTypesAndContributionMap":{"docs":{"insertions":4,"deletions":4}}},{"hash":"1b1641ace2f7955c7604822961f30e17ddc489d5","isMergeCommit":false,"messageTitle":"Update AboutUs page","messageBody":"","fileTypesAndContributionMap":{"docs":{"insertions":56,"deletions":10}}},{"hash":"90ceba68fa947b56b521b73e753251dc8586db0f","isMergeCommit":true,"messageTitle":"Merge branch \u0027master\u0027 into branch-AboutUs","messageBody":"","fileTypesAndContributionMap":{}},{"hash":"5ecda7e4e8139a5da54106d8b2961de0760442e8","isMergeCommit":true,"messageTitle":"Merge pull request #7 from kaitinghh/branch-AboutUs","messageBody":"Update AboutUs Page","fileTypesAndContributionMap":{}},{"hash":"ff7e41ab2897882d71d701b911db522fe03087d2","isMergeCommit":false,"messageTitle":"Update developer guide","messageBody":"","fileTypesAndContributionMap":{"docs":{"insertions":34,"deletions":10}}},{"hash":"18f6e4683f9c8c783861a0635cedb6ba00977ec7","isMergeCommit":true,"messageTitle":"Merge pull request #18 from kaitinghh/branch-DeveloperGuide","messageBody":"Update developer guide","fileTypesAndContributionMap":{}}]},{"date":"2024-03-08","commitResults":[{"hash":"8b2a2eea9bb3aa4fb897397dc4c631838a957447","isMergeCommit":false,"messageTitle":"Edit profile file names","messageBody":"","fileTypesAndContributionMap":{"docs":{"insertions":2,"deletions":2}}}]}],"wang-xinrong":[{"date":"2024-03-07","commitResults":[{"hash":"70cc0a3c7f837f7ee8da77816970f4fa80c45230","isMergeCommit":false,"messageTitle":"Update AboutUs.md","messageBody":"","fileTypesAndContributionMap":{"docs":{"insertions":53,"deletions":7}}},{"hash":"ebb592fb4a9331ed41bc2316b2cec15507a0b741","isMergeCommit":false,"messageTitle":"Add EOF line","messageBody":"","fileTypesAndContributionMap":{"docs":{"insertions":3,"deletions":3}}},{"hash":"05bf798808882ccd3ed917bc38550a099e10b10d","isMergeCommit":true,"messageTitle":"Merge branch \u0027master\u0027 into master","messageBody":"","fileTypesAndContributionMap":{}},{"hash":"18065b5d8aea24073d320313f1feca20cc223c2c","isMergeCommit":true,"messageTitle":"Merge pull request #10 from wongkj12/master","messageBody":"Update AboutUs wongkj12","fileTypesAndContributionMap":{}},{"hash":"9ac036eb387fea68dd1aee63df773a773a8dd571","isMergeCommit":false,"messageTitle":"Update GitHub Link in AboutUs.md","messageBody":"","fileTypesAndContributionMap":{"docs":{"insertions":1,"deletions":1}}},{"hash":"4b6a66c0bc07c98bffcc47c819fd7f2577be69ce","isMergeCommit":true,"messageTitle":"Merge branch \u0027master\u0027 into master","messageBody":"","fileTypesAndContributionMap":{}},{"hash":"2165e1d01f46a053b4c964e6db4ca37ef63fbe35","isMergeCommit":true,"messageTitle":"Merge pull request #11 from yongkotaro/master","messageBody":"Update AboutUs.md","fileTypesAndContributionMap":{}},{"hash":"0132b31338f01137d27c496f40e2323a491b6f31","isMergeCommit":true,"messageTitle":"Merge branch \u0027master\u0027 into master","messageBody":"","fileTypesAndContributionMap":{}},{"hash":"3663250423a4c5d83990cb69c78a237815ce4798","isMergeCommit":false,"messageTitle":"Update DG use cases","messageBody":"","fileTypesAndContributionMap":{"docs":{"insertions":53,"deletions":4}}},{"hash":"ea17de3d989b684b414282c7db25babd2e87b397","isMergeCommit":true,"messageTitle":"Merge pull request #17 from wang-xinrong/master","messageBody":"Update DG use cases","tags":["v1.1"],"fileTypesAndContributionMap":{}}]}]},"authorFileTypeContributionMap":{"yyccbb":{"docs":13,"functional-code":0,"test-code":0},"wongkj12":{"docs":15,"functional-code":0,"test-code":0},"yongkotaro":{"docs":5,"functional-code":0,"test-code":0},"kaitinghh":{"docs":85,"functional-code":0,"test-code":0},"wang-xinrong":{"docs":106,"functional-code":0,"test-code":0}},"authorContributionVariance":{"yyccbb":99.55555,"wongkj12":42.06222,"yongkotaro":14.0,"kaitinghh":863.18225,"wang-xinrong":972.2222},"authorDisplayNameMap":{"yyccbb":"CS2103T-T11-4 YU C..ENBO","wongkj12":"CS2103T-T11-4 WONG.. JIE","yongkotaro":"CS2103T-T11-4 YONG..TARO","kaitinghh":"CS2103T-T11-4 HO K..TING","wang-xinrong":"CS2103T-T11-4 WANG..RONG"}} diff --git a/AY2324S2-CS2103T-T12-1_tp_master/authorship.json b/AY2324S2-CS2103T-T12-1_tp_master/authorship.json index f6619594..18f9b71b 100644 --- a/AY2324S2-CS2103T-T12-1_tp_master/authorship.json +++ b/AY2324S2-CS2103T-T12-1_tp_master/authorship.json @@ -1 +1 @@ -[{"path":"README.md","fileType":"docs","lines":[{"lineNumber":1,"author":{"gitId":"tanguoyang"},"content":"[![CI Status](https://github.com/AY2324S2-CS2103T-T12-1/tp/workflows/Java%20CI/badge.svg)](https://github.com/se-edu/addressbook-level3/actions)","lastModifiedDate":"2024-03-07"},{"lineNumber":2,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":3,"author":{"gitId":"-"},"content":"![Ui](docs/images/Ui.png)","lastModifiedDate":"2020-05-23"},{"lineNumber":4,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":5,"author":{"gitId":"tanguoyang"},"content":"","lastModifiedDate":"2024-03-07"},{"lineNumber":6,"author":{"gitId":"tanguoyang"},"content":"","lastModifiedDate":"2024-03-07"},{"lineNumber":7,"author":{"gitId":"tanguoyang"},"content":"**Product Name**","lastModifiedDate":"2024-03-07"},{"lineNumber":8,"author":{"gitId":"tanguoyang"},"content":"\u003eCodeConnect","lastModifiedDate":"2024-03-07"},{"lineNumber":9,"author":{"gitId":"tanguoyang"},"content":"","lastModifiedDate":"2024-03-07"},{"lineNumber":10,"author":{"gitId":"tanguoyang"},"content":"**Target User**","lastModifiedDate":"2024-03-07"},{"lineNumber":11,"author":{"gitId":"tanguoyang"},"content":"\u003eStudent Developer","lastModifiedDate":"2024-03-07"},{"lineNumber":12,"author":{"gitId":"tanguoyang"},"content":"","lastModifiedDate":"2024-03-07"},{"lineNumber":13,"author":{"gitId":"tanguoyang"},"content":"**Value Proposition**","lastModifiedDate":"2024-03-07"},{"lineNumber":14,"author":{"gitId":"tanguoyang"},"content":"\u003eCodeConnect aims to let student developers keep track of and reach out easily to other student developers with relevant skills for collaboration opportunities or recommendations.","lastModifiedDate":"2024-03-07"},{"lineNumber":15,"author":{"gitId":"tanguoyang"},"content":"","lastModifiedDate":"2024-03-07"},{"lineNumber":16,"author":{"gitId":"tanguoyang"},"content":"Project notes (internal): [see here](https://docs.google.com/document/d/1wDRApxjKgLv_gZx7Fe1u0XLsa73Taj0THSegizHslss/edit#heading\u003dh.gue37j8ig519)","lastModifiedDate":"2024-03-07"},{"lineNumber":17,"author":{"gitId":"tanguoyang"},"content":"","lastModifiedDate":"2024-03-07"},{"lineNumber":18,"author":{"gitId":"tanguoyang"},"content":"This project is based on the AddressBook-Level3 project created by the [SE-EDU initiative](https://se-education.org).","lastModifiedDate":"2024-03-07"},{"lineNumber":19,"author":{"gitId":"tanguoyang"},"content":"","lastModifiedDate":"2024-03-07"}],"authorContributionMap":{"tanguoyang":16,"-":3}},{"path":"docs/AboutUs.md","fileType":"docs","lines":[{"lineNumber":1,"author":{"gitId":"-"},"content":"---","lastModifiedDate":"2020-05-23"},{"lineNumber":2,"author":{"gitId":"-"},"content":" layout: default.md","lastModifiedDate":"2023-09-12"},{"lineNumber":3,"author":{"gitId":"-"},"content":" title: \"About Us\"","lastModifiedDate":"2023-09-12"},{"lineNumber":4,"author":{"gitId":"-"},"content":"---","lastModifiedDate":"2020-05-23"},{"lineNumber":5,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":6,"author":{"gitId":"-"},"content":"# About Us","lastModifiedDate":"2023-09-12"},{"lineNumber":7,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2023-09-12"},{"lineNumber":8,"author":{"gitId":"-"},"content":"We are a team based in the [School of Computing, National University of Singapore](http://www.comp.nus.edu.sg).","lastModifiedDate":"2020-05-23"},{"lineNumber":9,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":10,"author":{"gitId":"-"},"content":"You can reach us at the email `seer[at]comp.nus.edu.sg`","lastModifiedDate":"2020-06-17"},{"lineNumber":11,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-06-17"},{"lineNumber":12,"author":{"gitId":"-"},"content":"## Project team","lastModifiedDate":"2020-06-07"},{"lineNumber":13,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":14,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":15,"author":{"gitId":"tanguoyang"},"content":"### Guo Yang","lastModifiedDate":"2024-03-07"},{"lineNumber":16,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":17,"author":{"gitId":"tanguoyang"},"content":"\u003cimg src\u003d\"images/tanguoyang.png\" width\u003d\"200px\"\u003e","lastModifiedDate":"2024-03-07"},{"lineNumber":18,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":19,"author":{"gitId":"tanguoyang"},"content":"[[github](http://github.com/tanguoyang)]","lastModifiedDate":"2024-03-07"},{"lineNumber":20,"author":{"gitId":"-"},"content":" ","lastModifiedDate":"2020-05-23"},{"lineNumber":21,"author":{"gitId":"tanguoyang"},"content":"* Role: Team Lead","lastModifiedDate":"2024-03-07"},{"lineNumber":22,"author":{"gitId":"tanguoyang"},"content":"* Responsibilities: Tracking deliverables","lastModifiedDate":"2024-03-07"},{"lineNumber":23,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":24,"author":{"gitId":"tanguoyang"},"content":"### Song Yee","lastModifiedDate":"2024-03-07"},{"lineNumber":25,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":26,"author":{"gitId":"tanguoyang"},"content":"\u003cimg src\u003d\"images/angsongyee.png\" width\u003d\"200px\"\u003e","lastModifiedDate":"2024-03-07"},{"lineNumber":27,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":28,"author":{"gitId":"tanguoyang"},"content":"[[github](http://github.com/angsongyee)] ","lastModifiedDate":"2024-03-07"},{"lineNumber":29,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2024-03-07"},{"lineNumber":30,"author":{"gitId":"tanguoyang"},"content":"* Role: Git Expert","lastModifiedDate":"2024-03-07"},{"lineNumber":31,"author":{"gitId":"tanguoyang"},"content":"* Responsibilities: Ensure that good Git practices are adhered to","lastModifiedDate":"2024-03-07"},{"lineNumber":32,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":33,"author":{"gitId":"tanguoyang"},"content":"### Tresa","lastModifiedDate":"2024-03-07"},{"lineNumber":34,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":35,"author":{"gitId":"tanguoyang"},"content":"\u003cimg src\u003d\"images/Teee728.png\" width\u003d\"200px\"\u003e","lastModifiedDate":"2024-03-07"},{"lineNumber":36,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":37,"author":{"gitId":"tanguoyang"},"content":"[[github](http://github.com/Teee728)]","lastModifiedDate":"2024-03-07"},{"lineNumber":38,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":39,"author":{"gitId":"tanguoyang"},"content":"* Role: Testing IC","lastModifiedDate":"2024-03-07"},{"lineNumber":40,"author":{"gitId":"tanguoyang"},"content":"* Responsibilities: Ensure features are well tested","lastModifiedDate":"2024-03-07"},{"lineNumber":41,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":42,"author":{"gitId":"tanguoyang"},"content":"### Sumaiya","lastModifiedDate":"2024-03-07"},{"lineNumber":43,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":44,"author":{"gitId":"tanguoyang"},"content":"\u003cimg src\u003d\"images/maiyasaliha.png\" width\u003d\"200px\"\u003e","lastModifiedDate":"2024-03-07"},{"lineNumber":45,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":46,"author":{"gitId":"tanguoyang"},"content":"[[github](http://github.com/maiyasaliha)]","lastModifiedDate":"2024-03-07"},{"lineNumber":47,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":48,"author":{"gitId":"tanguoyang"},"content":"* Role: Code Quality IC","lastModifiedDate":"2024-03-07"},{"lineNumber":49,"author":{"gitId":"tanguoyang"},"content":"* Responsibilities: Ensures that good code quality","lastModifiedDate":"2024-03-07"},{"lineNumber":50,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":51,"author":{"gitId":"tanguoyang"},"content":"### Yuechen","lastModifiedDate":"2024-03-07"},{"lineNumber":52,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":53,"author":{"gitId":"tanguoyang"},"content":"\u003cimg src\u003d\"images/yuechen2001.png\" width\u003d\"200px\"\u003e","lastModifiedDate":"2024-03-07"},{"lineNumber":54,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":55,"author":{"gitId":"tanguoyang"},"content":"[[github](http://github.com/yuechen2001)]","lastModifiedDate":"2024-03-07"},{"lineNumber":56,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":57,"author":{"gitId":"tanguoyang"},"content":"* Role: Documentation IC","lastModifiedDate":"2024-03-07"},{"lineNumber":58,"author":{"gitId":"tanguoyang"},"content":"* Responsibilities: Ensures that features are well documented","lastModifiedDate":"2024-03-07"}],"authorContributionMap":{"tanguoyang":25,"-":33}},{"path":"docs/DeveloperGuide.md","fileType":"docs","lines":[{"lineNumber":1,"author":{"gitId":"-"},"content":"---","lastModifiedDate":"2020-05-23"},{"lineNumber":2,"author":{"gitId":"-"},"content":"layout: default.md","lastModifiedDate":"2023-09-12"},{"lineNumber":3,"author":{"gitId":"-"},"content":"title: \"Developer Guide\"","lastModifiedDate":"2023-09-12"},{"lineNumber":4,"author":{"gitId":"-"},"content":"pageNav: 3","lastModifiedDate":"2023-09-12"},{"lineNumber":5,"author":{"gitId":"-"},"content":"---","lastModifiedDate":"2020-05-23"},{"lineNumber":6,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2023-09-12"},{"lineNumber":7,"author":{"gitId":"yuechen2001"},"content":"# CodeConnect Developer Guide","lastModifiedDate":"2024-03-07"},{"lineNumber":8,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2023-09-12"},{"lineNumber":9,"author":{"gitId":"-"},"content":"\u003c!-- * Table of Contents --\u003e","lastModifiedDate":"2023-09-12"},{"lineNumber":10,"author":{"gitId":"-"},"content":"\u003cpage-nav-print /\u003e","lastModifiedDate":"2023-09-12"},{"lineNumber":11,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":12,"author":{"gitId":"-"},"content":"--------------------------------------------------------------------------------------------------------------------","lastModifiedDate":"2020-05-23"},{"lineNumber":13,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2021-07-30"},{"lineNumber":14,"author":{"gitId":"-"},"content":"## **Acknowledgements**","lastModifiedDate":"2021-07-30"},{"lineNumber":15,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2021-07-30"},{"lineNumber":16,"author":{"gitId":"yuechen2001"},"content":"_{ list here sources of all reused/adapted ideas, code, documentation, and third-party libraries -- include links to the","lastModifiedDate":"2024-03-07"},{"lineNumber":17,"author":{"gitId":"yuechen2001"},"content":"original source as well }_","lastModifiedDate":"2024-03-07"},{"lineNumber":18,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2021-07-30"},{"lineNumber":19,"author":{"gitId":"-"},"content":"--------------------------------------------------------------------------------------------------------------------","lastModifiedDate":"2021-07-30"},{"lineNumber":20,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":21,"author":{"gitId":"-"},"content":"## **Setting up, getting started**","lastModifiedDate":"2020-05-23"},{"lineNumber":22,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":23,"author":{"gitId":"-"},"content":"Refer to the guide [_Setting up and getting started_](SettingUp.md).","lastModifiedDate":"2020-05-23"},{"lineNumber":24,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":25,"author":{"gitId":"-"},"content":"--------------------------------------------------------------------------------------------------------------------","lastModifiedDate":"2020-05-23"},{"lineNumber":26,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":27,"author":{"gitId":"-"},"content":"## **Design**","lastModifiedDate":"2020-05-23"},{"lineNumber":28,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":29,"author":{"gitId":"-"},"content":"### Architecture","lastModifiedDate":"2021-07-31"},{"lineNumber":30,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":31,"author":{"gitId":"-"},"content":"\u003cpuml src\u003d\"diagrams/ArchitectureDiagram.puml\" width\u003d\"280\" /\u003e","lastModifiedDate":"2023-09-12"},{"lineNumber":32,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":33,"author":{"gitId":"-"},"content":"The ***Architecture Diagram*** given above explains the high-level design of the App.","lastModifiedDate":"2021-07-31"},{"lineNumber":34,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":35,"author":{"gitId":"-"},"content":"Given below is a quick overview of main components and how they interact with each other.","lastModifiedDate":"2021-07-31"},{"lineNumber":36,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2021-07-31"},{"lineNumber":37,"author":{"gitId":"-"},"content":"**Main components of the architecture**","lastModifiedDate":"2021-07-31"},{"lineNumber":38,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":39,"author":{"gitId":"yuechen2001"},"content":"**`Main`** (consisting of","lastModifiedDate":"2024-03-07"},{"lineNumber":40,"author":{"gitId":"yuechen2001"},"content":"classes [`Main`](https://github.com/se-edu/addressbook-level3/tree/master/src/main/java/seedu/address/Main.java)","lastModifiedDate":"2024-03-07"},{"lineNumber":41,"author":{"gitId":"yuechen2001"},"content":"and [`MainApp`](https://github.com/se-edu/addressbook-level3/tree/master/src/main/java/seedu/address/MainApp.java)) is","lastModifiedDate":"2024-03-07"},{"lineNumber":42,"author":{"gitId":"yuechen2001"},"content":"in charge of the app launch and shut down.","lastModifiedDate":"2024-03-07"},{"lineNumber":43,"author":{"gitId":"yuechen2001"},"content":"","lastModifiedDate":"2024-03-07"},{"lineNumber":44,"author":{"gitId":"-"},"content":"* At app launch, it initializes the other components in the correct sequence, and connects them up with each other.","lastModifiedDate":"2023-09-03"},{"lineNumber":45,"author":{"gitId":"-"},"content":"* At shut down, it shuts down the other components and invokes cleanup methods where necessary.","lastModifiedDate":"2023-09-03"},{"lineNumber":46,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":47,"author":{"gitId":"-"},"content":"The bulk of the app\u0027s work is done by the following four components:","lastModifiedDate":"2023-09-03"},{"lineNumber":48,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":49,"author":{"gitId":"-"},"content":"* [**`UI`**](#ui-component): The UI of the App.","lastModifiedDate":"2020-05-23"},{"lineNumber":50,"author":{"gitId":"-"},"content":"* [**`Logic`**](#logic-component): The command executor.","lastModifiedDate":"2020-05-23"},{"lineNumber":51,"author":{"gitId":"-"},"content":"* [**`Model`**](#model-component): Holds the data of the App in memory.","lastModifiedDate":"2020-05-23"},{"lineNumber":52,"author":{"gitId":"-"},"content":"* [**`Storage`**](#storage-component): Reads data from, and writes data to, the hard disk.","lastModifiedDate":"2020-05-23"},{"lineNumber":53,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":54,"author":{"gitId":"-"},"content":"[**`Commons`**](#common-classes) represents a collection of classes used by multiple other components.","lastModifiedDate":"2023-09-03"},{"lineNumber":55,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":56,"author":{"gitId":"-"},"content":"**How the architecture components interact with each other**","lastModifiedDate":"2020-05-23"},{"lineNumber":57,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":58,"author":{"gitId":"yuechen2001"},"content":"The *Sequence Diagram* below shows how the components interact with each other for the scenario where the user issues","lastModifiedDate":"2024-03-07"},{"lineNumber":59,"author":{"gitId":"yuechen2001"},"content":"the command `delete 1`.","lastModifiedDate":"2024-03-07"},{"lineNumber":60,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":61,"author":{"gitId":"-"},"content":"\u003cpuml src\u003d\"diagrams/ArchitectureSequenceDiagram.puml\" width\u003d\"574\" /\u003e","lastModifiedDate":"2023-09-12"},{"lineNumber":62,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":63,"author":{"gitId":"-"},"content":"Each of the four main components (also shown in the diagram above),","lastModifiedDate":"2021-07-31"},{"lineNumber":64,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2021-07-31"},{"lineNumber":65,"author":{"gitId":"-"},"content":"* defines its *API* in an `interface` with the same name as the Component.","lastModifiedDate":"2021-07-31"},{"lineNumber":66,"author":{"gitId":"yuechen2001"},"content":"* implements its functionality using a concrete `{Component Name}Manager` class (which follows the corresponding","lastModifiedDate":"2024-03-07"},{"lineNumber":67,"author":{"gitId":"yuechen2001"},"content":" API `interface` mentioned in the previous point.","lastModifiedDate":"2024-03-07"},{"lineNumber":68,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2021-07-31"},{"lineNumber":69,"author":{"gitId":"yuechen2001"},"content":"For example, the `Logic` component defines its API in the `Logic.java` interface and implements its functionality using","lastModifiedDate":"2024-03-07"},{"lineNumber":70,"author":{"gitId":"yuechen2001"},"content":"the `LogicManager.java` class which follows the `Logic` interface. Other components interact with a given component","lastModifiedDate":"2024-03-07"},{"lineNumber":71,"author":{"gitId":"yuechen2001"},"content":"through its interface rather than the concrete class (reason: to prevent outside component\u0027s being coupled to the","lastModifiedDate":"2024-03-07"},{"lineNumber":72,"author":{"gitId":"yuechen2001"},"content":"implementation of a component), as illustrated in the (partial) class diagram below.","lastModifiedDate":"2024-03-07"},{"lineNumber":73,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2021-07-31"},{"lineNumber":74,"author":{"gitId":"-"},"content":"\u003cpuml src\u003d\"diagrams/ComponentManagers.puml\" width\u003d\"300\" /\u003e","lastModifiedDate":"2023-09-12"},{"lineNumber":75,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2021-07-31"},{"lineNumber":76,"author":{"gitId":"-"},"content":"The sections below give more details of each component.","lastModifiedDate":"2020-05-23"},{"lineNumber":77,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":78,"author":{"gitId":"-"},"content":"### UI component","lastModifiedDate":"2020-05-23"},{"lineNumber":79,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":80,"author":{"gitId":"yuechen2001"},"content":"The **API** of this component is specified","lastModifiedDate":"2024-03-07"},{"lineNumber":81,"author":{"gitId":"yuechen2001"},"content":"in [`Ui.java`](https://github.com/se-edu/addressbook-level3/tree/master/src/main/java/seedu/address/ui/Ui.java)","lastModifiedDate":"2024-03-07"},{"lineNumber":82,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":83,"author":{"gitId":"-"},"content":"\u003cpuml src\u003d\"diagrams/UiClassDiagram.puml\" alt\u003d\"Structure of the UI Component\"/\u003e","lastModifiedDate":"2023-09-12"},{"lineNumber":84,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":85,"author":{"gitId":"yuechen2001"},"content":"The UI consists of a `MainWindow` that is made up of parts","lastModifiedDate":"2024-03-07"},{"lineNumber":86,"author":{"gitId":"yuechen2001"},"content":"e.g.`CommandBox`, `ResultDisplay`, `PersonListPanel`, `StatusBarFooter` etc. All these, including the `MainWindow`,","lastModifiedDate":"2024-03-07"},{"lineNumber":87,"author":{"gitId":"yuechen2001"},"content":"inherit from the abstract `UiPart` class which captures the commonalities between classes that represent parts of the","lastModifiedDate":"2024-03-07"},{"lineNumber":88,"author":{"gitId":"yuechen2001"},"content":"visible GUI.","lastModifiedDate":"2024-03-07"},{"lineNumber":89,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":90,"author":{"gitId":"yuechen2001"},"content":"The `UI` component uses the JavaFx UI framework. The layout of these UI parts are defined in matching `.fxml` files that","lastModifiedDate":"2024-03-07"},{"lineNumber":91,"author":{"gitId":"yuechen2001"},"content":"are in the `src/main/resources/view` folder. For example, the layout of","lastModifiedDate":"2024-03-07"},{"lineNumber":92,"author":{"gitId":"yuechen2001"},"content":"the [`MainWindow`](https://github.com/se-edu/addressbook-level3/tree/master/src/main/java/seedu/address/ui/MainWindow.java)","lastModifiedDate":"2024-03-07"},{"lineNumber":93,"author":{"gitId":"yuechen2001"},"content":"is specified","lastModifiedDate":"2024-03-07"},{"lineNumber":94,"author":{"gitId":"yuechen2001"},"content":"in [`MainWindow.fxml`](https://github.com/se-edu/addressbook-level3/tree/master/src/main/resources/view/MainWindow.fxml)","lastModifiedDate":"2024-03-07"},{"lineNumber":95,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":96,"author":{"gitId":"-"},"content":"The `UI` component,","lastModifiedDate":"2020-05-23"},{"lineNumber":97,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":98,"author":{"gitId":"-"},"content":"* executes user commands using the `Logic` component.","lastModifiedDate":"2021-07-31"},{"lineNumber":99,"author":{"gitId":"-"},"content":"* listens for changes to `Model` data so that the UI can be updated with the modified data.","lastModifiedDate":"2021-07-31"},{"lineNumber":100,"author":{"gitId":"-"},"content":"* keeps a reference to the `Logic` component, because the `UI` relies on the `Logic` to execute commands.","lastModifiedDate":"2021-07-31"},{"lineNumber":101,"author":{"gitId":"-"},"content":"* depends on some classes in the `Model` component, as it displays `Person` object residing in the `Model`.","lastModifiedDate":"2021-07-31"},{"lineNumber":102,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":103,"author":{"gitId":"-"},"content":"### Logic component","lastModifiedDate":"2020-05-23"},{"lineNumber":104,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":105,"author":{"gitId":"yuechen2001"},"content":"**API","lastModifiedDate":"2024-03-07"},{"lineNumber":106,"author":{"gitId":"yuechen2001"},"content":"** : [`Logic.java`](https://github.com/se-edu/addressbook-level3/tree/master/src/main/java/seedu/address/logic/Logic.java)","lastModifiedDate":"2024-03-07"},{"lineNumber":107,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":108,"author":{"gitId":"-"},"content":"Here\u0027s a (partial) class diagram of the `Logic` component:","lastModifiedDate":"2021-07-31"},{"lineNumber":109,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":110,"author":{"gitId":"-"},"content":"\u003cpuml src\u003d\"diagrams/LogicClassDiagram.puml\" width\u003d\"550\"/\u003e","lastModifiedDate":"2023-09-12"},{"lineNumber":111,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":112,"author":{"gitId":"yuechen2001"},"content":"The sequence diagram below illustrates the interactions within the `Logic` component, taking `execute(\"delete 1\")` API","lastModifiedDate":"2024-03-07"},{"lineNumber":113,"author":{"gitId":"yuechen2001"},"content":"call as an example.","lastModifiedDate":"2024-03-07"},{"lineNumber":114,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":115,"author":{"gitId":"-"},"content":"\u003cpuml src\u003d\"diagrams/DeleteSequenceDiagram.puml\" alt\u003d\"Interactions Inside the Logic Component for the `delete 1` Command\" /\u003e","lastModifiedDate":"2023-09-12"},{"lineNumber":116,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2023-09-12"},{"lineNumber":117,"author":{"gitId":"-"},"content":"\u003cbox type\u003d\"info\" seamless\u003e","lastModifiedDate":"2023-09-12"},{"lineNumber":118,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":119,"author":{"gitId":"yuechen2001"},"content":"**Note:** The lifeline for `DeleteCommandParser` should end at the destroy marker (X) but due to a limitation of","lastModifiedDate":"2024-03-07"},{"lineNumber":120,"author":{"gitId":"yuechen2001"},"content":"PlantUML, the lifeline continues till the end of diagram.","lastModifiedDate":"2024-03-07"},{"lineNumber":121,"author":{"gitId":"-"},"content":"\u003c/box\u003e","lastModifiedDate":"2023-09-12"},{"lineNumber":122,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":123,"author":{"gitId":"-"},"content":"How the `Logic` component works:","lastModifiedDate":"2023-09-03"},{"lineNumber":124,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2023-09-03"},{"lineNumber":125,"author":{"gitId":"yuechen2001"},"content":"1. When `Logic` is called upon to execute a command, it is passed to an `AddressBookParser` object which in turn creates","lastModifiedDate":"2024-03-07"},{"lineNumber":126,"author":{"gitId":"yuechen2001"},"content":" a parser that matches the command (e.g., `DeleteCommandParser`) and uses it to parse the command.","lastModifiedDate":"2024-03-07"},{"lineNumber":127,"author":{"gitId":"yuechen2001"},"content":"1. This results in a `Command` object (more precisely, an object of one of its subclasses e.g., `DeleteCommand`) which","lastModifiedDate":"2024-03-07"},{"lineNumber":128,"author":{"gitId":"yuechen2001"},"content":" is executed by the `LogicManager`.","lastModifiedDate":"2024-03-07"},{"lineNumber":129,"author":{"gitId":"-"},"content":"1. The command can communicate with the `Model` when it is executed (e.g. to delete a person).\u003cbr\u003e","lastModifiedDate":"2024-02-09"},{"lineNumber":130,"author":{"gitId":"yuechen2001"},"content":" Note that although this is shown as a single step in the diagram above (for simplicity), in the code it can take","lastModifiedDate":"2024-03-07"},{"lineNumber":131,"author":{"gitId":"yuechen2001"},"content":" several interactions (between the command object and the `Model`) to achieve.","lastModifiedDate":"2024-03-07"},{"lineNumber":132,"author":{"gitId":"-"},"content":"1. The result of the command execution is encapsulated as a `CommandResult` object which is returned back from `Logic`.","lastModifiedDate":"2023-09-03"},{"lineNumber":133,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2023-09-03"},{"lineNumber":134,"author":{"gitId":"-"},"content":"Here are the other classes in `Logic` (omitted from the class diagram above) that are used for parsing a user command:","lastModifiedDate":"2021-07-31"},{"lineNumber":135,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2021-07-31"},{"lineNumber":136,"author":{"gitId":"-"},"content":"\u003cpuml src\u003d\"diagrams/ParserClasses.puml\" width\u003d\"600\"/\u003e","lastModifiedDate":"2023-09-12"},{"lineNumber":137,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":138,"author":{"gitId":"-"},"content":"How the parsing works:","lastModifiedDate":"2021-07-31"},{"lineNumber":139,"author":{"gitId":"yuechen2001"},"content":"","lastModifiedDate":"2024-03-07"},{"lineNumber":140,"author":{"gitId":"yuechen2001"},"content":"* When called upon to parse a user command, the `AddressBookParser` class creates an `XYZCommandParser` (`XYZ` is a","lastModifiedDate":"2024-03-07"},{"lineNumber":141,"author":{"gitId":"yuechen2001"},"content":" placeholder for the specific command name e.g., `AddCommandParser`) which uses the other classes shown above to parse","lastModifiedDate":"2024-03-07"},{"lineNumber":142,"author":{"gitId":"yuechen2001"},"content":" the user command and create a `XYZCommand` object (e.g., `AddCommand`) which the `AddressBookParser` returns back as","lastModifiedDate":"2024-03-07"},{"lineNumber":143,"author":{"gitId":"yuechen2001"},"content":" a `Command` object.","lastModifiedDate":"2024-03-07"},{"lineNumber":144,"author":{"gitId":"yuechen2001"},"content":"* All `XYZCommandParser` classes (e.g., `AddCommandParser`, `DeleteCommandParser`, ...) inherit from the `Parser`","lastModifiedDate":"2024-03-07"},{"lineNumber":145,"author":{"gitId":"yuechen2001"},"content":" interface so that they can be treated similarly where possible e.g, during testing.","lastModifiedDate":"2024-03-07"},{"lineNumber":146,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":147,"author":{"gitId":"-"},"content":"### Model component","lastModifiedDate":"2021-07-31"},{"lineNumber":148,"author":{"gitId":"yuechen2001"},"content":"","lastModifiedDate":"2024-03-07"},{"lineNumber":149,"author":{"gitId":"yuechen2001"},"content":"**API","lastModifiedDate":"2024-03-07"},{"lineNumber":150,"author":{"gitId":"yuechen2001"},"content":"** : [`Model.java`](https://github.com/se-edu/addressbook-level3/tree/master/src/main/java/seedu/address/model/Model.java)","lastModifiedDate":"2024-03-07"},{"lineNumber":151,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":152,"author":{"gitId":"-"},"content":"\u003cpuml src\u003d\"diagrams/ModelClassDiagram.puml\" width\u003d\"450\" /\u003e","lastModifiedDate":"2023-09-12"},{"lineNumber":153,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":154,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":155,"author":{"gitId":"-"},"content":"The `Model` component,","lastModifiedDate":"2021-07-31"},{"lineNumber":156,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":157,"author":{"gitId":"-"},"content":"* stores the address book data i.e., all `Person` objects (which are contained in a `UniquePersonList` object).","lastModifiedDate":"2021-07-31"},{"lineNumber":158,"author":{"gitId":"yuechen2001"},"content":"* stores the currently \u0027selected\u0027 `Person` objects (e.g., results of a search query) as a separate _filtered_ list which","lastModifiedDate":"2024-03-07"},{"lineNumber":159,"author":{"gitId":"yuechen2001"},"content":" is exposed to outsiders as an unmodifiable `ObservableList\u003cPerson\u003e` that can be \u0027observed\u0027 e.g. the UI can be bound to","lastModifiedDate":"2024-03-07"},{"lineNumber":160,"author":{"gitId":"yuechen2001"},"content":" this list so that the UI automatically updates when the data in the list change.","lastModifiedDate":"2024-03-07"},{"lineNumber":161,"author":{"gitId":"yuechen2001"},"content":"* stores a `UserPref` object that represents the user’s preferences. This is exposed to the outside as","lastModifiedDate":"2024-03-07"},{"lineNumber":162,"author":{"gitId":"yuechen2001"},"content":" a `ReadOnlyUserPref` objects.","lastModifiedDate":"2024-03-07"},{"lineNumber":163,"author":{"gitId":"yuechen2001"},"content":"* does not depend on any of the other three components (as the `Model` represents data entities of the domain, they","lastModifiedDate":"2024-03-07"},{"lineNumber":164,"author":{"gitId":"yuechen2001"},"content":" should make sense on their own without depending on other components)","lastModifiedDate":"2024-03-07"},{"lineNumber":165,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2021-07-31"},{"lineNumber":166,"author":{"gitId":"-"},"content":"\u003cbox type\u003d\"info\" seamless\u003e","lastModifiedDate":"2023-09-12"},{"lineNumber":167,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2023-09-12"},{"lineNumber":168,"author":{"gitId":"yuechen2001"},"content":"**Note:** An alternative (arguably, a more OOP) model is given below. It has a `Tag` list in the `AddressBook`,","lastModifiedDate":"2024-03-07"},{"lineNumber":169,"author":{"gitId":"yuechen2001"},"content":"which `Person` references. This allows `AddressBook` to only require one `Tag` object per unique tag, instead of","lastModifiedDate":"2024-03-07"},{"lineNumber":170,"author":{"gitId":"yuechen2001"},"content":"each `Person` needing their own `Tag` objects.\u003cbr\u003e","lastModifiedDate":"2024-03-07"},{"lineNumber":171,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2021-07-31"},{"lineNumber":172,"author":{"gitId":"-"},"content":"\u003cpuml src\u003d\"diagrams/BetterModelClassDiagram.puml\" width\u003d\"450\" /\u003e","lastModifiedDate":"2023-09-12"},{"lineNumber":173,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":174,"author":{"gitId":"-"},"content":"\u003c/box\u003e","lastModifiedDate":"2023-09-12"},{"lineNumber":175,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":176,"author":{"gitId":"-"},"content":"### Storage component","lastModifiedDate":"2020-05-23"},{"lineNumber":177,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":178,"author":{"gitId":"yuechen2001"},"content":"**API","lastModifiedDate":"2024-03-07"},{"lineNumber":179,"author":{"gitId":"yuechen2001"},"content":"** : [`Storage.java`](https://github.com/se-edu/addressbook-level3/tree/master/src/main/java/seedu/address/storage/Storage.java)","lastModifiedDate":"2024-03-07"},{"lineNumber":180,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":181,"author":{"gitId":"-"},"content":"\u003cpuml src\u003d\"diagrams/StorageClassDiagram.puml\" width\u003d\"550\" /\u003e","lastModifiedDate":"2023-09-12"},{"lineNumber":182,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2021-07-31"},{"lineNumber":183,"author":{"gitId":"-"},"content":"The `Storage` component,","lastModifiedDate":"2020-05-23"},{"lineNumber":184,"author":{"gitId":"yuechen2001"},"content":"","lastModifiedDate":"2024-03-07"},{"lineNumber":185,"author":{"gitId":"yuechen2001"},"content":"* can save both address book data and user preference data in JSON format, and read them back into corresponding","lastModifiedDate":"2024-03-07"},{"lineNumber":186,"author":{"gitId":"yuechen2001"},"content":" objects.","lastModifiedDate":"2024-03-07"},{"lineNumber":187,"author":{"gitId":"yuechen2001"},"content":"* inherits from both `AddressBookStorage` and `UserPrefStorage`, which means it can be treated as either one (if only","lastModifiedDate":"2024-03-07"},{"lineNumber":188,"author":{"gitId":"yuechen2001"},"content":" the functionality of only one is needed).","lastModifiedDate":"2024-03-07"},{"lineNumber":189,"author":{"gitId":"yuechen2001"},"content":"* depends on some classes in the `Model` component (because the `Storage` component\u0027s job is to save/retrieve objects","lastModifiedDate":"2024-03-07"},{"lineNumber":190,"author":{"gitId":"yuechen2001"},"content":" that belong to the `Model`)","lastModifiedDate":"2024-03-07"},{"lineNumber":191,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":192,"author":{"gitId":"-"},"content":"### Common classes","lastModifiedDate":"2020-05-23"},{"lineNumber":193,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":194,"author":{"gitId":"-"},"content":"Classes used by multiple components are in the `seedu.addressbook.commons` package.","lastModifiedDate":"2020-05-23"},{"lineNumber":195,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":196,"author":{"gitId":"-"},"content":"--------------------------------------------------------------------------------------------------------------------","lastModifiedDate":"2020-05-23"},{"lineNumber":197,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":198,"author":{"gitId":"-"},"content":"## **Implementation**","lastModifiedDate":"2020-05-23"},{"lineNumber":199,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":200,"author":{"gitId":"-"},"content":"This section describes some noteworthy details on how certain features are implemented.","lastModifiedDate":"2020-05-23"},{"lineNumber":201,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":202,"author":{"gitId":"-"},"content":"### \\[Proposed\\] Undo/redo feature","lastModifiedDate":"2020-06-07"},{"lineNumber":203,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":204,"author":{"gitId":"-"},"content":"#### Proposed Implementation","lastModifiedDate":"2020-05-23"},{"lineNumber":205,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":206,"author":{"gitId":"yuechen2001"},"content":"The proposed undo/redo mechanism is facilitated by `VersionedAddressBook`. It extends `AddressBook` with an undo/redo","lastModifiedDate":"2024-03-07"},{"lineNumber":207,"author":{"gitId":"yuechen2001"},"content":"history, stored internally as an `addressBookStateList` and `currentStatePointer`. Additionally, it implements the","lastModifiedDate":"2024-03-07"},{"lineNumber":208,"author":{"gitId":"yuechen2001"},"content":"following operations:","lastModifiedDate":"2024-03-07"},{"lineNumber":209,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":210,"author":{"gitId":"-"},"content":"* `VersionedAddressBook#commit()` — Saves the current address book state in its history.","lastModifiedDate":"2020-05-23"},{"lineNumber":211,"author":{"gitId":"-"},"content":"* `VersionedAddressBook#undo()` — Restores the previous address book state from its history.","lastModifiedDate":"2020-05-23"},{"lineNumber":212,"author":{"gitId":"-"},"content":"* `VersionedAddressBook#redo()` — Restores a previously undone address book state from its history.","lastModifiedDate":"2020-05-23"},{"lineNumber":213,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":214,"author":{"gitId":"yuechen2001"},"content":"These operations are exposed in the `Model` interface as `Model#commitAddressBook()`, `Model#undoAddressBook()`","lastModifiedDate":"2024-03-07"},{"lineNumber":215,"author":{"gitId":"yuechen2001"},"content":"and `Model#redoAddressBook()` respectively.","lastModifiedDate":"2024-03-07"},{"lineNumber":216,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":217,"author":{"gitId":"-"},"content":"Given below is an example usage scenario and how the undo/redo mechanism behaves at each step.","lastModifiedDate":"2020-05-23"},{"lineNumber":218,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":219,"author":{"gitId":"yuechen2001"},"content":"Step 1. The user launches the application for the first time. The `VersionedAddressBook` will be initialized with the","lastModifiedDate":"2024-03-07"},{"lineNumber":220,"author":{"gitId":"yuechen2001"},"content":"initial address book state, and the `currentStatePointer` pointing to that single address book state.","lastModifiedDate":"2024-03-07"},{"lineNumber":221,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":222,"author":{"gitId":"-"},"content":"\u003cpuml src\u003d\"diagrams/UndoRedoState0.puml\" alt\u003d\"UndoRedoState0\" /\u003e","lastModifiedDate":"2023-09-12"},{"lineNumber":223,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":224,"author":{"gitId":"yuechen2001"},"content":"Step 2. The user executes `delete 5` command to delete the 5th person in the address book. The `delete` command","lastModifiedDate":"2024-03-07"},{"lineNumber":225,"author":{"gitId":"yuechen2001"},"content":"calls `Model#commitAddressBook()`, causing the modified state of the address book after the `delete 5` command executes","lastModifiedDate":"2024-03-07"},{"lineNumber":226,"author":{"gitId":"yuechen2001"},"content":"to be saved in the `addressBookStateList`, and the `currentStatePointer` is shifted to the newly inserted address book","lastModifiedDate":"2024-03-07"},{"lineNumber":227,"author":{"gitId":"yuechen2001"},"content":"state.","lastModifiedDate":"2024-03-07"},{"lineNumber":228,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":229,"author":{"gitId":"-"},"content":"\u003cpuml src\u003d\"diagrams/UndoRedoState1.puml\" alt\u003d\"UndoRedoState1\" /\u003e","lastModifiedDate":"2023-09-12"},{"lineNumber":230,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":231,"author":{"gitId":"yuechen2001"},"content":"Step 3. The user executes `add n/David …​` to add a new person. The `add` command also","lastModifiedDate":"2024-03-07"},{"lineNumber":232,"author":{"gitId":"yuechen2001"},"content":"calls `Model#commitAddressBook()`, causing another modified address book state to be saved into","lastModifiedDate":"2024-03-07"},{"lineNumber":233,"author":{"gitId":"yuechen2001"},"content":"the `addressBookStateList`.","lastModifiedDate":"2024-03-07"},{"lineNumber":234,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":235,"author":{"gitId":"-"},"content":"\u003cpuml src\u003d\"diagrams/UndoRedoState2.puml\" alt\u003d\"UndoRedoState2\" /\u003e","lastModifiedDate":"2023-09-12"},{"lineNumber":236,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":237,"author":{"gitId":"-"},"content":"\u003cbox type\u003d\"info\" seamless\u003e","lastModifiedDate":"2023-09-12"},{"lineNumber":238,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":239,"author":{"gitId":"yuechen2001"},"content":"**Note:** If a command fails its execution, it will not call `Model#commitAddressBook()`, so the address book state will","lastModifiedDate":"2024-03-07"},{"lineNumber":240,"author":{"gitId":"yuechen2001"},"content":"not be saved into the `addressBookStateList`.","lastModifiedDate":"2024-03-07"},{"lineNumber":241,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2023-09-12"},{"lineNumber":242,"author":{"gitId":"-"},"content":"\u003c/box\u003e","lastModifiedDate":"2023-09-12"},{"lineNumber":243,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":244,"author":{"gitId":"yuechen2001"},"content":"Step 4. The user now decides that adding the person was a mistake, and decides to undo that action by executing","lastModifiedDate":"2024-03-07"},{"lineNumber":245,"author":{"gitId":"yuechen2001"},"content":"the `undo` command. The `undo` command will call `Model#undoAddressBook()`, which will shift the `currentStatePointer`","lastModifiedDate":"2024-03-07"},{"lineNumber":246,"author":{"gitId":"yuechen2001"},"content":"once to the left, pointing it to the previous address book state, and restores the address book to that state.","lastModifiedDate":"2024-03-07"},{"lineNumber":247,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":248,"author":{"gitId":"-"},"content":"\u003cpuml src\u003d\"diagrams/UndoRedoState3.puml\" alt\u003d\"UndoRedoState3\" /\u003e","lastModifiedDate":"2023-09-12"},{"lineNumber":249,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2023-09-12"},{"lineNumber":250,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2023-09-12"},{"lineNumber":251,"author":{"gitId":"-"},"content":"\u003cbox type\u003d\"info\" seamless\u003e","lastModifiedDate":"2023-09-12"},{"lineNumber":252,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":253,"author":{"gitId":"yuechen2001"},"content":"**Note:** If the `currentStatePointer` is at index 0, pointing to the initial AddressBook state, then there are no","lastModifiedDate":"2024-03-07"},{"lineNumber":254,"author":{"gitId":"yuechen2001"},"content":"previous AddressBook states to restore. The `undo` command uses `Model#canUndoAddressBook()` to check if this is the","lastModifiedDate":"2024-03-07"},{"lineNumber":255,"author":{"gitId":"yuechen2001"},"content":"case. If so, it will return an error to the user rather","lastModifiedDate":"2024-03-07"},{"lineNumber":256,"author":{"gitId":"-"},"content":"than attempting to perform the undo.","lastModifiedDate":"2020-05-23"},{"lineNumber":257,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":258,"author":{"gitId":"-"},"content":"\u003c/box\u003e","lastModifiedDate":"2023-09-12"},{"lineNumber":259,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":260,"author":{"gitId":"-"},"content":"The following sequence diagram shows how an undo operation goes through the `Logic` component:","lastModifiedDate":"2024-02-09"},{"lineNumber":261,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":262,"author":{"gitId":"-"},"content":"\u003cpuml src\u003d\"diagrams/UndoSequenceDiagram-Logic.puml\" alt\u003d\"UndoSequenceDiagram-Logic\" /\u003e","lastModifiedDate":"2023-09-12"},{"lineNumber":263,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":264,"author":{"gitId":"-"},"content":"\u003cbox type\u003d\"info\" seamless\u003e","lastModifiedDate":"2023-09-12"},{"lineNumber":265,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":266,"author":{"gitId":"yuechen2001"},"content":"**Note:** The lifeline for `UndoCommand` should end at the destroy marker (X) but due to a limitation of PlantUML, the","lastModifiedDate":"2024-03-07"},{"lineNumber":267,"author":{"gitId":"yuechen2001"},"content":"lifeline reaches the end of diagram.","lastModifiedDate":"2024-03-07"},{"lineNumber":268,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2023-09-12"},{"lineNumber":269,"author":{"gitId":"-"},"content":"\u003c/box\u003e","lastModifiedDate":"2023-09-12"},{"lineNumber":270,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":271,"author":{"gitId":"-"},"content":"Similarly, how an undo operation goes through the `Model` component is shown below:","lastModifiedDate":"2024-02-09"},{"lineNumber":272,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2024-02-09"},{"lineNumber":273,"author":{"gitId":"-"},"content":"\u003cpuml src\u003d\"diagrams/UndoSequenceDiagram-Model.puml\" alt\u003d\"UndoSequenceDiagram-Model\" /\u003e","lastModifiedDate":"2023-09-12"},{"lineNumber":274,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2024-02-09"},{"lineNumber":275,"author":{"gitId":"-"},"content":"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.","lastModifiedDate":"2020-05-23"},{"lineNumber":276,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":277,"author":{"gitId":"-"},"content":"\u003cbox type\u003d\"info\" seamless\u003e","lastModifiedDate":"2023-09-12"},{"lineNumber":278,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2023-09-12"},{"lineNumber":279,"author":{"gitId":"yuechen2001"},"content":"**Note:** If the `currentStatePointer` is at index `addressBookStateList.size() - 1`, pointing to the latest address","lastModifiedDate":"2024-03-07"},{"lineNumber":280,"author":{"gitId":"yuechen2001"},"content":"book state, then there are no undone AddressBook states to restore. The `redo` command uses `Model#canRedoAddressBook()`","lastModifiedDate":"2024-03-07"},{"lineNumber":281,"author":{"gitId":"yuechen2001"},"content":"to check if this is the case. If so, it will return an error to the user rather than attempting to perform the redo.","lastModifiedDate":"2024-03-07"},{"lineNumber":282,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":283,"author":{"gitId":"-"},"content":"\u003c/box\u003e","lastModifiedDate":"2023-09-12"},{"lineNumber":284,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":285,"author":{"gitId":"yuechen2001"},"content":"Step 5. The user then decides to execute the command `list`. Commands that do not modify the address book, such","lastModifiedDate":"2024-03-07"},{"lineNumber":286,"author":{"gitId":"yuechen2001"},"content":"as `list`, will usually not call `Model#commitAddressBook()`, `Model#undoAddressBook()` or `Model#redoAddressBook()`.","lastModifiedDate":"2024-03-07"},{"lineNumber":287,"author":{"gitId":"yuechen2001"},"content":"Thus, the `addressBookStateList` remains unchanged.","lastModifiedDate":"2024-03-07"},{"lineNumber":288,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":289,"author":{"gitId":"-"},"content":"\u003cpuml src\u003d\"diagrams/UndoRedoState4.puml\" alt\u003d\"UndoRedoState4\" /\u003e","lastModifiedDate":"2023-09-12"},{"lineNumber":290,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":291,"author":{"gitId":"yuechen2001"},"content":"Step 6. The user executes `clear`, which calls `Model#commitAddressBook()`. Since the `currentStatePointer` is not","lastModifiedDate":"2024-03-07"},{"lineNumber":292,"author":{"gitId":"yuechen2001"},"content":"pointing at the end of the `addressBookStateList`, all address book states after the `currentStatePointer` will be","lastModifiedDate":"2024-03-07"},{"lineNumber":293,"author":{"gitId":"yuechen2001"},"content":"purged. Reason: It no longer makes sense to redo the `add n/David …​` command. This is the behavior that most modern","lastModifiedDate":"2024-03-07"},{"lineNumber":294,"author":{"gitId":"yuechen2001"},"content":"desktop applications follow.","lastModifiedDate":"2024-03-07"},{"lineNumber":295,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":296,"author":{"gitId":"-"},"content":"\u003cpuml src\u003d\"diagrams/UndoRedoState5.puml\" alt\u003d\"UndoRedoState5\" /\u003e","lastModifiedDate":"2023-09-12"},{"lineNumber":297,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":298,"author":{"gitId":"-"},"content":"The following activity diagram summarizes what happens when a user executes a new command:","lastModifiedDate":"2020-05-23"},{"lineNumber":299,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":300,"author":{"gitId":"-"},"content":"\u003cpuml src\u003d\"diagrams/CommitActivityDiagram.puml\" width\u003d\"250\" /\u003e","lastModifiedDate":"2023-09-12"},{"lineNumber":301,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":302,"author":{"gitId":"-"},"content":"#### Design considerations:","lastModifiedDate":"2021-07-31"},{"lineNumber":303,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":304,"author":{"gitId":"-"},"content":"**Aspect: How undo \u0026 redo executes:**","lastModifiedDate":"2021-07-31"},{"lineNumber":305,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":306,"author":{"gitId":"-"},"content":"* **Alternative 1 (current choice):** Saves the entire address book.","lastModifiedDate":"2020-05-23"},{"lineNumber":307,"author":{"gitId":"-"},"content":" * Pros: Easy to implement.","lastModifiedDate":"2020-05-23"},{"lineNumber":308,"author":{"gitId":"-"},"content":" * Cons: May have performance issues in terms of memory usage.","lastModifiedDate":"2020-05-23"},{"lineNumber":309,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":310,"author":{"gitId":"-"},"content":"* **Alternative 2:** Individual command knows how to undo/redo by","lastModifiedDate":"2020-05-23"},{"lineNumber":311,"author":{"gitId":"-"},"content":" itself.","lastModifiedDate":"2020-05-23"},{"lineNumber":312,"author":{"gitId":"-"},"content":" * Pros: Will use less memory (e.g. for `delete`, just save the person being deleted).","lastModifiedDate":"2020-05-23"},{"lineNumber":313,"author":{"gitId":"-"},"content":" * Cons: We must ensure that the implementation of each individual command are correct.","lastModifiedDate":"2020-05-23"},{"lineNumber":314,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":315,"author":{"gitId":"-"},"content":"_{more aspects and alternatives to be added}_","lastModifiedDate":"2020-05-23"},{"lineNumber":316,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":317,"author":{"gitId":"-"},"content":"### \\[Proposed\\] Data archiving","lastModifiedDate":"2020-05-23"},{"lineNumber":318,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":319,"author":{"gitId":"-"},"content":"_{Explain here how the data archiving feature will be implemented}_","lastModifiedDate":"2020-05-23"},{"lineNumber":320,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":321,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":322,"author":{"gitId":"-"},"content":"--------------------------------------------------------------------------------------------------------------------","lastModifiedDate":"2020-05-23"},{"lineNumber":323,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":324,"author":{"gitId":"-"},"content":"## **Documentation, logging, testing, configuration, dev-ops**","lastModifiedDate":"2020-06-07"},{"lineNumber":325,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":326,"author":{"gitId":"-"},"content":"* [Documentation guide](Documentation.md)","lastModifiedDate":"2020-06-07"},{"lineNumber":327,"author":{"gitId":"-"},"content":"* [Testing guide](Testing.md)","lastModifiedDate":"2020-06-07"},{"lineNumber":328,"author":{"gitId":"-"},"content":"* [Logging guide](Logging.md)","lastModifiedDate":"2020-06-07"},{"lineNumber":329,"author":{"gitId":"-"},"content":"* [Configuration guide](Configuration.md)","lastModifiedDate":"2020-06-07"},{"lineNumber":330,"author":{"gitId":"-"},"content":"* [DevOps guide](DevOps.md)","lastModifiedDate":"2020-06-07"},{"lineNumber":331,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":332,"author":{"gitId":"-"},"content":"--------------------------------------------------------------------------------------------------------------------","lastModifiedDate":"2020-05-23"},{"lineNumber":333,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":334,"author":{"gitId":"-"},"content":"## **Appendix: Requirements**","lastModifiedDate":"2020-05-23"},{"lineNumber":335,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":336,"author":{"gitId":"-"},"content":"### Product scope","lastModifiedDate":"2020-05-23"},{"lineNumber":337,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":338,"author":{"gitId":"-"},"content":"**Target user profile**:","lastModifiedDate":"2020-05-23"},{"lineNumber":339,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":340,"author":{"gitId":"yuechen2001"},"content":"* Student developers","lastModifiedDate":"2024-03-07"},{"lineNumber":341,"author":{"gitId":"yuechen2001"},"content":"* hopes to connect and collaborate with other student developers","lastModifiedDate":"2024-03-07"},{"lineNumber":342,"author":{"gitId":"-"},"content":"* has a need to manage a significant number of contacts","lastModifiedDate":"2020-05-23"},{"lineNumber":343,"author":{"gitId":"-"},"content":"* prefer desktop apps over other types","lastModifiedDate":"2020-05-23"},{"lineNumber":344,"author":{"gitId":"-"},"content":"* can type fast","lastModifiedDate":"2020-05-23"},{"lineNumber":345,"author":{"gitId":"-"},"content":"* prefers typing to mouse interactions","lastModifiedDate":"2020-05-26"},{"lineNumber":346,"author":{"gitId":"-"},"content":"* is reasonably comfortable using CLI apps","lastModifiedDate":"2020-05-23"},{"lineNumber":347,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":348,"author":{"gitId":"yuechen2001"},"content":"**Value proposition**:","lastModifiedDate":"2024-03-07"},{"lineNumber":349,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":350,"author":{"gitId":"yuechen2001"},"content":"* keep track of other student developers","lastModifiedDate":"2024-03-07"},{"lineNumber":351,"author":{"gitId":"yuechen2001"},"content":"* reach out easily to those with relevant skills for collaboration opportunities.","lastModifiedDate":"2024-03-07"},{"lineNumber":352,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":353,"author":{"gitId":"-"},"content":"### User stories","lastModifiedDate":"2020-06-07"},{"lineNumber":354,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":355,"author":{"gitId":"-"},"content":"Priorities: High (must have) - `* * *`, Medium (nice to have) - `* *`, Low (unlikely to have) - `*`","lastModifiedDate":"2020-05-23"},{"lineNumber":356,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":357,"author":{"gitId":"-"},"content":"| Priority | As a …​ | I want to …​ | So that I can…​ |","lastModifiedDate":"2020-05-23"},{"lineNumber":358,"author":{"gitId":"yuechen2001"},"content":"|----------|-----------------------------------------|-------------------------------------------------------------------------------------------------------------------|-------------------------------------------------------------------------|","lastModifiedDate":"2024-03-07"},{"lineNumber":359,"author":{"gitId":"yuechen2001"},"content":"| `* * *` | Student | save the contacts of student developers | remember them |","lastModifiedDate":"2024-03-07"},{"lineNumber":360,"author":{"gitId":"yuechen2001"},"content":"| `* * *` | Student | see the contacts of student developers | reach out to them |","lastModifiedDate":"2024-03-07"},{"lineNumber":361,"author":{"gitId":"yuechen2001"},"content":"| `* * *` | Student | delete the contacts of student developers | remove entries that I no longer need |","lastModifiedDate":"2024-03-07"},{"lineNumber":362,"author":{"gitId":"yuechen2001"},"content":"| `* * *` | Student | search for the contacts of student developers | locate details of contacts without having to go through the entire list |","lastModifiedDate":"2024-03-07"},{"lineNumber":363,"author":{"gitId":"yuechen2001"},"content":"| `* * *` | Student | update the details of contacts that I already have in my address book | keep my contact details up to date |","lastModifiedDate":"2024-03-07"},{"lineNumber":364,"author":{"gitId":"yuechen2001"},"content":"| `* *` | Student | sort contacts by tags | locate a group of student developers easily |","lastModifiedDate":"2024-03-07"},{"lineNumber":365,"author":{"gitId":"yuechen2001"},"content":"| `* *` | Student | categorise the contacts I have saved into the projects I am working on | have an organised address book |","lastModifiedDate":"2024-03-07"},{"lineNumber":366,"author":{"gitId":"yuechen2001"},"content":"| `* *` | Forgetful Student | add profile pictures for each contact | know who I am contacting |","lastModifiedDate":"2024-03-07"},{"lineNumber":367,"author":{"gitId":"yuechen2001"},"content":"| `* * *` | Student | search for contacts based on their technical skills | form teams for hackathons more easily |","lastModifiedDate":"2024-03-07"},{"lineNumber":368,"author":{"gitId":"yuechen2001"},"content":"| `*` | Student | view my most used commands while typing | save time typing out the full command |","lastModifiedDate":"2024-03-07"},{"lineNumber":369,"author":{"gitId":"yuechen2001"},"content":"| `*` | Student signing up for a hackathon | export the contact details of my team | easily sign up for events |","lastModifiedDate":"2024-03-07"},{"lineNumber":370,"author":{"gitId":"yuechen2001"},"content":"| `*` | Student | place reminders for meetings with my contacts | keep track of them |","lastModifiedDate":"2024-03-07"},{"lineNumber":371,"author":{"gitId":"yuechen2001"},"content":"| `* *` | New user | import existing contacts into this application | |","lastModifiedDate":"2024-03-07"},{"lineNumber":372,"author":{"gitId":"yuechen2001"},"content":"| `* * *` | Student | add notes to different contacts | remember specific details |","lastModifiedDate":"2024-03-07"},{"lineNumber":373,"author":{"gitId":"yuechen2001"},"content":"| `* *` | Student | integrate my contacts with calendar events | schedule meetings directly from the application |","lastModifiedDate":"2024-03-07"},{"lineNumber":374,"author":{"gitId":"yuechen2001"},"content":"| `*` | Student | tag contacts based on their time zone | take note of different time zones when scheduling meetings |","lastModifiedDate":"2024-03-07"},{"lineNumber":375,"author":{"gitId":"yuechen2001"},"content":"| `* * *` | Student | link GitHub profiles or personal portfolio websites to contacts | easily access their projects and contributions |","lastModifiedDate":"2024-03-07"},{"lineNumber":376,"author":{"gitId":"yuechen2001"},"content":"| `*` | Student | be given smart suggestions for potential contacts based on my current network and interests | |","lastModifiedDate":"2024-03-07"},{"lineNumber":377,"author":{"gitId":"yuechen2001"},"content":"| `*` | Student | integrate messaging apps to initiate conversations directly from the application | |","lastModifiedDate":"2024-03-07"},{"lineNumber":378,"author":{"gitId":"yuechen2001"},"content":"| `*` | New user | have a tutorial feature that shows me how to use the app | |","lastModifiedDate":"2024-03-07"},{"lineNumber":379,"author":{"gitId":"yuechen2001"},"content":"| `* *` | Student attending conferences or events | quickly exchange contact information with fellow attendees through QR codes | quickly add new contacts |","lastModifiedDate":"2024-03-07"},{"lineNumber":380,"author":{"gitId":"yuechen2001"},"content":"| `* *` | Team Lead | have access to integrated online learning platforms to track the courses or certificates completed by my contacts | understand their evolving skills |","lastModifiedDate":"2024-03-07"},{"lineNumber":381,"author":{"gitId":"yuechen2001"},"content":"| `* * *` | Student | endorse or rate the skills of my contacts | keep track of their expertise and choose the right team members |","lastModifiedDate":"2024-03-07"},{"lineNumber":382,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":383,"author":{"gitId":"-"},"content":"### Use cases","lastModifiedDate":"2020-06-07"},{"lineNumber":384,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":385,"author":{"gitId":"-"},"content":"(For all use cases below, the **System** is the `AddressBook` and the **Actor** is the `user`, unless specified otherwise)","lastModifiedDate":"2020-05-23"},{"lineNumber":386,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":387,"author":{"gitId":"yuechen2001"},"content":"**Use case: UC01 - Delete a contact**","lastModifiedDate":"2024-03-07"},{"lineNumber":388,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":389,"author":{"gitId":"-"},"content":"**MSS**","lastModifiedDate":"2020-05-23"},{"lineNumber":390,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":391,"author":{"gitId":"yuechen2001"},"content":"1. User requests to delete a specific contact in his list of contacts.","lastModifiedDate":"2024-03-07"},{"lineNumber":392,"author":{"gitId":"yuechen2001"},"content":"2. CodeConnect deletes the contact.","lastModifiedDate":"2024-03-07"},{"lineNumber":393,"author":{"gitId":"yuechen2001"},"content":" Use case ends.","lastModifiedDate":"2024-03-07"},{"lineNumber":394,"author":{"gitId":"yuechen2001"},"content":"","lastModifiedDate":"2024-03-07"},{"lineNumber":395,"author":{"gitId":"yuechen2001"},"content":"**Extensions**","lastModifiedDate":"2024-03-07"},{"lineNumber":396,"author":{"gitId":"yuechen2001"},"content":"","lastModifiedDate":"2024-03-07"},{"lineNumber":397,"author":{"gitId":"yuechen2001"},"content":"* 1a. The list is empty.","lastModifiedDate":"2024-03-07"},{"lineNumber":398,"author":{"gitId":"yuechen2001"},"content":" * 1a1. CodeConnect shows an error message.","lastModifiedDate":"2024-03-07"},{"lineNumber":399,"author":{"gitId":"yuechen2001"},"content":" Use case ends.","lastModifiedDate":"2024-03-07"},{"lineNumber":400,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":401,"author":{"gitId":"yuechen2001"},"content":"* 1b. The given index does not exist in CodeConnect.","lastModifiedDate":"2024-03-07"},{"lineNumber":402,"author":{"gitId":"yuechen2001"},"content":" * 1b1. CodeConnect shows an error message.","lastModifiedDate":"2024-03-07"},{"lineNumber":403,"author":{"gitId":"yuechen2001"},"content":" Use case ends.","lastModifiedDate":"2024-03-07"},{"lineNumber":404,"author":{"gitId":"yuechen2001"},"content":"","lastModifiedDate":"2024-03-07"},{"lineNumber":405,"author":{"gitId":"yuechen2001"},"content":"**Use case: UC02 - Add a contact**","lastModifiedDate":"2024-03-07"},{"lineNumber":406,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":407,"author":{"gitId":"yuechen2001"},"content":"**MSS**","lastModifiedDate":"2024-03-07"},{"lineNumber":408,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2024-03-07"},{"lineNumber":409,"author":{"gitId":"yuechen2001"},"content":"1. User requests to add a Student’s contact information into his list of contacts.","lastModifiedDate":"2024-03-07"},{"lineNumber":410,"author":{"gitId":"yuechen2001"},"content":"2. CodeConnect saves the new contact and displays it at the top of the contact list.","lastModifiedDate":"2024-03-07"},{"lineNumber":411,"author":{"gitId":"-"},"content":" Use case ends.","lastModifiedDate":"2020-05-23"},{"lineNumber":412,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":413,"author":{"gitId":"-"},"content":"**Extensions**","lastModifiedDate":"2020-05-23"},{"lineNumber":414,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":415,"author":{"gitId":"yuechen2001"},"content":"* 1a. The contact already exists in the system.","lastModifiedDate":"2024-03-07"},{"lineNumber":416,"author":{"gitId":"yuechen2001"},"content":" * 1a1. CodeConnect shows an error message.","lastModifiedDate":"2024-03-07"},{"lineNumber":417,"author":{"gitId":"yuechen2001"},"content":" Use case ends.","lastModifiedDate":"2024-03-07"},{"lineNumber":418,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":419,"author":{"gitId":"yuechen2001"},"content":"* 1b. No fields are entered.","lastModifiedDate":"2024-03-07"},{"lineNumber":420,"author":{"gitId":"yuechen2001"},"content":" * 1b1. CodeConnect shows an error message.","lastModifiedDate":"2024-03-07"},{"lineNumber":421,"author":{"gitId":"-"},"content":" Use case ends.","lastModifiedDate":"2020-05-23"},{"lineNumber":422,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":423,"author":{"gitId":"yuechen2001"},"content":"**Use case: UC03 - Update a contact**","lastModifiedDate":"2024-03-07"},{"lineNumber":424,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":425,"author":{"gitId":"yuechen2001"},"content":"**MSS**","lastModifiedDate":"2024-03-07"},{"lineNumber":426,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2024-03-07"},{"lineNumber":427,"author":{"gitId":"yuechen2001"},"content":"1. User requests to update a Student’s contact information into his list of contacts.","lastModifiedDate":"2024-03-07"},{"lineNumber":428,"author":{"gitId":"yuechen2001"},"content":"2. CodeConnect updates the contact.","lastModifiedDate":"2024-03-07"},{"lineNumber":429,"author":{"gitId":"yuechen2001"},"content":" Use case ends.","lastModifiedDate":"2024-03-07"},{"lineNumber":430,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":431,"author":{"gitId":"yuechen2001"},"content":"**Extensions**","lastModifiedDate":"2024-03-07"},{"lineNumber":432,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":433,"author":{"gitId":"yuechen2001"},"content":"* 1a. The given index to identify contact is invalid.","lastModifiedDate":"2024-03-07"},{"lineNumber":434,"author":{"gitId":"yuechen2001"},"content":" * 1a1. CodeConnect shows an error message.","lastModifiedDate":"2024-03-07"},{"lineNumber":435,"author":{"gitId":"yuechen2001"},"content":" Use case ends.","lastModifiedDate":"2024-03-07"},{"lineNumber":436,"author":{"gitId":"yuechen2001"},"content":"","lastModifiedDate":"2024-03-07"},{"lineNumber":437,"author":{"gitId":"yuechen2001"},"content":"* 1b. No fields are entered.","lastModifiedDate":"2024-03-07"},{"lineNumber":438,"author":{"gitId":"yuechen2001"},"content":" * 1b1. CodeConnect shows an error message.","lastModifiedDate":"2024-03-07"},{"lineNumber":439,"author":{"gitId":"yuechen2001"},"content":" Use case ends.","lastModifiedDate":"2024-03-07"},{"lineNumber":440,"author":{"gitId":"yuechen2001"},"content":"","lastModifiedDate":"2024-03-07"},{"lineNumber":441,"author":{"gitId":"yuechen2001"},"content":"* 1c. No fields are entered.","lastModifiedDate":"2024-03-07"},{"lineNumber":442,"author":{"gitId":"yuechen2001"},"content":" * 1b1. CodeConnect shows an error message.","lastModifiedDate":"2024-03-07"},{"lineNumber":443,"author":{"gitId":"yuechen2001"},"content":" Use case ends.","lastModifiedDate":"2024-03-07"},{"lineNumber":444,"author":{"gitId":"yuechen2001"},"content":"","lastModifiedDate":"2024-03-07"},{"lineNumber":445,"author":{"gitId":"yuechen2001"},"content":"**Use case: UC04 - View all contacts**","lastModifiedDate":"2024-03-07"},{"lineNumber":446,"author":{"gitId":"yuechen2001"},"content":"","lastModifiedDate":"2024-03-07"},{"lineNumber":447,"author":{"gitId":"yuechen2001"},"content":"**MSS**","lastModifiedDate":"2024-03-07"},{"lineNumber":448,"author":{"gitId":"yuechen2001"},"content":"","lastModifiedDate":"2024-03-07"},{"lineNumber":449,"author":{"gitId":"yuechen2001"},"content":"1. User requests to view all his contacts.","lastModifiedDate":"2024-03-07"},{"lineNumber":450,"author":{"gitId":"yuechen2001"},"content":"2. CodeConnect displays all contacts.","lastModifiedDate":"2024-03-07"},{"lineNumber":451,"author":{"gitId":"yuechen2001"},"content":" Use case ends.","lastModifiedDate":"2024-03-07"},{"lineNumber":452,"author":{"gitId":"yuechen2001"},"content":"","lastModifiedDate":"2024-03-07"},{"lineNumber":453,"author":{"gitId":"yuechen2001"},"content":"**Use case: UC05 - Search a contact by name**","lastModifiedDate":"2024-03-07"},{"lineNumber":454,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2024-03-07"},{"lineNumber":455,"author":{"gitId":"yuechen2001"},"content":"**MSS**","lastModifiedDate":"2024-03-07"},{"lineNumber":456,"author":{"gitId":"yuechen2001"},"content":"","lastModifiedDate":"2024-03-07"},{"lineNumber":457,"author":{"gitId":"yuechen2001"},"content":"1. User requests to look up contacts with a specific substring in their name.","lastModifiedDate":"2024-03-07"},{"lineNumber":458,"author":{"gitId":"yuechen2001"},"content":"2. CodeConnect checks each contact’s name in the list that contains the substring.","lastModifiedDate":"2024-03-07"},{"lineNumber":459,"author":{"gitId":"yuechen2001"},"content":"3. CodeConnect shows a list of contacts that match the criteria.","lastModifiedDate":"2024-03-07"},{"lineNumber":460,"author":{"gitId":"yuechen2001"},"content":"","lastModifiedDate":"2024-03-07"},{"lineNumber":461,"author":{"gitId":"yuechen2001"},"content":" Use case ends.","lastModifiedDate":"2024-03-07"},{"lineNumber":462,"author":{"gitId":"yuechen2001"},"content":"","lastModifiedDate":"2024-03-07"},{"lineNumber":463,"author":{"gitId":"yuechen2001"},"content":"**Extensions**","lastModifiedDate":"2024-03-07"},{"lineNumber":464,"author":{"gitId":"yuechen2001"},"content":"","lastModifiedDate":"2024-03-07"},{"lineNumber":465,"author":{"gitId":"yuechen2001"},"content":"* 1a. No substring is given.","lastModifiedDate":"2024-03-07"},{"lineNumber":466,"author":{"gitId":"yuechen2001"},"content":" * 1a1. CodeConnect shows an error message.","lastModifiedDate":"2024-03-07"},{"lineNumber":467,"author":{"gitId":"yuechen2001"},"content":" Use case ends.","lastModifiedDate":"2024-03-07"},{"lineNumber":468,"author":{"gitId":"yuechen2001"},"content":"","lastModifiedDate":"2024-03-07"},{"lineNumber":469,"author":{"gitId":"yuechen2001"},"content":"* 1b. There are no contacts in the list that match the criteria.","lastModifiedDate":"2024-03-07"},{"lineNumber":470,"author":{"gitId":"yuechen2001"},"content":" * 1b1. CodeConnect shows an empty list.","lastModifiedDate":"2024-03-07"},{"lineNumber":471,"author":{"gitId":"yuechen2001"},"content":" Use case ends.","lastModifiedDate":"2024-03-07"},{"lineNumber":472,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":473,"author":{"gitId":"-"},"content":"*{More to be added}*","lastModifiedDate":"2020-05-23"},{"lineNumber":474,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":475,"author":{"gitId":"-"},"content":"### Non-Functional Requirements","lastModifiedDate":"2020-05-23"},{"lineNumber":476,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":477,"author":{"gitId":"-"},"content":"1. Should work on any _mainstream OS_ as long as it has Java `11` or above installed.","lastModifiedDate":"2020-05-23"},{"lineNumber":478,"author":{"gitId":"angsongyee"},"content":"2. Should be portable, and be able to run without any installation process.","lastModifiedDate":"2024-03-06"},{"lineNumber":479,"author":{"gitId":"angsongyee"},"content":"3. This program should only be used by a single user. ","lastModifiedDate":"2024-03-06"},{"lineNumber":480,"author":{"gitId":"angsongyee"},"content":"4. 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.","lastModifiedDate":"2024-03-06"},{"lineNumber":481,"author":{"gitId":"angsongyee"},"content":"5. Should be able to hold up to 1000 persons without a noticeable sluggishness in performance for typical usage.","lastModifiedDate":"2024-03-06"},{"lineNumber":482,"author":{"gitId":"angsongyee"},"content":"6. Should be able to respond within 2 seconds of user input.","lastModifiedDate":"2024-03-06"},{"lineNumber":483,"author":{"gitId":"angsongyee"},"content":"7. Should be able to launch and load its saved data below 10 seconds.","lastModifiedDate":"2024-03-06"},{"lineNumber":484,"author":{"gitId":"angsongyee"},"content":"8. Should be able to run basic commands (add, list, update, delete) without a network connection.","lastModifiedDate":"2024-03-06"},{"lineNumber":485,"author":{"gitId":"angsongyee"},"content":"9. Any stored data should be in a human-readable format.","lastModifiedDate":"2024-03-06"},{"lineNumber":486,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":487,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":488,"author":{"gitId":"-"},"content":"### Glossary","lastModifiedDate":"2020-05-23"},{"lineNumber":489,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":490,"author":{"gitId":"-"},"content":"* **Mainstream OS**: Windows, Linux, Unix, MacOS","lastModifiedDate":"2024-02-09"},{"lineNumber":491,"author":{"gitId":"angsongyee"},"content":"* **Contact**: An entry that holds information about someone that the user wants to save.","lastModifiedDate":"2024-03-06"},{"lineNumber":492,"author":{"gitId":"-"},"content":"* **Private contact detail**: A contact detail that is not meant to be shared with others","lastModifiedDate":"2020-05-23"},{"lineNumber":493,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":494,"author":{"gitId":"-"},"content":"--------------------------------------------------------------------------------------------------------------------","lastModifiedDate":"2020-05-23"},{"lineNumber":495,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":496,"author":{"gitId":"-"},"content":"## **Appendix: Instructions for manual testing**","lastModifiedDate":"2020-05-23"},{"lineNumber":497,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":498,"author":{"gitId":"-"},"content":"Given below are instructions to test the app manually.","lastModifiedDate":"2020-05-23"},{"lineNumber":499,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":500,"author":{"gitId":"-"},"content":"\u003cbox type\u003d\"info\" seamless\u003e","lastModifiedDate":"2023-09-12"},{"lineNumber":501,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2023-09-12"},{"lineNumber":502,"author":{"gitId":"-"},"content":"**Note:** These instructions only provide a starting point for testers to work on;","lastModifiedDate":"2023-09-12"},{"lineNumber":503,"author":{"gitId":"-"},"content":"testers are expected to do more *exploratory* testing.","lastModifiedDate":"2020-05-23"},{"lineNumber":504,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":505,"author":{"gitId":"-"},"content":"\u003c/box\u003e","lastModifiedDate":"2023-09-12"},{"lineNumber":506,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":507,"author":{"gitId":"-"},"content":"### Launch and shutdown","lastModifiedDate":"2020-05-23"},{"lineNumber":508,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":509,"author":{"gitId":"-"},"content":"1. Initial launch","lastModifiedDate":"2020-05-23"},{"lineNumber":510,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":511,"author":{"gitId":"-"},"content":" 1. Download the jar file and copy into an empty folder","lastModifiedDate":"2020-05-23"},{"lineNumber":512,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":513,"author":{"gitId":"yuechen2001"},"content":" 1. Double-click the jar file Expected: Shows the GUI with a set of sample contacts. The window size may not be","lastModifiedDate":"2024-03-07"},{"lineNumber":514,"author":{"gitId":"yuechen2001"},"content":" optimum.","lastModifiedDate":"2024-03-07"},{"lineNumber":515,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":516,"author":{"gitId":"-"},"content":"1. Saving window preferences","lastModifiedDate":"2020-05-23"},{"lineNumber":517,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":518,"author":{"gitId":"-"},"content":" 1. Resize the window to an optimum size. Move the window to a different location. Close the window.","lastModifiedDate":"2020-05-23"},{"lineNumber":519,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":520,"author":{"gitId":"-"},"content":" 1. Re-launch the app by double-clicking the jar file.\u003cbr\u003e","lastModifiedDate":"2020-05-23"},{"lineNumber":521,"author":{"gitId":"-"},"content":" Expected: The most recent window size and location is retained.","lastModifiedDate":"2020-05-23"},{"lineNumber":522,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":523,"author":{"gitId":"-"},"content":"1. _{ more test cases …​ }_","lastModifiedDate":"2020-05-23"},{"lineNumber":524,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":525,"author":{"gitId":"-"},"content":"### Deleting a person","lastModifiedDate":"2020-05-23"},{"lineNumber":526,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":527,"author":{"gitId":"-"},"content":"1. Deleting a person while all persons are being shown","lastModifiedDate":"2020-05-23"},{"lineNumber":528,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":529,"author":{"gitId":"-"},"content":" 1. Prerequisites: List all persons using the `list` command. Multiple persons in the list.","lastModifiedDate":"2020-05-23"},{"lineNumber":530,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":531,"author":{"gitId":"-"},"content":" 1. Test case: `delete 1`\u003cbr\u003e","lastModifiedDate":"2020-05-23"},{"lineNumber":532,"author":{"gitId":"yuechen2001"},"content":" Expected: First contact is deleted from the list. Details of the deleted contact shown in the status message.","lastModifiedDate":"2024-03-07"},{"lineNumber":533,"author":{"gitId":"yuechen2001"},"content":" Timestamp in the status bar is updated.","lastModifiedDate":"2024-03-07"},{"lineNumber":534,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":535,"author":{"gitId":"-"},"content":" 1. Test case: `delete 0`\u003cbr\u003e","lastModifiedDate":"2020-05-23"},{"lineNumber":536,"author":{"gitId":"-"},"content":" Expected: No person is deleted. Error details shown in the status message. Status bar remains the same.","lastModifiedDate":"2020-05-23"},{"lineNumber":537,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":538,"author":{"gitId":"-"},"content":" 1. Other incorrect delete commands to try: `delete`, `delete x`, `...` (where x is larger than the list size)\u003cbr\u003e","lastModifiedDate":"2020-05-23"},{"lineNumber":539,"author":{"gitId":"-"},"content":" Expected: Similar to previous.","lastModifiedDate":"2020-05-23"},{"lineNumber":540,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":541,"author":{"gitId":"-"},"content":"1. _{ more test cases …​ }_","lastModifiedDate":"2020-05-23"},{"lineNumber":542,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":543,"author":{"gitId":"-"},"content":"### Saving data","lastModifiedDate":"2020-05-23"},{"lineNumber":544,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":545,"author":{"gitId":"-"},"content":"1. Dealing with missing/corrupted data files","lastModifiedDate":"2020-05-23"},{"lineNumber":546,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":547,"author":{"gitId":"-"},"content":" 1. _{explain how to simulate a missing/corrupted file, and the expected behavior}_","lastModifiedDate":"2020-05-23"},{"lineNumber":548,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":549,"author":{"gitId":"-"},"content":"1. _{ more test cases …​ }_","lastModifiedDate":"2020-05-23"}],"authorContributionMap":{"yuechen2001":202,"angsongyee":9,"-":338}},{"path":"docs/UserGuide.md","fileType":"docs","lines":[{"lineNumber":1,"author":{"gitId":"-"},"content":"---","lastModifiedDate":"2020-05-23"},{"lineNumber":2,"author":{"gitId":"-"},"content":" layout: default.md","lastModifiedDate":"2023-09-12"},{"lineNumber":3,"author":{"gitId":"-"},"content":" title: \"User Guide\"","lastModifiedDate":"2023-09-12"},{"lineNumber":4,"author":{"gitId":"-"},"content":" pageNav: 3","lastModifiedDate":"2023-09-12"},{"lineNumber":5,"author":{"gitId":"-"},"content":"---","lastModifiedDate":"2020-05-23"},{"lineNumber":6,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":7,"author":{"gitId":"yuechen2001"},"content":"# CodeConnect User Guide","lastModifiedDate":"2024-03-07"},{"lineNumber":8,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":9,"author":{"gitId":"maiyasaliha"},"content":"","lastModifiedDate":"2024-03-07"},{"lineNumber":10,"author":{"gitId":"yuechen2001"},"content":"CodeConnect aims to let student developers keep track of and reach out easily to other student developers with relevant skills for collaboration opportunities or recommendations.","lastModifiedDate":"2024-03-07"},{"lineNumber":11,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2023-09-12"},{"lineNumber":12,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2023-09-12"},{"lineNumber":13,"author":{"gitId":"-"},"content":"\u003c!-- * Table of Contents --\u003e","lastModifiedDate":"2023-09-12"},{"lineNumber":14,"author":{"gitId":"-"},"content":"\u003cpage-nav-print /\u003e","lastModifiedDate":"2023-09-12"},{"lineNumber":15,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":16,"author":{"gitId":"-"},"content":"--------------------------------------------------------------------------------------------------------------------","lastModifiedDate":"2020-05-23"},{"lineNumber":17,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":18,"author":{"gitId":"-"},"content":"## Quick start","lastModifiedDate":"2020-05-23"},{"lineNumber":19,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":20,"author":{"gitId":"-"},"content":"1. Ensure you have Java `11` or above installed in your Computer.","lastModifiedDate":"2020-05-23"},{"lineNumber":21,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":22,"author":{"gitId":"-"},"content":"1. Download the latest `addressbook.jar` from [here](https://github.com/se-edu/addressbook-level3/releases).","lastModifiedDate":"2020-05-23"},{"lineNumber":23,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":24,"author":{"gitId":"-"},"content":"1. Copy the file to the folder you want to use as the _home folder_ for your AddressBook.","lastModifiedDate":"2020-05-23"},{"lineNumber":25,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":26,"author":{"gitId":"-"},"content":"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.\u003cbr\u003e","lastModifiedDate":"2023-01-01"},{"lineNumber":27,"author":{"gitId":"-"},"content":" A GUI similar to the below should appear in a few seconds. Note how the app contains some sample data.\u003cbr\u003e","lastModifiedDate":"2023-01-01"},{"lineNumber":28,"author":{"gitId":"-"},"content":" ![Ui](images/Ui.png)","lastModifiedDate":"2020-05-23"},{"lineNumber":29,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":30,"author":{"gitId":"-"},"content":"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.\u003cbr\u003e","lastModifiedDate":"2020-05-23"},{"lineNumber":31,"author":{"gitId":"-"},"content":" Some example commands you can try:","lastModifiedDate":"2020-05-23"},{"lineNumber":32,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":33,"author":{"gitId":"-"},"content":" * `list` : Lists all contacts.","lastModifiedDate":"2023-01-01"},{"lineNumber":34,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":35,"author":{"gitId":"Teee728"},"content":" * `add n/John Doe p/98765432 e/johnd@example.com a/John street, block 123, #01-01 g/johnDoee ts/Java` : Adds a contact named `John Doe` to the Address Book.","lastModifiedDate":"2024-03-06"},{"lineNumber":36,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":37,"author":{"gitId":"-"},"content":" * `delete 3` : Deletes the 3rd contact shown in the current list.","lastModifiedDate":"2023-01-01"},{"lineNumber":38,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":39,"author":{"gitId":"-"},"content":" * `clear` : Deletes all contacts.","lastModifiedDate":"2023-01-01"},{"lineNumber":40,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":41,"author":{"gitId":"-"},"content":" * `exit` : Exits the app.","lastModifiedDate":"2023-01-01"},{"lineNumber":42,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":43,"author":{"gitId":"-"},"content":"1. Refer to the [Features](#features) below for details of each command.","lastModifiedDate":"2020-05-23"},{"lineNumber":44,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":45,"author":{"gitId":"-"},"content":"--------------------------------------------------------------------------------------------------------------------","lastModifiedDate":"2020-05-23"},{"lineNumber":46,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":47,"author":{"gitId":"-"},"content":"## Features","lastModifiedDate":"2020-05-23"},{"lineNumber":48,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":49,"author":{"gitId":"-"},"content":"\u003cbox type\u003d\"info\" seamless\u003e","lastModifiedDate":"2023-09-12"},{"lineNumber":50,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":51,"author":{"gitId":"-"},"content":"**Notes about the command format:**\u003cbr\u003e","lastModifiedDate":"2023-09-12"},{"lineNumber":52,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":53,"author":{"gitId":"-"},"content":"* Words in `UPPER_CASE` are the parameters to be supplied by the user.\u003cbr\u003e","lastModifiedDate":"2020-05-23"},{"lineNumber":54,"author":{"gitId":"-"},"content":" e.g. in `add n/NAME`, `NAME` is a parameter which can be used as `add n/John Doe`.","lastModifiedDate":"2020-05-23"},{"lineNumber":55,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":56,"author":{"gitId":"-"},"content":"* Items in square brackets are optional.\u003cbr\u003e","lastModifiedDate":"2020-05-23"},{"lineNumber":57,"author":{"gitId":"Teee728"},"content":" e.g `n/NAME [t/TAG] [ts/TECH_STACK]` can be used as `n/John Doe t/friend ts/Java` or as `n/John Doe`.","lastModifiedDate":"2024-03-06"},{"lineNumber":58,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":59,"author":{"gitId":"-"},"content":"* Items with `…`​ after them can be used multiple times including zero times.\u003cbr\u003e","lastModifiedDate":"2020-05-23"},{"lineNumber":60,"author":{"gitId":"-"},"content":" e.g. `[t/TAG]…​` can be used as ` ` (i.e. 0 times), `t/friend`, `t/friend t/family` etc.","lastModifiedDate":"2020-05-23"},{"lineNumber":61,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":62,"author":{"gitId":"-"},"content":"* Parameters can be in any order.\u003cbr\u003e","lastModifiedDate":"2020-05-23"},{"lineNumber":63,"author":{"gitId":"-"},"content":" e.g. if the command specifies `n/NAME p/PHONE_NUMBER`, `p/PHONE_NUMBER n/NAME` is also acceptable.","lastModifiedDate":"2020-05-23"},{"lineNumber":64,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":65,"author":{"gitId":"-"},"content":"* Extraneous parameters for commands that do not take in parameters (such as `help`, `list`, `exit` and `clear`) will be ignored.\u003cbr\u003e","lastModifiedDate":"2021-02-03"},{"lineNumber":66,"author":{"gitId":"-"},"content":" e.g. if the command specifies `help 123`, it will be interpreted as `help`.","lastModifiedDate":"2021-02-03"},{"lineNumber":67,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2021-02-03"},{"lineNumber":68,"author":{"gitId":"-"},"content":"* 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.","lastModifiedDate":"2023-06-26"},{"lineNumber":69,"author":{"gitId":"-"},"content":"\u003c/box\u003e","lastModifiedDate":"2023-09-12"},{"lineNumber":70,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":71,"author":{"gitId":"-"},"content":"### Viewing help : `help`","lastModifiedDate":"2020-05-23"},{"lineNumber":72,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":73,"author":{"gitId":"-"},"content":"Shows a message explaning how to access the help page.","lastModifiedDate":"2020-05-23"},{"lineNumber":74,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":75,"author":{"gitId":"-"},"content":"![help message](images/helpMessage.png)","lastModifiedDate":"2020-05-23"},{"lineNumber":76,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":77,"author":{"gitId":"-"},"content":"Format: `help`","lastModifiedDate":"2020-05-23"},{"lineNumber":78,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":79,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":80,"author":{"gitId":"Teee728"},"content":"### Adding a contact: `add`","lastModifiedDate":"2024-03-06"},{"lineNumber":81,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":82,"author":{"gitId":"Teee728"},"content":"Adds a contact to the address book.","lastModifiedDate":"2024-03-06"},{"lineNumber":83,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":84,"author":{"gitId":"Teee728"},"content":"Format: `add n/NAME p/PHONE_NUMBER e/EMAIL a/ADDRESS g/GITHUB_USERNAME [t/TAG] [ts/TECH_STACK]…​`","lastModifiedDate":"2024-03-07"},{"lineNumber":85,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":86,"author":{"gitId":"-"},"content":"\u003cbox type\u003d\"tip\" seamless\u003e","lastModifiedDate":"2023-09-12"},{"lineNumber":87,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2023-09-12"},{"lineNumber":88,"author":{"gitId":"Teee728"},"content":"**Tip:** A contact can have any number of tags and tech stack (including 0)","lastModifiedDate":"2024-03-06"},{"lineNumber":89,"author":{"gitId":"-"},"content":"\u003c/box\u003e","lastModifiedDate":"2023-09-12"},{"lineNumber":90,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":91,"author":{"gitId":"-"},"content":"Examples:","lastModifiedDate":"2020-05-23"},{"lineNumber":92,"author":{"gitId":"Teee728"},"content":"* `add n/John Doe p/98765432 e/johnd@example.com a/John street, block 123, #01-01 g/johnDoee`","lastModifiedDate":"2024-03-06"},{"lineNumber":93,"author":{"gitId":"Teee728"},"content":"* `add n/Betsy Crowe t/friend e/betsycrowe@example.com a/Newgate Prison p/1234567 g/betBetty t/criminal ts/Flutter`","lastModifiedDate":"2024-03-06"},{"lineNumber":94,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":95,"author":{"gitId":"-"},"content":"### Listing all persons : `list`","lastModifiedDate":"2020-05-23"},{"lineNumber":96,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":97,"author":{"gitId":"-"},"content":"Shows a list of all persons in the address book.","lastModifiedDate":"2020-05-23"},{"lineNumber":98,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":99,"author":{"gitId":"-"},"content":"Format: `list`","lastModifiedDate":"2020-05-23"},{"lineNumber":100,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":101,"author":{"gitId":"-"},"content":"### Editing a person : `edit`","lastModifiedDate":"2020-05-23"},{"lineNumber":102,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":103,"author":{"gitId":"-"},"content":"Edits an existing person in the address book.","lastModifiedDate":"2020-05-23"},{"lineNumber":104,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":105,"author":{"gitId":"angsongyee"},"content":"Format: `edit INDEX [n/NAME] [p/PHONE] [e/EMAIL] [a/ADDRESS] [g/GITHUB_USERNAME] [t/TAG]…​ [ts/TECH_STACK]…​`","lastModifiedDate":"2024-03-07"},{"lineNumber":106,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":107,"author":{"gitId":"-"},"content":"* 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, …​","lastModifiedDate":"2020-05-23"},{"lineNumber":108,"author":{"gitId":"-"},"content":"* At least one of the optional fields must be provided.","lastModifiedDate":"2020-05-23"},{"lineNumber":109,"author":{"gitId":"-"},"content":"* Existing values will be updated to the input values.","lastModifiedDate":"2020-05-23"},{"lineNumber":110,"author":{"gitId":"-"},"content":"* When editing tags, the existing tags of the person will be removed i.e adding of tags is not cumulative.","lastModifiedDate":"2020-05-23"},{"lineNumber":111,"author":{"gitId":"Teee728"},"content":"* You can remove all the person’s tags and tech stack by typing `t/` and `/ts` without","lastModifiedDate":"2024-03-07"},{"lineNumber":112,"author":{"gitId":"-"},"content":" specifying any tags after it.","lastModifiedDate":"2020-05-23"},{"lineNumber":113,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":114,"author":{"gitId":"-"},"content":"Examples:","lastModifiedDate":"2020-05-23"},{"lineNumber":115,"author":{"gitId":"-"},"content":"* `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.","lastModifiedDate":"2020-05-23"},{"lineNumber":116,"author":{"gitId":"-"},"content":"* `edit 2 n/Betsy Crower t/` Edits the name of the 2nd person to be `Betsy Crower` and clears all existing tags.","lastModifiedDate":"2020-05-23"},{"lineNumber":117,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":118,"author":{"gitId":"-"},"content":"### Locating persons by name: `find`","lastModifiedDate":"2020-05-23"},{"lineNumber":119,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":120,"author":{"gitId":"-"},"content":"Finds persons whose names contain any of the given keywords.","lastModifiedDate":"2020-05-23"},{"lineNumber":121,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":122,"author":{"gitId":"-"},"content":"Format: `find KEYWORD [MORE_KEYWORDS]`","lastModifiedDate":"2020-05-23"},{"lineNumber":123,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":124,"author":{"gitId":"-"},"content":"* The search is case-insensitive. e.g `hans` will match `Hans`","lastModifiedDate":"2020-05-23"},{"lineNumber":125,"author":{"gitId":"-"},"content":"* The order of the keywords does not matter. e.g. `Hans Bo` will match `Bo Hans`","lastModifiedDate":"2020-05-23"},{"lineNumber":126,"author":{"gitId":"-"},"content":"* Only the name is searched.","lastModifiedDate":"2020-05-23"},{"lineNumber":127,"author":{"gitId":"-"},"content":"* Only full words will be matched e.g. `Han` will not match `Hans`","lastModifiedDate":"2020-05-23"},{"lineNumber":128,"author":{"gitId":"-"},"content":"* Persons matching at least one keyword will be returned (i.e. `OR` search).","lastModifiedDate":"2020-05-23"},{"lineNumber":129,"author":{"gitId":"-"},"content":" e.g. `Hans Bo` will return `Hans Gruber`, `Bo Yang`","lastModifiedDate":"2020-05-23"},{"lineNumber":130,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":131,"author":{"gitId":"-"},"content":"Examples:","lastModifiedDate":"2020-05-23"},{"lineNumber":132,"author":{"gitId":"-"},"content":"* `find John` returns `john` and `John Doe`","lastModifiedDate":"2020-05-23"},{"lineNumber":133,"author":{"gitId":"-"},"content":"* `find alex david` returns `Alex Yeoh`, `David Li`\u003cbr\u003e","lastModifiedDate":"2020-05-23"},{"lineNumber":134,"author":{"gitId":"-"},"content":" ![result for \u0027find alex david\u0027](images/findAlexDavidResult.png)","lastModifiedDate":"2020-05-23"},{"lineNumber":135,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":136,"author":{"gitId":"maiyasaliha"},"content":"### Deleting a contact : `delete`","lastModifiedDate":"2024-03-06"},{"lineNumber":137,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":138,"author":{"gitId":"maiyasaliha"},"content":"Deletes the specified contact from the address book.","lastModifiedDate":"2024-03-06"},{"lineNumber":139,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":140,"author":{"gitId":"-"},"content":"Format: `delete INDEX`","lastModifiedDate":"2020-05-23"},{"lineNumber":141,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":142,"author":{"gitId":"maiyasaliha"},"content":"* Deletes the contact at the specified `INDEX`.","lastModifiedDate":"2024-03-06"},{"lineNumber":143,"author":{"gitId":"maiyasaliha"},"content":"* The index refers to the index number shown in the displayed contact list.","lastModifiedDate":"2024-03-06"},{"lineNumber":144,"author":{"gitId":"-"},"content":"* The index **must be a positive integer** 1, 2, 3, …​","lastModifiedDate":"2020-05-23"},{"lineNumber":145,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":146,"author":{"gitId":"-"},"content":"Examples:","lastModifiedDate":"2020-05-23"},{"lineNumber":147,"author":{"gitId":"maiyasaliha"},"content":"* `list` followed by `delete 2` deletes the 2nd contact in the address book.","lastModifiedDate":"2024-03-06"},{"lineNumber":148,"author":{"gitId":"maiyasaliha"},"content":"* `find Betsy` followed by `delete 1` deletes the 1st contact in the results of the `find` command.","lastModifiedDate":"2024-03-06"},{"lineNumber":149,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":150,"author":{"gitId":"-"},"content":"### Clearing all entries : `clear`","lastModifiedDate":"2020-05-23"},{"lineNumber":151,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":152,"author":{"gitId":"-"},"content":"Clears all entries from the address book.","lastModifiedDate":"2020-05-23"},{"lineNumber":153,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":154,"author":{"gitId":"-"},"content":"Format: `clear`","lastModifiedDate":"2020-05-23"},{"lineNumber":155,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":156,"author":{"gitId":"-"},"content":"### Exiting the program : `exit`","lastModifiedDate":"2020-05-23"},{"lineNumber":157,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":158,"author":{"gitId":"-"},"content":"Exits the program.","lastModifiedDate":"2020-05-23"},{"lineNumber":159,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":160,"author":{"gitId":"-"},"content":"Format: `exit`","lastModifiedDate":"2020-05-23"},{"lineNumber":161,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":162,"author":{"gitId":"-"},"content":"### Saving the data","lastModifiedDate":"2020-05-23"},{"lineNumber":163,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":164,"author":{"gitId":"-"},"content":"AddressBook data are saved in the hard disk automatically after any command that changes the data. There is no need to save manually.","lastModifiedDate":"2020-05-23"},{"lineNumber":165,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":166,"author":{"gitId":"-"},"content":"### Editing the data file","lastModifiedDate":"2021-02-04"},{"lineNumber":167,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2021-02-04"},{"lineNumber":168,"author":{"gitId":"-"},"content":"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.","lastModifiedDate":"2023-09-08"},{"lineNumber":169,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2021-02-04"},{"lineNumber":170,"author":{"gitId":"-"},"content":"\u003cbox type\u003d\"warning\" seamless\u003e","lastModifiedDate":"2023-09-12"},{"lineNumber":171,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2023-09-12"},{"lineNumber":172,"author":{"gitId":"-"},"content":"**Caution:**","lastModifiedDate":"2023-09-12"},{"lineNumber":173,"author":{"gitId":"-"},"content":"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.\u003cbr\u003e","lastModifiedDate":"2024-02-09"},{"lineNumber":174,"author":{"gitId":"-"},"content":"Furthermore, certain edits can cause the AddressBook to behave in unexpected ways (e.g., if a value entered is outside the acceptable range). Therefore, edit the data file only if you are confident that you can update it correctly.","lastModifiedDate":"2023-09-12"},{"lineNumber":175,"author":{"gitId":"-"},"content":"\u003c/box\u003e","lastModifiedDate":"2023-09-12"},{"lineNumber":176,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2021-02-04"},{"lineNumber":177,"author":{"gitId":"-"},"content":"### Archiving data files `[coming in v2.0]`","lastModifiedDate":"2020-05-23"},{"lineNumber":178,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":179,"author":{"gitId":"-"},"content":"_Details coming soon ..._","lastModifiedDate":"2021-02-04"},{"lineNumber":180,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":181,"author":{"gitId":"-"},"content":"--------------------------------------------------------------------------------------------------------------------","lastModifiedDate":"2020-05-23"},{"lineNumber":182,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":183,"author":{"gitId":"-"},"content":"## FAQ","lastModifiedDate":"2020-05-23"},{"lineNumber":184,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":185,"author":{"gitId":"-"},"content":"**Q**: How do I transfer my data to another Computer?\u003cbr\u003e","lastModifiedDate":"2020-05-23"},{"lineNumber":186,"author":{"gitId":"-"},"content":"**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.","lastModifiedDate":"2020-05-23"},{"lineNumber":187,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":188,"author":{"gitId":"-"},"content":"--------------------------------------------------------------------------------------------------------------------","lastModifiedDate":"2020-05-23"},{"lineNumber":189,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":190,"author":{"gitId":"-"},"content":"## Known issues","lastModifiedDate":"2023-09-08"},{"lineNumber":191,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2023-09-08"},{"lineNumber":192,"author":{"gitId":"-"},"content":"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.","lastModifiedDate":"2023-09-08"},{"lineNumber":193,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2023-09-08"},{"lineNumber":194,"author":{"gitId":"-"},"content":"--------------------------------------------------------------------------------------------------------------------","lastModifiedDate":"2023-09-08"},{"lineNumber":195,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2023-09-08"},{"lineNumber":196,"author":{"gitId":"-"},"content":"## Command summary","lastModifiedDate":"2020-05-23"},{"lineNumber":197,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":198,"author":{"gitId":"angsongyee"},"content":"| Action | Format, Examples |","lastModifiedDate":"2024-03-07"},{"lineNumber":199,"author":{"gitId":"angsongyee"},"content":"|------------|-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------|","lastModifiedDate":"2024-03-07"},{"lineNumber":200,"author":{"gitId":"angsongyee"},"content":"| **Add** | `add n/NAME p/PHONE_NUMBER e/EMAIL a/ADDRESS g/GITHUB_USERNAME [t/TAG] [ts/TECH_STACK]…​` \u003cbr\u003e e.g., `add n/James Ho p/22224444 e/jamesho@example.com a/123, Clementi Rd, 1234665 g/Jamesho123 t/friend t/colleague ts/Java ts/C++` |","lastModifiedDate":"2024-03-07"},{"lineNumber":201,"author":{"gitId":"angsongyee"},"content":"| **Clear** | `clear` |","lastModifiedDate":"2024-03-07"},{"lineNumber":202,"author":{"gitId":"angsongyee"},"content":"| **Delete** | `delete INDEX`\u003cbr\u003e e.g., `delete 3` |","lastModifiedDate":"2024-03-07"},{"lineNumber":203,"author":{"gitId":"angsongyee"},"content":"| **Edit** | `edit INDEX [n/NAME] [p/PHONE_NUMBER] [e/EMAIL] [a/ADDRESS] [g/GITHUB_USERNAME] [t/TAG]…​ [ts/TECH_STACK]…​ `\u003cbr\u003e e.g.,`edit 2 n/James Lee e/jameslee@example.com` |","lastModifiedDate":"2024-03-07"},{"lineNumber":204,"author":{"gitId":"angsongyee"},"content":"| **Find** | `find KEYWORD [MORE_KEYWORDS]`\u003cbr\u003e e.g., `find James Jake` |","lastModifiedDate":"2024-03-07"},{"lineNumber":205,"author":{"gitId":"angsongyee"},"content":"| **List** | `list` |","lastModifiedDate":"2024-03-07"},{"lineNumber":206,"author":{"gitId":"angsongyee"},"content":"| **Help** | `help` |","lastModifiedDate":"2024-03-07"}],"authorContributionMap":{"yuechen2001":2,"angsongyee":10,"maiyasaliha":7,"Teee728":9,"-":178}}] +[{"path":"README.md","fileType":"docs","lines":[{"lineNumber":1,"author":{"gitId":"tanguoyang"},"content":"[![CI Status](https://github.com/AY2324S2-CS2103T-T12-1/tp/workflows/Java%20CI/badge.svg)](https://github.com/AY2324S2-CS2103T-T12-1/tp/actions)","lastModifiedDate":"2024-03-07"},{"lineNumber":2,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":3,"author":{"gitId":"-"},"content":"![Ui](docs/images/Ui.png)","lastModifiedDate":"2020-05-23"},{"lineNumber":4,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":5,"author":{"gitId":"tanguoyang"},"content":"","lastModifiedDate":"2024-03-07"},{"lineNumber":6,"author":{"gitId":"tanguoyang"},"content":"","lastModifiedDate":"2024-03-07"},{"lineNumber":7,"author":{"gitId":"tanguoyang"},"content":"**Product Name**","lastModifiedDate":"2024-03-07"},{"lineNumber":8,"author":{"gitId":"tanguoyang"},"content":"\u003eCodeConnect","lastModifiedDate":"2024-03-07"},{"lineNumber":9,"author":{"gitId":"tanguoyang"},"content":"","lastModifiedDate":"2024-03-07"},{"lineNumber":10,"author":{"gitId":"tanguoyang"},"content":"**Target User**","lastModifiedDate":"2024-03-07"},{"lineNumber":11,"author":{"gitId":"tanguoyang"},"content":"\u003eStudent Developer","lastModifiedDate":"2024-03-07"},{"lineNumber":12,"author":{"gitId":"tanguoyang"},"content":"","lastModifiedDate":"2024-03-07"},{"lineNumber":13,"author":{"gitId":"tanguoyang"},"content":"**Value Proposition**","lastModifiedDate":"2024-03-07"},{"lineNumber":14,"author":{"gitId":"tanguoyang"},"content":"\u003eCodeConnect aims to let student developers keep track of and reach out easily to other student developers with relevant skills for collaboration opportunities or recommendations.","lastModifiedDate":"2024-03-07"},{"lineNumber":15,"author":{"gitId":"tanguoyang"},"content":"","lastModifiedDate":"2024-03-07"},{"lineNumber":16,"author":{"gitId":"tanguoyang"},"content":"Project notes (internal): [see here](https://docs.google.com/document/d/1wDRApxjKgLv_gZx7Fe1u0XLsa73Taj0THSegizHslss/edit#heading\u003dh.gue37j8ig519)","lastModifiedDate":"2024-03-07"},{"lineNumber":17,"author":{"gitId":"tanguoyang"},"content":"","lastModifiedDate":"2024-03-07"},{"lineNumber":18,"author":{"gitId":"tanguoyang"},"content":"This project is based on the AddressBook-Level3 project created by the [SE-EDU initiative](https://se-education.org).","lastModifiedDate":"2024-03-07"},{"lineNumber":19,"author":{"gitId":"tanguoyang"},"content":"","lastModifiedDate":"2024-03-07"}],"authorContributionMap":{"tanguoyang":16,"-":3}},{"path":"docs/AboutUs.md","fileType":"docs","lines":[{"lineNumber":1,"author":{"gitId":"-"},"content":"---","lastModifiedDate":"2020-05-23"},{"lineNumber":2,"author":{"gitId":"-"},"content":" layout: default.md","lastModifiedDate":"2023-09-12"},{"lineNumber":3,"author":{"gitId":"-"},"content":" title: \"About Us\"","lastModifiedDate":"2023-09-12"},{"lineNumber":4,"author":{"gitId":"-"},"content":"---","lastModifiedDate":"2020-05-23"},{"lineNumber":5,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":6,"author":{"gitId":"-"},"content":"# About Us","lastModifiedDate":"2023-09-12"},{"lineNumber":7,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2023-09-12"},{"lineNumber":8,"author":{"gitId":"-"},"content":"We are a team based in the [School of Computing, National University of Singapore](http://www.comp.nus.edu.sg).","lastModifiedDate":"2020-05-23"},{"lineNumber":9,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":10,"author":{"gitId":"-"},"content":"## Project team","lastModifiedDate":"2020-06-07"},{"lineNumber":11,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":12,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":13,"author":{"gitId":"tanguoyang"},"content":"### Guo Yang","lastModifiedDate":"2024-03-07"},{"lineNumber":14,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":15,"author":{"gitId":"tanguoyang"},"content":"\u003cimg src\u003d\"images/tanguoyang.png\" width\u003d\"200px\"\u003e","lastModifiedDate":"2024-03-07"},{"lineNumber":16,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":17,"author":{"gitId":"tanguoyang"},"content":"[[github](http://github.com/tanguoyang)]","lastModifiedDate":"2024-03-07"},{"lineNumber":18,"author":{"gitId":"-"},"content":" ","lastModifiedDate":"2020-05-23"},{"lineNumber":19,"author":{"gitId":"tanguoyang"},"content":"* Role: Team Lead","lastModifiedDate":"2024-03-07"},{"lineNumber":20,"author":{"gitId":"tanguoyang"},"content":"* Responsibilities: Tracking deliverables","lastModifiedDate":"2024-03-07"},{"lineNumber":21,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":22,"author":{"gitId":"tanguoyang"},"content":"### Song Yee","lastModifiedDate":"2024-03-07"},{"lineNumber":23,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":24,"author":{"gitId":"tanguoyang"},"content":"\u003cimg src\u003d\"images/angsongyee.png\" width\u003d\"200px\"\u003e","lastModifiedDate":"2024-03-07"},{"lineNumber":25,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":26,"author":{"gitId":"tanguoyang"},"content":"[[github](http://github.com/angsongyee)] ","lastModifiedDate":"2024-03-07"},{"lineNumber":27,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2024-03-07"},{"lineNumber":28,"author":{"gitId":"tanguoyang"},"content":"* Role: Git Expert","lastModifiedDate":"2024-03-07"},{"lineNumber":29,"author":{"gitId":"tanguoyang"},"content":"* Responsibilities: Ensure that good Git practices are adhered to","lastModifiedDate":"2024-03-07"},{"lineNumber":30,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":31,"author":{"gitId":"tanguoyang"},"content":"### Tresa","lastModifiedDate":"2024-03-07"},{"lineNumber":32,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":33,"author":{"gitId":"tanguoyang"},"content":"\u003cimg src\u003d\"images/Teee728.png\" width\u003d\"200px\"\u003e","lastModifiedDate":"2024-03-08"},{"lineNumber":34,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":35,"author":{"gitId":"tanguoyang"},"content":"[[github](http://github.com/Teee728)]","lastModifiedDate":"2024-03-07"},{"lineNumber":36,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":37,"author":{"gitId":"tanguoyang"},"content":"* Role: Testing IC","lastModifiedDate":"2024-03-07"},{"lineNumber":38,"author":{"gitId":"tanguoyang"},"content":"* Responsibilities: Ensure features are well tested","lastModifiedDate":"2024-03-07"},{"lineNumber":39,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":40,"author":{"gitId":"tanguoyang"},"content":"### Sumaiya","lastModifiedDate":"2024-03-07"},{"lineNumber":41,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":42,"author":{"gitId":"tanguoyang"},"content":"\u003cimg src\u003d\"images/maiyasaliha.png\" width\u003d\"200px\"\u003e","lastModifiedDate":"2024-03-07"},{"lineNumber":43,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":44,"author":{"gitId":"tanguoyang"},"content":"[[github](http://github.com/maiyasaliha)]","lastModifiedDate":"2024-03-07"},{"lineNumber":45,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":46,"author":{"gitId":"tanguoyang"},"content":"* Role: Code Quality IC","lastModifiedDate":"2024-03-07"},{"lineNumber":47,"author":{"gitId":"tanguoyang"},"content":"* Responsibilities: Ensures that good code quality","lastModifiedDate":"2024-03-07"},{"lineNumber":48,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":49,"author":{"gitId":"tanguoyang"},"content":"### Yuechen","lastModifiedDate":"2024-03-07"},{"lineNumber":50,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":51,"author":{"gitId":"tanguoyang"},"content":"\u003cimg src\u003d\"images/yuechen2001.png\" width\u003d\"200px\"\u003e","lastModifiedDate":"2024-03-07"},{"lineNumber":52,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":53,"author":{"gitId":"tanguoyang"},"content":"[[github](http://github.com/yuechen2001)]","lastModifiedDate":"2024-03-07"},{"lineNumber":54,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":55,"author":{"gitId":"tanguoyang"},"content":"* Role: Documentation IC","lastModifiedDate":"2024-03-07"},{"lineNumber":56,"author":{"gitId":"tanguoyang"},"content":"* Responsibilities: Ensures that features are well documented","lastModifiedDate":"2024-03-07"}],"authorContributionMap":{"tanguoyang":25,"-":31}},{"path":"docs/DeveloperGuide.md","fileType":"docs","lines":[{"lineNumber":1,"author":{"gitId":"-"},"content":"---","lastModifiedDate":"2020-05-23"},{"lineNumber":2,"author":{"gitId":"-"},"content":"layout: default.md","lastModifiedDate":"2023-09-12"},{"lineNumber":3,"author":{"gitId":"-"},"content":"title: \"Developer Guide\"","lastModifiedDate":"2023-09-12"},{"lineNumber":4,"author":{"gitId":"-"},"content":"pageNav: 3","lastModifiedDate":"2023-09-12"},{"lineNumber":5,"author":{"gitId":"-"},"content":"---","lastModifiedDate":"2020-05-23"},{"lineNumber":6,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2023-09-12"},{"lineNumber":7,"author":{"gitId":"yuechen2001"},"content":"# CodeConnect Developer Guide","lastModifiedDate":"2024-03-07"},{"lineNumber":8,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2023-09-12"},{"lineNumber":9,"author":{"gitId":"-"},"content":"\u003c!-- * Table of Contents --\u003e","lastModifiedDate":"2023-09-12"},{"lineNumber":10,"author":{"gitId":"-"},"content":"\u003cpage-nav-print /\u003e","lastModifiedDate":"2023-09-12"},{"lineNumber":11,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":12,"author":{"gitId":"-"},"content":"--------------------------------------------------------------------------------------------------------------------","lastModifiedDate":"2020-05-23"},{"lineNumber":13,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2021-07-30"},{"lineNumber":14,"author":{"gitId":"-"},"content":"## **Acknowledgements**","lastModifiedDate":"2021-07-30"},{"lineNumber":15,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2021-07-30"},{"lineNumber":16,"author":{"gitId":"yuechen2001"},"content":"_{ list here sources of all reused/adapted ideas, code, documentation, and third-party libraries -- include links to the","lastModifiedDate":"2024-03-07"},{"lineNumber":17,"author":{"gitId":"yuechen2001"},"content":"original source as well }_","lastModifiedDate":"2024-03-07"},{"lineNumber":18,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2021-07-30"},{"lineNumber":19,"author":{"gitId":"-"},"content":"--------------------------------------------------------------------------------------------------------------------","lastModifiedDate":"2021-07-30"},{"lineNumber":20,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":21,"author":{"gitId":"-"},"content":"## **Setting up, getting started**","lastModifiedDate":"2020-05-23"},{"lineNumber":22,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":23,"author":{"gitId":"-"},"content":"Refer to the guide [_Setting up and getting started_](SettingUp.md).","lastModifiedDate":"2020-05-23"},{"lineNumber":24,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":25,"author":{"gitId":"-"},"content":"--------------------------------------------------------------------------------------------------------------------","lastModifiedDate":"2020-05-23"},{"lineNumber":26,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":27,"author":{"gitId":"-"},"content":"## **Design**","lastModifiedDate":"2020-05-23"},{"lineNumber":28,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":29,"author":{"gitId":"-"},"content":"### Architecture","lastModifiedDate":"2021-07-31"},{"lineNumber":30,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":31,"author":{"gitId":"-"},"content":"\u003cpuml src\u003d\"diagrams/ArchitectureDiagram.puml\" width\u003d\"280\" /\u003e","lastModifiedDate":"2023-09-12"},{"lineNumber":32,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":33,"author":{"gitId":"-"},"content":"The ***Architecture Diagram*** given above explains the high-level design of the App.","lastModifiedDate":"2021-07-31"},{"lineNumber":34,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":35,"author":{"gitId":"-"},"content":"Given below is a quick overview of main components and how they interact with each other.","lastModifiedDate":"2021-07-31"},{"lineNumber":36,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2021-07-31"},{"lineNumber":37,"author":{"gitId":"-"},"content":"**Main components of the architecture**","lastModifiedDate":"2021-07-31"},{"lineNumber":38,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":39,"author":{"gitId":"yuechen2001"},"content":"**`Main`** (consisting of","lastModifiedDate":"2024-03-07"},{"lineNumber":40,"author":{"gitId":"yuechen2001"},"content":"classes [`Main`](https://github.com/se-edu/addressbook-level3/tree/master/src/main/java/seedu/address/Main.java)","lastModifiedDate":"2024-03-07"},{"lineNumber":41,"author":{"gitId":"yuechen2001"},"content":"and [`MainApp`](https://github.com/se-edu/addressbook-level3/tree/master/src/main/java/seedu/address/MainApp.java)) is","lastModifiedDate":"2024-03-07"},{"lineNumber":42,"author":{"gitId":"yuechen2001"},"content":"in charge of the app launch and shut down.","lastModifiedDate":"2024-03-07"},{"lineNumber":43,"author":{"gitId":"yuechen2001"},"content":"","lastModifiedDate":"2024-03-07"},{"lineNumber":44,"author":{"gitId":"-"},"content":"* At app launch, it initializes the other components in the correct sequence, and connects them up with each other.","lastModifiedDate":"2023-09-03"},{"lineNumber":45,"author":{"gitId":"-"},"content":"* At shut down, it shuts down the other components and invokes cleanup methods where necessary.","lastModifiedDate":"2023-09-03"},{"lineNumber":46,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":47,"author":{"gitId":"-"},"content":"The bulk of the app\u0027s work is done by the following four components:","lastModifiedDate":"2023-09-03"},{"lineNumber":48,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":49,"author":{"gitId":"-"},"content":"* [**`UI`**](#ui-component): The UI of the App.","lastModifiedDate":"2020-05-23"},{"lineNumber":50,"author":{"gitId":"-"},"content":"* [**`Logic`**](#logic-component): The command executor.","lastModifiedDate":"2020-05-23"},{"lineNumber":51,"author":{"gitId":"-"},"content":"* [**`Model`**](#model-component): Holds the data of the App in memory.","lastModifiedDate":"2020-05-23"},{"lineNumber":52,"author":{"gitId":"-"},"content":"* [**`Storage`**](#storage-component): Reads data from, and writes data to, the hard disk.","lastModifiedDate":"2020-05-23"},{"lineNumber":53,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":54,"author":{"gitId":"-"},"content":"[**`Commons`**](#common-classes) represents a collection of classes used by multiple other components.","lastModifiedDate":"2023-09-03"},{"lineNumber":55,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":56,"author":{"gitId":"-"},"content":"**How the architecture components interact with each other**","lastModifiedDate":"2020-05-23"},{"lineNumber":57,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":58,"author":{"gitId":"yuechen2001"},"content":"The *Sequence Diagram* below shows how the components interact with each other for the scenario where the user issues","lastModifiedDate":"2024-03-07"},{"lineNumber":59,"author":{"gitId":"yuechen2001"},"content":"the command `delete 1`.","lastModifiedDate":"2024-03-07"},{"lineNumber":60,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":61,"author":{"gitId":"-"},"content":"\u003cpuml src\u003d\"diagrams/ArchitectureSequenceDiagram.puml\" width\u003d\"574\" /\u003e","lastModifiedDate":"2023-09-12"},{"lineNumber":62,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":63,"author":{"gitId":"-"},"content":"Each of the four main components (also shown in the diagram above),","lastModifiedDate":"2021-07-31"},{"lineNumber":64,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2021-07-31"},{"lineNumber":65,"author":{"gitId":"-"},"content":"* defines its *API* in an `interface` with the same name as the Component.","lastModifiedDate":"2021-07-31"},{"lineNumber":66,"author":{"gitId":"yuechen2001"},"content":"* implements its functionality using a concrete `{Component Name}Manager` class (which follows the corresponding","lastModifiedDate":"2024-03-07"},{"lineNumber":67,"author":{"gitId":"yuechen2001"},"content":" API `interface` mentioned in the previous point.","lastModifiedDate":"2024-03-07"},{"lineNumber":68,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2021-07-31"},{"lineNumber":69,"author":{"gitId":"yuechen2001"},"content":"For example, the `Logic` component defines its API in the `Logic.java` interface and implements its functionality using","lastModifiedDate":"2024-03-07"},{"lineNumber":70,"author":{"gitId":"yuechen2001"},"content":"the `LogicManager.java` class which follows the `Logic` interface. Other components interact with a given component","lastModifiedDate":"2024-03-07"},{"lineNumber":71,"author":{"gitId":"yuechen2001"},"content":"through its interface rather than the concrete class (reason: to prevent outside component\u0027s being coupled to the","lastModifiedDate":"2024-03-07"},{"lineNumber":72,"author":{"gitId":"yuechen2001"},"content":"implementation of a component), as illustrated in the (partial) class diagram below.","lastModifiedDate":"2024-03-07"},{"lineNumber":73,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2021-07-31"},{"lineNumber":74,"author":{"gitId":"-"},"content":"\u003cpuml src\u003d\"diagrams/ComponentManagers.puml\" width\u003d\"300\" /\u003e","lastModifiedDate":"2023-09-12"},{"lineNumber":75,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2021-07-31"},{"lineNumber":76,"author":{"gitId":"-"},"content":"The sections below give more details of each component.","lastModifiedDate":"2020-05-23"},{"lineNumber":77,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":78,"author":{"gitId":"-"},"content":"### UI component","lastModifiedDate":"2020-05-23"},{"lineNumber":79,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":80,"author":{"gitId":"yuechen2001"},"content":"The **API** of this component is specified","lastModifiedDate":"2024-03-07"},{"lineNumber":81,"author":{"gitId":"yuechen2001"},"content":"in [`Ui.java`](https://github.com/se-edu/addressbook-level3/tree/master/src/main/java/seedu/address/ui/Ui.java)","lastModifiedDate":"2024-03-07"},{"lineNumber":82,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":83,"author":{"gitId":"-"},"content":"\u003cpuml src\u003d\"diagrams/UiClassDiagram.puml\" alt\u003d\"Structure of the UI Component\"/\u003e","lastModifiedDate":"2023-09-12"},{"lineNumber":84,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":85,"author":{"gitId":"yuechen2001"},"content":"The UI consists of a `MainWindow` that is made up of parts","lastModifiedDate":"2024-03-07"},{"lineNumber":86,"author":{"gitId":"yuechen2001"},"content":"e.g.`CommandBox`, `ResultDisplay`, `PersonListPanel`, `StatusBarFooter` etc. All these, including the `MainWindow`,","lastModifiedDate":"2024-03-07"},{"lineNumber":87,"author":{"gitId":"yuechen2001"},"content":"inherit from the abstract `UiPart` class which captures the commonalities between classes that represent parts of the","lastModifiedDate":"2024-03-07"},{"lineNumber":88,"author":{"gitId":"yuechen2001"},"content":"visible GUI.","lastModifiedDate":"2024-03-07"},{"lineNumber":89,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":90,"author":{"gitId":"yuechen2001"},"content":"The `UI` component uses the JavaFx UI framework. The layout of these UI parts are defined in matching `.fxml` files that","lastModifiedDate":"2024-03-07"},{"lineNumber":91,"author":{"gitId":"yuechen2001"},"content":"are in the `src/main/resources/view` folder. For example, the layout of","lastModifiedDate":"2024-03-07"},{"lineNumber":92,"author":{"gitId":"yuechen2001"},"content":"the [`MainWindow`](https://github.com/se-edu/addressbook-level3/tree/master/src/main/java/seedu/address/ui/MainWindow.java)","lastModifiedDate":"2024-03-07"},{"lineNumber":93,"author":{"gitId":"yuechen2001"},"content":"is specified","lastModifiedDate":"2024-03-07"},{"lineNumber":94,"author":{"gitId":"yuechen2001"},"content":"in [`MainWindow.fxml`](https://github.com/se-edu/addressbook-level3/tree/master/src/main/resources/view/MainWindow.fxml)","lastModifiedDate":"2024-03-07"},{"lineNumber":95,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":96,"author":{"gitId":"-"},"content":"The `UI` component,","lastModifiedDate":"2020-05-23"},{"lineNumber":97,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":98,"author":{"gitId":"-"},"content":"* executes user commands using the `Logic` component.","lastModifiedDate":"2021-07-31"},{"lineNumber":99,"author":{"gitId":"-"},"content":"* listens for changes to `Model` data so that the UI can be updated with the modified data.","lastModifiedDate":"2021-07-31"},{"lineNumber":100,"author":{"gitId":"-"},"content":"* keeps a reference to the `Logic` component, because the `UI` relies on the `Logic` to execute commands.","lastModifiedDate":"2021-07-31"},{"lineNumber":101,"author":{"gitId":"-"},"content":"* depends on some classes in the `Model` component, as it displays `Person` object residing in the `Model`.","lastModifiedDate":"2021-07-31"},{"lineNumber":102,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":103,"author":{"gitId":"-"},"content":"### Logic component","lastModifiedDate":"2020-05-23"},{"lineNumber":104,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":105,"author":{"gitId":"yuechen2001"},"content":"**API","lastModifiedDate":"2024-03-07"},{"lineNumber":106,"author":{"gitId":"yuechen2001"},"content":"** : [`Logic.java`](https://github.com/se-edu/addressbook-level3/tree/master/src/main/java/seedu/address/logic/Logic.java)","lastModifiedDate":"2024-03-07"},{"lineNumber":107,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":108,"author":{"gitId":"-"},"content":"Here\u0027s a (partial) class diagram of the `Logic` component:","lastModifiedDate":"2021-07-31"},{"lineNumber":109,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":110,"author":{"gitId":"-"},"content":"\u003cpuml src\u003d\"diagrams/LogicClassDiagram.puml\" width\u003d\"550\"/\u003e","lastModifiedDate":"2023-09-12"},{"lineNumber":111,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":112,"author":{"gitId":"yuechen2001"},"content":"The sequence diagram below illustrates the interactions within the `Logic` component, taking `execute(\"delete 1\")` API","lastModifiedDate":"2024-03-07"},{"lineNumber":113,"author":{"gitId":"yuechen2001"},"content":"call as an example.","lastModifiedDate":"2024-03-07"},{"lineNumber":114,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":115,"author":{"gitId":"-"},"content":"\u003cpuml src\u003d\"diagrams/DeleteSequenceDiagram.puml\" alt\u003d\"Interactions Inside the Logic Component for the `delete 1` Command\" /\u003e","lastModifiedDate":"2023-09-12"},{"lineNumber":116,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2023-09-12"},{"lineNumber":117,"author":{"gitId":"-"},"content":"\u003cbox type\u003d\"info\" seamless\u003e","lastModifiedDate":"2023-09-12"},{"lineNumber":118,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":119,"author":{"gitId":"yuechen2001"},"content":"**Note:** The lifeline for `DeleteCommandParser` should end at the destroy marker (X) but due to a limitation of","lastModifiedDate":"2024-03-07"},{"lineNumber":120,"author":{"gitId":"yuechen2001"},"content":"PlantUML, the lifeline continues till the end of diagram.","lastModifiedDate":"2024-03-07"},{"lineNumber":121,"author":{"gitId":"-"},"content":"\u003c/box\u003e","lastModifiedDate":"2023-09-12"},{"lineNumber":122,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":123,"author":{"gitId":"-"},"content":"How the `Logic` component works:","lastModifiedDate":"2023-09-03"},{"lineNumber":124,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2023-09-03"},{"lineNumber":125,"author":{"gitId":"yuechen2001"},"content":"1. When `Logic` is called upon to execute a command, it is passed to an `AddressBookParser` object which in turn creates","lastModifiedDate":"2024-03-07"},{"lineNumber":126,"author":{"gitId":"yuechen2001"},"content":" a parser that matches the command (e.g., `DeleteCommandParser`) and uses it to parse the command.","lastModifiedDate":"2024-03-07"},{"lineNumber":127,"author":{"gitId":"yuechen2001"},"content":"1. This results in a `Command` object (more precisely, an object of one of its subclasses e.g., `DeleteCommand`) which","lastModifiedDate":"2024-03-07"},{"lineNumber":128,"author":{"gitId":"yuechen2001"},"content":" is executed by the `LogicManager`.","lastModifiedDate":"2024-03-07"},{"lineNumber":129,"author":{"gitId":"-"},"content":"1. The command can communicate with the `Model` when it is executed (e.g. to delete a person).\u003cbr\u003e","lastModifiedDate":"2024-02-09"},{"lineNumber":130,"author":{"gitId":"yuechen2001"},"content":" Note that although this is shown as a single step in the diagram above (for simplicity), in the code it can take","lastModifiedDate":"2024-03-07"},{"lineNumber":131,"author":{"gitId":"yuechen2001"},"content":" several interactions (between the command object and the `Model`) to achieve.","lastModifiedDate":"2024-03-07"},{"lineNumber":132,"author":{"gitId":"-"},"content":"1. The result of the command execution is encapsulated as a `CommandResult` object which is returned back from `Logic`.","lastModifiedDate":"2023-09-03"},{"lineNumber":133,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2023-09-03"},{"lineNumber":134,"author":{"gitId":"-"},"content":"Here are the other classes in `Logic` (omitted from the class diagram above) that are used for parsing a user command:","lastModifiedDate":"2021-07-31"},{"lineNumber":135,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2021-07-31"},{"lineNumber":136,"author":{"gitId":"-"},"content":"\u003cpuml src\u003d\"diagrams/ParserClasses.puml\" width\u003d\"600\"/\u003e","lastModifiedDate":"2023-09-12"},{"lineNumber":137,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":138,"author":{"gitId":"-"},"content":"How the parsing works:","lastModifiedDate":"2021-07-31"},{"lineNumber":139,"author":{"gitId":"yuechen2001"},"content":"","lastModifiedDate":"2024-03-07"},{"lineNumber":140,"author":{"gitId":"yuechen2001"},"content":"* When called upon to parse a user command, the `AddressBookParser` class creates an `XYZCommandParser` (`XYZ` is a","lastModifiedDate":"2024-03-07"},{"lineNumber":141,"author":{"gitId":"yuechen2001"},"content":" placeholder for the specific command name e.g., `AddCommandParser`) which uses the other classes shown above to parse","lastModifiedDate":"2024-03-07"},{"lineNumber":142,"author":{"gitId":"yuechen2001"},"content":" the user command and create a `XYZCommand` object (e.g., `AddCommand`) which the `AddressBookParser` returns back as","lastModifiedDate":"2024-03-07"},{"lineNumber":143,"author":{"gitId":"yuechen2001"},"content":" a `Command` object.","lastModifiedDate":"2024-03-07"},{"lineNumber":144,"author":{"gitId":"yuechen2001"},"content":"* All `XYZCommandParser` classes (e.g., `AddCommandParser`, `DeleteCommandParser`, ...) inherit from the `Parser`","lastModifiedDate":"2024-03-07"},{"lineNumber":145,"author":{"gitId":"yuechen2001"},"content":" interface so that they can be treated similarly where possible e.g, during testing.","lastModifiedDate":"2024-03-07"},{"lineNumber":146,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":147,"author":{"gitId":"-"},"content":"### Model component","lastModifiedDate":"2021-07-31"},{"lineNumber":148,"author":{"gitId":"yuechen2001"},"content":"","lastModifiedDate":"2024-03-07"},{"lineNumber":149,"author":{"gitId":"yuechen2001"},"content":"**API","lastModifiedDate":"2024-03-07"},{"lineNumber":150,"author":{"gitId":"yuechen2001"},"content":"** : [`Model.java`](https://github.com/se-edu/addressbook-level3/tree/master/src/main/java/seedu/address/model/Model.java)","lastModifiedDate":"2024-03-07"},{"lineNumber":151,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":152,"author":{"gitId":"-"},"content":"\u003cpuml src\u003d\"diagrams/ModelClassDiagram.puml\" width\u003d\"450\" /\u003e","lastModifiedDate":"2023-09-12"},{"lineNumber":153,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":154,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":155,"author":{"gitId":"-"},"content":"The `Model` component,","lastModifiedDate":"2021-07-31"},{"lineNumber":156,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":157,"author":{"gitId":"-"},"content":"* stores the address book data i.e., all `Person` objects (which are contained in a `UniquePersonList` object).","lastModifiedDate":"2021-07-31"},{"lineNumber":158,"author":{"gitId":"yuechen2001"},"content":"* stores the currently \u0027selected\u0027 `Person` objects (e.g., results of a search query) as a separate _filtered_ list which","lastModifiedDate":"2024-03-07"},{"lineNumber":159,"author":{"gitId":"yuechen2001"},"content":" is exposed to outsiders as an unmodifiable `ObservableList\u003cPerson\u003e` that can be \u0027observed\u0027 e.g. the UI can be bound to","lastModifiedDate":"2024-03-07"},{"lineNumber":160,"author":{"gitId":"yuechen2001"},"content":" this list so that the UI automatically updates when the data in the list change.","lastModifiedDate":"2024-03-07"},{"lineNumber":161,"author":{"gitId":"yuechen2001"},"content":"* stores a `UserPref` object that represents the user’s preferences. This is exposed to the outside as","lastModifiedDate":"2024-03-07"},{"lineNumber":162,"author":{"gitId":"yuechen2001"},"content":" a `ReadOnlyUserPref` objects.","lastModifiedDate":"2024-03-07"},{"lineNumber":163,"author":{"gitId":"yuechen2001"},"content":"* does not depend on any of the other three components (as the `Model` represents data entities of the domain, they","lastModifiedDate":"2024-03-07"},{"lineNumber":164,"author":{"gitId":"yuechen2001"},"content":" should make sense on their own without depending on other components)","lastModifiedDate":"2024-03-07"},{"lineNumber":165,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2021-07-31"},{"lineNumber":166,"author":{"gitId":"-"},"content":"\u003cbox type\u003d\"info\" seamless\u003e","lastModifiedDate":"2023-09-12"},{"lineNumber":167,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2023-09-12"},{"lineNumber":168,"author":{"gitId":"yuechen2001"},"content":"**Note:** An alternative (arguably, a more OOP) model is given below. It has a `Tag` list in the `AddressBook`,","lastModifiedDate":"2024-03-07"},{"lineNumber":169,"author":{"gitId":"yuechen2001"},"content":"which `Person` references. This allows `AddressBook` to only require one `Tag` object per unique tag, instead of","lastModifiedDate":"2024-03-07"},{"lineNumber":170,"author":{"gitId":"yuechen2001"},"content":"each `Person` needing their own `Tag` objects.\u003cbr\u003e","lastModifiedDate":"2024-03-07"},{"lineNumber":171,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2021-07-31"},{"lineNumber":172,"author":{"gitId":"-"},"content":"\u003cpuml src\u003d\"diagrams/BetterModelClassDiagram.puml\" width\u003d\"450\" /\u003e","lastModifiedDate":"2023-09-12"},{"lineNumber":173,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":174,"author":{"gitId":"-"},"content":"\u003c/box\u003e","lastModifiedDate":"2023-09-12"},{"lineNumber":175,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":176,"author":{"gitId":"-"},"content":"### Storage component","lastModifiedDate":"2020-05-23"},{"lineNumber":177,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":178,"author":{"gitId":"yuechen2001"},"content":"**API","lastModifiedDate":"2024-03-07"},{"lineNumber":179,"author":{"gitId":"yuechen2001"},"content":"** : [`Storage.java`](https://github.com/se-edu/addressbook-level3/tree/master/src/main/java/seedu/address/storage/Storage.java)","lastModifiedDate":"2024-03-07"},{"lineNumber":180,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":181,"author":{"gitId":"-"},"content":"\u003cpuml src\u003d\"diagrams/StorageClassDiagram.puml\" width\u003d\"550\" /\u003e","lastModifiedDate":"2023-09-12"},{"lineNumber":182,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2021-07-31"},{"lineNumber":183,"author":{"gitId":"-"},"content":"The `Storage` component,","lastModifiedDate":"2020-05-23"},{"lineNumber":184,"author":{"gitId":"yuechen2001"},"content":"","lastModifiedDate":"2024-03-07"},{"lineNumber":185,"author":{"gitId":"yuechen2001"},"content":"* can save both address book data and user preference data in JSON format, and read them back into corresponding","lastModifiedDate":"2024-03-07"},{"lineNumber":186,"author":{"gitId":"yuechen2001"},"content":" objects.","lastModifiedDate":"2024-03-07"},{"lineNumber":187,"author":{"gitId":"yuechen2001"},"content":"* inherits from both `AddressBookStorage` and `UserPrefStorage`, which means it can be treated as either one (if only","lastModifiedDate":"2024-03-07"},{"lineNumber":188,"author":{"gitId":"yuechen2001"},"content":" the functionality of only one is needed).","lastModifiedDate":"2024-03-07"},{"lineNumber":189,"author":{"gitId":"yuechen2001"},"content":"* depends on some classes in the `Model` component (because the `Storage` component\u0027s job is to save/retrieve objects","lastModifiedDate":"2024-03-07"},{"lineNumber":190,"author":{"gitId":"yuechen2001"},"content":" that belong to the `Model`)","lastModifiedDate":"2024-03-07"},{"lineNumber":191,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":192,"author":{"gitId":"-"},"content":"### Common classes","lastModifiedDate":"2020-05-23"},{"lineNumber":193,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":194,"author":{"gitId":"-"},"content":"Classes used by multiple components are in the `seedu.addressbook.commons` package.","lastModifiedDate":"2020-05-23"},{"lineNumber":195,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":196,"author":{"gitId":"-"},"content":"--------------------------------------------------------------------------------------------------------------------","lastModifiedDate":"2020-05-23"},{"lineNumber":197,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":198,"author":{"gitId":"-"},"content":"## **Implementation**","lastModifiedDate":"2020-05-23"},{"lineNumber":199,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":200,"author":{"gitId":"-"},"content":"This section describes some noteworthy details on how certain features are implemented.","lastModifiedDate":"2020-05-23"},{"lineNumber":201,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":202,"author":{"gitId":"-"},"content":"### \\[Proposed\\] Undo/redo feature","lastModifiedDate":"2020-06-07"},{"lineNumber":203,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":204,"author":{"gitId":"-"},"content":"#### Proposed Implementation","lastModifiedDate":"2020-05-23"},{"lineNumber":205,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":206,"author":{"gitId":"yuechen2001"},"content":"The proposed undo/redo mechanism is facilitated by `VersionedAddressBook`. It extends `AddressBook` with an undo/redo","lastModifiedDate":"2024-03-07"},{"lineNumber":207,"author":{"gitId":"yuechen2001"},"content":"history, stored internally as an `addressBookStateList` and `currentStatePointer`. Additionally, it implements the","lastModifiedDate":"2024-03-07"},{"lineNumber":208,"author":{"gitId":"yuechen2001"},"content":"following operations:","lastModifiedDate":"2024-03-07"},{"lineNumber":209,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":210,"author":{"gitId":"-"},"content":"* `VersionedAddressBook#commit()` — Saves the current address book state in its history.","lastModifiedDate":"2020-05-23"},{"lineNumber":211,"author":{"gitId":"-"},"content":"* `VersionedAddressBook#undo()` — Restores the previous address book state from its history.","lastModifiedDate":"2020-05-23"},{"lineNumber":212,"author":{"gitId":"-"},"content":"* `VersionedAddressBook#redo()` — Restores a previously undone address book state from its history.","lastModifiedDate":"2020-05-23"},{"lineNumber":213,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":214,"author":{"gitId":"yuechen2001"},"content":"These operations are exposed in the `Model` interface as `Model#commitAddressBook()`, `Model#undoAddressBook()`","lastModifiedDate":"2024-03-07"},{"lineNumber":215,"author":{"gitId":"yuechen2001"},"content":"and `Model#redoAddressBook()` respectively.","lastModifiedDate":"2024-03-07"},{"lineNumber":216,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":217,"author":{"gitId":"-"},"content":"Given below is an example usage scenario and how the undo/redo mechanism behaves at each step.","lastModifiedDate":"2020-05-23"},{"lineNumber":218,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":219,"author":{"gitId":"yuechen2001"},"content":"Step 1. The user launches the application for the first time. The `VersionedAddressBook` will be initialized with the","lastModifiedDate":"2024-03-07"},{"lineNumber":220,"author":{"gitId":"yuechen2001"},"content":"initial address book state, and the `currentStatePointer` pointing to that single address book state.","lastModifiedDate":"2024-03-07"},{"lineNumber":221,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":222,"author":{"gitId":"-"},"content":"\u003cpuml src\u003d\"diagrams/UndoRedoState0.puml\" alt\u003d\"UndoRedoState0\" /\u003e","lastModifiedDate":"2023-09-12"},{"lineNumber":223,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":224,"author":{"gitId":"yuechen2001"},"content":"Step 2. The user executes `delete 5` command to delete the 5th person in the address book. The `delete` command","lastModifiedDate":"2024-03-07"},{"lineNumber":225,"author":{"gitId":"yuechen2001"},"content":"calls `Model#commitAddressBook()`, causing the modified state of the address book after the `delete 5` command executes","lastModifiedDate":"2024-03-07"},{"lineNumber":226,"author":{"gitId":"yuechen2001"},"content":"to be saved in the `addressBookStateList`, and the `currentStatePointer` is shifted to the newly inserted address book","lastModifiedDate":"2024-03-07"},{"lineNumber":227,"author":{"gitId":"yuechen2001"},"content":"state.","lastModifiedDate":"2024-03-07"},{"lineNumber":228,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":229,"author":{"gitId":"-"},"content":"\u003cpuml src\u003d\"diagrams/UndoRedoState1.puml\" alt\u003d\"UndoRedoState1\" /\u003e","lastModifiedDate":"2023-09-12"},{"lineNumber":230,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":231,"author":{"gitId":"yuechen2001"},"content":"Step 3. The user executes `add n/David …​` to add a new person. The `add` command also","lastModifiedDate":"2024-03-07"},{"lineNumber":232,"author":{"gitId":"yuechen2001"},"content":"calls `Model#commitAddressBook()`, causing another modified address book state to be saved into","lastModifiedDate":"2024-03-07"},{"lineNumber":233,"author":{"gitId":"yuechen2001"},"content":"the `addressBookStateList`.","lastModifiedDate":"2024-03-07"},{"lineNumber":234,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":235,"author":{"gitId":"-"},"content":"\u003cpuml src\u003d\"diagrams/UndoRedoState2.puml\" alt\u003d\"UndoRedoState2\" /\u003e","lastModifiedDate":"2023-09-12"},{"lineNumber":236,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":237,"author":{"gitId":"-"},"content":"\u003cbox type\u003d\"info\" seamless\u003e","lastModifiedDate":"2023-09-12"},{"lineNumber":238,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":239,"author":{"gitId":"yuechen2001"},"content":"**Note:** If a command fails its execution, it will not call `Model#commitAddressBook()`, so the address book state will","lastModifiedDate":"2024-03-07"},{"lineNumber":240,"author":{"gitId":"yuechen2001"},"content":"not be saved into the `addressBookStateList`.","lastModifiedDate":"2024-03-07"},{"lineNumber":241,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2023-09-12"},{"lineNumber":242,"author":{"gitId":"-"},"content":"\u003c/box\u003e","lastModifiedDate":"2023-09-12"},{"lineNumber":243,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":244,"author":{"gitId":"yuechen2001"},"content":"Step 4. The user now decides that adding the person was a mistake, and decides to undo that action by executing","lastModifiedDate":"2024-03-07"},{"lineNumber":245,"author":{"gitId":"yuechen2001"},"content":"the `undo` command. The `undo` command will call `Model#undoAddressBook()`, which will shift the `currentStatePointer`","lastModifiedDate":"2024-03-07"},{"lineNumber":246,"author":{"gitId":"yuechen2001"},"content":"once to the left, pointing it to the previous address book state, and restores the address book to that state.","lastModifiedDate":"2024-03-07"},{"lineNumber":247,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":248,"author":{"gitId":"-"},"content":"\u003cpuml src\u003d\"diagrams/UndoRedoState3.puml\" alt\u003d\"UndoRedoState3\" /\u003e","lastModifiedDate":"2023-09-12"},{"lineNumber":249,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2023-09-12"},{"lineNumber":250,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2023-09-12"},{"lineNumber":251,"author":{"gitId":"-"},"content":"\u003cbox type\u003d\"info\" seamless\u003e","lastModifiedDate":"2023-09-12"},{"lineNumber":252,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":253,"author":{"gitId":"yuechen2001"},"content":"**Note:** If the `currentStatePointer` is at index 0, pointing to the initial AddressBook state, then there are no","lastModifiedDate":"2024-03-07"},{"lineNumber":254,"author":{"gitId":"yuechen2001"},"content":"previous AddressBook states to restore. The `undo` command uses `Model#canUndoAddressBook()` to check if this is the","lastModifiedDate":"2024-03-07"},{"lineNumber":255,"author":{"gitId":"yuechen2001"},"content":"case. If so, it will return an error to the user rather","lastModifiedDate":"2024-03-07"},{"lineNumber":256,"author":{"gitId":"-"},"content":"than attempting to perform the undo.","lastModifiedDate":"2020-05-23"},{"lineNumber":257,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":258,"author":{"gitId":"-"},"content":"\u003c/box\u003e","lastModifiedDate":"2023-09-12"},{"lineNumber":259,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":260,"author":{"gitId":"-"},"content":"The following sequence diagram shows how an undo operation goes through the `Logic` component:","lastModifiedDate":"2024-02-09"},{"lineNumber":261,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":262,"author":{"gitId":"-"},"content":"\u003cpuml src\u003d\"diagrams/UndoSequenceDiagram-Logic.puml\" alt\u003d\"UndoSequenceDiagram-Logic\" /\u003e","lastModifiedDate":"2023-09-12"},{"lineNumber":263,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":264,"author":{"gitId":"-"},"content":"\u003cbox type\u003d\"info\" seamless\u003e","lastModifiedDate":"2023-09-12"},{"lineNumber":265,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":266,"author":{"gitId":"yuechen2001"},"content":"**Note:** The lifeline for `UndoCommand` should end at the destroy marker (X) but due to a limitation of PlantUML, the","lastModifiedDate":"2024-03-07"},{"lineNumber":267,"author":{"gitId":"yuechen2001"},"content":"lifeline reaches the end of diagram.","lastModifiedDate":"2024-03-07"},{"lineNumber":268,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2023-09-12"},{"lineNumber":269,"author":{"gitId":"-"},"content":"\u003c/box\u003e","lastModifiedDate":"2023-09-12"},{"lineNumber":270,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":271,"author":{"gitId":"-"},"content":"Similarly, how an undo operation goes through the `Model` component is shown below:","lastModifiedDate":"2024-02-09"},{"lineNumber":272,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2024-02-09"},{"lineNumber":273,"author":{"gitId":"-"},"content":"\u003cpuml src\u003d\"diagrams/UndoSequenceDiagram-Model.puml\" alt\u003d\"UndoSequenceDiagram-Model\" /\u003e","lastModifiedDate":"2023-09-12"},{"lineNumber":274,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2024-02-09"},{"lineNumber":275,"author":{"gitId":"-"},"content":"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.","lastModifiedDate":"2020-05-23"},{"lineNumber":276,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":277,"author":{"gitId":"-"},"content":"\u003cbox type\u003d\"info\" seamless\u003e","lastModifiedDate":"2023-09-12"},{"lineNumber":278,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2023-09-12"},{"lineNumber":279,"author":{"gitId":"yuechen2001"},"content":"**Note:** If the `currentStatePointer` is at index `addressBookStateList.size() - 1`, pointing to the latest address","lastModifiedDate":"2024-03-07"},{"lineNumber":280,"author":{"gitId":"yuechen2001"},"content":"book state, then there are no undone AddressBook states to restore. The `redo` command uses `Model#canRedoAddressBook()`","lastModifiedDate":"2024-03-07"},{"lineNumber":281,"author":{"gitId":"yuechen2001"},"content":"to check if this is the case. If so, it will return an error to the user rather than attempting to perform the redo.","lastModifiedDate":"2024-03-07"},{"lineNumber":282,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":283,"author":{"gitId":"-"},"content":"\u003c/box\u003e","lastModifiedDate":"2023-09-12"},{"lineNumber":284,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":285,"author":{"gitId":"yuechen2001"},"content":"Step 5. The user then decides to execute the command `list`. Commands that do not modify the address book, such","lastModifiedDate":"2024-03-07"},{"lineNumber":286,"author":{"gitId":"yuechen2001"},"content":"as `list`, will usually not call `Model#commitAddressBook()`, `Model#undoAddressBook()` or `Model#redoAddressBook()`.","lastModifiedDate":"2024-03-07"},{"lineNumber":287,"author":{"gitId":"yuechen2001"},"content":"Thus, the `addressBookStateList` remains unchanged.","lastModifiedDate":"2024-03-07"},{"lineNumber":288,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":289,"author":{"gitId":"-"},"content":"\u003cpuml src\u003d\"diagrams/UndoRedoState4.puml\" alt\u003d\"UndoRedoState4\" /\u003e","lastModifiedDate":"2023-09-12"},{"lineNumber":290,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":291,"author":{"gitId":"yuechen2001"},"content":"Step 6. The user executes `clear`, which calls `Model#commitAddressBook()`. Since the `currentStatePointer` is not","lastModifiedDate":"2024-03-07"},{"lineNumber":292,"author":{"gitId":"yuechen2001"},"content":"pointing at the end of the `addressBookStateList`, all address book states after the `currentStatePointer` will be","lastModifiedDate":"2024-03-07"},{"lineNumber":293,"author":{"gitId":"yuechen2001"},"content":"purged. Reason: It no longer makes sense to redo the `add n/David …​` command. This is the behavior that most modern","lastModifiedDate":"2024-03-07"},{"lineNumber":294,"author":{"gitId":"yuechen2001"},"content":"desktop applications follow.","lastModifiedDate":"2024-03-07"},{"lineNumber":295,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":296,"author":{"gitId":"-"},"content":"\u003cpuml src\u003d\"diagrams/UndoRedoState5.puml\" alt\u003d\"UndoRedoState5\" /\u003e","lastModifiedDate":"2023-09-12"},{"lineNumber":297,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":298,"author":{"gitId":"-"},"content":"The following activity diagram summarizes what happens when a user executes a new command:","lastModifiedDate":"2020-05-23"},{"lineNumber":299,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":300,"author":{"gitId":"-"},"content":"\u003cpuml src\u003d\"diagrams/CommitActivityDiagram.puml\" width\u003d\"250\" /\u003e","lastModifiedDate":"2023-09-12"},{"lineNumber":301,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":302,"author":{"gitId":"-"},"content":"#### Design considerations:","lastModifiedDate":"2021-07-31"},{"lineNumber":303,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":304,"author":{"gitId":"-"},"content":"**Aspect: How undo \u0026 redo executes:**","lastModifiedDate":"2021-07-31"},{"lineNumber":305,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":306,"author":{"gitId":"-"},"content":"* **Alternative 1 (current choice):** Saves the entire address book.","lastModifiedDate":"2020-05-23"},{"lineNumber":307,"author":{"gitId":"-"},"content":" * Pros: Easy to implement.","lastModifiedDate":"2020-05-23"},{"lineNumber":308,"author":{"gitId":"-"},"content":" * Cons: May have performance issues in terms of memory usage.","lastModifiedDate":"2020-05-23"},{"lineNumber":309,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":310,"author":{"gitId":"-"},"content":"* **Alternative 2:** Individual command knows how to undo/redo by","lastModifiedDate":"2020-05-23"},{"lineNumber":311,"author":{"gitId":"-"},"content":" itself.","lastModifiedDate":"2020-05-23"},{"lineNumber":312,"author":{"gitId":"-"},"content":" * Pros: Will use less memory (e.g. for `delete`, just save the person being deleted).","lastModifiedDate":"2020-05-23"},{"lineNumber":313,"author":{"gitId":"-"},"content":" * Cons: We must ensure that the implementation of each individual command are correct.","lastModifiedDate":"2020-05-23"},{"lineNumber":314,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":315,"author":{"gitId":"-"},"content":"_{more aspects and alternatives to be added}_","lastModifiedDate":"2020-05-23"},{"lineNumber":316,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":317,"author":{"gitId":"-"},"content":"### \\[Proposed\\] Data archiving","lastModifiedDate":"2020-05-23"},{"lineNumber":318,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":319,"author":{"gitId":"-"},"content":"_{Explain here how the data archiving feature will be implemented}_","lastModifiedDate":"2020-05-23"},{"lineNumber":320,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":321,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":322,"author":{"gitId":"-"},"content":"--------------------------------------------------------------------------------------------------------------------","lastModifiedDate":"2020-05-23"},{"lineNumber":323,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":324,"author":{"gitId":"-"},"content":"## **Documentation, logging, testing, configuration, dev-ops**","lastModifiedDate":"2020-06-07"},{"lineNumber":325,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":326,"author":{"gitId":"-"},"content":"* [Documentation guide](Documentation.md)","lastModifiedDate":"2020-06-07"},{"lineNumber":327,"author":{"gitId":"-"},"content":"* [Testing guide](Testing.md)","lastModifiedDate":"2020-06-07"},{"lineNumber":328,"author":{"gitId":"-"},"content":"* [Logging guide](Logging.md)","lastModifiedDate":"2020-06-07"},{"lineNumber":329,"author":{"gitId":"-"},"content":"* [Configuration guide](Configuration.md)","lastModifiedDate":"2020-06-07"},{"lineNumber":330,"author":{"gitId":"-"},"content":"* [DevOps guide](DevOps.md)","lastModifiedDate":"2020-06-07"},{"lineNumber":331,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":332,"author":{"gitId":"-"},"content":"--------------------------------------------------------------------------------------------------------------------","lastModifiedDate":"2020-05-23"},{"lineNumber":333,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":334,"author":{"gitId":"-"},"content":"## **Appendix: Requirements**","lastModifiedDate":"2020-05-23"},{"lineNumber":335,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":336,"author":{"gitId":"-"},"content":"### Product scope","lastModifiedDate":"2020-05-23"},{"lineNumber":337,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":338,"author":{"gitId":"-"},"content":"**Target user profile**:","lastModifiedDate":"2020-05-23"},{"lineNumber":339,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":340,"author":{"gitId":"yuechen2001"},"content":"* Student developers","lastModifiedDate":"2024-03-07"},{"lineNumber":341,"author":{"gitId":"yuechen2001"},"content":"* hopes to connect and collaborate with other student developers","lastModifiedDate":"2024-03-07"},{"lineNumber":342,"author":{"gitId":"-"},"content":"* has a need to manage a significant number of contacts","lastModifiedDate":"2020-05-23"},{"lineNumber":343,"author":{"gitId":"-"},"content":"* prefer desktop apps over other types","lastModifiedDate":"2020-05-23"},{"lineNumber":344,"author":{"gitId":"-"},"content":"* can type fast","lastModifiedDate":"2020-05-23"},{"lineNumber":345,"author":{"gitId":"-"},"content":"* prefers typing to mouse interactions","lastModifiedDate":"2020-05-26"},{"lineNumber":346,"author":{"gitId":"-"},"content":"* is reasonably comfortable using CLI apps","lastModifiedDate":"2020-05-23"},{"lineNumber":347,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":348,"author":{"gitId":"yuechen2001"},"content":"**Value proposition**:","lastModifiedDate":"2024-03-07"},{"lineNumber":349,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":350,"author":{"gitId":"yuechen2001"},"content":"* keep track of other student developers","lastModifiedDate":"2024-03-07"},{"lineNumber":351,"author":{"gitId":"yuechen2001"},"content":"* reach out easily to those with relevant skills for collaboration opportunities.","lastModifiedDate":"2024-03-07"},{"lineNumber":352,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":353,"author":{"gitId":"-"},"content":"### User stories","lastModifiedDate":"2020-06-07"},{"lineNumber":354,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":355,"author":{"gitId":"-"},"content":"Priorities: High (must have) - `* * *`, Medium (nice to have) - `* *`, Low (unlikely to have) - `*`","lastModifiedDate":"2020-05-23"},{"lineNumber":356,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":357,"author":{"gitId":"-"},"content":"| Priority | As a …​ | I want to …​ | So that I can…​ |","lastModifiedDate":"2020-05-23"},{"lineNumber":358,"author":{"gitId":"yuechen2001"},"content":"|----------|-----------------------------------------|-------------------------------------------------------------------------------------------------------------------|-------------------------------------------------------------------------|","lastModifiedDate":"2024-03-07"},{"lineNumber":359,"author":{"gitId":"yuechen2001"},"content":"| `* * *` | Student | save the contacts of student developers | remember them |","lastModifiedDate":"2024-03-07"},{"lineNumber":360,"author":{"gitId":"yuechen2001"},"content":"| `* * *` | Student | see the contacts of student developers | reach out to them |","lastModifiedDate":"2024-03-07"},{"lineNumber":361,"author":{"gitId":"yuechen2001"},"content":"| `* * *` | Student | delete the contacts of student developers | remove entries that I no longer need |","lastModifiedDate":"2024-03-07"},{"lineNumber":362,"author":{"gitId":"yuechen2001"},"content":"| `* * *` | Student | search for the contacts of student developers | locate details of contacts without having to go through the entire list |","lastModifiedDate":"2024-03-07"},{"lineNumber":363,"author":{"gitId":"yuechen2001"},"content":"| `* * *` | Student | update the details of contacts that I already have in my address book | keep my contact details up to date |","lastModifiedDate":"2024-03-07"},{"lineNumber":364,"author":{"gitId":"yuechen2001"},"content":"| `* *` | Student | sort contacts by tags | locate a group of student developers easily |","lastModifiedDate":"2024-03-07"},{"lineNumber":365,"author":{"gitId":"yuechen2001"},"content":"| `* *` | Student | categorise the contacts I have saved into the projects I am working on | have an organised address book |","lastModifiedDate":"2024-03-07"},{"lineNumber":366,"author":{"gitId":"yuechen2001"},"content":"| `* *` | Forgetful Student | add profile pictures for each contact | know who I am contacting |","lastModifiedDate":"2024-03-07"},{"lineNumber":367,"author":{"gitId":"yuechen2001"},"content":"| `* * *` | Student | search for contacts based on their technical skills | form teams for hackathons more easily |","lastModifiedDate":"2024-03-07"},{"lineNumber":368,"author":{"gitId":"yuechen2001"},"content":"| `*` | Student | view my most used commands while typing | save time typing out the full command |","lastModifiedDate":"2024-03-07"},{"lineNumber":369,"author":{"gitId":"yuechen2001"},"content":"| `*` | Student signing up for a hackathon | export the contact details of my team | easily sign up for events |","lastModifiedDate":"2024-03-07"},{"lineNumber":370,"author":{"gitId":"yuechen2001"},"content":"| `*` | Student | place reminders for meetings with my contacts | keep track of them |","lastModifiedDate":"2024-03-07"},{"lineNumber":371,"author":{"gitId":"yuechen2001"},"content":"| `* *` | New user | import existing contacts into this application | |","lastModifiedDate":"2024-03-07"},{"lineNumber":372,"author":{"gitId":"yuechen2001"},"content":"| `* * *` | Student | add notes to different contacts | remember specific details |","lastModifiedDate":"2024-03-07"},{"lineNumber":373,"author":{"gitId":"yuechen2001"},"content":"| `* *` | Student | integrate my contacts with calendar events | schedule meetings directly from the application |","lastModifiedDate":"2024-03-07"},{"lineNumber":374,"author":{"gitId":"yuechen2001"},"content":"| `*` | Student | tag contacts based on their time zone | take note of different time zones when scheduling meetings |","lastModifiedDate":"2024-03-07"},{"lineNumber":375,"author":{"gitId":"yuechen2001"},"content":"| `* * *` | Student | link GitHub profiles or personal portfolio websites to contacts | easily access their projects and contributions |","lastModifiedDate":"2024-03-07"},{"lineNumber":376,"author":{"gitId":"yuechen2001"},"content":"| `*` | Student | be given smart suggestions for potential contacts based on my current network and interests | |","lastModifiedDate":"2024-03-07"},{"lineNumber":377,"author":{"gitId":"yuechen2001"},"content":"| `*` | Student | integrate messaging apps to initiate conversations directly from the application | |","lastModifiedDate":"2024-03-07"},{"lineNumber":378,"author":{"gitId":"yuechen2001"},"content":"| `*` | New user | have a tutorial feature that shows me how to use the app | |","lastModifiedDate":"2024-03-07"},{"lineNumber":379,"author":{"gitId":"yuechen2001"},"content":"| `* *` | Student attending conferences or events | quickly exchange contact information with fellow attendees through QR codes | quickly add new contacts |","lastModifiedDate":"2024-03-07"},{"lineNumber":380,"author":{"gitId":"yuechen2001"},"content":"| `* *` | Team Lead | have access to integrated online learning platforms to track the courses or certificates completed by my contacts | understand their evolving skills |","lastModifiedDate":"2024-03-07"},{"lineNumber":381,"author":{"gitId":"yuechen2001"},"content":"| `* * *` | Student | endorse or rate the skills of my contacts | keep track of their expertise and choose the right team members |","lastModifiedDate":"2024-03-07"},{"lineNumber":382,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":383,"author":{"gitId":"-"},"content":"### Use cases","lastModifiedDate":"2020-06-07"},{"lineNumber":384,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":385,"author":{"gitId":"-"},"content":"(For all use cases below, the **System** is the `AddressBook` and the **Actor** is the `user`, unless specified otherwise)","lastModifiedDate":"2020-05-23"},{"lineNumber":386,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":387,"author":{"gitId":"yuechen2001"},"content":"**Use case: UC01 - Delete a contact**","lastModifiedDate":"2024-03-07"},{"lineNumber":388,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":389,"author":{"gitId":"-"},"content":"**MSS**","lastModifiedDate":"2020-05-23"},{"lineNumber":390,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":391,"author":{"gitId":"yuechen2001"},"content":"1. User requests to delete a specific contact in his list of contacts.","lastModifiedDate":"2024-03-07"},{"lineNumber":392,"author":{"gitId":"yuechen2001"},"content":"2. CodeConnect deletes the contact.","lastModifiedDate":"2024-03-07"},{"lineNumber":393,"author":{"gitId":"yuechen2001"},"content":" Use case ends.","lastModifiedDate":"2024-03-07"},{"lineNumber":394,"author":{"gitId":"yuechen2001"},"content":"","lastModifiedDate":"2024-03-07"},{"lineNumber":395,"author":{"gitId":"yuechen2001"},"content":"**Extensions**","lastModifiedDate":"2024-03-07"},{"lineNumber":396,"author":{"gitId":"yuechen2001"},"content":"","lastModifiedDate":"2024-03-07"},{"lineNumber":397,"author":{"gitId":"yuechen2001"},"content":"* 1a. The list is empty.","lastModifiedDate":"2024-03-07"},{"lineNumber":398,"author":{"gitId":"yuechen2001"},"content":" * 1a1. CodeConnect shows an error message.","lastModifiedDate":"2024-03-07"},{"lineNumber":399,"author":{"gitId":"yuechen2001"},"content":" Use case ends.","lastModifiedDate":"2024-03-07"},{"lineNumber":400,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":401,"author":{"gitId":"yuechen2001"},"content":"* 1b. The given index does not exist in CodeConnect.","lastModifiedDate":"2024-03-07"},{"lineNumber":402,"author":{"gitId":"yuechen2001"},"content":" * 1b1. CodeConnect shows an error message.","lastModifiedDate":"2024-03-07"},{"lineNumber":403,"author":{"gitId":"yuechen2001"},"content":" Use case ends.","lastModifiedDate":"2024-03-07"},{"lineNumber":404,"author":{"gitId":"yuechen2001"},"content":"","lastModifiedDate":"2024-03-07"},{"lineNumber":405,"author":{"gitId":"yuechen2001"},"content":"**Use case: UC02 - Add a contact**","lastModifiedDate":"2024-03-07"},{"lineNumber":406,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":407,"author":{"gitId":"yuechen2001"},"content":"**MSS**","lastModifiedDate":"2024-03-07"},{"lineNumber":408,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2024-03-07"},{"lineNumber":409,"author":{"gitId":"yuechen2001"},"content":"1. User requests to add a Student’s contact information into his list of contacts.","lastModifiedDate":"2024-03-07"},{"lineNumber":410,"author":{"gitId":"yuechen2001"},"content":"2. CodeConnect saves the new contact and displays it at the top of the contact list.","lastModifiedDate":"2024-03-07"},{"lineNumber":411,"author":{"gitId":"-"},"content":" Use case ends.","lastModifiedDate":"2020-05-23"},{"lineNumber":412,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":413,"author":{"gitId":"-"},"content":"**Extensions**","lastModifiedDate":"2020-05-23"},{"lineNumber":414,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":415,"author":{"gitId":"yuechen2001"},"content":"* 1a. The contact already exists in the system.","lastModifiedDate":"2024-03-07"},{"lineNumber":416,"author":{"gitId":"yuechen2001"},"content":" * 1a1. CodeConnect shows an error message.","lastModifiedDate":"2024-03-07"},{"lineNumber":417,"author":{"gitId":"yuechen2001"},"content":" Use case ends.","lastModifiedDate":"2024-03-07"},{"lineNumber":418,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":419,"author":{"gitId":"yuechen2001"},"content":"* 1b. No fields are entered.","lastModifiedDate":"2024-03-07"},{"lineNumber":420,"author":{"gitId":"yuechen2001"},"content":" * 1b1. CodeConnect shows an error message.","lastModifiedDate":"2024-03-07"},{"lineNumber":421,"author":{"gitId":"-"},"content":" Use case ends.","lastModifiedDate":"2020-05-23"},{"lineNumber":422,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":423,"author":{"gitId":"yuechen2001"},"content":"**Use case: UC03 - Update a contact**","lastModifiedDate":"2024-03-07"},{"lineNumber":424,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":425,"author":{"gitId":"yuechen2001"},"content":"**MSS**","lastModifiedDate":"2024-03-07"},{"lineNumber":426,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2024-03-07"},{"lineNumber":427,"author":{"gitId":"yuechen2001"},"content":"1. User requests to update a Student’s contact information into his list of contacts.","lastModifiedDate":"2024-03-07"},{"lineNumber":428,"author":{"gitId":"yuechen2001"},"content":"2. CodeConnect updates the contact.","lastModifiedDate":"2024-03-07"},{"lineNumber":429,"author":{"gitId":"yuechen2001"},"content":" Use case ends.","lastModifiedDate":"2024-03-07"},{"lineNumber":430,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":431,"author":{"gitId":"yuechen2001"},"content":"**Extensions**","lastModifiedDate":"2024-03-07"},{"lineNumber":432,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":433,"author":{"gitId":"yuechen2001"},"content":"* 1a. The given index to identify contact is invalid.","lastModifiedDate":"2024-03-07"},{"lineNumber":434,"author":{"gitId":"yuechen2001"},"content":" * 1a1. CodeConnect shows an error message.","lastModifiedDate":"2024-03-07"},{"lineNumber":435,"author":{"gitId":"yuechen2001"},"content":" Use case ends.","lastModifiedDate":"2024-03-07"},{"lineNumber":436,"author":{"gitId":"yuechen2001"},"content":"","lastModifiedDate":"2024-03-07"},{"lineNumber":437,"author":{"gitId":"yuechen2001"},"content":"* 1b. No fields are entered.","lastModifiedDate":"2024-03-07"},{"lineNumber":438,"author":{"gitId":"yuechen2001"},"content":" * 1b1. CodeConnect shows an error message.","lastModifiedDate":"2024-03-07"},{"lineNumber":439,"author":{"gitId":"yuechen2001"},"content":" Use case ends.","lastModifiedDate":"2024-03-07"},{"lineNumber":440,"author":{"gitId":"yuechen2001"},"content":"","lastModifiedDate":"2024-03-07"},{"lineNumber":441,"author":{"gitId":"yuechen2001"},"content":"* 1c. No fields are entered.","lastModifiedDate":"2024-03-07"},{"lineNumber":442,"author":{"gitId":"yuechen2001"},"content":" * 1b1. CodeConnect shows an error message.","lastModifiedDate":"2024-03-07"},{"lineNumber":443,"author":{"gitId":"yuechen2001"},"content":" Use case ends.","lastModifiedDate":"2024-03-07"},{"lineNumber":444,"author":{"gitId":"yuechen2001"},"content":"","lastModifiedDate":"2024-03-07"},{"lineNumber":445,"author":{"gitId":"yuechen2001"},"content":"**Use case: UC04 - View all contacts**","lastModifiedDate":"2024-03-07"},{"lineNumber":446,"author":{"gitId":"yuechen2001"},"content":"","lastModifiedDate":"2024-03-07"},{"lineNumber":447,"author":{"gitId":"yuechen2001"},"content":"**MSS**","lastModifiedDate":"2024-03-07"},{"lineNumber":448,"author":{"gitId":"yuechen2001"},"content":"","lastModifiedDate":"2024-03-07"},{"lineNumber":449,"author":{"gitId":"yuechen2001"},"content":"1. User requests to view all his contacts.","lastModifiedDate":"2024-03-07"},{"lineNumber":450,"author":{"gitId":"yuechen2001"},"content":"2. CodeConnect displays all contacts.","lastModifiedDate":"2024-03-07"},{"lineNumber":451,"author":{"gitId":"yuechen2001"},"content":" Use case ends.","lastModifiedDate":"2024-03-07"},{"lineNumber":452,"author":{"gitId":"yuechen2001"},"content":"","lastModifiedDate":"2024-03-07"},{"lineNumber":453,"author":{"gitId":"yuechen2001"},"content":"**Use case: UC05 - Search a contact by name**","lastModifiedDate":"2024-03-07"},{"lineNumber":454,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2024-03-07"},{"lineNumber":455,"author":{"gitId":"yuechen2001"},"content":"**MSS**","lastModifiedDate":"2024-03-07"},{"lineNumber":456,"author":{"gitId":"yuechen2001"},"content":"","lastModifiedDate":"2024-03-07"},{"lineNumber":457,"author":{"gitId":"yuechen2001"},"content":"1. User requests to look up contacts with a specific substring in their name.","lastModifiedDate":"2024-03-07"},{"lineNumber":458,"author":{"gitId":"yuechen2001"},"content":"2. CodeConnect checks each contact’s name in the list that contains the substring.","lastModifiedDate":"2024-03-07"},{"lineNumber":459,"author":{"gitId":"yuechen2001"},"content":"3. CodeConnect shows a list of contacts that match the criteria.","lastModifiedDate":"2024-03-07"},{"lineNumber":460,"author":{"gitId":"yuechen2001"},"content":"","lastModifiedDate":"2024-03-07"},{"lineNumber":461,"author":{"gitId":"yuechen2001"},"content":" Use case ends.","lastModifiedDate":"2024-03-07"},{"lineNumber":462,"author":{"gitId":"yuechen2001"},"content":"","lastModifiedDate":"2024-03-07"},{"lineNumber":463,"author":{"gitId":"yuechen2001"},"content":"**Extensions**","lastModifiedDate":"2024-03-07"},{"lineNumber":464,"author":{"gitId":"yuechen2001"},"content":"","lastModifiedDate":"2024-03-07"},{"lineNumber":465,"author":{"gitId":"yuechen2001"},"content":"* 1a. No substring is given.","lastModifiedDate":"2024-03-07"},{"lineNumber":466,"author":{"gitId":"yuechen2001"},"content":" * 1a1. CodeConnect shows an error message.","lastModifiedDate":"2024-03-07"},{"lineNumber":467,"author":{"gitId":"yuechen2001"},"content":" Use case ends.","lastModifiedDate":"2024-03-07"},{"lineNumber":468,"author":{"gitId":"yuechen2001"},"content":"","lastModifiedDate":"2024-03-07"},{"lineNumber":469,"author":{"gitId":"yuechen2001"},"content":"* 1b. There are no contacts in the list that match the criteria.","lastModifiedDate":"2024-03-07"},{"lineNumber":470,"author":{"gitId":"yuechen2001"},"content":" * 1b1. CodeConnect shows an empty list.","lastModifiedDate":"2024-03-07"},{"lineNumber":471,"author":{"gitId":"yuechen2001"},"content":" Use case ends.","lastModifiedDate":"2024-03-07"},{"lineNumber":472,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":473,"author":{"gitId":"-"},"content":"*{More to be added}*","lastModifiedDate":"2020-05-23"},{"lineNumber":474,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":475,"author":{"gitId":"-"},"content":"### Non-Functional Requirements","lastModifiedDate":"2020-05-23"},{"lineNumber":476,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":477,"author":{"gitId":"-"},"content":"1. Should work on any _mainstream OS_ as long as it has Java `11` or above installed.","lastModifiedDate":"2020-05-23"},{"lineNumber":478,"author":{"gitId":"angsongyee"},"content":"2. Should be portable, and be able to run without any installation process.","lastModifiedDate":"2024-03-06"},{"lineNumber":479,"author":{"gitId":"angsongyee"},"content":"3. This program should only be used by a single user. ","lastModifiedDate":"2024-03-06"},{"lineNumber":480,"author":{"gitId":"angsongyee"},"content":"4. 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.","lastModifiedDate":"2024-03-06"},{"lineNumber":481,"author":{"gitId":"angsongyee"},"content":"5. Should be able to hold up to 1000 persons without a noticeable sluggishness in performance for typical usage.","lastModifiedDate":"2024-03-06"},{"lineNumber":482,"author":{"gitId":"angsongyee"},"content":"6. Should be able to respond within 2 seconds of user input.","lastModifiedDate":"2024-03-06"},{"lineNumber":483,"author":{"gitId":"angsongyee"},"content":"7. Should be able to launch and load its saved data below 10 seconds.","lastModifiedDate":"2024-03-06"},{"lineNumber":484,"author":{"gitId":"angsongyee"},"content":"8. Should be able to run basic commands (add, list, update, delete) without a network connection.","lastModifiedDate":"2024-03-06"},{"lineNumber":485,"author":{"gitId":"angsongyee"},"content":"9. Any stored data should be in a human-readable format.","lastModifiedDate":"2024-03-06"},{"lineNumber":486,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":487,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":488,"author":{"gitId":"-"},"content":"### Glossary","lastModifiedDate":"2020-05-23"},{"lineNumber":489,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":490,"author":{"gitId":"-"},"content":"* **Mainstream OS**: Windows, Linux, Unix, MacOS","lastModifiedDate":"2024-02-09"},{"lineNumber":491,"author":{"gitId":"angsongyee"},"content":"* **Contact**: An entry that holds information about someone that the user wants to save.","lastModifiedDate":"2024-03-06"},{"lineNumber":492,"author":{"gitId":"-"},"content":"* **Private contact detail**: A contact detail that is not meant to be shared with others","lastModifiedDate":"2020-05-23"},{"lineNumber":493,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":494,"author":{"gitId":"-"},"content":"--------------------------------------------------------------------------------------------------------------------","lastModifiedDate":"2020-05-23"},{"lineNumber":495,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":496,"author":{"gitId":"-"},"content":"## **Appendix: Instructions for manual testing**","lastModifiedDate":"2020-05-23"},{"lineNumber":497,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":498,"author":{"gitId":"-"},"content":"Given below are instructions to test the app manually.","lastModifiedDate":"2020-05-23"},{"lineNumber":499,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":500,"author":{"gitId":"-"},"content":"\u003cbox type\u003d\"info\" seamless\u003e","lastModifiedDate":"2023-09-12"},{"lineNumber":501,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2023-09-12"},{"lineNumber":502,"author":{"gitId":"-"},"content":"**Note:** These instructions only provide a starting point for testers to work on;","lastModifiedDate":"2023-09-12"},{"lineNumber":503,"author":{"gitId":"-"},"content":"testers are expected to do more *exploratory* testing.","lastModifiedDate":"2020-05-23"},{"lineNumber":504,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":505,"author":{"gitId":"-"},"content":"\u003c/box\u003e","lastModifiedDate":"2023-09-12"},{"lineNumber":506,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":507,"author":{"gitId":"-"},"content":"### Launch and shutdown","lastModifiedDate":"2020-05-23"},{"lineNumber":508,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":509,"author":{"gitId":"-"},"content":"1. Initial launch","lastModifiedDate":"2020-05-23"},{"lineNumber":510,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":511,"author":{"gitId":"-"},"content":" 1. Download the jar file and copy into an empty folder","lastModifiedDate":"2020-05-23"},{"lineNumber":512,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":513,"author":{"gitId":"yuechen2001"},"content":" 1. Double-click the jar file Expected: Shows the GUI with a set of sample contacts. The window size may not be","lastModifiedDate":"2024-03-07"},{"lineNumber":514,"author":{"gitId":"yuechen2001"},"content":" optimum.","lastModifiedDate":"2024-03-07"},{"lineNumber":515,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":516,"author":{"gitId":"-"},"content":"1. Saving window preferences","lastModifiedDate":"2020-05-23"},{"lineNumber":517,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":518,"author":{"gitId":"-"},"content":" 1. Resize the window to an optimum size. Move the window to a different location. Close the window.","lastModifiedDate":"2020-05-23"},{"lineNumber":519,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":520,"author":{"gitId":"-"},"content":" 1. Re-launch the app by double-clicking the jar file.\u003cbr\u003e","lastModifiedDate":"2020-05-23"},{"lineNumber":521,"author":{"gitId":"-"},"content":" Expected: The most recent window size and location is retained.","lastModifiedDate":"2020-05-23"},{"lineNumber":522,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":523,"author":{"gitId":"-"},"content":"1. _{ more test cases …​ }_","lastModifiedDate":"2020-05-23"},{"lineNumber":524,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":525,"author":{"gitId":"-"},"content":"### Deleting a person","lastModifiedDate":"2020-05-23"},{"lineNumber":526,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":527,"author":{"gitId":"-"},"content":"1. Deleting a person while all persons are being shown","lastModifiedDate":"2020-05-23"},{"lineNumber":528,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":529,"author":{"gitId":"-"},"content":" 1. Prerequisites: List all persons using the `list` command. Multiple persons in the list.","lastModifiedDate":"2020-05-23"},{"lineNumber":530,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":531,"author":{"gitId":"-"},"content":" 1. Test case: `delete 1`\u003cbr\u003e","lastModifiedDate":"2020-05-23"},{"lineNumber":532,"author":{"gitId":"yuechen2001"},"content":" Expected: First contact is deleted from the list. Details of the deleted contact shown in the status message.","lastModifiedDate":"2024-03-07"},{"lineNumber":533,"author":{"gitId":"yuechen2001"},"content":" Timestamp in the status bar is updated.","lastModifiedDate":"2024-03-07"},{"lineNumber":534,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":535,"author":{"gitId":"-"},"content":" 1. Test case: `delete 0`\u003cbr\u003e","lastModifiedDate":"2020-05-23"},{"lineNumber":536,"author":{"gitId":"-"},"content":" Expected: No person is deleted. Error details shown in the status message. Status bar remains the same.","lastModifiedDate":"2020-05-23"},{"lineNumber":537,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":538,"author":{"gitId":"-"},"content":" 1. Other incorrect delete commands to try: `delete`, `delete x`, `...` (where x is larger than the list size)\u003cbr\u003e","lastModifiedDate":"2020-05-23"},{"lineNumber":539,"author":{"gitId":"-"},"content":" Expected: Similar to previous.","lastModifiedDate":"2020-05-23"},{"lineNumber":540,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":541,"author":{"gitId":"-"},"content":"1. _{ more test cases …​ }_","lastModifiedDate":"2020-05-23"},{"lineNumber":542,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":543,"author":{"gitId":"-"},"content":"### Saving data","lastModifiedDate":"2020-05-23"},{"lineNumber":544,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":545,"author":{"gitId":"-"},"content":"1. Dealing with missing/corrupted data files","lastModifiedDate":"2020-05-23"},{"lineNumber":546,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":547,"author":{"gitId":"-"},"content":" 1. _{explain how to simulate a missing/corrupted file, and the expected behavior}_","lastModifiedDate":"2020-05-23"},{"lineNumber":548,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":549,"author":{"gitId":"-"},"content":"1. _{ more test cases …​ }_","lastModifiedDate":"2020-05-23"}],"authorContributionMap":{"yuechen2001":202,"angsongyee":9,"-":338}},{"path":"docs/UserGuide.md","fileType":"docs","lines":[{"lineNumber":1,"author":{"gitId":"-"},"content":"---","lastModifiedDate":"2020-05-23"},{"lineNumber":2,"author":{"gitId":"-"},"content":" layout: default.md","lastModifiedDate":"2023-09-12"},{"lineNumber":3,"author":{"gitId":"-"},"content":" title: \"User Guide\"","lastModifiedDate":"2023-09-12"},{"lineNumber":4,"author":{"gitId":"-"},"content":" pageNav: 3","lastModifiedDate":"2023-09-12"},{"lineNumber":5,"author":{"gitId":"-"},"content":"---","lastModifiedDate":"2020-05-23"},{"lineNumber":6,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":7,"author":{"gitId":"maiyasaliha"},"content":"# CodeConnect User Guide","lastModifiedDate":"2024-03-06"},{"lineNumber":8,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":9,"author":{"gitId":"maiyasaliha"},"content":"CodeConnect (CC) is a **desktop app for managing student contacts, optimized for use via a Line Interface** (CLI) while still having the benefits of a Graphical User Interface (GUI). If you can type fast, CC can get your contact management tasks done faster than traditional GUI apps.","lastModifiedDate":"2024-03-06"},{"lineNumber":10,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2023-09-12"},{"lineNumber":11,"author":{"gitId":"-"},"content":"\u003c!-- * Table of Contents --\u003e","lastModifiedDate":"2023-09-12"},{"lineNumber":12,"author":{"gitId":"-"},"content":"\u003cpage-nav-print /\u003e","lastModifiedDate":"2023-09-12"},{"lineNumber":13,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":14,"author":{"gitId":"tanguoyang"},"content":"---","lastModifiedDate":"2024-03-07"},{"lineNumber":15,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":16,"author":{"gitId":"-"},"content":"## Quick start","lastModifiedDate":"2020-05-23"},{"lineNumber":17,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":18,"author":{"gitId":"-"},"content":"1. Ensure you have Java `11` or above installed in your Computer.","lastModifiedDate":"2020-05-23"},{"lineNumber":19,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":20,"author":{"gitId":"-"},"content":"1. Download the latest `addressbook.jar` from [here](https://github.com/se-edu/addressbook-level3/releases).","lastModifiedDate":"2020-05-23"},{"lineNumber":21,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":22,"author":{"gitId":"-"},"content":"1. Copy the file to the folder you want to use as the _home folder_ for your AddressBook.","lastModifiedDate":"2020-05-23"},{"lineNumber":23,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":24,"author":{"gitId":"-"},"content":"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.\u003cbr\u003e","lastModifiedDate":"2023-01-01"},{"lineNumber":25,"author":{"gitId":"-"},"content":" A GUI similar to the below should appear in a few seconds. Note how the app contains some sample data.\u003cbr\u003e","lastModifiedDate":"2023-01-01"},{"lineNumber":26,"author":{"gitId":"-"},"content":" ![Ui](images/Ui.png)","lastModifiedDate":"2020-05-23"},{"lineNumber":27,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":28,"author":{"gitId":"-"},"content":"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.\u003cbr\u003e","lastModifiedDate":"2020-05-23"},{"lineNumber":29,"author":{"gitId":"-"},"content":" Some example commands you can try:","lastModifiedDate":"2020-05-23"},{"lineNumber":30,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":31,"author":{"gitId":"tanguoyang"},"content":" - `list` : Lists all contacts.","lastModifiedDate":"2024-03-07"},{"lineNumber":32,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":33,"author":{"gitId":"tanguoyang"},"content":" - `add n/John Doe p/98765432 e/johnd@example.com a/John street, block 123, #01-01 g/johnDoee ts/Java` : Adds a contact named `John Doe` to the Address Book.","lastModifiedDate":"2024-03-07"},{"lineNumber":34,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":35,"author":{"gitId":"tanguoyang"},"content":" - `delete 3` : Deletes the 3rd contact shown in the current list.","lastModifiedDate":"2024-03-07"},{"lineNumber":36,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":37,"author":{"gitId":"tanguoyang"},"content":" - `clear` : Deletes all contacts.","lastModifiedDate":"2024-03-07"},{"lineNumber":38,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":39,"author":{"gitId":"tanguoyang"},"content":" - `exit` : Exits the app.","lastModifiedDate":"2024-03-07"},{"lineNumber":40,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":41,"author":{"gitId":"-"},"content":"1. Refer to the [Features](#features) below for details of each command.","lastModifiedDate":"2020-05-23"},{"lineNumber":42,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":43,"author":{"gitId":"tanguoyang"},"content":"---","lastModifiedDate":"2024-03-07"},{"lineNumber":44,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":45,"author":{"gitId":"-"},"content":"## Features","lastModifiedDate":"2020-05-23"},{"lineNumber":46,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":47,"author":{"gitId":"-"},"content":"\u003cbox type\u003d\"info\" seamless\u003e","lastModifiedDate":"2023-09-12"},{"lineNumber":48,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":49,"author":{"gitId":"-"},"content":"**Notes about the command format:**\u003cbr\u003e","lastModifiedDate":"2023-09-12"},{"lineNumber":50,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":51,"author":{"gitId":"tanguoyang"},"content":"- Words in `UPPER_CASE` are the parameters to be supplied by the user.\u003cbr\u003e","lastModifiedDate":"2024-03-07"},{"lineNumber":52,"author":{"gitId":"-"},"content":" e.g. in `add n/NAME`, `NAME` is a parameter which can be used as `add n/John Doe`.","lastModifiedDate":"2020-05-23"},{"lineNumber":53,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":54,"author":{"gitId":"tanguoyang"},"content":"- Items in square brackets are optional.\u003cbr\u003e","lastModifiedDate":"2024-03-07"},{"lineNumber":55,"author":{"gitId":"Teee728"},"content":" e.g `n/NAME [t/TAG] [ts/TECH_STACK]` can be used as `n/John Doe t/friend ts/Java` or as `n/John Doe`.","lastModifiedDate":"2024-03-06"},{"lineNumber":56,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":57,"author":{"gitId":"tanguoyang"},"content":"- Items with `…`​ after them can be used multiple times including zero times.\u003cbr\u003e","lastModifiedDate":"2024-03-07"},{"lineNumber":58,"author":{"gitId":"-"},"content":" e.g. `[t/TAG]…​` can be used as ` ` (i.e. 0 times), `t/friend`, `t/friend t/family` etc.","lastModifiedDate":"2020-05-23"},{"lineNumber":59,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":60,"author":{"gitId":"tanguoyang"},"content":"- Parameters can be in any order.\u003cbr\u003e","lastModifiedDate":"2024-03-07"},{"lineNumber":61,"author":{"gitId":"-"},"content":" e.g. if the command specifies `n/NAME p/PHONE_NUMBER`, `p/PHONE_NUMBER n/NAME` is also acceptable.","lastModifiedDate":"2020-05-23"},{"lineNumber":62,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":63,"author":{"gitId":"tanguoyang"},"content":"- Extraneous parameters for commands that do not take in parameters (such as `help`, `list`, `exit` and `clear`) will be ignored.\u003cbr\u003e","lastModifiedDate":"2024-03-07"},{"lineNumber":64,"author":{"gitId":"-"},"content":" e.g. if the command specifies `help 123`, it will be interpreted as `help`.","lastModifiedDate":"2021-02-03"},{"lineNumber":65,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2021-02-03"},{"lineNumber":66,"author":{"gitId":"tanguoyang"},"content":"- 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.","lastModifiedDate":"2024-03-07"},{"lineNumber":67,"author":{"gitId":"-"},"content":" \u003c/box\u003e","lastModifiedDate":"2023-09-12"},{"lineNumber":68,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":69,"author":{"gitId":"-"},"content":"### Viewing help : `help`","lastModifiedDate":"2020-05-23"},{"lineNumber":70,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":71,"author":{"gitId":"-"},"content":"Shows a message explaning how to access the help page.","lastModifiedDate":"2020-05-23"},{"lineNumber":72,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":73,"author":{"gitId":"-"},"content":"![help message](images/helpMessage.png)","lastModifiedDate":"2020-05-23"},{"lineNumber":74,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":75,"author":{"gitId":"-"},"content":"Format: `help`","lastModifiedDate":"2020-05-23"},{"lineNumber":76,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":77,"author":{"gitId":"tanguoyang"},"content":"### Adding a contact: `add`","lastModifiedDate":"2024-03-07"},{"lineNumber":78,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":79,"author":{"gitId":"tanguoyang"},"content":"Adds a contact to the address book.","lastModifiedDate":"2024-03-07"},{"lineNumber":80,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":81,"author":{"gitId":"Teee728"},"content":"Format: `add n/NAME p/PHONE_NUMBER e/EMAIL a/ADDRESS g/GITHUB_USERNAME [t/TAG] [ts/TECH_STACK]…​`","lastModifiedDate":"2024-03-07"},{"lineNumber":82,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":83,"author":{"gitId":"-"},"content":"\u003cbox type\u003d\"tip\" seamless\u003e","lastModifiedDate":"2023-09-12"},{"lineNumber":84,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2023-09-12"},{"lineNumber":85,"author":{"gitId":"Teee728"},"content":"**Tip:** A contact can have any number of tags and tech stack (including 0)","lastModifiedDate":"2024-03-06"},{"lineNumber":86,"author":{"gitId":"-"},"content":"\u003c/box\u003e","lastModifiedDate":"2023-09-12"},{"lineNumber":87,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":88,"author":{"gitId":"-"},"content":"Examples:","lastModifiedDate":"2020-05-23"},{"lineNumber":89,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":90,"author":{"gitId":"tanguoyang"},"content":"- `add n/John Doe p/98765432 e/johnd@example.com a/John street, block 123, #01-01 g/johnDoee`","lastModifiedDate":"2024-03-07"},{"lineNumber":91,"author":{"gitId":"tanguoyang"},"content":"- `add n/Betsy Crowe t/friend e/betsycrowe@example.com a/Newgate Prison p/1234567 g/betBetty t/criminal ts/Flutter`","lastModifiedDate":"2024-03-07"},{"lineNumber":92,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":93,"author":{"gitId":"tanguoyang"},"content":"### Listing all contacts : `list`","lastModifiedDate":"2024-03-07"},{"lineNumber":94,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":95,"author":{"gitId":"tanguoyang"},"content":"Shows a list of all contacts in the address book.","lastModifiedDate":"2024-03-07"},{"lineNumber":96,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":97,"author":{"gitId":"-"},"content":"Format: `list`","lastModifiedDate":"2020-05-23"},{"lineNumber":98,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":99,"author":{"gitId":"tanguoyang"},"content":"### Editing a contact : `edit`","lastModifiedDate":"2024-03-07"},{"lineNumber":100,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":101,"author":{"gitId":"tanguoyang"},"content":"Edits an existing contact in the address book.","lastModifiedDate":"2024-03-07"},{"lineNumber":102,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":103,"author":{"gitId":"angsongyee"},"content":"Format: `edit INDEX [n/NAME] [p/PHONE] [e/EMAIL] [a/ADDRESS] [g/GITHUB_USERNAME] [t/TAG]…​ [ts/TECH_STACK]…​`","lastModifiedDate":"2024-03-07"},{"lineNumber":104,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":105,"author":{"gitId":"tanguoyang"},"content":"- Edits the contact at the specified `INDEX`. The index refers to the index number shown in the displayed contact list. The index **must be a positive integer** 1, 2, 3, …​","lastModifiedDate":"2024-03-07"},{"lineNumber":106,"author":{"gitId":"tanguoyang"},"content":"- At least one of the optional fields must be provided.","lastModifiedDate":"2024-03-07"},{"lineNumber":107,"author":{"gitId":"tanguoyang"},"content":"- Existing values will be updated to the input values.","lastModifiedDate":"2024-03-07"},{"lineNumber":108,"author":{"gitId":"tanguoyang"},"content":"- When editing tags, the existing tags of the person will be removed i.e adding of tags is not cumulative.","lastModifiedDate":"2024-03-07"},{"lineNumber":109,"author":{"gitId":"tanguoyang"},"content":"- You can remove all the person’s tags and tech stack by typing `t/` and `/ts` without","lastModifiedDate":"2024-03-07"},{"lineNumber":110,"author":{"gitId":"-"},"content":" specifying any tags after it.","lastModifiedDate":"2020-05-23"},{"lineNumber":111,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":112,"author":{"gitId":"-"},"content":"Examples:","lastModifiedDate":"2020-05-23"},{"lineNumber":113,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":114,"author":{"gitId":"tanguoyang"},"content":"- `edit 1 p/91234567 e/johndoe@example.com` Edits the phone number and email address of the 1st contact to be `91234567` and `johndoe@example.com` respectively.","lastModifiedDate":"2024-03-07"},{"lineNumber":115,"author":{"gitId":"tanguoyang"},"content":"- `edit 2 n/Betsy Crower t/` Edits the name of the 2nd contact to be `Betsy Crower` and clears all existing tags.","lastModifiedDate":"2024-03-07"},{"lineNumber":116,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":117,"author":{"gitId":"tanguoyang"},"content":"### Locating contacts by name: `find`","lastModifiedDate":"2024-03-07"},{"lineNumber":118,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":119,"author":{"gitId":"tanguoyang"},"content":"Finds contacts whose names contain any of the given keywords.","lastModifiedDate":"2024-03-07"},{"lineNumber":120,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":121,"author":{"gitId":"-"},"content":"Format: `find KEYWORD [MORE_KEYWORDS]`","lastModifiedDate":"2020-05-23"},{"lineNumber":122,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":123,"author":{"gitId":"tanguoyang"},"content":"- The search is case-insensitive. e.g `hans` will match `Hans`","lastModifiedDate":"2024-03-07"},{"lineNumber":124,"author":{"gitId":"tanguoyang"},"content":"- The order of the keywords does not matter. e.g. `Hans Bo` will match `Bo Hans`","lastModifiedDate":"2024-03-07"},{"lineNumber":125,"author":{"gitId":"tanguoyang"},"content":"- Only the name is searched.","lastModifiedDate":"2024-03-07"},{"lineNumber":126,"author":{"gitId":"tanguoyang"},"content":"- Only full words will be matched e.g. `Han` will not match `Hans`","lastModifiedDate":"2024-03-07"},{"lineNumber":127,"author":{"gitId":"tanguoyang"},"content":"- contacts matching at least one keyword will be returned (i.e. `OR` search).","lastModifiedDate":"2024-03-07"},{"lineNumber":128,"author":{"gitId":"-"},"content":" e.g. `Hans Bo` will return `Hans Gruber`, `Bo Yang`","lastModifiedDate":"2020-05-23"},{"lineNumber":129,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":130,"author":{"gitId":"-"},"content":"Examples:","lastModifiedDate":"2020-05-23"},{"lineNumber":131,"author":{"gitId":"tanguoyang"},"content":"","lastModifiedDate":"2024-03-07"},{"lineNumber":132,"author":{"gitId":"tanguoyang"},"content":"- `find John` returns `john` and `John Doe`","lastModifiedDate":"2024-03-07"},{"lineNumber":133,"author":{"gitId":"tanguoyang"},"content":"- `find alex david` returns `Alex Yeoh`, `David Li`\u003cbr\u003e","lastModifiedDate":"2024-03-07"},{"lineNumber":134,"author":{"gitId":"-"},"content":" ![result for \u0027find alex david\u0027](images/findAlexDavidResult.png)","lastModifiedDate":"2020-05-23"},{"lineNumber":135,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":136,"author":{"gitId":"tanguoyang"},"content":"### Deleting a contact : `delete`","lastModifiedDate":"2024-03-07"},{"lineNumber":137,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":138,"author":{"gitId":"tanguoyang"},"content":"Deletes the specified contact from the address book.","lastModifiedDate":"2024-03-07"},{"lineNumber":139,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":140,"author":{"gitId":"-"},"content":"Format: `delete INDEX`","lastModifiedDate":"2020-05-23"},{"lineNumber":141,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":142,"author":{"gitId":"tanguoyang"},"content":"- Deletes the contact at the specified `INDEX`.","lastModifiedDate":"2024-03-07"},{"lineNumber":143,"author":{"gitId":"tanguoyang"},"content":"- The index refers to the index number shown in the displayed contact list.","lastModifiedDate":"2024-03-07"},{"lineNumber":144,"author":{"gitId":"tanguoyang"},"content":"- The index **must be a positive integer** 1, 2, 3, …​","lastModifiedDate":"2024-03-07"},{"lineNumber":145,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":146,"author":{"gitId":"-"},"content":"Examples:","lastModifiedDate":"2020-05-23"},{"lineNumber":147,"author":{"gitId":"tanguoyang"},"content":"","lastModifiedDate":"2024-03-07"},{"lineNumber":148,"author":{"gitId":"tanguoyang"},"content":"- `list` followed by `delete 2` deletes the 2nd contact in the address book.","lastModifiedDate":"2024-03-07"},{"lineNumber":149,"author":{"gitId":"tanguoyang"},"content":"- `find Betsy` followed by `delete 1` deletes the 1st contact in the results of the `find` command.","lastModifiedDate":"2024-03-07"},{"lineNumber":150,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":151,"author":{"gitId":"-"},"content":"### Clearing all entries : `clear`","lastModifiedDate":"2020-05-23"},{"lineNumber":152,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":153,"author":{"gitId":"-"},"content":"Clears all entries from the address book.","lastModifiedDate":"2020-05-23"},{"lineNumber":154,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":155,"author":{"gitId":"-"},"content":"Format: `clear`","lastModifiedDate":"2020-05-23"},{"lineNumber":156,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":157,"author":{"gitId":"-"},"content":"### Exiting the program : `exit`","lastModifiedDate":"2020-05-23"},{"lineNumber":158,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":159,"author":{"gitId":"-"},"content":"Exits the program.","lastModifiedDate":"2020-05-23"},{"lineNumber":160,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":161,"author":{"gitId":"-"},"content":"Format: `exit`","lastModifiedDate":"2020-05-23"},{"lineNumber":162,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":163,"author":{"gitId":"-"},"content":"### Saving the data","lastModifiedDate":"2020-05-23"},{"lineNumber":164,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":165,"author":{"gitId":"-"},"content":"AddressBook data are saved in the hard disk automatically after any command that changes the data. There is no need to save manually.","lastModifiedDate":"2020-05-23"},{"lineNumber":166,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":167,"author":{"gitId":"-"},"content":"### Editing the data file","lastModifiedDate":"2021-02-04"},{"lineNumber":168,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2021-02-04"},{"lineNumber":169,"author":{"gitId":"-"},"content":"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.","lastModifiedDate":"2023-09-08"},{"lineNumber":170,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2021-02-04"},{"lineNumber":171,"author":{"gitId":"-"},"content":"\u003cbox type\u003d\"warning\" seamless\u003e","lastModifiedDate":"2023-09-12"},{"lineNumber":172,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2023-09-12"},{"lineNumber":173,"author":{"gitId":"-"},"content":"**Caution:**","lastModifiedDate":"2023-09-12"},{"lineNumber":174,"author":{"gitId":"-"},"content":"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.\u003cbr\u003e","lastModifiedDate":"2024-02-09"},{"lineNumber":175,"author":{"gitId":"-"},"content":"Furthermore, certain edits can cause the AddressBook to behave in unexpected ways (e.g., if a value entered is outside the acceptable range). Therefore, edit the data file only if you are confident that you can update it correctly.","lastModifiedDate":"2023-09-12"},{"lineNumber":176,"author":{"gitId":"-"},"content":"\u003c/box\u003e","lastModifiedDate":"2023-09-12"},{"lineNumber":177,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2021-02-04"},{"lineNumber":178,"author":{"gitId":"-"},"content":"### Archiving data files `[coming in v2.0]`","lastModifiedDate":"2020-05-23"},{"lineNumber":179,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":180,"author":{"gitId":"-"},"content":"_Details coming soon ..._","lastModifiedDate":"2021-02-04"},{"lineNumber":181,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":182,"author":{"gitId":"tanguoyang"},"content":"---","lastModifiedDate":"2024-03-07"},{"lineNumber":183,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":184,"author":{"gitId":"-"},"content":"## FAQ","lastModifiedDate":"2020-05-23"},{"lineNumber":185,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":186,"author":{"gitId":"-"},"content":"**Q**: How do I transfer my data to another Computer?\u003cbr\u003e","lastModifiedDate":"2020-05-23"},{"lineNumber":187,"author":{"gitId":"-"},"content":"**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.","lastModifiedDate":"2020-05-23"},{"lineNumber":188,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":189,"author":{"gitId":"tanguoyang"},"content":"---","lastModifiedDate":"2024-03-07"},{"lineNumber":190,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":191,"author":{"gitId":"-"},"content":"## Known issues","lastModifiedDate":"2023-09-08"},{"lineNumber":192,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2023-09-08"},{"lineNumber":193,"author":{"gitId":"-"},"content":"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.","lastModifiedDate":"2023-09-08"},{"lineNumber":194,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2023-09-08"},{"lineNumber":195,"author":{"gitId":"tanguoyang"},"content":"---","lastModifiedDate":"2024-03-07"},{"lineNumber":196,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2023-09-08"},{"lineNumber":197,"author":{"gitId":"-"},"content":"## Command summary","lastModifiedDate":"2020-05-23"},{"lineNumber":198,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":199,"author":{"gitId":"tanguoyang"},"content":"| Action | Format, Examples |","lastModifiedDate":"2024-03-07"},{"lineNumber":200,"author":{"gitId":"angsongyee"},"content":"|------------|-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------|","lastModifiedDate":"2024-03-07"},{"lineNumber":201,"author":{"gitId":"tanguoyang"},"content":"| **Add** | `add n/NAME p/PHONE_NUMBER e/EMAIL a/ADDRESS g/GITHUB_USERNAME [t/TAG] [ts/TECH_STACK]…​` \u003cbr\u003e e.g., `add n/James Ho p/22224444 e/jamesho@example.com a/123, Clementi Rd, 1234665 g/Jamesho123 t/friend t/colleague ts/Java ts/C++` |","lastModifiedDate":"2024-03-07"},{"lineNumber":202,"author":{"gitId":"tanguoyang"},"content":"| **Clear** | `clear` |","lastModifiedDate":"2024-03-07"},{"lineNumber":203,"author":{"gitId":"tanguoyang"},"content":"| **Delete** | `delete INDEX`\u003cbr\u003e e.g., `delete 3` |","lastModifiedDate":"2024-03-07"},{"lineNumber":204,"author":{"gitId":"angsongyee"},"content":"| **Edit** | `edit INDEX [n/NAME] [p/PHONE_NUMBER] [e/EMAIL] [a/ADDRESS] [g/GITHUB_USERNAME] [t/TAG]…​ [ts/TECH_STACK]…​ `\u003cbr\u003e e.g.,`edit 2 n/James Lee e/jameslee@example.com` |","lastModifiedDate":"2024-03-07"},{"lineNumber":205,"author":{"gitId":"tanguoyang"},"content":"| **Find** | `find KEYWORD [MORE_KEYWORDS]`\u003cbr\u003e e.g., `find James Jake` |","lastModifiedDate":"2024-03-07"},{"lineNumber":206,"author":{"gitId":"tanguoyang"},"content":"| **List** | `list` |","lastModifiedDate":"2024-03-07"},{"lineNumber":207,"author":{"gitId":"tanguoyang"},"content":"| **Help** | `help` |","lastModifiedDate":"2024-03-07"}],"authorContributionMap":{"angsongyee":3,"tanguoyang":56,"maiyasaliha":2,"Teee728":3,"-":143}}] diff --git a/AY2324S2-CS2103T-T12-1_tp_master/commits.json b/AY2324S2-CS2103T-T12-1_tp_master/commits.json index 2105a262..fc4e1a54 100644 --- a/AY2324S2-CS2103T-T12-1_tp_master/commits.json +++ b/AY2324S2-CS2103T-T12-1_tp_master/commits.json @@ -1 +1 @@ -{"authorDailyContributionsMap":{"yuechen2001":[{"date":"2024-03-07","commitResults":[{"hash":"76c89a659dde95e27dce7ed90ee7c66a45d6ae97","isMergeCommit":false,"messageTitle":"Update target user, value prop, user stories, use cases","messageBody":"","fileTypesAndContributionMap":{"docs":{"insertions":231,"deletions":85}}},{"hash":"2300dc78e693bced4d8676c6362e2b4b65bea85d","isMergeCommit":true,"messageTitle":"Merge pull request #30 from yuechen2001/update-developer-guide-v1.1","messageBody":"Update DG v1.1","fileTypesAndContributionMap":{}},{"hash":"c5fc77c397784581d713060ffa389e3def094bd5","isMergeCommit":false,"messageTitle":"Update title and description of UG","messageBody":"","fileTypesAndContributionMap":{"docs":{"insertions":2,"deletions":2}}},{"hash":"11fe35a6eb7fddb83167b722e2800767314a8e8d","isMergeCommit":true,"messageTitle":"Merge pull request #34 from tanguoyang/branch-update-aboutus-readme","messageBody":"Update about us and readme","fileTypesAndContributionMap":{}}]}],"angsongyee":[{"date":"2024-03-06","commitResults":[{"hash":"26099f5831b16baf167a6ac7a75e92a93ab7dfc0","isMergeCommit":false,"messageTitle":"Update developer guide (NFRs, Glossary)","messageBody":"Added additional non-functional requirements to comply with\nthe tP constraints, and added one term to the glossary\n(waiting for the rest of the developer guide to be completed\nto add any additional terms.)\n","fileTypesAndContributionMap":{"docs":{"insertions":9,"deletions":3}}}]},{"date":"2024-03-07","commitResults":[{"hash":"635916060f46109a5259db3044dc1ed839bd1df4","isMergeCommit":true,"messageTitle":"Merge remote-tracking branch \u0027origin/master\u0027 into update-developer-guide-V1.1","messageBody":"","fileTypesAndContributionMap":{}},{"hash":"33fe5c65c8391caf7130fe01996a2578dbe86eac","isMergeCommit":true,"messageTitle":"Merge pull request #24 from angsongyee/update-developer-guide-V1.1","messageBody":"Update developer guide (NFRs, Glossary)","fileTypesAndContributionMap":{}},{"hash":"8adba988d9c9e3de9c7842216fc713f4a98a8bf5","isMergeCommit":true,"messageTitle":"Merge pull request #31 from yuechen2001/update-user-guide-v1.2","messageBody":"Update title and description of UG","fileTypesAndContributionMap":{}},{"hash":"1ea64a88097d7dadc5de6c30335018415a9c5e16","isMergeCommit":false,"messageTitle":"Update userguide (Update contact feature)","messageBody":"Updated command format\n","fileTypesAndContributionMap":{"docs":{"insertions":10,"deletions":10}}},{"hash":"cde2da3f5a59d68e64272543134d31409b8ed4ca","isMergeCommit":true,"messageTitle":"Merge pull request #35 from angsongyee/update-userguide-editfeature","messageBody":"Update user guide (Update contact feature)","fileTypesAndContributionMap":{}}]}],"tanguoyang":[{"date":"2024-03-07","commitResults":[{"hash":"63687fce74d8085a8f1ba92eb9f96ed77d2b971d","isMergeCommit":false,"messageTitle":"update about us and readme","messageBody":"","fileTypesAndContributionMap":{"docs":{"insertions":41,"deletions":40}}},{"hash":"97d2df822e633f835cf4378e25830849f92839de","isMergeCommit":false,"messageTitle":"add new line to eof","messageBody":"","fileTypesAndContributionMap":{"docs":{"insertions":2,"deletions":1}}}]}],"maiyasaliha":[{"date":"2024-03-06","commitResults":[{"hash":"a1b02ef5e18507e8ea6cc29779f5746415318515","isMergeCommit":false,"messageTitle":"Fixes #17","messageBody":"Updated Delete Contact feature description in User Guide.\n","fileTypesAndContributionMap":{"docs":{"insertions":8,"deletions":8}}}]},{"date":"2024-03-07","commitResults":[{"hash":"96cd1d3b4fffb96cf8590f1ea2e62dae8e2f9578","isMergeCommit":true,"messageTitle":"Merge pull request #28 from maiyasaliha/branch-A-UserGuide","messageBody":"Updated Delete Contact feature","fileTypesAndContributionMap":{}},{"hash":"16a4fba351e99ecd96ab12b9f3d054e0ea37e77c","isMergeCommit":true,"messageTitle":"Merge branch \u0027master\u0027 into update-user-guide-v1.2","messageBody":"","fileTypesAndContributionMap":{}}]}],"Teee728":[{"date":"2024-03-06","commitResults":[{"hash":"42d2ad7464d2238651f1a90d31d3023fa1b96708","isMergeCommit":false,"messageTitle":"Update Add contact feature in User Guide","messageBody":"","fileTypesAndContributionMap":{"docs":{"insertions":8,"deletions":8}}},{"hash":"3b53bc9bc52ccaced1ac423c00783cd3478e8b23","isMergeCommit":false,"messageTitle":"Change \"Person\" to \"Contact\" in User Guide","messageBody":"","fileTypesAndContributionMap":{"docs":{"insertions":3,"deletions":3}}}]},{"date":"2024-03-07","commitResults":[{"hash":"4b3b9b300d122774774442e98d4e49503c7a0d44","isMergeCommit":false,"messageTitle":"Corrected errors regarding GitHub username and tech stack commands","messageBody":"","fileTypesAndContributionMap":{"docs":{"insertions":3,"deletions":3}}},{"hash":"984457a3e213d8b0303f7c57c0dc1067faf2a13c","isMergeCommit":true,"messageTitle":"Merge pull request #29 from Teee728/add-feature-user-guide","messageBody":"Update User Guide (Add contact feature)","fileTypesAndContributionMap":{}}]}]},"authorFileTypeContributionMap":{"yuechen2001":{"docs":204,"functional-code":0,"test-code":0},"angsongyee":{"docs":19,"functional-code":0,"test-code":0},"tanguoyang":{"docs":41,"functional-code":0,"test-code":0},"maiyasaliha":{"docs":7,"functional-code":0,"test-code":0},"Teee728":{"docs":9,"functional-code":0,"test-code":0}},"authorContributionVariance":{"yuechen2001":6791.8364,"angsongyee":33.632652,"tanguoyang":468.0,"maiyasaliha":16.979591,"Teee728":33.142857},"authorDisplayNameMap":{"yuechen2001":"CS2103T-T12-1 ZHU ..CHEN","angsongyee":"CS2103T-T12-1 ANG .. YEE","tanguoyang":"CS2103T-T12-1 TAN ..YANG","maiyasaliha":"CS2103T-T12-1 P M ..LIHA","Teee728":"CS2103T-T12-1 THOM.. ANN"}} +{"authorDailyContributionsMap":{"yuechen2001":[{"date":"2024-03-07","commitResults":[{"hash":"76c89a659dde95e27dce7ed90ee7c66a45d6ae97","isMergeCommit":false,"messageTitle":"Update target user, value prop, user stories, use cases","messageBody":"","fileTypesAndContributionMap":{"docs":{"insertions":231,"deletions":85}}},{"hash":"2300dc78e693bced4d8676c6362e2b4b65bea85d","isMergeCommit":true,"messageTitle":"Merge pull request #30 from yuechen2001/update-developer-guide-v1.1","messageBody":"Update DG v1.1","fileTypesAndContributionMap":{}},{"hash":"c5fc77c397784581d713060ffa389e3def094bd5","isMergeCommit":false,"messageTitle":"Update title and description of UG","messageBody":"","fileTypesAndContributionMap":{"docs":{"insertions":2,"deletions":2}}},{"hash":"11fe35a6eb7fddb83167b722e2800767314a8e8d","isMergeCommit":true,"messageTitle":"Merge pull request #34 from tanguoyang/branch-update-aboutus-readme","messageBody":"Update about us and readme","fileTypesAndContributionMap":{}}]}],"angsongyee":[{"date":"2024-03-06","commitResults":[{"hash":"26099f5831b16baf167a6ac7a75e92a93ab7dfc0","isMergeCommit":false,"messageTitle":"Update developer guide (NFRs, Glossary)","messageBody":"Added additional non-functional requirements to comply with\nthe tP constraints, and added one term to the glossary\n(waiting for the rest of the developer guide to be completed\nto add any additional terms.)\n","fileTypesAndContributionMap":{"docs":{"insertions":9,"deletions":3}}}]},{"date":"2024-03-07","commitResults":[{"hash":"635916060f46109a5259db3044dc1ed839bd1df4","isMergeCommit":true,"messageTitle":"Merge remote-tracking branch \u0027origin/master\u0027 into update-developer-guide-V1.1","messageBody":"","fileTypesAndContributionMap":{}},{"hash":"33fe5c65c8391caf7130fe01996a2578dbe86eac","isMergeCommit":true,"messageTitle":"Merge pull request #24 from angsongyee/update-developer-guide-V1.1","messageBody":"Update developer guide (NFRs, Glossary)","fileTypesAndContributionMap":{}},{"hash":"8adba988d9c9e3de9c7842216fc713f4a98a8bf5","isMergeCommit":true,"messageTitle":"Merge pull request #31 from yuechen2001/update-user-guide-v1.2","messageBody":"Update title and description of UG","fileTypesAndContributionMap":{}},{"hash":"1ea64a88097d7dadc5de6c30335018415a9c5e16","isMergeCommit":false,"messageTitle":"Update userguide (Update contact feature)","messageBody":"Updated command format\n","fileTypesAndContributionMap":{"docs":{"insertions":10,"deletions":10}}},{"hash":"cde2da3f5a59d68e64272543134d31409b8ed4ca","isMergeCommit":true,"messageTitle":"Merge pull request #35 from angsongyee/update-userguide-editfeature","messageBody":"Update user guide (Update contact feature)","fileTypesAndContributionMap":{}}]}],"tanguoyang":[{"date":"2024-03-07","commitResults":[{"hash":"63687fce74d8085a8f1ba92eb9f96ed77d2b971d","isMergeCommit":false,"messageTitle":"update about us and readme","messageBody":"","fileTypesAndContributionMap":{"docs":{"insertions":41,"deletions":40}}},{"hash":"97d2df822e633f835cf4378e25830849f92839de","isMergeCommit":false,"messageTitle":"add new line to eof","messageBody":"","fileTypesAndContributionMap":{"docs":{"insertions":2,"deletions":1}}},{"hash":"1044bab66490b3e9fb988a51c5dfe9037381c9ef","isMergeCommit":false,"messageTitle":"Fix CI Badge","messageBody":"Point CI Badge to correct project\nFix minor issues for 2103 script\n","fileTypesAndContributionMap":{"docs":{"insertions":3,"deletions":5}}},{"hash":"72c2948de219f3e0f85deceb99af3f1fa0e5262c","isMergeCommit":false,"messageTitle":"Change person to contact","messageBody":"","fileTypesAndContributionMap":{"docs":{"insertions":21,"deletions":21}}},{"hash":"c3734e7249c601c54a1b49b52107d320f54a5183","isMergeCommit":true,"messageTitle":"Merge branch \u0027master\u0027 into branch-update-aboutus-readme","messageBody":"","fileTypesAndContributionMap":{}},{"hash":"dfb3286d2e0a579f0de8573454c4cb57a025967b","isMergeCommit":true,"messageTitle":"Merge branch \u0027master\u0027 into branch-update-aboutus-readme","messageBody":"","fileTypesAndContributionMap":{}}]},{"date":"2024-03-08","commitResults":[{"hash":"0b421e012809c4ccee00e7980cbac550143256be","isMergeCommit":true,"messageTitle":"Merge branch \u0027master\u0027 into branch-update-aboutus-readme","messageBody":"","fileTypesAndContributionMap":{}},{"hash":"a96c964065d95bd574b73516de9e4dd0d368d8ea","isMergeCommit":false,"messageTitle":"Rename profile picture to lowercase","messageBody":"","fileTypesAndContributionMap":{"docs":{"insertions":1,"deletions":1}}},{"hash":"25fc3e4138890179c2681642c3a22bb3d250aa4a","isMergeCommit":true,"messageTitle":"Merge pull request #36 from tanguoyang/branch-update-aboutus-readme","messageBody":"Link ci badge to project\r\nRename persons to contact\r\n","fileTypesAndContributionMap":{}}]}],"maiyasaliha":[{"date":"2024-03-06","commitResults":[{"hash":"a1b02ef5e18507e8ea6cc29779f5746415318515","isMergeCommit":false,"messageTitle":"Fixes #17","messageBody":"Updated Delete Contact feature description in User Guide.\n","fileTypesAndContributionMap":{"docs":{"insertions":8,"deletions":8}}}]},{"date":"2024-03-07","commitResults":[{"hash":"96cd1d3b4fffb96cf8590f1ea2e62dae8e2f9578","isMergeCommit":true,"messageTitle":"Merge pull request #28 from maiyasaliha/branch-A-UserGuide","messageBody":"Updated Delete Contact feature","fileTypesAndContributionMap":{}},{"hash":"16a4fba351e99ecd96ab12b9f3d054e0ea37e77c","isMergeCommit":true,"messageTitle":"Merge branch \u0027master\u0027 into update-user-guide-v1.2","messageBody":"","fileTypesAndContributionMap":{}}]}],"Teee728":[{"date":"2024-03-06","commitResults":[{"hash":"42d2ad7464d2238651f1a90d31d3023fa1b96708","isMergeCommit":false,"messageTitle":"Update Add contact feature in User Guide","messageBody":"","fileTypesAndContributionMap":{"docs":{"insertions":8,"deletions":8}}},{"hash":"3b53bc9bc52ccaced1ac423c00783cd3478e8b23","isMergeCommit":false,"messageTitle":"Change \"Person\" to \"Contact\" in User Guide","messageBody":"","fileTypesAndContributionMap":{"docs":{"insertions":3,"deletions":3}}}]},{"date":"2024-03-07","commitResults":[{"hash":"4b3b9b300d122774774442e98d4e49503c7a0d44","isMergeCommit":false,"messageTitle":"Corrected errors regarding GitHub username and tech stack commands","messageBody":"","fileTypesAndContributionMap":{"docs":{"insertions":3,"deletions":3}}},{"hash":"984457a3e213d8b0303f7c57c0dc1067faf2a13c","isMergeCommit":true,"messageTitle":"Merge pull request #29 from Teee728/add-feature-user-guide","messageBody":"Update User Guide (Add contact feature)","fileTypesAndContributionMap":{}}]}]},"authorFileTypeContributionMap":{"yuechen2001":{"docs":202,"functional-code":0,"test-code":0},"angsongyee":{"docs":12,"functional-code":0,"test-code":0},"tanguoyang":{"docs":97,"functional-code":0,"test-code":0},"maiyasaliha":{"docs":2,"functional-code":0,"test-code":0},"Teee728":{"docs":3,"functional-code":0,"test-code":0}},"authorContributionVariance":{"yuechen2001":6371.555,"angsongyee":31.715557,"tanguoyang":1115.1289,"maiyasaliha":15.928888,"Teee728":31.18222},"authorDisplayNameMap":{"yuechen2001":"CS2103T-T12-1 ZHU ..CHEN","angsongyee":"CS2103T-T12-1 ANG .. YEE","tanguoyang":"CS2103T-T12-1 TAN ..YANG","maiyasaliha":"CS2103T-T12-1 P M ..LIHA","Teee728":"CS2103T-T12-1 THOM.. ANN"}} diff --git a/AY2324S2-CS2103T-T12-3_tp_master/authorship.json b/AY2324S2-CS2103T-T12-3_tp_master/authorship.json index fe51488c..e0893fff 100644 --- a/AY2324S2-CS2103T-T12-3_tp_master/authorship.json +++ b/AY2324S2-CS2103T-T12-3_tp_master/authorship.json @@ -1 +1 @@ -[] +[{"path":"docs/AboutUs.md","fileType":"docs","lines":[{"lineNumber":1,"author":{"gitId":"-"},"content":"---","lastModifiedDate":"2020-05-23"},{"lineNumber":2,"author":{"gitId":"-"},"content":" layout: default.md","lastModifiedDate":"2023-09-12"},{"lineNumber":3,"author":{"gitId":"-"},"content":" title: \"About Us\"","lastModifiedDate":"2023-09-12"},{"lineNumber":4,"author":{"gitId":"-"},"content":"---","lastModifiedDate":"2020-05-23"},{"lineNumber":5,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":6,"author":{"gitId":"-"},"content":"# About Us","lastModifiedDate":"2023-09-12"},{"lineNumber":7,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2023-09-12"},{"lineNumber":8,"author":{"gitId":"-"},"content":"We are a team based in the [School of Computing, National University of Singapore](http://www.comp.nus.edu.sg).","lastModifiedDate":"2020-05-23"},{"lineNumber":9,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":10,"author":{"gitId":"-"},"content":"You can reach us at the email `seer[at]comp.nus.edu.sg`","lastModifiedDate":"2020-06-17"},{"lineNumber":11,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-06-17"},{"lineNumber":12,"author":{"gitId":"-"},"content":"## Project team","lastModifiedDate":"2020-06-07"},{"lineNumber":13,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":14,"author":{"gitId":"ChuaZenKhoon"},"content":"### Chua Zen Khoon","lastModifiedDate":"2024-03-08"},{"lineNumber":15,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":16,"author":{"gitId":"ChuaZenKhoon"},"content":"\u003cimg src\u003d\"images/chuazenkhoon.png\" width\u003d\"200px\"\u003e","lastModifiedDate":"2024-03-08"},{"lineNumber":17,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":18,"author":{"gitId":"ChuaZenKhoon"},"content":"[[github](https://github.com/ChuaZenKhoon)]","lastModifiedDate":"2024-03-08"},{"lineNumber":19,"author":{"gitId":"ChuaZenKhoon"},"content":"","lastModifiedDate":"2024-03-08"},{"lineNumber":20,"author":{"gitId":"ChuaZenKhoon"},"content":" Y2 CS student. I do creative works such as writing and worldbuilding in my free time!","lastModifiedDate":"2024-03-08"},{"lineNumber":21,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":22,"author":{"gitId":"ChuaZenKhoon"},"content":"* Role: Project Planner","lastModifiedDate":"2024-03-08"},{"lineNumber":23,"author":{"gitId":"ChuaZenKhoon"},"content":"* Responsibilities: Deliverables and Deadlines, Scheduling and Tracking","lastModifiedDate":"2024-03-08"},{"lineNumber":24,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":25,"author":{"gitId":"-"},"content":"### Jane Doe","lastModifiedDate":"2020-06-17"},{"lineNumber":26,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":27,"author":{"gitId":"-"},"content":"\u003cimg src\u003d\"images/johndoe.png\" width\u003d\"200px\"\u003e","lastModifiedDate":"2020-06-17"},{"lineNumber":28,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":29,"author":{"gitId":"-"},"content":"[[github](http://github.com/johndoe)]","lastModifiedDate":"2020-06-17"},{"lineNumber":30,"author":{"gitId":"-"},"content":"[[portfolio](team/johndoe.md)]","lastModifiedDate":"2020-05-23"},{"lineNumber":31,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":32,"author":{"gitId":"-"},"content":"* Role: Team Lead","lastModifiedDate":"2020-05-23"},{"lineNumber":33,"author":{"gitId":"-"},"content":"* Responsibilities: UI","lastModifiedDate":"2020-05-23"},{"lineNumber":34,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":35,"author":{"gitId":"-"},"content":"### Johnny Doe","lastModifiedDate":"2020-05-23"},{"lineNumber":36,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":37,"author":{"gitId":"-"},"content":"\u003cimg src\u003d\"images/johndoe.png\" width\u003d\"200px\"\u003e","lastModifiedDate":"2020-06-17"},{"lineNumber":38,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":39,"author":{"gitId":"-"},"content":"[[github](http://github.com/johndoe)] [[portfolio](team/johndoe.md)]","lastModifiedDate":"2020-06-17"},{"lineNumber":40,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":41,"author":{"gitId":"-"},"content":"* Role: Developer","lastModifiedDate":"2020-05-23"},{"lineNumber":42,"author":{"gitId":"-"},"content":"* Responsibilities: Data","lastModifiedDate":"2020-05-23"},{"lineNumber":43,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":44,"author":{"gitId":"-"},"content":"### Jean Doe","lastModifiedDate":"2020-06-17"},{"lineNumber":45,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":46,"author":{"gitId":"-"},"content":"\u003cimg src\u003d\"images/johndoe.png\" width\u003d\"200px\"\u003e","lastModifiedDate":"2020-06-17"},{"lineNumber":47,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":48,"author":{"gitId":"-"},"content":"[[github](http://github.com/johndoe)]","lastModifiedDate":"2020-06-17"},{"lineNumber":49,"author":{"gitId":"-"},"content":"[[portfolio](team/johndoe.md)]","lastModifiedDate":"2020-05-23"},{"lineNumber":50,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":51,"author":{"gitId":"-"},"content":"* Role: Developer","lastModifiedDate":"2020-05-23"},{"lineNumber":52,"author":{"gitId":"-"},"content":"* Responsibilities: Dev Ops + Threading","lastModifiedDate":"2020-05-23"},{"lineNumber":53,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":54,"author":{"gitId":"-"},"content":"### James Doe","lastModifiedDate":"2020-06-17"},{"lineNumber":55,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":56,"author":{"gitId":"-"},"content":"\u003cimg src\u003d\"images/johndoe.png\" width\u003d\"200px\"\u003e","lastModifiedDate":"2020-06-17"},{"lineNumber":57,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":58,"author":{"gitId":"-"},"content":"[[github](http://github.com/johndoe)]","lastModifiedDate":"2020-06-17"},{"lineNumber":59,"author":{"gitId":"-"},"content":"[[portfolio](team/johndoe.md)]","lastModifiedDate":"2020-05-23"},{"lineNumber":60,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":61,"author":{"gitId":"-"},"content":"* Role: Developer","lastModifiedDate":"2020-05-23"},{"lineNumber":62,"author":{"gitId":"-"},"content":"* Responsibilities: UI","lastModifiedDate":"2020-05-23"}],"authorContributionMap":{"ChuaZenKhoon":7,"-":55}},{"path":"docs/DeveloperGuide.md","fileType":"docs","lines":[{"lineNumber":1,"author":{"gitId":"-"},"content":"---","lastModifiedDate":"2020-05-23"},{"lineNumber":2,"author":{"gitId":"-"},"content":" layout: default.md","lastModifiedDate":"2023-09-12"},{"lineNumber":3,"author":{"gitId":"-"},"content":" title: \"Developer Guide\"","lastModifiedDate":"2023-09-12"},{"lineNumber":4,"author":{"gitId":"-"},"content":" pageNav: 3","lastModifiedDate":"2023-09-12"},{"lineNumber":5,"author":{"gitId":"-"},"content":"---","lastModifiedDate":"2020-05-23"},{"lineNumber":6,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2023-09-12"},{"lineNumber":7,"author":{"gitId":"-"},"content":"# AB-3 Developer Guide","lastModifiedDate":"2023-09-12"},{"lineNumber":8,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2023-09-12"},{"lineNumber":9,"author":{"gitId":"-"},"content":"\u003c!-- * Table of Contents --\u003e","lastModifiedDate":"2023-09-12"},{"lineNumber":10,"author":{"gitId":"-"},"content":"\u003cpage-nav-print /\u003e","lastModifiedDate":"2023-09-12"},{"lineNumber":11,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":12,"author":{"gitId":"-"},"content":"--------------------------------------------------------------------------------------------------------------------","lastModifiedDate":"2020-05-23"},{"lineNumber":13,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2021-07-30"},{"lineNumber":14,"author":{"gitId":"-"},"content":"## **Acknowledgements**","lastModifiedDate":"2021-07-30"},{"lineNumber":15,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2021-07-30"},{"lineNumber":16,"author":{"gitId":"-"},"content":"_{ list here sources of all reused/adapted ideas, code, documentation, and third-party libraries -- include links to the original source as well }_","lastModifiedDate":"2023-09-12"},{"lineNumber":17,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2021-07-30"},{"lineNumber":18,"author":{"gitId":"-"},"content":"--------------------------------------------------------------------------------------------------------------------","lastModifiedDate":"2021-07-30"},{"lineNumber":19,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":20,"author":{"gitId":"-"},"content":"## **Setting up, getting started**","lastModifiedDate":"2020-05-23"},{"lineNumber":21,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":22,"author":{"gitId":"-"},"content":"Refer to the guide [_Setting up and getting started_](SettingUp.md).","lastModifiedDate":"2020-05-23"},{"lineNumber":23,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":24,"author":{"gitId":"-"},"content":"--------------------------------------------------------------------------------------------------------------------","lastModifiedDate":"2020-05-23"},{"lineNumber":25,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":26,"author":{"gitId":"-"},"content":"## **Design**","lastModifiedDate":"2020-05-23"},{"lineNumber":27,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":28,"author":{"gitId":"-"},"content":"### Architecture","lastModifiedDate":"2021-07-31"},{"lineNumber":29,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":30,"author":{"gitId":"-"},"content":"\u003cpuml src\u003d\"diagrams/ArchitectureDiagram.puml\" width\u003d\"280\" /\u003e","lastModifiedDate":"2023-09-12"},{"lineNumber":31,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":32,"author":{"gitId":"-"},"content":"The ***Architecture Diagram*** given above explains the high-level design of the App.","lastModifiedDate":"2021-07-31"},{"lineNumber":33,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":34,"author":{"gitId":"-"},"content":"Given below is a quick overview of main components and how they interact with each other.","lastModifiedDate":"2021-07-31"},{"lineNumber":35,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2021-07-31"},{"lineNumber":36,"author":{"gitId":"-"},"content":"**Main components of the architecture**","lastModifiedDate":"2021-07-31"},{"lineNumber":37,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":38,"author":{"gitId":"-"},"content":"**`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.","lastModifiedDate":"2023-09-03"},{"lineNumber":39,"author":{"gitId":"-"},"content":"* At app launch, it initializes the other components in the correct sequence, and connects them up with each other.","lastModifiedDate":"2023-09-03"},{"lineNumber":40,"author":{"gitId":"-"},"content":"* At shut down, it shuts down the other components and invokes cleanup methods where necessary.","lastModifiedDate":"2023-09-03"},{"lineNumber":41,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":42,"author":{"gitId":"-"},"content":"The bulk of the app\u0027s work is done by the following four components:","lastModifiedDate":"2023-09-03"},{"lineNumber":43,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":44,"author":{"gitId":"-"},"content":"* [**`UI`**](#ui-component): The UI of the App.","lastModifiedDate":"2020-05-23"},{"lineNumber":45,"author":{"gitId":"-"},"content":"* [**`Logic`**](#logic-component): The command executor.","lastModifiedDate":"2020-05-23"},{"lineNumber":46,"author":{"gitId":"-"},"content":"* [**`Model`**](#model-component): Holds the data of the App in memory.","lastModifiedDate":"2020-05-23"},{"lineNumber":47,"author":{"gitId":"-"},"content":"* [**`Storage`**](#storage-component): Reads data from, and writes data to, the hard disk.","lastModifiedDate":"2020-05-23"},{"lineNumber":48,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":49,"author":{"gitId":"-"},"content":"[**`Commons`**](#common-classes) represents a collection of classes used by multiple other components.","lastModifiedDate":"2023-09-03"},{"lineNumber":50,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":51,"author":{"gitId":"-"},"content":"**How the architecture components interact with each other**","lastModifiedDate":"2020-05-23"},{"lineNumber":52,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":53,"author":{"gitId":"-"},"content":"The *Sequence Diagram* below shows how the components interact with each other for the scenario where the user issues the command `delete 1`.","lastModifiedDate":"2020-05-23"},{"lineNumber":54,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":55,"author":{"gitId":"-"},"content":"\u003cpuml src\u003d\"diagrams/ArchitectureSequenceDiagram.puml\" width\u003d\"574\" /\u003e","lastModifiedDate":"2023-09-12"},{"lineNumber":56,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":57,"author":{"gitId":"-"},"content":"Each of the four main components (also shown in the diagram above),","lastModifiedDate":"2021-07-31"},{"lineNumber":58,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2021-07-31"},{"lineNumber":59,"author":{"gitId":"-"},"content":"* defines its *API* in an `interface` with the same name as the Component.","lastModifiedDate":"2021-07-31"},{"lineNumber":60,"author":{"gitId":"-"},"content":"* implements its functionality using a concrete `{Component Name}Manager` class (which follows the corresponding API `interface` mentioned in the previous point.","lastModifiedDate":"2021-07-31"},{"lineNumber":61,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2021-07-31"},{"lineNumber":62,"author":{"gitId":"-"},"content":"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\u0027s being coupled to the implementation of a component), as illustrated in the (partial) class diagram below.","lastModifiedDate":"2021-07-31"},{"lineNumber":63,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2021-07-31"},{"lineNumber":64,"author":{"gitId":"-"},"content":"\u003cpuml src\u003d\"diagrams/ComponentManagers.puml\" width\u003d\"300\" /\u003e","lastModifiedDate":"2023-09-12"},{"lineNumber":65,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2021-07-31"},{"lineNumber":66,"author":{"gitId":"-"},"content":"The sections below give more details of each component.","lastModifiedDate":"2020-05-23"},{"lineNumber":67,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":68,"author":{"gitId":"-"},"content":"### UI component","lastModifiedDate":"2020-05-23"},{"lineNumber":69,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":70,"author":{"gitId":"-"},"content":"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)","lastModifiedDate":"2021-07-31"},{"lineNumber":71,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":72,"author":{"gitId":"-"},"content":"\u003cpuml src\u003d\"diagrams/UiClassDiagram.puml\" alt\u003d\"Structure of the UI Component\"/\u003e","lastModifiedDate":"2023-09-12"},{"lineNumber":73,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":74,"author":{"gitId":"-"},"content":"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.","lastModifiedDate":"2021-07-31"},{"lineNumber":75,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":76,"author":{"gitId":"-"},"content":"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)","lastModifiedDate":"2021-07-31"},{"lineNumber":77,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":78,"author":{"gitId":"-"},"content":"The `UI` component,","lastModifiedDate":"2020-05-23"},{"lineNumber":79,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":80,"author":{"gitId":"-"},"content":"* executes user commands using the `Logic` component.","lastModifiedDate":"2021-07-31"},{"lineNumber":81,"author":{"gitId":"-"},"content":"* listens for changes to `Model` data so that the UI can be updated with the modified data.","lastModifiedDate":"2021-07-31"},{"lineNumber":82,"author":{"gitId":"-"},"content":"* keeps a reference to the `Logic` component, because the `UI` relies on the `Logic` to execute commands.","lastModifiedDate":"2021-07-31"},{"lineNumber":83,"author":{"gitId":"-"},"content":"* depends on some classes in the `Model` component, as it displays `Person` object residing in the `Model`.","lastModifiedDate":"2021-07-31"},{"lineNumber":84,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":85,"author":{"gitId":"-"},"content":"### Logic component","lastModifiedDate":"2020-05-23"},{"lineNumber":86,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":87,"author":{"gitId":"-"},"content":"**API** : [`Logic.java`](https://github.com/se-edu/addressbook-level3/tree/master/src/main/java/seedu/address/logic/Logic.java)","lastModifiedDate":"2021-07-31"},{"lineNumber":88,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":89,"author":{"gitId":"-"},"content":"Here\u0027s a (partial) class diagram of the `Logic` component:","lastModifiedDate":"2021-07-31"},{"lineNumber":90,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":91,"author":{"gitId":"-"},"content":"\u003cpuml src\u003d\"diagrams/LogicClassDiagram.puml\" width\u003d\"550\"/\u003e","lastModifiedDate":"2023-09-12"},{"lineNumber":92,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":93,"author":{"gitId":"-"},"content":"The sequence diagram below illustrates the interactions within the `Logic` component, taking `execute(\"delete 1\")` API call as an example.","lastModifiedDate":"2023-09-03"},{"lineNumber":94,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":95,"author":{"gitId":"-"},"content":"\u003cpuml src\u003d\"diagrams/DeleteSequenceDiagram.puml\" alt\u003d\"Interactions Inside the Logic Component for the `delete 1` Command\" /\u003e","lastModifiedDate":"2023-09-12"},{"lineNumber":96,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2023-09-12"},{"lineNumber":97,"author":{"gitId":"-"},"content":"\u003cbox type\u003d\"info\" seamless\u003e","lastModifiedDate":"2023-09-12"},{"lineNumber":98,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":99,"author":{"gitId":"-"},"content":"**Note:** The lifeline for `DeleteCommandParser` should end at the destroy marker (X) but due to a limitation of PlantUML, the lifeline continues till the end of diagram.","lastModifiedDate":"2023-09-12"},{"lineNumber":100,"author":{"gitId":"-"},"content":"\u003c/box\u003e","lastModifiedDate":"2023-09-12"},{"lineNumber":101,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":102,"author":{"gitId":"-"},"content":"How the `Logic` component works:","lastModifiedDate":"2023-09-03"},{"lineNumber":103,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2023-09-03"},{"lineNumber":104,"author":{"gitId":"-"},"content":"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.","lastModifiedDate":"2023-09-03"},{"lineNumber":105,"author":{"gitId":"-"},"content":"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`.","lastModifiedDate":"2023-09-03"},{"lineNumber":106,"author":{"gitId":"-"},"content":"1. The command can communicate with the `Model` when it is executed (e.g. to delete a person).\u003cbr\u003e","lastModifiedDate":"2024-02-09"},{"lineNumber":107,"author":{"gitId":"-"},"content":" Note that although this is shown as a single step in the diagram above (for simplicity), in the code it can take several interactions (between the command object and the `Model`) to achieve.","lastModifiedDate":"2024-02-09"},{"lineNumber":108,"author":{"gitId":"-"},"content":"1. The result of the command execution is encapsulated as a `CommandResult` object which is returned back from `Logic`.","lastModifiedDate":"2023-09-03"},{"lineNumber":109,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2023-09-03"},{"lineNumber":110,"author":{"gitId":"-"},"content":"Here are the other classes in `Logic` (omitted from the class diagram above) that are used for parsing a user command:","lastModifiedDate":"2021-07-31"},{"lineNumber":111,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2021-07-31"},{"lineNumber":112,"author":{"gitId":"-"},"content":"\u003cpuml src\u003d\"diagrams/ParserClasses.puml\" width\u003d\"600\"/\u003e","lastModifiedDate":"2023-09-12"},{"lineNumber":113,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":114,"author":{"gitId":"-"},"content":"How the parsing works:","lastModifiedDate":"2021-07-31"},{"lineNumber":115,"author":{"gitId":"-"},"content":"* 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.","lastModifiedDate":"2021-07-31"},{"lineNumber":116,"author":{"gitId":"-"},"content":"* 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.","lastModifiedDate":"2021-07-31"},{"lineNumber":117,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":118,"author":{"gitId":"-"},"content":"### Model component","lastModifiedDate":"2021-07-31"},{"lineNumber":119,"author":{"gitId":"-"},"content":"**API** : [`Model.java`](https://github.com/se-edu/addressbook-level3/tree/master/src/main/java/seedu/address/model/Model.java)","lastModifiedDate":"2020-05-23"},{"lineNumber":120,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":121,"author":{"gitId":"-"},"content":"\u003cpuml src\u003d\"diagrams/ModelClassDiagram.puml\" width\u003d\"450\" /\u003e","lastModifiedDate":"2023-09-12"},{"lineNumber":122,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":123,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":124,"author":{"gitId":"-"},"content":"The `Model` component,","lastModifiedDate":"2021-07-31"},{"lineNumber":125,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":126,"author":{"gitId":"-"},"content":"* stores the address book data i.e., all `Person` objects (which are contained in a `UniquePersonList` object).","lastModifiedDate":"2021-07-31"},{"lineNumber":127,"author":{"gitId":"-"},"content":"* stores the currently \u0027selected\u0027 `Person` objects (e.g., results of a search query) as a separate _filtered_ list which is exposed to outsiders as an unmodifiable `ObservableList\u003cPerson\u003e` that can be \u0027observed\u0027 e.g. the UI can be bound to this list so that the UI automatically updates when the data in the list change.","lastModifiedDate":"2021-07-31"},{"lineNumber":128,"author":{"gitId":"-"},"content":"* stores a `UserPref` object that represents the user’s preferences. This is exposed to the outside as a `ReadOnlyUserPref` objects.","lastModifiedDate":"2021-07-31"},{"lineNumber":129,"author":{"gitId":"-"},"content":"* 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)","lastModifiedDate":"2021-07-31"},{"lineNumber":130,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2021-07-31"},{"lineNumber":131,"author":{"gitId":"-"},"content":"\u003cbox type\u003d\"info\" seamless\u003e","lastModifiedDate":"2023-09-12"},{"lineNumber":132,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2023-09-12"},{"lineNumber":133,"author":{"gitId":"-"},"content":"**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.\u003cbr\u003e","lastModifiedDate":"2023-09-12"},{"lineNumber":134,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2021-07-31"},{"lineNumber":135,"author":{"gitId":"-"},"content":"\u003cpuml src\u003d\"diagrams/BetterModelClassDiagram.puml\" width\u003d\"450\" /\u003e","lastModifiedDate":"2023-09-12"},{"lineNumber":136,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":137,"author":{"gitId":"-"},"content":"\u003c/box\u003e","lastModifiedDate":"2023-09-12"},{"lineNumber":138,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":139,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":140,"author":{"gitId":"-"},"content":"### Storage component","lastModifiedDate":"2020-05-23"},{"lineNumber":141,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":142,"author":{"gitId":"-"},"content":"**API** : [`Storage.java`](https://github.com/se-edu/addressbook-level3/tree/master/src/main/java/seedu/address/storage/Storage.java)","lastModifiedDate":"2020-05-23"},{"lineNumber":143,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":144,"author":{"gitId":"-"},"content":"\u003cpuml src\u003d\"diagrams/StorageClassDiagram.puml\" width\u003d\"550\" /\u003e","lastModifiedDate":"2023-09-12"},{"lineNumber":145,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2021-07-31"},{"lineNumber":146,"author":{"gitId":"-"},"content":"The `Storage` component,","lastModifiedDate":"2020-05-23"},{"lineNumber":147,"author":{"gitId":"-"},"content":"* can save both address book data and user preference data in JSON format, and read them back into corresponding objects.","lastModifiedDate":"2023-09-03"},{"lineNumber":148,"author":{"gitId":"-"},"content":"* inherits from both `AddressBookStorage` and `UserPrefStorage`, which means it can be treated as either one (if only the functionality of only one is needed).","lastModifiedDate":"2021-07-31"},{"lineNumber":149,"author":{"gitId":"-"},"content":"* depends on some classes in the `Model` component (because the `Storage` component\u0027s job is to save/retrieve objects that belong to the `Model`)","lastModifiedDate":"2021-07-21"},{"lineNumber":150,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":151,"author":{"gitId":"-"},"content":"### Common classes","lastModifiedDate":"2020-05-23"},{"lineNumber":152,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":153,"author":{"gitId":"-"},"content":"Classes used by multiple components are in the `seedu.addressbook.commons` package.","lastModifiedDate":"2020-05-23"},{"lineNumber":154,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":155,"author":{"gitId":"-"},"content":"--------------------------------------------------------------------------------------------------------------------","lastModifiedDate":"2020-05-23"},{"lineNumber":156,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":157,"author":{"gitId":"-"},"content":"## **Implementation**","lastModifiedDate":"2020-05-23"},{"lineNumber":158,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":159,"author":{"gitId":"-"},"content":"This section describes some noteworthy details on how certain features are implemented.","lastModifiedDate":"2020-05-23"},{"lineNumber":160,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":161,"author":{"gitId":"-"},"content":"### \\[Proposed\\] Undo/redo feature","lastModifiedDate":"2020-06-07"},{"lineNumber":162,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":163,"author":{"gitId":"-"},"content":"#### Proposed Implementation","lastModifiedDate":"2020-05-23"},{"lineNumber":164,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":165,"author":{"gitId":"-"},"content":"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:","lastModifiedDate":"2020-05-23"},{"lineNumber":166,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":167,"author":{"gitId":"-"},"content":"* `VersionedAddressBook#commit()` — Saves the current address book state in its history.","lastModifiedDate":"2020-05-23"},{"lineNumber":168,"author":{"gitId":"-"},"content":"* `VersionedAddressBook#undo()` — Restores the previous address book state from its history.","lastModifiedDate":"2020-05-23"},{"lineNumber":169,"author":{"gitId":"-"},"content":"* `VersionedAddressBook#redo()` — Restores a previously undone address book state from its history.","lastModifiedDate":"2020-05-23"},{"lineNumber":170,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":171,"author":{"gitId":"-"},"content":"These operations are exposed in the `Model` interface as `Model#commitAddressBook()`, `Model#undoAddressBook()` and `Model#redoAddressBook()` respectively.","lastModifiedDate":"2020-05-23"},{"lineNumber":172,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":173,"author":{"gitId":"-"},"content":"Given below is an example usage scenario and how the undo/redo mechanism behaves at each step.","lastModifiedDate":"2020-05-23"},{"lineNumber":174,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":175,"author":{"gitId":"-"},"content":"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.","lastModifiedDate":"2020-05-23"},{"lineNumber":176,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":177,"author":{"gitId":"-"},"content":"\u003cpuml src\u003d\"diagrams/UndoRedoState0.puml\" alt\u003d\"UndoRedoState0\" /\u003e","lastModifiedDate":"2023-09-12"},{"lineNumber":178,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":179,"author":{"gitId":"-"},"content":"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.","lastModifiedDate":"2020-05-23"},{"lineNumber":180,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":181,"author":{"gitId":"-"},"content":"\u003cpuml src\u003d\"diagrams/UndoRedoState1.puml\" alt\u003d\"UndoRedoState1\" /\u003e","lastModifiedDate":"2023-09-12"},{"lineNumber":182,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":183,"author":{"gitId":"-"},"content":"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`.","lastModifiedDate":"2020-05-23"},{"lineNumber":184,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":185,"author":{"gitId":"-"},"content":"\u003cpuml src\u003d\"diagrams/UndoRedoState2.puml\" alt\u003d\"UndoRedoState2\" /\u003e","lastModifiedDate":"2023-09-12"},{"lineNumber":186,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":187,"author":{"gitId":"-"},"content":"\u003cbox type\u003d\"info\" seamless\u003e","lastModifiedDate":"2023-09-12"},{"lineNumber":188,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":189,"author":{"gitId":"-"},"content":"**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`.","lastModifiedDate":"2023-09-12"},{"lineNumber":190,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2023-09-12"},{"lineNumber":191,"author":{"gitId":"-"},"content":"\u003c/box\u003e","lastModifiedDate":"2023-09-12"},{"lineNumber":192,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":193,"author":{"gitId":"-"},"content":"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.","lastModifiedDate":"2020-05-23"},{"lineNumber":194,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":195,"author":{"gitId":"-"},"content":"\u003cpuml src\u003d\"diagrams/UndoRedoState3.puml\" alt\u003d\"UndoRedoState3\" /\u003e","lastModifiedDate":"2023-09-12"},{"lineNumber":196,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2023-09-12"},{"lineNumber":197,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2023-09-12"},{"lineNumber":198,"author":{"gitId":"-"},"content":"\u003cbox type\u003d\"info\" seamless\u003e","lastModifiedDate":"2023-09-12"},{"lineNumber":199,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":200,"author":{"gitId":"-"},"content":"**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","lastModifiedDate":"2023-09-12"},{"lineNumber":201,"author":{"gitId":"-"},"content":"than attempting to perform the undo.","lastModifiedDate":"2020-05-23"},{"lineNumber":202,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":203,"author":{"gitId":"-"},"content":"\u003c/box\u003e","lastModifiedDate":"2023-09-12"},{"lineNumber":204,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":205,"author":{"gitId":"-"},"content":"The following sequence diagram shows how an undo operation goes through the `Logic` component:","lastModifiedDate":"2024-02-09"},{"lineNumber":206,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":207,"author":{"gitId":"-"},"content":"\u003cpuml src\u003d\"diagrams/UndoSequenceDiagram-Logic.puml\" alt\u003d\"UndoSequenceDiagram-Logic\" /\u003e","lastModifiedDate":"2023-09-12"},{"lineNumber":208,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":209,"author":{"gitId":"-"},"content":"\u003cbox type\u003d\"info\" seamless\u003e","lastModifiedDate":"2023-09-12"},{"lineNumber":210,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":211,"author":{"gitId":"-"},"content":"**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.","lastModifiedDate":"2023-09-12"},{"lineNumber":212,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2023-09-12"},{"lineNumber":213,"author":{"gitId":"-"},"content":"\u003c/box\u003e","lastModifiedDate":"2023-09-12"},{"lineNumber":214,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":215,"author":{"gitId":"-"},"content":"Similarly, how an undo operation goes through the `Model` component is shown below:","lastModifiedDate":"2024-02-09"},{"lineNumber":216,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2024-02-09"},{"lineNumber":217,"author":{"gitId":"-"},"content":"\u003cpuml src\u003d\"diagrams/UndoSequenceDiagram-Model.puml\" alt\u003d\"UndoSequenceDiagram-Model\" /\u003e","lastModifiedDate":"2023-09-12"},{"lineNumber":218,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2024-02-09"},{"lineNumber":219,"author":{"gitId":"-"},"content":"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.","lastModifiedDate":"2020-05-23"},{"lineNumber":220,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":221,"author":{"gitId":"-"},"content":"\u003cbox type\u003d\"info\" seamless\u003e","lastModifiedDate":"2023-09-12"},{"lineNumber":222,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2023-09-12"},{"lineNumber":223,"author":{"gitId":"-"},"content":"**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.","lastModifiedDate":"2023-09-12"},{"lineNumber":224,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":225,"author":{"gitId":"-"},"content":"\u003c/box\u003e","lastModifiedDate":"2023-09-12"},{"lineNumber":226,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":227,"author":{"gitId":"-"},"content":"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.","lastModifiedDate":"2020-05-23"},{"lineNumber":228,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":229,"author":{"gitId":"-"},"content":"\u003cpuml src\u003d\"diagrams/UndoRedoState4.puml\" alt\u003d\"UndoRedoState4\" /\u003e","lastModifiedDate":"2023-09-12"},{"lineNumber":230,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":231,"author":{"gitId":"-"},"content":"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.","lastModifiedDate":"2020-05-23"},{"lineNumber":232,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":233,"author":{"gitId":"-"},"content":"\u003cpuml src\u003d\"diagrams/UndoRedoState5.puml\" alt\u003d\"UndoRedoState5\" /\u003e","lastModifiedDate":"2023-09-12"},{"lineNumber":234,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":235,"author":{"gitId":"-"},"content":"The following activity diagram summarizes what happens when a user executes a new command:","lastModifiedDate":"2020-05-23"},{"lineNumber":236,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":237,"author":{"gitId":"-"},"content":"\u003cpuml src\u003d\"diagrams/CommitActivityDiagram.puml\" width\u003d\"250\" /\u003e","lastModifiedDate":"2023-09-12"},{"lineNumber":238,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":239,"author":{"gitId":"-"},"content":"#### Design considerations:","lastModifiedDate":"2021-07-31"},{"lineNumber":240,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":241,"author":{"gitId":"-"},"content":"**Aspect: How undo \u0026 redo executes:**","lastModifiedDate":"2021-07-31"},{"lineNumber":242,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":243,"author":{"gitId":"-"},"content":"* **Alternative 1 (current choice):** Saves the entire address book.","lastModifiedDate":"2020-05-23"},{"lineNumber":244,"author":{"gitId":"-"},"content":" * Pros: Easy to implement.","lastModifiedDate":"2020-05-23"},{"lineNumber":245,"author":{"gitId":"-"},"content":" * Cons: May have performance issues in terms of memory usage.","lastModifiedDate":"2020-05-23"},{"lineNumber":246,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":247,"author":{"gitId":"-"},"content":"* **Alternative 2:** Individual command knows how to undo/redo by","lastModifiedDate":"2020-05-23"},{"lineNumber":248,"author":{"gitId":"-"},"content":" itself.","lastModifiedDate":"2020-05-23"},{"lineNumber":249,"author":{"gitId":"-"},"content":" * Pros: Will use less memory (e.g. for `delete`, just save the person being deleted).","lastModifiedDate":"2020-05-23"},{"lineNumber":250,"author":{"gitId":"-"},"content":" * Cons: We must ensure that the implementation of each individual command are correct.","lastModifiedDate":"2020-05-23"},{"lineNumber":251,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":252,"author":{"gitId":"-"},"content":"_{more aspects and alternatives to be added}_","lastModifiedDate":"2020-05-23"},{"lineNumber":253,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":254,"author":{"gitId":"-"},"content":"### \\[Proposed\\] Data archiving","lastModifiedDate":"2020-05-23"},{"lineNumber":255,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":256,"author":{"gitId":"-"},"content":"_{Explain here how the data archiving feature will be implemented}_","lastModifiedDate":"2020-05-23"},{"lineNumber":257,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":258,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":259,"author":{"gitId":"-"},"content":"--------------------------------------------------------------------------------------------------------------------","lastModifiedDate":"2020-05-23"},{"lineNumber":260,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":261,"author":{"gitId":"-"},"content":"## **Documentation, logging, testing, configuration, dev-ops**","lastModifiedDate":"2020-06-07"},{"lineNumber":262,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":263,"author":{"gitId":"-"},"content":"* [Documentation guide](Documentation.md)","lastModifiedDate":"2020-06-07"},{"lineNumber":264,"author":{"gitId":"-"},"content":"* [Testing guide](Testing.md)","lastModifiedDate":"2020-06-07"},{"lineNumber":265,"author":{"gitId":"-"},"content":"* [Logging guide](Logging.md)","lastModifiedDate":"2020-06-07"},{"lineNumber":266,"author":{"gitId":"-"},"content":"* [Configuration guide](Configuration.md)","lastModifiedDate":"2020-06-07"},{"lineNumber":267,"author":{"gitId":"-"},"content":"* [DevOps guide](DevOps.md)","lastModifiedDate":"2020-06-07"},{"lineNumber":268,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":269,"author":{"gitId":"-"},"content":"--------------------------------------------------------------------------------------------------------------------","lastModifiedDate":"2020-05-23"},{"lineNumber":270,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":271,"author":{"gitId":"-"},"content":"## **Appendix: Requirements**","lastModifiedDate":"2020-05-23"},{"lineNumber":272,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":273,"author":{"gitId":"-"},"content":"### Product scope","lastModifiedDate":"2020-05-23"},{"lineNumber":274,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":275,"author":{"gitId":"-"},"content":"**Target user profile**:","lastModifiedDate":"2020-05-23"},{"lineNumber":276,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":277,"author":{"gitId":"-"},"content":"* has a need to manage a significant number of contacts","lastModifiedDate":"2020-05-23"},{"lineNumber":278,"author":{"gitId":"-"},"content":"* prefer desktop apps over other types","lastModifiedDate":"2020-05-23"},{"lineNumber":279,"author":{"gitId":"-"},"content":"* can type fast","lastModifiedDate":"2020-05-23"},{"lineNumber":280,"author":{"gitId":"-"},"content":"* prefers typing to mouse interactions","lastModifiedDate":"2020-05-26"},{"lineNumber":281,"author":{"gitId":"-"},"content":"* is reasonably comfortable using CLI apps","lastModifiedDate":"2020-05-23"},{"lineNumber":282,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":283,"author":{"gitId":"-"},"content":"**Value proposition**: manage contacts faster than a typical mouse/GUI driven app","lastModifiedDate":"2020-05-23"},{"lineNumber":284,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":285,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":286,"author":{"gitId":"-"},"content":"### User stories","lastModifiedDate":"2020-06-07"},{"lineNumber":287,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":288,"author":{"gitId":"-"},"content":"Priorities: High (must have) - `* * *`, Medium (nice to have) - `* *`, Low (unlikely to have) - `*`","lastModifiedDate":"2020-05-23"},{"lineNumber":289,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":290,"author":{"gitId":"-"},"content":"| Priority | As a …​ | I want to …​ | So that I can…​ |","lastModifiedDate":"2020-05-23"},{"lineNumber":291,"author":{"gitId":"-"},"content":"|----------|--------------------------------------------|------------------------------|------------------------------------------------------------------------|","lastModifiedDate":"2023-09-12"},{"lineNumber":292,"author":{"gitId":"-"},"content":"| `* * *` | new user | see usage instructions | refer to instructions when I forget how to use the App |","lastModifiedDate":"2020-05-23"},{"lineNumber":293,"author":{"gitId":"-"},"content":"| `* * *` | user | add a new person | |","lastModifiedDate":"2020-05-23"},{"lineNumber":294,"author":{"gitId":"-"},"content":"| `* * *` | user | delete a person | remove entries that I no longer need |","lastModifiedDate":"2020-05-23"},{"lineNumber":295,"author":{"gitId":"-"},"content":"| `* * *` | user | find a person by name | locate details of persons without having to go through the entire list |","lastModifiedDate":"2020-05-23"},{"lineNumber":296,"author":{"gitId":"-"},"content":"| `* *` | user | hide private contact details | minimize chance of someone else seeing them by accident |","lastModifiedDate":"2020-05-23"},{"lineNumber":297,"author":{"gitId":"-"},"content":"| `*` | user with many persons in the address book | sort persons by name | locate a person easily |","lastModifiedDate":"2020-05-23"},{"lineNumber":298,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":299,"author":{"gitId":"-"},"content":"*{More to be added}*","lastModifiedDate":"2020-05-23"},{"lineNumber":300,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":301,"author":{"gitId":"-"},"content":"### Use cases","lastModifiedDate":"2020-06-07"},{"lineNumber":302,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":303,"author":{"gitId":"ljy0422"},"content":"(For all use cases below, the **System** is the `Hi:Re` and the **Actor** is the `user`, unless specified otherwise)","lastModifiedDate":"2024-03-08"},{"lineNumber":304,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2024-03-08"},{"lineNumber":305,"author":{"gitId":"ljy0422"},"content":"**Use case: UC1 - Add a contact**","lastModifiedDate":"2024-03-08"},{"lineNumber":306,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2024-03-08"},{"lineNumber":307,"author":{"gitId":"-"},"content":"**MSS**","lastModifiedDate":"2024-03-08"},{"lineNumber":308,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2024-03-08"},{"lineNumber":309,"author":{"gitId":"ljy0422"},"content":"1. User requests to add a new contact and input the contact information","lastModifiedDate":"2024-03-08"},{"lineNumber":310,"author":{"gitId":"ljy0422"},"content":"2. Hi:Re adds the person to the database","lastModifiedDate":"2024-03-08"},{"lineNumber":311,"author":{"gitId":"ChuaZenKhoon"},"content":"3. Hi:Re shows a message for the successful addition","lastModifiedDate":"2024-03-08"},{"lineNumber":312,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2024-03-08"},{"lineNumber":313,"author":{"gitId":"ljy0422"},"content":" Use case ends.","lastModifiedDate":"2024-03-08"},{"lineNumber":314,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2024-03-08"},{"lineNumber":315,"author":{"gitId":"-"},"content":"**Extensions**","lastModifiedDate":"2024-03-08"},{"lineNumber":316,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2024-03-08"},{"lineNumber":317,"author":{"gitId":"ljy0422"},"content":"* 1a. The input format is wrong and cannot be accepted","lastModifiedDate":"2024-03-08"},{"lineNumber":318,"author":{"gitId":"ljy0422"},"content":"","lastModifiedDate":"2024-03-08"},{"lineNumber":319,"author":{"gitId":"ljy0422"},"content":" * 1a1. Hi:Re shows an error message","lastModifiedDate":"2024-03-08"},{"lineNumber":320,"author":{"gitId":"ljy0422"},"content":" ","lastModifiedDate":"2024-03-08"},{"lineNumber":321,"author":{"gitId":"ljy0422"},"content":" Use case ends.","lastModifiedDate":"2024-03-08"},{"lineNumber":322,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2024-03-08"},{"lineNumber":323,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":324,"author":{"gitId":"ChuaZenKhoon"},"content":"**Use case: UC2 - Delete a contact**","lastModifiedDate":"2024-03-08"},{"lineNumber":325,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":326,"author":{"gitId":"-"},"content":"**MSS**","lastModifiedDate":"2020-05-23"},{"lineNumber":327,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":328,"author":{"gitId":"ChuaZenKhoon"},"content":"1. User requests to delete a specific person in the database and input the details","lastModifiedDate":"2024-03-08"},{"lineNumber":329,"author":{"gitId":"ChuaZenKhoon"},"content":"2. Hi:Re deletes the person","lastModifiedDate":"2024-03-08"},{"lineNumber":330,"author":{"gitId":"ChuaZenKhoon"},"content":"3. Hi:Re shows a message for the successful deletion","lastModifiedDate":"2024-03-08"},{"lineNumber":331,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":332,"author":{"gitId":"-"},"content":" Use case ends.","lastModifiedDate":"2020-05-23"},{"lineNumber":333,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":334,"author":{"gitId":"-"},"content":"**Extensions**","lastModifiedDate":"2020-05-23"},{"lineNumber":335,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":336,"author":{"gitId":"ChuaZenKhoon"},"content":"* 1a. The given details is invalid.","lastModifiedDate":"2024-03-08"},{"lineNumber":337,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":338,"author":{"gitId":"ChuaZenKhoon"},"content":" * 1a1. Hi:Re shows an error message","lastModifiedDate":"2024-03-08"},{"lineNumber":339,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":340,"author":{"gitId":"ChuaZenKhoon"},"content":" Use case ends.","lastModifiedDate":"2024-03-08"},{"lineNumber":341,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":342,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":343,"author":{"gitId":"-"},"content":"### Non-Functional Requirements","lastModifiedDate":"2020-05-23"},{"lineNumber":344,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":345,"author":{"gitId":"-"},"content":"1. Should work on any _mainstream OS_ as long as it has Java `11` or above installed.","lastModifiedDate":"2020-05-23"},{"lineNumber":346,"author":{"gitId":"ChuaZenKhoon"},"content":"2. Should be able to hold up to 1000 employees without a noticeable sluggishness in performance for typical usage.","lastModifiedDate":"2024-03-08"},{"lineNumber":347,"author":{"gitId":"-"},"content":"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.","lastModifiedDate":"2020-05-23"},{"lineNumber":348,"author":{"gitId":"ChuaZenKhoon"},"content":"4. Should take less than 3 seconds for the application to finish processing a command and display the results.","lastModifiedDate":"2024-03-08"},{"lineNumber":349,"author":{"gitId":"ChuaZenKhoon"},"content":"5. Should work on any 32 bit or 64 bit OS.","lastModifiedDate":"2024-03-08"},{"lineNumber":350,"author":{"gitId":"ChuaZenKhoon"},"content":"6. Should be usable by any regular employee with little to no technical expertise.","lastModifiedDate":"2024-03-08"},{"lineNumber":351,"author":{"gitId":"ChuaZenKhoon"},"content":"7. Should have no differences in behaviour or performance between Windows 10 and 11.","lastModifiedDate":"2024-03-08"},{"lineNumber":352,"author":{"gitId":"ChuaZenKhoon"},"content":"8. A HR employee should not be able to see sensitive information but an executive or someone with higher system authority can.","lastModifiedDate":"2024-03-08"},{"lineNumber":353,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":354,"author":{"gitId":"-"},"content":"### Glossary","lastModifiedDate":"2020-05-23"},{"lineNumber":355,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":356,"author":{"gitId":"ChuaZenKhoon"},"content":"* **Mainstream OS**: Operating Systems (OS) such as Windows, Linux, Unix, MacOS","lastModifiedDate":"2024-03-08"},{"lineNumber":357,"author":{"gitId":"-"},"content":"* **Private contact detail**: A contact detail that is not meant to be shared with others","lastModifiedDate":"2020-05-23"},{"lineNumber":358,"author":{"gitId":"ChuaZenKhoon"},"content":"* **HR**: Human Resource, a department associated with managing employee benefits and recruitment","lastModifiedDate":"2024-03-08"},{"lineNumber":359,"author":{"gitId":"ChuaZenKhoon"},"content":"* **MSS**: Main Success Scenario, the main flow of events in a use case","lastModifiedDate":"2024-03-08"},{"lineNumber":360,"author":{"gitId":"ChuaZenKhoon"},"content":"* **Technical expertise**: Any relevant experience in using a computer and software on it","lastModifiedDate":"2024-03-08"},{"lineNumber":361,"author":{"gitId":"ChuaZenKhoon"},"content":"* **Sensitive information**: Important information relating to a person that may cause privacy concerns such as ID details or bank account details.","lastModifiedDate":"2024-03-08"},{"lineNumber":362,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":363,"author":{"gitId":"-"},"content":"--------------------------------------------------------------------------------------------------------------------","lastModifiedDate":"2020-05-23"},{"lineNumber":364,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":365,"author":{"gitId":"-"},"content":"## **Appendix: Instructions for manual testing**","lastModifiedDate":"2020-05-23"},{"lineNumber":366,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":367,"author":{"gitId":"-"},"content":"Given below are instructions to test the app manually.","lastModifiedDate":"2020-05-23"},{"lineNumber":368,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":369,"author":{"gitId":"-"},"content":"\u003cbox type\u003d\"info\" seamless\u003e","lastModifiedDate":"2023-09-12"},{"lineNumber":370,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2023-09-12"},{"lineNumber":371,"author":{"gitId":"-"},"content":"**Note:** These instructions only provide a starting point for testers to work on;","lastModifiedDate":"2023-09-12"},{"lineNumber":372,"author":{"gitId":"-"},"content":"testers are expected to do more *exploratory* testing.","lastModifiedDate":"2020-05-23"},{"lineNumber":373,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":374,"author":{"gitId":"-"},"content":"\u003c/box\u003e","lastModifiedDate":"2023-09-12"},{"lineNumber":375,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":376,"author":{"gitId":"-"},"content":"### Launch and shutdown","lastModifiedDate":"2020-05-23"},{"lineNumber":377,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":378,"author":{"gitId":"-"},"content":"1. Initial launch","lastModifiedDate":"2020-05-23"},{"lineNumber":379,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":380,"author":{"gitId":"-"},"content":" 1. Download the jar file and copy into an empty folder","lastModifiedDate":"2020-05-23"},{"lineNumber":381,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":382,"author":{"gitId":"-"},"content":" 1. Double-click the jar file Expected: Shows the GUI with a set of sample contacts. The window size may not be optimum.","lastModifiedDate":"2020-05-23"},{"lineNumber":383,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":384,"author":{"gitId":"-"},"content":"1. Saving window preferences","lastModifiedDate":"2020-05-23"},{"lineNumber":385,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":386,"author":{"gitId":"-"},"content":" 1. Resize the window to an optimum size. Move the window to a different location. Close the window.","lastModifiedDate":"2020-05-23"},{"lineNumber":387,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":388,"author":{"gitId":"-"},"content":" 1. Re-launch the app by double-clicking the jar file.\u003cbr\u003e","lastModifiedDate":"2020-05-23"},{"lineNumber":389,"author":{"gitId":"-"},"content":" Expected: The most recent window size and location is retained.","lastModifiedDate":"2020-05-23"},{"lineNumber":390,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":391,"author":{"gitId":"-"},"content":"1. _{ more test cases …​ }_","lastModifiedDate":"2020-05-23"},{"lineNumber":392,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":393,"author":{"gitId":"-"},"content":"### Deleting a person","lastModifiedDate":"2020-05-23"},{"lineNumber":394,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":395,"author":{"gitId":"-"},"content":"1. Deleting a person while all persons are being shown","lastModifiedDate":"2020-05-23"},{"lineNumber":396,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":397,"author":{"gitId":"-"},"content":" 1. Prerequisites: List all persons using the `list` command. Multiple persons in the list.","lastModifiedDate":"2020-05-23"},{"lineNumber":398,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":399,"author":{"gitId":"-"},"content":" 1. Test case: `delete 1`\u003cbr\u003e","lastModifiedDate":"2020-05-23"},{"lineNumber":400,"author":{"gitId":"-"},"content":" 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.","lastModifiedDate":"2020-05-23"},{"lineNumber":401,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":402,"author":{"gitId":"-"},"content":" 1. Test case: `delete 0`\u003cbr\u003e","lastModifiedDate":"2020-05-23"},{"lineNumber":403,"author":{"gitId":"-"},"content":" Expected: No person is deleted. Error details shown in the status message. Status bar remains the same.","lastModifiedDate":"2020-05-23"},{"lineNumber":404,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":405,"author":{"gitId":"-"},"content":" 1. Other incorrect delete commands to try: `delete`, `delete x`, `...` (where x is larger than the list size)\u003cbr\u003e","lastModifiedDate":"2020-05-23"},{"lineNumber":406,"author":{"gitId":"-"},"content":" Expected: Similar to previous.","lastModifiedDate":"2020-05-23"},{"lineNumber":407,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":408,"author":{"gitId":"-"},"content":"1. _{ more test cases …​ }_","lastModifiedDate":"2020-05-23"},{"lineNumber":409,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":410,"author":{"gitId":"-"},"content":"### Saving data","lastModifiedDate":"2020-05-23"},{"lineNumber":411,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":412,"author":{"gitId":"-"},"content":"1. Dealing with missing/corrupted data files","lastModifiedDate":"2020-05-23"},{"lineNumber":413,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":414,"author":{"gitId":"-"},"content":" 1. _{explain how to simulate a missing/corrupted file, and the expected behavior}_","lastModifiedDate":"2020-05-23"},{"lineNumber":415,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":416,"author":{"gitId":"-"},"content":"1. _{ more test cases …​ }_","lastModifiedDate":"2020-05-23"}],"authorContributionMap":{"ChuaZenKhoon":19,"-":387,"ljy0422":10}}] diff --git a/AY2324S2-CS2103T-T12-3_tp_master/commits.json b/AY2324S2-CS2103T-T12-3_tp_master/commits.json index 801cb92a..63999e98 100644 --- a/AY2324S2-CS2103T-T12-3_tp_master/commits.json +++ b/AY2324S2-CS2103T-T12-3_tp_master/commits.json @@ -1 +1 @@ -{"authorDailyContributionsMap":{"tcjazwei":[],"shunjieee":[],"ShanylOng":[],"ChuaZenKhoon":[],"ljy0422":[]},"authorFileTypeContributionMap":{"tcjazwei":{"docs":0,"functional-code":0,"test-code":0},"shunjieee":{"docs":0,"functional-code":0,"test-code":0},"ShanylOng":{"docs":0,"functional-code":0,"test-code":0},"ChuaZenKhoon":{"docs":0,"functional-code":0,"test-code":0},"ljy0422":{"docs":0,"functional-code":0,"test-code":0}},"authorContributionVariance":{"tcjazwei":0.0,"shunjieee":0.0,"ShanylOng":0.0,"ChuaZenKhoon":0.0,"ljy0422":0.0},"authorDisplayNameMap":{"tcjazwei":"CS2103T-T12-3 OLIV.. TAN","shunjieee":"CS2103T-T12-3 LEE .. JIE","ShanylOng":"CS2103T-T12-3 SHAN.. ONG","ChuaZenKhoon":"CS2103T-T12-3 CHUA..HOON","ljy0422":"CS2103T-T12-3 LIU ..AYAO"}} +{"authorDailyContributionsMap":{"tcjazwei":[],"shunjieee":[],"ShanylOng":[],"ChuaZenKhoon":[{"date":"2024-03-08","commitResults":[{"hash":"cc609deba5427b6e531c6d8252edeacf873f29b7","isMergeCommit":false,"messageTitle":"Update DG: NFRs and Glossary","messageBody":"","fileTypesAndContributionMap":{"docs":{"insertions":11,"deletions":4}}},{"hash":"0172451aca92a3249a803f9de70f78bf295c167b","isMergeCommit":true,"messageTitle":"Merge pull request #14 from ChuaZenKhoon/v1.1-DG-NFRs-Glossary-update","messageBody":"Update DG: NFRs and Glossary","fileTypesAndContributionMap":{}},{"hash":"06ad7277c41e5ec816d78a42e9950d3e627ab467","isMergeCommit":false,"messageTitle":"Add individual details to AboutUs Page","messageBody":"","fileTypesAndContributionMap":{"docs":{"insertions":7,"deletions":6}}},{"hash":"fcbc67dfe851964c6bbb543e509269a78d4ad319","isMergeCommit":true,"messageTitle":"Merge pull request #16 from ChuaZenKhoon/v1.1-AboutUs-ZenKhoon","messageBody":"Add individual details to AboutUs Page","fileTypesAndContributionMap":{}},{"hash":"b2bc1213053a8e0b809486615e1d81c909f2e2df","isMergeCommit":false,"messageTitle":"Add DG Use Case 2","messageBody":"For functionality of deletion of contact\n","fileTypesAndContributionMap":{"docs":{"insertions":8,"deletions":14}}},{"hash":"50d7adf3f1bce6bec778d560d684b783efc32767","isMergeCommit":true,"messageTitle":"Merge pull request #17 from ChuaZenKhoon/v1.1-DG-Use-Case-2","messageBody":"Add DG Use Case 2","fileTypesAndContributionMap":{}}]}],"ljy0422":[{"date":"2024-03-08","commitResults":[{"hash":"123d0cdf53ddcc392daba3346a0f515f6a1750e8","isMergeCommit":false,"messageTitle":"Add use case for the functionality of adding contacts","messageBody":"","fileTypesAndContributionMap":{"docs":{"insertions":20,"deletions":1}}},{"hash":"a9f63398b9e15af536ab6ce762fa0137625f15a9","isMergeCommit":true,"messageTitle":"Merge pull request #15 from ljy0422/v1.1-DG-User-Case-1","messageBody":"Add use case for the functionality of adding contacts","fileTypesAndContributionMap":{}}]}]},"authorFileTypeContributionMap":{"tcjazwei":{"docs":0,"functional-code":0,"test-code":0},"shunjieee":{"docs":0,"functional-code":0,"test-code":0},"ShanylOng":{"docs":0,"functional-code":0,"test-code":0},"ChuaZenKhoon":{"docs":26,"functional-code":0,"test-code":0},"ljy0422":{"docs":10,"functional-code":0,"test-code":0}},"authorContributionVariance":{"tcjazwei":0.0,"shunjieee":0.0,"ShanylOng":0.0,"ChuaZenKhoon":155.55557,"ljy0422":27.44},"authorDisplayNameMap":{"tcjazwei":"CS2103T-T12-3 OLIV.. TAN","shunjieee":"CS2103T-T12-3 LEE .. JIE","ShanylOng":"CS2103T-T12-3 SHAN.. ONG","ChuaZenKhoon":"CS2103T-T12-3 CHUA..HOON","ljy0422":"CS2103T-T12-3 LIU ..AYAO"}} diff --git a/AY2324S2-CS2103T-T13-1_tp_master/authorship.json b/AY2324S2-CS2103T-T13-1_tp_master/authorship.json index f591925a..45e2f936 100644 --- a/AY2324S2-CS2103T-T13-1_tp_master/authorship.json +++ b/AY2324S2-CS2103T-T13-1_tp_master/authorship.json @@ -1 +1 @@ -[{"path":"docs/_markbind/layouts/default.md","fileType":"docs","lines":[{"lineNumber":1,"author":{"gitId":"-"},"content":"\u003chead-bottom\u003e","lastModifiedDate":"2023-09-12"},{"lineNumber":2,"author":{"gitId":"-"},"content":" \u003clink rel\u003d\"stylesheet\" href\u003d\"{{baseUrl}}/stylesheets/main.css\"\u003e","lastModifiedDate":"2023-09-12"},{"lineNumber":3,"author":{"gitId":"-"},"content":"\u003c/head-bottom\u003e","lastModifiedDate":"2023-09-12"},{"lineNumber":4,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2023-09-12"},{"lineNumber":5,"author":{"gitId":"-"},"content":"\u003cheader sticky\u003e","lastModifiedDate":"2023-09-12"},{"lineNumber":6,"author":{"gitId":"-"},"content":" \u003cnavbar type\u003d\"dark\"\u003e","lastModifiedDate":"2023-09-12"},{"lineNumber":7,"author":{"gitId":"AndrewOng2066"},"content":" \u003ca slot\u003d\"brand\" href\u003d\"{{baseUrl}}/index.html\" title\u003d\"Home\" class\u003d\"navbar-brand\"\u003eMyProduct\u003c/a\u003e","lastModifiedDate":"2024-02-25"},{"lineNumber":8,"author":{"gitId":"-"},"content":" \u003cli\u003e\u003ca href\u003d\"{{baseUrl}}/index.html\" class\u003d\"nav-link\"\u003eHome\u003c/a\u003e\u003c/li\u003e","lastModifiedDate":"2024-02-09"},{"lineNumber":9,"author":{"gitId":"-"},"content":" \u003cli\u003e\u003ca href\u003d\"{{baseUrl}}/UserGuide.html\" class\u003d\"nav-link\"\u003eUser Guide\u003c/a\u003e\u003c/li\u003e","lastModifiedDate":"2023-09-12"},{"lineNumber":10,"author":{"gitId":"-"},"content":" \u003cli\u003e\u003ca href\u003d\"{{baseUrl}}/DeveloperGuide.html\" class\u003d\"nav-link\"\u003eDeveloper Guide\u003c/a\u003e\u003c/li\u003e","lastModifiedDate":"2023-09-12"},{"lineNumber":11,"author":{"gitId":"-"},"content":" \u003cli\u003e\u003ca href\u003d\"{{baseUrl}}/AboutUs.html\" class\u003d\"nav-link\"\u003eAbout Us\u003c/a\u003e\u003c/li\u003e","lastModifiedDate":"2023-09-12"},{"lineNumber":12,"author":{"gitId":"-"},"content":" \u003cli\u003e\u003ca href\u003d\"https://github.com/se-edu/addressbook-level3\" target\u003d\"_blank\" class\u003d\"nav-link\"\u003e\u003cmd\u003e:fab-github:\u003c/md\u003e\u003c/a\u003e","lastModifiedDate":"2023-09-12"},{"lineNumber":13,"author":{"gitId":"-"},"content":" \u003c/li\u003e","lastModifiedDate":"2023-09-12"},{"lineNumber":14,"author":{"gitId":"-"},"content":" \u003cli slot\u003d\"right\"\u003e","lastModifiedDate":"2023-09-12"},{"lineNumber":15,"author":{"gitId":"-"},"content":" \u003cform class\u003d\"navbar-form\"\u003e","lastModifiedDate":"2023-09-12"},{"lineNumber":16,"author":{"gitId":"-"},"content":" \u003csearchbar :data\u003d\"searchData\" placeholder\u003d\"Search\" :on-hit\u003d\"searchCallback\" menu-align-right\u003e\u003c/searchbar\u003e","lastModifiedDate":"2023-09-12"},{"lineNumber":17,"author":{"gitId":"-"},"content":" \u003c/form\u003e","lastModifiedDate":"2023-09-12"},{"lineNumber":18,"author":{"gitId":"-"},"content":" \u003c/li\u003e","lastModifiedDate":"2023-09-12"},{"lineNumber":19,"author":{"gitId":"-"},"content":" \u003c/navbar\u003e","lastModifiedDate":"2023-09-12"},{"lineNumber":20,"author":{"gitId":"-"},"content":"\u003c/header\u003e","lastModifiedDate":"2023-09-12"},{"lineNumber":21,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2023-09-12"},{"lineNumber":22,"author":{"gitId":"-"},"content":"\u003cdiv id\u003d\"flex-body\"\u003e","lastModifiedDate":"2023-09-12"},{"lineNumber":23,"author":{"gitId":"-"},"content":" \u003cnav id\u003d\"site-nav\"\u003e","lastModifiedDate":"2023-09-12"},{"lineNumber":24,"author":{"gitId":"-"},"content":" \u003cdiv class\u003d\"site-nav-top\"\u003e","lastModifiedDate":"2023-09-12"},{"lineNumber":25,"author":{"gitId":"-"},"content":" \u003cdiv class\u003d\"fw-bold mb-2\" style\u003d\"font-size: 1.25rem;\"\u003eSite Map\u003c/div\u003e","lastModifiedDate":"2023-09-12"},{"lineNumber":26,"author":{"gitId":"-"},"content":" \u003c/div\u003e","lastModifiedDate":"2023-09-12"},{"lineNumber":27,"author":{"gitId":"-"},"content":" \u003cdiv class\u003d\"nav-component slim-scroll\"\u003e","lastModifiedDate":"2023-09-12"},{"lineNumber":28,"author":{"gitId":"-"},"content":" \u003csite-nav\u003e","lastModifiedDate":"2023-09-12"},{"lineNumber":29,"author":{"gitId":"-"},"content":"* [Home]({{ baseUrl }}/index.html)","lastModifiedDate":"2023-09-12"},{"lineNumber":30,"author":{"gitId":"-"},"content":"* [User Guide]({{ baseUrl }}/UserGuide.html) :expanded:","lastModifiedDate":"2023-09-12"},{"lineNumber":31,"author":{"gitId":"-"},"content":" * [Quick Start]({{ baseUrl }}/UserGuide.html#quick-start)","lastModifiedDate":"2023-09-12"},{"lineNumber":32,"author":{"gitId":"-"},"content":" * [Features]({{ baseUrl }}/UserGuide.html#features)","lastModifiedDate":"2023-09-12"},{"lineNumber":33,"author":{"gitId":"-"},"content":" * [FAQ]({{ baseUrl }}/UserGuide.html#faq)","lastModifiedDate":"2023-09-12"},{"lineNumber":34,"author":{"gitId":"-"},"content":" * [Command Summary]({{ baseUrl }}/UserGuide.html#faq)","lastModifiedDate":"2023-09-12"},{"lineNumber":35,"author":{"gitId":"-"},"content":"* [Developer Guide]({{ baseUrl }}/DeveloperGuide.html) :expanded:","lastModifiedDate":"2023-09-12"},{"lineNumber":36,"author":{"gitId":"-"},"content":" * [Acknowledgements]({{ baseUrl }}/DeveloperGuide.html#acknowledgements)","lastModifiedDate":"2023-09-12"},{"lineNumber":37,"author":{"gitId":"-"},"content":" * [Setting Up]({{ baseUrl }}/DeveloperGuide.html#setting-up-getting-started)","lastModifiedDate":"2023-09-12"},{"lineNumber":38,"author":{"gitId":"-"},"content":" * [Design]({{ baseUrl }}/DeveloperGuide.html#design)","lastModifiedDate":"2023-09-12"},{"lineNumber":39,"author":{"gitId":"-"},"content":" * [Implementation]({{ baseUrl }}/DeveloperGuide.html#implementation)","lastModifiedDate":"2023-09-12"},{"lineNumber":40,"author":{"gitId":"-"},"content":" * [Documentation, logging, testing, configuration, dev-ops]({{ baseUrl }}/DeveloperGuide.html#documentation-logging-testing-configuration-dev-ops)","lastModifiedDate":"2023-09-12"},{"lineNumber":41,"author":{"gitId":"-"},"content":" * [Appendix: Requirements]({{ baseUrl }}/DeveloperGuide.html#appendix-requirements)","lastModifiedDate":"2023-09-12"},{"lineNumber":42,"author":{"gitId":"-"},"content":" * [Appendix: Instructions for manual testing]({{ baseUrl }}/DeveloperGuide.html#appendix-instructions-for-manual-testing)","lastModifiedDate":"2023-09-12"},{"lineNumber":43,"author":{"gitId":"-"},"content":"* Tutorials","lastModifiedDate":"2023-09-12"},{"lineNumber":44,"author":{"gitId":"-"},"content":" * [Tracing code]({{ baseUrl }}/tutorials/TracingCode.html)","lastModifiedDate":"2023-09-12"},{"lineNumber":45,"author":{"gitId":"-"},"content":" * [Adding a command]({{ baseUrl }}/tutorials/AddRemark.html)","lastModifiedDate":"2023-09-12"},{"lineNumber":46,"author":{"gitId":"-"},"content":" * [Removing Fields]({{ baseUrl }}/tutorials/RemovingFields.html)","lastModifiedDate":"2023-09-12"},{"lineNumber":47,"author":{"gitId":"-"},"content":"* [About Us]({{ baseUrl }}/AboutUs.html)","lastModifiedDate":"2023-09-12"},{"lineNumber":48,"author":{"gitId":"-"},"content":" \u003c/site-nav\u003e","lastModifiedDate":"2023-09-12"},{"lineNumber":49,"author":{"gitId":"-"},"content":" \u003c/div\u003e","lastModifiedDate":"2023-09-12"},{"lineNumber":50,"author":{"gitId":"-"},"content":" \u003c/nav\u003e","lastModifiedDate":"2023-09-12"},{"lineNumber":51,"author":{"gitId":"-"},"content":" \u003cdiv id\u003d\"content-wrapper\"\u003e","lastModifiedDate":"2023-09-12"},{"lineNumber":52,"author":{"gitId":"-"},"content":" {{ content }}","lastModifiedDate":"2023-09-12"},{"lineNumber":53,"author":{"gitId":"-"},"content":" \u003c/div\u003e","lastModifiedDate":"2023-09-12"},{"lineNumber":54,"author":{"gitId":"-"},"content":" \u003cnav id\u003d\"page-nav\"\u003e","lastModifiedDate":"2023-09-12"},{"lineNumber":55,"author":{"gitId":"-"},"content":" \u003cdiv class\u003d\"nav-component slim-scroll\"\u003e","lastModifiedDate":"2023-09-12"},{"lineNumber":56,"author":{"gitId":"-"},"content":" \u003cpage-nav /\u003e","lastModifiedDate":"2023-09-12"},{"lineNumber":57,"author":{"gitId":"-"},"content":" \u003c/div\u003e","lastModifiedDate":"2023-09-12"},{"lineNumber":58,"author":{"gitId":"-"},"content":" \u003c/nav\u003e","lastModifiedDate":"2023-09-12"},{"lineNumber":59,"author":{"gitId":"-"},"content":" \u003cscroll-top-button\u003e\u003c/scroll-top-button\u003e","lastModifiedDate":"2023-09-12"},{"lineNumber":60,"author":{"gitId":"-"},"content":"\u003c/div\u003e","lastModifiedDate":"2023-09-12"},{"lineNumber":61,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2023-09-12"},{"lineNumber":62,"author":{"gitId":"-"},"content":"\u003cfooter\u003e","lastModifiedDate":"2023-09-12"},{"lineNumber":63,"author":{"gitId":"-"},"content":" \u003c!-- Support MarkBind by including a link to us on your landing page! --\u003e","lastModifiedDate":"2023-09-12"},{"lineNumber":64,"author":{"gitId":"-"},"content":" \u003cdiv class\u003d\"text-center\"\u003e","lastModifiedDate":"2023-09-12"},{"lineNumber":65,"author":{"gitId":"-"},"content":" \u003csmall\u003e[\u003cmd\u003e**Powered by**\u003c/md\u003e \u003cimg src\u003d\"https://markbind.org/favicon.ico\" width\u003d\"30\"\u003e {{MarkBind}}, generated on {{timestamp}}]\u003c/small\u003e","lastModifiedDate":"2023-09-12"},{"lineNumber":66,"author":{"gitId":"-"},"content":" \u003c/div\u003e","lastModifiedDate":"2023-09-12"},{"lineNumber":67,"author":{"gitId":"-"},"content":"\u003c/footer\u003e","lastModifiedDate":"2023-09-12"}],"authorContributionMap":{"AndrewOng2066":1,"-":66}},{"path":"src/main/java/seedu/address/model/person/Address.java","fileType":"functional-code","lines":[{"lineNumber":1,"author":{"gitId":"-"},"content":"package seedu.address.model.person;","lastModifiedDate":"2016-08-24"},{"lineNumber":2,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2016-08-24"},{"lineNumber":3,"author":{"gitId":"-"},"content":"import static java.util.Objects.requireNonNull;","lastModifiedDate":"2017-05-15"},{"lineNumber":4,"author":{"gitId":"-"},"content":"import static seedu.address.commons.util.AppUtil.checkArgument;","lastModifiedDate":"2017-05-30"},{"lineNumber":5,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2016-08-24"},{"lineNumber":6,"author":{"gitId":"-"},"content":"/**","lastModifiedDate":"2016-08-24"},{"lineNumber":7,"author":{"gitId":"faaheem13"},"content":" * Represents a Person\u0027s (Student\u0027s) address in the address book.","lastModifiedDate":"2024-03-08"},{"lineNumber":8,"author":{"gitId":"-"},"content":" * Guarantees: immutable; is valid as declared in {@link #isValidAddress(String)}","lastModifiedDate":"2016-08-24"},{"lineNumber":9,"author":{"gitId":"-"},"content":" */","lastModifiedDate":"2016-08-24"},{"lineNumber":10,"author":{"gitId":"-"},"content":"public class Address {","lastModifiedDate":"2016-09-21"},{"lineNumber":11,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2016-08-24"},{"lineNumber":12,"author":{"gitId":"-"},"content":" public static final String MESSAGE_CONSTRAINTS \u003d \"Addresses can take any values, and it should not be blank\";","lastModifiedDate":"2018-09-22"},{"lineNumber":13,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-01-16"},{"lineNumber":14,"author":{"gitId":"-"},"content":" /*","lastModifiedDate":"2017-01-16"},{"lineNumber":15,"author":{"gitId":"-"},"content":" * The first character of the address must not be a whitespace,","lastModifiedDate":"2017-01-16"},{"lineNumber":16,"author":{"gitId":"-"},"content":" * otherwise \" \" (a blank string) becomes a valid input.","lastModifiedDate":"2017-01-16"},{"lineNumber":17,"author":{"gitId":"-"},"content":" */","lastModifiedDate":"2017-01-16"},{"lineNumber":18,"author":{"gitId":"-"},"content":" public static final String VALIDATION_REGEX \u003d \"[^\\\\s].*\";","lastModifiedDate":"2018-09-22"},{"lineNumber":19,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2016-08-24"},{"lineNumber":20,"author":{"gitId":"-"},"content":" public final String value;","lastModifiedDate":"2016-08-24"},{"lineNumber":21,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2016-08-24"},{"lineNumber":22,"author":{"gitId":"-"},"content":" /**","lastModifiedDate":"2016-08-24"},{"lineNumber":23,"author":{"gitId":"-"},"content":" * Constructs an {@code Address}.","lastModifiedDate":"2017-05-30"},{"lineNumber":24,"author":{"gitId":"-"},"content":" *","lastModifiedDate":"2016-08-24"},{"lineNumber":25,"author":{"gitId":"AndrewOng2066"},"content":" *","lastModifiedDate":"2024-03-08"},{"lineNumber":26,"author":{"gitId":"-"},"content":" * @param address A valid address.","lastModifiedDate":"2017-05-30"},{"lineNumber":27,"author":{"gitId":"-"},"content":" */","lastModifiedDate":"2016-08-24"},{"lineNumber":28,"author":{"gitId":"-"},"content":" public Address(String address) {","lastModifiedDate":"2017-05-30"},{"lineNumber":29,"author":{"gitId":"-"},"content":" requireNonNull(address);","lastModifiedDate":"2017-05-15"},{"lineNumber":30,"author":{"gitId":"-"},"content":" checkArgument(isValidAddress(address), MESSAGE_CONSTRAINTS);","lastModifiedDate":"2018-09-22"},{"lineNumber":31,"author":{"gitId":"-"},"content":" value \u003d address;","lastModifiedDate":"2018-08-14"},{"lineNumber":32,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2016-08-24"},{"lineNumber":33,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2016-08-24"},{"lineNumber":34,"author":{"gitId":"-"},"content":" /**","lastModifiedDate":"2016-08-24"},{"lineNumber":35,"author":{"gitId":"-"},"content":" * Returns true if a given string is a valid email.","lastModifiedDate":"2018-04-05"},{"lineNumber":36,"author":{"gitId":"-"},"content":" */","lastModifiedDate":"2016-08-24"},{"lineNumber":37,"author":{"gitId":"-"},"content":" public static boolean isValidAddress(String test) {","lastModifiedDate":"2016-08-24"},{"lineNumber":38,"author":{"gitId":"-"},"content":" return test.matches(VALIDATION_REGEX);","lastModifiedDate":"2018-09-22"},{"lineNumber":39,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2016-08-24"},{"lineNumber":40,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2016-08-24"},{"lineNumber":41,"author":{"gitId":"-"},"content":" @Override","lastModifiedDate":"2016-08-24"},{"lineNumber":42,"author":{"gitId":"-"},"content":" public String toString() {","lastModifiedDate":"2016-08-24"},{"lineNumber":43,"author":{"gitId":"-"},"content":" return value;","lastModifiedDate":"2016-08-24"},{"lineNumber":44,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2016-08-24"},{"lineNumber":45,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2016-08-24"},{"lineNumber":46,"author":{"gitId":"-"},"content":" @Override","lastModifiedDate":"2016-08-24"},{"lineNumber":47,"author":{"gitId":"-"},"content":" public boolean equals(Object other) {","lastModifiedDate":"2016-08-24"},{"lineNumber":48,"author":{"gitId":"-"},"content":" if (other \u003d\u003d this) {","lastModifiedDate":"2023-07-13"},{"lineNumber":49,"author":{"gitId":"-"},"content":" return true;","lastModifiedDate":"2023-07-13"},{"lineNumber":50,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2023-07-13"},{"lineNumber":51,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2023-07-13"},{"lineNumber":52,"author":{"gitId":"-"},"content":" // instanceof handles nulls","lastModifiedDate":"2023-07-13"},{"lineNumber":53,"author":{"gitId":"-"},"content":" if (!(other instanceof Address)) {","lastModifiedDate":"2023-07-13"},{"lineNumber":54,"author":{"gitId":"-"},"content":" return false;","lastModifiedDate":"2023-07-13"},{"lineNumber":55,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2023-07-13"},{"lineNumber":56,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2023-07-13"},{"lineNumber":57,"author":{"gitId":"-"},"content":" Address otherAddress \u003d (Address) other;","lastModifiedDate":"2023-07-13"},{"lineNumber":58,"author":{"gitId":"-"},"content":" return value.equals(otherAddress.value);","lastModifiedDate":"2023-07-13"},{"lineNumber":59,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2016-08-24"},{"lineNumber":60,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2016-08-24"},{"lineNumber":61,"author":{"gitId":"-"},"content":" @Override","lastModifiedDate":"2016-08-24"},{"lineNumber":62,"author":{"gitId":"-"},"content":" public int hashCode() {","lastModifiedDate":"2016-08-24"},{"lineNumber":63,"author":{"gitId":"-"},"content":" return value.hashCode();","lastModifiedDate":"2016-08-24"},{"lineNumber":64,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2016-08-24"},{"lineNumber":65,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2016-08-24"},{"lineNumber":66,"author":{"gitId":"-"},"content":"}","lastModifiedDate":"2016-08-24"}],"authorContributionMap":{"faaheem13":1,"AndrewOng2066":1,"-":64}},{"path":"src/main/java/seedu/address/model/person/Email.java","fileType":"functional-code","lines":[{"lineNumber":1,"author":{"gitId":"-"},"content":"package seedu.address.model.person;","lastModifiedDate":"2016-08-24"},{"lineNumber":2,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2016-08-24"},{"lineNumber":3,"author":{"gitId":"-"},"content":"import static java.util.Objects.requireNonNull;","lastModifiedDate":"2017-05-15"},{"lineNumber":4,"author":{"gitId":"-"},"content":"import static seedu.address.commons.util.AppUtil.checkArgument;","lastModifiedDate":"2017-05-30"},{"lineNumber":5,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2016-08-24"},{"lineNumber":6,"author":{"gitId":"-"},"content":"/**","lastModifiedDate":"2016-08-24"},{"lineNumber":7,"author":{"gitId":"taniatsq"},"content":" * Represents a Person\u0027s String email in the address book.","lastModifiedDate":"2024-03-08"},{"lineNumber":8,"author":{"gitId":"-"},"content":" * Guarantees: immutable; is valid as declared in {@link #isValidEmail(String)}","lastModifiedDate":"2016-08-24"},{"lineNumber":9,"author":{"gitId":"-"},"content":" */","lastModifiedDate":"2016-08-24"},{"lineNumber":10,"author":{"gitId":"-"},"content":"public class Email {","lastModifiedDate":"2016-09-21"},{"lineNumber":11,"author":{"gitId":"-"},"content":" private static final String SPECIAL_CHARACTERS \u003d \"+_.-\";","lastModifiedDate":"2021-07-20"},{"lineNumber":12,"author":{"gitId":"-"},"content":" public static final String MESSAGE_CONSTRAINTS \u003d \"Emails should be of the format local-part@domain \"","lastModifiedDate":"2018-09-22"},{"lineNumber":13,"author":{"gitId":"-"},"content":" + \"and adhere to the following constraints:\\n\"","lastModifiedDate":"2018-02-09"},{"lineNumber":14,"author":{"gitId":"-"},"content":" + \"1. The local-part should only contain alphanumeric characters and these special characters, excluding \"","lastModifiedDate":"2018-02-09"},{"lineNumber":15,"author":{"gitId":"-"},"content":" + \"the parentheses, (\" + SPECIAL_CHARACTERS + \"). The local-part may not start or end with any special \"","lastModifiedDate":"2021-07-20"},{"lineNumber":16,"author":{"gitId":"-"},"content":" + \"characters.\\n\"","lastModifiedDate":"2021-07-20"},{"lineNumber":17,"author":{"gitId":"-"},"content":" + \"2. This is followed by a \u0027@\u0027 and then a domain name. The domain name is made up of domain labels \"","lastModifiedDate":"2021-07-20"},{"lineNumber":18,"author":{"gitId":"-"},"content":" + \"separated by periods.\\n\"","lastModifiedDate":"2021-07-20"},{"lineNumber":19,"author":{"gitId":"-"},"content":" + \"The domain name must:\\n\"","lastModifiedDate":"2018-02-09"},{"lineNumber":20,"author":{"gitId":"-"},"content":" + \" - end with a domain label at least 2 characters long\\n\"","lastModifiedDate":"2021-07-20"},{"lineNumber":21,"author":{"gitId":"-"},"content":" + \" - have each domain label start and end with alphanumeric characters\\n\"","lastModifiedDate":"2021-07-20"},{"lineNumber":22,"author":{"gitId":"-"},"content":" + \" - have each domain label consist of alphanumeric characters, separated only by hyphens, if any.\";","lastModifiedDate":"2021-07-20"},{"lineNumber":23,"author":{"gitId":"-"},"content":" // alphanumeric and special characters","lastModifiedDate":"2018-02-09"},{"lineNumber":24,"author":{"gitId":"-"},"content":" private static final String ALPHANUMERIC_NO_UNDERSCORE \u003d \"[^\\\\W_]+\"; // alphanumeric characters except underscore","lastModifiedDate":"2021-07-20"},{"lineNumber":25,"author":{"gitId":"-"},"content":" private static final String LOCAL_PART_REGEX \u003d \"^\" + ALPHANUMERIC_NO_UNDERSCORE + \"([\" + SPECIAL_CHARACTERS + \"]\"","lastModifiedDate":"2021-07-20"},{"lineNumber":26,"author":{"gitId":"-"},"content":" + ALPHANUMERIC_NO_UNDERSCORE + \")*\";","lastModifiedDate":"2021-07-20"},{"lineNumber":27,"author":{"gitId":"-"},"content":" private static final String DOMAIN_PART_REGEX \u003d ALPHANUMERIC_NO_UNDERSCORE","lastModifiedDate":"2021-07-20"},{"lineNumber":28,"author":{"gitId":"-"},"content":" + \"(-\" + ALPHANUMERIC_NO_UNDERSCORE + \")*\";","lastModifiedDate":"2021-07-20"},{"lineNumber":29,"author":{"gitId":"-"},"content":" private static final String DOMAIN_LAST_PART_REGEX \u003d \"(\" + DOMAIN_PART_REGEX + \"){2,}$\"; // At least two chars","lastModifiedDate":"2021-07-20"},{"lineNumber":30,"author":{"gitId":"-"},"content":" private static final String DOMAIN_REGEX \u003d \"(\" + DOMAIN_PART_REGEX + \"\\\\.)*\" + DOMAIN_LAST_PART_REGEX;","lastModifiedDate":"2021-07-20"},{"lineNumber":31,"author":{"gitId":"-"},"content":" public static final String VALIDATION_REGEX \u003d LOCAL_PART_REGEX + \"@\" + DOMAIN_REGEX;","lastModifiedDate":"2021-07-20"},{"lineNumber":32,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2016-08-24"},{"lineNumber":33,"author":{"gitId":"-"},"content":" public final String value;","lastModifiedDate":"2016-08-24"},{"lineNumber":34,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2016-08-24"},{"lineNumber":35,"author":{"gitId":"-"},"content":" /**","lastModifiedDate":"2016-08-24"},{"lineNumber":36,"author":{"gitId":"-"},"content":" * Constructs an {@code Email}.","lastModifiedDate":"2017-05-30"},{"lineNumber":37,"author":{"gitId":"-"},"content":" *","lastModifiedDate":"2016-08-24"},{"lineNumber":38,"author":{"gitId":"-"},"content":" * @param email A valid email address.","lastModifiedDate":"2017-05-30"},{"lineNumber":39,"author":{"gitId":"-"},"content":" */","lastModifiedDate":"2016-08-24"},{"lineNumber":40,"author":{"gitId":"-"},"content":" public Email(String email) {","lastModifiedDate":"2017-05-30"},{"lineNumber":41,"author":{"gitId":"-"},"content":" requireNonNull(email);","lastModifiedDate":"2017-05-15"},{"lineNumber":42,"author":{"gitId":"-"},"content":" checkArgument(isValidEmail(email), MESSAGE_CONSTRAINTS);","lastModifiedDate":"2018-09-22"},{"lineNumber":43,"author":{"gitId":"-"},"content":" value \u003d email;","lastModifiedDate":"2018-08-14"},{"lineNumber":44,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2016-08-24"},{"lineNumber":45,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2016-08-24"},{"lineNumber":46,"author":{"gitId":"-"},"content":" /**","lastModifiedDate":"2016-08-24"},{"lineNumber":47,"author":{"gitId":"-"},"content":" * Returns if a given string is a valid email.","lastModifiedDate":"2018-04-05"},{"lineNumber":48,"author":{"gitId":"-"},"content":" */","lastModifiedDate":"2016-08-24"},{"lineNumber":49,"author":{"gitId":"-"},"content":" public static boolean isValidEmail(String test) {","lastModifiedDate":"2016-08-24"},{"lineNumber":50,"author":{"gitId":"-"},"content":" return test.matches(VALIDATION_REGEX);","lastModifiedDate":"2018-09-22"},{"lineNumber":51,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2016-08-24"},{"lineNumber":52,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2016-08-24"},{"lineNumber":53,"author":{"gitId":"-"},"content":" @Override","lastModifiedDate":"2016-08-24"},{"lineNumber":54,"author":{"gitId":"-"},"content":" public String toString() {","lastModifiedDate":"2016-08-24"},{"lineNumber":55,"author":{"gitId":"-"},"content":" return value;","lastModifiedDate":"2016-08-24"},{"lineNumber":56,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2016-08-24"},{"lineNumber":57,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2016-08-24"},{"lineNumber":58,"author":{"gitId":"-"},"content":" @Override","lastModifiedDate":"2016-08-24"},{"lineNumber":59,"author":{"gitId":"-"},"content":" public boolean equals(Object other) {","lastModifiedDate":"2016-08-24"},{"lineNumber":60,"author":{"gitId":"-"},"content":" if (other \u003d\u003d this) {","lastModifiedDate":"2023-07-13"},{"lineNumber":61,"author":{"gitId":"-"},"content":" return true;","lastModifiedDate":"2023-07-13"},{"lineNumber":62,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2023-07-13"},{"lineNumber":63,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2023-07-13"},{"lineNumber":64,"author":{"gitId":"-"},"content":" // instanceof handles nulls","lastModifiedDate":"2023-07-13"},{"lineNumber":65,"author":{"gitId":"-"},"content":" if (!(other instanceof Email)) {","lastModifiedDate":"2023-07-13"},{"lineNumber":66,"author":{"gitId":"-"},"content":" return false;","lastModifiedDate":"2023-07-13"},{"lineNumber":67,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2023-07-13"},{"lineNumber":68,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2023-07-13"},{"lineNumber":69,"author":{"gitId":"-"},"content":" Email otherEmail \u003d (Email) other;","lastModifiedDate":"2023-07-13"},{"lineNumber":70,"author":{"gitId":"-"},"content":" return value.equals(otherEmail.value);","lastModifiedDate":"2023-07-13"},{"lineNumber":71,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2016-08-24"},{"lineNumber":72,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2016-08-24"},{"lineNumber":73,"author":{"gitId":"-"},"content":" @Override","lastModifiedDate":"2016-08-24"},{"lineNumber":74,"author":{"gitId":"-"},"content":" public int hashCode() {","lastModifiedDate":"2016-08-24"},{"lineNumber":75,"author":{"gitId":"-"},"content":" return value.hashCode();","lastModifiedDate":"2016-08-24"},{"lineNumber":76,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2016-08-24"},{"lineNumber":77,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2016-08-24"},{"lineNumber":78,"author":{"gitId":"-"},"content":"}","lastModifiedDate":"2016-08-24"}],"authorContributionMap":{"taniatsq":1,"-":77}}] +[{"path":"docs/AboutUs.md","fileType":"docs","lines":[{"lineNumber":1,"author":{"gitId":"-"},"content":"---","lastModifiedDate":"2020-05-23"},{"lineNumber":2,"author":{"gitId":"-"},"content":" layout: default.md","lastModifiedDate":"2023-09-12"},{"lineNumber":3,"author":{"gitId":"-"},"content":" title: \"About Us\"","lastModifiedDate":"2023-09-12"},{"lineNumber":4,"author":{"gitId":"-"},"content":"---","lastModifiedDate":"2020-05-23"},{"lineNumber":5,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":6,"author":{"gitId":"-"},"content":"# About Us","lastModifiedDate":"2023-09-12"},{"lineNumber":7,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2023-09-12"},{"lineNumber":8,"author":{"gitId":"-"},"content":"We are a team based in the [School of Computing, National University of Singapore](http://www.comp.nus.edu.sg).","lastModifiedDate":"2020-05-23"},{"lineNumber":9,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":10,"author":{"gitId":"-"},"content":"You can reach us at the email `seer[at]comp.nus.edu.sg`","lastModifiedDate":"2020-06-17"},{"lineNumber":11,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-06-17"},{"lineNumber":12,"author":{"gitId":"-"},"content":"## Project team","lastModifiedDate":"2020-06-07"},{"lineNumber":13,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":14,"author":{"gitId":"-"},"content":"### John Doe","lastModifiedDate":"2020-05-23"},{"lineNumber":15,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":16,"author":{"gitId":"-"},"content":"\u003cimg src\u003d\"images/johndoe.png\" width\u003d\"200px\"\u003e","lastModifiedDate":"2020-06-17"},{"lineNumber":17,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":18,"author":{"gitId":"-"},"content":"[[homepage](http://www.comp.nus.edu.sg/~damithch)]","lastModifiedDate":"2020-05-23"},{"lineNumber":19,"author":{"gitId":"-"},"content":"[[github](https://github.com/johndoe)]","lastModifiedDate":"2020-06-17"},{"lineNumber":20,"author":{"gitId":"-"},"content":"[[portfolio](team/johndoe.md)]","lastModifiedDate":"2020-05-23"},{"lineNumber":21,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":22,"author":{"gitId":"-"},"content":"* Role: Project Advisor","lastModifiedDate":"2020-05-23"},{"lineNumber":23,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":24,"author":{"gitId":"-"},"content":"### Jane Doe","lastModifiedDate":"2020-06-17"},{"lineNumber":25,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":26,"author":{"gitId":"-"},"content":"\u003cimg src\u003d\"images/johndoe.png\" width\u003d\"200px\"\u003e","lastModifiedDate":"2020-06-17"},{"lineNumber":27,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":28,"author":{"gitId":"-"},"content":"[[github](http://github.com/johndoe)]","lastModifiedDate":"2020-06-17"},{"lineNumber":29,"author":{"gitId":"-"},"content":"[[portfolio](team/johndoe.md)]","lastModifiedDate":"2020-05-23"},{"lineNumber":30,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":31,"author":{"gitId":"-"},"content":"* Role: Team Lead","lastModifiedDate":"2020-05-23"},{"lineNumber":32,"author":{"gitId":"-"},"content":"* Responsibilities: UI","lastModifiedDate":"2020-05-23"},{"lineNumber":33,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":34,"author":{"gitId":"faaheem13"},"content":"### Rahman Faaheem Ilhaam","lastModifiedDate":"2024-03-08"},{"lineNumber":35,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":36,"author":{"gitId":"faaheem13"},"content":"\u003cimg src\u003d\"images/faaheem13.png\" width\u003d\"200px\"\u003e","lastModifiedDate":"2024-03-08"},{"lineNumber":37,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":38,"author":{"gitId":"faaheem13"},"content":"[[github](http://github.com/faaheem13)] [[portfolio](team/johndoe.md)]","lastModifiedDate":"2024-03-08"},{"lineNumber":39,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":40,"author":{"gitId":"-"},"content":"* Role: Developer","lastModifiedDate":"2020-05-23"},{"lineNumber":41,"author":{"gitId":"faaheem13"},"content":"* Responsibilities: ","lastModifiedDate":"2024-03-08"},{"lineNumber":42,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":43,"author":{"gitId":"-"},"content":"### Jean Doe","lastModifiedDate":"2020-06-17"},{"lineNumber":44,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":45,"author":{"gitId":"-"},"content":"\u003cimg src\u003d\"images/johndoe.png\" width\u003d\"200px\"\u003e","lastModifiedDate":"2020-06-17"},{"lineNumber":46,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":47,"author":{"gitId":"-"},"content":"[[github](http://github.com/johndoe)]","lastModifiedDate":"2020-06-17"},{"lineNumber":48,"author":{"gitId":"-"},"content":"[[portfolio](team/johndoe.md)]","lastModifiedDate":"2020-05-23"},{"lineNumber":49,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":50,"author":{"gitId":"-"},"content":"* Role: Developer","lastModifiedDate":"2020-05-23"},{"lineNumber":51,"author":{"gitId":"-"},"content":"* Responsibilities: Dev Ops + Threading","lastModifiedDate":"2020-05-23"},{"lineNumber":52,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":53,"author":{"gitId":"-"},"content":"### James Doe","lastModifiedDate":"2020-06-17"},{"lineNumber":54,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":55,"author":{"gitId":"-"},"content":"\u003cimg src\u003d\"images/johndoe.png\" width\u003d\"200px\"\u003e","lastModifiedDate":"2020-06-17"},{"lineNumber":56,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":57,"author":{"gitId":"-"},"content":"[[github](http://github.com/johndoe)]","lastModifiedDate":"2020-06-17"},{"lineNumber":58,"author":{"gitId":"-"},"content":"[[portfolio](team/johndoe.md)]","lastModifiedDate":"2020-05-23"},{"lineNumber":59,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":60,"author":{"gitId":"-"},"content":"* Role: Developer","lastModifiedDate":"2020-05-23"},{"lineNumber":61,"author":{"gitId":"-"},"content":"* Responsibilities: UI","lastModifiedDate":"2020-05-23"}],"authorContributionMap":{"faaheem13":4,"-":57}},{"path":"docs/_markbind/layouts/default.md","fileType":"docs","lines":[{"lineNumber":1,"author":{"gitId":"-"},"content":"\u003chead-bottom\u003e","lastModifiedDate":"2023-09-12"},{"lineNumber":2,"author":{"gitId":"-"},"content":" \u003clink rel\u003d\"stylesheet\" href\u003d\"{{baseUrl}}/stylesheets/main.css\"\u003e","lastModifiedDate":"2023-09-12"},{"lineNumber":3,"author":{"gitId":"-"},"content":"\u003c/head-bottom\u003e","lastModifiedDate":"2023-09-12"},{"lineNumber":4,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2023-09-12"},{"lineNumber":5,"author":{"gitId":"-"},"content":"\u003cheader sticky\u003e","lastModifiedDate":"2023-09-12"},{"lineNumber":6,"author":{"gitId":"-"},"content":" \u003cnavbar type\u003d\"dark\"\u003e","lastModifiedDate":"2023-09-12"},{"lineNumber":7,"author":{"gitId":"AndrewOng2066"},"content":" \u003ca slot\u003d\"brand\" href\u003d\"{{baseUrl}}/index.html\" title\u003d\"Home\" class\u003d\"navbar-brand\"\u003eMyProduct\u003c/a\u003e","lastModifiedDate":"2024-02-25"},{"lineNumber":8,"author":{"gitId":"-"},"content":" \u003cli\u003e\u003ca href\u003d\"{{baseUrl}}/index.html\" class\u003d\"nav-link\"\u003eHome\u003c/a\u003e\u003c/li\u003e","lastModifiedDate":"2024-02-09"},{"lineNumber":9,"author":{"gitId":"-"},"content":" \u003cli\u003e\u003ca href\u003d\"{{baseUrl}}/UserGuide.html\" class\u003d\"nav-link\"\u003eUser Guide\u003c/a\u003e\u003c/li\u003e","lastModifiedDate":"2023-09-12"},{"lineNumber":10,"author":{"gitId":"-"},"content":" \u003cli\u003e\u003ca href\u003d\"{{baseUrl}}/DeveloperGuide.html\" class\u003d\"nav-link\"\u003eDeveloper Guide\u003c/a\u003e\u003c/li\u003e","lastModifiedDate":"2023-09-12"},{"lineNumber":11,"author":{"gitId":"-"},"content":" \u003cli\u003e\u003ca href\u003d\"{{baseUrl}}/AboutUs.html\" class\u003d\"nav-link\"\u003eAbout Us\u003c/a\u003e\u003c/li\u003e","lastModifiedDate":"2023-09-12"},{"lineNumber":12,"author":{"gitId":"-"},"content":" \u003cli\u003e\u003ca href\u003d\"https://github.com/se-edu/addressbook-level3\" target\u003d\"_blank\" class\u003d\"nav-link\"\u003e\u003cmd\u003e:fab-github:\u003c/md\u003e\u003c/a\u003e","lastModifiedDate":"2023-09-12"},{"lineNumber":13,"author":{"gitId":"-"},"content":" \u003c/li\u003e","lastModifiedDate":"2023-09-12"},{"lineNumber":14,"author":{"gitId":"-"},"content":" \u003cli slot\u003d\"right\"\u003e","lastModifiedDate":"2023-09-12"},{"lineNumber":15,"author":{"gitId":"-"},"content":" \u003cform class\u003d\"navbar-form\"\u003e","lastModifiedDate":"2023-09-12"},{"lineNumber":16,"author":{"gitId":"-"},"content":" \u003csearchbar :data\u003d\"searchData\" placeholder\u003d\"Search\" :on-hit\u003d\"searchCallback\" menu-align-right\u003e\u003c/searchbar\u003e","lastModifiedDate":"2023-09-12"},{"lineNumber":17,"author":{"gitId":"-"},"content":" \u003c/form\u003e","lastModifiedDate":"2023-09-12"},{"lineNumber":18,"author":{"gitId":"-"},"content":" \u003c/li\u003e","lastModifiedDate":"2023-09-12"},{"lineNumber":19,"author":{"gitId":"-"},"content":" \u003c/navbar\u003e","lastModifiedDate":"2023-09-12"},{"lineNumber":20,"author":{"gitId":"-"},"content":"\u003c/header\u003e","lastModifiedDate":"2023-09-12"},{"lineNumber":21,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2023-09-12"},{"lineNumber":22,"author":{"gitId":"-"},"content":"\u003cdiv id\u003d\"flex-body\"\u003e","lastModifiedDate":"2023-09-12"},{"lineNumber":23,"author":{"gitId":"-"},"content":" \u003cnav id\u003d\"site-nav\"\u003e","lastModifiedDate":"2023-09-12"},{"lineNumber":24,"author":{"gitId":"-"},"content":" \u003cdiv class\u003d\"site-nav-top\"\u003e","lastModifiedDate":"2023-09-12"},{"lineNumber":25,"author":{"gitId":"-"},"content":" \u003cdiv class\u003d\"fw-bold mb-2\" style\u003d\"font-size: 1.25rem;\"\u003eSite Map\u003c/div\u003e","lastModifiedDate":"2023-09-12"},{"lineNumber":26,"author":{"gitId":"-"},"content":" \u003c/div\u003e","lastModifiedDate":"2023-09-12"},{"lineNumber":27,"author":{"gitId":"-"},"content":" \u003cdiv class\u003d\"nav-component slim-scroll\"\u003e","lastModifiedDate":"2023-09-12"},{"lineNumber":28,"author":{"gitId":"-"},"content":" \u003csite-nav\u003e","lastModifiedDate":"2023-09-12"},{"lineNumber":29,"author":{"gitId":"-"},"content":"* [Home]({{ baseUrl }}/index.html)","lastModifiedDate":"2023-09-12"},{"lineNumber":30,"author":{"gitId":"-"},"content":"* [User Guide]({{ baseUrl }}/UserGuide.html) :expanded:","lastModifiedDate":"2023-09-12"},{"lineNumber":31,"author":{"gitId":"-"},"content":" * [Quick Start]({{ baseUrl }}/UserGuide.html#quick-start)","lastModifiedDate":"2023-09-12"},{"lineNumber":32,"author":{"gitId":"-"},"content":" * [Features]({{ baseUrl }}/UserGuide.html#features)","lastModifiedDate":"2023-09-12"},{"lineNumber":33,"author":{"gitId":"-"},"content":" * [FAQ]({{ baseUrl }}/UserGuide.html#faq)","lastModifiedDate":"2023-09-12"},{"lineNumber":34,"author":{"gitId":"-"},"content":" * [Command Summary]({{ baseUrl }}/UserGuide.html#faq)","lastModifiedDate":"2023-09-12"},{"lineNumber":35,"author":{"gitId":"-"},"content":"* [Developer Guide]({{ baseUrl }}/DeveloperGuide.html) :expanded:","lastModifiedDate":"2023-09-12"},{"lineNumber":36,"author":{"gitId":"-"},"content":" * [Acknowledgements]({{ baseUrl }}/DeveloperGuide.html#acknowledgements)","lastModifiedDate":"2023-09-12"},{"lineNumber":37,"author":{"gitId":"-"},"content":" * [Setting Up]({{ baseUrl }}/DeveloperGuide.html#setting-up-getting-started)","lastModifiedDate":"2023-09-12"},{"lineNumber":38,"author":{"gitId":"-"},"content":" * [Design]({{ baseUrl }}/DeveloperGuide.html#design)","lastModifiedDate":"2023-09-12"},{"lineNumber":39,"author":{"gitId":"-"},"content":" * [Implementation]({{ baseUrl }}/DeveloperGuide.html#implementation)","lastModifiedDate":"2023-09-12"},{"lineNumber":40,"author":{"gitId":"-"},"content":" * [Documentation, logging, testing, configuration, dev-ops]({{ baseUrl }}/DeveloperGuide.html#documentation-logging-testing-configuration-dev-ops)","lastModifiedDate":"2023-09-12"},{"lineNumber":41,"author":{"gitId":"-"},"content":" * [Appendix: Requirements]({{ baseUrl }}/DeveloperGuide.html#appendix-requirements)","lastModifiedDate":"2023-09-12"},{"lineNumber":42,"author":{"gitId":"-"},"content":" * [Appendix: Instructions for manual testing]({{ baseUrl }}/DeveloperGuide.html#appendix-instructions-for-manual-testing)","lastModifiedDate":"2023-09-12"},{"lineNumber":43,"author":{"gitId":"-"},"content":"* Tutorials","lastModifiedDate":"2023-09-12"},{"lineNumber":44,"author":{"gitId":"-"},"content":" * [Tracing code]({{ baseUrl }}/tutorials/TracingCode.html)","lastModifiedDate":"2023-09-12"},{"lineNumber":45,"author":{"gitId":"-"},"content":" * [Adding a command]({{ baseUrl }}/tutorials/AddRemark.html)","lastModifiedDate":"2023-09-12"},{"lineNumber":46,"author":{"gitId":"-"},"content":" * [Removing Fields]({{ baseUrl }}/tutorials/RemovingFields.html)","lastModifiedDate":"2023-09-12"},{"lineNumber":47,"author":{"gitId":"-"},"content":"* [About Us]({{ baseUrl }}/AboutUs.html)","lastModifiedDate":"2023-09-12"},{"lineNumber":48,"author":{"gitId":"-"},"content":" \u003c/site-nav\u003e","lastModifiedDate":"2023-09-12"},{"lineNumber":49,"author":{"gitId":"-"},"content":" \u003c/div\u003e","lastModifiedDate":"2023-09-12"},{"lineNumber":50,"author":{"gitId":"-"},"content":" \u003c/nav\u003e","lastModifiedDate":"2023-09-12"},{"lineNumber":51,"author":{"gitId":"-"},"content":" \u003cdiv id\u003d\"content-wrapper\"\u003e","lastModifiedDate":"2023-09-12"},{"lineNumber":52,"author":{"gitId":"-"},"content":" {{ content }}","lastModifiedDate":"2023-09-12"},{"lineNumber":53,"author":{"gitId":"-"},"content":" \u003c/div\u003e","lastModifiedDate":"2023-09-12"},{"lineNumber":54,"author":{"gitId":"-"},"content":" \u003cnav id\u003d\"page-nav\"\u003e","lastModifiedDate":"2023-09-12"},{"lineNumber":55,"author":{"gitId":"-"},"content":" \u003cdiv class\u003d\"nav-component slim-scroll\"\u003e","lastModifiedDate":"2023-09-12"},{"lineNumber":56,"author":{"gitId":"-"},"content":" \u003cpage-nav /\u003e","lastModifiedDate":"2023-09-12"},{"lineNumber":57,"author":{"gitId":"-"},"content":" \u003c/div\u003e","lastModifiedDate":"2023-09-12"},{"lineNumber":58,"author":{"gitId":"-"},"content":" \u003c/nav\u003e","lastModifiedDate":"2023-09-12"},{"lineNumber":59,"author":{"gitId":"-"},"content":" \u003cscroll-top-button\u003e\u003c/scroll-top-button\u003e","lastModifiedDate":"2023-09-12"},{"lineNumber":60,"author":{"gitId":"-"},"content":"\u003c/div\u003e","lastModifiedDate":"2023-09-12"},{"lineNumber":61,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2023-09-12"},{"lineNumber":62,"author":{"gitId":"-"},"content":"\u003cfooter\u003e","lastModifiedDate":"2023-09-12"},{"lineNumber":63,"author":{"gitId":"-"},"content":" \u003c!-- Support MarkBind by including a link to us on your landing page! --\u003e","lastModifiedDate":"2023-09-12"},{"lineNumber":64,"author":{"gitId":"-"},"content":" \u003cdiv class\u003d\"text-center\"\u003e","lastModifiedDate":"2023-09-12"},{"lineNumber":65,"author":{"gitId":"-"},"content":" \u003csmall\u003e[\u003cmd\u003e**Powered by**\u003c/md\u003e \u003cimg src\u003d\"https://markbind.org/favicon.ico\" width\u003d\"30\"\u003e {{MarkBind}}, generated on {{timestamp}}]\u003c/small\u003e","lastModifiedDate":"2023-09-12"},{"lineNumber":66,"author":{"gitId":"-"},"content":" \u003c/div\u003e","lastModifiedDate":"2023-09-12"},{"lineNumber":67,"author":{"gitId":"-"},"content":"\u003c/footer\u003e","lastModifiedDate":"2023-09-12"}],"authorContributionMap":{"AndrewOng2066":1,"-":66}},{"path":"src/main/java/seedu/address/model/person/Address.java","fileType":"functional-code","lines":[{"lineNumber":1,"author":{"gitId":"-"},"content":"package seedu.address.model.person;","lastModifiedDate":"2016-08-24"},{"lineNumber":2,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2016-08-24"},{"lineNumber":3,"author":{"gitId":"-"},"content":"import static java.util.Objects.requireNonNull;","lastModifiedDate":"2017-05-15"},{"lineNumber":4,"author":{"gitId":"-"},"content":"import static seedu.address.commons.util.AppUtil.checkArgument;","lastModifiedDate":"2017-05-30"},{"lineNumber":5,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2016-08-24"},{"lineNumber":6,"author":{"gitId":"-"},"content":"/**","lastModifiedDate":"2016-08-24"},{"lineNumber":7,"author":{"gitId":"faaheem13"},"content":" * Represents a Person\u0027s (Student\u0027s) address in the address book.","lastModifiedDate":"2024-03-08"},{"lineNumber":8,"author":{"gitId":"-"},"content":" * Guarantees: immutable; is valid as declared in {@link #isValidAddress(String)}","lastModifiedDate":"2016-08-24"},{"lineNumber":9,"author":{"gitId":"-"},"content":" */","lastModifiedDate":"2016-08-24"},{"lineNumber":10,"author":{"gitId":"-"},"content":"public class Address {","lastModifiedDate":"2016-09-21"},{"lineNumber":11,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2016-08-24"},{"lineNumber":12,"author":{"gitId":"-"},"content":" public static final String MESSAGE_CONSTRAINTS \u003d \"Addresses can take any values, and it should not be blank\";","lastModifiedDate":"2018-09-22"},{"lineNumber":13,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2017-01-16"},{"lineNumber":14,"author":{"gitId":"-"},"content":" /*","lastModifiedDate":"2017-01-16"},{"lineNumber":15,"author":{"gitId":"-"},"content":" * The first character of the address must not be a whitespace,","lastModifiedDate":"2017-01-16"},{"lineNumber":16,"author":{"gitId":"-"},"content":" * otherwise \" \" (a blank string) becomes a valid input.","lastModifiedDate":"2017-01-16"},{"lineNumber":17,"author":{"gitId":"-"},"content":" */","lastModifiedDate":"2017-01-16"},{"lineNumber":18,"author":{"gitId":"-"},"content":" public static final String VALIDATION_REGEX \u003d \"[^\\\\s].*\";","lastModifiedDate":"2018-09-22"},{"lineNumber":19,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2016-08-24"},{"lineNumber":20,"author":{"gitId":"-"},"content":" public final String value;","lastModifiedDate":"2016-08-24"},{"lineNumber":21,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2016-08-24"},{"lineNumber":22,"author":{"gitId":"-"},"content":" /**","lastModifiedDate":"2016-08-24"},{"lineNumber":23,"author":{"gitId":"-"},"content":" * Constructs an {@code Address}.","lastModifiedDate":"2017-05-30"},{"lineNumber":24,"author":{"gitId":"-"},"content":" *","lastModifiedDate":"2016-08-24"},{"lineNumber":25,"author":{"gitId":"AndrewOng2066"},"content":" *","lastModifiedDate":"2024-03-08"},{"lineNumber":26,"author":{"gitId":"-"},"content":" * @param address A valid address.","lastModifiedDate":"2017-05-30"},{"lineNumber":27,"author":{"gitId":"-"},"content":" */","lastModifiedDate":"2016-08-24"},{"lineNumber":28,"author":{"gitId":"-"},"content":" public Address(String address) {","lastModifiedDate":"2017-05-30"},{"lineNumber":29,"author":{"gitId":"-"},"content":" requireNonNull(address);","lastModifiedDate":"2017-05-15"},{"lineNumber":30,"author":{"gitId":"-"},"content":" checkArgument(isValidAddress(address), MESSAGE_CONSTRAINTS);","lastModifiedDate":"2018-09-22"},{"lineNumber":31,"author":{"gitId":"-"},"content":" value \u003d address;","lastModifiedDate":"2018-08-14"},{"lineNumber":32,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2016-08-24"},{"lineNumber":33,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2016-08-24"},{"lineNumber":34,"author":{"gitId":"-"},"content":" /**","lastModifiedDate":"2016-08-24"},{"lineNumber":35,"author":{"gitId":"-"},"content":" * Returns true if a given string is a valid email.","lastModifiedDate":"2018-04-05"},{"lineNumber":36,"author":{"gitId":"-"},"content":" */","lastModifiedDate":"2016-08-24"},{"lineNumber":37,"author":{"gitId":"-"},"content":" public static boolean isValidAddress(String test) {","lastModifiedDate":"2016-08-24"},{"lineNumber":38,"author":{"gitId":"-"},"content":" return test.matches(VALIDATION_REGEX);","lastModifiedDate":"2018-09-22"},{"lineNumber":39,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2016-08-24"},{"lineNumber":40,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2016-08-24"},{"lineNumber":41,"author":{"gitId":"-"},"content":" @Override","lastModifiedDate":"2016-08-24"},{"lineNumber":42,"author":{"gitId":"-"},"content":" public String toString() {","lastModifiedDate":"2016-08-24"},{"lineNumber":43,"author":{"gitId":"-"},"content":" return value;","lastModifiedDate":"2016-08-24"},{"lineNumber":44,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2016-08-24"},{"lineNumber":45,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2016-08-24"},{"lineNumber":46,"author":{"gitId":"-"},"content":" @Override","lastModifiedDate":"2016-08-24"},{"lineNumber":47,"author":{"gitId":"-"},"content":" public boolean equals(Object other) {","lastModifiedDate":"2016-08-24"},{"lineNumber":48,"author":{"gitId":"-"},"content":" if (other \u003d\u003d this) {","lastModifiedDate":"2023-07-13"},{"lineNumber":49,"author":{"gitId":"-"},"content":" return true;","lastModifiedDate":"2023-07-13"},{"lineNumber":50,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2023-07-13"},{"lineNumber":51,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2023-07-13"},{"lineNumber":52,"author":{"gitId":"-"},"content":" // instanceof handles nulls","lastModifiedDate":"2023-07-13"},{"lineNumber":53,"author":{"gitId":"-"},"content":" if (!(other instanceof Address)) {","lastModifiedDate":"2023-07-13"},{"lineNumber":54,"author":{"gitId":"-"},"content":" return false;","lastModifiedDate":"2023-07-13"},{"lineNumber":55,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2023-07-13"},{"lineNumber":56,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2023-07-13"},{"lineNumber":57,"author":{"gitId":"-"},"content":" Address otherAddress \u003d (Address) other;","lastModifiedDate":"2023-07-13"},{"lineNumber":58,"author":{"gitId":"-"},"content":" return value.equals(otherAddress.value);","lastModifiedDate":"2023-07-13"},{"lineNumber":59,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2016-08-24"},{"lineNumber":60,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2016-08-24"},{"lineNumber":61,"author":{"gitId":"-"},"content":" @Override","lastModifiedDate":"2016-08-24"},{"lineNumber":62,"author":{"gitId":"-"},"content":" public int hashCode() {","lastModifiedDate":"2016-08-24"},{"lineNumber":63,"author":{"gitId":"-"},"content":" return value.hashCode();","lastModifiedDate":"2016-08-24"},{"lineNumber":64,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2016-08-24"},{"lineNumber":65,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2016-08-24"},{"lineNumber":66,"author":{"gitId":"-"},"content":"}","lastModifiedDate":"2016-08-24"}],"authorContributionMap":{"faaheem13":1,"AndrewOng2066":1,"-":64}},{"path":"src/main/java/seedu/address/model/person/Email.java","fileType":"functional-code","lines":[{"lineNumber":1,"author":{"gitId":"-"},"content":"package seedu.address.model.person;","lastModifiedDate":"2016-08-24"},{"lineNumber":2,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2016-08-24"},{"lineNumber":3,"author":{"gitId":"-"},"content":"import static java.util.Objects.requireNonNull;","lastModifiedDate":"2017-05-15"},{"lineNumber":4,"author":{"gitId":"-"},"content":"import static seedu.address.commons.util.AppUtil.checkArgument;","lastModifiedDate":"2017-05-30"},{"lineNumber":5,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2016-08-24"},{"lineNumber":6,"author":{"gitId":"-"},"content":"/**","lastModifiedDate":"2016-08-24"},{"lineNumber":7,"author":{"gitId":"taniatsq"},"content":" * Represents a Person\u0027s String email in the address book.","lastModifiedDate":"2024-03-08"},{"lineNumber":8,"author":{"gitId":"-"},"content":" * Guarantees: immutable; is valid as declared in {@link #isValidEmail(String)}","lastModifiedDate":"2016-08-24"},{"lineNumber":9,"author":{"gitId":"-"},"content":" */","lastModifiedDate":"2016-08-24"},{"lineNumber":10,"author":{"gitId":"-"},"content":"public class Email {","lastModifiedDate":"2016-09-21"},{"lineNumber":11,"author":{"gitId":"-"},"content":" private static final String SPECIAL_CHARACTERS \u003d \"+_.-\";","lastModifiedDate":"2021-07-20"},{"lineNumber":12,"author":{"gitId":"-"},"content":" public static final String MESSAGE_CONSTRAINTS \u003d \"Emails should be of the format local-part@domain \"","lastModifiedDate":"2018-09-22"},{"lineNumber":13,"author":{"gitId":"-"},"content":" + \"and adhere to the following constraints:\\n\"","lastModifiedDate":"2018-02-09"},{"lineNumber":14,"author":{"gitId":"-"},"content":" + \"1. The local-part should only contain alphanumeric characters and these special characters, excluding \"","lastModifiedDate":"2018-02-09"},{"lineNumber":15,"author":{"gitId":"-"},"content":" + \"the parentheses, (\" + SPECIAL_CHARACTERS + \"). The local-part may not start or end with any special \"","lastModifiedDate":"2021-07-20"},{"lineNumber":16,"author":{"gitId":"-"},"content":" + \"characters.\\n\"","lastModifiedDate":"2021-07-20"},{"lineNumber":17,"author":{"gitId":"-"},"content":" + \"2. This is followed by a \u0027@\u0027 and then a domain name. The domain name is made up of domain labels \"","lastModifiedDate":"2021-07-20"},{"lineNumber":18,"author":{"gitId":"-"},"content":" + \"separated by periods.\\n\"","lastModifiedDate":"2021-07-20"},{"lineNumber":19,"author":{"gitId":"-"},"content":" + \"The domain name must:\\n\"","lastModifiedDate":"2018-02-09"},{"lineNumber":20,"author":{"gitId":"-"},"content":" + \" - end with a domain label at least 2 characters long\\n\"","lastModifiedDate":"2021-07-20"},{"lineNumber":21,"author":{"gitId":"-"},"content":" + \" - have each domain label start and end with alphanumeric characters\\n\"","lastModifiedDate":"2021-07-20"},{"lineNumber":22,"author":{"gitId":"-"},"content":" + \" - have each domain label consist of alphanumeric characters, separated only by hyphens, if any.\";","lastModifiedDate":"2021-07-20"},{"lineNumber":23,"author":{"gitId":"-"},"content":" // alphanumeric and special characters","lastModifiedDate":"2018-02-09"},{"lineNumber":24,"author":{"gitId":"-"},"content":" private static final String ALPHANUMERIC_NO_UNDERSCORE \u003d \"[^\\\\W_]+\"; // alphanumeric characters except underscore","lastModifiedDate":"2021-07-20"},{"lineNumber":25,"author":{"gitId":"-"},"content":" private static final String LOCAL_PART_REGEX \u003d \"^\" + ALPHANUMERIC_NO_UNDERSCORE + \"([\" + SPECIAL_CHARACTERS + \"]\"","lastModifiedDate":"2021-07-20"},{"lineNumber":26,"author":{"gitId":"-"},"content":" + ALPHANUMERIC_NO_UNDERSCORE + \")*\";","lastModifiedDate":"2021-07-20"},{"lineNumber":27,"author":{"gitId":"-"},"content":" private static final String DOMAIN_PART_REGEX \u003d ALPHANUMERIC_NO_UNDERSCORE","lastModifiedDate":"2021-07-20"},{"lineNumber":28,"author":{"gitId":"-"},"content":" + \"(-\" + ALPHANUMERIC_NO_UNDERSCORE + \")*\";","lastModifiedDate":"2021-07-20"},{"lineNumber":29,"author":{"gitId":"-"},"content":" private static final String DOMAIN_LAST_PART_REGEX \u003d \"(\" + DOMAIN_PART_REGEX + \"){2,}$\"; // At least two chars","lastModifiedDate":"2021-07-20"},{"lineNumber":30,"author":{"gitId":"-"},"content":" private static final String DOMAIN_REGEX \u003d \"(\" + DOMAIN_PART_REGEX + \"\\\\.)*\" + DOMAIN_LAST_PART_REGEX;","lastModifiedDate":"2021-07-20"},{"lineNumber":31,"author":{"gitId":"-"},"content":" public static final String VALIDATION_REGEX \u003d LOCAL_PART_REGEX + \"@\" + DOMAIN_REGEX;","lastModifiedDate":"2021-07-20"},{"lineNumber":32,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2016-08-24"},{"lineNumber":33,"author":{"gitId":"-"},"content":" public final String value;","lastModifiedDate":"2016-08-24"},{"lineNumber":34,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2016-08-24"},{"lineNumber":35,"author":{"gitId":"-"},"content":" /**","lastModifiedDate":"2016-08-24"},{"lineNumber":36,"author":{"gitId":"-"},"content":" * Constructs an {@code Email}.","lastModifiedDate":"2017-05-30"},{"lineNumber":37,"author":{"gitId":"-"},"content":" *","lastModifiedDate":"2016-08-24"},{"lineNumber":38,"author":{"gitId":"-"},"content":" * @param email A valid email address.","lastModifiedDate":"2017-05-30"},{"lineNumber":39,"author":{"gitId":"-"},"content":" */","lastModifiedDate":"2016-08-24"},{"lineNumber":40,"author":{"gitId":"-"},"content":" public Email(String email) {","lastModifiedDate":"2017-05-30"},{"lineNumber":41,"author":{"gitId":"-"},"content":" requireNonNull(email);","lastModifiedDate":"2017-05-15"},{"lineNumber":42,"author":{"gitId":"-"},"content":" checkArgument(isValidEmail(email), MESSAGE_CONSTRAINTS);","lastModifiedDate":"2018-09-22"},{"lineNumber":43,"author":{"gitId":"-"},"content":" value \u003d email;","lastModifiedDate":"2018-08-14"},{"lineNumber":44,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2016-08-24"},{"lineNumber":45,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2016-08-24"},{"lineNumber":46,"author":{"gitId":"-"},"content":" /**","lastModifiedDate":"2016-08-24"},{"lineNumber":47,"author":{"gitId":"-"},"content":" * Returns if a given string is a valid email.","lastModifiedDate":"2018-04-05"},{"lineNumber":48,"author":{"gitId":"-"},"content":" */","lastModifiedDate":"2016-08-24"},{"lineNumber":49,"author":{"gitId":"-"},"content":" public static boolean isValidEmail(String test) {","lastModifiedDate":"2016-08-24"},{"lineNumber":50,"author":{"gitId":"-"},"content":" return test.matches(VALIDATION_REGEX);","lastModifiedDate":"2018-09-22"},{"lineNumber":51,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2016-08-24"},{"lineNumber":52,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2016-08-24"},{"lineNumber":53,"author":{"gitId":"-"},"content":" @Override","lastModifiedDate":"2016-08-24"},{"lineNumber":54,"author":{"gitId":"-"},"content":" public String toString() {","lastModifiedDate":"2016-08-24"},{"lineNumber":55,"author":{"gitId":"-"},"content":" return value;","lastModifiedDate":"2016-08-24"},{"lineNumber":56,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2016-08-24"},{"lineNumber":57,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2016-08-24"},{"lineNumber":58,"author":{"gitId":"-"},"content":" @Override","lastModifiedDate":"2016-08-24"},{"lineNumber":59,"author":{"gitId":"-"},"content":" public boolean equals(Object other) {","lastModifiedDate":"2016-08-24"},{"lineNumber":60,"author":{"gitId":"-"},"content":" if (other \u003d\u003d this) {","lastModifiedDate":"2023-07-13"},{"lineNumber":61,"author":{"gitId":"-"},"content":" return true;","lastModifiedDate":"2023-07-13"},{"lineNumber":62,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2023-07-13"},{"lineNumber":63,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2023-07-13"},{"lineNumber":64,"author":{"gitId":"-"},"content":" // instanceof handles nulls","lastModifiedDate":"2023-07-13"},{"lineNumber":65,"author":{"gitId":"-"},"content":" if (!(other instanceof Email)) {","lastModifiedDate":"2023-07-13"},{"lineNumber":66,"author":{"gitId":"-"},"content":" return false;","lastModifiedDate":"2023-07-13"},{"lineNumber":67,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2023-07-13"},{"lineNumber":68,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2023-07-13"},{"lineNumber":69,"author":{"gitId":"-"},"content":" Email otherEmail \u003d (Email) other;","lastModifiedDate":"2023-07-13"},{"lineNumber":70,"author":{"gitId":"-"},"content":" return value.equals(otherEmail.value);","lastModifiedDate":"2023-07-13"},{"lineNumber":71,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2016-08-24"},{"lineNumber":72,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2016-08-24"},{"lineNumber":73,"author":{"gitId":"-"},"content":" @Override","lastModifiedDate":"2016-08-24"},{"lineNumber":74,"author":{"gitId":"-"},"content":" public int hashCode() {","lastModifiedDate":"2016-08-24"},{"lineNumber":75,"author":{"gitId":"-"},"content":" return value.hashCode();","lastModifiedDate":"2016-08-24"},{"lineNumber":76,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2016-08-24"},{"lineNumber":77,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2016-08-24"},{"lineNumber":78,"author":{"gitId":"-"},"content":"}","lastModifiedDate":"2016-08-24"}],"authorContributionMap":{"taniatsq":1,"-":77}}] diff --git a/AY2324S2-CS2103T-T13-1_tp_master/commits.json b/AY2324S2-CS2103T-T13-1_tp_master/commits.json index 17493036..7cef4959 100644 --- a/AY2324S2-CS2103T-T13-1_tp_master/commits.json +++ b/AY2324S2-CS2103T-T13-1_tp_master/commits.json @@ -1 +1 @@ -{"authorDailyContributionsMap":{"faaheem13":[{"date":"2024-03-08","commitResults":[{"hash":"b18669c880d7ec8ae3a4266941a823646b48ba82","isMergeCommit":false,"messageTitle":"Update Address.java","messageBody":"","fileTypesAndContributionMap":{"functional-code":{"insertions":1,"deletions":1}}},{"hash":"6cce848ca557f8bc7471e3825a408877401e17e0","isMergeCommit":true,"messageTitle":"Merge pull request #25 from faaheem13/v1.1-PRs","messageBody":"Update Address.java","fileTypesAndContributionMap":{}}]}],"AndrewOng2066":[{"date":"2024-02-25","commitResults":[{"hash":"ddc88a712a1113d279e070f4a01edac7bad75796","isMergeCommit":true,"messageTitle":"Merge pull request #1 from AY2324S2-CS2103T-T13-1/switch-docs-to-markbind","messageBody":"Switch docs to markbind","fileTypesAndContributionMap":{}},{"hash":"d78dc7c9532f66fa1c89d168b2db3b8c1fc17acf","isMergeCommit":false,"messageTitle":"Update default.md","messageBody":"","fileTypesAndContributionMap":{"docs":{"insertions":1,"deletions":1}}}]},{"date":"2024-03-08","commitResults":[{"hash":"9b6c816163846ba5864a9d7d34cf0879e450b636","isMergeCommit":false,"messageTitle":"Update Address.java","messageBody":"","fileTypesAndContributionMap":{"functional-code":{"insertions":1,"deletions":0}}},{"hash":"6ce36342920b1d7193c40af1c2ab98b206de13a8","isMergeCommit":true,"messageTitle":"Merge pull request #24 from AndrewOng2066/V1.1-PR","messageBody":"Update Address.java","fileTypesAndContributionMap":{}}]}],"taniatsq":[{"date":"2024-03-08","commitResults":[{"hash":"481832ffeda7f4b5b180f789b3fdc88a9217ca76","isMergeCommit":false,"messageTitle":"Update Email.java","messageBody":"","fileTypesAndContributionMap":{"functional-code":{"insertions":1,"deletions":1}}},{"hash":"73a756db6bdd9f9efe8aedbe759c484643f8f0aa","isMergeCommit":true,"messageTitle":"Merge pull request #26 from taniatsq/v1.1-PRs","messageBody":"Revert Email.java","fileTypesAndContributionMap":{}}]}],"nichee":[{"date":"2024-03-08","commitResults":[{"hash":"ae23d98f47d025b2387d91ad60502c51465eeecb","isMergeCommit":false,"messageTitle":"Update Email.java","messageBody":"","fileTypesAndContributionMap":{"functional-code":{"insertions":0,"deletions":1}}},{"hash":"e5d710e33355c6f66f15c42570d822b41eb359f0","isMergeCommit":true,"messageTitle":"Merge pull request #28 from nichee/v1.1-PRs","messageBody":"Update Email.java","fileTypesAndContributionMap":{}}]}]},"authorFileTypeContributionMap":{"faaheem13":{"docs":0,"functional-code":1,"test-code":0},"AndrewOng2066":{"docs":1,"functional-code":1,"test-code":0},"taniatsq":{"docs":0,"functional-code":1,"test-code":0},"nichee":{"docs":0,"functional-code":0,"test-code":0}},"authorContributionVariance":{"faaheem13":0.2488889,"AndrewOng2066":0.29333332,"taniatsq":0.2488889,"nichee":0.062222224},"authorDisplayNameMap":{"faaheem13":"CS2103T-T13-1 RAHM..HAAM","AndrewOng2066":"CS2103T-T13-1 ANDR..WOON","taniatsq":"CS2103T-T13-1 TANI..U QI","nichee":"CS2103T-T13-1 NICH.. YAO"}} +{"authorDailyContributionsMap":{"faaheem13":[{"date":"2024-03-08","commitResults":[{"hash":"b18669c880d7ec8ae3a4266941a823646b48ba82","isMergeCommit":false,"messageTitle":"Update Address.java","messageBody":"","fileTypesAndContributionMap":{"functional-code":{"insertions":1,"deletions":1}}},{"hash":"6cce848ca557f8bc7471e3825a408877401e17e0","isMergeCommit":true,"messageTitle":"Merge pull request #25 from faaheem13/v1.1-PRs","messageBody":"Update Address.java","fileTypesAndContributionMap":{}},{"hash":"bdf54b566f8f6dc202a149d8f94d86b4b39da13e","isMergeCommit":false,"messageTitle":"Update AboutUs.md","messageBody":"Add Faaheem picture, github link (Responsibilities, portfolio to be updated later)","fileTypesAndContributionMap":{"docs":{"insertions":4,"deletions":4}}}]}],"AndrewOng2066":[{"date":"2024-02-25","commitResults":[{"hash":"ddc88a712a1113d279e070f4a01edac7bad75796","isMergeCommit":true,"messageTitle":"Merge pull request #1 from AY2324S2-CS2103T-T13-1/switch-docs-to-markbind","messageBody":"Switch docs to markbind","fileTypesAndContributionMap":{}},{"hash":"d78dc7c9532f66fa1c89d168b2db3b8c1fc17acf","isMergeCommit":false,"messageTitle":"Update default.md","messageBody":"","fileTypesAndContributionMap":{"docs":{"insertions":1,"deletions":1}}}]},{"date":"2024-03-08","commitResults":[{"hash":"9b6c816163846ba5864a9d7d34cf0879e450b636","isMergeCommit":false,"messageTitle":"Update Address.java","messageBody":"","fileTypesAndContributionMap":{"functional-code":{"insertions":1,"deletions":0}}},{"hash":"6ce36342920b1d7193c40af1c2ab98b206de13a8","isMergeCommit":true,"messageTitle":"Merge pull request #24 from AndrewOng2066/V1.1-PR","messageBody":"Update Address.java","fileTypesAndContributionMap":{}}]}],"taniatsq":[{"date":"2024-03-08","commitResults":[{"hash":"481832ffeda7f4b5b180f789b3fdc88a9217ca76","isMergeCommit":false,"messageTitle":"Update Email.java","messageBody":"","fileTypesAndContributionMap":{"functional-code":{"insertions":1,"deletions":1}}},{"hash":"73a756db6bdd9f9efe8aedbe759c484643f8f0aa","isMergeCommit":true,"messageTitle":"Merge pull request #26 from taniatsq/v1.1-PRs","messageBody":"Revert Email.java","fileTypesAndContributionMap":{}}]}],"nichee":[{"date":"2024-03-08","commitResults":[{"hash":"ae23d98f47d025b2387d91ad60502c51465eeecb","isMergeCommit":false,"messageTitle":"Update Email.java","messageBody":"","fileTypesAndContributionMap":{"functional-code":{"insertions":0,"deletions":1}}},{"hash":"e5d710e33355c6f66f15c42570d822b41eb359f0","isMergeCommit":true,"messageTitle":"Merge pull request #28 from nichee/v1.1-PRs","messageBody":"Update Email.java","fileTypesAndContributionMap":{}}]}]},"authorFileTypeContributionMap":{"faaheem13":{"docs":4,"functional-code":1,"test-code":0},"AndrewOng2066":{"docs":1,"functional-code":1,"test-code":0},"taniatsq":{"docs":0,"functional-code":1,"test-code":0},"nichee":{"docs":0,"functional-code":0,"test-code":0}},"authorContributionVariance":{"faaheem13":6.222222,"AndrewOng2066":0.29333332,"taniatsq":0.2488889,"nichee":0.062222224},"authorDisplayNameMap":{"faaheem13":"CS2103T-T13-1 RAHM..HAAM","AndrewOng2066":"CS2103T-T13-1 ANDR..WOON","taniatsq":"CS2103T-T13-1 TANI..U QI","nichee":"CS2103T-T13-1 NICH.. YAO"}} diff --git a/AY2324S2-CS2103T-T17-2_tp_master/authorship.json b/AY2324S2-CS2103T-T17-2_tp_master/authorship.json index 3fc9d646..5041c9b8 100644 --- a/AY2324S2-CS2103T-T17-2_tp_master/authorship.json +++ b/AY2324S2-CS2103T-T17-2_tp_master/authorship.json @@ -1 +1 @@ -[{"path":"README.md","fileType":"docs","lines":[{"lineNumber":1,"author":{"gitId":"PyromancerBoom"},"content":"[![Java CI](https://github.com/AY2324S2-CS2103T-T17-2/tp/actions/workflows/gradle.yml/badge.svg?branch\u003dmaster)](https://github.com/AY2324S2-CS2103T-T17-2/tp/actions/workflows/gradle.yml)","lastModifiedDate":"2024-03-07"},{"lineNumber":2,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":3,"author":{"gitId":"-"},"content":"![Ui](docs/images/Ui.png)","lastModifiedDate":"2020-05-23"},{"lineNumber":4,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":5,"author":{"gitId":"PyromancerBoom"},"content":"## ContactSwift","lastModifiedDate":"2024-03-07"},{"lineNumber":6,"author":{"gitId":"PyromancerBoom"},"content":"","lastModifiedDate":"2024-03-07"},{"lineNumber":7,"author":{"gitId":"PyromancerBoom"},"content":"ContactSwift is an efficient and intuitive contact management software designed for small-scale business owners like John Doe, founder and CEO of DoeInnovationsTech. With ContactSwift, users can:","lastModifiedDate":"2024-03-07"},{"lineNumber":8,"author":{"gitId":"PyromancerBoom"},"content":"","lastModifiedDate":"2024-03-07"},{"lineNumber":9,"author":{"gitId":"PyromancerBoom"},"content":"- Effortlessly manage their employees\u0027 contact details","lastModifiedDate":"2024-03-07"},{"lineNumber":10,"author":{"gitId":"PyromancerBoom"},"content":"- Streamline communication","lastModifiedDate":"2024-03-07"},{"lineNumber":11,"author":{"gitId":"PyromancerBoom"},"content":"- Maintain an organized address book","lastModifiedDate":"2024-03-07"},{"lineNumber":12,"author":{"gitId":"PyromancerBoom"},"content":"- Enjoy lightning-fast speed and cross-platform compatibility","lastModifiedDate":"2024-03-07"},{"lineNumber":13,"author":{"gitId":"PyromancerBoom"},"content":"","lastModifiedDate":"2024-03-07"},{"lineNumber":14,"author":{"gitId":"PyromancerBoom"},"content":"### Installation","lastModifiedDate":"2024-03-07"},{"lineNumber":15,"author":{"gitId":"PyromancerBoom"},"content":"","lastModifiedDate":"2024-03-07"},{"lineNumber":16,"author":{"gitId":"PyromancerBoom"},"content":"- ContactSwift will be available soon for download at [ContactSwift](https://ay2324s2-cs2103t-t17-2.github.io/tp/).","lastModifiedDate":"2024-03-07"},{"lineNumber":17,"author":{"gitId":"PyromancerBoom"},"content":"- Run the JAR file on any compatible operating system by double-clicking it or using the command line: `java -jar ContactSwift.jar`","lastModifiedDate":"2024-03-07"},{"lineNumber":18,"author":{"gitId":"PyromancerBoom"},"content":"","lastModifiedDate":"2024-03-07"},{"lineNumber":19,"author":{"gitId":"PyromancerBoom"},"content":"### Features","lastModifiedDate":"2024-03-07"},{"lineNumber":20,"author":{"gitId":"PyromancerBoom"},"content":"","lastModifiedDate":"2024-03-07"},{"lineNumber":21,"author":{"gitId":"PyromancerBoom"},"content":"1. **Quick Contact Addition**: Quickly add new contacts with a unique ID for easy reference.","lastModifiedDate":"2024-03-07"},{"lineNumber":22,"author":{"gitId":"PyromancerBoom"},"content":"","lastModifiedDate":"2024-03-07"},{"lineNumber":23,"author":{"gitId":"PyromancerBoom"},"content":"Command format: `add contact /name John Doe /email john@example.com /number 1234567890`","lastModifiedDate":"2024-03-07"},{"lineNumber":24,"author":{"gitId":"PyromancerBoom"},"content":"","lastModifiedDate":"2024-03-07"},{"lineNumber":25,"author":{"gitId":"PyromancerBoom"},"content":"2. **Contact Deletion**: Easily delete unnecessary contacts to keep your address book organized.","lastModifiedDate":"2024-03-07"},{"lineNumber":26,"author":{"gitId":"PyromancerBoom"},"content":" Command format: `delete contact /id \u003ccontact_id\u003e`","lastModifiedDate":"2024-03-07"},{"lineNumber":27,"author":{"gitId":"PyromancerBoom"},"content":"","lastModifiedDate":"2024-03-07"},{"lineNumber":28,"author":{"gitId":"PyromancerBoom"},"content":"3. **Contact Information Storage**: Store detailed information about your contacts securely for easy reference. Information is stored locally to ensure privacy and security.","lastModifiedDate":"2024-03-07"},{"lineNumber":29,"author":{"gitId":"PyromancerBoom"},"content":"","lastModifiedDate":"2024-03-07"},{"lineNumber":30,"author":{"gitId":"PyromancerBoom"},"content":"4. **All Contacts List Display**: View a complete list of all your contacts in a user-friendly format.","lastModifiedDate":"2024-03-07"},{"lineNumber":31,"author":{"gitId":"PyromancerBoom"},"content":" Command format: `list all`","lastModifiedDate":"2024-03-07"},{"lineNumber":32,"author":{"gitId":"PyromancerBoom"},"content":"","lastModifiedDate":"2024-03-07"},{"lineNumber":33,"author":{"gitId":"PyromancerBoom"},"content":"---","lastModifiedDate":"2024-03-07"},{"lineNumber":34,"author":{"gitId":"PyromancerBoom"},"content":"","lastModifiedDate":"2024-03-07"},{"lineNumber":35,"author":{"gitId":"PyromancerBoom"},"content":"## Acknowledgements","lastModifiedDate":"2024-03-07"},{"lineNumber":36,"author":{"gitId":"PyromancerBoom"},"content":"","lastModifiedDate":"2024-03-07"},{"lineNumber":37,"author":{"gitId":"PyromancerBoom"},"content":"This project is based on the AddressBook-Level3 project created by the [SE-EDU initiative](https://se-education.org).","lastModifiedDate":"2024-03-07"}],"authorContributionMap":{"PyromancerBoom":34,"-":3}},{"path":"docs/AboutUs.md","fileType":"docs","lines":[{"lineNumber":1,"author":{"gitId":"-"},"content":"---","lastModifiedDate":"2020-05-23"},{"lineNumber":2,"author":{"gitId":"-"},"content":" layout: default.md","lastModifiedDate":"2023-09-12"},{"lineNumber":3,"author":{"gitId":"-"},"content":" title: \"About Us\"","lastModifiedDate":"2023-09-12"},{"lineNumber":4,"author":{"gitId":"-"},"content":"---","lastModifiedDate":"2020-05-23"},{"lineNumber":5,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":6,"author":{"gitId":"-"},"content":"# About Us","lastModifiedDate":"2023-09-12"},{"lineNumber":7,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2023-09-12"},{"lineNumber":8,"author":{"gitId":"-"},"content":"We are a team based in the [School of Computing, National University of Singapore](http://www.comp.nus.edu.sg).","lastModifiedDate":"2020-05-23"},{"lineNumber":9,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":10,"author":{"gitId":"-"},"content":"You can reach us at the email `seer[at]comp.nus.edu.sg`","lastModifiedDate":"2020-06-17"},{"lineNumber":11,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-06-17"},{"lineNumber":12,"author":{"gitId":"-"},"content":"## Project team","lastModifiedDate":"2020-06-07"},{"lineNumber":13,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":14,"author":{"gitId":"PyromancerBoom"},"content":"### Jay Hong","lastModifiedDate":"2024-03-07"},{"lineNumber":15,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":16,"author":{"gitId":"hjungwoo01"},"content":"\u003cimg src\u003d\"images/hjungwoo01.png\" width\u003d\"200px\"\u003e","lastModifiedDate":"2024-03-07"},{"lineNumber":17,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":18,"author":{"gitId":"hjungwoo01"},"content":"[[github](https://github.com/hjungwoo01)] [[portfolio](team/hjungwoo01.md)]","lastModifiedDate":"2024-03-07"},{"lineNumber":19,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":20,"author":{"gitId":"hjungwoo01"},"content":"- Role: Developer","lastModifiedDate":"2024-03-07"},{"lineNumber":21,"author":{"gitId":"hjungwoo01"},"content":"- Responsibilities: Team lead, Integration, Deliverables and deadlines","lastModifiedDate":"2024-03-07"},{"lineNumber":22,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":23,"author":{"gitId":"PyromancerBoom"},"content":"### Priyansh Bimbisariye","lastModifiedDate":"2024-03-07"},{"lineNumber":24,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":25,"author":{"gitId":"PyromancerBoom"},"content":"\u003cimg src\u003d\"images/priyanshbimbisariye.png\" width\u003d\"200px\"\u003e","lastModifiedDate":"2024-03-07"},{"lineNumber":26,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":27,"author":{"gitId":"PyromancerBoom"},"content":"[[github](https://github.com/PyromancerBoom)] [[portfolio](team/priyanshbimbisariye.md)]","lastModifiedDate":"2024-03-07"},{"lineNumber":28,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":29,"author":{"gitId":"PyromancerBoom"},"content":"- Role: Developer","lastModifiedDate":"2024-03-07"},{"lineNumber":30,"author":{"gitId":"PyromancerBoom"},"content":"- Responsibilities: Scheduling and Tracking, Deliverables and deadlines","lastModifiedDate":"2024-03-07"},{"lineNumber":31,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":32,"author":{"gitId":"quelinxiao"},"content":"### Shayaan Sultan","lastModifiedDate":"2024-03-07"},{"lineNumber":33,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":34,"author":{"gitId":"quelinxiao"},"content":"\u003cimg src\u003d\"images/shayaansultan.png\" width\u003d\"200px\"\u003e","lastModifiedDate":"2024-03-07"},{"lineNumber":35,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":36,"author":{"gitId":"quelinxiao"},"content":"[[github](http://github.com/shayaansultan)] [[portfolio](team/shayaansultan.md)]","lastModifiedDate":"2024-03-07"},{"lineNumber":37,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":38,"author":{"gitId":"PyromancerBoom"},"content":"- Role: Developer","lastModifiedDate":"2024-03-07"},{"lineNumber":39,"author":{"gitId":"PyromancerBoom"},"content":"- Responsibilities: Documentation, Deliverables and deadlines","lastModifiedDate":"2024-03-07"},{"lineNumber":40,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":41,"author":{"gitId":"quelinxiao"},"content":"### Que Linxiao","lastModifiedDate":"2024-03-07"},{"lineNumber":42,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":43,"author":{"gitId":"quelinxiao"},"content":"\u003cimg src\u003d\"images/quelinxiao.png\" width\u003d\"200px\"\u003e","lastModifiedDate":"2024-03-07"},{"lineNumber":44,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":45,"author":{"gitId":"quelinxiao"},"content":"[[github](http://github.com/quelinxiao)] [[portfolio](team/quelinxiao.md)]","lastModifiedDate":"2024-03-07"},{"lineNumber":46,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":47,"author":{"gitId":"hjungwoo01"},"content":"- Role: Developer","lastModifiedDate":"2024-03-07"},{"lineNumber":48,"author":{"gitId":"hjungwoo01"},"content":"- Responsibilities: Testing, Deliverables and deadlines","lastModifiedDate":"2024-03-07"},{"lineNumber":49,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2024-03-07"}],"authorContributionMap":{"PyromancerBoom":8,"quelinxiao":6,"hjungwoo01":6,"-":29}},{"path":"docs/DeveloperGuide.md","fileType":"docs","lines":[{"lineNumber":1,"author":{"gitId":"-"},"content":"---","lastModifiedDate":"2020-05-23"},{"lineNumber":2,"author":{"gitId":"-"},"content":" layout: default.md","lastModifiedDate":"2023-09-12"},{"lineNumber":3,"author":{"gitId":"-"},"content":" title: \"Developer Guide\"","lastModifiedDate":"2023-09-12"},{"lineNumber":4,"author":{"gitId":"-"},"content":" pageNav: 3","lastModifiedDate":"2023-09-12"},{"lineNumber":5,"author":{"gitId":"-"},"content":"---","lastModifiedDate":"2020-05-23"},{"lineNumber":6,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2023-09-12"},{"lineNumber":7,"author":{"gitId":"-"},"content":"# AB-3 Developer Guide","lastModifiedDate":"2023-09-12"},{"lineNumber":8,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2023-09-12"},{"lineNumber":9,"author":{"gitId":"-"},"content":"\u003c!-- * Table of Contents --\u003e","lastModifiedDate":"2023-09-12"},{"lineNumber":10,"author":{"gitId":"-"},"content":"\u003cpage-nav-print /\u003e","lastModifiedDate":"2023-09-12"},{"lineNumber":11,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":12,"author":{"gitId":"PyromancerBoom"},"content":"---","lastModifiedDate":"2024-03-07"},{"lineNumber":13,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2021-07-30"},{"lineNumber":14,"author":{"gitId":"-"},"content":"## **Acknowledgements**","lastModifiedDate":"2021-07-30"},{"lineNumber":15,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2021-07-30"},{"lineNumber":16,"author":{"gitId":"-"},"content":"_{ list here sources of all reused/adapted ideas, code, documentation, and third-party libraries -- include links to the original source as well }_","lastModifiedDate":"2023-09-12"},{"lineNumber":17,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2021-07-30"},{"lineNumber":18,"author":{"gitId":"PyromancerBoom"},"content":"---","lastModifiedDate":"2024-03-07"},{"lineNumber":19,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":20,"author":{"gitId":"-"},"content":"## **Setting up, getting started**","lastModifiedDate":"2020-05-23"},{"lineNumber":21,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":22,"author":{"gitId":"-"},"content":"Refer to the guide [_Setting up and getting started_](SettingUp.md).","lastModifiedDate":"2020-05-23"},{"lineNumber":23,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":24,"author":{"gitId":"PyromancerBoom"},"content":"---","lastModifiedDate":"2024-03-07"},{"lineNumber":25,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":26,"author":{"gitId":"-"},"content":"## **Design**","lastModifiedDate":"2020-05-23"},{"lineNumber":27,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":28,"author":{"gitId":"-"},"content":"### Architecture","lastModifiedDate":"2021-07-31"},{"lineNumber":29,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":30,"author":{"gitId":"-"},"content":"\u003cpuml src\u003d\"diagrams/ArchitectureDiagram.puml\" width\u003d\"280\" /\u003e","lastModifiedDate":"2023-09-12"},{"lineNumber":31,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":32,"author":{"gitId":"PyromancerBoom"},"content":"The **_Architecture Diagram_** given above explains the high-level design of the App.","lastModifiedDate":"2024-03-07"},{"lineNumber":33,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":34,"author":{"gitId":"-"},"content":"Given below is a quick overview of main components and how they interact with each other.","lastModifiedDate":"2021-07-31"},{"lineNumber":35,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2021-07-31"},{"lineNumber":36,"author":{"gitId":"-"},"content":"**Main components of the architecture**","lastModifiedDate":"2021-07-31"},{"lineNumber":37,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":38,"author":{"gitId":"-"},"content":"**`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.","lastModifiedDate":"2023-09-03"},{"lineNumber":39,"author":{"gitId":"PyromancerBoom"},"content":"","lastModifiedDate":"2024-03-07"},{"lineNumber":40,"author":{"gitId":"PyromancerBoom"},"content":"- At app launch, it initializes the other components in the correct sequence, and connects them up with each other.","lastModifiedDate":"2024-03-07"},{"lineNumber":41,"author":{"gitId":"PyromancerBoom"},"content":"- At shut down, it shuts down the other components and invokes cleanup methods where necessary.","lastModifiedDate":"2024-03-07"},{"lineNumber":42,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":43,"author":{"gitId":"-"},"content":"The bulk of the app\u0027s work is done by the following four components:","lastModifiedDate":"2023-09-03"},{"lineNumber":44,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":45,"author":{"gitId":"PyromancerBoom"},"content":"- [**`UI`**](#ui-component): The UI of the App.","lastModifiedDate":"2024-03-07"},{"lineNumber":46,"author":{"gitId":"PyromancerBoom"},"content":"- [**`Logic`**](#logic-component): The command executor.","lastModifiedDate":"2024-03-07"},{"lineNumber":47,"author":{"gitId":"PyromancerBoom"},"content":"- [**`Model`**](#model-component): Holds the data of the App in memory.","lastModifiedDate":"2024-03-07"},{"lineNumber":48,"author":{"gitId":"PyromancerBoom"},"content":"- [**`Storage`**](#storage-component): Reads data from, and writes data to, the hard disk.","lastModifiedDate":"2024-03-07"},{"lineNumber":49,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":50,"author":{"gitId":"-"},"content":"[**`Commons`**](#common-classes) represents a collection of classes used by multiple other components.","lastModifiedDate":"2023-09-03"},{"lineNumber":51,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":52,"author":{"gitId":"-"},"content":"**How the architecture components interact with each other**","lastModifiedDate":"2020-05-23"},{"lineNumber":53,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":54,"author":{"gitId":"PyromancerBoom"},"content":"The _Sequence Diagram_ below shows how the components interact with each other for the scenario where the user issues the command `delete 1`.","lastModifiedDate":"2024-03-07"},{"lineNumber":55,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":56,"author":{"gitId":"-"},"content":"\u003cpuml src\u003d\"diagrams/ArchitectureSequenceDiagram.puml\" width\u003d\"574\" /\u003e","lastModifiedDate":"2023-09-12"},{"lineNumber":57,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":58,"author":{"gitId":"-"},"content":"Each of the four main components (also shown in the diagram above),","lastModifiedDate":"2021-07-31"},{"lineNumber":59,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2021-07-31"},{"lineNumber":60,"author":{"gitId":"PyromancerBoom"},"content":"- defines its _API_ in an `interface` with the same name as the Component.","lastModifiedDate":"2024-03-07"},{"lineNumber":61,"author":{"gitId":"PyromancerBoom"},"content":"- implements its functionality using a concrete `{Component Name}Manager` class (which follows the corresponding API `interface` mentioned in the previous point.","lastModifiedDate":"2024-03-07"},{"lineNumber":62,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2021-07-31"},{"lineNumber":63,"author":{"gitId":"-"},"content":"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\u0027s being coupled to the implementation of a component), as illustrated in the (partial) class diagram below.","lastModifiedDate":"2021-07-31"},{"lineNumber":64,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2021-07-31"},{"lineNumber":65,"author":{"gitId":"-"},"content":"\u003cpuml src\u003d\"diagrams/ComponentManagers.puml\" width\u003d\"300\" /\u003e","lastModifiedDate":"2023-09-12"},{"lineNumber":66,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2021-07-31"},{"lineNumber":67,"author":{"gitId":"-"},"content":"The sections below give more details of each component.","lastModifiedDate":"2020-05-23"},{"lineNumber":68,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":69,"author":{"gitId":"-"},"content":"### UI component","lastModifiedDate":"2020-05-23"},{"lineNumber":70,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":71,"author":{"gitId":"-"},"content":"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)","lastModifiedDate":"2021-07-31"},{"lineNumber":72,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":73,"author":{"gitId":"-"},"content":"\u003cpuml src\u003d\"diagrams/UiClassDiagram.puml\" alt\u003d\"Structure of the UI Component\"/\u003e","lastModifiedDate":"2023-09-12"},{"lineNumber":74,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":75,"author":{"gitId":"-"},"content":"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.","lastModifiedDate":"2021-07-31"},{"lineNumber":76,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":77,"author":{"gitId":"-"},"content":"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)","lastModifiedDate":"2021-07-31"},{"lineNumber":78,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":79,"author":{"gitId":"-"},"content":"The `UI` component,","lastModifiedDate":"2020-05-23"},{"lineNumber":80,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":81,"author":{"gitId":"PyromancerBoom"},"content":"- executes user commands using the `Logic` component.","lastModifiedDate":"2024-03-07"},{"lineNumber":82,"author":{"gitId":"PyromancerBoom"},"content":"- listens for changes to `Model` data so that the UI can be updated with the modified data.","lastModifiedDate":"2024-03-07"},{"lineNumber":83,"author":{"gitId":"PyromancerBoom"},"content":"- keeps a reference to the `Logic` component, because the `UI` relies on the `Logic` to execute commands.","lastModifiedDate":"2024-03-07"},{"lineNumber":84,"author":{"gitId":"PyromancerBoom"},"content":"- depends on some classes in the `Model` component, as it displays `Person` object residing in the `Model`.","lastModifiedDate":"2024-03-07"},{"lineNumber":85,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":86,"author":{"gitId":"-"},"content":"### Logic component","lastModifiedDate":"2020-05-23"},{"lineNumber":87,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":88,"author":{"gitId":"-"},"content":"**API** : [`Logic.java`](https://github.com/se-edu/addressbook-level3/tree/master/src/main/java/seedu/address/logic/Logic.java)","lastModifiedDate":"2021-07-31"},{"lineNumber":89,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":90,"author":{"gitId":"-"},"content":"Here\u0027s a (partial) class diagram of the `Logic` component:","lastModifiedDate":"2021-07-31"},{"lineNumber":91,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":92,"author":{"gitId":"-"},"content":"\u003cpuml src\u003d\"diagrams/LogicClassDiagram.puml\" width\u003d\"550\"/\u003e","lastModifiedDate":"2023-09-12"},{"lineNumber":93,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":94,"author":{"gitId":"-"},"content":"The sequence diagram below illustrates the interactions within the `Logic` component, taking `execute(\"delete 1\")` API call as an example.","lastModifiedDate":"2023-09-03"},{"lineNumber":95,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":96,"author":{"gitId":"-"},"content":"\u003cpuml src\u003d\"diagrams/DeleteSequenceDiagram.puml\" alt\u003d\"Interactions Inside the Logic Component for the `delete 1` Command\" /\u003e","lastModifiedDate":"2023-09-12"},{"lineNumber":97,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2023-09-12"},{"lineNumber":98,"author":{"gitId":"-"},"content":"\u003cbox type\u003d\"info\" seamless\u003e","lastModifiedDate":"2023-09-12"},{"lineNumber":99,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":100,"author":{"gitId":"-"},"content":"**Note:** The lifeline for `DeleteCommandParser` should end at the destroy marker (X) but due to a limitation of PlantUML, the lifeline continues till the end of diagram.","lastModifiedDate":"2023-09-12"},{"lineNumber":101,"author":{"gitId":"-"},"content":"\u003c/box\u003e","lastModifiedDate":"2023-09-12"},{"lineNumber":102,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":103,"author":{"gitId":"-"},"content":"How the `Logic` component works:","lastModifiedDate":"2023-09-03"},{"lineNumber":104,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2023-09-03"},{"lineNumber":105,"author":{"gitId":"-"},"content":"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.","lastModifiedDate":"2023-09-03"},{"lineNumber":106,"author":{"gitId":"-"},"content":"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`.","lastModifiedDate":"2023-09-03"},{"lineNumber":107,"author":{"gitId":"-"},"content":"1. The command can communicate with the `Model` when it is executed (e.g. to delete a person).\u003cbr\u003e","lastModifiedDate":"2024-02-09"},{"lineNumber":108,"author":{"gitId":"-"},"content":" Note that although this is shown as a single step in the diagram above (for simplicity), in the code it can take several interactions (between the command object and the `Model`) to achieve.","lastModifiedDate":"2024-02-09"},{"lineNumber":109,"author":{"gitId":"-"},"content":"1. The result of the command execution is encapsulated as a `CommandResult` object which is returned back from `Logic`.","lastModifiedDate":"2023-09-03"},{"lineNumber":110,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2023-09-03"},{"lineNumber":111,"author":{"gitId":"-"},"content":"Here are the other classes in `Logic` (omitted from the class diagram above) that are used for parsing a user command:","lastModifiedDate":"2021-07-31"},{"lineNumber":112,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2021-07-31"},{"lineNumber":113,"author":{"gitId":"-"},"content":"\u003cpuml src\u003d\"diagrams/ParserClasses.puml\" width\u003d\"600\"/\u003e","lastModifiedDate":"2023-09-12"},{"lineNumber":114,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":115,"author":{"gitId":"-"},"content":"How the parsing works:","lastModifiedDate":"2021-07-31"},{"lineNumber":116,"author":{"gitId":"PyromancerBoom"},"content":"","lastModifiedDate":"2024-03-07"},{"lineNumber":117,"author":{"gitId":"PyromancerBoom"},"content":"- 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.","lastModifiedDate":"2024-03-07"},{"lineNumber":118,"author":{"gitId":"PyromancerBoom"},"content":"- 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.","lastModifiedDate":"2024-03-07"},{"lineNumber":119,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":120,"author":{"gitId":"-"},"content":"### Model component","lastModifiedDate":"2021-07-31"},{"lineNumber":121,"author":{"gitId":"PyromancerBoom"},"content":"","lastModifiedDate":"2024-03-07"},{"lineNumber":122,"author":{"gitId":"-"},"content":"**API** : [`Model.java`](https://github.com/se-edu/addressbook-level3/tree/master/src/main/java/seedu/address/model/Model.java)","lastModifiedDate":"2020-05-23"},{"lineNumber":123,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":124,"author":{"gitId":"-"},"content":"\u003cpuml src\u003d\"diagrams/ModelClassDiagram.puml\" width\u003d\"450\" /\u003e","lastModifiedDate":"2023-09-12"},{"lineNumber":125,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":126,"author":{"gitId":"-"},"content":"The `Model` component,","lastModifiedDate":"2021-07-31"},{"lineNumber":127,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":128,"author":{"gitId":"PyromancerBoom"},"content":"- stores the address book data i.e., all `Person` objects (which are contained in a `UniquePersonList` object).","lastModifiedDate":"2024-03-07"},{"lineNumber":129,"author":{"gitId":"PyromancerBoom"},"content":"- stores the currently \u0027selected\u0027 `Person` objects (e.g., results of a search query) as a separate _filtered_ list which is exposed to outsiders as an unmodifiable `ObservableList\u003cPerson\u003e` that can be \u0027observed\u0027 e.g. the UI can be bound to this list so that the UI automatically updates when the data in the list change.","lastModifiedDate":"2024-03-07"},{"lineNumber":130,"author":{"gitId":"PyromancerBoom"},"content":"- stores a `UserPref` object that represents the user’s preferences. This is exposed to the outside as a `ReadOnlyUserPref` objects.","lastModifiedDate":"2024-03-07"},{"lineNumber":131,"author":{"gitId":"PyromancerBoom"},"content":"- 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)","lastModifiedDate":"2024-03-07"},{"lineNumber":132,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2021-07-31"},{"lineNumber":133,"author":{"gitId":"-"},"content":"\u003cbox type\u003d\"info\" seamless\u003e","lastModifiedDate":"2023-09-12"},{"lineNumber":134,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2023-09-12"},{"lineNumber":135,"author":{"gitId":"-"},"content":"**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.\u003cbr\u003e","lastModifiedDate":"2023-09-12"},{"lineNumber":136,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2021-07-31"},{"lineNumber":137,"author":{"gitId":"-"},"content":"\u003cpuml src\u003d\"diagrams/BetterModelClassDiagram.puml\" width\u003d\"450\" /\u003e","lastModifiedDate":"2023-09-12"},{"lineNumber":138,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":139,"author":{"gitId":"-"},"content":"\u003c/box\u003e","lastModifiedDate":"2023-09-12"},{"lineNumber":140,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":141,"author":{"gitId":"-"},"content":"### Storage component","lastModifiedDate":"2020-05-23"},{"lineNumber":142,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":143,"author":{"gitId":"-"},"content":"**API** : [`Storage.java`](https://github.com/se-edu/addressbook-level3/tree/master/src/main/java/seedu/address/storage/Storage.java)","lastModifiedDate":"2020-05-23"},{"lineNumber":144,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":145,"author":{"gitId":"-"},"content":"\u003cpuml src\u003d\"diagrams/StorageClassDiagram.puml\" width\u003d\"550\" /\u003e","lastModifiedDate":"2023-09-12"},{"lineNumber":146,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2021-07-31"},{"lineNumber":147,"author":{"gitId":"-"},"content":"The `Storage` component,","lastModifiedDate":"2020-05-23"},{"lineNumber":148,"author":{"gitId":"PyromancerBoom"},"content":"","lastModifiedDate":"2024-03-07"},{"lineNumber":149,"author":{"gitId":"PyromancerBoom"},"content":"- can save both address book data and user preference data in JSON format, and read them back into corresponding objects.","lastModifiedDate":"2024-03-07"},{"lineNumber":150,"author":{"gitId":"PyromancerBoom"},"content":"- inherits from both `AddressBookStorage` and `UserPrefStorage`, which means it can be treated as either one (if only the functionality of only one is needed).","lastModifiedDate":"2024-03-07"},{"lineNumber":151,"author":{"gitId":"PyromancerBoom"},"content":"- depends on some classes in the `Model` component (because the `Storage` component\u0027s job is to save/retrieve objects that belong to the `Model`)","lastModifiedDate":"2024-03-07"},{"lineNumber":152,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":153,"author":{"gitId":"-"},"content":"### Common classes","lastModifiedDate":"2020-05-23"},{"lineNumber":154,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":155,"author":{"gitId":"-"},"content":"Classes used by multiple components are in the `seedu.addressbook.commons` package.","lastModifiedDate":"2020-05-23"},{"lineNumber":156,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":157,"author":{"gitId":"PyromancerBoom"},"content":"---","lastModifiedDate":"2024-03-07"},{"lineNumber":158,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":159,"author":{"gitId":"-"},"content":"## **Implementation**","lastModifiedDate":"2020-05-23"},{"lineNumber":160,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":161,"author":{"gitId":"-"},"content":"This section describes some noteworthy details on how certain features are implemented.","lastModifiedDate":"2020-05-23"},{"lineNumber":162,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":163,"author":{"gitId":"-"},"content":"### \\[Proposed\\] Undo/redo feature","lastModifiedDate":"2020-06-07"},{"lineNumber":164,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":165,"author":{"gitId":"-"},"content":"#### Proposed Implementation","lastModifiedDate":"2020-05-23"},{"lineNumber":166,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":167,"author":{"gitId":"-"},"content":"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:","lastModifiedDate":"2020-05-23"},{"lineNumber":168,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":169,"author":{"gitId":"PyromancerBoom"},"content":"- `VersionedAddressBook#commit()` — Saves the current address book state in its history.","lastModifiedDate":"2024-03-07"},{"lineNumber":170,"author":{"gitId":"PyromancerBoom"},"content":"- `VersionedAddressBook#undo()` — Restores the previous address book state from its history.","lastModifiedDate":"2024-03-07"},{"lineNumber":171,"author":{"gitId":"PyromancerBoom"},"content":"- `VersionedAddressBook#redo()` — Restores a previously undone address book state from its history.","lastModifiedDate":"2024-03-07"},{"lineNumber":172,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":173,"author":{"gitId":"-"},"content":"These operations are exposed in the `Model` interface as `Model#commitAddressBook()`, `Model#undoAddressBook()` and `Model#redoAddressBook()` respectively.","lastModifiedDate":"2020-05-23"},{"lineNumber":174,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":175,"author":{"gitId":"-"},"content":"Given below is an example usage scenario and how the undo/redo mechanism behaves at each step.","lastModifiedDate":"2020-05-23"},{"lineNumber":176,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":177,"author":{"gitId":"-"},"content":"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.","lastModifiedDate":"2020-05-23"},{"lineNumber":178,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":179,"author":{"gitId":"-"},"content":"\u003cpuml src\u003d\"diagrams/UndoRedoState0.puml\" alt\u003d\"UndoRedoState0\" /\u003e","lastModifiedDate":"2023-09-12"},{"lineNumber":180,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":181,"author":{"gitId":"-"},"content":"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.","lastModifiedDate":"2020-05-23"},{"lineNumber":182,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":183,"author":{"gitId":"-"},"content":"\u003cpuml src\u003d\"diagrams/UndoRedoState1.puml\" alt\u003d\"UndoRedoState1\" /\u003e","lastModifiedDate":"2023-09-12"},{"lineNumber":184,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":185,"author":{"gitId":"-"},"content":"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`.","lastModifiedDate":"2020-05-23"},{"lineNumber":186,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":187,"author":{"gitId":"-"},"content":"\u003cpuml src\u003d\"diagrams/UndoRedoState2.puml\" alt\u003d\"UndoRedoState2\" /\u003e","lastModifiedDate":"2023-09-12"},{"lineNumber":188,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":189,"author":{"gitId":"-"},"content":"\u003cbox type\u003d\"info\" seamless\u003e","lastModifiedDate":"2023-09-12"},{"lineNumber":190,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":191,"author":{"gitId":"-"},"content":"**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`.","lastModifiedDate":"2023-09-12"},{"lineNumber":192,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2023-09-12"},{"lineNumber":193,"author":{"gitId":"-"},"content":"\u003c/box\u003e","lastModifiedDate":"2023-09-12"},{"lineNumber":194,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":195,"author":{"gitId":"-"},"content":"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.","lastModifiedDate":"2020-05-23"},{"lineNumber":196,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":197,"author":{"gitId":"-"},"content":"\u003cpuml src\u003d\"diagrams/UndoRedoState3.puml\" alt\u003d\"UndoRedoState3\" /\u003e","lastModifiedDate":"2023-09-12"},{"lineNumber":198,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2023-09-12"},{"lineNumber":199,"author":{"gitId":"-"},"content":"\u003cbox type\u003d\"info\" seamless\u003e","lastModifiedDate":"2023-09-12"},{"lineNumber":200,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":201,"author":{"gitId":"-"},"content":"**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","lastModifiedDate":"2023-09-12"},{"lineNumber":202,"author":{"gitId":"-"},"content":"than attempting to perform the undo.","lastModifiedDate":"2020-05-23"},{"lineNumber":203,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":204,"author":{"gitId":"-"},"content":"\u003c/box\u003e","lastModifiedDate":"2023-09-12"},{"lineNumber":205,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":206,"author":{"gitId":"-"},"content":"The following sequence diagram shows how an undo operation goes through the `Logic` component:","lastModifiedDate":"2024-02-09"},{"lineNumber":207,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":208,"author":{"gitId":"-"},"content":"\u003cpuml src\u003d\"diagrams/UndoSequenceDiagram-Logic.puml\" alt\u003d\"UndoSequenceDiagram-Logic\" /\u003e","lastModifiedDate":"2023-09-12"},{"lineNumber":209,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":210,"author":{"gitId":"-"},"content":"\u003cbox type\u003d\"info\" seamless\u003e","lastModifiedDate":"2023-09-12"},{"lineNumber":211,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":212,"author":{"gitId":"-"},"content":"**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.","lastModifiedDate":"2023-09-12"},{"lineNumber":213,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2023-09-12"},{"lineNumber":214,"author":{"gitId":"-"},"content":"\u003c/box\u003e","lastModifiedDate":"2023-09-12"},{"lineNumber":215,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":216,"author":{"gitId":"-"},"content":"Similarly, how an undo operation goes through the `Model` component is shown below:","lastModifiedDate":"2024-02-09"},{"lineNumber":217,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2024-02-09"},{"lineNumber":218,"author":{"gitId":"-"},"content":"\u003cpuml src\u003d\"diagrams/UndoSequenceDiagram-Model.puml\" alt\u003d\"UndoSequenceDiagram-Model\" /\u003e","lastModifiedDate":"2023-09-12"},{"lineNumber":219,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2024-02-09"},{"lineNumber":220,"author":{"gitId":"-"},"content":"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.","lastModifiedDate":"2020-05-23"},{"lineNumber":221,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":222,"author":{"gitId":"-"},"content":"\u003cbox type\u003d\"info\" seamless\u003e","lastModifiedDate":"2023-09-12"},{"lineNumber":223,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2023-09-12"},{"lineNumber":224,"author":{"gitId":"-"},"content":"**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.","lastModifiedDate":"2023-09-12"},{"lineNumber":225,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":226,"author":{"gitId":"-"},"content":"\u003c/box\u003e","lastModifiedDate":"2023-09-12"},{"lineNumber":227,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":228,"author":{"gitId":"-"},"content":"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.","lastModifiedDate":"2020-05-23"},{"lineNumber":229,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":230,"author":{"gitId":"-"},"content":"\u003cpuml src\u003d\"diagrams/UndoRedoState4.puml\" alt\u003d\"UndoRedoState4\" /\u003e","lastModifiedDate":"2023-09-12"},{"lineNumber":231,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":232,"author":{"gitId":"-"},"content":"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.","lastModifiedDate":"2020-05-23"},{"lineNumber":233,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":234,"author":{"gitId":"-"},"content":"\u003cpuml src\u003d\"diagrams/UndoRedoState5.puml\" alt\u003d\"UndoRedoState5\" /\u003e","lastModifiedDate":"2023-09-12"},{"lineNumber":235,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":236,"author":{"gitId":"-"},"content":"The following activity diagram summarizes what happens when a user executes a new command:","lastModifiedDate":"2020-05-23"},{"lineNumber":237,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":238,"author":{"gitId":"-"},"content":"\u003cpuml src\u003d\"diagrams/CommitActivityDiagram.puml\" width\u003d\"250\" /\u003e","lastModifiedDate":"2023-09-12"},{"lineNumber":239,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":240,"author":{"gitId":"-"},"content":"#### Design considerations:","lastModifiedDate":"2021-07-31"},{"lineNumber":241,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":242,"author":{"gitId":"-"},"content":"**Aspect: How undo \u0026 redo executes:**","lastModifiedDate":"2021-07-31"},{"lineNumber":243,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":244,"author":{"gitId":"PyromancerBoom"},"content":"- **Alternative 1 (current choice):** Saves the entire address book.","lastModifiedDate":"2024-03-07"},{"lineNumber":245,"author":{"gitId":"PyromancerBoom"},"content":"","lastModifiedDate":"2024-03-07"},{"lineNumber":246,"author":{"gitId":"PyromancerBoom"},"content":" - Pros: Easy to implement.","lastModifiedDate":"2024-03-07"},{"lineNumber":247,"author":{"gitId":"PyromancerBoom"},"content":" - Cons: May have performance issues in terms of memory usage.","lastModifiedDate":"2024-03-07"},{"lineNumber":248,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":249,"author":{"gitId":"PyromancerBoom"},"content":"- **Alternative 2:** Individual command knows how to undo/redo by","lastModifiedDate":"2024-03-07"},{"lineNumber":250,"author":{"gitId":"-"},"content":" itself.","lastModifiedDate":"2020-05-23"},{"lineNumber":251,"author":{"gitId":"PyromancerBoom"},"content":" - Pros: Will use less memory (e.g. for `delete`, just save the person being deleted).","lastModifiedDate":"2024-03-07"},{"lineNumber":252,"author":{"gitId":"PyromancerBoom"},"content":" - Cons: We must ensure that the implementation of each individual command are correct.","lastModifiedDate":"2024-03-07"},{"lineNumber":253,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":254,"author":{"gitId":"-"},"content":"_{more aspects and alternatives to be added}_","lastModifiedDate":"2020-05-23"},{"lineNumber":255,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":256,"author":{"gitId":"-"},"content":"### \\[Proposed\\] Data archiving","lastModifiedDate":"2020-05-23"},{"lineNumber":257,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":258,"author":{"gitId":"-"},"content":"_{Explain here how the data archiving feature will be implemented}_","lastModifiedDate":"2020-05-23"},{"lineNumber":259,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":260,"author":{"gitId":"PyromancerBoom"},"content":"---","lastModifiedDate":"2024-03-07"},{"lineNumber":261,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":262,"author":{"gitId":"-"},"content":"## **Documentation, logging, testing, configuration, dev-ops**","lastModifiedDate":"2020-06-07"},{"lineNumber":263,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":264,"author":{"gitId":"PyromancerBoom"},"content":"- [Documentation guide](Documentation.md)","lastModifiedDate":"2024-03-07"},{"lineNumber":265,"author":{"gitId":"PyromancerBoom"},"content":"- [Testing guide](Testing.md)","lastModifiedDate":"2024-03-07"},{"lineNumber":266,"author":{"gitId":"PyromancerBoom"},"content":"- [Logging guide](Logging.md)","lastModifiedDate":"2024-03-07"},{"lineNumber":267,"author":{"gitId":"PyromancerBoom"},"content":"- [Configuration guide](Configuration.md)","lastModifiedDate":"2024-03-07"},{"lineNumber":268,"author":{"gitId":"PyromancerBoom"},"content":"- [DevOps guide](DevOps.md)","lastModifiedDate":"2024-03-07"},{"lineNumber":269,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":270,"author":{"gitId":"PyromancerBoom"},"content":"---","lastModifiedDate":"2024-03-07"},{"lineNumber":271,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":272,"author":{"gitId":"-"},"content":"## **Appendix: Requirements**","lastModifiedDate":"2020-05-23"},{"lineNumber":273,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":274,"author":{"gitId":"-"},"content":"### Product scope","lastModifiedDate":"2020-05-23"},{"lineNumber":275,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":276,"author":{"gitId":"-"},"content":"**Target user profile**:","lastModifiedDate":"2020-05-23"},{"lineNumber":277,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":278,"author":{"gitId":"PyromancerBoom"},"content":"- needs to manage contacts of a growing population of employees","lastModifiedDate":"2024-03-07"},{"lineNumber":279,"author":{"gitId":"PyromancerBoom"},"content":"- prefers to use CLI over GUI","lastModifiedDate":"2024-03-07"},{"lineNumber":280,"author":{"gitId":"PyromancerBoom"},"content":"- can type fast","lastModifiedDate":"2024-03-07"},{"lineNumber":281,"author":{"gitId":"PyromancerBoom"},"content":"- values efficiency, transparency, and effective communication","lastModifiedDate":"2024-03-07"},{"lineNumber":282,"author":{"gitId":"PyromancerBoom"},"content":"- wants an app that works with different OS","lastModifiedDate":"2024-03-07"},{"lineNumber":283,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":284,"author":{"gitId":"quelinxiao"},"content":"**Value proposition**: manage contacts in an efficient manner using CLI app","lastModifiedDate":"2024-03-07"},{"lineNumber":285,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":286,"author":{"gitId":"-"},"content":"### User stories","lastModifiedDate":"2020-06-07"},{"lineNumber":287,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":288,"author":{"gitId":"-"},"content":"Priorities: High (must have) - `* * *`, Medium (nice to have) - `* *`, Low (unlikely to have) - `*`","lastModifiedDate":"2020-05-23"},{"lineNumber":289,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":290,"author":{"gitId":"-"},"content":"| Priority | As a …​ | I want to …​ | So that I can…​ |","lastModifiedDate":"2020-05-23"},{"lineNumber":291,"author":{"gitId":"PyromancerBoom"},"content":"| -------- | -------------------- | ---------------------------------------------- | ----------------------------------------------------- |","lastModifiedDate":"2024-03-07"},{"lineNumber":292,"author":{"gitId":"hjungwoo01"},"content":"| `* * *` | small business owner | easily add new contacts to my database | quickly message and nurture my employees |","lastModifiedDate":"2024-03-07"},{"lineNumber":293,"author":{"gitId":"hjungwoo01"},"content":"| `* * *` | busy professional | access my contact information from my computer | stay organized and responsive even when I\u0027m on the go |","lastModifiedDate":"2024-03-07"},{"lineNumber":294,"author":{"gitId":"hjungwoo01"},"content":"| `* * *` | user | add new contacts to my address book | easily store their information |","lastModifiedDate":"2024-03-07"},{"lineNumber":295,"author":{"gitId":"hjungwoo01"},"content":"| `* * *` | user | delete contacts I no longer need | keep my address book organized |","lastModifiedDate":"2024-03-07"},{"lineNumber":296,"author":{"gitId":"hjungwoo01"},"content":"| `* * *` | user | view a complete list of all my contacts | browse through them easily |","lastModifiedDate":"2024-03-07"},{"lineNumber":297,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":298,"author":{"gitId":"PyromancerBoom"},"content":"_{More to be added}_","lastModifiedDate":"2024-03-07"},{"lineNumber":299,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":300,"author":{"gitId":"-"},"content":"### Use cases","lastModifiedDate":"2020-06-07"},{"lineNumber":301,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":302,"author":{"gitId":"shayaansultan"},"content":"#### **Use Case: Add Contact for ContactSwift v1.2**","lastModifiedDate":"2024-03-07"},{"lineNumber":303,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":304,"author":{"gitId":"shayaansultan"},"content":"**System:** ContactSwift v1.2","lastModifiedDate":"2024-03-07"},{"lineNumber":305,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":306,"author":{"gitId":"shayaansultan"},"content":"**Actor:** User","lastModifiedDate":"2024-03-07"},{"lineNumber":307,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":308,"author":{"gitId":"shayaansultan"},"content":"1. **User adds a new contact:**","lastModifiedDate":"2024-03-07"},{"lineNumber":309,"author":{"gitId":"PyromancerBoom"},"content":"","lastModifiedDate":"2024-03-07"},{"lineNumber":310,"author":{"gitId":"shayaansultan"},"content":" - Command: `add contact /name Jane Smith /email jane@example.com /number 9876543210`","lastModifiedDate":"2024-03-07"},{"lineNumber":311,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":312,"author":{"gitId":"shayaansultan"},"content":"2. **ContactSwift processes the command:**","lastModifiedDate":"2024-03-07"},{"lineNumber":313,"author":{"gitId":"PyromancerBoom"},"content":"","lastModifiedDate":"2024-03-07"},{"lineNumber":314,"author":{"gitId":"shayaansultan"},"content":" - Validates the command format and required details.","lastModifiedDate":"2024-03-07"},{"lineNumber":315,"author":{"gitId":"shayaansultan"},"content":" - Generates a unique ID for the new contact.","lastModifiedDate":"2024-03-07"},{"lineNumber":316,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":317,"author":{"gitId":"shayaansultan"},"content":"3. **ContactSwift updates the address book:**","lastModifiedDate":"2024-03-07"},{"lineNumber":318,"author":{"gitId":"PyromancerBoom"},"content":"","lastModifiedDate":"2024-03-07"},{"lineNumber":319,"author":{"gitId":"shayaansultan"},"content":" - Adds the contact details to the in-memory database.","lastModifiedDate":"2024-03-07"},{"lineNumber":320,"author":{"gitId":"shayaansultan"},"content":" - Sends a success message to the user.","lastModifiedDate":"2024-03-07"},{"lineNumber":321,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":322,"author":{"gitId":"shayaansultan"},"content":"4. **User verifies the addition:**","lastModifiedDate":"2024-03-07"},{"lineNumber":323,"author":{"gitId":"shayaansultan"},"content":" - Command: `list all`","lastModifiedDate":"2024-03-07"},{"lineNumber":324,"author":{"gitId":"shayaansultan"},"content":" - ContactSwift displays the updated list with Jane Smith\u0027s details.","lastModifiedDate":"2024-03-07"},{"lineNumber":325,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":326,"author":{"gitId":"shayaansultan"},"content":"#### **Use Case: Delete Contact for ContactSwift v1.2**","lastModifiedDate":"2024-03-07"},{"lineNumber":327,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":328,"author":{"gitId":"shayaansultan"},"content":"**System:** ContactSwift v1.2","lastModifiedDate":"2024-03-07"},{"lineNumber":329,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":330,"author":{"gitId":"shayaansultan"},"content":"**Actor:** User","lastModifiedDate":"2024-03-07"},{"lineNumber":331,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":332,"author":{"gitId":"shayaansultan"},"content":"1. **User identifies the contact to delete:**","lastModifiedDate":"2024-03-07"},{"lineNumber":333,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2024-03-07"},{"lineNumber":334,"author":{"gitId":"shayaansultan"},"content":" - Command: `list all`","lastModifiedDate":"2024-03-07"},{"lineNumber":335,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2024-03-07"},{"lineNumber":336,"author":{"gitId":"shayaansultan"},"content":"2. **ContactSwift displays the contact list:**","lastModifiedDate":"2024-03-07"},{"lineNumber":337,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2024-03-07"},{"lineNumber":338,"author":{"gitId":"shayaansultan"},"content":" - User identifies the contact to delete, e.g., with the ID 5678.","lastModifiedDate":"2024-03-07"},{"lineNumber":339,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2024-03-07"},{"lineNumber":340,"author":{"gitId":"shayaansultan"},"content":"3. **User initiates the deletion:**","lastModifiedDate":"2024-03-07"},{"lineNumber":341,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2024-03-07"},{"lineNumber":342,"author":{"gitId":"shayaansultan"},"content":" - Command: `delete contact /id 5678`","lastModifiedDate":"2024-03-07"},{"lineNumber":343,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2024-03-07"},{"lineNumber":344,"author":{"gitId":"shayaansultan"},"content":"4. **ContactSwift processes the deletion:**","lastModifiedDate":"2024-03-07"},{"lineNumber":345,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2024-03-07"},{"lineNumber":346,"author":{"gitId":"shayaansultan"},"content":" - Verifies the command format and the contact ID.","lastModifiedDate":"2024-03-07"},{"lineNumber":347,"author":{"gitId":"shayaansultan"},"content":" - Deletes the contact if conditions are met.","lastModifiedDate":"2024-03-07"},{"lineNumber":348,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2024-03-07"},{"lineNumber":349,"author":{"gitId":"shayaansultan"},"content":"5. **ContactSwift updates the address book:**","lastModifiedDate":"2024-03-07"},{"lineNumber":350,"author":{"gitId":"PyromancerBoom"},"content":"","lastModifiedDate":"2024-03-07"},{"lineNumber":351,"author":{"gitId":"shayaansultan"},"content":" - Removes the contact from the in-memory database.","lastModifiedDate":"2024-03-07"},{"lineNumber":352,"author":{"gitId":"shayaansultan"},"content":" - Sends a confirmation message to the user.","lastModifiedDate":"2024-03-07"},{"lineNumber":353,"author":{"gitId":"shayaansultan"},"content":"","lastModifiedDate":"2024-03-07"},{"lineNumber":354,"author":{"gitId":"shayaansultan"},"content":"6. **User verifies the deletion:**","lastModifiedDate":"2024-03-07"},{"lineNumber":355,"author":{"gitId":"shayaansultan"},"content":" - Command: `list all`","lastModifiedDate":"2024-03-07"},{"lineNumber":356,"author":{"gitId":"shayaansultan"},"content":" - ContactSwift displays the updated list without the deleted contact.","lastModifiedDate":"2024-03-07"},{"lineNumber":357,"author":{"gitId":"shayaansultan"},"content":"","lastModifiedDate":"2024-03-07"},{"lineNumber":358,"author":{"gitId":"shayaansultan"},"content":"#### **Use Case: Quick Contact Addition for ContactSwift v1.2**","lastModifiedDate":"2024-03-07"},{"lineNumber":359,"author":{"gitId":"shayaansultan"},"content":"","lastModifiedDate":"2024-03-07"},{"lineNumber":360,"author":{"gitId":"shayaansultan"},"content":"**System:** ContactSwift v1.2","lastModifiedDate":"2024-03-07"},{"lineNumber":361,"author":{"gitId":"shayaansultan"},"content":"","lastModifiedDate":"2024-03-07"},{"lineNumber":362,"author":{"gitId":"shayaansultan"},"content":"**Actor:** User","lastModifiedDate":"2024-03-07"},{"lineNumber":363,"author":{"gitId":"shayaansultan"},"content":"","lastModifiedDate":"2024-03-07"},{"lineNumber":364,"author":{"gitId":"shayaansultan"},"content":"1. **User meets a new contact at a networking event:**","lastModifiedDate":"2024-03-07"},{"lineNumber":365,"author":{"gitId":"PyromancerBoom"},"content":"","lastModifiedDate":"2024-03-07"},{"lineNumber":366,"author":{"gitId":"shayaansultan"},"content":" - Command: `add contact /name Sam Johnson /email sam@example.com /number 5551234567`","lastModifiedDate":"2024-03-07"},{"lineNumber":367,"author":{"gitId":"shayaansultan"},"content":"","lastModifiedDate":"2024-03-07"},{"lineNumber":368,"author":{"gitId":"shayaansultan"},"content":"2. **ContactSwift processes the command:**","lastModifiedDate":"2024-03-07"},{"lineNumber":369,"author":{"gitId":"PyromancerBoom"},"content":"","lastModifiedDate":"2024-03-07"},{"lineNumber":370,"author":{"gitId":"shayaansultan"},"content":" - Validates the command format and required details.","lastModifiedDate":"2024-03-07"},{"lineNumber":371,"author":{"gitId":"shayaansultan"},"content":" - Generates a unique ID for the new contact.","lastModifiedDate":"2024-03-07"},{"lineNumber":372,"author":{"gitId":"shayaansultan"},"content":"","lastModifiedDate":"2024-03-07"},{"lineNumber":373,"author":{"gitId":"shayaansultan"},"content":"3. **ContactSwift updates the address book:**","lastModifiedDate":"2024-03-07"},{"lineNumber":374,"author":{"gitId":"PyromancerBoom"},"content":"","lastModifiedDate":"2024-03-07"},{"lineNumber":375,"author":{"gitId":"shayaansultan"},"content":" - Adds the contact details to the in-memory database.","lastModifiedDate":"2024-03-07"},{"lineNumber":376,"author":{"gitId":"shayaansultan"},"content":" - Sends a success message to the user.","lastModifiedDate":"2024-03-07"},{"lineNumber":377,"author":{"gitId":"shayaansultan"},"content":"","lastModifiedDate":"2024-03-07"},{"lineNumber":378,"author":{"gitId":"shayaansultan"},"content":"4. **User verifies the addition:**","lastModifiedDate":"2024-03-07"},{"lineNumber":379,"author":{"gitId":"shayaansultan"},"content":" - Command: `list all`","lastModifiedDate":"2024-03-07"},{"lineNumber":380,"author":{"gitId":"shayaansultan"},"content":" - ContactSwift displays the updated list with Sam Johnson\u0027s details.","lastModifiedDate":"2024-03-07"},{"lineNumber":381,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":382,"author":{"gitId":"PyromancerBoom"},"content":"_{More to be added}_","lastModifiedDate":"2024-03-07"},{"lineNumber":383,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":384,"author":{"gitId":"-"},"content":"### Non-Functional Requirements","lastModifiedDate":"2020-05-23"},{"lineNumber":385,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":386,"author":{"gitId":"PyromancerBoom"},"content":"1. Cross-Platform Compatibility: Must be executable on any mainstream operating system (Windows, macOS, Linux) with Java Runtime Environment (JRE) version 11 or above installed. This ensures that the application can serve a wide user base without being restricted by their OS choice.","lastModifiedDate":"2024-03-07"},{"lineNumber":387,"author":{"gitId":"-"},"content":"2. Should be able to hold up to 1000 persons without a noticeable sluggishness in performance for typical usage.","lastModifiedDate":"2020-05-23"},{"lineNumber":388,"author":{"gitId":"-"},"content":"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.","lastModifiedDate":"2020-05-23"},{"lineNumber":389,"author":{"gitId":"PyromancerBoom"},"content":"4. The design and user interaction model of the software should cater to users with above-average typing speeds for regular English text. It implies that the command-line interface (CLI) or similar input methods should allow for faster task accomplishment compared to traditional graphical user interface (GUI) interactions involving the mouse. This would include quick command shortcuts for adding, deleting, and searching for contacts, among other actions.","lastModifiedDate":"2024-03-07"},{"lineNumber":390,"author":{"gitId":"PyromancerBoom"},"content":"5. Intuitive User Interface: Despite the focus on efficiency and command-line usage, the software should still offer an intuitive interface for those moments when a user prefers or needs to interact with the software in a more traditional manner. This includes clear visual cues, easy navigation, and minimalistic design to reduce cognitive load.","lastModifiedDate":"2024-03-07"},{"lineNumber":391,"author":{"gitId":"PyromancerBoom"},"content":"6. Data Security: The software should ensure that private contact details are stored securely and are not accessible to unauthorized users. This includes encryption of sensitive data and secure access control mechanisms.","lastModifiedDate":"2024-03-07"},{"lineNumber":392,"author":{"gitId":"PyromancerBoom"},"content":"7. Data Integrity: The software should ensure that contact details are stored accurately and are not lost or corrupted due to software errors or hardware failures. This includes regular data backups and error-checking mechanisms.","lastModifiedDate":"2024-03-07"},{"lineNumber":393,"author":{"gitId":"PyromancerBoom"},"content":"8. Portability: As a Java application packaged in a .jar file, it should ensure that all dependencies are included or easily resolvable, making the application easily portable and runnable across different systems without additional setup.","lastModifiedDate":"2024-03-07"},{"lineNumber":394,"author":{"gitId":"PyromancerBoom"},"content":"9. All operations should run in under 0.5 seconds for a typical user with a typical address book size (1000 persons).","lastModifiedDate":"2024-03-07"},{"lineNumber":395,"author":{"gitId":"PyromancerBoom"},"content":"10. Should work well with 500 MB of memory, and should not consume more than 0.5 GB of memory for a typical user with a typical address book size (50k persons).","lastModifiedDate":"2024-03-07"},{"lineNumber":396,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":397,"author":{"gitId":"PyromancerBoom"},"content":"\u003c!-- *{More to be added}* --\u003e","lastModifiedDate":"2024-03-07"},{"lineNumber":398,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":399,"author":{"gitId":"-"},"content":"### Glossary","lastModifiedDate":"2020-05-23"},{"lineNumber":400,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":401,"author":{"gitId":"PyromancerBoom"},"content":"- **Mainstream OS**: Windows, Linux, Unix, MacOS","lastModifiedDate":"2024-03-07"},{"lineNumber":402,"author":{"gitId":"PyromancerBoom"},"content":"- **Private contact detail**: A contact detail that is not meant to be shared with others","lastModifiedDate":"2024-03-07"},{"lineNumber":403,"author":{"gitId":"PyromancerBoom"},"content":"- **Quick Contact Addition**: Allows users to rapidly add new contacts to their address book during networking events. Generates a unique ID for each contact.","lastModifiedDate":"2024-03-07"},{"lineNumber":404,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2024-03-07"},{"lineNumber":405,"author":{"gitId":"PyromancerBoom"},"content":"- **Command Format**: The syntax used to input commands in ContactSwift. Example commands include adding or deleting contacts, and the format must be followed for successful execution.","lastModifiedDate":"2024-03-07"},{"lineNumber":406,"author":{"gitId":"shayaansultan"},"content":"","lastModifiedDate":"2024-03-07"},{"lineNumber":407,"author":{"gitId":"PyromancerBoom"},"content":"- **Contact Deletion**: Enables users to remove contacts they no longer need, contributing to the organization of their address book. Requires a valid contact ID for deletion.","lastModifiedDate":"2024-03-07"},{"lineNumber":408,"author":{"gitId":"shayaansultan"},"content":"","lastModifiedDate":"2024-03-07"},{"lineNumber":409,"author":{"gitId":"PyromancerBoom"},"content":"- **Contact Information Storage**: Allows users to store detailed information about their contacts for easy reference. In the initial version, information is stored in memory to simulate a database, text file, or CSV file.","lastModifiedDate":"2024-03-07"},{"lineNumber":410,"author":{"gitId":"shayaansultan"},"content":"","lastModifiedDate":"2024-03-07"},{"lineNumber":411,"author":{"gitId":"PyromancerBoom"},"content":"- **All Contacts List Display**: Provides users with a complete list of all their contacts for easy browsing and reference. Users can request the display of all contacts with their details in a user-friendly format.","lastModifiedDate":"2024-03-07"},{"lineNumber":412,"author":{"gitId":"shayaansultan"},"content":"","lastModifiedDate":"2024-03-07"},{"lineNumber":413,"author":{"gitId":"PyromancerBoom"},"content":"- **Contact ID**: A unique identifier assigned to each contact. Used in commands such as deleting a contact to specify the target contact.","lastModifiedDate":"2024-03-07"},{"lineNumber":414,"author":{"gitId":"shayaansultan"},"content":"","lastModifiedDate":"2024-03-07"},{"lineNumber":415,"author":{"gitId":"PyromancerBoom"},"content":"- **Acceptable Values**: The valid input criteria for various fields such as contact name, email, and phone number. Ensures that the entered data meets the required format.","lastModifiedDate":"2024-03-07"},{"lineNumber":416,"author":{"gitId":"shayaansultan"},"content":"","lastModifiedDate":"2024-03-07"},{"lineNumber":417,"author":{"gitId":"PyromancerBoom"},"content":"- **Expected Outputs**: The successful outcomes or confirmation messages expected after executing specific commands, such as adding or deleting contacts.","lastModifiedDate":"2024-03-07"},{"lineNumber":418,"author":{"gitId":"shayaansultan"},"content":"","lastModifiedDate":"2024-03-07"},{"lineNumber":419,"author":{"gitId":"PyromancerBoom"},"content":"- **Failure Outputs**: Error messages generated when there are issues, such as missing details or incorrect command formats. Communicates problems to the user for troubleshooting.","lastModifiedDate":"2024-03-07"},{"lineNumber":420,"author":{"gitId":"shayaansultan"},"content":"","lastModifiedDate":"2024-03-07"},{"lineNumber":421,"author":{"gitId":"PyromancerBoom"},"content":"- **Mainstream OS**: Refers to widely used operating systems including Windows, Linux, Unix, and MacOS. ContactSwift is designed to work seamlessly across these platforms.","lastModifiedDate":"2024-03-07"},{"lineNumber":422,"author":{"gitId":"shayaansultan"},"content":"","lastModifiedDate":"2024-03-07"},{"lineNumber":423,"author":{"gitId":"PyromancerBoom"},"content":"- **Private Contact Detail**: A contact detail that is not meant to be shared with others. Ensures the confidentiality of certain information stored in the address book.","lastModifiedDate":"2024-03-07"},{"lineNumber":424,"author":{"gitId":"shayaansultan"},"content":"","lastModifiedDate":"2024-03-07"},{"lineNumber":425,"author":{"gitId":"PyromancerBoom"},"content":"- **Must-have Features**: Quick Contact Addition, Contact Deletion, Contact Information Storage, and All Contacts List Display. Core functionalities essential for addressing the needs of business owners and managers.","lastModifiedDate":"2024-03-07"},{"lineNumber":426,"author":{"gitId":"shayaansultan"},"content":"","lastModifiedDate":"2024-03-07"},{"lineNumber":427,"author":{"gitId":"PyromancerBoom"},"content":"- **Good to Have Features**: Additional functionalities that enhance user experience, such as tags and remarks while adding contacts, searching specific contacts, filtering based on tags, and a favorites option for quick lookup.","lastModifiedDate":"2024-03-07"},{"lineNumber":428,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":429,"author":{"gitId":"PyromancerBoom"},"content":"---","lastModifiedDate":"2024-03-07"},{"lineNumber":430,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":431,"author":{"gitId":"-"},"content":"## **Appendix: Instructions for manual testing**","lastModifiedDate":"2020-05-23"},{"lineNumber":432,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":433,"author":{"gitId":"-"},"content":"Given below are instructions to test the app manually.","lastModifiedDate":"2020-05-23"},{"lineNumber":434,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":435,"author":{"gitId":"-"},"content":"\u003cbox type\u003d\"info\" seamless\u003e","lastModifiedDate":"2023-09-12"},{"lineNumber":436,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2023-09-12"},{"lineNumber":437,"author":{"gitId":"-"},"content":"**Note:** These instructions only provide a starting point for testers to work on;","lastModifiedDate":"2023-09-12"},{"lineNumber":438,"author":{"gitId":"PyromancerBoom"},"content":"testers are expected to do more _exploratory_ testing.","lastModifiedDate":"2024-03-07"},{"lineNumber":439,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":440,"author":{"gitId":"-"},"content":"\u003c/box\u003e","lastModifiedDate":"2023-09-12"},{"lineNumber":441,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":442,"author":{"gitId":"-"},"content":"### Launch and shutdown","lastModifiedDate":"2020-05-23"},{"lineNumber":443,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":444,"author":{"gitId":"-"},"content":"1. Initial launch","lastModifiedDate":"2020-05-23"},{"lineNumber":445,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":446,"author":{"gitId":"-"},"content":" 1. Download the jar file and copy into an empty folder","lastModifiedDate":"2020-05-23"},{"lineNumber":447,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":448,"author":{"gitId":"-"},"content":" 1. Double-click the jar file Expected: Shows the GUI with a set of sample contacts. The window size may not be optimum.","lastModifiedDate":"2020-05-23"},{"lineNumber":449,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":450,"author":{"gitId":"-"},"content":"1. Saving window preferences","lastModifiedDate":"2020-05-23"},{"lineNumber":451,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":452,"author":{"gitId":"-"},"content":" 1. Resize the window to an optimum size. Move the window to a different location. Close the window.","lastModifiedDate":"2020-05-23"},{"lineNumber":453,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":454,"author":{"gitId":"-"},"content":" 1. Re-launch the app by double-clicking the jar file.\u003cbr\u003e","lastModifiedDate":"2020-05-23"},{"lineNumber":455,"author":{"gitId":"-"},"content":" Expected: The most recent window size and location is retained.","lastModifiedDate":"2020-05-23"},{"lineNumber":456,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":457,"author":{"gitId":"-"},"content":"1. _{ more test cases …​ }_","lastModifiedDate":"2020-05-23"},{"lineNumber":458,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":459,"author":{"gitId":"-"},"content":"### Deleting a person","lastModifiedDate":"2020-05-23"},{"lineNumber":460,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":461,"author":{"gitId":"-"},"content":"1. Deleting a person while all persons are being shown","lastModifiedDate":"2020-05-23"},{"lineNumber":462,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":463,"author":{"gitId":"-"},"content":" 1. Prerequisites: List all persons using the `list` command. Multiple persons in the list.","lastModifiedDate":"2020-05-23"},{"lineNumber":464,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":465,"author":{"gitId":"-"},"content":" 1. Test case: `delete 1`\u003cbr\u003e","lastModifiedDate":"2020-05-23"},{"lineNumber":466,"author":{"gitId":"-"},"content":" 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.","lastModifiedDate":"2020-05-23"},{"lineNumber":467,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":468,"author":{"gitId":"-"},"content":" 1. Test case: `delete 0`\u003cbr\u003e","lastModifiedDate":"2020-05-23"},{"lineNumber":469,"author":{"gitId":"-"},"content":" Expected: No person is deleted. Error details shown in the status message. Status bar remains the same.","lastModifiedDate":"2020-05-23"},{"lineNumber":470,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":471,"author":{"gitId":"-"},"content":" 1. Other incorrect delete commands to try: `delete`, `delete x`, `...` (where x is larger than the list size)\u003cbr\u003e","lastModifiedDate":"2020-05-23"},{"lineNumber":472,"author":{"gitId":"-"},"content":" Expected: Similar to previous.","lastModifiedDate":"2020-05-23"},{"lineNumber":473,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":474,"author":{"gitId":"-"},"content":"1. _{ more test cases …​ }_","lastModifiedDate":"2020-05-23"},{"lineNumber":475,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":476,"author":{"gitId":"-"},"content":"### Saving data","lastModifiedDate":"2020-05-23"},{"lineNumber":477,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":478,"author":{"gitId":"-"},"content":"1. Dealing with missing/corrupted data files","lastModifiedDate":"2020-05-23"},{"lineNumber":479,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":480,"author":{"gitId":"-"},"content":" 1. _{explain how to simulate a missing/corrupted file, and the expected behavior}_","lastModifiedDate":"2020-05-23"},{"lineNumber":481,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":482,"author":{"gitId":"-"},"content":"1. _{ more test cases …​ }_","lastModifiedDate":"2020-05-23"}],"authorContributionMap":{"PyromancerBoom":89,"quelinxiao":1,"hjungwoo01":5,"shayaansultan":65,"-":322}},{"path":"docs/_markbind/layouts/default.md","fileType":"docs","lines":[{"lineNumber":1,"author":{"gitId":"-"},"content":"\u003chead-bottom\u003e","lastModifiedDate":"2023-09-12"},{"lineNumber":2,"author":{"gitId":"-"},"content":" \u003clink rel\u003d\"stylesheet\" href\u003d\"{{baseUrl}}/stylesheets/main.css\"\u003e","lastModifiedDate":"2023-09-12"},{"lineNumber":3,"author":{"gitId":"-"},"content":"\u003c/head-bottom\u003e","lastModifiedDate":"2023-09-12"},{"lineNumber":4,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2023-09-12"},{"lineNumber":5,"author":{"gitId":"-"},"content":"\u003cheader sticky\u003e","lastModifiedDate":"2023-09-12"},{"lineNumber":6,"author":{"gitId":"-"},"content":" \u003cnavbar type\u003d\"dark\"\u003e","lastModifiedDate":"2023-09-12"},{"lineNumber":7,"author":{"gitId":"shayaansultan"},"content":" \u003ca slot\u003d\"brand\" href\u003d\"{{baseUrl}}/index.html\" title\u003d\"Home\" class\u003d\"navbar-brand\"\u003eMy Product\u003c/a\u003e","lastModifiedDate":"2024-03-07"},{"lineNumber":8,"author":{"gitId":"-"},"content":" \u003cli\u003e\u003ca href\u003d\"{{baseUrl}}/index.html\" class\u003d\"nav-link\"\u003eHome\u003c/a\u003e\u003c/li\u003e","lastModifiedDate":"2024-02-09"},{"lineNumber":9,"author":{"gitId":"-"},"content":" \u003cli\u003e\u003ca href\u003d\"{{baseUrl}}/UserGuide.html\" class\u003d\"nav-link\"\u003eUser Guide\u003c/a\u003e\u003c/li\u003e","lastModifiedDate":"2023-09-12"},{"lineNumber":10,"author":{"gitId":"-"},"content":" \u003cli\u003e\u003ca href\u003d\"{{baseUrl}}/DeveloperGuide.html\" class\u003d\"nav-link\"\u003eDeveloper Guide\u003c/a\u003e\u003c/li\u003e","lastModifiedDate":"2023-09-12"},{"lineNumber":11,"author":{"gitId":"-"},"content":" \u003cli\u003e\u003ca href\u003d\"{{baseUrl}}/AboutUs.html\" class\u003d\"nav-link\"\u003eAbout Us\u003c/a\u003e\u003c/li\u003e","lastModifiedDate":"2023-09-12"},{"lineNumber":12,"author":{"gitId":"-"},"content":" \u003cli\u003e\u003ca href\u003d\"https://github.com/se-edu/addressbook-level3\" target\u003d\"_blank\" class\u003d\"nav-link\"\u003e\u003cmd\u003e:fab-github:\u003c/md\u003e\u003c/a\u003e","lastModifiedDate":"2023-09-12"},{"lineNumber":13,"author":{"gitId":"-"},"content":" \u003c/li\u003e","lastModifiedDate":"2023-09-12"},{"lineNumber":14,"author":{"gitId":"-"},"content":" \u003cli slot\u003d\"right\"\u003e","lastModifiedDate":"2023-09-12"},{"lineNumber":15,"author":{"gitId":"-"},"content":" \u003cform class\u003d\"navbar-form\"\u003e","lastModifiedDate":"2023-09-12"},{"lineNumber":16,"author":{"gitId":"-"},"content":" \u003csearchbar :data\u003d\"searchData\" placeholder\u003d\"Search\" :on-hit\u003d\"searchCallback\" menu-align-right\u003e\u003c/searchbar\u003e","lastModifiedDate":"2023-09-12"},{"lineNumber":17,"author":{"gitId":"-"},"content":" \u003c/form\u003e","lastModifiedDate":"2023-09-12"},{"lineNumber":18,"author":{"gitId":"-"},"content":" \u003c/li\u003e","lastModifiedDate":"2023-09-12"},{"lineNumber":19,"author":{"gitId":"-"},"content":" \u003c/navbar\u003e","lastModifiedDate":"2023-09-12"},{"lineNumber":20,"author":{"gitId":"-"},"content":"\u003c/header\u003e","lastModifiedDate":"2023-09-12"},{"lineNumber":21,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2023-09-12"},{"lineNumber":22,"author":{"gitId":"-"},"content":"\u003cdiv id\u003d\"flex-body\"\u003e","lastModifiedDate":"2023-09-12"},{"lineNumber":23,"author":{"gitId":"-"},"content":" \u003cnav id\u003d\"site-nav\"\u003e","lastModifiedDate":"2023-09-12"},{"lineNumber":24,"author":{"gitId":"-"},"content":" \u003cdiv class\u003d\"site-nav-top\"\u003e","lastModifiedDate":"2023-09-12"},{"lineNumber":25,"author":{"gitId":"-"},"content":" \u003cdiv class\u003d\"fw-bold mb-2\" style\u003d\"font-size: 1.25rem;\"\u003eSite Map\u003c/div\u003e","lastModifiedDate":"2023-09-12"},{"lineNumber":26,"author":{"gitId":"-"},"content":" \u003c/div\u003e","lastModifiedDate":"2023-09-12"},{"lineNumber":27,"author":{"gitId":"-"},"content":" \u003cdiv class\u003d\"nav-component slim-scroll\"\u003e","lastModifiedDate":"2023-09-12"},{"lineNumber":28,"author":{"gitId":"-"},"content":" \u003csite-nav\u003e","lastModifiedDate":"2023-09-12"},{"lineNumber":29,"author":{"gitId":"-"},"content":"* [Home]({{ baseUrl }}/index.html)","lastModifiedDate":"2023-09-12"},{"lineNumber":30,"author":{"gitId":"-"},"content":"* [User Guide]({{ baseUrl }}/UserGuide.html) :expanded:","lastModifiedDate":"2023-09-12"},{"lineNumber":31,"author":{"gitId":"-"},"content":" * [Quick Start]({{ baseUrl }}/UserGuide.html#quick-start)","lastModifiedDate":"2023-09-12"},{"lineNumber":32,"author":{"gitId":"-"},"content":" * [Features]({{ baseUrl }}/UserGuide.html#features)","lastModifiedDate":"2023-09-12"},{"lineNumber":33,"author":{"gitId":"-"},"content":" * [FAQ]({{ baseUrl }}/UserGuide.html#faq)","lastModifiedDate":"2023-09-12"},{"lineNumber":34,"author":{"gitId":"-"},"content":" * [Command Summary]({{ baseUrl }}/UserGuide.html#faq)","lastModifiedDate":"2023-09-12"},{"lineNumber":35,"author":{"gitId":"-"},"content":"* [Developer Guide]({{ baseUrl }}/DeveloperGuide.html) :expanded:","lastModifiedDate":"2023-09-12"},{"lineNumber":36,"author":{"gitId":"-"},"content":" * [Acknowledgements]({{ baseUrl }}/DeveloperGuide.html#acknowledgements)","lastModifiedDate":"2023-09-12"},{"lineNumber":37,"author":{"gitId":"-"},"content":" * [Setting Up]({{ baseUrl }}/DeveloperGuide.html#setting-up-getting-started)","lastModifiedDate":"2023-09-12"},{"lineNumber":38,"author":{"gitId":"-"},"content":" * [Design]({{ baseUrl }}/DeveloperGuide.html#design)","lastModifiedDate":"2023-09-12"},{"lineNumber":39,"author":{"gitId":"-"},"content":" * [Implementation]({{ baseUrl }}/DeveloperGuide.html#implementation)","lastModifiedDate":"2023-09-12"},{"lineNumber":40,"author":{"gitId":"-"},"content":" * [Documentation, logging, testing, configuration, dev-ops]({{ baseUrl }}/DeveloperGuide.html#documentation-logging-testing-configuration-dev-ops)","lastModifiedDate":"2023-09-12"},{"lineNumber":41,"author":{"gitId":"-"},"content":" * [Appendix: Requirements]({{ baseUrl }}/DeveloperGuide.html#appendix-requirements)","lastModifiedDate":"2023-09-12"},{"lineNumber":42,"author":{"gitId":"-"},"content":" * [Appendix: Instructions for manual testing]({{ baseUrl }}/DeveloperGuide.html#appendix-instructions-for-manual-testing)","lastModifiedDate":"2023-09-12"},{"lineNumber":43,"author":{"gitId":"-"},"content":"* Tutorials","lastModifiedDate":"2023-09-12"},{"lineNumber":44,"author":{"gitId":"-"},"content":" * [Tracing code]({{ baseUrl }}/tutorials/TracingCode.html)","lastModifiedDate":"2023-09-12"},{"lineNumber":45,"author":{"gitId":"-"},"content":" * [Adding a command]({{ baseUrl }}/tutorials/AddRemark.html)","lastModifiedDate":"2023-09-12"},{"lineNumber":46,"author":{"gitId":"-"},"content":" * [Removing Fields]({{ baseUrl }}/tutorials/RemovingFields.html)","lastModifiedDate":"2023-09-12"},{"lineNumber":47,"author":{"gitId":"-"},"content":"* [About Us]({{ baseUrl }}/AboutUs.html)","lastModifiedDate":"2023-09-12"},{"lineNumber":48,"author":{"gitId":"-"},"content":" \u003c/site-nav\u003e","lastModifiedDate":"2023-09-12"},{"lineNumber":49,"author":{"gitId":"-"},"content":" \u003c/div\u003e","lastModifiedDate":"2023-09-12"},{"lineNumber":50,"author":{"gitId":"-"},"content":" \u003c/nav\u003e","lastModifiedDate":"2023-09-12"},{"lineNumber":51,"author":{"gitId":"-"},"content":" \u003cdiv id\u003d\"content-wrapper\"\u003e","lastModifiedDate":"2023-09-12"},{"lineNumber":52,"author":{"gitId":"-"},"content":" {{ content }}","lastModifiedDate":"2023-09-12"},{"lineNumber":53,"author":{"gitId":"-"},"content":" \u003c/div\u003e","lastModifiedDate":"2023-09-12"},{"lineNumber":54,"author":{"gitId":"-"},"content":" \u003cnav id\u003d\"page-nav\"\u003e","lastModifiedDate":"2023-09-12"},{"lineNumber":55,"author":{"gitId":"-"},"content":" \u003cdiv class\u003d\"nav-component slim-scroll\"\u003e","lastModifiedDate":"2023-09-12"},{"lineNumber":56,"author":{"gitId":"-"},"content":" \u003cpage-nav /\u003e","lastModifiedDate":"2023-09-12"},{"lineNumber":57,"author":{"gitId":"-"},"content":" \u003c/div\u003e","lastModifiedDate":"2023-09-12"},{"lineNumber":58,"author":{"gitId":"-"},"content":" \u003c/nav\u003e","lastModifiedDate":"2023-09-12"},{"lineNumber":59,"author":{"gitId":"-"},"content":" \u003cscroll-top-button\u003e\u003c/scroll-top-button\u003e","lastModifiedDate":"2023-09-12"},{"lineNumber":60,"author":{"gitId":"-"},"content":"\u003c/div\u003e","lastModifiedDate":"2023-09-12"},{"lineNumber":61,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2023-09-12"},{"lineNumber":62,"author":{"gitId":"-"},"content":"\u003cfooter\u003e","lastModifiedDate":"2023-09-12"},{"lineNumber":63,"author":{"gitId":"-"},"content":" \u003c!-- Support MarkBind by including a link to us on your landing page! --\u003e","lastModifiedDate":"2023-09-12"},{"lineNumber":64,"author":{"gitId":"-"},"content":" \u003cdiv class\u003d\"text-center\"\u003e","lastModifiedDate":"2023-09-12"},{"lineNumber":65,"author":{"gitId":"-"},"content":" \u003csmall\u003e[\u003cmd\u003e**Powered by**\u003c/md\u003e \u003cimg src\u003d\"https://markbind.org/favicon.ico\" width\u003d\"30\"\u003e {{MarkBind}}, generated on {{timestamp}}]\u003c/small\u003e","lastModifiedDate":"2023-09-12"},{"lineNumber":66,"author":{"gitId":"-"},"content":" \u003c/div\u003e","lastModifiedDate":"2023-09-12"},{"lineNumber":67,"author":{"gitId":"-"},"content":"\u003c/footer\u003e","lastModifiedDate":"2023-09-12"}],"authorContributionMap":{"shayaansultan":1,"-":66}},{"path":"docs/team/hjungwoo01.md","fileType":"docs","lines":[{"lineNumber":1,"author":{"gitId":"hjungwoo01"},"content":"---","lastModifiedDate":"2024-03-07"},{"lineNumber":2,"author":{"gitId":"hjungwoo01"},"content":" layout: default.md","lastModifiedDate":"2024-03-07"},{"lineNumber":3,"author":{"gitId":"hjungwoo01"},"content":" title: \"Jay Hong\u0027s Project Portfolio Page\"","lastModifiedDate":"2024-03-07"},{"lineNumber":4,"author":{"gitId":"hjungwoo01"},"content":"---","lastModifiedDate":"2024-03-07"},{"lineNumber":5,"author":{"gitId":"hjungwoo01"},"content":"","lastModifiedDate":"2024-03-07"},{"lineNumber":6,"author":{"gitId":"hjungwoo01"},"content":"### Project: AddressBook Level 3","lastModifiedDate":"2024-03-07"},{"lineNumber":7,"author":{"gitId":"hjungwoo01"},"content":"","lastModifiedDate":"2024-03-07"},{"lineNumber":8,"author":{"gitId":"hjungwoo01"},"content":"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.","lastModifiedDate":"2024-03-07"},{"lineNumber":9,"author":{"gitId":"hjungwoo01"},"content":"","lastModifiedDate":"2024-03-07"},{"lineNumber":10,"author":{"gitId":"hjungwoo01"},"content":"Given below are my contributions to the project.","lastModifiedDate":"2024-03-07"},{"lineNumber":11,"author":{"gitId":"hjungwoo01"},"content":"","lastModifiedDate":"2024-03-07"},{"lineNumber":12,"author":{"gitId":"hjungwoo01"},"content":"* **New Feature**: Updated Developer Guide","lastModifiedDate":"2024-03-07"},{"lineNumber":13,"author":{"gitId":"hjungwoo01"},"content":"","lastModifiedDate":"2024-03-07"},{"lineNumber":14,"author":{"gitId":"hjungwoo01"},"content":"* **Code contributed**: [RepoSense link]()","lastModifiedDate":"2024-03-07"},{"lineNumber":15,"author":{"gitId":"hjungwoo01"},"content":"","lastModifiedDate":"2024-03-07"},{"lineNumber":16,"author":{"gitId":"hjungwoo01"},"content":"* **Project management**:","lastModifiedDate":"2024-03-07"},{"lineNumber":17,"author":{"gitId":"hjungwoo01"},"content":" * Managed releases `v1.3` - `v1.5rc` (3 releases) on GitHub","lastModifiedDate":"2024-03-07"},{"lineNumber":18,"author":{"gitId":"hjungwoo01"},"content":"","lastModifiedDate":"2024-03-07"},{"lineNumber":19,"author":{"gitId":"hjungwoo01"},"content":"* **Enhancements to existing features**:","lastModifiedDate":"2024-03-07"},{"lineNumber":20,"author":{"gitId":"hjungwoo01"},"content":" * Work in progress","lastModifiedDate":"2024-03-07"},{"lineNumber":21,"author":{"gitId":"hjungwoo01"},"content":"","lastModifiedDate":"2024-03-07"},{"lineNumber":22,"author":{"gitId":"hjungwoo01"},"content":"* **Documentation**:","lastModifiedDate":"2024-03-07"},{"lineNumber":23,"author":{"gitId":"hjungwoo01"},"content":" * User Guide:","lastModifiedDate":"2024-03-07"},{"lineNumber":24,"author":{"gitId":"hjungwoo01"},"content":" * Work in progress","lastModifiedDate":"2024-03-07"},{"lineNumber":25,"author":{"gitId":"hjungwoo01"},"content":" * Developer Guide:","lastModifiedDate":"2024-03-07"},{"lineNumber":26,"author":{"gitId":"hjungwoo01"},"content":" * Work in progress","lastModifiedDate":"2024-03-07"}],"authorContributionMap":{"hjungwoo01":26}},{"path":"docs/team/priyanshbimbisariye.md","fileType":"docs","lines":[{"lineNumber":1,"author":{"gitId":"PyromancerBoom"},"content":"---","lastModifiedDate":"2024-03-07"},{"lineNumber":2,"author":{"gitId":"PyromancerBoom"},"content":" layout: default.md","lastModifiedDate":"2024-03-07"},{"lineNumber":3,"author":{"gitId":"PyromancerBoom"},"content":" title: \"Priyansh Bimbisariye\u0027s Project Portfolio Page\"","lastModifiedDate":"2024-03-07"},{"lineNumber":4,"author":{"gitId":"PyromancerBoom"},"content":"---","lastModifiedDate":"2024-03-07"},{"lineNumber":5,"author":{"gitId":"PyromancerBoom"},"content":"","lastModifiedDate":"2024-03-07"},{"lineNumber":6,"author":{"gitId":"PyromancerBoom"},"content":"### Project: AddressBook Level 3","lastModifiedDate":"2024-03-07"},{"lineNumber":7,"author":{"gitId":"PyromancerBoom"},"content":"","lastModifiedDate":"2024-03-07"},{"lineNumber":8,"author":{"gitId":"PyromancerBoom"},"content":"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.","lastModifiedDate":"2024-03-07"},{"lineNumber":9,"author":{"gitId":"PyromancerBoom"},"content":"","lastModifiedDate":"2024-03-07"},{"lineNumber":10,"author":{"gitId":"PyromancerBoom"},"content":"Given below are my contributions to the project.","lastModifiedDate":"2024-03-07"},{"lineNumber":11,"author":{"gitId":"PyromancerBoom"},"content":"","lastModifiedDate":"2024-03-07"},{"lineNumber":12,"author":{"gitId":"PyromancerBoom"},"content":"- **New Feature**: something","lastModifiedDate":"2024-03-07"},{"lineNumber":13,"author":{"gitId":"PyromancerBoom"},"content":"","lastModifiedDate":"2024-03-07"},{"lineNumber":14,"author":{"gitId":"PyromancerBoom"},"content":"- **Code contributed**: [RepoSense link]()","lastModifiedDate":"2024-03-07"},{"lineNumber":15,"author":{"gitId":"PyromancerBoom"},"content":"","lastModifiedDate":"2024-03-07"},{"lineNumber":16,"author":{"gitId":"PyromancerBoom"},"content":"- **Project management**:","lastModifiedDate":"2024-03-07"},{"lineNumber":17,"author":{"gitId":"PyromancerBoom"},"content":"","lastModifiedDate":"2024-03-07"},{"lineNumber":18,"author":{"gitId":"PyromancerBoom"},"content":" - Managed releases `v1.3` - `v1.5rc` (3 releases) on GitHub","lastModifiedDate":"2024-03-07"},{"lineNumber":19,"author":{"gitId":"PyromancerBoom"},"content":"","lastModifiedDate":"2024-03-07"},{"lineNumber":20,"author":{"gitId":"PyromancerBoom"},"content":"- **Enhancements to existing features**:","lastModifiedDate":"2024-03-07"},{"lineNumber":21,"author":{"gitId":"PyromancerBoom"},"content":"","lastModifiedDate":"2024-03-07"},{"lineNumber":22,"author":{"gitId":"PyromancerBoom"},"content":" - Work in progress","lastModifiedDate":"2024-03-07"},{"lineNumber":23,"author":{"gitId":"PyromancerBoom"},"content":"","lastModifiedDate":"2024-03-07"},{"lineNumber":24,"author":{"gitId":"PyromancerBoom"},"content":"- **Documentation**:","lastModifiedDate":"2024-03-07"},{"lineNumber":25,"author":{"gitId":"PyromancerBoom"},"content":" - User Guide:","lastModifiedDate":"2024-03-07"},{"lineNumber":26,"author":{"gitId":"PyromancerBoom"},"content":" - Work in progress","lastModifiedDate":"2024-03-07"},{"lineNumber":27,"author":{"gitId":"PyromancerBoom"},"content":" - Developer Guide:","lastModifiedDate":"2024-03-07"},{"lineNumber":28,"author":{"gitId":"PyromancerBoom"},"content":" - Work in progress","lastModifiedDate":"2024-03-07"}],"authorContributionMap":{"PyromancerBoom":28}},{"path":"docs/team/quelinxiao.md","fileType":"docs","lines":[{"lineNumber":1,"author":{"gitId":"quelinxiao"},"content":"---","lastModifiedDate":"2024-03-07"},{"lineNumber":2,"author":{"gitId":"quelinxiao"},"content":" layout: default.md","lastModifiedDate":"2024-03-07"},{"lineNumber":3,"author":{"gitId":"quelinxiao"},"content":" title: \"Que Linxiao\u0027s Project Portfolio Page\"","lastModifiedDate":"2024-03-07"},{"lineNumber":4,"author":{"gitId":"quelinxiao"},"content":"---","lastModifiedDate":"2024-03-07"},{"lineNumber":5,"author":{"gitId":"quelinxiao"},"content":"","lastModifiedDate":"2024-03-07"},{"lineNumber":6,"author":{"gitId":"quelinxiao"},"content":"### Project: AddressBook Level 3","lastModifiedDate":"2024-03-07"},{"lineNumber":7,"author":{"gitId":"quelinxiao"},"content":"","lastModifiedDate":"2024-03-07"},{"lineNumber":8,"author":{"gitId":"quelinxiao"},"content":"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.","lastModifiedDate":"2024-03-07"},{"lineNumber":9,"author":{"gitId":"quelinxiao"},"content":"","lastModifiedDate":"2024-03-07"},{"lineNumber":10,"author":{"gitId":"quelinxiao"},"content":"Given below are my contributions to the project.","lastModifiedDate":"2024-03-07"},{"lineNumber":11,"author":{"gitId":"quelinxiao"},"content":"","lastModifiedDate":"2024-03-07"},{"lineNumber":12,"author":{"gitId":"quelinxiao"},"content":"* **New Feature**: Added the ability to undo/redo previous commands.","lastModifiedDate":"2024-03-07"},{"lineNumber":13,"author":{"gitId":"quelinxiao"},"content":" * 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.","lastModifiedDate":"2024-03-07"},{"lineNumber":14,"author":{"gitId":"quelinxiao"},"content":" * 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.","lastModifiedDate":"2024-03-07"},{"lineNumber":15,"author":{"gitId":"quelinxiao"},"content":" * 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.","lastModifiedDate":"2024-03-07"},{"lineNumber":16,"author":{"gitId":"quelinxiao"},"content":" * 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}*","lastModifiedDate":"2024-03-07"},{"lineNumber":17,"author":{"gitId":"quelinxiao"},"content":"","lastModifiedDate":"2024-03-07"},{"lineNumber":18,"author":{"gitId":"quelinxiao"},"content":"* **New Feature**: Added a history command that allows the user to navigate to previous commands using up/down keys.","lastModifiedDate":"2024-03-07"},{"lineNumber":19,"author":{"gitId":"quelinxiao"},"content":"","lastModifiedDate":"2024-03-07"},{"lineNumber":20,"author":{"gitId":"quelinxiao"},"content":"* **Code contributed**: [RepoSense link]()","lastModifiedDate":"2024-03-07"},{"lineNumber":21,"author":{"gitId":"quelinxiao"},"content":"","lastModifiedDate":"2024-03-07"},{"lineNumber":22,"author":{"gitId":"quelinxiao"},"content":"* **Project management**:","lastModifiedDate":"2024-03-07"},{"lineNumber":23,"author":{"gitId":"quelinxiao"},"content":" * Managed releases `v1.3` - `v1.5rc` (3 releases) on GitHub","lastModifiedDate":"2024-03-07"},{"lineNumber":24,"author":{"gitId":"quelinxiao"},"content":"","lastModifiedDate":"2024-03-07"},{"lineNumber":25,"author":{"gitId":"quelinxiao"},"content":"* **Enhancements to existing features**:","lastModifiedDate":"2024-03-07"},{"lineNumber":26,"author":{"gitId":"quelinxiao"},"content":" * Updated the GUI color scheme (Pull requests [\\#33](), [\\#34]())","lastModifiedDate":"2024-03-07"},{"lineNumber":27,"author":{"gitId":"quelinxiao"},"content":" * Wrote additional tests for existing features to increase coverage from 88% to 92% (Pull requests [\\#36](), [\\#38]())","lastModifiedDate":"2024-03-07"},{"lineNumber":28,"author":{"gitId":"quelinxiao"},"content":"","lastModifiedDate":"2024-03-07"},{"lineNumber":29,"author":{"gitId":"quelinxiao"},"content":"* **Documentation**:","lastModifiedDate":"2024-03-07"},{"lineNumber":30,"author":{"gitId":"quelinxiao"},"content":" * User Guide:","lastModifiedDate":"2024-03-07"},{"lineNumber":31,"author":{"gitId":"quelinxiao"},"content":" * Added documentation for the features `delete` and `find` [\\#72]()","lastModifiedDate":"2024-03-07"},{"lineNumber":32,"author":{"gitId":"quelinxiao"},"content":" * Did cosmetic tweaks to existing documentation of features `clear`, `exit`: [\\#74]()","lastModifiedDate":"2024-03-07"},{"lineNumber":33,"author":{"gitId":"quelinxiao"},"content":" * Developer Guide:","lastModifiedDate":"2024-03-07"},{"lineNumber":34,"author":{"gitId":"quelinxiao"},"content":" * Added implementation details of the `delete` feature.","lastModifiedDate":"2024-03-07"},{"lineNumber":35,"author":{"gitId":"quelinxiao"},"content":"","lastModifiedDate":"2024-03-07"},{"lineNumber":36,"author":{"gitId":"quelinxiao"},"content":"* **Community**:","lastModifiedDate":"2024-03-07"},{"lineNumber":37,"author":{"gitId":"quelinxiao"},"content":" * PRs reviewed (with non-trivial review comments): [\\#12](), [\\#32](), [\\#19](), [\\#42]()","lastModifiedDate":"2024-03-07"},{"lineNumber":38,"author":{"gitId":"quelinxiao"},"content":" * Contributed to forum discussions (examples: [1](), [2](), [3](), [4]())","lastModifiedDate":"2024-03-07"},{"lineNumber":39,"author":{"gitId":"quelinxiao"},"content":" * Reported bugs and suggestions for other teams in the class (examples: [1](), [2](), [3]())","lastModifiedDate":"2024-03-07"},{"lineNumber":40,"author":{"gitId":"quelinxiao"},"content":" * Some parts of the history feature I added was adopted by several other class mates ([1](), [2]())","lastModifiedDate":"2024-03-07"},{"lineNumber":41,"author":{"gitId":"quelinxiao"},"content":"","lastModifiedDate":"2024-03-07"},{"lineNumber":42,"author":{"gitId":"quelinxiao"},"content":"* **Tools**:","lastModifiedDate":"2024-03-07"},{"lineNumber":43,"author":{"gitId":"quelinxiao"},"content":" * Integrated a third party library (Natty) to the project ([\\#42]())","lastModifiedDate":"2024-03-07"},{"lineNumber":44,"author":{"gitId":"quelinxiao"},"content":" * Integrated a new Github plugin (CircleCI) to the team repo","lastModifiedDate":"2024-03-07"},{"lineNumber":45,"author":{"gitId":"quelinxiao"},"content":"","lastModifiedDate":"2024-03-07"},{"lineNumber":46,"author":{"gitId":"quelinxiao"},"content":"* _{you can add/remove categories in the list above}_","lastModifiedDate":"2024-03-07"}],"authorContributionMap":{"quelinxiao":46}},{"path":"docs/team/shayaansultan.md","fileType":"docs","lines":[{"lineNumber":1,"author":{"gitId":"shayaansultan"},"content":"---","lastModifiedDate":"2024-03-07"},{"lineNumber":2,"author":{"gitId":"shayaansultan"},"content":" layout: default.md","lastModifiedDate":"2024-03-07"},{"lineNumber":3,"author":{"gitId":"shayaansultan"},"content":" title: \"Shayaan Sultan\u0027s Project Portfolio Page\"","lastModifiedDate":"2024-03-07"},{"lineNumber":4,"author":{"gitId":"shayaansultan"},"content":"---","lastModifiedDate":"2024-03-07"},{"lineNumber":5,"author":{"gitId":"shayaansultan"},"content":"","lastModifiedDate":"2024-03-07"},{"lineNumber":6,"author":{"gitId":"shayaansultan"},"content":"### Project: AddressBook Level 3","lastModifiedDate":"2024-03-07"},{"lineNumber":7,"author":{"gitId":"shayaansultan"},"content":"","lastModifiedDate":"2024-03-07"},{"lineNumber":8,"author":{"gitId":"shayaansultan"},"content":"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.","lastModifiedDate":"2024-03-07"},{"lineNumber":9,"author":{"gitId":"shayaansultan"},"content":"","lastModifiedDate":"2024-03-07"},{"lineNumber":10,"author":{"gitId":"shayaansultan"},"content":"Given below are my contributions to the project.","lastModifiedDate":"2024-03-07"},{"lineNumber":11,"author":{"gitId":"shayaansultan"},"content":"","lastModifiedDate":"2024-03-07"},{"lineNumber":12,"author":{"gitId":"shayaansultan"},"content":"* **New Feature**: Updated AboutUs and incharge of documentation","lastModifiedDate":"2024-03-07"},{"lineNumber":13,"author":{"gitId":"shayaansultan"},"content":"","lastModifiedDate":"2024-03-07"},{"lineNumber":14,"author":{"gitId":"shayaansultan"},"content":"* **Code contributed**: [RepoSense link]()","lastModifiedDate":"2024-03-07"},{"lineNumber":15,"author":{"gitId":"shayaansultan"},"content":"","lastModifiedDate":"2024-03-07"},{"lineNumber":16,"author":{"gitId":"shayaansultan"},"content":"* **Project management**:","lastModifiedDate":"2024-03-07"},{"lineNumber":17,"author":{"gitId":"shayaansultan"},"content":" * Managed releases `v1.3` - `v1.5rc` (3 releases) on GitHub","lastModifiedDate":"2024-03-07"},{"lineNumber":18,"author":{"gitId":"shayaansultan"},"content":"","lastModifiedDate":"2024-03-07"},{"lineNumber":19,"author":{"gitId":"shayaansultan"},"content":"* **Enhancements to existing features**:","lastModifiedDate":"2024-03-07"},{"lineNumber":20,"author":{"gitId":"shayaansultan"},"content":" * Work in progress","lastModifiedDate":"2024-03-07"},{"lineNumber":21,"author":{"gitId":"shayaansultan"},"content":"","lastModifiedDate":"2024-03-07"},{"lineNumber":22,"author":{"gitId":"shayaansultan"},"content":"* **Documentation**:","lastModifiedDate":"2024-03-07"},{"lineNumber":23,"author":{"gitId":"shayaansultan"},"content":" * User Guide:","lastModifiedDate":"2024-03-07"},{"lineNumber":24,"author":{"gitId":"shayaansultan"},"content":" * Work in progress","lastModifiedDate":"2024-03-07"},{"lineNumber":25,"author":{"gitId":"shayaansultan"},"content":" * Developer Guide:","lastModifiedDate":"2024-03-07"},{"lineNumber":26,"author":{"gitId":"shayaansultan"},"content":" * Work in progress","lastModifiedDate":"2024-03-07"}],"authorContributionMap":{"shayaansultan":26}}] +[{"path":"README.md","fileType":"docs","lines":[{"lineNumber":1,"author":{"gitId":"PyromancerBoom"},"content":"[![Java CI](https://github.com/AY2324S2-CS2103T-T17-2/tp/actions/workflows/gradle.yml/badge.svg?branch\u003dmaster)](https://github.com/AY2324S2-CS2103T-T17-2/tp/actions/workflows/gradle.yml)","lastModifiedDate":"2024-03-07"},{"lineNumber":2,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":3,"author":{"gitId":"-"},"content":"![Ui](docs/images/Ui.png)","lastModifiedDate":"2020-05-23"},{"lineNumber":4,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":5,"author":{"gitId":"PyromancerBoom"},"content":"## ContactSwift","lastModifiedDate":"2024-03-07"},{"lineNumber":6,"author":{"gitId":"PyromancerBoom"},"content":"","lastModifiedDate":"2024-03-07"},{"lineNumber":7,"author":{"gitId":"PyromancerBoom"},"content":"ContactSwift is an efficient and intuitive contact management software designed for small-scale business owners like John Doe, founder and CEO of DoeInnovationsTech. With ContactSwift, users can:","lastModifiedDate":"2024-03-07"},{"lineNumber":8,"author":{"gitId":"PyromancerBoom"},"content":"","lastModifiedDate":"2024-03-07"},{"lineNumber":9,"author":{"gitId":"PyromancerBoom"},"content":"- Effortlessly manage their employees\u0027 contact details","lastModifiedDate":"2024-03-07"},{"lineNumber":10,"author":{"gitId":"PyromancerBoom"},"content":"- Streamline communication","lastModifiedDate":"2024-03-07"},{"lineNumber":11,"author":{"gitId":"PyromancerBoom"},"content":"- Maintain an organized address book","lastModifiedDate":"2024-03-07"},{"lineNumber":12,"author":{"gitId":"PyromancerBoom"},"content":"- Enjoy lightning-fast speed and cross-platform compatibility","lastModifiedDate":"2024-03-07"},{"lineNumber":13,"author":{"gitId":"PyromancerBoom"},"content":"","lastModifiedDate":"2024-03-07"},{"lineNumber":14,"author":{"gitId":"PyromancerBoom"},"content":"### Installation","lastModifiedDate":"2024-03-07"},{"lineNumber":15,"author":{"gitId":"PyromancerBoom"},"content":"","lastModifiedDate":"2024-03-07"},{"lineNumber":16,"author":{"gitId":"PyromancerBoom"},"content":"- ContactSwift will be available soon for download at [ContactSwift](https://ay2324s2-cs2103t-t17-2.github.io/tp/).","lastModifiedDate":"2024-03-07"},{"lineNumber":17,"author":{"gitId":"PyromancerBoom"},"content":"- Run the JAR file on any compatible operating system by double-clicking it or using the command line: `java -jar ContactSwift.jar`","lastModifiedDate":"2024-03-07"},{"lineNumber":18,"author":{"gitId":"PyromancerBoom"},"content":"","lastModifiedDate":"2024-03-07"},{"lineNumber":19,"author":{"gitId":"PyromancerBoom"},"content":"### Features","lastModifiedDate":"2024-03-07"},{"lineNumber":20,"author":{"gitId":"PyromancerBoom"},"content":"","lastModifiedDate":"2024-03-07"},{"lineNumber":21,"author":{"gitId":"PyromancerBoom"},"content":"1. **Quick Contact Addition**: Quickly add new contacts with a unique ID for easy reference.","lastModifiedDate":"2024-03-07"},{"lineNumber":22,"author":{"gitId":"PyromancerBoom"},"content":"","lastModifiedDate":"2024-03-07"},{"lineNumber":23,"author":{"gitId":"PyromancerBoom"},"content":"Command format: `add contact /name John Doe /email john@example.com /number 1234567890`","lastModifiedDate":"2024-03-07"},{"lineNumber":24,"author":{"gitId":"PyromancerBoom"},"content":"","lastModifiedDate":"2024-03-07"},{"lineNumber":25,"author":{"gitId":"PyromancerBoom"},"content":"2. **Contact Deletion**: Easily delete unnecessary contacts to keep your address book organized.","lastModifiedDate":"2024-03-07"},{"lineNumber":26,"author":{"gitId":"PyromancerBoom"},"content":" Command format: `delete contact /id \u003ccontact_id\u003e`","lastModifiedDate":"2024-03-07"},{"lineNumber":27,"author":{"gitId":"PyromancerBoom"},"content":"","lastModifiedDate":"2024-03-07"},{"lineNumber":28,"author":{"gitId":"PyromancerBoom"},"content":"3. **Contact Information Storage**: Store detailed information about your contacts securely for easy reference. Information is stored locally to ensure privacy and security.","lastModifiedDate":"2024-03-07"},{"lineNumber":29,"author":{"gitId":"PyromancerBoom"},"content":"","lastModifiedDate":"2024-03-07"},{"lineNumber":30,"author":{"gitId":"PyromancerBoom"},"content":"4. **All Contacts List Display**: View a complete list of all your contacts in a user-friendly format.","lastModifiedDate":"2024-03-07"},{"lineNumber":31,"author":{"gitId":"PyromancerBoom"},"content":" Command format: `list all`","lastModifiedDate":"2024-03-07"},{"lineNumber":32,"author":{"gitId":"PyromancerBoom"},"content":"","lastModifiedDate":"2024-03-07"},{"lineNumber":33,"author":{"gitId":"PyromancerBoom"},"content":"---","lastModifiedDate":"2024-03-07"},{"lineNumber":34,"author":{"gitId":"PyromancerBoom"},"content":"","lastModifiedDate":"2024-03-07"},{"lineNumber":35,"author":{"gitId":"PyromancerBoom"},"content":"## Acknowledgements","lastModifiedDate":"2024-03-07"},{"lineNumber":36,"author":{"gitId":"PyromancerBoom"},"content":"","lastModifiedDate":"2024-03-07"},{"lineNumber":37,"author":{"gitId":"PyromancerBoom"},"content":"This project is based on the AddressBook-Level3 project created by the [SE-EDU initiative](https://se-education.org).","lastModifiedDate":"2024-03-07"}],"authorContributionMap":{"PyromancerBoom":34,"-":3}},{"path":"docs/AboutUs.md","fileType":"docs","lines":[{"lineNumber":1,"author":{"gitId":"-"},"content":"---","lastModifiedDate":"2020-05-23"},{"lineNumber":2,"author":{"gitId":"-"},"content":" layout: default.md","lastModifiedDate":"2023-09-12"},{"lineNumber":3,"author":{"gitId":"-"},"content":" title: \"About Us\"","lastModifiedDate":"2023-09-12"},{"lineNumber":4,"author":{"gitId":"-"},"content":"---","lastModifiedDate":"2020-05-23"},{"lineNumber":5,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":6,"author":{"gitId":"-"},"content":"# About Us","lastModifiedDate":"2023-09-12"},{"lineNumber":7,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2023-09-12"},{"lineNumber":8,"author":{"gitId":"-"},"content":"We are a team based in the [School of Computing, National University of Singapore](http://www.comp.nus.edu.sg).","lastModifiedDate":"2020-05-23"},{"lineNumber":9,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":10,"author":{"gitId":"-"},"content":"You can reach us at the email `seer[at]comp.nus.edu.sg`","lastModifiedDate":"2020-06-17"},{"lineNumber":11,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-06-17"},{"lineNumber":12,"author":{"gitId":"-"},"content":"## Project team","lastModifiedDate":"2020-06-07"},{"lineNumber":13,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":14,"author":{"gitId":"PyromancerBoom"},"content":"### Jay Hong","lastModifiedDate":"2024-03-07"},{"lineNumber":15,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":16,"author":{"gitId":"hjungwoo01"},"content":"\u003cimg src\u003d\"images/hjungwoo01.png\" width\u003d\"200px\"\u003e","lastModifiedDate":"2024-03-07"},{"lineNumber":17,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":18,"author":{"gitId":"hjungwoo01"},"content":"[[github](https://github.com/hjungwoo01)] [[portfolio](team/hjungwoo01.md)]","lastModifiedDate":"2024-03-07"},{"lineNumber":19,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":20,"author":{"gitId":"hjungwoo01"},"content":"- Role: Developer","lastModifiedDate":"2024-03-07"},{"lineNumber":21,"author":{"gitId":"hjungwoo01"},"content":"- Responsibilities: Team lead, Integration, Deliverables and deadlines","lastModifiedDate":"2024-03-07"},{"lineNumber":22,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":23,"author":{"gitId":"PyromancerBoom"},"content":"### Priyansh Bimbisariye","lastModifiedDate":"2024-03-07"},{"lineNumber":24,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":25,"author":{"gitId":"PyromancerBoom"},"content":"\u003cimg src\u003d\"images/pyromancerboom.png\" width\u003d\"200px\"\u003e","lastModifiedDate":"2024-03-08"},{"lineNumber":26,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":27,"author":{"gitId":"PyromancerBoom"},"content":"[[github](https://github.com/PyromancerBoom)] [[portfolio](team/pyromancerboom.md)]","lastModifiedDate":"2024-03-08"},{"lineNumber":28,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":29,"author":{"gitId":"PyromancerBoom"},"content":"- Role: Developer","lastModifiedDate":"2024-03-07"},{"lineNumber":30,"author":{"gitId":"PyromancerBoom"},"content":"- Responsibilities: Scheduling and Tracking, Deliverables and deadlines","lastModifiedDate":"2024-03-07"},{"lineNumber":31,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":32,"author":{"gitId":"quelinxiao"},"content":"### Shayaan Sultan","lastModifiedDate":"2024-03-07"},{"lineNumber":33,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":34,"author":{"gitId":"quelinxiao"},"content":"\u003cimg src\u003d\"images/shayaansultan.png\" width\u003d\"200px\"\u003e","lastModifiedDate":"2024-03-07"},{"lineNumber":35,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":36,"author":{"gitId":"quelinxiao"},"content":"[[github](http://github.com/shayaansultan)] [[portfolio](team/shayaansultan.md)]","lastModifiedDate":"2024-03-07"},{"lineNumber":37,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":38,"author":{"gitId":"PyromancerBoom"},"content":"- Role: Developer","lastModifiedDate":"2024-03-07"},{"lineNumber":39,"author":{"gitId":"PyromancerBoom"},"content":"- Responsibilities: Documentation, Deliverables and deadlines","lastModifiedDate":"2024-03-07"},{"lineNumber":40,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":41,"author":{"gitId":"quelinxiao"},"content":"### Que Linxiao","lastModifiedDate":"2024-03-07"},{"lineNumber":42,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":43,"author":{"gitId":"quelinxiao"},"content":"\u003cimg src\u003d\"images/quelinxiao.png\" width\u003d\"200px\"\u003e","lastModifiedDate":"2024-03-07"},{"lineNumber":44,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":45,"author":{"gitId":"quelinxiao"},"content":"[[github](http://github.com/quelinxiao)] [[portfolio](team/quelinxiao.md)]","lastModifiedDate":"2024-03-07"},{"lineNumber":46,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":47,"author":{"gitId":"hjungwoo01"},"content":"- Role: Developer","lastModifiedDate":"2024-03-07"},{"lineNumber":48,"author":{"gitId":"hjungwoo01"},"content":"- Responsibilities: Testing, Deliverables and deadlines","lastModifiedDate":"2024-03-07"}],"authorContributionMap":{"PyromancerBoom":8,"quelinxiao":6,"hjungwoo01":6,"-":28}},{"path":"docs/DeveloperGuide.md","fileType":"docs","lines":[{"lineNumber":1,"author":{"gitId":"-"},"content":"---","lastModifiedDate":"2020-05-23"},{"lineNumber":2,"author":{"gitId":"-"},"content":" layout: default.md","lastModifiedDate":"2023-09-12"},{"lineNumber":3,"author":{"gitId":"-"},"content":" title: \"Developer Guide\"","lastModifiedDate":"2023-09-12"},{"lineNumber":4,"author":{"gitId":"-"},"content":" pageNav: 3","lastModifiedDate":"2023-09-12"},{"lineNumber":5,"author":{"gitId":"-"},"content":"---","lastModifiedDate":"2020-05-23"},{"lineNumber":6,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2023-09-12"},{"lineNumber":7,"author":{"gitId":"-"},"content":"# AB-3 Developer Guide","lastModifiedDate":"2023-09-12"},{"lineNumber":8,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2023-09-12"},{"lineNumber":9,"author":{"gitId":"-"},"content":"\u003c!-- * Table of Contents --\u003e","lastModifiedDate":"2023-09-12"},{"lineNumber":10,"author":{"gitId":"-"},"content":"\u003cpage-nav-print /\u003e","lastModifiedDate":"2023-09-12"},{"lineNumber":11,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":12,"author":{"gitId":"PyromancerBoom"},"content":"---","lastModifiedDate":"2024-03-07"},{"lineNumber":13,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2021-07-30"},{"lineNumber":14,"author":{"gitId":"-"},"content":"## **Acknowledgements**","lastModifiedDate":"2021-07-30"},{"lineNumber":15,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2021-07-30"},{"lineNumber":16,"author":{"gitId":"-"},"content":"_{ list here sources of all reused/adapted ideas, code, documentation, and third-party libraries -- include links to the original source as well }_","lastModifiedDate":"2023-09-12"},{"lineNumber":17,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2021-07-30"},{"lineNumber":18,"author":{"gitId":"PyromancerBoom"},"content":"---","lastModifiedDate":"2024-03-07"},{"lineNumber":19,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":20,"author":{"gitId":"-"},"content":"## **Setting up, getting started**","lastModifiedDate":"2020-05-23"},{"lineNumber":21,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":22,"author":{"gitId":"-"},"content":"Refer to the guide [_Setting up and getting started_](SettingUp.md).","lastModifiedDate":"2020-05-23"},{"lineNumber":23,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":24,"author":{"gitId":"PyromancerBoom"},"content":"---","lastModifiedDate":"2024-03-07"},{"lineNumber":25,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":26,"author":{"gitId":"-"},"content":"## **Design**","lastModifiedDate":"2020-05-23"},{"lineNumber":27,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":28,"author":{"gitId":"-"},"content":"### Architecture","lastModifiedDate":"2021-07-31"},{"lineNumber":29,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":30,"author":{"gitId":"-"},"content":"\u003cpuml src\u003d\"diagrams/ArchitectureDiagram.puml\" width\u003d\"280\" /\u003e","lastModifiedDate":"2023-09-12"},{"lineNumber":31,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":32,"author":{"gitId":"PyromancerBoom"},"content":"The **_Architecture Diagram_** given above explains the high-level design of the App.","lastModifiedDate":"2024-03-07"},{"lineNumber":33,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":34,"author":{"gitId":"-"},"content":"Given below is a quick overview of main components and how they interact with each other.","lastModifiedDate":"2021-07-31"},{"lineNumber":35,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2021-07-31"},{"lineNumber":36,"author":{"gitId":"-"},"content":"**Main components of the architecture**","lastModifiedDate":"2021-07-31"},{"lineNumber":37,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":38,"author":{"gitId":"-"},"content":"**`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.","lastModifiedDate":"2023-09-03"},{"lineNumber":39,"author":{"gitId":"PyromancerBoom"},"content":"","lastModifiedDate":"2024-03-07"},{"lineNumber":40,"author":{"gitId":"PyromancerBoom"},"content":"- At app launch, it initializes the other components in the correct sequence, and connects them up with each other.","lastModifiedDate":"2024-03-07"},{"lineNumber":41,"author":{"gitId":"PyromancerBoom"},"content":"- At shut down, it shuts down the other components and invokes cleanup methods where necessary.","lastModifiedDate":"2024-03-07"},{"lineNumber":42,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":43,"author":{"gitId":"-"},"content":"The bulk of the app\u0027s work is done by the following four components:","lastModifiedDate":"2023-09-03"},{"lineNumber":44,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":45,"author":{"gitId":"PyromancerBoom"},"content":"- [**`UI`**](#ui-component): The UI of the App.","lastModifiedDate":"2024-03-07"},{"lineNumber":46,"author":{"gitId":"PyromancerBoom"},"content":"- [**`Logic`**](#logic-component): The command executor.","lastModifiedDate":"2024-03-07"},{"lineNumber":47,"author":{"gitId":"PyromancerBoom"},"content":"- [**`Model`**](#model-component): Holds the data of the App in memory.","lastModifiedDate":"2024-03-07"},{"lineNumber":48,"author":{"gitId":"PyromancerBoom"},"content":"- [**`Storage`**](#storage-component): Reads data from, and writes data to, the hard disk.","lastModifiedDate":"2024-03-07"},{"lineNumber":49,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":50,"author":{"gitId":"-"},"content":"[**`Commons`**](#common-classes) represents a collection of classes used by multiple other components.","lastModifiedDate":"2023-09-03"},{"lineNumber":51,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":52,"author":{"gitId":"-"},"content":"**How the architecture components interact with each other**","lastModifiedDate":"2020-05-23"},{"lineNumber":53,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":54,"author":{"gitId":"PyromancerBoom"},"content":"The _Sequence Diagram_ below shows how the components interact with each other for the scenario where the user issues the command `delete 1`.","lastModifiedDate":"2024-03-07"},{"lineNumber":55,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":56,"author":{"gitId":"-"},"content":"\u003cpuml src\u003d\"diagrams/ArchitectureSequenceDiagram.puml\" width\u003d\"574\" /\u003e","lastModifiedDate":"2023-09-12"},{"lineNumber":57,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":58,"author":{"gitId":"-"},"content":"Each of the four main components (also shown in the diagram above),","lastModifiedDate":"2021-07-31"},{"lineNumber":59,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2021-07-31"},{"lineNumber":60,"author":{"gitId":"PyromancerBoom"},"content":"- defines its _API_ in an `interface` with the same name as the Component.","lastModifiedDate":"2024-03-07"},{"lineNumber":61,"author":{"gitId":"PyromancerBoom"},"content":"- implements its functionality using a concrete `{Component Name}Manager` class (which follows the corresponding API `interface` mentioned in the previous point.","lastModifiedDate":"2024-03-07"},{"lineNumber":62,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2021-07-31"},{"lineNumber":63,"author":{"gitId":"-"},"content":"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\u0027s being coupled to the implementation of a component), as illustrated in the (partial) class diagram below.","lastModifiedDate":"2021-07-31"},{"lineNumber":64,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2021-07-31"},{"lineNumber":65,"author":{"gitId":"-"},"content":"\u003cpuml src\u003d\"diagrams/ComponentManagers.puml\" width\u003d\"300\" /\u003e","lastModifiedDate":"2023-09-12"},{"lineNumber":66,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2021-07-31"},{"lineNumber":67,"author":{"gitId":"-"},"content":"The sections below give more details of each component.","lastModifiedDate":"2020-05-23"},{"lineNumber":68,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":69,"author":{"gitId":"-"},"content":"### UI component","lastModifiedDate":"2020-05-23"},{"lineNumber":70,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":71,"author":{"gitId":"-"},"content":"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)","lastModifiedDate":"2021-07-31"},{"lineNumber":72,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":73,"author":{"gitId":"-"},"content":"\u003cpuml src\u003d\"diagrams/UiClassDiagram.puml\" alt\u003d\"Structure of the UI Component\"/\u003e","lastModifiedDate":"2023-09-12"},{"lineNumber":74,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":75,"author":{"gitId":"-"},"content":"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.","lastModifiedDate":"2021-07-31"},{"lineNumber":76,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":77,"author":{"gitId":"-"},"content":"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)","lastModifiedDate":"2021-07-31"},{"lineNumber":78,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":79,"author":{"gitId":"-"},"content":"The `UI` component,","lastModifiedDate":"2020-05-23"},{"lineNumber":80,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":81,"author":{"gitId":"PyromancerBoom"},"content":"- executes user commands using the `Logic` component.","lastModifiedDate":"2024-03-07"},{"lineNumber":82,"author":{"gitId":"PyromancerBoom"},"content":"- listens for changes to `Model` data so that the UI can be updated with the modified data.","lastModifiedDate":"2024-03-07"},{"lineNumber":83,"author":{"gitId":"PyromancerBoom"},"content":"- keeps a reference to the `Logic` component, because the `UI` relies on the `Logic` to execute commands.","lastModifiedDate":"2024-03-07"},{"lineNumber":84,"author":{"gitId":"PyromancerBoom"},"content":"- depends on some classes in the `Model` component, as it displays `Person` object residing in the `Model`.","lastModifiedDate":"2024-03-07"},{"lineNumber":85,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":86,"author":{"gitId":"-"},"content":"### Logic component","lastModifiedDate":"2020-05-23"},{"lineNumber":87,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":88,"author":{"gitId":"-"},"content":"**API** : [`Logic.java`](https://github.com/se-edu/addressbook-level3/tree/master/src/main/java/seedu/address/logic/Logic.java)","lastModifiedDate":"2021-07-31"},{"lineNumber":89,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":90,"author":{"gitId":"-"},"content":"Here\u0027s a (partial) class diagram of the `Logic` component:","lastModifiedDate":"2021-07-31"},{"lineNumber":91,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":92,"author":{"gitId":"-"},"content":"\u003cpuml src\u003d\"diagrams/LogicClassDiagram.puml\" width\u003d\"550\"/\u003e","lastModifiedDate":"2023-09-12"},{"lineNumber":93,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":94,"author":{"gitId":"-"},"content":"The sequence diagram below illustrates the interactions within the `Logic` component, taking `execute(\"delete 1\")` API call as an example.","lastModifiedDate":"2023-09-03"},{"lineNumber":95,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":96,"author":{"gitId":"-"},"content":"\u003cpuml src\u003d\"diagrams/DeleteSequenceDiagram.puml\" alt\u003d\"Interactions Inside the Logic Component for the `delete 1` Command\" /\u003e","lastModifiedDate":"2023-09-12"},{"lineNumber":97,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2023-09-12"},{"lineNumber":98,"author":{"gitId":"-"},"content":"\u003cbox type\u003d\"info\" seamless\u003e","lastModifiedDate":"2023-09-12"},{"lineNumber":99,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":100,"author":{"gitId":"-"},"content":"**Note:** The lifeline for `DeleteCommandParser` should end at the destroy marker (X) but due to a limitation of PlantUML, the lifeline continues till the end of diagram.","lastModifiedDate":"2023-09-12"},{"lineNumber":101,"author":{"gitId":"-"},"content":"\u003c/box\u003e","lastModifiedDate":"2023-09-12"},{"lineNumber":102,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":103,"author":{"gitId":"-"},"content":"How the `Logic` component works:","lastModifiedDate":"2023-09-03"},{"lineNumber":104,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2023-09-03"},{"lineNumber":105,"author":{"gitId":"-"},"content":"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.","lastModifiedDate":"2023-09-03"},{"lineNumber":106,"author":{"gitId":"-"},"content":"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`.","lastModifiedDate":"2023-09-03"},{"lineNumber":107,"author":{"gitId":"-"},"content":"1. The command can communicate with the `Model` when it is executed (e.g. to delete a person).\u003cbr\u003e","lastModifiedDate":"2024-02-09"},{"lineNumber":108,"author":{"gitId":"-"},"content":" Note that although this is shown as a single step in the diagram above (for simplicity), in the code it can take several interactions (between the command object and the `Model`) to achieve.","lastModifiedDate":"2024-02-09"},{"lineNumber":109,"author":{"gitId":"-"},"content":"1. The result of the command execution is encapsulated as a `CommandResult` object which is returned back from `Logic`.","lastModifiedDate":"2023-09-03"},{"lineNumber":110,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2023-09-03"},{"lineNumber":111,"author":{"gitId":"-"},"content":"Here are the other classes in `Logic` (omitted from the class diagram above) that are used for parsing a user command:","lastModifiedDate":"2021-07-31"},{"lineNumber":112,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2021-07-31"},{"lineNumber":113,"author":{"gitId":"-"},"content":"\u003cpuml src\u003d\"diagrams/ParserClasses.puml\" width\u003d\"600\"/\u003e","lastModifiedDate":"2023-09-12"},{"lineNumber":114,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":115,"author":{"gitId":"-"},"content":"How the parsing works:","lastModifiedDate":"2021-07-31"},{"lineNumber":116,"author":{"gitId":"PyromancerBoom"},"content":"","lastModifiedDate":"2024-03-07"},{"lineNumber":117,"author":{"gitId":"PyromancerBoom"},"content":"- 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.","lastModifiedDate":"2024-03-07"},{"lineNumber":118,"author":{"gitId":"PyromancerBoom"},"content":"- 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.","lastModifiedDate":"2024-03-07"},{"lineNumber":119,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":120,"author":{"gitId":"-"},"content":"### Model component","lastModifiedDate":"2021-07-31"},{"lineNumber":121,"author":{"gitId":"PyromancerBoom"},"content":"","lastModifiedDate":"2024-03-07"},{"lineNumber":122,"author":{"gitId":"-"},"content":"**API** : [`Model.java`](https://github.com/se-edu/addressbook-level3/tree/master/src/main/java/seedu/address/model/Model.java)","lastModifiedDate":"2020-05-23"},{"lineNumber":123,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":124,"author":{"gitId":"-"},"content":"\u003cpuml src\u003d\"diagrams/ModelClassDiagram.puml\" width\u003d\"450\" /\u003e","lastModifiedDate":"2023-09-12"},{"lineNumber":125,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":126,"author":{"gitId":"-"},"content":"The `Model` component,","lastModifiedDate":"2021-07-31"},{"lineNumber":127,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":128,"author":{"gitId":"PyromancerBoom"},"content":"- stores the address book data i.e., all `Person` objects (which are contained in a `UniquePersonList` object).","lastModifiedDate":"2024-03-07"},{"lineNumber":129,"author":{"gitId":"PyromancerBoom"},"content":"- stores the currently \u0027selected\u0027 `Person` objects (e.g., results of a search query) as a separate _filtered_ list which is exposed to outsiders as an unmodifiable `ObservableList\u003cPerson\u003e` that can be \u0027observed\u0027 e.g. the UI can be bound to this list so that the UI automatically updates when the data in the list change.","lastModifiedDate":"2024-03-07"},{"lineNumber":130,"author":{"gitId":"PyromancerBoom"},"content":"- stores a `UserPref` object that represents the user’s preferences. This is exposed to the outside as a `ReadOnlyUserPref` objects.","lastModifiedDate":"2024-03-07"},{"lineNumber":131,"author":{"gitId":"PyromancerBoom"},"content":"- 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)","lastModifiedDate":"2024-03-07"},{"lineNumber":132,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2021-07-31"},{"lineNumber":133,"author":{"gitId":"-"},"content":"\u003cbox type\u003d\"info\" seamless\u003e","lastModifiedDate":"2023-09-12"},{"lineNumber":134,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2023-09-12"},{"lineNumber":135,"author":{"gitId":"-"},"content":"**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.\u003cbr\u003e","lastModifiedDate":"2023-09-12"},{"lineNumber":136,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2021-07-31"},{"lineNumber":137,"author":{"gitId":"-"},"content":"\u003cpuml src\u003d\"diagrams/BetterModelClassDiagram.puml\" width\u003d\"450\" /\u003e","lastModifiedDate":"2023-09-12"},{"lineNumber":138,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":139,"author":{"gitId":"-"},"content":"\u003c/box\u003e","lastModifiedDate":"2023-09-12"},{"lineNumber":140,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":141,"author":{"gitId":"-"},"content":"### Storage component","lastModifiedDate":"2020-05-23"},{"lineNumber":142,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":143,"author":{"gitId":"-"},"content":"**API** : [`Storage.java`](https://github.com/se-edu/addressbook-level3/tree/master/src/main/java/seedu/address/storage/Storage.java)","lastModifiedDate":"2020-05-23"},{"lineNumber":144,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":145,"author":{"gitId":"-"},"content":"\u003cpuml src\u003d\"diagrams/StorageClassDiagram.puml\" width\u003d\"550\" /\u003e","lastModifiedDate":"2023-09-12"},{"lineNumber":146,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2021-07-31"},{"lineNumber":147,"author":{"gitId":"-"},"content":"The `Storage` component,","lastModifiedDate":"2020-05-23"},{"lineNumber":148,"author":{"gitId":"PyromancerBoom"},"content":"","lastModifiedDate":"2024-03-07"},{"lineNumber":149,"author":{"gitId":"PyromancerBoom"},"content":"- can save both address book data and user preference data in JSON format, and read them back into corresponding objects.","lastModifiedDate":"2024-03-07"},{"lineNumber":150,"author":{"gitId":"PyromancerBoom"},"content":"- inherits from both `AddressBookStorage` and `UserPrefStorage`, which means it can be treated as either one (if only the functionality of only one is needed).","lastModifiedDate":"2024-03-07"},{"lineNumber":151,"author":{"gitId":"PyromancerBoom"},"content":"- depends on some classes in the `Model` component (because the `Storage` component\u0027s job is to save/retrieve objects that belong to the `Model`)","lastModifiedDate":"2024-03-07"},{"lineNumber":152,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":153,"author":{"gitId":"-"},"content":"### Common classes","lastModifiedDate":"2020-05-23"},{"lineNumber":154,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":155,"author":{"gitId":"-"},"content":"Classes used by multiple components are in the `seedu.addressbook.commons` package.","lastModifiedDate":"2020-05-23"},{"lineNumber":156,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":157,"author":{"gitId":"PyromancerBoom"},"content":"---","lastModifiedDate":"2024-03-07"},{"lineNumber":158,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":159,"author":{"gitId":"-"},"content":"## **Implementation**","lastModifiedDate":"2020-05-23"},{"lineNumber":160,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":161,"author":{"gitId":"-"},"content":"This section describes some noteworthy details on how certain features are implemented.","lastModifiedDate":"2020-05-23"},{"lineNumber":162,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":163,"author":{"gitId":"-"},"content":"### \\[Proposed\\] Undo/redo feature","lastModifiedDate":"2020-06-07"},{"lineNumber":164,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":165,"author":{"gitId":"-"},"content":"#### Proposed Implementation","lastModifiedDate":"2020-05-23"},{"lineNumber":166,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":167,"author":{"gitId":"-"},"content":"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:","lastModifiedDate":"2020-05-23"},{"lineNumber":168,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":169,"author":{"gitId":"PyromancerBoom"},"content":"- `VersionedAddressBook#commit()` — Saves the current address book state in its history.","lastModifiedDate":"2024-03-07"},{"lineNumber":170,"author":{"gitId":"PyromancerBoom"},"content":"- `VersionedAddressBook#undo()` — Restores the previous address book state from its history.","lastModifiedDate":"2024-03-07"},{"lineNumber":171,"author":{"gitId":"PyromancerBoom"},"content":"- `VersionedAddressBook#redo()` — Restores a previously undone address book state from its history.","lastModifiedDate":"2024-03-07"},{"lineNumber":172,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":173,"author":{"gitId":"-"},"content":"These operations are exposed in the `Model` interface as `Model#commitAddressBook()`, `Model#undoAddressBook()` and `Model#redoAddressBook()` respectively.","lastModifiedDate":"2020-05-23"},{"lineNumber":174,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":175,"author":{"gitId":"-"},"content":"Given below is an example usage scenario and how the undo/redo mechanism behaves at each step.","lastModifiedDate":"2020-05-23"},{"lineNumber":176,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":177,"author":{"gitId":"-"},"content":"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.","lastModifiedDate":"2020-05-23"},{"lineNumber":178,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":179,"author":{"gitId":"-"},"content":"\u003cpuml src\u003d\"diagrams/UndoRedoState0.puml\" alt\u003d\"UndoRedoState0\" /\u003e","lastModifiedDate":"2023-09-12"},{"lineNumber":180,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":181,"author":{"gitId":"-"},"content":"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.","lastModifiedDate":"2020-05-23"},{"lineNumber":182,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":183,"author":{"gitId":"-"},"content":"\u003cpuml src\u003d\"diagrams/UndoRedoState1.puml\" alt\u003d\"UndoRedoState1\" /\u003e","lastModifiedDate":"2023-09-12"},{"lineNumber":184,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":185,"author":{"gitId":"-"},"content":"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`.","lastModifiedDate":"2020-05-23"},{"lineNumber":186,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":187,"author":{"gitId":"-"},"content":"\u003cpuml src\u003d\"diagrams/UndoRedoState2.puml\" alt\u003d\"UndoRedoState2\" /\u003e","lastModifiedDate":"2023-09-12"},{"lineNumber":188,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":189,"author":{"gitId":"-"},"content":"\u003cbox type\u003d\"info\" seamless\u003e","lastModifiedDate":"2023-09-12"},{"lineNumber":190,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":191,"author":{"gitId":"-"},"content":"**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`.","lastModifiedDate":"2023-09-12"},{"lineNumber":192,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2023-09-12"},{"lineNumber":193,"author":{"gitId":"-"},"content":"\u003c/box\u003e","lastModifiedDate":"2023-09-12"},{"lineNumber":194,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":195,"author":{"gitId":"-"},"content":"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.","lastModifiedDate":"2020-05-23"},{"lineNumber":196,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":197,"author":{"gitId":"-"},"content":"\u003cpuml src\u003d\"diagrams/UndoRedoState3.puml\" alt\u003d\"UndoRedoState3\" /\u003e","lastModifiedDate":"2023-09-12"},{"lineNumber":198,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2023-09-12"},{"lineNumber":199,"author":{"gitId":"-"},"content":"\u003cbox type\u003d\"info\" seamless\u003e","lastModifiedDate":"2023-09-12"},{"lineNumber":200,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":201,"author":{"gitId":"-"},"content":"**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","lastModifiedDate":"2023-09-12"},{"lineNumber":202,"author":{"gitId":"-"},"content":"than attempting to perform the undo.","lastModifiedDate":"2020-05-23"},{"lineNumber":203,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":204,"author":{"gitId":"-"},"content":"\u003c/box\u003e","lastModifiedDate":"2023-09-12"},{"lineNumber":205,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":206,"author":{"gitId":"-"},"content":"The following sequence diagram shows how an undo operation goes through the `Logic` component:","lastModifiedDate":"2024-02-09"},{"lineNumber":207,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":208,"author":{"gitId":"-"},"content":"\u003cpuml src\u003d\"diagrams/UndoSequenceDiagram-Logic.puml\" alt\u003d\"UndoSequenceDiagram-Logic\" /\u003e","lastModifiedDate":"2023-09-12"},{"lineNumber":209,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":210,"author":{"gitId":"-"},"content":"\u003cbox type\u003d\"info\" seamless\u003e","lastModifiedDate":"2023-09-12"},{"lineNumber":211,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":212,"author":{"gitId":"-"},"content":"**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.","lastModifiedDate":"2023-09-12"},{"lineNumber":213,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2023-09-12"},{"lineNumber":214,"author":{"gitId":"-"},"content":"\u003c/box\u003e","lastModifiedDate":"2023-09-12"},{"lineNumber":215,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":216,"author":{"gitId":"-"},"content":"Similarly, how an undo operation goes through the `Model` component is shown below:","lastModifiedDate":"2024-02-09"},{"lineNumber":217,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2024-02-09"},{"lineNumber":218,"author":{"gitId":"-"},"content":"\u003cpuml src\u003d\"diagrams/UndoSequenceDiagram-Model.puml\" alt\u003d\"UndoSequenceDiagram-Model\" /\u003e","lastModifiedDate":"2023-09-12"},{"lineNumber":219,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2024-02-09"},{"lineNumber":220,"author":{"gitId":"-"},"content":"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.","lastModifiedDate":"2020-05-23"},{"lineNumber":221,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":222,"author":{"gitId":"-"},"content":"\u003cbox type\u003d\"info\" seamless\u003e","lastModifiedDate":"2023-09-12"},{"lineNumber":223,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2023-09-12"},{"lineNumber":224,"author":{"gitId":"-"},"content":"**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.","lastModifiedDate":"2023-09-12"},{"lineNumber":225,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":226,"author":{"gitId":"-"},"content":"\u003c/box\u003e","lastModifiedDate":"2023-09-12"},{"lineNumber":227,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":228,"author":{"gitId":"-"},"content":"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.","lastModifiedDate":"2020-05-23"},{"lineNumber":229,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":230,"author":{"gitId":"-"},"content":"\u003cpuml src\u003d\"diagrams/UndoRedoState4.puml\" alt\u003d\"UndoRedoState4\" /\u003e","lastModifiedDate":"2023-09-12"},{"lineNumber":231,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":232,"author":{"gitId":"-"},"content":"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.","lastModifiedDate":"2020-05-23"},{"lineNumber":233,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":234,"author":{"gitId":"-"},"content":"\u003cpuml src\u003d\"diagrams/UndoRedoState5.puml\" alt\u003d\"UndoRedoState5\" /\u003e","lastModifiedDate":"2023-09-12"},{"lineNumber":235,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":236,"author":{"gitId":"-"},"content":"The following activity diagram summarizes what happens when a user executes a new command:","lastModifiedDate":"2020-05-23"},{"lineNumber":237,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":238,"author":{"gitId":"-"},"content":"\u003cpuml src\u003d\"diagrams/CommitActivityDiagram.puml\" width\u003d\"250\" /\u003e","lastModifiedDate":"2023-09-12"},{"lineNumber":239,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":240,"author":{"gitId":"-"},"content":"#### Design considerations:","lastModifiedDate":"2021-07-31"},{"lineNumber":241,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":242,"author":{"gitId":"-"},"content":"**Aspect: How undo \u0026 redo executes:**","lastModifiedDate":"2021-07-31"},{"lineNumber":243,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":244,"author":{"gitId":"PyromancerBoom"},"content":"- **Alternative 1 (current choice):** Saves the entire address book.","lastModifiedDate":"2024-03-07"},{"lineNumber":245,"author":{"gitId":"PyromancerBoom"},"content":"","lastModifiedDate":"2024-03-07"},{"lineNumber":246,"author":{"gitId":"PyromancerBoom"},"content":" - Pros: Easy to implement.","lastModifiedDate":"2024-03-07"},{"lineNumber":247,"author":{"gitId":"PyromancerBoom"},"content":" - Cons: May have performance issues in terms of memory usage.","lastModifiedDate":"2024-03-07"},{"lineNumber":248,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":249,"author":{"gitId":"PyromancerBoom"},"content":"- **Alternative 2:** Individual command knows how to undo/redo by","lastModifiedDate":"2024-03-07"},{"lineNumber":250,"author":{"gitId":"-"},"content":" itself.","lastModifiedDate":"2020-05-23"},{"lineNumber":251,"author":{"gitId":"PyromancerBoom"},"content":" - Pros: Will use less memory (e.g. for `delete`, just save the person being deleted).","lastModifiedDate":"2024-03-07"},{"lineNumber":252,"author":{"gitId":"PyromancerBoom"},"content":" - Cons: We must ensure that the implementation of each individual command are correct.","lastModifiedDate":"2024-03-07"},{"lineNumber":253,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":254,"author":{"gitId":"-"},"content":"_{more aspects and alternatives to be added}_","lastModifiedDate":"2020-05-23"},{"lineNumber":255,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":256,"author":{"gitId":"-"},"content":"### \\[Proposed\\] Data archiving","lastModifiedDate":"2020-05-23"},{"lineNumber":257,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":258,"author":{"gitId":"-"},"content":"_{Explain here how the data archiving feature will be implemented}_","lastModifiedDate":"2020-05-23"},{"lineNumber":259,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":260,"author":{"gitId":"PyromancerBoom"},"content":"---","lastModifiedDate":"2024-03-07"},{"lineNumber":261,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":262,"author":{"gitId":"-"},"content":"## **Documentation, logging, testing, configuration, dev-ops**","lastModifiedDate":"2020-06-07"},{"lineNumber":263,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":264,"author":{"gitId":"PyromancerBoom"},"content":"- [Documentation guide](Documentation.md)","lastModifiedDate":"2024-03-07"},{"lineNumber":265,"author":{"gitId":"PyromancerBoom"},"content":"- [Testing guide](Testing.md)","lastModifiedDate":"2024-03-07"},{"lineNumber":266,"author":{"gitId":"PyromancerBoom"},"content":"- [Logging guide](Logging.md)","lastModifiedDate":"2024-03-07"},{"lineNumber":267,"author":{"gitId":"PyromancerBoom"},"content":"- [Configuration guide](Configuration.md)","lastModifiedDate":"2024-03-07"},{"lineNumber":268,"author":{"gitId":"PyromancerBoom"},"content":"- [DevOps guide](DevOps.md)","lastModifiedDate":"2024-03-07"},{"lineNumber":269,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":270,"author":{"gitId":"PyromancerBoom"},"content":"---","lastModifiedDate":"2024-03-07"},{"lineNumber":271,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":272,"author":{"gitId":"-"},"content":"## **Appendix: Requirements**","lastModifiedDate":"2020-05-23"},{"lineNumber":273,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":274,"author":{"gitId":"-"},"content":"### Product scope","lastModifiedDate":"2020-05-23"},{"lineNumber":275,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":276,"author":{"gitId":"-"},"content":"**Target user profile**:","lastModifiedDate":"2020-05-23"},{"lineNumber":277,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":278,"author":{"gitId":"PyromancerBoom"},"content":"- needs to manage contacts of a growing population of employees","lastModifiedDate":"2024-03-07"},{"lineNumber":279,"author":{"gitId":"PyromancerBoom"},"content":"- prefers to use CLI over GUI","lastModifiedDate":"2024-03-07"},{"lineNumber":280,"author":{"gitId":"PyromancerBoom"},"content":"- can type fast","lastModifiedDate":"2024-03-07"},{"lineNumber":281,"author":{"gitId":"PyromancerBoom"},"content":"- values efficiency, transparency, and effective communication","lastModifiedDate":"2024-03-07"},{"lineNumber":282,"author":{"gitId":"PyromancerBoom"},"content":"- wants an app that works with different OS","lastModifiedDate":"2024-03-07"},{"lineNumber":283,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":284,"author":{"gitId":"quelinxiao"},"content":"**Value proposition**: manage contacts in an efficient manner using CLI app","lastModifiedDate":"2024-03-07"},{"lineNumber":285,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":286,"author":{"gitId":"-"},"content":"### User stories","lastModifiedDate":"2020-06-07"},{"lineNumber":287,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":288,"author":{"gitId":"-"},"content":"Priorities: High (must have) - `* * *`, Medium (nice to have) - `* *`, Low (unlikely to have) - `*`","lastModifiedDate":"2020-05-23"},{"lineNumber":289,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":290,"author":{"gitId":"-"},"content":"| Priority | As a …​ | I want to …​ | So that I can…​ |","lastModifiedDate":"2020-05-23"},{"lineNumber":291,"author":{"gitId":"PyromancerBoom"},"content":"| -------- | -------------------- | ---------------------------------------------- | ----------------------------------------------------- |","lastModifiedDate":"2024-03-07"},{"lineNumber":292,"author":{"gitId":"hjungwoo01"},"content":"| `* * *` | small business owner | easily add new contacts to my database | quickly message and nurture my employees |","lastModifiedDate":"2024-03-07"},{"lineNumber":293,"author":{"gitId":"hjungwoo01"},"content":"| `* * *` | busy professional | access my contact information from my computer | stay organized and responsive even when I\u0027m on the go |","lastModifiedDate":"2024-03-07"},{"lineNumber":294,"author":{"gitId":"hjungwoo01"},"content":"| `* * *` | user | add new contacts to my address book | easily store their information |","lastModifiedDate":"2024-03-07"},{"lineNumber":295,"author":{"gitId":"hjungwoo01"},"content":"| `* * *` | user | delete contacts I no longer need | keep my address book organized |","lastModifiedDate":"2024-03-07"},{"lineNumber":296,"author":{"gitId":"hjungwoo01"},"content":"| `* * *` | user | view a complete list of all my contacts | browse through them easily |","lastModifiedDate":"2024-03-07"},{"lineNumber":297,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":298,"author":{"gitId":"PyromancerBoom"},"content":"_{More to be added}_","lastModifiedDate":"2024-03-07"},{"lineNumber":299,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":300,"author":{"gitId":"-"},"content":"### Use cases","lastModifiedDate":"2020-06-07"},{"lineNumber":301,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":302,"author":{"gitId":"shayaansultan"},"content":"#### **Use Case: Add Contact for ContactSwift v1.2**","lastModifiedDate":"2024-03-07"},{"lineNumber":303,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":304,"author":{"gitId":"shayaansultan"},"content":"**System:** ContactSwift v1.2","lastModifiedDate":"2024-03-07"},{"lineNumber":305,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":306,"author":{"gitId":"shayaansultan"},"content":"**Actor:** User","lastModifiedDate":"2024-03-07"},{"lineNumber":307,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":308,"author":{"gitId":"shayaansultan"},"content":"1. **User adds a new contact:**","lastModifiedDate":"2024-03-07"},{"lineNumber":309,"author":{"gitId":"PyromancerBoom"},"content":"","lastModifiedDate":"2024-03-07"},{"lineNumber":310,"author":{"gitId":"shayaansultan"},"content":" - Command: `add contact /name Jane Smith /email jane@example.com /number 9876543210`","lastModifiedDate":"2024-03-07"},{"lineNumber":311,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":312,"author":{"gitId":"shayaansultan"},"content":"2. **ContactSwift processes the command:**","lastModifiedDate":"2024-03-07"},{"lineNumber":313,"author":{"gitId":"PyromancerBoom"},"content":"","lastModifiedDate":"2024-03-07"},{"lineNumber":314,"author":{"gitId":"shayaansultan"},"content":" - Validates the command format and required details.","lastModifiedDate":"2024-03-07"},{"lineNumber":315,"author":{"gitId":"shayaansultan"},"content":" - Generates a unique ID for the new contact.","lastModifiedDate":"2024-03-07"},{"lineNumber":316,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":317,"author":{"gitId":"shayaansultan"},"content":"3. **ContactSwift updates the address book:**","lastModifiedDate":"2024-03-07"},{"lineNumber":318,"author":{"gitId":"PyromancerBoom"},"content":"","lastModifiedDate":"2024-03-07"},{"lineNumber":319,"author":{"gitId":"shayaansultan"},"content":" - Adds the contact details to the in-memory database.","lastModifiedDate":"2024-03-07"},{"lineNumber":320,"author":{"gitId":"shayaansultan"},"content":" - Sends a success message to the user.","lastModifiedDate":"2024-03-07"},{"lineNumber":321,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":322,"author":{"gitId":"shayaansultan"},"content":"4. **User verifies the addition:**","lastModifiedDate":"2024-03-07"},{"lineNumber":323,"author":{"gitId":"shayaansultan"},"content":" - Command: `list all`","lastModifiedDate":"2024-03-07"},{"lineNumber":324,"author":{"gitId":"shayaansultan"},"content":" - ContactSwift displays the updated list with Jane Smith\u0027s details.","lastModifiedDate":"2024-03-07"},{"lineNumber":325,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":326,"author":{"gitId":"shayaansultan"},"content":"#### **Use Case: Delete Contact for ContactSwift v1.2**","lastModifiedDate":"2024-03-07"},{"lineNumber":327,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":328,"author":{"gitId":"shayaansultan"},"content":"**System:** ContactSwift v1.2","lastModifiedDate":"2024-03-07"},{"lineNumber":329,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":330,"author":{"gitId":"shayaansultan"},"content":"**Actor:** User","lastModifiedDate":"2024-03-07"},{"lineNumber":331,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":332,"author":{"gitId":"shayaansultan"},"content":"1. **User identifies the contact to delete:**","lastModifiedDate":"2024-03-07"},{"lineNumber":333,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2024-03-07"},{"lineNumber":334,"author":{"gitId":"shayaansultan"},"content":" - Command: `list all`","lastModifiedDate":"2024-03-07"},{"lineNumber":335,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2024-03-07"},{"lineNumber":336,"author":{"gitId":"shayaansultan"},"content":"2. **ContactSwift displays the contact list:**","lastModifiedDate":"2024-03-07"},{"lineNumber":337,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2024-03-07"},{"lineNumber":338,"author":{"gitId":"shayaansultan"},"content":" - User identifies the contact to delete, e.g., with the ID 5678.","lastModifiedDate":"2024-03-07"},{"lineNumber":339,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2024-03-07"},{"lineNumber":340,"author":{"gitId":"shayaansultan"},"content":"3. **User initiates the deletion:**","lastModifiedDate":"2024-03-07"},{"lineNumber":341,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2024-03-07"},{"lineNumber":342,"author":{"gitId":"shayaansultan"},"content":" - Command: `delete contact /id 5678`","lastModifiedDate":"2024-03-07"},{"lineNumber":343,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2024-03-07"},{"lineNumber":344,"author":{"gitId":"shayaansultan"},"content":"4. **ContactSwift processes the deletion:**","lastModifiedDate":"2024-03-07"},{"lineNumber":345,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2024-03-07"},{"lineNumber":346,"author":{"gitId":"shayaansultan"},"content":" - Verifies the command format and the contact ID.","lastModifiedDate":"2024-03-07"},{"lineNumber":347,"author":{"gitId":"shayaansultan"},"content":" - Deletes the contact if conditions are met.","lastModifiedDate":"2024-03-07"},{"lineNumber":348,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2024-03-07"},{"lineNumber":349,"author":{"gitId":"shayaansultan"},"content":"5. **ContactSwift updates the address book:**","lastModifiedDate":"2024-03-07"},{"lineNumber":350,"author":{"gitId":"PyromancerBoom"},"content":"","lastModifiedDate":"2024-03-07"},{"lineNumber":351,"author":{"gitId":"shayaansultan"},"content":" - Removes the contact from the in-memory database.","lastModifiedDate":"2024-03-07"},{"lineNumber":352,"author":{"gitId":"shayaansultan"},"content":" - Sends a confirmation message to the user.","lastModifiedDate":"2024-03-07"},{"lineNumber":353,"author":{"gitId":"shayaansultan"},"content":"","lastModifiedDate":"2024-03-07"},{"lineNumber":354,"author":{"gitId":"shayaansultan"},"content":"6. **User verifies the deletion:**","lastModifiedDate":"2024-03-07"},{"lineNumber":355,"author":{"gitId":"shayaansultan"},"content":" - Command: `list all`","lastModifiedDate":"2024-03-07"},{"lineNumber":356,"author":{"gitId":"shayaansultan"},"content":" - ContactSwift displays the updated list without the deleted contact.","lastModifiedDate":"2024-03-07"},{"lineNumber":357,"author":{"gitId":"shayaansultan"},"content":"","lastModifiedDate":"2024-03-07"},{"lineNumber":358,"author":{"gitId":"shayaansultan"},"content":"#### **Use Case: Quick Contact Addition for ContactSwift v1.2**","lastModifiedDate":"2024-03-07"},{"lineNumber":359,"author":{"gitId":"shayaansultan"},"content":"","lastModifiedDate":"2024-03-07"},{"lineNumber":360,"author":{"gitId":"shayaansultan"},"content":"**System:** ContactSwift v1.2","lastModifiedDate":"2024-03-07"},{"lineNumber":361,"author":{"gitId":"shayaansultan"},"content":"","lastModifiedDate":"2024-03-07"},{"lineNumber":362,"author":{"gitId":"shayaansultan"},"content":"**Actor:** User","lastModifiedDate":"2024-03-07"},{"lineNumber":363,"author":{"gitId":"shayaansultan"},"content":"","lastModifiedDate":"2024-03-07"},{"lineNumber":364,"author":{"gitId":"shayaansultan"},"content":"1. **User meets a new contact at a networking event:**","lastModifiedDate":"2024-03-07"},{"lineNumber":365,"author":{"gitId":"PyromancerBoom"},"content":"","lastModifiedDate":"2024-03-07"},{"lineNumber":366,"author":{"gitId":"shayaansultan"},"content":" - Command: `add contact /name Sam Johnson /email sam@example.com /number 5551234567`","lastModifiedDate":"2024-03-07"},{"lineNumber":367,"author":{"gitId":"shayaansultan"},"content":"","lastModifiedDate":"2024-03-07"},{"lineNumber":368,"author":{"gitId":"shayaansultan"},"content":"2. **ContactSwift processes the command:**","lastModifiedDate":"2024-03-07"},{"lineNumber":369,"author":{"gitId":"PyromancerBoom"},"content":"","lastModifiedDate":"2024-03-07"},{"lineNumber":370,"author":{"gitId":"shayaansultan"},"content":" - Validates the command format and required details.","lastModifiedDate":"2024-03-07"},{"lineNumber":371,"author":{"gitId":"shayaansultan"},"content":" - Generates a unique ID for the new contact.","lastModifiedDate":"2024-03-07"},{"lineNumber":372,"author":{"gitId":"shayaansultan"},"content":"","lastModifiedDate":"2024-03-07"},{"lineNumber":373,"author":{"gitId":"shayaansultan"},"content":"3. **ContactSwift updates the address book:**","lastModifiedDate":"2024-03-07"},{"lineNumber":374,"author":{"gitId":"PyromancerBoom"},"content":"","lastModifiedDate":"2024-03-07"},{"lineNumber":375,"author":{"gitId":"shayaansultan"},"content":" - Adds the contact details to the in-memory database.","lastModifiedDate":"2024-03-07"},{"lineNumber":376,"author":{"gitId":"shayaansultan"},"content":" - Sends a success message to the user.","lastModifiedDate":"2024-03-07"},{"lineNumber":377,"author":{"gitId":"shayaansultan"},"content":"","lastModifiedDate":"2024-03-07"},{"lineNumber":378,"author":{"gitId":"shayaansultan"},"content":"4. **User verifies the addition:**","lastModifiedDate":"2024-03-07"},{"lineNumber":379,"author":{"gitId":"shayaansultan"},"content":" - Command: `list all`","lastModifiedDate":"2024-03-07"},{"lineNumber":380,"author":{"gitId":"shayaansultan"},"content":" - ContactSwift displays the updated list with Sam Johnson\u0027s details.","lastModifiedDate":"2024-03-07"},{"lineNumber":381,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":382,"author":{"gitId":"PyromancerBoom"},"content":"_{More to be added}_","lastModifiedDate":"2024-03-07"},{"lineNumber":383,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":384,"author":{"gitId":"-"},"content":"### Non-Functional Requirements","lastModifiedDate":"2020-05-23"},{"lineNumber":385,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":386,"author":{"gitId":"PyromancerBoom"},"content":"1. Cross-Platform Compatibility: Must be executable on any mainstream operating system (Windows, macOS, Linux) with Java Runtime Environment (JRE) version 11 or above installed. This ensures that the application can serve a wide user base without being restricted by their OS choice.","lastModifiedDate":"2024-03-07"},{"lineNumber":387,"author":{"gitId":"-"},"content":"2. Should be able to hold up to 1000 persons without a noticeable sluggishness in performance for typical usage.","lastModifiedDate":"2020-05-23"},{"lineNumber":388,"author":{"gitId":"-"},"content":"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.","lastModifiedDate":"2020-05-23"},{"lineNumber":389,"author":{"gitId":"PyromancerBoom"},"content":"4. The design and user interaction model of the software should cater to users with above-average typing speeds for regular English text. It implies that the command-line interface (CLI) or similar input methods should allow for faster task accomplishment compared to traditional graphical user interface (GUI) interactions involving the mouse. This would include quick command shortcuts for adding, deleting, and searching for contacts, among other actions.","lastModifiedDate":"2024-03-07"},{"lineNumber":390,"author":{"gitId":"PyromancerBoom"},"content":"5. Intuitive User Interface: Despite the focus on efficiency and command-line usage, the software should still offer an intuitive interface for those moments when a user prefers or needs to interact with the software in a more traditional manner. This includes clear visual cues, easy navigation, and minimalistic design to reduce cognitive load.","lastModifiedDate":"2024-03-07"},{"lineNumber":391,"author":{"gitId":"PyromancerBoom"},"content":"6. Data Security: The software should ensure that private contact details are stored securely and are not accessible to unauthorized users. This includes encryption of sensitive data and secure access control mechanisms.","lastModifiedDate":"2024-03-07"},{"lineNumber":392,"author":{"gitId":"PyromancerBoom"},"content":"7. Data Integrity: The software should ensure that contact details are stored accurately and are not lost or corrupted due to software errors or hardware failures. This includes regular data backups and error-checking mechanisms.","lastModifiedDate":"2024-03-07"},{"lineNumber":393,"author":{"gitId":"PyromancerBoom"},"content":"8. Portability: As a Java application packaged in a .jar file, it should ensure that all dependencies are included or easily resolvable, making the application easily portable and runnable across different systems without additional setup.","lastModifiedDate":"2024-03-07"},{"lineNumber":394,"author":{"gitId":"PyromancerBoom"},"content":"9. All operations should run in under 0.5 seconds for a typical user with a typical address book size (1000 persons).","lastModifiedDate":"2024-03-07"},{"lineNumber":395,"author":{"gitId":"PyromancerBoom"},"content":"10. Should work well with 500 MB of memory, and should not consume more than 0.5 GB of memory for a typical user with a typical address book size (50k persons).","lastModifiedDate":"2024-03-07"},{"lineNumber":396,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":397,"author":{"gitId":"PyromancerBoom"},"content":"\u003c!-- *{More to be added}* --\u003e","lastModifiedDate":"2024-03-07"},{"lineNumber":398,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":399,"author":{"gitId":"-"},"content":"### Glossary","lastModifiedDate":"2020-05-23"},{"lineNumber":400,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":401,"author":{"gitId":"PyromancerBoom"},"content":"- **Mainstream OS**: Windows, Linux, Unix, MacOS","lastModifiedDate":"2024-03-07"},{"lineNumber":402,"author":{"gitId":"PyromancerBoom"},"content":"- **Private contact detail**: A contact detail that is not meant to be shared with others","lastModifiedDate":"2024-03-07"},{"lineNumber":403,"author":{"gitId":"PyromancerBoom"},"content":"- **Quick Contact Addition**: Allows users to rapidly add new contacts to their address book during networking events. Generates a unique ID for each contact.","lastModifiedDate":"2024-03-07"},{"lineNumber":404,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2024-03-07"},{"lineNumber":405,"author":{"gitId":"PyromancerBoom"},"content":"- **Command Format**: The syntax used to input commands in ContactSwift. Example commands include adding or deleting contacts, and the format must be followed for successful execution.","lastModifiedDate":"2024-03-07"},{"lineNumber":406,"author":{"gitId":"shayaansultan"},"content":"","lastModifiedDate":"2024-03-07"},{"lineNumber":407,"author":{"gitId":"PyromancerBoom"},"content":"- **Contact Deletion**: Enables users to remove contacts they no longer need, contributing to the organization of their address book. Requires a valid contact ID for deletion.","lastModifiedDate":"2024-03-07"},{"lineNumber":408,"author":{"gitId":"shayaansultan"},"content":"","lastModifiedDate":"2024-03-07"},{"lineNumber":409,"author":{"gitId":"PyromancerBoom"},"content":"- **Contact Information Storage**: Allows users to store detailed information about their contacts for easy reference. In the initial version, information is stored in memory to simulate a database, text file, or CSV file.","lastModifiedDate":"2024-03-07"},{"lineNumber":410,"author":{"gitId":"shayaansultan"},"content":"","lastModifiedDate":"2024-03-07"},{"lineNumber":411,"author":{"gitId":"PyromancerBoom"},"content":"- **All Contacts List Display**: Provides users with a complete list of all their contacts for easy browsing and reference. Users can request the display of all contacts with their details in a user-friendly format.","lastModifiedDate":"2024-03-07"},{"lineNumber":412,"author":{"gitId":"shayaansultan"},"content":"","lastModifiedDate":"2024-03-07"},{"lineNumber":413,"author":{"gitId":"PyromancerBoom"},"content":"- **Contact ID**: A unique identifier assigned to each contact. Used in commands such as deleting a contact to specify the target contact.","lastModifiedDate":"2024-03-07"},{"lineNumber":414,"author":{"gitId":"shayaansultan"},"content":"","lastModifiedDate":"2024-03-07"},{"lineNumber":415,"author":{"gitId":"PyromancerBoom"},"content":"- **Acceptable Values**: The valid input criteria for various fields such as contact name, email, and phone number. Ensures that the entered data meets the required format.","lastModifiedDate":"2024-03-07"},{"lineNumber":416,"author":{"gitId":"shayaansultan"},"content":"","lastModifiedDate":"2024-03-07"},{"lineNumber":417,"author":{"gitId":"PyromancerBoom"},"content":"- **Expected Outputs**: The successful outcomes or confirmation messages expected after executing specific commands, such as adding or deleting contacts.","lastModifiedDate":"2024-03-07"},{"lineNumber":418,"author":{"gitId":"shayaansultan"},"content":"","lastModifiedDate":"2024-03-07"},{"lineNumber":419,"author":{"gitId":"PyromancerBoom"},"content":"- **Failure Outputs**: Error messages generated when there are issues, such as missing details or incorrect command formats. Communicates problems to the user for troubleshooting.","lastModifiedDate":"2024-03-07"},{"lineNumber":420,"author":{"gitId":"shayaansultan"},"content":"","lastModifiedDate":"2024-03-07"},{"lineNumber":421,"author":{"gitId":"PyromancerBoom"},"content":"- **Mainstream OS**: Refers to widely used operating systems including Windows, Linux, Unix, and MacOS. ContactSwift is designed to work seamlessly across these platforms.","lastModifiedDate":"2024-03-07"},{"lineNumber":422,"author":{"gitId":"shayaansultan"},"content":"","lastModifiedDate":"2024-03-07"},{"lineNumber":423,"author":{"gitId":"PyromancerBoom"},"content":"- **Private Contact Detail**: A contact detail that is not meant to be shared with others. Ensures the confidentiality of certain information stored in the address book.","lastModifiedDate":"2024-03-07"},{"lineNumber":424,"author":{"gitId":"shayaansultan"},"content":"","lastModifiedDate":"2024-03-07"},{"lineNumber":425,"author":{"gitId":"PyromancerBoom"},"content":"- **Must-have Features**: Quick Contact Addition, Contact Deletion, Contact Information Storage, and All Contacts List Display. Core functionalities essential for addressing the needs of business owners and managers.","lastModifiedDate":"2024-03-07"},{"lineNumber":426,"author":{"gitId":"shayaansultan"},"content":"","lastModifiedDate":"2024-03-07"},{"lineNumber":427,"author":{"gitId":"PyromancerBoom"},"content":"- **Good to Have Features**: Additional functionalities that enhance user experience, such as tags and remarks while adding contacts, searching specific contacts, filtering based on tags, and a favorites option for quick lookup.","lastModifiedDate":"2024-03-07"},{"lineNumber":428,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":429,"author":{"gitId":"PyromancerBoom"},"content":"---","lastModifiedDate":"2024-03-07"},{"lineNumber":430,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":431,"author":{"gitId":"-"},"content":"## **Appendix: Instructions for manual testing**","lastModifiedDate":"2020-05-23"},{"lineNumber":432,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":433,"author":{"gitId":"-"},"content":"Given below are instructions to test the app manually.","lastModifiedDate":"2020-05-23"},{"lineNumber":434,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":435,"author":{"gitId":"-"},"content":"\u003cbox type\u003d\"info\" seamless\u003e","lastModifiedDate":"2023-09-12"},{"lineNumber":436,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2023-09-12"},{"lineNumber":437,"author":{"gitId":"-"},"content":"**Note:** These instructions only provide a starting point for testers to work on;","lastModifiedDate":"2023-09-12"},{"lineNumber":438,"author":{"gitId":"PyromancerBoom"},"content":"testers are expected to do more _exploratory_ testing.","lastModifiedDate":"2024-03-07"},{"lineNumber":439,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":440,"author":{"gitId":"-"},"content":"\u003c/box\u003e","lastModifiedDate":"2023-09-12"},{"lineNumber":441,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":442,"author":{"gitId":"-"},"content":"### Launch and shutdown","lastModifiedDate":"2020-05-23"},{"lineNumber":443,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":444,"author":{"gitId":"-"},"content":"1. Initial launch","lastModifiedDate":"2020-05-23"},{"lineNumber":445,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":446,"author":{"gitId":"-"},"content":" 1. Download the jar file and copy into an empty folder","lastModifiedDate":"2020-05-23"},{"lineNumber":447,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":448,"author":{"gitId":"-"},"content":" 1. Double-click the jar file Expected: Shows the GUI with a set of sample contacts. The window size may not be optimum.","lastModifiedDate":"2020-05-23"},{"lineNumber":449,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":450,"author":{"gitId":"-"},"content":"1. Saving window preferences","lastModifiedDate":"2020-05-23"},{"lineNumber":451,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":452,"author":{"gitId":"-"},"content":" 1. Resize the window to an optimum size. Move the window to a different location. Close the window.","lastModifiedDate":"2020-05-23"},{"lineNumber":453,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":454,"author":{"gitId":"-"},"content":" 1. Re-launch the app by double-clicking the jar file.\u003cbr\u003e","lastModifiedDate":"2020-05-23"},{"lineNumber":455,"author":{"gitId":"-"},"content":" Expected: The most recent window size and location is retained.","lastModifiedDate":"2020-05-23"},{"lineNumber":456,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":457,"author":{"gitId":"-"},"content":"1. _{ more test cases …​ }_","lastModifiedDate":"2020-05-23"},{"lineNumber":458,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":459,"author":{"gitId":"-"},"content":"### Deleting a person","lastModifiedDate":"2020-05-23"},{"lineNumber":460,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":461,"author":{"gitId":"-"},"content":"1. Deleting a person while all persons are being shown","lastModifiedDate":"2020-05-23"},{"lineNumber":462,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":463,"author":{"gitId":"-"},"content":" 1. Prerequisites: List all persons using the `list` command. Multiple persons in the list.","lastModifiedDate":"2020-05-23"},{"lineNumber":464,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":465,"author":{"gitId":"-"},"content":" 1. Test case: `delete 1`\u003cbr\u003e","lastModifiedDate":"2020-05-23"},{"lineNumber":466,"author":{"gitId":"-"},"content":" 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.","lastModifiedDate":"2020-05-23"},{"lineNumber":467,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":468,"author":{"gitId":"-"},"content":" 1. Test case: `delete 0`\u003cbr\u003e","lastModifiedDate":"2020-05-23"},{"lineNumber":469,"author":{"gitId":"-"},"content":" Expected: No person is deleted. Error details shown in the status message. Status bar remains the same.","lastModifiedDate":"2020-05-23"},{"lineNumber":470,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":471,"author":{"gitId":"-"},"content":" 1. Other incorrect delete commands to try: `delete`, `delete x`, `...` (where x is larger than the list size)\u003cbr\u003e","lastModifiedDate":"2020-05-23"},{"lineNumber":472,"author":{"gitId":"-"},"content":" Expected: Similar to previous.","lastModifiedDate":"2020-05-23"},{"lineNumber":473,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":474,"author":{"gitId":"-"},"content":"1. _{ more test cases …​ }_","lastModifiedDate":"2020-05-23"},{"lineNumber":475,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":476,"author":{"gitId":"-"},"content":"### Saving data","lastModifiedDate":"2020-05-23"},{"lineNumber":477,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":478,"author":{"gitId":"-"},"content":"1. Dealing with missing/corrupted data files","lastModifiedDate":"2020-05-23"},{"lineNumber":479,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":480,"author":{"gitId":"-"},"content":" 1. _{explain how to simulate a missing/corrupted file, and the expected behavior}_","lastModifiedDate":"2020-05-23"},{"lineNumber":481,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":482,"author":{"gitId":"-"},"content":"1. _{ more test cases …​ }_","lastModifiedDate":"2020-05-23"}],"authorContributionMap":{"PyromancerBoom":89,"quelinxiao":1,"hjungwoo01":5,"shayaansultan":65,"-":322}},{"path":"docs/_markbind/layouts/default.md","fileType":"docs","lines":[{"lineNumber":1,"author":{"gitId":"-"},"content":"\u003chead-bottom\u003e","lastModifiedDate":"2023-09-12"},{"lineNumber":2,"author":{"gitId":"-"},"content":" \u003clink rel\u003d\"stylesheet\" href\u003d\"{{baseUrl}}/stylesheets/main.css\"\u003e","lastModifiedDate":"2023-09-12"},{"lineNumber":3,"author":{"gitId":"-"},"content":"\u003c/head-bottom\u003e","lastModifiedDate":"2023-09-12"},{"lineNumber":4,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2023-09-12"},{"lineNumber":5,"author":{"gitId":"-"},"content":"\u003cheader sticky\u003e","lastModifiedDate":"2023-09-12"},{"lineNumber":6,"author":{"gitId":"-"},"content":" \u003cnavbar type\u003d\"dark\"\u003e","lastModifiedDate":"2023-09-12"},{"lineNumber":7,"author":{"gitId":"shayaansultan"},"content":" \u003ca slot\u003d\"brand\" href\u003d\"{{baseUrl}}/index.html\" title\u003d\"Home\" class\u003d\"navbar-brand\"\u003eMy Product\u003c/a\u003e","lastModifiedDate":"2024-03-07"},{"lineNumber":8,"author":{"gitId":"-"},"content":" \u003cli\u003e\u003ca href\u003d\"{{baseUrl}}/index.html\" class\u003d\"nav-link\"\u003eHome\u003c/a\u003e\u003c/li\u003e","lastModifiedDate":"2024-02-09"},{"lineNumber":9,"author":{"gitId":"-"},"content":" \u003cli\u003e\u003ca href\u003d\"{{baseUrl}}/UserGuide.html\" class\u003d\"nav-link\"\u003eUser Guide\u003c/a\u003e\u003c/li\u003e","lastModifiedDate":"2023-09-12"},{"lineNumber":10,"author":{"gitId":"-"},"content":" \u003cli\u003e\u003ca href\u003d\"{{baseUrl}}/DeveloperGuide.html\" class\u003d\"nav-link\"\u003eDeveloper Guide\u003c/a\u003e\u003c/li\u003e","lastModifiedDate":"2023-09-12"},{"lineNumber":11,"author":{"gitId":"-"},"content":" \u003cli\u003e\u003ca href\u003d\"{{baseUrl}}/AboutUs.html\" class\u003d\"nav-link\"\u003eAbout Us\u003c/a\u003e\u003c/li\u003e","lastModifiedDate":"2023-09-12"},{"lineNumber":12,"author":{"gitId":"-"},"content":" \u003cli\u003e\u003ca href\u003d\"https://github.com/se-edu/addressbook-level3\" target\u003d\"_blank\" class\u003d\"nav-link\"\u003e\u003cmd\u003e:fab-github:\u003c/md\u003e\u003c/a\u003e","lastModifiedDate":"2023-09-12"},{"lineNumber":13,"author":{"gitId":"-"},"content":" \u003c/li\u003e","lastModifiedDate":"2023-09-12"},{"lineNumber":14,"author":{"gitId":"-"},"content":" \u003cli slot\u003d\"right\"\u003e","lastModifiedDate":"2023-09-12"},{"lineNumber":15,"author":{"gitId":"-"},"content":" \u003cform class\u003d\"navbar-form\"\u003e","lastModifiedDate":"2023-09-12"},{"lineNumber":16,"author":{"gitId":"-"},"content":" \u003csearchbar :data\u003d\"searchData\" placeholder\u003d\"Search\" :on-hit\u003d\"searchCallback\" menu-align-right\u003e\u003c/searchbar\u003e","lastModifiedDate":"2023-09-12"},{"lineNumber":17,"author":{"gitId":"-"},"content":" \u003c/form\u003e","lastModifiedDate":"2023-09-12"},{"lineNumber":18,"author":{"gitId":"-"},"content":" \u003c/li\u003e","lastModifiedDate":"2023-09-12"},{"lineNumber":19,"author":{"gitId":"-"},"content":" \u003c/navbar\u003e","lastModifiedDate":"2023-09-12"},{"lineNumber":20,"author":{"gitId":"-"},"content":"\u003c/header\u003e","lastModifiedDate":"2023-09-12"},{"lineNumber":21,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2023-09-12"},{"lineNumber":22,"author":{"gitId":"-"},"content":"\u003cdiv id\u003d\"flex-body\"\u003e","lastModifiedDate":"2023-09-12"},{"lineNumber":23,"author":{"gitId":"-"},"content":" \u003cnav id\u003d\"site-nav\"\u003e","lastModifiedDate":"2023-09-12"},{"lineNumber":24,"author":{"gitId":"-"},"content":" \u003cdiv class\u003d\"site-nav-top\"\u003e","lastModifiedDate":"2023-09-12"},{"lineNumber":25,"author":{"gitId":"-"},"content":" \u003cdiv class\u003d\"fw-bold mb-2\" style\u003d\"font-size: 1.25rem;\"\u003eSite Map\u003c/div\u003e","lastModifiedDate":"2023-09-12"},{"lineNumber":26,"author":{"gitId":"-"},"content":" \u003c/div\u003e","lastModifiedDate":"2023-09-12"},{"lineNumber":27,"author":{"gitId":"-"},"content":" \u003cdiv class\u003d\"nav-component slim-scroll\"\u003e","lastModifiedDate":"2023-09-12"},{"lineNumber":28,"author":{"gitId":"-"},"content":" \u003csite-nav\u003e","lastModifiedDate":"2023-09-12"},{"lineNumber":29,"author":{"gitId":"-"},"content":"* [Home]({{ baseUrl }}/index.html)","lastModifiedDate":"2023-09-12"},{"lineNumber":30,"author":{"gitId":"-"},"content":"* [User Guide]({{ baseUrl }}/UserGuide.html) :expanded:","lastModifiedDate":"2023-09-12"},{"lineNumber":31,"author":{"gitId":"-"},"content":" * [Quick Start]({{ baseUrl }}/UserGuide.html#quick-start)","lastModifiedDate":"2023-09-12"},{"lineNumber":32,"author":{"gitId":"-"},"content":" * [Features]({{ baseUrl }}/UserGuide.html#features)","lastModifiedDate":"2023-09-12"},{"lineNumber":33,"author":{"gitId":"-"},"content":" * [FAQ]({{ baseUrl }}/UserGuide.html#faq)","lastModifiedDate":"2023-09-12"},{"lineNumber":34,"author":{"gitId":"-"},"content":" * [Command Summary]({{ baseUrl }}/UserGuide.html#faq)","lastModifiedDate":"2023-09-12"},{"lineNumber":35,"author":{"gitId":"-"},"content":"* [Developer Guide]({{ baseUrl }}/DeveloperGuide.html) :expanded:","lastModifiedDate":"2023-09-12"},{"lineNumber":36,"author":{"gitId":"-"},"content":" * [Acknowledgements]({{ baseUrl }}/DeveloperGuide.html#acknowledgements)","lastModifiedDate":"2023-09-12"},{"lineNumber":37,"author":{"gitId":"-"},"content":" * [Setting Up]({{ baseUrl }}/DeveloperGuide.html#setting-up-getting-started)","lastModifiedDate":"2023-09-12"},{"lineNumber":38,"author":{"gitId":"-"},"content":" * [Design]({{ baseUrl }}/DeveloperGuide.html#design)","lastModifiedDate":"2023-09-12"},{"lineNumber":39,"author":{"gitId":"-"},"content":" * [Implementation]({{ baseUrl }}/DeveloperGuide.html#implementation)","lastModifiedDate":"2023-09-12"},{"lineNumber":40,"author":{"gitId":"-"},"content":" * [Documentation, logging, testing, configuration, dev-ops]({{ baseUrl }}/DeveloperGuide.html#documentation-logging-testing-configuration-dev-ops)","lastModifiedDate":"2023-09-12"},{"lineNumber":41,"author":{"gitId":"-"},"content":" * [Appendix: Requirements]({{ baseUrl }}/DeveloperGuide.html#appendix-requirements)","lastModifiedDate":"2023-09-12"},{"lineNumber":42,"author":{"gitId":"-"},"content":" * [Appendix: Instructions for manual testing]({{ baseUrl }}/DeveloperGuide.html#appendix-instructions-for-manual-testing)","lastModifiedDate":"2023-09-12"},{"lineNumber":43,"author":{"gitId":"-"},"content":"* Tutorials","lastModifiedDate":"2023-09-12"},{"lineNumber":44,"author":{"gitId":"-"},"content":" * [Tracing code]({{ baseUrl }}/tutorials/TracingCode.html)","lastModifiedDate":"2023-09-12"},{"lineNumber":45,"author":{"gitId":"-"},"content":" * [Adding a command]({{ baseUrl }}/tutorials/AddRemark.html)","lastModifiedDate":"2023-09-12"},{"lineNumber":46,"author":{"gitId":"-"},"content":" * [Removing Fields]({{ baseUrl }}/tutorials/RemovingFields.html)","lastModifiedDate":"2023-09-12"},{"lineNumber":47,"author":{"gitId":"-"},"content":"* [About Us]({{ baseUrl }}/AboutUs.html)","lastModifiedDate":"2023-09-12"},{"lineNumber":48,"author":{"gitId":"-"},"content":" \u003c/site-nav\u003e","lastModifiedDate":"2023-09-12"},{"lineNumber":49,"author":{"gitId":"-"},"content":" \u003c/div\u003e","lastModifiedDate":"2023-09-12"},{"lineNumber":50,"author":{"gitId":"-"},"content":" \u003c/nav\u003e","lastModifiedDate":"2023-09-12"},{"lineNumber":51,"author":{"gitId":"-"},"content":" \u003cdiv id\u003d\"content-wrapper\"\u003e","lastModifiedDate":"2023-09-12"},{"lineNumber":52,"author":{"gitId":"-"},"content":" {{ content }}","lastModifiedDate":"2023-09-12"},{"lineNumber":53,"author":{"gitId":"-"},"content":" \u003c/div\u003e","lastModifiedDate":"2023-09-12"},{"lineNumber":54,"author":{"gitId":"-"},"content":" \u003cnav id\u003d\"page-nav\"\u003e","lastModifiedDate":"2023-09-12"},{"lineNumber":55,"author":{"gitId":"-"},"content":" \u003cdiv class\u003d\"nav-component slim-scroll\"\u003e","lastModifiedDate":"2023-09-12"},{"lineNumber":56,"author":{"gitId":"-"},"content":" \u003cpage-nav /\u003e","lastModifiedDate":"2023-09-12"},{"lineNumber":57,"author":{"gitId":"-"},"content":" \u003c/div\u003e","lastModifiedDate":"2023-09-12"},{"lineNumber":58,"author":{"gitId":"-"},"content":" \u003c/nav\u003e","lastModifiedDate":"2023-09-12"},{"lineNumber":59,"author":{"gitId":"-"},"content":" \u003cscroll-top-button\u003e\u003c/scroll-top-button\u003e","lastModifiedDate":"2023-09-12"},{"lineNumber":60,"author":{"gitId":"-"},"content":"\u003c/div\u003e","lastModifiedDate":"2023-09-12"},{"lineNumber":61,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2023-09-12"},{"lineNumber":62,"author":{"gitId":"-"},"content":"\u003cfooter\u003e","lastModifiedDate":"2023-09-12"},{"lineNumber":63,"author":{"gitId":"-"},"content":" \u003c!-- Support MarkBind by including a link to us on your landing page! --\u003e","lastModifiedDate":"2023-09-12"},{"lineNumber":64,"author":{"gitId":"-"},"content":" \u003cdiv class\u003d\"text-center\"\u003e","lastModifiedDate":"2023-09-12"},{"lineNumber":65,"author":{"gitId":"-"},"content":" \u003csmall\u003e[\u003cmd\u003e**Powered by**\u003c/md\u003e \u003cimg src\u003d\"https://markbind.org/favicon.ico\" width\u003d\"30\"\u003e {{MarkBind}}, generated on {{timestamp}}]\u003c/small\u003e","lastModifiedDate":"2023-09-12"},{"lineNumber":66,"author":{"gitId":"-"},"content":" \u003c/div\u003e","lastModifiedDate":"2023-09-12"},{"lineNumber":67,"author":{"gitId":"-"},"content":"\u003c/footer\u003e","lastModifiedDate":"2023-09-12"}],"authorContributionMap":{"shayaansultan":1,"-":66}},{"path":"docs/team/hjungwoo01.md","fileType":"docs","lines":[{"lineNumber":1,"author":{"gitId":"hjungwoo01"},"content":"---","lastModifiedDate":"2024-03-07"},{"lineNumber":2,"author":{"gitId":"hjungwoo01"},"content":" layout: default.md","lastModifiedDate":"2024-03-07"},{"lineNumber":3,"author":{"gitId":"hjungwoo01"},"content":" title: \"Jay Hong\u0027s Project Portfolio Page\"","lastModifiedDate":"2024-03-07"},{"lineNumber":4,"author":{"gitId":"hjungwoo01"},"content":"---","lastModifiedDate":"2024-03-07"},{"lineNumber":5,"author":{"gitId":"hjungwoo01"},"content":"","lastModifiedDate":"2024-03-07"},{"lineNumber":6,"author":{"gitId":"hjungwoo01"},"content":"### Project: AddressBook Level 3","lastModifiedDate":"2024-03-07"},{"lineNumber":7,"author":{"gitId":"hjungwoo01"},"content":"","lastModifiedDate":"2024-03-07"},{"lineNumber":8,"author":{"gitId":"hjungwoo01"},"content":"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.","lastModifiedDate":"2024-03-07"},{"lineNumber":9,"author":{"gitId":"hjungwoo01"},"content":"","lastModifiedDate":"2024-03-07"},{"lineNumber":10,"author":{"gitId":"hjungwoo01"},"content":"Given below are my contributions to the project.","lastModifiedDate":"2024-03-07"},{"lineNumber":11,"author":{"gitId":"hjungwoo01"},"content":"","lastModifiedDate":"2024-03-07"},{"lineNumber":12,"author":{"gitId":"hjungwoo01"},"content":"* **New Feature**: Updated Developer Guide","lastModifiedDate":"2024-03-07"},{"lineNumber":13,"author":{"gitId":"hjungwoo01"},"content":"","lastModifiedDate":"2024-03-07"},{"lineNumber":14,"author":{"gitId":"hjungwoo01"},"content":"* **Code contributed**: [RepoSense link]()","lastModifiedDate":"2024-03-07"},{"lineNumber":15,"author":{"gitId":"hjungwoo01"},"content":"","lastModifiedDate":"2024-03-07"},{"lineNumber":16,"author":{"gitId":"hjungwoo01"},"content":"* **Project management**:","lastModifiedDate":"2024-03-07"},{"lineNumber":17,"author":{"gitId":"hjungwoo01"},"content":" * Managed releases `v1.3` - `v1.5rc` (3 releases) on GitHub","lastModifiedDate":"2024-03-07"},{"lineNumber":18,"author":{"gitId":"hjungwoo01"},"content":"","lastModifiedDate":"2024-03-07"},{"lineNumber":19,"author":{"gitId":"hjungwoo01"},"content":"* **Enhancements to existing features**:","lastModifiedDate":"2024-03-07"},{"lineNumber":20,"author":{"gitId":"hjungwoo01"},"content":" * Work in progress","lastModifiedDate":"2024-03-07"},{"lineNumber":21,"author":{"gitId":"hjungwoo01"},"content":"","lastModifiedDate":"2024-03-07"},{"lineNumber":22,"author":{"gitId":"hjungwoo01"},"content":"* **Documentation**:","lastModifiedDate":"2024-03-07"},{"lineNumber":23,"author":{"gitId":"hjungwoo01"},"content":" * User Guide:","lastModifiedDate":"2024-03-07"},{"lineNumber":24,"author":{"gitId":"hjungwoo01"},"content":" * Work in progress","lastModifiedDate":"2024-03-07"},{"lineNumber":25,"author":{"gitId":"hjungwoo01"},"content":" * Developer Guide:","lastModifiedDate":"2024-03-07"},{"lineNumber":26,"author":{"gitId":"hjungwoo01"},"content":" * Work in progress","lastModifiedDate":"2024-03-07"}],"authorContributionMap":{"hjungwoo01":26}},{"path":"docs/team/pyromancerboom.md","fileType":"docs","lines":[{"lineNumber":1,"author":{"gitId":"PyromancerBoom"},"content":"---","lastModifiedDate":"2024-03-07"},{"lineNumber":2,"author":{"gitId":"PyromancerBoom"},"content":" layout: default.md","lastModifiedDate":"2024-03-07"},{"lineNumber":3,"author":{"gitId":"PyromancerBoom"},"content":" title: \"Priyansh Bimbisariye\u0027s Project Portfolio Page\"","lastModifiedDate":"2024-03-07"},{"lineNumber":4,"author":{"gitId":"PyromancerBoom"},"content":"---","lastModifiedDate":"2024-03-07"},{"lineNumber":5,"author":{"gitId":"PyromancerBoom"},"content":"","lastModifiedDate":"2024-03-07"},{"lineNumber":6,"author":{"gitId":"PyromancerBoom"},"content":"### Project: AddressBook Level 3","lastModifiedDate":"2024-03-07"},{"lineNumber":7,"author":{"gitId":"PyromancerBoom"},"content":"","lastModifiedDate":"2024-03-07"},{"lineNumber":8,"author":{"gitId":"PyromancerBoom"},"content":"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.","lastModifiedDate":"2024-03-07"},{"lineNumber":9,"author":{"gitId":"PyromancerBoom"},"content":"","lastModifiedDate":"2024-03-07"},{"lineNumber":10,"author":{"gitId":"PyromancerBoom"},"content":"Given below are my contributions to the project.","lastModifiedDate":"2024-03-07"},{"lineNumber":11,"author":{"gitId":"PyromancerBoom"},"content":"","lastModifiedDate":"2024-03-07"},{"lineNumber":12,"author":{"gitId":"PyromancerBoom"},"content":"- **New Feature**: something","lastModifiedDate":"2024-03-07"},{"lineNumber":13,"author":{"gitId":"PyromancerBoom"},"content":"","lastModifiedDate":"2024-03-07"},{"lineNumber":14,"author":{"gitId":"PyromancerBoom"},"content":"- **Code contributed**: [RepoSense link]()","lastModifiedDate":"2024-03-07"},{"lineNumber":15,"author":{"gitId":"PyromancerBoom"},"content":"","lastModifiedDate":"2024-03-07"},{"lineNumber":16,"author":{"gitId":"PyromancerBoom"},"content":"- **Project management**:","lastModifiedDate":"2024-03-07"},{"lineNumber":17,"author":{"gitId":"PyromancerBoom"},"content":"","lastModifiedDate":"2024-03-07"},{"lineNumber":18,"author":{"gitId":"PyromancerBoom"},"content":" - Managed releases `v1.3` - `v1.5rc` (3 releases) on GitHub","lastModifiedDate":"2024-03-07"},{"lineNumber":19,"author":{"gitId":"PyromancerBoom"},"content":"","lastModifiedDate":"2024-03-07"},{"lineNumber":20,"author":{"gitId":"PyromancerBoom"},"content":"- **Enhancements to existing features**:","lastModifiedDate":"2024-03-07"},{"lineNumber":21,"author":{"gitId":"PyromancerBoom"},"content":"","lastModifiedDate":"2024-03-07"},{"lineNumber":22,"author":{"gitId":"PyromancerBoom"},"content":" - Work in progress","lastModifiedDate":"2024-03-07"},{"lineNumber":23,"author":{"gitId":"PyromancerBoom"},"content":"","lastModifiedDate":"2024-03-07"},{"lineNumber":24,"author":{"gitId":"PyromancerBoom"},"content":"- **Documentation**:","lastModifiedDate":"2024-03-07"},{"lineNumber":25,"author":{"gitId":"PyromancerBoom"},"content":" - User Guide:","lastModifiedDate":"2024-03-07"},{"lineNumber":26,"author":{"gitId":"PyromancerBoom"},"content":" - Work in progress","lastModifiedDate":"2024-03-07"},{"lineNumber":27,"author":{"gitId":"PyromancerBoom"},"content":" - Developer Guide:","lastModifiedDate":"2024-03-07"},{"lineNumber":28,"author":{"gitId":"PyromancerBoom"},"content":" - Work in progress","lastModifiedDate":"2024-03-07"}],"authorContributionMap":{"PyromancerBoom":28}},{"path":"docs/team/quelinxiao.md","fileType":"docs","lines":[{"lineNumber":1,"author":{"gitId":"quelinxiao"},"content":"---","lastModifiedDate":"2024-03-07"},{"lineNumber":2,"author":{"gitId":"quelinxiao"},"content":" layout: default.md","lastModifiedDate":"2024-03-07"},{"lineNumber":3,"author":{"gitId":"quelinxiao"},"content":" title: \"Que Linxiao\u0027s Project Portfolio Page\"","lastModifiedDate":"2024-03-07"},{"lineNumber":4,"author":{"gitId":"quelinxiao"},"content":"---","lastModifiedDate":"2024-03-07"},{"lineNumber":5,"author":{"gitId":"quelinxiao"},"content":"","lastModifiedDate":"2024-03-07"},{"lineNumber":6,"author":{"gitId":"quelinxiao"},"content":"### Project: AddressBook Level 3","lastModifiedDate":"2024-03-07"},{"lineNumber":7,"author":{"gitId":"quelinxiao"},"content":"","lastModifiedDate":"2024-03-07"},{"lineNumber":8,"author":{"gitId":"quelinxiao"},"content":"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.","lastModifiedDate":"2024-03-07"},{"lineNumber":9,"author":{"gitId":"quelinxiao"},"content":"","lastModifiedDate":"2024-03-07"},{"lineNumber":10,"author":{"gitId":"quelinxiao"},"content":"Given below are my contributions to the project.","lastModifiedDate":"2024-03-07"},{"lineNumber":11,"author":{"gitId":"quelinxiao"},"content":"","lastModifiedDate":"2024-03-07"},{"lineNumber":12,"author":{"gitId":"quelinxiao"},"content":"* **New Feature**: Added the ability to undo/redo previous commands.","lastModifiedDate":"2024-03-07"},{"lineNumber":13,"author":{"gitId":"quelinxiao"},"content":" * 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.","lastModifiedDate":"2024-03-07"},{"lineNumber":14,"author":{"gitId":"quelinxiao"},"content":" * 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.","lastModifiedDate":"2024-03-07"},{"lineNumber":15,"author":{"gitId":"quelinxiao"},"content":" * 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.","lastModifiedDate":"2024-03-07"},{"lineNumber":16,"author":{"gitId":"quelinxiao"},"content":" * 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}*","lastModifiedDate":"2024-03-07"},{"lineNumber":17,"author":{"gitId":"quelinxiao"},"content":"","lastModifiedDate":"2024-03-07"},{"lineNumber":18,"author":{"gitId":"quelinxiao"},"content":"* **New Feature**: Added a history command that allows the user to navigate to previous commands using up/down keys.","lastModifiedDate":"2024-03-07"},{"lineNumber":19,"author":{"gitId":"quelinxiao"},"content":"","lastModifiedDate":"2024-03-07"},{"lineNumber":20,"author":{"gitId":"quelinxiao"},"content":"* **Code contributed**: [RepoSense link]()","lastModifiedDate":"2024-03-07"},{"lineNumber":21,"author":{"gitId":"quelinxiao"},"content":"","lastModifiedDate":"2024-03-07"},{"lineNumber":22,"author":{"gitId":"quelinxiao"},"content":"* **Project management**:","lastModifiedDate":"2024-03-07"},{"lineNumber":23,"author":{"gitId":"quelinxiao"},"content":" * Managed releases `v1.3` - `v1.5rc` (3 releases) on GitHub","lastModifiedDate":"2024-03-07"},{"lineNumber":24,"author":{"gitId":"quelinxiao"},"content":"","lastModifiedDate":"2024-03-07"},{"lineNumber":25,"author":{"gitId":"quelinxiao"},"content":"* **Enhancements to existing features**:","lastModifiedDate":"2024-03-07"},{"lineNumber":26,"author":{"gitId":"quelinxiao"},"content":" * Updated the GUI color scheme (Pull requests [\\#33](), [\\#34]())","lastModifiedDate":"2024-03-07"},{"lineNumber":27,"author":{"gitId":"quelinxiao"},"content":" * Wrote additional tests for existing features to increase coverage from 88% to 92% (Pull requests [\\#36](), [\\#38]())","lastModifiedDate":"2024-03-07"},{"lineNumber":28,"author":{"gitId":"quelinxiao"},"content":"","lastModifiedDate":"2024-03-07"},{"lineNumber":29,"author":{"gitId":"quelinxiao"},"content":"* **Documentation**:","lastModifiedDate":"2024-03-07"},{"lineNumber":30,"author":{"gitId":"quelinxiao"},"content":" * User Guide:","lastModifiedDate":"2024-03-07"},{"lineNumber":31,"author":{"gitId":"quelinxiao"},"content":" * Added documentation for the features `delete` and `find` [\\#72]()","lastModifiedDate":"2024-03-07"},{"lineNumber":32,"author":{"gitId":"quelinxiao"},"content":" * Did cosmetic tweaks to existing documentation of features `clear`, `exit`: [\\#74]()","lastModifiedDate":"2024-03-07"},{"lineNumber":33,"author":{"gitId":"quelinxiao"},"content":" * Developer Guide:","lastModifiedDate":"2024-03-07"},{"lineNumber":34,"author":{"gitId":"quelinxiao"},"content":" * Added implementation details of the `delete` feature.","lastModifiedDate":"2024-03-07"},{"lineNumber":35,"author":{"gitId":"quelinxiao"},"content":"","lastModifiedDate":"2024-03-07"},{"lineNumber":36,"author":{"gitId":"quelinxiao"},"content":"* **Community**:","lastModifiedDate":"2024-03-07"},{"lineNumber":37,"author":{"gitId":"quelinxiao"},"content":" * PRs reviewed (with non-trivial review comments): [\\#12](), [\\#32](), [\\#19](), [\\#42]()","lastModifiedDate":"2024-03-07"},{"lineNumber":38,"author":{"gitId":"quelinxiao"},"content":" * Contributed to forum discussions (examples: [1](), [2](), [3](), [4]())","lastModifiedDate":"2024-03-07"},{"lineNumber":39,"author":{"gitId":"quelinxiao"},"content":" * Reported bugs and suggestions for other teams in the class (examples: [1](), [2](), [3]())","lastModifiedDate":"2024-03-07"},{"lineNumber":40,"author":{"gitId":"quelinxiao"},"content":" * Some parts of the history feature I added was adopted by several other class mates ([1](), [2]())","lastModifiedDate":"2024-03-07"},{"lineNumber":41,"author":{"gitId":"quelinxiao"},"content":"","lastModifiedDate":"2024-03-07"},{"lineNumber":42,"author":{"gitId":"quelinxiao"},"content":"* **Tools**:","lastModifiedDate":"2024-03-07"},{"lineNumber":43,"author":{"gitId":"quelinxiao"},"content":" * Integrated a third party library (Natty) to the project ([\\#42]())","lastModifiedDate":"2024-03-07"},{"lineNumber":44,"author":{"gitId":"quelinxiao"},"content":" * Integrated a new Github plugin (CircleCI) to the team repo","lastModifiedDate":"2024-03-07"},{"lineNumber":45,"author":{"gitId":"quelinxiao"},"content":"","lastModifiedDate":"2024-03-07"},{"lineNumber":46,"author":{"gitId":"quelinxiao"},"content":"* _{you can add/remove categories in the list above}_","lastModifiedDate":"2024-03-07"}],"authorContributionMap":{"quelinxiao":46}},{"path":"docs/team/shayaansultan.md","fileType":"docs","lines":[{"lineNumber":1,"author":{"gitId":"shayaansultan"},"content":"---","lastModifiedDate":"2024-03-07"},{"lineNumber":2,"author":{"gitId":"shayaansultan"},"content":" layout: default.md","lastModifiedDate":"2024-03-07"},{"lineNumber":3,"author":{"gitId":"shayaansultan"},"content":" title: \"Shayaan Sultan\u0027s Project Portfolio Page\"","lastModifiedDate":"2024-03-07"},{"lineNumber":4,"author":{"gitId":"shayaansultan"},"content":"---","lastModifiedDate":"2024-03-07"},{"lineNumber":5,"author":{"gitId":"shayaansultan"},"content":"","lastModifiedDate":"2024-03-07"},{"lineNumber":6,"author":{"gitId":"shayaansultan"},"content":"### Project: AddressBook Level 3","lastModifiedDate":"2024-03-07"},{"lineNumber":7,"author":{"gitId":"shayaansultan"},"content":"","lastModifiedDate":"2024-03-07"},{"lineNumber":8,"author":{"gitId":"shayaansultan"},"content":"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.","lastModifiedDate":"2024-03-07"},{"lineNumber":9,"author":{"gitId":"shayaansultan"},"content":"","lastModifiedDate":"2024-03-07"},{"lineNumber":10,"author":{"gitId":"shayaansultan"},"content":"Given below are my contributions to the project.","lastModifiedDate":"2024-03-07"},{"lineNumber":11,"author":{"gitId":"shayaansultan"},"content":"","lastModifiedDate":"2024-03-07"},{"lineNumber":12,"author":{"gitId":"shayaansultan"},"content":"* **New Feature**: Updated AboutUs and incharge of documentation","lastModifiedDate":"2024-03-07"},{"lineNumber":13,"author":{"gitId":"shayaansultan"},"content":"","lastModifiedDate":"2024-03-07"},{"lineNumber":14,"author":{"gitId":"shayaansultan"},"content":"* **Code contributed**: [RepoSense link]()","lastModifiedDate":"2024-03-07"},{"lineNumber":15,"author":{"gitId":"shayaansultan"},"content":"","lastModifiedDate":"2024-03-07"},{"lineNumber":16,"author":{"gitId":"shayaansultan"},"content":"* **Project management**:","lastModifiedDate":"2024-03-07"},{"lineNumber":17,"author":{"gitId":"shayaansultan"},"content":" * Managed releases `v1.3` - `v1.5rc` (3 releases) on GitHub","lastModifiedDate":"2024-03-07"},{"lineNumber":18,"author":{"gitId":"shayaansultan"},"content":"","lastModifiedDate":"2024-03-07"},{"lineNumber":19,"author":{"gitId":"shayaansultan"},"content":"* **Enhancements to existing features**:","lastModifiedDate":"2024-03-07"},{"lineNumber":20,"author":{"gitId":"shayaansultan"},"content":" * Work in progress","lastModifiedDate":"2024-03-07"},{"lineNumber":21,"author":{"gitId":"shayaansultan"},"content":"","lastModifiedDate":"2024-03-07"},{"lineNumber":22,"author":{"gitId":"shayaansultan"},"content":"* **Documentation**:","lastModifiedDate":"2024-03-07"},{"lineNumber":23,"author":{"gitId":"shayaansultan"},"content":" * User Guide:","lastModifiedDate":"2024-03-07"},{"lineNumber":24,"author":{"gitId":"shayaansultan"},"content":" * Work in progress","lastModifiedDate":"2024-03-07"},{"lineNumber":25,"author":{"gitId":"shayaansultan"},"content":" * Developer Guide:","lastModifiedDate":"2024-03-07"},{"lineNumber":26,"author":{"gitId":"shayaansultan"},"content":" * Work in progress","lastModifiedDate":"2024-03-07"}],"authorContributionMap":{"shayaansultan":26}}] diff --git a/AY2324S2-CS2103T-T17-2_tp_master/commits.json b/AY2324S2-CS2103T-T17-2_tp_master/commits.json index 045730d6..1a982e9e 100644 --- a/AY2324S2-CS2103T-T17-2_tp_master/commits.json +++ b/AY2324S2-CS2103T-T17-2_tp_master/commits.json @@ -1 +1 @@ -{"authorDailyContributionsMap":{"PyromancerBoom":[{"date":"2024-03-07","commitResults":[{"hash":"19f9e9863144539586056db10a9b2249a48e2270","isMergeCommit":false,"messageTitle":"Add acknowledgment for source code","messageBody":"","fileTypesAndContributionMap":{"docs":{"insertions":13,"deletions":9}}},{"hash":"7b3e29e6ff289ae3ab5d2aba444b6323faaaa1f4","isMergeCommit":true,"messageTitle":"Merge pull request #9 from PyromancerBoom/master","messageBody":"Add acknowledgment for source code","fileTypesAndContributionMap":{}},{"hash":"110c01b5060e26d268ef6cf77aee825522dfba0a","isMergeCommit":false,"messageTitle":"Update CI status","messageBody":"","fileTypesAndContributionMap":{"docs":{"insertions":1,"deletions":1}}},{"hash":"f7c4b8e6498203238ffc82fbc0581b94354adc8b","isMergeCommit":true,"messageTitle":"Merge branch \u0027AY2324S2-CS2103T-T17-2:master\u0027 into master","messageBody":"","fileTypesAndContributionMap":{}},{"hash":"ac89d6728390fb3e5fdfc29e0040dee2637aa15f","isMergeCommit":true,"messageTitle":"Merge pull request #10 from PyromancerBoom/master","messageBody":"Update CI status in the README","fileTypesAndContributionMap":{}},{"hash":"946582bda2ccd0a213dd43147461d8b1f8f3bc45","isMergeCommit":false,"messageTitle":"Fix CI status badge","messageBody":"","fileTypesAndContributionMap":{"docs":{"insertions":1,"deletions":1}}},{"hash":"7dbd4dadb5b49c8eca1f30bdea485d5e9e7f22bb","isMergeCommit":true,"messageTitle":"Merge branch \u0027master\u0027 of https://github.com/PyromancerBoom/tp","messageBody":"","fileTypesAndContributionMap":{}},{"hash":"1489ac8e8ef132e3960a4e1b3e6b953ea75b9f3a","isMergeCommit":true,"messageTitle":"Merge branch \u0027master\u0027 of https://github.com/PyromancerBoom/tp","messageBody":"","fileTypesAndContributionMap":{}},{"hash":"f4f41301a4fb2455358af84b105671e70025db88","isMergeCommit":true,"messageTitle":"Merge pull request #11 from PyromancerBoom/master","messageBody":"Fix status badge in readme","fileTypesAndContributionMap":{}},{"hash":"c7bdfbbdfb96ef786c95fd7d6339aeb9d590d5b0","isMergeCommit":false,"messageTitle":"update readme","messageBody":"","fileTypesAndContributionMap":{"docs":{"insertions":29,"deletions":10}}},{"hash":"3c48d5cba27b83c4a274e4d4fb1a3ec5d4b753a7","isMergeCommit":true,"messageTitle":"Merge pull request #15 from shayaansultan/branch-developer-guide-glossary","messageBody":"Update glossary in developer guide with important terms and definitions","fileTypesAndContributionMap":{}},{"hash":"a3093265c08df7dbcedaf11b04ee0d6e11e98144","isMergeCommit":false,"messageTitle":"Add developer info","messageBody":"","fileTypesAndContributionMap":{"docs":{"insertions":36,"deletions":37}}},{"hash":"d90f8f3a36f8d2b7b777eb073dcbdcb64aade46d","isMergeCommit":false,"messageTitle":"Add non-functional requirements","messageBody":"","fileTypesAndContributionMap":{"docs":{"insertions":100,"deletions":83}}},{"hash":"c862790fb021c004b92a484110572469a0c0e5b3","isMergeCommit":true,"messageTitle":"Merge branch \u0027nonfuncreq\u0027 of https://github.com/PyromancerBoom/tp into nonfuncreq","messageBody":"","fileTypesAndContributionMap":{}}]}],"quelinxiao":[{"date":"2024-03-07","commitResults":[{"hash":"052393a8a309750183c382f997ad065faa3a5293","isMergeCommit":false,"messageTitle":"update target user profile and value proposition in DG","messageBody":"","fileTypesAndContributionMap":{"docs":{"insertions":5,"deletions":5}}},{"hash":"0297562fa3623b71bbe64b88d57f157727e3f923","isMergeCommit":false,"messageTitle":"Add info of member quelinxiao","messageBody":"","fileTypesAndContributionMap":{"docs":{"insertions":54,"deletions":9}}},{"hash":"9621160059f9370d5abc5334fbef472d327cfb26","isMergeCommit":true,"messageTitle":"Merge pull request #26 from PyromancerBoom/nonfuncreq","messageBody":"Nonfuncreq","fileTypesAndContributionMap":{}}]}],"hjungwoo01":[{"date":"2024-03-07","commitResults":[{"hash":"20913c7a4cea361642c3b33ea7869b3547fe74b1","isMergeCommit":false,"messageTitle":"Add User Stories to Developer Guide","messageBody":"","fileTypesAndContributionMap":{"docs":{"insertions":7,"deletions":8}}},{"hash":"4b8a9145a984bb07c96ef6a9f03542f3f2b3ae32","isMergeCommit":true,"messageTitle":"Merge pull request #12 from hjungwoo01/add-HongJungWoo-info","messageBody":"Add User Stories to Developer Guide","fileTypesAndContributionMap":{}},{"hash":"96875775a8c329f69ce24369bec1c904b45ac972","isMergeCommit":true,"messageTitle":"Merge pull request #13 from shayaansultan/branch-shayaan-about-us","messageBody":"Update AboutUs documentation - Shayaan","fileTypesAndContributionMap":{}},{"hash":"a4d00629451bf2f62531a8f4c55da4b006bf2099","isMergeCommit":true,"messageTitle":"Merge pull request #14 from PyromancerBoom/product-readme","messageBody":"Update readme","fileTypesAndContributionMap":{}},{"hash":"e45015d43946a77c25eba360372a956bf7a50e3d","isMergeCommit":true,"messageTitle":"Merge pull request #16 from quelinxiao/branch-updateUserProfile_and_valueProposition","messageBody":"update target user profile and value proposition in DG","fileTypesAndContributionMap":{}},{"hash":"24d5f7381ef1cdcb941b2860e9d341711a27f602","isMergeCommit":false,"messageTitle":"Add info","messageBody":"","fileTypesAndContributionMap":{"docs":{"insertions":26,"deletions":0}}},{"hash":"67a9d870f686a7729417020fd605284262c740da","isMergeCommit":true,"messageTitle":"Merge pull request #22 from shayaansultan/branch-use-cases-developer-guide","messageBody":"Update Use Cases in Developer Guide","fileTypesAndContributionMap":{}},{"hash":"f173d8255fddc1e9acdec3c55eba2022628ad395","isMergeCommit":true,"messageTitle":"Merge branch \u0027master\u0027 into add-queLinxiao-info","messageBody":"","fileTypesAndContributionMap":{}},{"hash":"17027191b30f5c5d2bb07e701e32bd4bfa439fa7","isMergeCommit":true,"messageTitle":"Merge pull request #25 from quelinxiao/add-queLinxiao-info","messageBody":"Add info of member quelinxiao","fileTypesAndContributionMap":{}}]}],"shayaansultan":[{"date":"2024-02-23","commitResults":[{"hash":"3a95ce0cca3ebb115d15420434391eab177088b7","isMergeCommit":true,"messageTitle":"Merge switch-docs-to-markbind","messageBody":"","fileTypesAndContributionMap":{}}]},{"date":"2024-03-07","commitResults":[{"hash":"cecd61bacd95ff606ad1a1cf4f1cbc85d6dbcc55","isMergeCommit":false,"messageTitle":"Update docs for markbind","messageBody":"","fileTypesAndContributionMap":{"docs":{"insertions":1,"deletions":1}}},{"hash":"bc80753b9a2ec9f2c482c57682bd573ba3adb46e","isMergeCommit":false,"messageTitle":"Update AboutUs documentation","messageBody":"","fileTypesAndContributionMap":{"docs":{"insertions":30,"deletions":4}}},{"hash":"8efbbaab1b4b7d6e7721ba76adc8e34ed00bdab5","isMergeCommit":false,"messageTitle":"Update glossary in developer guide with important terms and definitions","messageBody":"","fileTypesAndContributionMap":{"docs":{"insertions":26,"deletions":0}}},{"hash":"159d44a3d0cd4620f9fe8d8ba012fad43f3b11ea","isMergeCommit":false,"messageTitle":"Update Use Cases in Developer Guide","messageBody":"","fileTypesAndContributionMap":{"docs":{"insertions":58,"deletions":14}}},{"hash":"96a3d80cf0a2f430a3fd87fd2e898989b4d997a9","isMergeCommit":true,"messageTitle":"Merge pull request #21 from PyromancerBoom/add-priyanshbimbisariye-info","messageBody":"Add developer info","fileTypesAndContributionMap":{}},{"hash":"cdbb10e165cf9e39f6ae6daaca7b84e8a3c6089f","isMergeCommit":true,"messageTitle":"Merge pull request #23 from hjungwoo01/add-HongJungWoo-info","messageBody":"Add info","fileTypesAndContributionMap":{}}]}]},"authorFileTypeContributionMap":{"PyromancerBoom":{"docs":159,"functional-code":0,"test-code":0},"quelinxiao":{"docs":53,"functional-code":0,"test-code":0},"hjungwoo01":{"docs":37,"functional-code":0,"test-code":0},"shayaansultan":{"docs":92,"functional-code":0,"test-code":0}},"authorContributionVariance":{"PyromancerBoom":6834.3525,"quelinxiao":353.45407,"hjungwoo01":111.49491,"shayaansultan":1190.9592},"authorDisplayNameMap":{"PyromancerBoom":"CS2103T-T17-2 BIMB..ANSH","quelinxiao":"CS2103T-T17-2 QUE ..XIAO","hjungwoo01":"CS2103T-T17-2 HONG.. WOO","shayaansultan":"CS2103T-T17-2 SULT..YAAN"}} +{"authorDailyContributionsMap":{"PyromancerBoom":[{"date":"2024-03-07","commitResults":[{"hash":"19f9e9863144539586056db10a9b2249a48e2270","isMergeCommit":false,"messageTitle":"Add acknowledgment for source code","messageBody":"","fileTypesAndContributionMap":{"docs":{"insertions":13,"deletions":9}}},{"hash":"7b3e29e6ff289ae3ab5d2aba444b6323faaaa1f4","isMergeCommit":true,"messageTitle":"Merge pull request #9 from PyromancerBoom/master","messageBody":"Add acknowledgment for source code","fileTypesAndContributionMap":{}},{"hash":"110c01b5060e26d268ef6cf77aee825522dfba0a","isMergeCommit":false,"messageTitle":"Update CI status","messageBody":"","fileTypesAndContributionMap":{"docs":{"insertions":1,"deletions":1}}},{"hash":"f7c4b8e6498203238ffc82fbc0581b94354adc8b","isMergeCommit":true,"messageTitle":"Merge branch \u0027AY2324S2-CS2103T-T17-2:master\u0027 into master","messageBody":"","fileTypesAndContributionMap":{}},{"hash":"ac89d6728390fb3e5fdfc29e0040dee2637aa15f","isMergeCommit":true,"messageTitle":"Merge pull request #10 from PyromancerBoom/master","messageBody":"Update CI status in the README","fileTypesAndContributionMap":{}},{"hash":"946582bda2ccd0a213dd43147461d8b1f8f3bc45","isMergeCommit":false,"messageTitle":"Fix CI status badge","messageBody":"","fileTypesAndContributionMap":{"docs":{"insertions":1,"deletions":1}}},{"hash":"7dbd4dadb5b49c8eca1f30bdea485d5e9e7f22bb","isMergeCommit":true,"messageTitle":"Merge branch \u0027master\u0027 of https://github.com/PyromancerBoom/tp","messageBody":"","fileTypesAndContributionMap":{}},{"hash":"1489ac8e8ef132e3960a4e1b3e6b953ea75b9f3a","isMergeCommit":true,"messageTitle":"Merge branch \u0027master\u0027 of https://github.com/PyromancerBoom/tp","messageBody":"","fileTypesAndContributionMap":{}},{"hash":"f4f41301a4fb2455358af84b105671e70025db88","isMergeCommit":true,"messageTitle":"Merge pull request #11 from PyromancerBoom/master","messageBody":"Fix status badge in readme","fileTypesAndContributionMap":{}},{"hash":"c7bdfbbdfb96ef786c95fd7d6339aeb9d590d5b0","isMergeCommit":false,"messageTitle":"update readme","messageBody":"","fileTypesAndContributionMap":{"docs":{"insertions":29,"deletions":10}}},{"hash":"3c48d5cba27b83c4a274e4d4fb1a3ec5d4b753a7","isMergeCommit":true,"messageTitle":"Merge pull request #15 from shayaansultan/branch-developer-guide-glossary","messageBody":"Update glossary in developer guide with important terms and definitions","fileTypesAndContributionMap":{}},{"hash":"a3093265c08df7dbcedaf11b04ee0d6e11e98144","isMergeCommit":false,"messageTitle":"Add developer info","messageBody":"","fileTypesAndContributionMap":{"docs":{"insertions":36,"deletions":37}}},{"hash":"d90f8f3a36f8d2b7b777eb073dcbdcb64aade46d","isMergeCommit":false,"messageTitle":"Add non-functional requirements","messageBody":"","fileTypesAndContributionMap":{"docs":{"insertions":100,"deletions":83}}},{"hash":"c862790fb021c004b92a484110572469a0c0e5b3","isMergeCommit":true,"messageTitle":"Merge branch \u0027nonfuncreq\u0027 of https://github.com/PyromancerBoom/tp into nonfuncreq","messageBody":"","fileTypesAndContributionMap":{}}]},{"date":"2024-03-08","commitResults":[{"hash":"e01451b3375bc218d5bcc9934cba289282e127dd","isMergeCommit":false,"messageTitle":"Update username in documentation","messageBody":"","fileTypesAndContributionMap":{"docs":{"insertions":2,"deletions":3}}},{"hash":"5e16c9ba3b0a8921265a9e72b4dc40aa6e119bf8","isMergeCommit":true,"messageTitle":"Merge pull request #27 from PyromancerBoom/master","messageBody":"Update username in documentation","fileTypesAndContributionMap":{}}]}],"quelinxiao":[{"date":"2024-03-07","commitResults":[{"hash":"052393a8a309750183c382f997ad065faa3a5293","isMergeCommit":false,"messageTitle":"update target user profile and value proposition in DG","messageBody":"","fileTypesAndContributionMap":{"docs":{"insertions":5,"deletions":5}}},{"hash":"0297562fa3623b71bbe64b88d57f157727e3f923","isMergeCommit":false,"messageTitle":"Add info of member quelinxiao","messageBody":"","fileTypesAndContributionMap":{"docs":{"insertions":54,"deletions":9}}},{"hash":"9621160059f9370d5abc5334fbef472d327cfb26","isMergeCommit":true,"messageTitle":"Merge pull request #26 from PyromancerBoom/nonfuncreq","messageBody":"Nonfuncreq","fileTypesAndContributionMap":{}}]}],"hjungwoo01":[{"date":"2024-03-07","commitResults":[{"hash":"20913c7a4cea361642c3b33ea7869b3547fe74b1","isMergeCommit":false,"messageTitle":"Add User Stories to Developer Guide","messageBody":"","fileTypesAndContributionMap":{"docs":{"insertions":7,"deletions":8}}},{"hash":"4b8a9145a984bb07c96ef6a9f03542f3f2b3ae32","isMergeCommit":true,"messageTitle":"Merge pull request #12 from hjungwoo01/add-HongJungWoo-info","messageBody":"Add User Stories to Developer Guide","fileTypesAndContributionMap":{}},{"hash":"96875775a8c329f69ce24369bec1c904b45ac972","isMergeCommit":true,"messageTitle":"Merge pull request #13 from shayaansultan/branch-shayaan-about-us","messageBody":"Update AboutUs documentation - Shayaan","fileTypesAndContributionMap":{}},{"hash":"a4d00629451bf2f62531a8f4c55da4b006bf2099","isMergeCommit":true,"messageTitle":"Merge pull request #14 from PyromancerBoom/product-readme","messageBody":"Update readme","fileTypesAndContributionMap":{}},{"hash":"e45015d43946a77c25eba360372a956bf7a50e3d","isMergeCommit":true,"messageTitle":"Merge pull request #16 from quelinxiao/branch-updateUserProfile_and_valueProposition","messageBody":"update target user profile and value proposition in DG","fileTypesAndContributionMap":{}},{"hash":"24d5f7381ef1cdcb941b2860e9d341711a27f602","isMergeCommit":false,"messageTitle":"Add info","messageBody":"","fileTypesAndContributionMap":{"docs":{"insertions":26,"deletions":0}}},{"hash":"67a9d870f686a7729417020fd605284262c740da","isMergeCommit":true,"messageTitle":"Merge pull request #22 from shayaansultan/branch-use-cases-developer-guide","messageBody":"Update Use Cases in Developer Guide","fileTypesAndContributionMap":{}},{"hash":"f173d8255fddc1e9acdec3c55eba2022628ad395","isMergeCommit":true,"messageTitle":"Merge branch \u0027master\u0027 into add-queLinxiao-info","messageBody":"","fileTypesAndContributionMap":{}},{"hash":"17027191b30f5c5d2bb07e701e32bd4bfa439fa7","isMergeCommit":true,"messageTitle":"Merge pull request #25 from quelinxiao/add-queLinxiao-info","messageBody":"Add info of member quelinxiao","fileTypesAndContributionMap":{}}]}],"shayaansultan":[{"date":"2024-02-23","commitResults":[{"hash":"3a95ce0cca3ebb115d15420434391eab177088b7","isMergeCommit":true,"messageTitle":"Merge switch-docs-to-markbind","messageBody":"","fileTypesAndContributionMap":{}}]},{"date":"2024-03-07","commitResults":[{"hash":"cecd61bacd95ff606ad1a1cf4f1cbc85d6dbcc55","isMergeCommit":false,"messageTitle":"Update docs for markbind","messageBody":"","fileTypesAndContributionMap":{"docs":{"insertions":1,"deletions":1}}},{"hash":"bc80753b9a2ec9f2c482c57682bd573ba3adb46e","isMergeCommit":false,"messageTitle":"Update AboutUs documentation","messageBody":"","fileTypesAndContributionMap":{"docs":{"insertions":30,"deletions":4}}},{"hash":"8efbbaab1b4b7d6e7721ba76adc8e34ed00bdab5","isMergeCommit":false,"messageTitle":"Update glossary in developer guide with important terms and definitions","messageBody":"","fileTypesAndContributionMap":{"docs":{"insertions":26,"deletions":0}}},{"hash":"159d44a3d0cd4620f9fe8d8ba012fad43f3b11ea","isMergeCommit":false,"messageTitle":"Update Use Cases in Developer Guide","messageBody":"","fileTypesAndContributionMap":{"docs":{"insertions":58,"deletions":14}}},{"hash":"96a3d80cf0a2f430a3fd87fd2e898989b4d997a9","isMergeCommit":true,"messageTitle":"Merge pull request #21 from PyromancerBoom/add-priyanshbimbisariye-info","messageBody":"Add developer info","fileTypesAndContributionMap":{}},{"hash":"cdbb10e165cf9e39f6ae6daaca7b84e8a3c6089f","isMergeCommit":true,"messageTitle":"Merge pull request #23 from hjungwoo01/add-HongJungWoo-info","messageBody":"Add info","fileTypesAndContributionMap":{}}]}]},"authorFileTypeContributionMap":{"PyromancerBoom":{"docs":159,"functional-code":0,"test-code":0},"quelinxiao":{"docs":53,"functional-code":0,"test-code":0},"hjungwoo01":{"docs":37,"functional-code":0,"test-code":0},"shayaansultan":{"docs":92,"functional-code":0,"test-code":0}},"authorContributionVariance":{"PyromancerBoom":6398.729,"quelinxiao":331.5822,"hjungwoo01":104.59555,"shayaansultan":1117.2622},"authorDisplayNameMap":{"PyromancerBoom":"CS2103T-T17-2 BIMB..ANSH","quelinxiao":"CS2103T-T17-2 QUE ..XIAO","hjungwoo01":"CS2103T-T17-2 HONG.. WOO","shayaansultan":"CS2103T-T17-2 SULT..YAAN"}} diff --git a/AY2324S2-CS2103T-W09-1_tp_master/authorship.json b/AY2324S2-CS2103T-W09-1_tp_master/authorship.json index 5c962bed..8de61bee 100644 --- a/AY2324S2-CS2103T-W09-1_tp_master/authorship.json +++ b/AY2324S2-CS2103T-W09-1_tp_master/authorship.json @@ -1 +1 @@ -[{"path":"docs/AboutUs.md","fileType":"docs","lines":[{"lineNumber":1,"author":{"gitId":"-"},"content":"---","lastModifiedDate":"2020-05-23"},{"lineNumber":2,"author":{"gitId":"-"},"content":"layout: page","lastModifiedDate":"2020-05-23"},{"lineNumber":3,"author":{"gitId":"-"},"content":"title: About Us","lastModifiedDate":"2020-05-23"},{"lineNumber":4,"author":{"gitId":"-"},"content":"---","lastModifiedDate":"2020-05-23"},{"lineNumber":5,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":6,"author":{"gitId":"-"},"content":"We are a team based in the [School of Computing, National University of Singapore](http://www.comp.nus.edu.sg).","lastModifiedDate":"2020-05-23"},{"lineNumber":7,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":8,"author":{"gitId":"LimZiJia"},"content":"You can reach us at the email `e0960005@comp.nus.edu`","lastModifiedDate":"2024-03-06"},{"lineNumber":9,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-06-17"},{"lineNumber":10,"author":{"gitId":"-"},"content":"## Project team","lastModifiedDate":"2020-06-07"},{"lineNumber":11,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":12,"author":{"gitId":"LimZiJia"},"content":"### Lim Zi Jia","lastModifiedDate":"2024-03-06"},{"lineNumber":13,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":14,"author":{"gitId":"LimZiJia"},"content":"\u003cimg src\u003d\"images/limzijia.png\" width\u003d\"200px\"\u003e","lastModifiedDate":"2024-03-06"},{"lineNumber":15,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":16,"author":{"gitId":"LimZiJia"},"content":"[[github](https://github.com/limzijia)]","lastModifiedDate":"2024-03-06"},{"lineNumber":17,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":18,"author":{"gitId":"LimZiJia"},"content":"* Role: Developer","lastModifiedDate":"2024-03-08"},{"lineNumber":19,"author":{"gitId":"LimZiJia"},"content":"* Responsibilities: Testing + logic","lastModifiedDate":"2024-03-08"},{"lineNumber":20,"author":{"gitId":"LimZiJia"},"content":"","lastModifiedDate":"2024-03-08"},{"lineNumber":21,"author":{"gitId":"GERARDJM018"},"content":"### Gerard Jeremiah Matthew","lastModifiedDate":"2024-03-07"},{"lineNumber":22,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":23,"author":{"gitId":"GERARDJM018"},"content":"\u003cimg src\u003d\"images/gerardjm018.png\" width\u003d\"200px\"\u003e","lastModifiedDate":"2024-03-07"},{"lineNumber":24,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":25,"author":{"gitId":"GERARDJM018"},"content":"[[github](https://github.com/GERARDJM018)]","lastModifiedDate":"2024-03-07"},{"lineNumber":26,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":27,"author":{"gitId":"LimZiJia"},"content":"* Role: Developer","lastModifiedDate":"2024-03-07"},{"lineNumber":28,"author":{"gitId":"LimZiJia"},"content":"* Responsibilities: Scheduling and Tracking + Model","lastModifiedDate":"2024-03-07"},{"lineNumber":29,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":30,"author":{"gitId":"gosongying"},"content":"### Go Song Ying","lastModifiedDate":"2024-03-08"},{"lineNumber":31,"author":{"gitId":"gosongying"},"content":"","lastModifiedDate":"2024-03-08"},{"lineNumber":32,"author":{"gitId":"gosongying"},"content":"\u003cimg src\u003d\"images/gosongying.png\" width\u003d\"200px\"\u003e","lastModifiedDate":"2024-03-08"},{"lineNumber":33,"author":{"gitId":"gosongying"},"content":"","lastModifiedDate":"2024-03-08"},{"lineNumber":34,"author":{"gitId":"gosongying"},"content":"[[github](https://github.com/gosongying)]","lastModifiedDate":"2024-03-08"},{"lineNumber":35,"author":{"gitId":"gosongying"},"content":"","lastModifiedDate":"2024-03-08"},{"lineNumber":36,"author":{"gitId":"gosongying"},"content":"* Role: Developer","lastModifiedDate":"2024-03-08"},{"lineNumber":37,"author":{"gitId":"gosongying"},"content":"* Responsibilities: Deliverables and deadlines + UI","lastModifiedDate":"2024-03-08"},{"lineNumber":38,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2024-03-08"},{"lineNumber":39,"author":{"gitId":"-"},"content":"### Jane Doe","lastModifiedDate":"2020-06-17"},{"lineNumber":40,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":41,"author":{"gitId":"-"},"content":"\u003cimg src\u003d\"images/johndoe.png\" width\u003d\"200px\"\u003e","lastModifiedDate":"2020-06-17"},{"lineNumber":42,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":43,"author":{"gitId":"-"},"content":"[[github](http://github.com/johndoe)]","lastModifiedDate":"2020-06-17"},{"lineNumber":44,"author":{"gitId":"-"},"content":"[[portfolio](team/johndoe.md)]","lastModifiedDate":"2020-05-23"},{"lineNumber":45,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":46,"author":{"gitId":"-"},"content":"* Role: Team Lead","lastModifiedDate":"2020-05-23"},{"lineNumber":47,"author":{"gitId":"-"},"content":"* Responsibilities: UI","lastModifiedDate":"2020-05-23"},{"lineNumber":48,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":49,"author":{"gitId":"-"},"content":"### Johnny Doe","lastModifiedDate":"2020-05-23"},{"lineNumber":50,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":51,"author":{"gitId":"-"},"content":"\u003cimg src\u003d\"images/johndoe.png\" width\u003d\"200px\"\u003e","lastModifiedDate":"2020-06-17"},{"lineNumber":52,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":53,"author":{"gitId":"-"},"content":"[[github](http://github.com/johndoe)] [[portfolio](team/johndoe.md)]","lastModifiedDate":"2020-06-17"},{"lineNumber":54,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":55,"author":{"gitId":"-"},"content":"* Role: Developer","lastModifiedDate":"2020-05-23"},{"lineNumber":56,"author":{"gitId":"-"},"content":"* Responsibilities: Data","lastModifiedDate":"2020-05-23"},{"lineNumber":57,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":58,"author":{"gitId":"-"},"content":"### Jean Doe","lastModifiedDate":"2020-06-17"},{"lineNumber":59,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":60,"author":{"gitId":"-"},"content":"\u003cimg src\u003d\"images/johndoe.png\" width\u003d\"200px\"\u003e","lastModifiedDate":"2020-06-17"},{"lineNumber":61,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":62,"author":{"gitId":"-"},"content":"[[github](http://github.com/johndoe)]","lastModifiedDate":"2020-06-17"},{"lineNumber":63,"author":{"gitId":"-"},"content":"[[portfolio](team/johndoe.md)]","lastModifiedDate":"2020-05-23"},{"lineNumber":64,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":65,"author":{"gitId":"-"},"content":"* Role: Developer","lastModifiedDate":"2020-05-23"},{"lineNumber":66,"author":{"gitId":"-"},"content":"* Responsibilities: Dev Ops + Threading","lastModifiedDate":"2020-05-23"},{"lineNumber":67,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":68,"author":{"gitId":"-"},"content":"### James Doe","lastModifiedDate":"2020-06-17"},{"lineNumber":69,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":70,"author":{"gitId":"-"},"content":"\u003cimg src\u003d\"images/johndoe.png\" width\u003d\"200px\"\u003e","lastModifiedDate":"2020-06-17"},{"lineNumber":71,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":72,"author":{"gitId":"-"},"content":"[[github](http://github.com/johndoe)]","lastModifiedDate":"2020-06-17"},{"lineNumber":73,"author":{"gitId":"-"},"content":"[[portfolio](team/johndoe.md)]","lastModifiedDate":"2020-05-23"},{"lineNumber":74,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":75,"author":{"gitId":"-"},"content":"* Role: Developer","lastModifiedDate":"2020-05-23"},{"lineNumber":76,"author":{"gitId":"-"},"content":"* Responsibilities: UI","lastModifiedDate":"2020-05-23"}],"authorContributionMap":{"LimZiJia":9,"gosongying":8,"-":56,"GERARDJM018":3}},{"path":"docs/DeveloperGuide.md","fileType":"docs","lines":[{"lineNumber":1,"author":{"gitId":"-"},"content":"---","lastModifiedDate":"2020-05-23"},{"lineNumber":2,"author":{"gitId":"-"},"content":"layout: page","lastModifiedDate":"2020-05-23"},{"lineNumber":3,"author":{"gitId":"-"},"content":"title: Developer Guide","lastModifiedDate":"2020-05-23"},{"lineNumber":4,"author":{"gitId":"-"},"content":"---","lastModifiedDate":"2020-05-23"},{"lineNumber":5,"author":{"gitId":"-"},"content":"* Table of Contents","lastModifiedDate":"2020-05-23"},{"lineNumber":6,"author":{"gitId":"-"},"content":"{:toc}","lastModifiedDate":"2020-05-23"},{"lineNumber":7,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":8,"author":{"gitId":"-"},"content":"--------------------------------------------------------------------------------------------------------------------","lastModifiedDate":"2020-05-23"},{"lineNumber":9,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2021-07-30"},{"lineNumber":10,"author":{"gitId":"-"},"content":"## **Acknowledgements**","lastModifiedDate":"2021-07-30"},{"lineNumber":11,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2021-07-30"},{"lineNumber":12,"author":{"gitId":"-"},"content":"* {list here sources of all reused/adapted ideas, code, documentation, and third-party libraries -- include links to the original source as well}","lastModifiedDate":"2021-07-30"},{"lineNumber":13,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2021-07-30"},{"lineNumber":14,"author":{"gitId":"-"},"content":"--------------------------------------------------------------------------------------------------------------------","lastModifiedDate":"2021-07-30"},{"lineNumber":15,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":16,"author":{"gitId":"-"},"content":"## **Setting up, getting started**","lastModifiedDate":"2020-05-23"},{"lineNumber":17,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":18,"author":{"gitId":"-"},"content":"Refer to the guide [_Setting up and getting started_](SettingUp.md).","lastModifiedDate":"2020-05-23"},{"lineNumber":19,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":20,"author":{"gitId":"-"},"content":"--------------------------------------------------------------------------------------------------------------------","lastModifiedDate":"2020-05-23"},{"lineNumber":21,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":22,"author":{"gitId":"-"},"content":"## **Design**","lastModifiedDate":"2020-05-23"},{"lineNumber":23,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":24,"author":{"gitId":"-"},"content":"\u003cdiv markdown\u003d\"span\" class\u003d\"alert alert-primary\"\u003e","lastModifiedDate":"2021-07-31"},{"lineNumber":25,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":26,"author":{"gitId":"-"},"content":":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.","lastModifiedDate":"2023-09-03"},{"lineNumber":27,"author":{"gitId":"-"},"content":"\u003c/div\u003e","lastModifiedDate":"2021-07-31"},{"lineNumber":28,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":29,"author":{"gitId":"-"},"content":"### Architecture","lastModifiedDate":"2021-07-31"},{"lineNumber":30,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":31,"author":{"gitId":"-"},"content":"\u003cimg src\u003d\"images/ArchitectureDiagram.png\" width\u003d\"280\" /\u003e","lastModifiedDate":"2021-07-31"},{"lineNumber":32,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":33,"author":{"gitId":"-"},"content":"The ***Architecture Diagram*** given above explains the high-level design of the App.","lastModifiedDate":"2021-07-31"},{"lineNumber":34,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":35,"author":{"gitId":"-"},"content":"Given below is a quick overview of main components and how they interact with each other.","lastModifiedDate":"2021-07-31"},{"lineNumber":36,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2021-07-31"},{"lineNumber":37,"author":{"gitId":"-"},"content":"**Main components of the architecture**","lastModifiedDate":"2021-07-31"},{"lineNumber":38,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":39,"author":{"gitId":"-"},"content":"**`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.","lastModifiedDate":"2023-09-03"},{"lineNumber":40,"author":{"gitId":"-"},"content":"* At app launch, it initializes the other components in the correct sequence, and connects them up with each other.","lastModifiedDate":"2023-09-03"},{"lineNumber":41,"author":{"gitId":"-"},"content":"* At shut down, it shuts down the other components and invokes cleanup methods where necessary.","lastModifiedDate":"2023-09-03"},{"lineNumber":42,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":43,"author":{"gitId":"-"},"content":"The bulk of the app\u0027s work is done by the following four components:","lastModifiedDate":"2023-09-03"},{"lineNumber":44,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":45,"author":{"gitId":"-"},"content":"* [**`UI`**](#ui-component): The UI of the App.","lastModifiedDate":"2020-05-23"},{"lineNumber":46,"author":{"gitId":"-"},"content":"* [**`Logic`**](#logic-component): The command executor.","lastModifiedDate":"2020-05-23"},{"lineNumber":47,"author":{"gitId":"-"},"content":"* [**`Model`**](#model-component): Holds the data of the App in memory.","lastModifiedDate":"2020-05-23"},{"lineNumber":48,"author":{"gitId":"-"},"content":"* [**`Storage`**](#storage-component): Reads data from, and writes data to, the hard disk.","lastModifiedDate":"2020-05-23"},{"lineNumber":49,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":50,"author":{"gitId":"-"},"content":"[**`Commons`**](#common-classes) represents a collection of classes used by multiple other components.","lastModifiedDate":"2023-09-03"},{"lineNumber":51,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":52,"author":{"gitId":"-"},"content":"**How the architecture components interact with each other**","lastModifiedDate":"2020-05-23"},{"lineNumber":53,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":54,"author":{"gitId":"-"},"content":"The *Sequence Diagram* below shows how the components interact with each other for the scenario where the user issues the command `delete 1`.","lastModifiedDate":"2020-05-23"},{"lineNumber":55,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":56,"author":{"gitId":"-"},"content":"\u003cimg src\u003d\"images/ArchitectureSequenceDiagram.png\" width\u003d\"574\" /\u003e","lastModifiedDate":"2020-06-07"},{"lineNumber":57,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":58,"author":{"gitId":"-"},"content":"Each of the four main components (also shown in the diagram above),","lastModifiedDate":"2021-07-31"},{"lineNumber":59,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2021-07-31"},{"lineNumber":60,"author":{"gitId":"-"},"content":"* defines its *API* in an `interface` with the same name as the Component.","lastModifiedDate":"2021-07-31"},{"lineNumber":61,"author":{"gitId":"-"},"content":"* implements its functionality using a concrete `{Component Name}Manager` class (which follows the corresponding API `interface` mentioned in the previous point.","lastModifiedDate":"2021-07-31"},{"lineNumber":62,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2021-07-31"},{"lineNumber":63,"author":{"gitId":"-"},"content":"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\u0027s being coupled to the implementation of a component), as illustrated in the (partial) class diagram below.","lastModifiedDate":"2021-07-31"},{"lineNumber":64,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2021-07-31"},{"lineNumber":65,"author":{"gitId":"-"},"content":"\u003cimg src\u003d\"images/ComponentManagers.png\" width\u003d\"300\" /\u003e","lastModifiedDate":"2021-07-31"},{"lineNumber":66,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2021-07-31"},{"lineNumber":67,"author":{"gitId":"-"},"content":"The sections below give more details of each component.","lastModifiedDate":"2020-05-23"},{"lineNumber":68,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":69,"author":{"gitId":"-"},"content":"### UI component","lastModifiedDate":"2020-05-23"},{"lineNumber":70,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":71,"author":{"gitId":"-"},"content":"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)","lastModifiedDate":"2021-07-31"},{"lineNumber":72,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":73,"author":{"gitId":"-"},"content":"![Structure of the UI Component](images/UiClassDiagram.png)","lastModifiedDate":"2021-07-31"},{"lineNumber":74,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":75,"author":{"gitId":"-"},"content":"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.","lastModifiedDate":"2021-07-31"},{"lineNumber":76,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":77,"author":{"gitId":"-"},"content":"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)","lastModifiedDate":"2021-07-31"},{"lineNumber":78,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":79,"author":{"gitId":"-"},"content":"The `UI` component,","lastModifiedDate":"2020-05-23"},{"lineNumber":80,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":81,"author":{"gitId":"-"},"content":"* executes user commands using the `Logic` component.","lastModifiedDate":"2021-07-31"},{"lineNumber":82,"author":{"gitId":"-"},"content":"* listens for changes to `Model` data so that the UI can be updated with the modified data.","lastModifiedDate":"2021-07-31"},{"lineNumber":83,"author":{"gitId":"-"},"content":"* keeps a reference to the `Logic` component, because the `UI` relies on the `Logic` to execute commands.","lastModifiedDate":"2021-07-31"},{"lineNumber":84,"author":{"gitId":"-"},"content":"* depends on some classes in the `Model` component, as it displays `Person` object residing in the `Model`.","lastModifiedDate":"2021-07-31"},{"lineNumber":85,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":86,"author":{"gitId":"-"},"content":"### Logic component","lastModifiedDate":"2020-05-23"},{"lineNumber":87,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":88,"author":{"gitId":"-"},"content":"**API** : [`Logic.java`](https://github.com/se-edu/addressbook-level3/tree/master/src/main/java/seedu/address/logic/Logic.java)","lastModifiedDate":"2021-07-31"},{"lineNumber":89,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":90,"author":{"gitId":"-"},"content":"Here\u0027s a (partial) class diagram of the `Logic` component:","lastModifiedDate":"2021-07-31"},{"lineNumber":91,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":92,"author":{"gitId":"-"},"content":"\u003cimg src\u003d\"images/LogicClassDiagram.png\" width\u003d\"550\"/\u003e","lastModifiedDate":"2021-07-31"},{"lineNumber":93,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":94,"author":{"gitId":"-"},"content":"The sequence diagram below illustrates the interactions within the `Logic` component, taking `execute(\"delete 1\")` API call as an example.","lastModifiedDate":"2023-09-03"},{"lineNumber":95,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":96,"author":{"gitId":"-"},"content":"![Interactions Inside the Logic Component for the `delete 1` Command](images/DeleteSequenceDiagram.png)","lastModifiedDate":"2020-05-23"},{"lineNumber":97,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":98,"author":{"gitId":"-"},"content":"\u003cdiv markdown\u003d\"span\" class\u003d\"alert alert-info\"\u003e:information_source: **Note:** The lifeline for `DeleteCommandParser` should end at the destroy marker (X) but due to a limitation of PlantUML, the lifeline continues till the end of diagram.","lastModifiedDate":"2024-02-09"},{"lineNumber":99,"author":{"gitId":"-"},"content":"\u003c/div\u003e","lastModifiedDate":"2020-05-23"},{"lineNumber":100,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":101,"author":{"gitId":"-"},"content":"How the `Logic` component works:","lastModifiedDate":"2023-09-03"},{"lineNumber":102,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2023-09-03"},{"lineNumber":103,"author":{"gitId":"-"},"content":"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.","lastModifiedDate":"2023-09-03"},{"lineNumber":104,"author":{"gitId":"-"},"content":"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`.","lastModifiedDate":"2023-09-03"},{"lineNumber":105,"author":{"gitId":"-"},"content":"1. The command can communicate with the `Model` when it is executed (e.g. to delete a person).\u003cbr\u003e","lastModifiedDate":"2024-02-09"},{"lineNumber":106,"author":{"gitId":"-"},"content":" Note that although this is shown as a single step in the diagram above (for simplicity), in the code it can take several interactions (between the command object and the `Model`) to achieve.","lastModifiedDate":"2024-02-09"},{"lineNumber":107,"author":{"gitId":"-"},"content":"1. The result of the command execution is encapsulated as a `CommandResult` object which is returned back from `Logic`.","lastModifiedDate":"2023-09-03"},{"lineNumber":108,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2023-09-03"},{"lineNumber":109,"author":{"gitId":"-"},"content":"Here are the other classes in `Logic` (omitted from the class diagram above) that are used for parsing a user command:","lastModifiedDate":"2021-07-31"},{"lineNumber":110,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2021-07-31"},{"lineNumber":111,"author":{"gitId":"-"},"content":"\u003cimg src\u003d\"images/ParserClasses.png\" width\u003d\"600\"/\u003e","lastModifiedDate":"2021-07-31"},{"lineNumber":112,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":113,"author":{"gitId":"-"},"content":"How the parsing works:","lastModifiedDate":"2021-07-31"},{"lineNumber":114,"author":{"gitId":"-"},"content":"* 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.","lastModifiedDate":"2021-07-31"},{"lineNumber":115,"author":{"gitId":"-"},"content":"* 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.","lastModifiedDate":"2021-07-31"},{"lineNumber":116,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":117,"author":{"gitId":"-"},"content":"### Model component","lastModifiedDate":"2021-07-31"},{"lineNumber":118,"author":{"gitId":"-"},"content":"**API** : [`Model.java`](https://github.com/se-edu/addressbook-level3/tree/master/src/main/java/seedu/address/model/Model.java)","lastModifiedDate":"2020-05-23"},{"lineNumber":119,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":120,"author":{"gitId":"-"},"content":"\u003cimg src\u003d\"images/ModelClassDiagram.png\" width\u003d\"450\" /\u003e","lastModifiedDate":"2021-07-31"},{"lineNumber":121,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":122,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":123,"author":{"gitId":"-"},"content":"The `Model` component,","lastModifiedDate":"2021-07-31"},{"lineNumber":124,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":125,"author":{"gitId":"-"},"content":"* stores the address book data i.e., all `Person` objects (which are contained in a `UniquePersonList` object).","lastModifiedDate":"2021-07-31"},{"lineNumber":126,"author":{"gitId":"-"},"content":"* stores the currently \u0027selected\u0027 `Person` objects (e.g., results of a search query) as a separate _filtered_ list which is exposed to outsiders as an unmodifiable `ObservableList\u003cPerson\u003e` that can be \u0027observed\u0027 e.g. the UI can be bound to this list so that the UI automatically updates when the data in the list change.","lastModifiedDate":"2021-07-31"},{"lineNumber":127,"author":{"gitId":"-"},"content":"* stores a `UserPref` object that represents the user’s preferences. This is exposed to the outside as a `ReadOnlyUserPref` objects.","lastModifiedDate":"2021-07-31"},{"lineNumber":128,"author":{"gitId":"-"},"content":"* 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)","lastModifiedDate":"2021-07-31"},{"lineNumber":129,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2021-07-31"},{"lineNumber":130,"author":{"gitId":"-"},"content":"\u003cdiv markdown\u003d\"span\" class\u003d\"alert alert-info\"\u003e: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.\u003cbr\u003e","lastModifiedDate":"2021-07-31"},{"lineNumber":131,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2021-07-31"},{"lineNumber":132,"author":{"gitId":"-"},"content":"\u003cimg src\u003d\"images/BetterModelClassDiagram.png\" width\u003d\"450\" /\u003e","lastModifiedDate":"2021-07-31"},{"lineNumber":133,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":134,"author":{"gitId":"-"},"content":"\u003c/div\u003e","lastModifiedDate":"2020-05-23"},{"lineNumber":135,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":136,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":137,"author":{"gitId":"-"},"content":"### Storage component","lastModifiedDate":"2020-05-23"},{"lineNumber":138,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":139,"author":{"gitId":"-"},"content":"**API** : [`Storage.java`](https://github.com/se-edu/addressbook-level3/tree/master/src/main/java/seedu/address/storage/Storage.java)","lastModifiedDate":"2020-05-23"},{"lineNumber":140,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":141,"author":{"gitId":"-"},"content":"\u003cimg src\u003d\"images/StorageClassDiagram.png\" width\u003d\"550\" /\u003e","lastModifiedDate":"2021-07-31"},{"lineNumber":142,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2021-07-31"},{"lineNumber":143,"author":{"gitId":"-"},"content":"The `Storage` component,","lastModifiedDate":"2020-05-23"},{"lineNumber":144,"author":{"gitId":"-"},"content":"* can save both address book data and user preference data in JSON format, and read them back into corresponding objects.","lastModifiedDate":"2023-09-03"},{"lineNumber":145,"author":{"gitId":"-"},"content":"* inherits from both `AddressBookStorage` and `UserPrefStorage`, which means it can be treated as either one (if only the functionality of only one is needed).","lastModifiedDate":"2021-07-31"},{"lineNumber":146,"author":{"gitId":"-"},"content":"* depends on some classes in the `Model` component (because the `Storage` component\u0027s job is to save/retrieve objects that belong to the `Model`)","lastModifiedDate":"2021-07-21"},{"lineNumber":147,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":148,"author":{"gitId":"-"},"content":"### Common classes","lastModifiedDate":"2020-05-23"},{"lineNumber":149,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":150,"author":{"gitId":"-"},"content":"Classes used by multiple components are in the `seedu.addressbook.commons` package.","lastModifiedDate":"2020-05-23"},{"lineNumber":151,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":152,"author":{"gitId":"-"},"content":"--------------------------------------------------------------------------------------------------------------------","lastModifiedDate":"2020-05-23"},{"lineNumber":153,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":154,"author":{"gitId":"-"},"content":"## **Implementation**","lastModifiedDate":"2020-05-23"},{"lineNumber":155,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":156,"author":{"gitId":"-"},"content":"This section describes some noteworthy details on how certain features are implemented.","lastModifiedDate":"2020-05-23"},{"lineNumber":157,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":158,"author":{"gitId":"-"},"content":"### \\[Proposed\\] Undo/redo feature","lastModifiedDate":"2020-06-07"},{"lineNumber":159,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":160,"author":{"gitId":"-"},"content":"#### Proposed Implementation","lastModifiedDate":"2020-05-23"},{"lineNumber":161,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":162,"author":{"gitId":"-"},"content":"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:","lastModifiedDate":"2020-05-23"},{"lineNumber":163,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":164,"author":{"gitId":"-"},"content":"* `VersionedAddressBook#commit()` — Saves the current address book state in its history.","lastModifiedDate":"2020-05-23"},{"lineNumber":165,"author":{"gitId":"-"},"content":"* `VersionedAddressBook#undo()` — Restores the previous address book state from its history.","lastModifiedDate":"2020-05-23"},{"lineNumber":166,"author":{"gitId":"-"},"content":"* `VersionedAddressBook#redo()` — Restores a previously undone address book state from its history.","lastModifiedDate":"2020-05-23"},{"lineNumber":167,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":168,"author":{"gitId":"-"},"content":"These operations are exposed in the `Model` interface as `Model#commitAddressBook()`, `Model#undoAddressBook()` and `Model#redoAddressBook()` respectively.","lastModifiedDate":"2020-05-23"},{"lineNumber":169,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":170,"author":{"gitId":"-"},"content":"Given below is an example usage scenario and how the undo/redo mechanism behaves at each step.","lastModifiedDate":"2020-05-23"},{"lineNumber":171,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":172,"author":{"gitId":"-"},"content":"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.","lastModifiedDate":"2020-05-23"},{"lineNumber":173,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":174,"author":{"gitId":"-"},"content":"![UndoRedoState0](images/UndoRedoState0.png)","lastModifiedDate":"2020-05-23"},{"lineNumber":175,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":176,"author":{"gitId":"-"},"content":"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.","lastModifiedDate":"2020-05-23"},{"lineNumber":177,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":178,"author":{"gitId":"-"},"content":"![UndoRedoState1](images/UndoRedoState1.png)","lastModifiedDate":"2020-05-23"},{"lineNumber":179,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":180,"author":{"gitId":"-"},"content":"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`.","lastModifiedDate":"2020-05-23"},{"lineNumber":181,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":182,"author":{"gitId":"-"},"content":"![UndoRedoState2](images/UndoRedoState2.png)","lastModifiedDate":"2020-05-23"},{"lineNumber":183,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":184,"author":{"gitId":"-"},"content":"\u003cdiv markdown\u003d\"span\" class\u003d\"alert alert-info\"\u003e: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`.","lastModifiedDate":"2020-05-23"},{"lineNumber":185,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":186,"author":{"gitId":"-"},"content":"\u003c/div\u003e","lastModifiedDate":"2020-05-23"},{"lineNumber":187,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":188,"author":{"gitId":"-"},"content":"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.","lastModifiedDate":"2020-05-23"},{"lineNumber":189,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":190,"author":{"gitId":"-"},"content":"![UndoRedoState3](images/UndoRedoState3.png)","lastModifiedDate":"2020-05-23"},{"lineNumber":191,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":192,"author":{"gitId":"-"},"content":"\u003cdiv markdown\u003d\"span\" class\u003d\"alert alert-info\"\u003e: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","lastModifiedDate":"2020-05-23"},{"lineNumber":193,"author":{"gitId":"-"},"content":"than attempting to perform the undo.","lastModifiedDate":"2020-05-23"},{"lineNumber":194,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":195,"author":{"gitId":"-"},"content":"\u003c/div\u003e","lastModifiedDate":"2020-05-23"},{"lineNumber":196,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":197,"author":{"gitId":"-"},"content":"The following sequence diagram shows how an undo operation goes through the `Logic` component:","lastModifiedDate":"2024-02-09"},{"lineNumber":198,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":199,"author":{"gitId":"-"},"content":"![UndoSequenceDiagram](images/UndoSequenceDiagram-Logic.png)","lastModifiedDate":"2024-02-09"},{"lineNumber":200,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":201,"author":{"gitId":"-"},"content":"\u003cdiv markdown\u003d\"span\" class\u003d\"alert alert-info\"\u003e: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.","lastModifiedDate":"2020-05-23"},{"lineNumber":202,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":203,"author":{"gitId":"-"},"content":"\u003c/div\u003e","lastModifiedDate":"2020-05-23"},{"lineNumber":204,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":205,"author":{"gitId":"-"},"content":"Similarly, how an undo operation goes through the `Model` component is shown below:","lastModifiedDate":"2024-02-09"},{"lineNumber":206,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2024-02-09"},{"lineNumber":207,"author":{"gitId":"-"},"content":"![UndoSequenceDiagram](images/UndoSequenceDiagram-Model.png)","lastModifiedDate":"2024-02-09"},{"lineNumber":208,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2024-02-09"},{"lineNumber":209,"author":{"gitId":"-"},"content":"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.","lastModifiedDate":"2020-05-23"},{"lineNumber":210,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":211,"author":{"gitId":"-"},"content":"\u003cdiv markdown\u003d\"span\" class\u003d\"alert alert-info\"\u003e: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.","lastModifiedDate":"2020-05-23"},{"lineNumber":212,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":213,"author":{"gitId":"-"},"content":"\u003c/div\u003e","lastModifiedDate":"2020-05-23"},{"lineNumber":214,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":215,"author":{"gitId":"-"},"content":"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.","lastModifiedDate":"2020-05-23"},{"lineNumber":216,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":217,"author":{"gitId":"-"},"content":"![UndoRedoState4](images/UndoRedoState4.png)","lastModifiedDate":"2020-05-23"},{"lineNumber":218,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":219,"author":{"gitId":"-"},"content":"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.","lastModifiedDate":"2020-05-23"},{"lineNumber":220,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":221,"author":{"gitId":"-"},"content":"![UndoRedoState5](images/UndoRedoState5.png)","lastModifiedDate":"2020-05-23"},{"lineNumber":222,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":223,"author":{"gitId":"-"},"content":"The following activity diagram summarizes what happens when a user executes a new command:","lastModifiedDate":"2020-05-23"},{"lineNumber":224,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":225,"author":{"gitId":"-"},"content":"\u003cimg src\u003d\"images/CommitActivityDiagram.png\" width\u003d\"250\" /\u003e","lastModifiedDate":"2021-07-31"},{"lineNumber":226,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":227,"author":{"gitId":"-"},"content":"#### Design considerations:","lastModifiedDate":"2021-07-31"},{"lineNumber":228,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":229,"author":{"gitId":"-"},"content":"**Aspect: How undo \u0026 redo executes:**","lastModifiedDate":"2021-07-31"},{"lineNumber":230,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":231,"author":{"gitId":"-"},"content":"* **Alternative 1 (current choice):** Saves the entire address book.","lastModifiedDate":"2020-05-23"},{"lineNumber":232,"author":{"gitId":"-"},"content":" * Pros: Easy to implement.","lastModifiedDate":"2020-05-23"},{"lineNumber":233,"author":{"gitId":"-"},"content":" * Cons: May have performance issues in terms of memory usage.","lastModifiedDate":"2020-05-23"},{"lineNumber":234,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":235,"author":{"gitId":"-"},"content":"* **Alternative 2:** Individual command knows how to undo/redo by","lastModifiedDate":"2020-05-23"},{"lineNumber":236,"author":{"gitId":"-"},"content":" itself.","lastModifiedDate":"2020-05-23"},{"lineNumber":237,"author":{"gitId":"-"},"content":" * Pros: Will use less memory (e.g. for `delete`, just save the person being deleted).","lastModifiedDate":"2020-05-23"},{"lineNumber":238,"author":{"gitId":"-"},"content":" * Cons: We must ensure that the implementation of each individual command are correct.","lastModifiedDate":"2020-05-23"},{"lineNumber":239,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":240,"author":{"gitId":"-"},"content":"_{more aspects and alternatives to be added}_","lastModifiedDate":"2020-05-23"},{"lineNumber":241,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":242,"author":{"gitId":"-"},"content":"### \\[Proposed\\] Data archiving","lastModifiedDate":"2020-05-23"},{"lineNumber":243,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":244,"author":{"gitId":"-"},"content":"_{Explain here how the data archiving feature will be implemented}_","lastModifiedDate":"2020-05-23"},{"lineNumber":245,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":246,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":247,"author":{"gitId":"-"},"content":"--------------------------------------------------------------------------------------------------------------------","lastModifiedDate":"2020-05-23"},{"lineNumber":248,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":249,"author":{"gitId":"-"},"content":"## **Documentation, logging, testing, configuration, dev-ops**","lastModifiedDate":"2020-06-07"},{"lineNumber":250,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":251,"author":{"gitId":"-"},"content":"* [Documentation guide](Documentation.md)","lastModifiedDate":"2020-06-07"},{"lineNumber":252,"author":{"gitId":"-"},"content":"* [Testing guide](Testing.md)","lastModifiedDate":"2020-06-07"},{"lineNumber":253,"author":{"gitId":"-"},"content":"* [Logging guide](Logging.md)","lastModifiedDate":"2020-06-07"},{"lineNumber":254,"author":{"gitId":"-"},"content":"* [Configuration guide](Configuration.md)","lastModifiedDate":"2020-06-07"},{"lineNumber":255,"author":{"gitId":"-"},"content":"* [DevOps guide](DevOps.md)","lastModifiedDate":"2020-06-07"},{"lineNumber":256,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":257,"author":{"gitId":"-"},"content":"--------------------------------------------------------------------------------------------------------------------","lastModifiedDate":"2020-05-23"},{"lineNumber":258,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":259,"author":{"gitId":"-"},"content":"## **Appendix: Requirements**","lastModifiedDate":"2020-05-23"},{"lineNumber":260,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":261,"author":{"gitId":"-"},"content":"### Product scope","lastModifiedDate":"2020-05-23"},{"lineNumber":262,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":263,"author":{"gitId":"-"},"content":"**Target user profile**:","lastModifiedDate":"2020-05-23"},{"lineNumber":264,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":265,"author":{"gitId":"LimZiJia"},"content":"* is a busy operator of a housekeeping company","lastModifiedDate":"2024-03-06"},{"lineNumber":266,"author":{"gitId":"LimZiJia"},"content":"* makes and receives calls to clients/housekeepers","lastModifiedDate":"2024-03-06"},{"lineNumber":267,"author":{"gitId":"LimZiJia"},"content":"* is responsible for managing a team of housekeepers","lastModifiedDate":"2024-03-06"},{"lineNumber":268,"author":{"gitId":"-"},"content":"* prefer desktop apps over other types","lastModifiedDate":"2020-05-23"},{"lineNumber":269,"author":{"gitId":"-"},"content":"* can type fast","lastModifiedDate":"2020-05-23"},{"lineNumber":270,"author":{"gitId":"-"},"content":"* prefers typing to mouse interactions","lastModifiedDate":"2020-05-26"},{"lineNumber":271,"author":{"gitId":"-"},"content":"* is reasonably comfortable using CLI apps","lastModifiedDate":"2020-05-23"},{"lineNumber":272,"author":{"gitId":"LimZiJia"},"content":"* works alone","lastModifiedDate":"2024-03-06"},{"lineNumber":273,"author":{"gitId":"LimZiJia"},"content":"","lastModifiedDate":"2024-03-06"},{"lineNumber":274,"author":{"gitId":"LimZiJia"},"content":"**Value proposition**: HouseKeeping Hub is designed to revolutionise the way housekeeping companies manage their client relationships. By focusing on storing and organising client and housekeeper contacts, our system offers unparalleled efficiency and convenience for housekeeping customer service admins, leading to improved service delivery and customer satisfaction.","lastModifiedDate":"2024-03-06"},{"lineNumber":275,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":276,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":277,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":278,"author":{"gitId":"-"},"content":"### User stories","lastModifiedDate":"2020-06-07"},{"lineNumber":279,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":280,"author":{"gitId":"-"},"content":"Priorities: High (must have) - `* * *`, Medium (nice to have) - `* *`, Low (unlikely to have) - `*`","lastModifiedDate":"2020-05-23"},{"lineNumber":281,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":282,"author":{"gitId":"LimZiJia"},"content":"| Priority | As a/an …​ | I can …​ | So that …​ |","lastModifiedDate":"2024-03-06"},{"lineNumber":283,"author":{"gitId":"LimZiJia"},"content":"|----------|-------------------------|--------------------------------------------------------------------------|-----------------------------------------------------------------------------------|","lastModifiedDate":"2024-03-06"},{"lineNumber":284,"author":{"gitId":"LimZiJia"},"content":"| `* * *` | operator | view the list of contacts | I can manage calling them if I have to. |","lastModifiedDate":"2024-03-06"},{"lineNumber":285,"author":{"gitId":"LimZiJia"},"content":"| `* * *` | operator | load contacts from a saved file | I can maintain my contact list. |","lastModifiedDate":"2024-03-06"},{"lineNumber":286,"author":{"gitId":"LimZiJia"},"content":"| `* * *` | operator | add/save the details of a new client/housekeeper | I can keep track of the list of the client/housekeeper. |","lastModifiedDate":"2024-03-06"},{"lineNumber":287,"author":{"gitId":"LimZiJia"},"content":"| `* * *` | operator | remove the contact of clients/housekeepers by some criteria | I can maintain a up-to-date and organised contact list. |","lastModifiedDate":"2024-03-06"},{"lineNumber":288,"author":{"gitId":"LimZiJia"},"content":"| `* *` | operator | update a client/housekeeper\u0027s information | I will not get details wrong even if they change. |","lastModifiedDate":"2024-03-06"},{"lineNumber":289,"author":{"gitId":"LimZiJia"},"content":"| `* *` | operator | remove the whole contact list with one click | I can remove all dummy data that I have added for trial. |","lastModifiedDate":"2024-03-06"},{"lineNumber":290,"author":{"gitId":"LimZiJia"},"content":"| `* *` | operator | retrieve details from specified contacts by their name or other criteria | I can save a lot of time to find specific clients and housekeepers. |","lastModifiedDate":"2024-03-06"},{"lineNumber":291,"author":{"gitId":"LimZiJia"},"content":"| `* *` | operator | check if clients that want a cleaning | I can provide timely housekeeping services and get more revenue for the business. |","lastModifiedDate":"2024-03-06"},{"lineNumber":292,"author":{"gitId":"LimZiJia"},"content":"| `* *` | careless operator | undo any accidental deletion or change made to the contact list | I will not mess the contact list up. |","lastModifiedDate":"2024-03-06"},{"lineNumber":293,"author":{"gitId":"LimZiJia"},"content":"| `* *` | operator | check the preferred housekeeper and their availability | I can inform the client whether the service could be operated or no. |","lastModifiedDate":"2024-03-06"},{"lineNumber":294,"author":{"gitId":"LimZiJia"},"content":"| `* *` | operator | retrieve details of a scheduled service | I can rectify on the ground situations. |","lastModifiedDate":"2024-03-06"},{"lineNumber":295,"author":{"gitId":"LimZiJia"},"content":"| `* *` | operator | check if a housekeeper is available | I can schedule for cleaning in emergency scenarios. |","lastModifiedDate":"2024-03-06"},{"lineNumber":296,"author":{"gitId":"LimZiJia"},"content":"| `* *` | fast-typing operator | quickly type CLI commands | I can perform my task efficiently. |","lastModifiedDate":"2024-03-06"},{"lineNumber":297,"author":{"gitId":"LimZiJia"},"content":"| `* *` | novice operator | use the easy-to-remember and well defined commands | I can adapt to the role of the operator quickly. |","lastModifiedDate":"2024-03-06"},{"lineNumber":298,"author":{"gitId":"LimZiJia"},"content":"| `* *` | operator | access to the contact list from different devices or platforms | I can manage the contact list on-the-go. |","lastModifiedDate":"2024-03-06"},{"lineNumber":299,"author":{"gitId":"LimZiJia"},"content":"| `* *` | novice operator | query for a help list of commands and how to use them | I can learn the functionalities of the app quickly. |","lastModifiedDate":"2024-03-06"},{"lineNumber":300,"author":{"gitId":"LimZiJia"},"content":"| `* *` | impatient operator | the command to response quickly | I can finish my job fast. |","lastModifiedDate":"2024-03-06"},{"lineNumber":301,"author":{"gitId":"LimZiJia"},"content":"| `* *` | operator | diffrentiate between the clients and housekeeper data | I will not be confused by the data. |","lastModifiedDate":"2024-03-06"},{"lineNumber":302,"author":{"gitId":"LimZiJia"},"content":"| `* *` | large company operator | to be able to save more than 1000 client\u0027s data/contact | I can list all the company\u0027s client. |","lastModifiedDate":"2024-03-06"},{"lineNumber":303,"author":{"gitId":"LimZiJia"},"content":"| `* *` | operator | the company clients\u0027 data safe | the clients can feel assured to give us their data. |","lastModifiedDate":"2024-03-06"},{"lineNumber":304,"author":{"gitId":"LimZiJia"},"content":"| `* *` | not tech savvy operator | the program to be easy to use | I don\u0027t need extra time to study how to use the program. |","lastModifiedDate":"2024-03-06"},{"lineNumber":305,"author":{"gitId":"LimZiJia"},"content":"| `* *` | operator | search and retrieve information quickly | I can relay information in real time. |","lastModifiedDate":"2024-03-06"},{"lineNumber":306,"author":{"gitId":"LimZiJia"},"content":"| `* *` | operator | Save housekeeping session details | I can prove a housekeeper has done the job. |","lastModifiedDate":"2024-03-06"},{"lineNumber":307,"author":{"gitId":"LimZiJia"},"content":"| `* *` | operator | sort the contact list by days to next preferred cleaning date | I can remind clients to book their next service soon. |","lastModifiedDate":"2024-03-06"},{"lineNumber":308,"author":{"gitId":"LimZiJia"},"content":"| `* *` | operator | sort the contact list by some parameters | I can have a better visualisation of the data. |","lastModifiedDate":"2024-03-06"},{"lineNumber":309,"author":{"gitId":"LimZiJia"},"content":"| `* *` | operator | filter for housekeepers from some parameters | it is easier for me to schedule appointments. |","lastModifiedDate":"2024-03-06"},{"lineNumber":310,"author":{"gitId":"LimZiJia"},"content":"| `*` | forgetful operator | add tags to contacts | I can make notes on what I want to do with the contact. |","lastModifiedDate":"2024-03-06"},{"lineNumber":311,"author":{"gitId":"LimZiJia"},"content":"| `*` | operator | import a contact list from an external file | I can easily transform existing contact information from other sources. |","lastModifiedDate":"2024-03-06"},{"lineNumber":312,"author":{"gitId":"LimZiJia"},"content":"| `*` | Anxious Operator | the program to have auto-save function | I can feel assured if anything happen to my device. |","lastModifiedDate":"2024-03-06"},{"lineNumber":313,"author":{"gitId":"LimZiJia"},"content":"| `*` | Expert CLI user | Define my own command aliases | I can better optimise the speed of my work. |","lastModifiedDate":"2024-03-06"},{"lineNumber":314,"author":{"gitId":"LimZiJia"},"content":"| `*` | operator | Add multiple of each action at once | I can improve my work flow. |","lastModifiedDate":"2024-03-06"},{"lineNumber":315,"author":{"gitId":"LimZiJia"},"content":"| `*` | operator | group clients/housekeepers by certain features (area) | I can organise the data better and make better client-housekeeper matches. |","lastModifiedDate":"2024-03-06"},{"lineNumber":316,"author":{"gitId":"LimZiJia"},"content":"","lastModifiedDate":"2024-03-06"},{"lineNumber":317,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":318,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":319,"author":{"gitId":"-"},"content":"### Use cases","lastModifiedDate":"2020-06-07"},{"lineNumber":320,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":321,"author":{"gitId":"moguries"},"content":"(For all use cases below, the **System** is the `HouseKeeping Hub` and the **Actor** is the `operator`, unless specified otherwise)","lastModifiedDate":"2024-03-07"},{"lineNumber":322,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":323,"author":{"gitId":"moguries"},"content":"Preconditions: Operator is logged in.","lastModifiedDate":"2024-03-07"},{"lineNumber":324,"author":{"gitId":"moguries"},"content":"","lastModifiedDate":"2024-03-07"},{"lineNumber":325,"author":{"gitId":"moguries"},"content":"**Use case: UC01 - List clients**","lastModifiedDate":"2024-03-07"},{"lineNumber":326,"author":{"gitId":"moguries"},"content":"","lastModifiedDate":"2024-03-07"},{"lineNumber":327,"author":{"gitId":"moguries"},"content":"**MSS**","lastModifiedDate":"2024-03-07"},{"lineNumber":328,"author":{"gitId":"moguries"},"content":"","lastModifiedDate":"2024-03-07"},{"lineNumber":329,"author":{"gitId":"moguries"},"content":"1. Operator requests to list clients","lastModifiedDate":"2024-03-07"},{"lineNumber":330,"author":{"gitId":"moguries"},"content":"2. HouseKeeping Hub shows the list of clients","lastModifiedDate":"2024-03-07"},{"lineNumber":331,"author":{"gitId":"moguries"},"content":"","lastModifiedDate":"2024-03-07"},{"lineNumber":332,"author":{"gitId":"moguries"},"content":" Use case ends.","lastModifiedDate":"2024-03-07"},{"lineNumber":333,"author":{"gitId":"moguries"},"content":"","lastModifiedDate":"2024-03-07"},{"lineNumber":334,"author":{"gitId":"moguries"},"content":"**Extensions**","lastModifiedDate":"2024-03-07"},{"lineNumber":335,"author":{"gitId":"moguries"},"content":"","lastModifiedDate":"2024-03-07"},{"lineNumber":336,"author":{"gitId":"moguries"},"content":"* 2a. The list is empty.","lastModifiedDate":"2024-03-07"},{"lineNumber":337,"author":{"gitId":"moguries"},"content":"","lastModifiedDate":"2024-03-07"},{"lineNumber":338,"author":{"gitId":"moguries"},"content":" * 2a1. HouseKeeping Hub shows a message that the list is empty.","lastModifiedDate":"2024-03-07"},{"lineNumber":339,"author":{"gitId":"moguries"},"content":"","lastModifiedDate":"2024-03-07"},{"lineNumber":340,"author":{"gitId":"moguries"},"content":" Use case ends.","lastModifiedDate":"2024-03-07"},{"lineNumber":341,"author":{"gitId":"moguries"},"content":"","lastModifiedDate":"2024-03-07"},{"lineNumber":342,"author":{"gitId":"moguries"},"content":"**Use case: UC02 - List housekeepers**","lastModifiedDate":"2024-03-07"},{"lineNumber":343,"author":{"gitId":"moguries"},"content":"","lastModifiedDate":"2024-03-07"},{"lineNumber":344,"author":{"gitId":"moguries"},"content":"**MSS**","lastModifiedDate":"2024-03-07"},{"lineNumber":345,"author":{"gitId":"moguries"},"content":"","lastModifiedDate":"2024-03-07"},{"lineNumber":346,"author":{"gitId":"moguries"},"content":"1. Operator requests to list housekeepers","lastModifiedDate":"2024-03-07"},{"lineNumber":347,"author":{"gitId":"moguries"},"content":"2. HouseKeeping Hub shows the list of housekeepers","lastModifiedDate":"2024-03-07"},{"lineNumber":348,"author":{"gitId":"moguries"},"content":"","lastModifiedDate":"2024-03-07"},{"lineNumber":349,"author":{"gitId":"moguries"},"content":" Use case ends.","lastModifiedDate":"2024-03-07"},{"lineNumber":350,"author":{"gitId":"moguries"},"content":"","lastModifiedDate":"2024-03-07"},{"lineNumber":351,"author":{"gitId":"moguries"},"content":"**Extensions**","lastModifiedDate":"2024-03-07"},{"lineNumber":352,"author":{"gitId":"moguries"},"content":"","lastModifiedDate":"2024-03-07"},{"lineNumber":353,"author":{"gitId":"moguries"},"content":"* 2a. The list is empty.","lastModifiedDate":"2024-03-07"},{"lineNumber":354,"author":{"gitId":"moguries"},"content":"","lastModifiedDate":"2024-03-07"},{"lineNumber":355,"author":{"gitId":"moguries"},"content":" * 2a1. HouseKeeping Hub shows a message that the list is empty. ","lastModifiedDate":"2024-03-07"},{"lineNumber":356,"author":{"gitId":"moguries"},"content":"","lastModifiedDate":"2024-03-07"},{"lineNumber":357,"author":{"gitId":"moguries"},"content":" Use case ends.","lastModifiedDate":"2024-03-07"},{"lineNumber":358,"author":{"gitId":"moguries"},"content":"","lastModifiedDate":"2024-03-07"},{"lineNumber":359,"author":{"gitId":"moguries"},"content":"**Use case: UC03 - Add client**","lastModifiedDate":"2024-03-07"},{"lineNumber":360,"author":{"gitId":"moguries"},"content":"","lastModifiedDate":"2024-03-07"},{"lineNumber":361,"author":{"gitId":"moguries"},"content":"**MSS**","lastModifiedDate":"2024-03-07"},{"lineNumber":362,"author":{"gitId":"moguries"},"content":"","lastModifiedDate":"2024-03-07"},{"lineNumber":363,"author":{"gitId":"moguries"},"content":"1. Operator requests to add a client","lastModifiedDate":"2024-03-07"},{"lineNumber":364,"author":{"gitId":"moguries"},"content":"2. HouseKeeping Hub adds the client","lastModifiedDate":"2024-03-07"},{"lineNumber":365,"author":{"gitId":"moguries"},"content":"","lastModifiedDate":"2024-03-07"},{"lineNumber":366,"author":{"gitId":"moguries"},"content":" Use case ends.","lastModifiedDate":"2024-03-07"},{"lineNumber":367,"author":{"gitId":"moguries"},"content":"","lastModifiedDate":"2024-03-07"},{"lineNumber":368,"author":{"gitId":"moguries"},"content":"**Extensions**","lastModifiedDate":"2024-03-07"},{"lineNumber":369,"author":{"gitId":"moguries"},"content":"","lastModifiedDate":"2024-03-07"},{"lineNumber":370,"author":{"gitId":"moguries"},"content":"* 1a. An [/argument] is spelled incorrectly.","lastModifiedDate":"2024-03-07"},{"lineNumber":371,"author":{"gitId":"moguries"},"content":"","lastModifiedDate":"2024-03-07"},{"lineNumber":372,"author":{"gitId":"moguries"},"content":" * 1a1. HouseKeeping Hub shows an error message.","lastModifiedDate":"2024-03-07"},{"lineNumber":373,"author":{"gitId":"moguries"},"content":"","lastModifiedDate":"2024-03-07"},{"lineNumber":374,"author":{"gitId":"moguries"},"content":" Use case ends.","lastModifiedDate":"2024-03-07"},{"lineNumber":375,"author":{"gitId":"moguries"},"content":"","lastModifiedDate":"2024-03-07"},{"lineNumber":376,"author":{"gitId":"moguries"},"content":"* 1a. A given argument is invalid.","lastModifiedDate":"2024-03-07"},{"lineNumber":377,"author":{"gitId":"moguries"},"content":"","lastModifiedDate":"2024-03-07"},{"lineNumber":378,"author":{"gitId":"moguries"},"content":" * 1a1. HouseKeeping Hub shows an error message.","lastModifiedDate":"2024-03-07"},{"lineNumber":379,"author":{"gitId":"moguries"},"content":"","lastModifiedDate":"2024-03-07"},{"lineNumber":380,"author":{"gitId":"moguries"},"content":" Use case ends.","lastModifiedDate":"2024-03-07"},{"lineNumber":381,"author":{"gitId":"moguries"},"content":"","lastModifiedDate":"2024-03-07"},{"lineNumber":382,"author":{"gitId":"moguries"},"content":"**Use case: UC04 - Add housekeeper**","lastModifiedDate":"2024-03-07"},{"lineNumber":383,"author":{"gitId":"moguries"},"content":"","lastModifiedDate":"2024-03-07"},{"lineNumber":384,"author":{"gitId":"moguries"},"content":"**MSS**","lastModifiedDate":"2024-03-07"},{"lineNumber":385,"author":{"gitId":"moguries"},"content":"","lastModifiedDate":"2024-03-07"},{"lineNumber":386,"author":{"gitId":"moguries"},"content":"1. Operator requests to add a housekeeper","lastModifiedDate":"2024-03-07"},{"lineNumber":387,"author":{"gitId":"moguries"},"content":"2. HouseKeeping Hub adds the housekeeper","lastModifiedDate":"2024-03-07"},{"lineNumber":388,"author":{"gitId":"moguries"},"content":"","lastModifiedDate":"2024-03-07"},{"lineNumber":389,"author":{"gitId":"moguries"},"content":" Use case ends.","lastModifiedDate":"2024-03-07"},{"lineNumber":390,"author":{"gitId":"moguries"},"content":"","lastModifiedDate":"2024-03-07"},{"lineNumber":391,"author":{"gitId":"moguries"},"content":"**Extensions**","lastModifiedDate":"2024-03-07"},{"lineNumber":392,"author":{"gitId":"moguries"},"content":"","lastModifiedDate":"2024-03-07"},{"lineNumber":393,"author":{"gitId":"moguries"},"content":"* 1a. An [/argument] is spelled incorrectly.","lastModifiedDate":"2024-03-07"},{"lineNumber":394,"author":{"gitId":"moguries"},"content":"","lastModifiedDate":"2024-03-07"},{"lineNumber":395,"author":{"gitId":"moguries"},"content":" * 1a1. HouseKeeping Hub shows an error message.","lastModifiedDate":"2024-03-07"},{"lineNumber":396,"author":{"gitId":"moguries"},"content":"","lastModifiedDate":"2024-03-07"},{"lineNumber":397,"author":{"gitId":"moguries"},"content":" Use case ends.","lastModifiedDate":"2024-03-07"},{"lineNumber":398,"author":{"gitId":"moguries"},"content":"","lastModifiedDate":"2024-03-07"},{"lineNumber":399,"author":{"gitId":"moguries"},"content":"* 1a. A given argument is invalid.","lastModifiedDate":"2024-03-07"},{"lineNumber":400,"author":{"gitId":"moguries"},"content":"","lastModifiedDate":"2024-03-07"},{"lineNumber":401,"author":{"gitId":"moguries"},"content":" * 1a1. HouseKeeping Hub shows an error message.","lastModifiedDate":"2024-03-07"},{"lineNumber":402,"author":{"gitId":"moguries"},"content":"","lastModifiedDate":"2024-03-07"},{"lineNumber":403,"author":{"gitId":"moguries"},"content":" Use case ends.","lastModifiedDate":"2024-03-07"},{"lineNumber":404,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2024-03-07"},{"lineNumber":405,"author":{"gitId":"moguries"},"content":"**Use case: UC05 - Delete client**","lastModifiedDate":"2024-03-07"},{"lineNumber":406,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":407,"author":{"gitId":"-"},"content":"**MSS**","lastModifiedDate":"2020-05-23"},{"lineNumber":408,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":409,"author":{"gitId":"moguries"},"content":"1. Operator requests to list clients","lastModifiedDate":"2024-03-07"},{"lineNumber":410,"author":{"gitId":"moguries"},"content":"2. HouseKeeping Hub shows the list of clients","lastModifiedDate":"2024-03-07"},{"lineNumber":411,"author":{"gitId":"moguries"},"content":"3. Operator requests to delete a specific client in the list","lastModifiedDate":"2024-03-07"},{"lineNumber":412,"author":{"gitId":"moguries"},"content":"4. HouseKeeping Hub deletes the client","lastModifiedDate":"2024-03-07"},{"lineNumber":413,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":414,"author":{"gitId":"-"},"content":" Use case ends.","lastModifiedDate":"2020-05-23"},{"lineNumber":415,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":416,"author":{"gitId":"-"},"content":"**Extensions**","lastModifiedDate":"2020-05-23"},{"lineNumber":417,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":418,"author":{"gitId":"-"},"content":"* 2a. The list is empty.","lastModifiedDate":"2020-05-23"},{"lineNumber":419,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":420,"author":{"gitId":"-"},"content":" Use case ends.","lastModifiedDate":"2020-05-23"},{"lineNumber":421,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":422,"author":{"gitId":"-"},"content":"* 3a. The given index is invalid.","lastModifiedDate":"2020-05-23"},{"lineNumber":423,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":424,"author":{"gitId":"moguries"},"content":" * 3a1. HouseKeeping Hub shows an error message.","lastModifiedDate":"2024-03-07"},{"lineNumber":425,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":426,"author":{"gitId":"-"},"content":" Use case resumes at step 2.","lastModifiedDate":"2020-05-23"},{"lineNumber":427,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":428,"author":{"gitId":"moguries"},"content":"**Use case: UC06 - Delete housekeeper**","lastModifiedDate":"2024-03-07"},{"lineNumber":429,"author":{"gitId":"moguries"},"content":"","lastModifiedDate":"2024-03-07"},{"lineNumber":430,"author":{"gitId":"moguries"},"content":"**MSS**","lastModifiedDate":"2024-03-07"},{"lineNumber":431,"author":{"gitId":"moguries"},"content":"","lastModifiedDate":"2024-03-07"},{"lineNumber":432,"author":{"gitId":"moguries"},"content":"1. Operator requests to list housekeepers","lastModifiedDate":"2024-03-07"},{"lineNumber":433,"author":{"gitId":"moguries"},"content":"2. HouseKeeping Hub shows the list of housekeepers","lastModifiedDate":"2024-03-07"},{"lineNumber":434,"author":{"gitId":"moguries"},"content":"3. Operator requests to delete a specific housekeeper in the list","lastModifiedDate":"2024-03-07"},{"lineNumber":435,"author":{"gitId":"moguries"},"content":"4. HouseKeeping Hub deletes the housekeeper","lastModifiedDate":"2024-03-07"},{"lineNumber":436,"author":{"gitId":"moguries"},"content":"","lastModifiedDate":"2024-03-07"},{"lineNumber":437,"author":{"gitId":"moguries"},"content":" Use case ends.","lastModifiedDate":"2024-03-07"},{"lineNumber":438,"author":{"gitId":"moguries"},"content":"","lastModifiedDate":"2024-03-07"},{"lineNumber":439,"author":{"gitId":"moguries"},"content":"**Extensions**","lastModifiedDate":"2024-03-07"},{"lineNumber":440,"author":{"gitId":"moguries"},"content":"","lastModifiedDate":"2024-03-07"},{"lineNumber":441,"author":{"gitId":"moguries"},"content":"* 2a. The list is empty.","lastModifiedDate":"2024-03-07"},{"lineNumber":442,"author":{"gitId":"moguries"},"content":"","lastModifiedDate":"2024-03-07"},{"lineNumber":443,"author":{"gitId":"moguries"},"content":" Use case ends.","lastModifiedDate":"2024-03-07"},{"lineNumber":444,"author":{"gitId":"moguries"},"content":"","lastModifiedDate":"2024-03-07"},{"lineNumber":445,"author":{"gitId":"moguries"},"content":"* 3a. The given index is invalid.","lastModifiedDate":"2024-03-07"},{"lineNumber":446,"author":{"gitId":"moguries"},"content":"","lastModifiedDate":"2024-03-07"},{"lineNumber":447,"author":{"gitId":"moguries"},"content":" * 3a1. HouseKeeping Hub shows an error message.","lastModifiedDate":"2024-03-07"},{"lineNumber":448,"author":{"gitId":"moguries"},"content":"","lastModifiedDate":"2024-03-07"},{"lineNumber":449,"author":{"gitId":"moguries"},"content":" Use case resumes at step 2.","lastModifiedDate":"2024-03-07"},{"lineNumber":450,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":451,"author":{"gitId":"-"},"content":"### Non-Functional Requirements","lastModifiedDate":"2020-05-23"},{"lineNumber":452,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":453,"author":{"gitId":"-"},"content":"1. Should work on any _mainstream OS_ as long as it has Java `11` or above installed.","lastModifiedDate":"2020-05-23"},{"lineNumber":454,"author":{"gitId":"GERARDJM018"},"content":"2. Should be able to hold up to 1000 contacts without a noticeable sluggishness in performance for typical usage.","lastModifiedDate":"2024-03-07"},{"lineNumber":455,"author":{"gitId":"GERARDJM018"},"content":"3. A user not familiar with CLI but has an 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.","lastModifiedDate":"2024-03-07"},{"lineNumber":456,"author":{"gitId":"GERARDJM018"},"content":"4. All user operations should completed within 3 seconds.","lastModifiedDate":"2024-03-07"},{"lineNumber":457,"author":{"gitId":"GERARDJM018"},"content":"5. Should lose no more than 2 user operations worth of work in case of system crash.","lastModifiedDate":"2024-03-07"},{"lineNumber":458,"author":{"gitId":"GERARDJM018"},"content":"6. Should not take memory more than 200 MB while in operation.","lastModifiedDate":"2024-03-07"},{"lineNumber":459,"author":{"gitId":"GERARDJM018"},"content":"7. Will not use a DataBase Management System e.g., MySQL, and PostgreSQL to store data. And hence, will use flat file as a storage.","lastModifiedDate":"2024-03-07"},{"lineNumber":460,"author":{"gitId":"GERARDJM018"},"content":"8. Should be portable (able to work without requiring an installer).","lastModifiedDate":"2024-03-07"},{"lineNumber":461,"author":{"gitId":"GERARDJM018"},"content":"9. Should not use or depend on a remote server.","lastModifiedDate":"2024-03-07"},{"lineNumber":462,"author":{"gitId":"-"},"content":"*{More to be added}*","lastModifiedDate":"2020-05-23"},{"lineNumber":463,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":464,"author":{"gitId":"-"},"content":"### Glossary","lastModifiedDate":"2020-05-23"},{"lineNumber":465,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":466,"author":{"gitId":"-"},"content":"* **Mainstream OS**: Windows, Linux, Unix, MacOS","lastModifiedDate":"2024-02-09"},{"lineNumber":467,"author":{"gitId":"-"},"content":"* **Private contact detail**: A contact detail that is not meant to be shared with others","lastModifiedDate":"2020-05-23"},{"lineNumber":468,"author":{"gitId":"LimZiJia"},"content":"* **CLI**: Short for Command Line Interface. User\u0027s of our application mainly interact with our program by typing commands.","lastModifiedDate":"2024-03-06"},{"lineNumber":469,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":470,"author":{"gitId":"-"},"content":"--------------------------------------------------------------------------------------------------------------------","lastModifiedDate":"2020-05-23"},{"lineNumber":471,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":472,"author":{"gitId":"-"},"content":"## **Appendix: Instructions for manual testing**","lastModifiedDate":"2020-05-23"},{"lineNumber":473,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":474,"author":{"gitId":"-"},"content":"Given below are instructions to test the app manually.","lastModifiedDate":"2020-05-23"},{"lineNumber":475,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":476,"author":{"gitId":"-"},"content":"\u003cdiv markdown\u003d\"span\" class\u003d\"alert alert-info\"\u003e:information_source: **Note:** These instructions only provide a starting point for testers to work on;","lastModifiedDate":"2020-05-23"},{"lineNumber":477,"author":{"gitId":"-"},"content":"testers are expected to do more *exploratory* testing.","lastModifiedDate":"2020-05-23"},{"lineNumber":478,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":479,"author":{"gitId":"-"},"content":"\u003c/div\u003e","lastModifiedDate":"2020-05-23"},{"lineNumber":480,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":481,"author":{"gitId":"-"},"content":"### Launch and shutdown","lastModifiedDate":"2020-05-23"},{"lineNumber":482,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":483,"author":{"gitId":"-"},"content":"1. Initial launch","lastModifiedDate":"2020-05-23"},{"lineNumber":484,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":485,"author":{"gitId":"-"},"content":" 1. Download the jar file and copy into an empty folder","lastModifiedDate":"2020-05-23"},{"lineNumber":486,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":487,"author":{"gitId":"-"},"content":" 1. Double-click the jar file Expected: Shows the GUI with a set of sample contacts. The window size may not be optimum.","lastModifiedDate":"2020-05-23"},{"lineNumber":488,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":489,"author":{"gitId":"-"},"content":"1. Saving window preferences","lastModifiedDate":"2020-05-23"},{"lineNumber":490,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":491,"author":{"gitId":"-"},"content":" 1. Resize the window to an optimum size. Move the window to a different location. Close the window.","lastModifiedDate":"2020-05-23"},{"lineNumber":492,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":493,"author":{"gitId":"-"},"content":" 1. Re-launch the app by double-clicking the jar file.\u003cbr\u003e","lastModifiedDate":"2020-05-23"},{"lineNumber":494,"author":{"gitId":"-"},"content":" Expected: The most recent window size and location is retained.","lastModifiedDate":"2020-05-23"},{"lineNumber":495,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":496,"author":{"gitId":"-"},"content":"1. _{ more test cases …​ }_","lastModifiedDate":"2020-05-23"},{"lineNumber":497,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":498,"author":{"gitId":"-"},"content":"### Deleting a person","lastModifiedDate":"2020-05-23"},{"lineNumber":499,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":500,"author":{"gitId":"-"},"content":"1. Deleting a person while all persons are being shown","lastModifiedDate":"2020-05-23"},{"lineNumber":501,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":502,"author":{"gitId":"-"},"content":" 1. Prerequisites: List all persons using the `list` command. Multiple persons in the list.","lastModifiedDate":"2020-05-23"},{"lineNumber":503,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":504,"author":{"gitId":"-"},"content":" 1. Test case: `delete 1`\u003cbr\u003e","lastModifiedDate":"2020-05-23"},{"lineNumber":505,"author":{"gitId":"-"},"content":" 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.","lastModifiedDate":"2020-05-23"},{"lineNumber":506,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":507,"author":{"gitId":"-"},"content":" 1. Test case: `delete 0`\u003cbr\u003e","lastModifiedDate":"2020-05-23"},{"lineNumber":508,"author":{"gitId":"-"},"content":" Expected: No person is deleted. Error details shown in the status message. Status bar remains the same.","lastModifiedDate":"2020-05-23"},{"lineNumber":509,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":510,"author":{"gitId":"-"},"content":" 1. Other incorrect delete commands to try: `delete`, `delete x`, `...` (where x is larger than the list size)\u003cbr\u003e","lastModifiedDate":"2020-05-23"},{"lineNumber":511,"author":{"gitId":"-"},"content":" Expected: Similar to previous.","lastModifiedDate":"2020-05-23"},{"lineNumber":512,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":513,"author":{"gitId":"-"},"content":"1. _{ more test cases …​ }_","lastModifiedDate":"2020-05-23"},{"lineNumber":514,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":515,"author":{"gitId":"-"},"content":"### Saving data","lastModifiedDate":"2020-05-23"},{"lineNumber":516,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":517,"author":{"gitId":"-"},"content":"1. Dealing with missing/corrupted data files","lastModifiedDate":"2020-05-23"},{"lineNumber":518,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":519,"author":{"gitId":"-"},"content":" 1. _{explain how to simulate a missing/corrupted file, and the expected behavior}_","lastModifiedDate":"2020-05-23"},{"lineNumber":520,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":521,"author":{"gitId":"-"},"content":"1. _{ more test cases …​ }_","lastModifiedDate":"2020-05-23"}],"authorContributionMap":{"LimZiJia":42,"moguries":110,"-":361,"GERARDJM018":8}}] +[{"path":"README.md","fileType":"docs","lines":[{"lineNumber":1,"author":{"gitId":"gosongying"},"content":"[![Java CI](https://github.com/AY2324S2-CS2103T-W09-1/tp/actions/workflows/gradle.yml/badge.svg)](https://github.com/AY2324S2-CS2103T-W09-1/tp/actions/workflows/gradle.yml)","lastModifiedDate":"2024-03-08"},{"lineNumber":2,"author":{"gitId":"gosongying"},"content":"","lastModifiedDate":"2024-03-08"},{"lineNumber":3,"author":{"gitId":"gosongying"},"content":"# HouseKeeping Hub","lastModifiedDate":"2024-03-08"},{"lineNumber":4,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":5,"author":{"gitId":"-"},"content":"![Ui](docs/images/Ui.png)","lastModifiedDate":"2020-05-23"},{"lineNumber":6,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":7,"author":{"gitId":"gosongying"},"content":"## Description","lastModifiedDate":"2024-03-08"},{"lineNumber":8,"author":{"gitId":"gosongying"},"content":"HouseKeeping Hub is a desktop app 💻, which aims to transform the management of client relationships within ","lastModifiedDate":"2024-03-08"},{"lineNumber":9,"author":{"gitId":"gosongying"},"content":"housekeeping companies. Our system prioritises the storage and organisation of client and housekeeper contacts, ","lastModifiedDate":"2024-03-08"},{"lineNumber":10,"author":{"gitId":"gosongying"},"content":"providing unmatched efficiency and convenience for customer service admin. 👌👌👌","lastModifiedDate":"2024-03-08"},{"lineNumber":11,"author":{"gitId":"gosongying"},"content":"","lastModifiedDate":"2024-03-08"},{"lineNumber":12,"author":{"gitId":"gosongying"},"content":"## Usages","lastModifiedDate":"2024-03-08"},{"lineNumber":13,"author":{"gitId":"gosongying"},"content":"* Organising and managing client and housekeeper contact details for your housekeeping company with ease.","lastModifiedDate":"2024-03-08"},{"lineNumber":14,"author":{"gitId":"gosongying"},"content":"* A starting point of a Software Engineering course project (as opposed to writing everything from scratch).","lastModifiedDate":"2024-03-08"},{"lineNumber":15,"author":{"gitId":"gosongying"},"content":"","lastModifiedDate":"2024-03-08"},{"lineNumber":16,"author":{"gitId":"gosongying"},"content":"## Documentation","lastModifiedDate":"2024-03-08"},{"lineNumber":17,"author":{"gitId":"gosongying"},"content":"For comprehensive details about HouseKeeping Hub, please refer to the website ","lastModifiedDate":"2024-03-08"},{"lineNumber":18,"author":{"gitId":"gosongying"},"content":"[HouseKeeping Hub](https://ay2324s2-cs2103t-w09-1.github.io/tp/).","lastModifiedDate":"2024-03-08"},{"lineNumber":19,"author":{"gitId":"gosongying"},"content":"","lastModifiedDate":"2024-03-08"},{"lineNumber":20,"author":{"gitId":"gosongying"},"content":"## Acknowledgements","lastModifiedDate":"2024-03-08"},{"lineNumber":21,"author":{"gitId":"gosongying"},"content":"This project is based on the AddressBook-Level3 project created by the [SE-EDU initiative](https://se-education.org).","lastModifiedDate":"2024-03-08"},{"lineNumber":22,"author":{"gitId":"gosongying"},"content":"","lastModifiedDate":"2024-03-08"}],"authorContributionMap":{"gosongying":19,"-":3}},{"path":"docs/AboutUs.md","fileType":"docs","lines":[{"lineNumber":1,"author":{"gitId":"-"},"content":"---","lastModifiedDate":"2020-05-23"},{"lineNumber":2,"author":{"gitId":"-"},"content":"layout: page","lastModifiedDate":"2020-05-23"},{"lineNumber":3,"author":{"gitId":"-"},"content":"title: About Us","lastModifiedDate":"2020-05-23"},{"lineNumber":4,"author":{"gitId":"-"},"content":"---","lastModifiedDate":"2020-05-23"},{"lineNumber":5,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":6,"author":{"gitId":"-"},"content":"We are a team based in the [School of Computing, National University of Singapore](http://www.comp.nus.edu.sg).","lastModifiedDate":"2020-05-23"},{"lineNumber":7,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":8,"author":{"gitId":"LimZiJia"},"content":"You can reach us at the email `e0960005@comp.nus.edu`","lastModifiedDate":"2024-03-06"},{"lineNumber":9,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-06-17"},{"lineNumber":10,"author":{"gitId":"-"},"content":"## Project team","lastModifiedDate":"2020-06-07"},{"lineNumber":11,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":12,"author":{"gitId":"LimZiJia"},"content":"### Lim Zi Jia","lastModifiedDate":"2024-03-06"},{"lineNumber":13,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":14,"author":{"gitId":"LimZiJia"},"content":"\u003cimg src\u003d\"images/limzijia.png\" width\u003d\"200px\"\u003e","lastModifiedDate":"2024-03-06"},{"lineNumber":15,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":16,"author":{"gitId":"LimZiJia"},"content":"[[github](https://github.com/limzijia)]","lastModifiedDate":"2024-03-06"},{"lineNumber":17,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":18,"author":{"gitId":"LimZiJia"},"content":"* Role: Developer","lastModifiedDate":"2024-03-08"},{"lineNumber":19,"author":{"gitId":"LimZiJia"},"content":"* Responsibilities: Testing + logic","lastModifiedDate":"2024-03-08"},{"lineNumber":20,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2024-03-08"},{"lineNumber":21,"author":{"gitId":"GERARDJM018"},"content":"### Gerard Jeremiah Matthew","lastModifiedDate":"2024-03-07"},{"lineNumber":22,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":23,"author":{"gitId":"GERARDJM018"},"content":"\u003cimg src\u003d\"images/gerardjm018.png\" width\u003d\"200px\"\u003e","lastModifiedDate":"2024-03-07"},{"lineNumber":24,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":25,"author":{"gitId":"GERARDJM018"},"content":"[[github](https://github.com/GERARDJM018)]","lastModifiedDate":"2024-03-07"},{"lineNumber":26,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":27,"author":{"gitId":"LimZiJia"},"content":"* Role: Developer","lastModifiedDate":"2024-03-07"},{"lineNumber":28,"author":{"gitId":"LimZiJia"},"content":"* Responsibilities: Scheduling and Tracking + Model","lastModifiedDate":"2024-03-07"},{"lineNumber":29,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":30,"author":{"gitId":"gosongying"},"content":"### Go Song Ying","lastModifiedDate":"2024-03-08"},{"lineNumber":31,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2024-03-08"},{"lineNumber":32,"author":{"gitId":"gosongying"},"content":"\u003cimg src\u003d\"images/gosongying.png\" width\u003d\"200px\"\u003e","lastModifiedDate":"2024-03-08"},{"lineNumber":33,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2024-03-08"},{"lineNumber":34,"author":{"gitId":"gosongying"},"content":"[[github](https://github.com/gosongying)]","lastModifiedDate":"2024-03-08"},{"lineNumber":35,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2024-03-08"},{"lineNumber":36,"author":{"gitId":"-"},"content":"* Role: Developer","lastModifiedDate":"2024-03-08"},{"lineNumber":37,"author":{"gitId":"gosongying"},"content":"* Responsibilities: Deliverables and deadlines + UI","lastModifiedDate":"2024-03-08"},{"lineNumber":38,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2024-03-08"},{"lineNumber":39,"author":{"gitId":"moguries"},"content":"### Huang Zhuoyan, Celeste","lastModifiedDate":"2024-03-08"},{"lineNumber":40,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2024-03-08"},{"lineNumber":41,"author":{"gitId":"moguries"},"content":"\u003cimg src\u003d\"images/moguries.png\" width\u003d\"200px\"\u003e","lastModifiedDate":"2024-03-08"},{"lineNumber":42,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2024-03-08"},{"lineNumber":43,"author":{"gitId":"moguries"},"content":"[[github](https://github.com/moguries)]","lastModifiedDate":"2024-03-08"},{"lineNumber":44,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2024-03-08"},{"lineNumber":45,"author":{"gitId":"-"},"content":"* Role: Developer","lastModifiedDate":"2024-03-08"},{"lineNumber":46,"author":{"gitId":"moguries"},"content":"* Responsibilities: Code quality and Integration + Storage","lastModifiedDate":"2024-03-08"},{"lineNumber":47,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2024-03-08"},{"lineNumber":48,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"}],"authorContributionMap":{"LimZiJia":8,"moguries":4,"gosongying":4,"-":29,"GERARDJM018":3}},{"path":"docs/DeveloperGuide.md","fileType":"docs","lines":[{"lineNumber":1,"author":{"gitId":"-"},"content":"---","lastModifiedDate":"2020-05-23"},{"lineNumber":2,"author":{"gitId":"-"},"content":"layout: page","lastModifiedDate":"2020-05-23"},{"lineNumber":3,"author":{"gitId":"-"},"content":"title: Developer Guide","lastModifiedDate":"2020-05-23"},{"lineNumber":4,"author":{"gitId":"-"},"content":"---","lastModifiedDate":"2020-05-23"},{"lineNumber":5,"author":{"gitId":"-"},"content":"* Table of Contents","lastModifiedDate":"2020-05-23"},{"lineNumber":6,"author":{"gitId":"-"},"content":"{:toc}","lastModifiedDate":"2020-05-23"},{"lineNumber":7,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":8,"author":{"gitId":"-"},"content":"--------------------------------------------------------------------------------------------------------------------","lastModifiedDate":"2020-05-23"},{"lineNumber":9,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2021-07-30"},{"lineNumber":10,"author":{"gitId":"-"},"content":"## **Acknowledgements**","lastModifiedDate":"2021-07-30"},{"lineNumber":11,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2021-07-30"},{"lineNumber":12,"author":{"gitId":"-"},"content":"* {list here sources of all reused/adapted ideas, code, documentation, and third-party libraries -- include links to the original source as well}","lastModifiedDate":"2021-07-30"},{"lineNumber":13,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2021-07-30"},{"lineNumber":14,"author":{"gitId":"-"},"content":"--------------------------------------------------------------------------------------------------------------------","lastModifiedDate":"2021-07-30"},{"lineNumber":15,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":16,"author":{"gitId":"-"},"content":"## **Setting up, getting started**","lastModifiedDate":"2020-05-23"},{"lineNumber":17,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":18,"author":{"gitId":"-"},"content":"Refer to the guide [_Setting up and getting started_](SettingUp.md).","lastModifiedDate":"2020-05-23"},{"lineNumber":19,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":20,"author":{"gitId":"-"},"content":"--------------------------------------------------------------------------------------------------------------------","lastModifiedDate":"2020-05-23"},{"lineNumber":21,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":22,"author":{"gitId":"-"},"content":"## **Design**","lastModifiedDate":"2020-05-23"},{"lineNumber":23,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":24,"author":{"gitId":"-"},"content":"\u003cdiv markdown\u003d\"span\" class\u003d\"alert alert-primary\"\u003e","lastModifiedDate":"2021-07-31"},{"lineNumber":25,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":26,"author":{"gitId":"-"},"content":":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.","lastModifiedDate":"2023-09-03"},{"lineNumber":27,"author":{"gitId":"-"},"content":"\u003c/div\u003e","lastModifiedDate":"2021-07-31"},{"lineNumber":28,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":29,"author":{"gitId":"-"},"content":"### Architecture","lastModifiedDate":"2021-07-31"},{"lineNumber":30,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":31,"author":{"gitId":"-"},"content":"\u003cimg src\u003d\"images/ArchitectureDiagram.png\" width\u003d\"280\" /\u003e","lastModifiedDate":"2021-07-31"},{"lineNumber":32,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":33,"author":{"gitId":"-"},"content":"The ***Architecture Diagram*** given above explains the high-level design of the App.","lastModifiedDate":"2021-07-31"},{"lineNumber":34,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":35,"author":{"gitId":"-"},"content":"Given below is a quick overview of main components and how they interact with each other.","lastModifiedDate":"2021-07-31"},{"lineNumber":36,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2021-07-31"},{"lineNumber":37,"author":{"gitId":"-"},"content":"**Main components of the architecture**","lastModifiedDate":"2021-07-31"},{"lineNumber":38,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":39,"author":{"gitId":"-"},"content":"**`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.","lastModifiedDate":"2023-09-03"},{"lineNumber":40,"author":{"gitId":"-"},"content":"* At app launch, it initializes the other components in the correct sequence, and connects them up with each other.","lastModifiedDate":"2023-09-03"},{"lineNumber":41,"author":{"gitId":"-"},"content":"* At shut down, it shuts down the other components and invokes cleanup methods where necessary.","lastModifiedDate":"2023-09-03"},{"lineNumber":42,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":43,"author":{"gitId":"-"},"content":"The bulk of the app\u0027s work is done by the following four components:","lastModifiedDate":"2023-09-03"},{"lineNumber":44,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":45,"author":{"gitId":"-"},"content":"* [**`UI`**](#ui-component): The UI of the App.","lastModifiedDate":"2020-05-23"},{"lineNumber":46,"author":{"gitId":"-"},"content":"* [**`Logic`**](#logic-component): The command executor.","lastModifiedDate":"2020-05-23"},{"lineNumber":47,"author":{"gitId":"-"},"content":"* [**`Model`**](#model-component): Holds the data of the App in memory.","lastModifiedDate":"2020-05-23"},{"lineNumber":48,"author":{"gitId":"-"},"content":"* [**`Storage`**](#storage-component): Reads data from, and writes data to, the hard disk.","lastModifiedDate":"2020-05-23"},{"lineNumber":49,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":50,"author":{"gitId":"-"},"content":"[**`Commons`**](#common-classes) represents a collection of classes used by multiple other components.","lastModifiedDate":"2023-09-03"},{"lineNumber":51,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":52,"author":{"gitId":"-"},"content":"**How the architecture components interact with each other**","lastModifiedDate":"2020-05-23"},{"lineNumber":53,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":54,"author":{"gitId":"-"},"content":"The *Sequence Diagram* below shows how the components interact with each other for the scenario where the user issues the command `delete 1`.","lastModifiedDate":"2020-05-23"},{"lineNumber":55,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":56,"author":{"gitId":"-"},"content":"\u003cimg src\u003d\"images/ArchitectureSequenceDiagram.png\" width\u003d\"574\" /\u003e","lastModifiedDate":"2020-06-07"},{"lineNumber":57,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":58,"author":{"gitId":"-"},"content":"Each of the four main components (also shown in the diagram above),","lastModifiedDate":"2021-07-31"},{"lineNumber":59,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2021-07-31"},{"lineNumber":60,"author":{"gitId":"-"},"content":"* defines its *API* in an `interface` with the same name as the Component.","lastModifiedDate":"2021-07-31"},{"lineNumber":61,"author":{"gitId":"-"},"content":"* implements its functionality using a concrete `{Component Name}Manager` class (which follows the corresponding API `interface` mentioned in the previous point.","lastModifiedDate":"2021-07-31"},{"lineNumber":62,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2021-07-31"},{"lineNumber":63,"author":{"gitId":"-"},"content":"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\u0027s being coupled to the implementation of a component), as illustrated in the (partial) class diagram below.","lastModifiedDate":"2021-07-31"},{"lineNumber":64,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2021-07-31"},{"lineNumber":65,"author":{"gitId":"-"},"content":"\u003cimg src\u003d\"images/ComponentManagers.png\" width\u003d\"300\" /\u003e","lastModifiedDate":"2021-07-31"},{"lineNumber":66,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2021-07-31"},{"lineNumber":67,"author":{"gitId":"-"},"content":"The sections below give more details of each component.","lastModifiedDate":"2020-05-23"},{"lineNumber":68,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":69,"author":{"gitId":"-"},"content":"### UI component","lastModifiedDate":"2020-05-23"},{"lineNumber":70,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":71,"author":{"gitId":"-"},"content":"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)","lastModifiedDate":"2021-07-31"},{"lineNumber":72,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":73,"author":{"gitId":"-"},"content":"![Structure of the UI Component](images/UiClassDiagram.png)","lastModifiedDate":"2021-07-31"},{"lineNumber":74,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":75,"author":{"gitId":"-"},"content":"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.","lastModifiedDate":"2021-07-31"},{"lineNumber":76,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":77,"author":{"gitId":"-"},"content":"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)","lastModifiedDate":"2021-07-31"},{"lineNumber":78,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":79,"author":{"gitId":"-"},"content":"The `UI` component,","lastModifiedDate":"2020-05-23"},{"lineNumber":80,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":81,"author":{"gitId":"-"},"content":"* executes user commands using the `Logic` component.","lastModifiedDate":"2021-07-31"},{"lineNumber":82,"author":{"gitId":"-"},"content":"* listens for changes to `Model` data so that the UI can be updated with the modified data.","lastModifiedDate":"2021-07-31"},{"lineNumber":83,"author":{"gitId":"-"},"content":"* keeps a reference to the `Logic` component, because the `UI` relies on the `Logic` to execute commands.","lastModifiedDate":"2021-07-31"},{"lineNumber":84,"author":{"gitId":"-"},"content":"* depends on some classes in the `Model` component, as it displays `Person` object residing in the `Model`.","lastModifiedDate":"2021-07-31"},{"lineNumber":85,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":86,"author":{"gitId":"-"},"content":"### Logic component","lastModifiedDate":"2020-05-23"},{"lineNumber":87,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":88,"author":{"gitId":"-"},"content":"**API** : [`Logic.java`](https://github.com/se-edu/addressbook-level3/tree/master/src/main/java/seedu/address/logic/Logic.java)","lastModifiedDate":"2021-07-31"},{"lineNumber":89,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":90,"author":{"gitId":"-"},"content":"Here\u0027s a (partial) class diagram of the `Logic` component:","lastModifiedDate":"2021-07-31"},{"lineNumber":91,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":92,"author":{"gitId":"-"},"content":"\u003cimg src\u003d\"images/LogicClassDiagram.png\" width\u003d\"550\"/\u003e","lastModifiedDate":"2021-07-31"},{"lineNumber":93,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":94,"author":{"gitId":"-"},"content":"The sequence diagram below illustrates the interactions within the `Logic` component, taking `execute(\"delete 1\")` API call as an example.","lastModifiedDate":"2023-09-03"},{"lineNumber":95,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":96,"author":{"gitId":"-"},"content":"![Interactions Inside the Logic Component for the `delete 1` Command](images/DeleteSequenceDiagram.png)","lastModifiedDate":"2020-05-23"},{"lineNumber":97,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":98,"author":{"gitId":"-"},"content":"\u003cdiv markdown\u003d\"span\" class\u003d\"alert alert-info\"\u003e:information_source: **Note:** The lifeline for `DeleteCommandParser` should end at the destroy marker (X) but due to a limitation of PlantUML, the lifeline continues till the end of diagram.","lastModifiedDate":"2024-02-09"},{"lineNumber":99,"author":{"gitId":"-"},"content":"\u003c/div\u003e","lastModifiedDate":"2020-05-23"},{"lineNumber":100,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":101,"author":{"gitId":"-"},"content":"How the `Logic` component works:","lastModifiedDate":"2023-09-03"},{"lineNumber":102,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2023-09-03"},{"lineNumber":103,"author":{"gitId":"-"},"content":"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.","lastModifiedDate":"2023-09-03"},{"lineNumber":104,"author":{"gitId":"-"},"content":"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`.","lastModifiedDate":"2023-09-03"},{"lineNumber":105,"author":{"gitId":"-"},"content":"1. The command can communicate with the `Model` when it is executed (e.g. to delete a person).\u003cbr\u003e","lastModifiedDate":"2024-02-09"},{"lineNumber":106,"author":{"gitId":"-"},"content":" Note that although this is shown as a single step in the diagram above (for simplicity), in the code it can take several interactions (between the command object and the `Model`) to achieve.","lastModifiedDate":"2024-02-09"},{"lineNumber":107,"author":{"gitId":"-"},"content":"1. The result of the command execution is encapsulated as a `CommandResult` object which is returned back from `Logic`.","lastModifiedDate":"2023-09-03"},{"lineNumber":108,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2023-09-03"},{"lineNumber":109,"author":{"gitId":"-"},"content":"Here are the other classes in `Logic` (omitted from the class diagram above) that are used for parsing a user command:","lastModifiedDate":"2021-07-31"},{"lineNumber":110,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2021-07-31"},{"lineNumber":111,"author":{"gitId":"-"},"content":"\u003cimg src\u003d\"images/ParserClasses.png\" width\u003d\"600\"/\u003e","lastModifiedDate":"2021-07-31"},{"lineNumber":112,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":113,"author":{"gitId":"-"},"content":"How the parsing works:","lastModifiedDate":"2021-07-31"},{"lineNumber":114,"author":{"gitId":"-"},"content":"* 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.","lastModifiedDate":"2021-07-31"},{"lineNumber":115,"author":{"gitId":"-"},"content":"* 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.","lastModifiedDate":"2021-07-31"},{"lineNumber":116,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":117,"author":{"gitId":"-"},"content":"### Model component","lastModifiedDate":"2021-07-31"},{"lineNumber":118,"author":{"gitId":"-"},"content":"**API** : [`Model.java`](https://github.com/se-edu/addressbook-level3/tree/master/src/main/java/seedu/address/model/Model.java)","lastModifiedDate":"2020-05-23"},{"lineNumber":119,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":120,"author":{"gitId":"-"},"content":"\u003cimg src\u003d\"images/ModelClassDiagram.png\" width\u003d\"450\" /\u003e","lastModifiedDate":"2021-07-31"},{"lineNumber":121,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":122,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":123,"author":{"gitId":"-"},"content":"The `Model` component,","lastModifiedDate":"2021-07-31"},{"lineNumber":124,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":125,"author":{"gitId":"-"},"content":"* stores the address book data i.e., all `Person` objects (which are contained in a `UniquePersonList` object).","lastModifiedDate":"2021-07-31"},{"lineNumber":126,"author":{"gitId":"-"},"content":"* stores the currently \u0027selected\u0027 `Person` objects (e.g., results of a search query) as a separate _filtered_ list which is exposed to outsiders as an unmodifiable `ObservableList\u003cPerson\u003e` that can be \u0027observed\u0027 e.g. the UI can be bound to this list so that the UI automatically updates when the data in the list change.","lastModifiedDate":"2021-07-31"},{"lineNumber":127,"author":{"gitId":"-"},"content":"* stores a `UserPref` object that represents the user’s preferences. This is exposed to the outside as a `ReadOnlyUserPref` objects.","lastModifiedDate":"2021-07-31"},{"lineNumber":128,"author":{"gitId":"-"},"content":"* 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)","lastModifiedDate":"2021-07-31"},{"lineNumber":129,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2021-07-31"},{"lineNumber":130,"author":{"gitId":"-"},"content":"\u003cdiv markdown\u003d\"span\" class\u003d\"alert alert-info\"\u003e: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.\u003cbr\u003e","lastModifiedDate":"2021-07-31"},{"lineNumber":131,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2021-07-31"},{"lineNumber":132,"author":{"gitId":"-"},"content":"\u003cimg src\u003d\"images/BetterModelClassDiagram.png\" width\u003d\"450\" /\u003e","lastModifiedDate":"2021-07-31"},{"lineNumber":133,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":134,"author":{"gitId":"-"},"content":"\u003c/div\u003e","lastModifiedDate":"2020-05-23"},{"lineNumber":135,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":136,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":137,"author":{"gitId":"-"},"content":"### Storage component","lastModifiedDate":"2020-05-23"},{"lineNumber":138,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":139,"author":{"gitId":"-"},"content":"**API** : [`Storage.java`](https://github.com/se-edu/addressbook-level3/tree/master/src/main/java/seedu/address/storage/Storage.java)","lastModifiedDate":"2020-05-23"},{"lineNumber":140,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":141,"author":{"gitId":"-"},"content":"\u003cimg src\u003d\"images/StorageClassDiagram.png\" width\u003d\"550\" /\u003e","lastModifiedDate":"2021-07-31"},{"lineNumber":142,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2021-07-31"},{"lineNumber":143,"author":{"gitId":"-"},"content":"The `Storage` component,","lastModifiedDate":"2020-05-23"},{"lineNumber":144,"author":{"gitId":"-"},"content":"* can save both address book data and user preference data in JSON format, and read them back into corresponding objects.","lastModifiedDate":"2023-09-03"},{"lineNumber":145,"author":{"gitId":"-"},"content":"* inherits from both `AddressBookStorage` and `UserPrefStorage`, which means it can be treated as either one (if only the functionality of only one is needed).","lastModifiedDate":"2021-07-31"},{"lineNumber":146,"author":{"gitId":"-"},"content":"* depends on some classes in the `Model` component (because the `Storage` component\u0027s job is to save/retrieve objects that belong to the `Model`)","lastModifiedDate":"2021-07-21"},{"lineNumber":147,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":148,"author":{"gitId":"-"},"content":"### Common classes","lastModifiedDate":"2020-05-23"},{"lineNumber":149,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":150,"author":{"gitId":"-"},"content":"Classes used by multiple components are in the `seedu.addressbook.commons` package.","lastModifiedDate":"2020-05-23"},{"lineNumber":151,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":152,"author":{"gitId":"-"},"content":"--------------------------------------------------------------------------------------------------------------------","lastModifiedDate":"2020-05-23"},{"lineNumber":153,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":154,"author":{"gitId":"-"},"content":"## **Implementation**","lastModifiedDate":"2020-05-23"},{"lineNumber":155,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":156,"author":{"gitId":"-"},"content":"This section describes some noteworthy details on how certain features are implemented.","lastModifiedDate":"2020-05-23"},{"lineNumber":157,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":158,"author":{"gitId":"-"},"content":"### \\[Proposed\\] Undo/redo feature","lastModifiedDate":"2020-06-07"},{"lineNumber":159,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":160,"author":{"gitId":"-"},"content":"#### Proposed Implementation","lastModifiedDate":"2020-05-23"},{"lineNumber":161,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":162,"author":{"gitId":"-"},"content":"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:","lastModifiedDate":"2020-05-23"},{"lineNumber":163,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":164,"author":{"gitId":"-"},"content":"* `VersionedAddressBook#commit()` — Saves the current address book state in its history.","lastModifiedDate":"2020-05-23"},{"lineNumber":165,"author":{"gitId":"-"},"content":"* `VersionedAddressBook#undo()` — Restores the previous address book state from its history.","lastModifiedDate":"2020-05-23"},{"lineNumber":166,"author":{"gitId":"-"},"content":"* `VersionedAddressBook#redo()` — Restores a previously undone address book state from its history.","lastModifiedDate":"2020-05-23"},{"lineNumber":167,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":168,"author":{"gitId":"-"},"content":"These operations are exposed in the `Model` interface as `Model#commitAddressBook()`, `Model#undoAddressBook()` and `Model#redoAddressBook()` respectively.","lastModifiedDate":"2020-05-23"},{"lineNumber":169,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":170,"author":{"gitId":"-"},"content":"Given below is an example usage scenario and how the undo/redo mechanism behaves at each step.","lastModifiedDate":"2020-05-23"},{"lineNumber":171,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":172,"author":{"gitId":"-"},"content":"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.","lastModifiedDate":"2020-05-23"},{"lineNumber":173,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":174,"author":{"gitId":"-"},"content":"![UndoRedoState0](images/UndoRedoState0.png)","lastModifiedDate":"2020-05-23"},{"lineNumber":175,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":176,"author":{"gitId":"-"},"content":"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.","lastModifiedDate":"2020-05-23"},{"lineNumber":177,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":178,"author":{"gitId":"-"},"content":"![UndoRedoState1](images/UndoRedoState1.png)","lastModifiedDate":"2020-05-23"},{"lineNumber":179,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":180,"author":{"gitId":"-"},"content":"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`.","lastModifiedDate":"2020-05-23"},{"lineNumber":181,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":182,"author":{"gitId":"-"},"content":"![UndoRedoState2](images/UndoRedoState2.png)","lastModifiedDate":"2020-05-23"},{"lineNumber":183,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":184,"author":{"gitId":"-"},"content":"\u003cdiv markdown\u003d\"span\" class\u003d\"alert alert-info\"\u003e: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`.","lastModifiedDate":"2020-05-23"},{"lineNumber":185,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":186,"author":{"gitId":"-"},"content":"\u003c/div\u003e","lastModifiedDate":"2020-05-23"},{"lineNumber":187,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":188,"author":{"gitId":"-"},"content":"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.","lastModifiedDate":"2020-05-23"},{"lineNumber":189,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":190,"author":{"gitId":"-"},"content":"![UndoRedoState3](images/UndoRedoState3.png)","lastModifiedDate":"2020-05-23"},{"lineNumber":191,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":192,"author":{"gitId":"-"},"content":"\u003cdiv markdown\u003d\"span\" class\u003d\"alert alert-info\"\u003e: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","lastModifiedDate":"2020-05-23"},{"lineNumber":193,"author":{"gitId":"-"},"content":"than attempting to perform the undo.","lastModifiedDate":"2020-05-23"},{"lineNumber":194,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":195,"author":{"gitId":"-"},"content":"\u003c/div\u003e","lastModifiedDate":"2020-05-23"},{"lineNumber":196,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":197,"author":{"gitId":"-"},"content":"The following sequence diagram shows how an undo operation goes through the `Logic` component:","lastModifiedDate":"2024-02-09"},{"lineNumber":198,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":199,"author":{"gitId":"-"},"content":"![UndoSequenceDiagram](images/UndoSequenceDiagram-Logic.png)","lastModifiedDate":"2024-02-09"},{"lineNumber":200,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":201,"author":{"gitId":"-"},"content":"\u003cdiv markdown\u003d\"span\" class\u003d\"alert alert-info\"\u003e: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.","lastModifiedDate":"2020-05-23"},{"lineNumber":202,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":203,"author":{"gitId":"-"},"content":"\u003c/div\u003e","lastModifiedDate":"2020-05-23"},{"lineNumber":204,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":205,"author":{"gitId":"-"},"content":"Similarly, how an undo operation goes through the `Model` component is shown below:","lastModifiedDate":"2024-02-09"},{"lineNumber":206,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2024-02-09"},{"lineNumber":207,"author":{"gitId":"-"},"content":"![UndoSequenceDiagram](images/UndoSequenceDiagram-Model.png)","lastModifiedDate":"2024-02-09"},{"lineNumber":208,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2024-02-09"},{"lineNumber":209,"author":{"gitId":"-"},"content":"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.","lastModifiedDate":"2020-05-23"},{"lineNumber":210,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":211,"author":{"gitId":"-"},"content":"\u003cdiv markdown\u003d\"span\" class\u003d\"alert alert-info\"\u003e: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.","lastModifiedDate":"2020-05-23"},{"lineNumber":212,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":213,"author":{"gitId":"-"},"content":"\u003c/div\u003e","lastModifiedDate":"2020-05-23"},{"lineNumber":214,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":215,"author":{"gitId":"-"},"content":"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.","lastModifiedDate":"2020-05-23"},{"lineNumber":216,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":217,"author":{"gitId":"-"},"content":"![UndoRedoState4](images/UndoRedoState4.png)","lastModifiedDate":"2020-05-23"},{"lineNumber":218,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":219,"author":{"gitId":"-"},"content":"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.","lastModifiedDate":"2020-05-23"},{"lineNumber":220,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":221,"author":{"gitId":"-"},"content":"![UndoRedoState5](images/UndoRedoState5.png)","lastModifiedDate":"2020-05-23"},{"lineNumber":222,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":223,"author":{"gitId":"-"},"content":"The following activity diagram summarizes what happens when a user executes a new command:","lastModifiedDate":"2020-05-23"},{"lineNumber":224,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":225,"author":{"gitId":"-"},"content":"\u003cimg src\u003d\"images/CommitActivityDiagram.png\" width\u003d\"250\" /\u003e","lastModifiedDate":"2021-07-31"},{"lineNumber":226,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":227,"author":{"gitId":"-"},"content":"#### Design considerations:","lastModifiedDate":"2021-07-31"},{"lineNumber":228,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":229,"author":{"gitId":"-"},"content":"**Aspect: How undo \u0026 redo executes:**","lastModifiedDate":"2021-07-31"},{"lineNumber":230,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":231,"author":{"gitId":"-"},"content":"* **Alternative 1 (current choice):** Saves the entire address book.","lastModifiedDate":"2020-05-23"},{"lineNumber":232,"author":{"gitId":"-"},"content":" * Pros: Easy to implement.","lastModifiedDate":"2020-05-23"},{"lineNumber":233,"author":{"gitId":"-"},"content":" * Cons: May have performance issues in terms of memory usage.","lastModifiedDate":"2020-05-23"},{"lineNumber":234,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":235,"author":{"gitId":"-"},"content":"* **Alternative 2:** Individual command knows how to undo/redo by","lastModifiedDate":"2020-05-23"},{"lineNumber":236,"author":{"gitId":"-"},"content":" itself.","lastModifiedDate":"2020-05-23"},{"lineNumber":237,"author":{"gitId":"-"},"content":" * Pros: Will use less memory (e.g. for `delete`, just save the person being deleted).","lastModifiedDate":"2020-05-23"},{"lineNumber":238,"author":{"gitId":"-"},"content":" * Cons: We must ensure that the implementation of each individual command are correct.","lastModifiedDate":"2020-05-23"},{"lineNumber":239,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":240,"author":{"gitId":"-"},"content":"_{more aspects and alternatives to be added}_","lastModifiedDate":"2020-05-23"},{"lineNumber":241,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":242,"author":{"gitId":"-"},"content":"### \\[Proposed\\] Data archiving","lastModifiedDate":"2020-05-23"},{"lineNumber":243,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":244,"author":{"gitId":"-"},"content":"_{Explain here how the data archiving feature will be implemented}_","lastModifiedDate":"2020-05-23"},{"lineNumber":245,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":246,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":247,"author":{"gitId":"-"},"content":"--------------------------------------------------------------------------------------------------------------------","lastModifiedDate":"2020-05-23"},{"lineNumber":248,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":249,"author":{"gitId":"-"},"content":"## **Documentation, logging, testing, configuration, dev-ops**","lastModifiedDate":"2020-06-07"},{"lineNumber":250,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":251,"author":{"gitId":"-"},"content":"* [Documentation guide](Documentation.md)","lastModifiedDate":"2020-06-07"},{"lineNumber":252,"author":{"gitId":"-"},"content":"* [Testing guide](Testing.md)","lastModifiedDate":"2020-06-07"},{"lineNumber":253,"author":{"gitId":"-"},"content":"* [Logging guide](Logging.md)","lastModifiedDate":"2020-06-07"},{"lineNumber":254,"author":{"gitId":"-"},"content":"* [Configuration guide](Configuration.md)","lastModifiedDate":"2020-06-07"},{"lineNumber":255,"author":{"gitId":"-"},"content":"* [DevOps guide](DevOps.md)","lastModifiedDate":"2020-06-07"},{"lineNumber":256,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":257,"author":{"gitId":"-"},"content":"--------------------------------------------------------------------------------------------------------------------","lastModifiedDate":"2020-05-23"},{"lineNumber":258,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":259,"author":{"gitId":"-"},"content":"## **Appendix: Requirements**","lastModifiedDate":"2020-05-23"},{"lineNumber":260,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":261,"author":{"gitId":"-"},"content":"### Product scope","lastModifiedDate":"2020-05-23"},{"lineNumber":262,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":263,"author":{"gitId":"-"},"content":"**Target user profile**:","lastModifiedDate":"2020-05-23"},{"lineNumber":264,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":265,"author":{"gitId":"LimZiJia"},"content":"* is a busy operator of a housekeeping company","lastModifiedDate":"2024-03-06"},{"lineNumber":266,"author":{"gitId":"LimZiJia"},"content":"* makes and receives calls to clients/housekeepers","lastModifiedDate":"2024-03-06"},{"lineNumber":267,"author":{"gitId":"LimZiJia"},"content":"* is responsible for managing a team of housekeepers","lastModifiedDate":"2024-03-06"},{"lineNumber":268,"author":{"gitId":"-"},"content":"* prefer desktop apps over other types","lastModifiedDate":"2020-05-23"},{"lineNumber":269,"author":{"gitId":"-"},"content":"* can type fast","lastModifiedDate":"2020-05-23"},{"lineNumber":270,"author":{"gitId":"-"},"content":"* prefers typing to mouse interactions","lastModifiedDate":"2020-05-26"},{"lineNumber":271,"author":{"gitId":"-"},"content":"* is reasonably comfortable using CLI apps","lastModifiedDate":"2020-05-23"},{"lineNumber":272,"author":{"gitId":"LimZiJia"},"content":"* works alone","lastModifiedDate":"2024-03-06"},{"lineNumber":273,"author":{"gitId":"LimZiJia"},"content":"","lastModifiedDate":"2024-03-06"},{"lineNumber":274,"author":{"gitId":"LimZiJia"},"content":"**Value proposition**: HouseKeeping Hub is designed to revolutionise the way housekeeping companies manage their client relationships. By focusing on storing and organising client and housekeeper contacts, our system offers unparalleled efficiency and convenience for housekeeping customer service admins, leading to improved service delivery and customer satisfaction.","lastModifiedDate":"2024-03-06"},{"lineNumber":275,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":276,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":277,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":278,"author":{"gitId":"-"},"content":"### User stories","lastModifiedDate":"2020-06-07"},{"lineNumber":279,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":280,"author":{"gitId":"-"},"content":"Priorities: High (must have) - `* * *`, Medium (nice to have) - `* *`, Low (unlikely to have) - `*`","lastModifiedDate":"2020-05-23"},{"lineNumber":281,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":282,"author":{"gitId":"LimZiJia"},"content":"| Priority | As a/an …​ | I can …​ | So that …​ |","lastModifiedDate":"2024-03-06"},{"lineNumber":283,"author":{"gitId":"LimZiJia"},"content":"|----------|-------------------------|--------------------------------------------------------------------------|-----------------------------------------------------------------------------------|","lastModifiedDate":"2024-03-06"},{"lineNumber":284,"author":{"gitId":"LimZiJia"},"content":"| `* * *` | operator | view the list of contacts | I can manage calling them if I have to. |","lastModifiedDate":"2024-03-06"},{"lineNumber":285,"author":{"gitId":"LimZiJia"},"content":"| `* * *` | operator | load contacts from a saved file | I can maintain my contact list. |","lastModifiedDate":"2024-03-06"},{"lineNumber":286,"author":{"gitId":"LimZiJia"},"content":"| `* * *` | operator | add/save the details of a new client/housekeeper | I can keep track of the list of the client/housekeeper. |","lastModifiedDate":"2024-03-06"},{"lineNumber":287,"author":{"gitId":"LimZiJia"},"content":"| `* * *` | operator | remove the contact of clients/housekeepers by some criteria | I can maintain a up-to-date and organised contact list. |","lastModifiedDate":"2024-03-06"},{"lineNumber":288,"author":{"gitId":"LimZiJia"},"content":"| `* *` | operator | update a client/housekeeper\u0027s information | I will not get details wrong even if they change. |","lastModifiedDate":"2024-03-06"},{"lineNumber":289,"author":{"gitId":"LimZiJia"},"content":"| `* *` | operator | remove the whole contact list with one click | I can remove all dummy data that I have added for trial. |","lastModifiedDate":"2024-03-06"},{"lineNumber":290,"author":{"gitId":"LimZiJia"},"content":"| `* *` | operator | retrieve details from specified contacts by their name or other criteria | I can save a lot of time to find specific clients and housekeepers. |","lastModifiedDate":"2024-03-06"},{"lineNumber":291,"author":{"gitId":"LimZiJia"},"content":"| `* *` | operator | check if clients that want a cleaning | I can provide timely housekeeping services and get more revenue for the business. |","lastModifiedDate":"2024-03-06"},{"lineNumber":292,"author":{"gitId":"LimZiJia"},"content":"| `* *` | careless operator | undo any accidental deletion or change made to the contact list | I will not mess the contact list up. |","lastModifiedDate":"2024-03-06"},{"lineNumber":293,"author":{"gitId":"LimZiJia"},"content":"| `* *` | operator | check the preferred housekeeper and their availability | I can inform the client whether the service could be operated or no. |","lastModifiedDate":"2024-03-06"},{"lineNumber":294,"author":{"gitId":"LimZiJia"},"content":"| `* *` | operator | retrieve details of a scheduled service | I can rectify on the ground situations. |","lastModifiedDate":"2024-03-06"},{"lineNumber":295,"author":{"gitId":"LimZiJia"},"content":"| `* *` | operator | check if a housekeeper is available | I can schedule for cleaning in emergency scenarios. |","lastModifiedDate":"2024-03-06"},{"lineNumber":296,"author":{"gitId":"LimZiJia"},"content":"| `* *` | fast-typing operator | quickly type CLI commands | I can perform my task efficiently. |","lastModifiedDate":"2024-03-06"},{"lineNumber":297,"author":{"gitId":"LimZiJia"},"content":"| `* *` | novice operator | use the easy-to-remember and well defined commands | I can adapt to the role of the operator quickly. |","lastModifiedDate":"2024-03-06"},{"lineNumber":298,"author":{"gitId":"LimZiJia"},"content":"| `* *` | operator | access to the contact list from different devices or platforms | I can manage the contact list on-the-go. |","lastModifiedDate":"2024-03-06"},{"lineNumber":299,"author":{"gitId":"LimZiJia"},"content":"| `* *` | novice operator | query for a help list of commands and how to use them | I can learn the functionalities of the app quickly. |","lastModifiedDate":"2024-03-06"},{"lineNumber":300,"author":{"gitId":"LimZiJia"},"content":"| `* *` | impatient operator | the command to response quickly | I can finish my job fast. |","lastModifiedDate":"2024-03-06"},{"lineNumber":301,"author":{"gitId":"LimZiJia"},"content":"| `* *` | operator | diffrentiate between the clients and housekeeper data | I will not be confused by the data. |","lastModifiedDate":"2024-03-06"},{"lineNumber":302,"author":{"gitId":"LimZiJia"},"content":"| `* *` | large company operator | to be able to save more than 1000 client\u0027s data/contact | I can list all the company\u0027s client. |","lastModifiedDate":"2024-03-06"},{"lineNumber":303,"author":{"gitId":"LimZiJia"},"content":"| `* *` | operator | the company clients\u0027 data safe | the clients can feel assured to give us their data. |","lastModifiedDate":"2024-03-06"},{"lineNumber":304,"author":{"gitId":"LimZiJia"},"content":"| `* *` | not tech savvy operator | the program to be easy to use | I don\u0027t need extra time to study how to use the program. |","lastModifiedDate":"2024-03-06"},{"lineNumber":305,"author":{"gitId":"LimZiJia"},"content":"| `* *` | operator | search and retrieve information quickly | I can relay information in real time. |","lastModifiedDate":"2024-03-06"},{"lineNumber":306,"author":{"gitId":"LimZiJia"},"content":"| `* *` | operator | Save housekeeping session details | I can prove a housekeeper has done the job. |","lastModifiedDate":"2024-03-06"},{"lineNumber":307,"author":{"gitId":"LimZiJia"},"content":"| `* *` | operator | sort the contact list by days to next preferred cleaning date | I can remind clients to book their next service soon. |","lastModifiedDate":"2024-03-06"},{"lineNumber":308,"author":{"gitId":"LimZiJia"},"content":"| `* *` | operator | sort the contact list by some parameters | I can have a better visualisation of the data. |","lastModifiedDate":"2024-03-06"},{"lineNumber":309,"author":{"gitId":"LimZiJia"},"content":"| `* *` | operator | filter for housekeepers from some parameters | it is easier for me to schedule appointments. |","lastModifiedDate":"2024-03-06"},{"lineNumber":310,"author":{"gitId":"LimZiJia"},"content":"| `*` | forgetful operator | add tags to contacts | I can make notes on what I want to do with the contact. |","lastModifiedDate":"2024-03-06"},{"lineNumber":311,"author":{"gitId":"LimZiJia"},"content":"| `*` | operator | import a contact list from an external file | I can easily transform existing contact information from other sources. |","lastModifiedDate":"2024-03-06"},{"lineNumber":312,"author":{"gitId":"LimZiJia"},"content":"| `*` | Anxious Operator | the program to have auto-save function | I can feel assured if anything happen to my device. |","lastModifiedDate":"2024-03-06"},{"lineNumber":313,"author":{"gitId":"LimZiJia"},"content":"| `*` | Expert CLI user | Define my own command aliases | I can better optimise the speed of my work. |","lastModifiedDate":"2024-03-06"},{"lineNumber":314,"author":{"gitId":"LimZiJia"},"content":"| `*` | operator | Add multiple of each action at once | I can improve my work flow. |","lastModifiedDate":"2024-03-06"},{"lineNumber":315,"author":{"gitId":"LimZiJia"},"content":"| `*` | operator | group clients/housekeepers by certain features (area) | I can organise the data better and make better client-housekeeper matches. |","lastModifiedDate":"2024-03-06"},{"lineNumber":316,"author":{"gitId":"LimZiJia"},"content":"","lastModifiedDate":"2024-03-06"},{"lineNumber":317,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":318,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":319,"author":{"gitId":"-"},"content":"### Use cases","lastModifiedDate":"2020-06-07"},{"lineNumber":320,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":321,"author":{"gitId":"moguries"},"content":"(For all use cases below, the **System** is the `HouseKeeping Hub` and the **Actor** is the `operator`, unless specified otherwise)","lastModifiedDate":"2024-03-07"},{"lineNumber":322,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":323,"author":{"gitId":"moguries"},"content":"Preconditions: Operator is logged in.","lastModifiedDate":"2024-03-07"},{"lineNumber":324,"author":{"gitId":"moguries"},"content":"","lastModifiedDate":"2024-03-07"},{"lineNumber":325,"author":{"gitId":"moguries"},"content":"**Use case: UC01 - List clients**","lastModifiedDate":"2024-03-07"},{"lineNumber":326,"author":{"gitId":"moguries"},"content":"","lastModifiedDate":"2024-03-07"},{"lineNumber":327,"author":{"gitId":"moguries"},"content":"**MSS**","lastModifiedDate":"2024-03-07"},{"lineNumber":328,"author":{"gitId":"moguries"},"content":"","lastModifiedDate":"2024-03-07"},{"lineNumber":329,"author":{"gitId":"moguries"},"content":"1. Operator requests to list clients","lastModifiedDate":"2024-03-07"},{"lineNumber":330,"author":{"gitId":"moguries"},"content":"2. HouseKeeping Hub shows the list of clients","lastModifiedDate":"2024-03-07"},{"lineNumber":331,"author":{"gitId":"moguries"},"content":"","lastModifiedDate":"2024-03-07"},{"lineNumber":332,"author":{"gitId":"moguries"},"content":" Use case ends.","lastModifiedDate":"2024-03-07"},{"lineNumber":333,"author":{"gitId":"moguries"},"content":"","lastModifiedDate":"2024-03-07"},{"lineNumber":334,"author":{"gitId":"moguries"},"content":"**Extensions**","lastModifiedDate":"2024-03-07"},{"lineNumber":335,"author":{"gitId":"moguries"},"content":"","lastModifiedDate":"2024-03-07"},{"lineNumber":336,"author":{"gitId":"moguries"},"content":"* 2a. The list is empty.","lastModifiedDate":"2024-03-07"},{"lineNumber":337,"author":{"gitId":"moguries"},"content":"","lastModifiedDate":"2024-03-07"},{"lineNumber":338,"author":{"gitId":"moguries"},"content":" * 2a1. HouseKeeping Hub shows a message that the list is empty.","lastModifiedDate":"2024-03-07"},{"lineNumber":339,"author":{"gitId":"moguries"},"content":"","lastModifiedDate":"2024-03-07"},{"lineNumber":340,"author":{"gitId":"moguries"},"content":" Use case ends.","lastModifiedDate":"2024-03-07"},{"lineNumber":341,"author":{"gitId":"moguries"},"content":"","lastModifiedDate":"2024-03-07"},{"lineNumber":342,"author":{"gitId":"moguries"},"content":"**Use case: UC02 - List housekeepers**","lastModifiedDate":"2024-03-07"},{"lineNumber":343,"author":{"gitId":"moguries"},"content":"","lastModifiedDate":"2024-03-07"},{"lineNumber":344,"author":{"gitId":"moguries"},"content":"**MSS**","lastModifiedDate":"2024-03-07"},{"lineNumber":345,"author":{"gitId":"moguries"},"content":"","lastModifiedDate":"2024-03-07"},{"lineNumber":346,"author":{"gitId":"moguries"},"content":"1. Operator requests to list housekeepers","lastModifiedDate":"2024-03-07"},{"lineNumber":347,"author":{"gitId":"moguries"},"content":"2. HouseKeeping Hub shows the list of housekeepers","lastModifiedDate":"2024-03-07"},{"lineNumber":348,"author":{"gitId":"moguries"},"content":"","lastModifiedDate":"2024-03-07"},{"lineNumber":349,"author":{"gitId":"moguries"},"content":" Use case ends.","lastModifiedDate":"2024-03-07"},{"lineNumber":350,"author":{"gitId":"moguries"},"content":"","lastModifiedDate":"2024-03-07"},{"lineNumber":351,"author":{"gitId":"moguries"},"content":"**Extensions**","lastModifiedDate":"2024-03-07"},{"lineNumber":352,"author":{"gitId":"moguries"},"content":"","lastModifiedDate":"2024-03-07"},{"lineNumber":353,"author":{"gitId":"moguries"},"content":"* 2a. The list is empty.","lastModifiedDate":"2024-03-07"},{"lineNumber":354,"author":{"gitId":"moguries"},"content":"","lastModifiedDate":"2024-03-07"},{"lineNumber":355,"author":{"gitId":"moguries"},"content":" * 2a1. HouseKeeping Hub shows a message that the list is empty. ","lastModifiedDate":"2024-03-07"},{"lineNumber":356,"author":{"gitId":"moguries"},"content":"","lastModifiedDate":"2024-03-07"},{"lineNumber":357,"author":{"gitId":"moguries"},"content":" Use case ends.","lastModifiedDate":"2024-03-07"},{"lineNumber":358,"author":{"gitId":"moguries"},"content":"","lastModifiedDate":"2024-03-07"},{"lineNumber":359,"author":{"gitId":"moguries"},"content":"**Use case: UC03 - Add client**","lastModifiedDate":"2024-03-07"},{"lineNumber":360,"author":{"gitId":"moguries"},"content":"","lastModifiedDate":"2024-03-07"},{"lineNumber":361,"author":{"gitId":"moguries"},"content":"**MSS**","lastModifiedDate":"2024-03-07"},{"lineNumber":362,"author":{"gitId":"moguries"},"content":"","lastModifiedDate":"2024-03-07"},{"lineNumber":363,"author":{"gitId":"moguries"},"content":"1. Operator requests to add a client","lastModifiedDate":"2024-03-07"},{"lineNumber":364,"author":{"gitId":"moguries"},"content":"2. HouseKeeping Hub adds the client","lastModifiedDate":"2024-03-07"},{"lineNumber":365,"author":{"gitId":"moguries"},"content":"","lastModifiedDate":"2024-03-07"},{"lineNumber":366,"author":{"gitId":"moguries"},"content":" Use case ends.","lastModifiedDate":"2024-03-07"},{"lineNumber":367,"author":{"gitId":"moguries"},"content":"","lastModifiedDate":"2024-03-07"},{"lineNumber":368,"author":{"gitId":"moguries"},"content":"**Extensions**","lastModifiedDate":"2024-03-07"},{"lineNumber":369,"author":{"gitId":"moguries"},"content":"","lastModifiedDate":"2024-03-07"},{"lineNumber":370,"author":{"gitId":"moguries"},"content":"* 1a. An [/argument] is spelled incorrectly.","lastModifiedDate":"2024-03-07"},{"lineNumber":371,"author":{"gitId":"moguries"},"content":"","lastModifiedDate":"2024-03-07"},{"lineNumber":372,"author":{"gitId":"moguries"},"content":" * 1a1. HouseKeeping Hub shows an error message.","lastModifiedDate":"2024-03-07"},{"lineNumber":373,"author":{"gitId":"moguries"},"content":"","lastModifiedDate":"2024-03-07"},{"lineNumber":374,"author":{"gitId":"moguries"},"content":" Use case ends.","lastModifiedDate":"2024-03-07"},{"lineNumber":375,"author":{"gitId":"moguries"},"content":"","lastModifiedDate":"2024-03-07"},{"lineNumber":376,"author":{"gitId":"moguries"},"content":"* 1a. A given argument is invalid.","lastModifiedDate":"2024-03-07"},{"lineNumber":377,"author":{"gitId":"moguries"},"content":"","lastModifiedDate":"2024-03-07"},{"lineNumber":378,"author":{"gitId":"moguries"},"content":" * 1a1. HouseKeeping Hub shows an error message.","lastModifiedDate":"2024-03-07"},{"lineNumber":379,"author":{"gitId":"moguries"},"content":"","lastModifiedDate":"2024-03-07"},{"lineNumber":380,"author":{"gitId":"moguries"},"content":" Use case ends.","lastModifiedDate":"2024-03-07"},{"lineNumber":381,"author":{"gitId":"moguries"},"content":"","lastModifiedDate":"2024-03-07"},{"lineNumber":382,"author":{"gitId":"moguries"},"content":"**Use case: UC04 - Add housekeeper**","lastModifiedDate":"2024-03-07"},{"lineNumber":383,"author":{"gitId":"moguries"},"content":"","lastModifiedDate":"2024-03-07"},{"lineNumber":384,"author":{"gitId":"moguries"},"content":"**MSS**","lastModifiedDate":"2024-03-07"},{"lineNumber":385,"author":{"gitId":"moguries"},"content":"","lastModifiedDate":"2024-03-07"},{"lineNumber":386,"author":{"gitId":"moguries"},"content":"1. Operator requests to add a housekeeper","lastModifiedDate":"2024-03-07"},{"lineNumber":387,"author":{"gitId":"moguries"},"content":"2. HouseKeeping Hub adds the housekeeper","lastModifiedDate":"2024-03-07"},{"lineNumber":388,"author":{"gitId":"moguries"},"content":"","lastModifiedDate":"2024-03-07"},{"lineNumber":389,"author":{"gitId":"moguries"},"content":" Use case ends.","lastModifiedDate":"2024-03-07"},{"lineNumber":390,"author":{"gitId":"moguries"},"content":"","lastModifiedDate":"2024-03-07"},{"lineNumber":391,"author":{"gitId":"moguries"},"content":"**Extensions**","lastModifiedDate":"2024-03-07"},{"lineNumber":392,"author":{"gitId":"moguries"},"content":"","lastModifiedDate":"2024-03-07"},{"lineNumber":393,"author":{"gitId":"moguries"},"content":"* 1a. An [/argument] is spelled incorrectly.","lastModifiedDate":"2024-03-07"},{"lineNumber":394,"author":{"gitId":"moguries"},"content":"","lastModifiedDate":"2024-03-07"},{"lineNumber":395,"author":{"gitId":"moguries"},"content":" * 1a1. HouseKeeping Hub shows an error message.","lastModifiedDate":"2024-03-07"},{"lineNumber":396,"author":{"gitId":"moguries"},"content":"","lastModifiedDate":"2024-03-07"},{"lineNumber":397,"author":{"gitId":"moguries"},"content":" Use case ends.","lastModifiedDate":"2024-03-07"},{"lineNumber":398,"author":{"gitId":"moguries"},"content":"","lastModifiedDate":"2024-03-07"},{"lineNumber":399,"author":{"gitId":"moguries"},"content":"* 1a. A given argument is invalid.","lastModifiedDate":"2024-03-07"},{"lineNumber":400,"author":{"gitId":"moguries"},"content":"","lastModifiedDate":"2024-03-07"},{"lineNumber":401,"author":{"gitId":"moguries"},"content":" * 1a1. HouseKeeping Hub shows an error message.","lastModifiedDate":"2024-03-07"},{"lineNumber":402,"author":{"gitId":"moguries"},"content":"","lastModifiedDate":"2024-03-07"},{"lineNumber":403,"author":{"gitId":"moguries"},"content":" Use case ends.","lastModifiedDate":"2024-03-07"},{"lineNumber":404,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2024-03-07"},{"lineNumber":405,"author":{"gitId":"moguries"},"content":"**Use case: UC05 - Delete client**","lastModifiedDate":"2024-03-07"},{"lineNumber":406,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":407,"author":{"gitId":"-"},"content":"**MSS**","lastModifiedDate":"2020-05-23"},{"lineNumber":408,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":409,"author":{"gitId":"moguries"},"content":"1. Operator requests to list clients","lastModifiedDate":"2024-03-07"},{"lineNumber":410,"author":{"gitId":"moguries"},"content":"2. HouseKeeping Hub shows the list of clients","lastModifiedDate":"2024-03-07"},{"lineNumber":411,"author":{"gitId":"moguries"},"content":"3. Operator requests to delete a specific client in the list","lastModifiedDate":"2024-03-07"},{"lineNumber":412,"author":{"gitId":"moguries"},"content":"4. HouseKeeping Hub deletes the client","lastModifiedDate":"2024-03-07"},{"lineNumber":413,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":414,"author":{"gitId":"-"},"content":" Use case ends.","lastModifiedDate":"2020-05-23"},{"lineNumber":415,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":416,"author":{"gitId":"-"},"content":"**Extensions**","lastModifiedDate":"2020-05-23"},{"lineNumber":417,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":418,"author":{"gitId":"-"},"content":"* 2a. The list is empty.","lastModifiedDate":"2020-05-23"},{"lineNumber":419,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":420,"author":{"gitId":"-"},"content":" Use case ends.","lastModifiedDate":"2020-05-23"},{"lineNumber":421,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":422,"author":{"gitId":"-"},"content":"* 3a. The given index is invalid.","lastModifiedDate":"2020-05-23"},{"lineNumber":423,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":424,"author":{"gitId":"moguries"},"content":" * 3a1. HouseKeeping Hub shows an error message.","lastModifiedDate":"2024-03-07"},{"lineNumber":425,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":426,"author":{"gitId":"-"},"content":" Use case resumes at step 2.","lastModifiedDate":"2020-05-23"},{"lineNumber":427,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":428,"author":{"gitId":"moguries"},"content":"**Use case: UC06 - Delete housekeeper**","lastModifiedDate":"2024-03-07"},{"lineNumber":429,"author":{"gitId":"moguries"},"content":"","lastModifiedDate":"2024-03-07"},{"lineNumber":430,"author":{"gitId":"moguries"},"content":"**MSS**","lastModifiedDate":"2024-03-07"},{"lineNumber":431,"author":{"gitId":"moguries"},"content":"","lastModifiedDate":"2024-03-07"},{"lineNumber":432,"author":{"gitId":"moguries"},"content":"1. Operator requests to list housekeepers","lastModifiedDate":"2024-03-07"},{"lineNumber":433,"author":{"gitId":"moguries"},"content":"2. HouseKeeping Hub shows the list of housekeepers","lastModifiedDate":"2024-03-07"},{"lineNumber":434,"author":{"gitId":"moguries"},"content":"3. Operator requests to delete a specific housekeeper in the list","lastModifiedDate":"2024-03-07"},{"lineNumber":435,"author":{"gitId":"moguries"},"content":"4. HouseKeeping Hub deletes the housekeeper","lastModifiedDate":"2024-03-07"},{"lineNumber":436,"author":{"gitId":"moguries"},"content":"","lastModifiedDate":"2024-03-07"},{"lineNumber":437,"author":{"gitId":"moguries"},"content":" Use case ends.","lastModifiedDate":"2024-03-07"},{"lineNumber":438,"author":{"gitId":"moguries"},"content":"","lastModifiedDate":"2024-03-07"},{"lineNumber":439,"author":{"gitId":"moguries"},"content":"**Extensions**","lastModifiedDate":"2024-03-07"},{"lineNumber":440,"author":{"gitId":"moguries"},"content":"","lastModifiedDate":"2024-03-07"},{"lineNumber":441,"author":{"gitId":"moguries"},"content":"* 2a. The list is empty.","lastModifiedDate":"2024-03-07"},{"lineNumber":442,"author":{"gitId":"moguries"},"content":"","lastModifiedDate":"2024-03-07"},{"lineNumber":443,"author":{"gitId":"moguries"},"content":" Use case ends.","lastModifiedDate":"2024-03-07"},{"lineNumber":444,"author":{"gitId":"moguries"},"content":"","lastModifiedDate":"2024-03-07"},{"lineNumber":445,"author":{"gitId":"moguries"},"content":"* 3a. The given index is invalid.","lastModifiedDate":"2024-03-07"},{"lineNumber":446,"author":{"gitId":"moguries"},"content":"","lastModifiedDate":"2024-03-07"},{"lineNumber":447,"author":{"gitId":"moguries"},"content":" * 3a1. HouseKeeping Hub shows an error message.","lastModifiedDate":"2024-03-07"},{"lineNumber":448,"author":{"gitId":"moguries"},"content":"","lastModifiedDate":"2024-03-07"},{"lineNumber":449,"author":{"gitId":"moguries"},"content":" Use case resumes at step 2.","lastModifiedDate":"2024-03-07"},{"lineNumber":450,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":451,"author":{"gitId":"-"},"content":"### Non-Functional Requirements","lastModifiedDate":"2020-05-23"},{"lineNumber":452,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":453,"author":{"gitId":"-"},"content":"1. Should work on any _mainstream OS_ as long as it has Java `11` or above installed.","lastModifiedDate":"2020-05-23"},{"lineNumber":454,"author":{"gitId":"GERARDJM018"},"content":"2. Should be able to hold up to 1000 contacts without a noticeable sluggishness in performance for typical usage.","lastModifiedDate":"2024-03-07"},{"lineNumber":455,"author":{"gitId":"GERARDJM018"},"content":"3. A user not familiar with CLI but has an 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.","lastModifiedDate":"2024-03-07"},{"lineNumber":456,"author":{"gitId":"GERARDJM018"},"content":"4. All user operations should completed within 3 seconds.","lastModifiedDate":"2024-03-07"},{"lineNumber":457,"author":{"gitId":"GERARDJM018"},"content":"5. Should lose no more than 2 user operations worth of work in case of system crash.","lastModifiedDate":"2024-03-07"},{"lineNumber":458,"author":{"gitId":"GERARDJM018"},"content":"6. Should not take memory more than 200 MB while in operation.","lastModifiedDate":"2024-03-07"},{"lineNumber":459,"author":{"gitId":"GERARDJM018"},"content":"7. Will not use a DataBase Management System e.g., MySQL, and PostgreSQL to store data. And hence, will use flat file as a storage.","lastModifiedDate":"2024-03-07"},{"lineNumber":460,"author":{"gitId":"GERARDJM018"},"content":"8. Should be portable (able to work without requiring an installer).","lastModifiedDate":"2024-03-07"},{"lineNumber":461,"author":{"gitId":"GERARDJM018"},"content":"9. Should not use or depend on a remote server.","lastModifiedDate":"2024-03-07"},{"lineNumber":462,"author":{"gitId":"-"},"content":"*{More to be added}*","lastModifiedDate":"2020-05-23"},{"lineNumber":463,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":464,"author":{"gitId":"-"},"content":"### Glossary","lastModifiedDate":"2020-05-23"},{"lineNumber":465,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":466,"author":{"gitId":"-"},"content":"* **Mainstream OS**: Windows, Linux, Unix, MacOS","lastModifiedDate":"2024-02-09"},{"lineNumber":467,"author":{"gitId":"-"},"content":"* **Private contact detail**: A contact detail that is not meant to be shared with others","lastModifiedDate":"2020-05-23"},{"lineNumber":468,"author":{"gitId":"LimZiJia"},"content":"* **CLI**: Short for Command Line Interface. User\u0027s of our application mainly interact with our program by typing commands.","lastModifiedDate":"2024-03-06"},{"lineNumber":469,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":470,"author":{"gitId":"-"},"content":"--------------------------------------------------------------------------------------------------------------------","lastModifiedDate":"2020-05-23"},{"lineNumber":471,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":472,"author":{"gitId":"-"},"content":"## **Appendix: Instructions for manual testing**","lastModifiedDate":"2020-05-23"},{"lineNumber":473,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":474,"author":{"gitId":"-"},"content":"Given below are instructions to test the app manually.","lastModifiedDate":"2020-05-23"},{"lineNumber":475,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":476,"author":{"gitId":"-"},"content":"\u003cdiv markdown\u003d\"span\" class\u003d\"alert alert-info\"\u003e:information_source: **Note:** These instructions only provide a starting point for testers to work on;","lastModifiedDate":"2020-05-23"},{"lineNumber":477,"author":{"gitId":"-"},"content":"testers are expected to do more *exploratory* testing.","lastModifiedDate":"2020-05-23"},{"lineNumber":478,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":479,"author":{"gitId":"-"},"content":"\u003c/div\u003e","lastModifiedDate":"2020-05-23"},{"lineNumber":480,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":481,"author":{"gitId":"-"},"content":"### Launch and shutdown","lastModifiedDate":"2020-05-23"},{"lineNumber":482,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":483,"author":{"gitId":"-"},"content":"1. Initial launch","lastModifiedDate":"2020-05-23"},{"lineNumber":484,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":485,"author":{"gitId":"-"},"content":" 1. Download the jar file and copy into an empty folder","lastModifiedDate":"2020-05-23"},{"lineNumber":486,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":487,"author":{"gitId":"-"},"content":" 1. Double-click the jar file Expected: Shows the GUI with a set of sample contacts. The window size may not be optimum.","lastModifiedDate":"2020-05-23"},{"lineNumber":488,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":489,"author":{"gitId":"-"},"content":"1. Saving window preferences","lastModifiedDate":"2020-05-23"},{"lineNumber":490,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":491,"author":{"gitId":"-"},"content":" 1. Resize the window to an optimum size. Move the window to a different location. Close the window.","lastModifiedDate":"2020-05-23"},{"lineNumber":492,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":493,"author":{"gitId":"-"},"content":" 1. Re-launch the app by double-clicking the jar file.\u003cbr\u003e","lastModifiedDate":"2020-05-23"},{"lineNumber":494,"author":{"gitId":"-"},"content":" Expected: The most recent window size and location is retained.","lastModifiedDate":"2020-05-23"},{"lineNumber":495,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":496,"author":{"gitId":"-"},"content":"1. _{ more test cases …​ }_","lastModifiedDate":"2020-05-23"},{"lineNumber":497,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":498,"author":{"gitId":"-"},"content":"### Deleting a person","lastModifiedDate":"2020-05-23"},{"lineNumber":499,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":500,"author":{"gitId":"-"},"content":"1. Deleting a person while all persons are being shown","lastModifiedDate":"2020-05-23"},{"lineNumber":501,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":502,"author":{"gitId":"-"},"content":" 1. Prerequisites: List all persons using the `list` command. Multiple persons in the list.","lastModifiedDate":"2020-05-23"},{"lineNumber":503,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":504,"author":{"gitId":"-"},"content":" 1. Test case: `delete 1`\u003cbr\u003e","lastModifiedDate":"2020-05-23"},{"lineNumber":505,"author":{"gitId":"-"},"content":" 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.","lastModifiedDate":"2020-05-23"},{"lineNumber":506,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":507,"author":{"gitId":"-"},"content":" 1. Test case: `delete 0`\u003cbr\u003e","lastModifiedDate":"2020-05-23"},{"lineNumber":508,"author":{"gitId":"-"},"content":" Expected: No person is deleted. Error details shown in the status message. Status bar remains the same.","lastModifiedDate":"2020-05-23"},{"lineNumber":509,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":510,"author":{"gitId":"-"},"content":" 1. Other incorrect delete commands to try: `delete`, `delete x`, `...` (where x is larger than the list size)\u003cbr\u003e","lastModifiedDate":"2020-05-23"},{"lineNumber":511,"author":{"gitId":"-"},"content":" Expected: Similar to previous.","lastModifiedDate":"2020-05-23"},{"lineNumber":512,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":513,"author":{"gitId":"-"},"content":"1. _{ more test cases …​ }_","lastModifiedDate":"2020-05-23"},{"lineNumber":514,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":515,"author":{"gitId":"-"},"content":"### Saving data","lastModifiedDate":"2020-05-23"},{"lineNumber":516,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":517,"author":{"gitId":"-"},"content":"1. Dealing with missing/corrupted data files","lastModifiedDate":"2020-05-23"},{"lineNumber":518,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":519,"author":{"gitId":"-"},"content":" 1. _{explain how to simulate a missing/corrupted file, and the expected behavior}_","lastModifiedDate":"2020-05-23"},{"lineNumber":520,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":521,"author":{"gitId":"-"},"content":"1. _{ more test cases …​ }_","lastModifiedDate":"2020-05-23"}],"authorContributionMap":{"LimZiJia":42,"moguries":110,"-":361,"GERARDJM018":8}}] diff --git a/AY2324S2-CS2103T-W09-1_tp_master/commits.json b/AY2324S2-CS2103T-W09-1_tp_master/commits.json index cde1f635..d9ccca91 100644 --- a/AY2324S2-CS2103T-W09-1_tp_master/commits.json +++ b/AY2324S2-CS2103T-W09-1_tp_master/commits.json @@ -1 +1 @@ -{"authorDailyContributionsMap":{"LimZiJia":[{"date":"2024-03-06","commitResults":[{"hash":"ee4f360515f749c82a1b24b98d02deffe5ae36d9","isMergeCommit":false,"messageTitle":"Add Remark Command","messageBody":"","fileTypesAndContributionMap":{"functional-code":{"insertions":203,"deletions":10},"test-code":{"insertions":238,"deletions":2}}},{"hash":"614ff1f4ed3e19eccefedbfcfbc29f4a0c577f3d","isMergeCommit":false,"messageTitle":"Fix code style","messageBody":"","fileTypesAndContributionMap":{"functional-code":{"insertions":12,"deletions":5},"test-code":{"insertions":2,"deletions":4}}},{"hash":"8d34c34841053a9a44cd79c8979ef1398204a7ad","isMergeCommit":true,"messageTitle":"Merge pull request #15 from LimZiJia/tutorial-adding-command","messageBody":"Tutorial adding command","fileTypesAndContributionMap":{}},{"hash":"b24538eaccd0465698add13c701ce1cbf06f77a9","isMergeCommit":false,"messageTitle":"Revert \"Tutorial adding command\"","messageBody":"","fileTypesAndContributionMap":{"functional-code":{"insertions":10,"deletions":210},"test-code":{"insertions":2,"deletions":236}}},{"hash":"5e4abdea235e3878401b33a9fe56441c6ac15581","isMergeCommit":true,"messageTitle":"Merge pull request #16 from AY2324S2-CS2103T-W09-1/revert-15-tutorial-adding-command","messageBody":"Revert \"Tutorial adding command\"","fileTypesAndContributionMap":{}},{"hash":"201bebc8e093fbc82a52c227b8a2649c95e4a7c6","isMergeCommit":false,"messageTitle":"Update DeveloperGuide.md","messageBody":"Edited target user profile, value proposition, user stories and glossary.\n","fileTypesAndContributionMap":{"docs":{"insertions":42,"deletions":11}}},{"hash":"c4387b86ba92c4c66fe9b7d201913bff5e2f0b91","isMergeCommit":false,"messageTitle":"Upload placeholder image and change some links","messageBody":"","fileTypesAndContributionMap":{"docs":{"insertions":3,"deletions":4}}},{"hash":"bc4666b7980635394d2d5d460ace1087f9705688","isMergeCommit":false,"messageTitle":"Add email","messageBody":"","fileTypesAndContributionMap":{"docs":{"insertions":1,"deletions":1}}}]},{"date":"2024-03-07","commitResults":[{"hash":"6291069b1a50ea2741a20610f232e6aafa4acfda","isMergeCommit":true,"messageTitle":"Merge pull request #23 from GERARDJM018/about-us","messageBody":"Update AboutUs.md","fileTypesAndContributionMap":{}},{"hash":"e9ce6f7130ca1224a2235028ecd70f35f663f5f9","isMergeCommit":true,"messageTitle":"Merge remote-tracking branch \u0027upstream/master\u0027 into update-zijia-about-us","messageBody":"","fileTypesAndContributionMap":{}}]},{"date":"2024-03-08","commitResults":[{"hash":"205cda491a8566ed140cfdc325d4fae058e9deb1","isMergeCommit":false,"messageTitle":"Update About Us","messageBody":"","fileTypesAndContributionMap":{"docs":{"insertions":3,"deletions":2}}},{"hash":"27207e2fae59cd72ecafd588fd229daef34feefc","isMergeCommit":true,"messageTitle":"Merge pull request #25 from moguries/update-DG-for-use-cases","messageBody":"Update the DG for use cases","fileTypesAndContributionMap":{}}]}],"moguries":[{"date":"2024-03-07","commitResults":[{"hash":"221f90a77e7bfc6be4d9108ae09348661e7eabd7","isMergeCommit":false,"messageTitle":"Update the DG for use cases","messageBody":"","fileTypesAndContributionMap":{"docs":{"insertions":111,"deletions":8}}}]},{"date":"2024-03-08","commitResults":[{"hash":"bcb7ce3eed49c1bc9d75e6265e2f15b35afebe43","isMergeCommit":true,"messageTitle":"Merge pull request #26 from LimZiJia/update-zijia-about-us","messageBody":"Update zijia about us","fileTypesAndContributionMap":{}}]}],"gosongying":[{"date":"2024-03-07","commitResults":[{"hash":"5e4572baf8a27a58e9332ced314704840132da9d","isMergeCommit":true,"messageTitle":"Merge pull request #22 from GERARDJM018/Developer-Guide","messageBody":"Update DeveloperGuide.md","fileTypesAndContributionMap":{}}]},{"date":"2024-03-08","commitResults":[{"hash":"d3640276dd019e68f68682bb1987cb9e41b5bae2","isMergeCommit":false,"messageTitle":"Update AboutUs","messageBody":"","fileTypesAndContributionMap":{"docs":{"insertions":9,"deletions":0}}}]}],"GERARDJM018":[{"date":"2024-03-07","commitResults":[{"hash":"4a6461f6ad7de9271210e08c55e12a665d0f250e","isMergeCommit":true,"messageTitle":"Merge pull request #19 from LimZiJia/update-dg-user-stories-and-glossary","messageBody":"Update DeveloperGuide.md","fileTypesAndContributionMap":{}},{"hash":"8ae312fdf7b18f360d89ff0ff7888d9595e4e05a","isMergeCommit":false,"messageTitle":"Update DeveloperGuide.md","messageBody":"","fileTypesAndContributionMap":{"docs":{"insertions":8,"deletions":3}}},{"hash":"3b06122880c2883b7937f2a0806275b955e9cdb1","isMergeCommit":false,"messageTitle":"Update AboutUs.md","messageBody":"","fileTypesAndContributionMap":{"docs":{"insertions":5,"deletions":6}}}]},{"date":"2024-03-08","commitResults":[{"hash":"3b42659caf493aace51027d3b27c82c0023325a1","isMergeCommit":true,"messageTitle":"Merge pull request #27 from gosongying/update-aboutus","messageBody":"Update AboutUs","fileTypesAndContributionMap":{}}]}]},"authorFileTypeContributionMap":{"LimZiJia":{"docs":51,"functional-code":0,"test-code":0},"moguries":{"docs":110,"functional-code":0,"test-code":0},"gosongying":{"docs":8,"functional-code":0,"test-code":0},"GERARDJM018":{"docs":11,"functional-code":0,"test-code":0}},"authorContributionVariance":{"LimZiJia":61682.727,"moguries":881.12885,"gosongying":5.0399995,"GERARDJM018":30.115557},"authorDisplayNameMap":{"LimZiJia":"CS2103T-W09-1 LIM .. JIA","moguries":"CS2103T-W09-1 HUAN..ESTE","gosongying":"CS2103T-W09-1 GO S..YING","GERARDJM018":"CS2103T-W09-1 GERA..THEW"}} +{"authorDailyContributionsMap":{"LimZiJia":[{"date":"2024-03-06","commitResults":[{"hash":"ee4f360515f749c82a1b24b98d02deffe5ae36d9","isMergeCommit":false,"messageTitle":"Add Remark Command","messageBody":"","fileTypesAndContributionMap":{"functional-code":{"insertions":203,"deletions":10},"test-code":{"insertions":238,"deletions":2}}},{"hash":"614ff1f4ed3e19eccefedbfcfbc29f4a0c577f3d","isMergeCommit":false,"messageTitle":"Fix code style","messageBody":"","fileTypesAndContributionMap":{"functional-code":{"insertions":12,"deletions":5},"test-code":{"insertions":2,"deletions":4}}},{"hash":"8d34c34841053a9a44cd79c8979ef1398204a7ad","isMergeCommit":true,"messageTitle":"Merge pull request #15 from LimZiJia/tutorial-adding-command","messageBody":"Tutorial adding command","fileTypesAndContributionMap":{}},{"hash":"b24538eaccd0465698add13c701ce1cbf06f77a9","isMergeCommit":false,"messageTitle":"Revert \"Tutorial adding command\"","messageBody":"","fileTypesAndContributionMap":{"functional-code":{"insertions":10,"deletions":210},"test-code":{"insertions":2,"deletions":236}}},{"hash":"5e4abdea235e3878401b33a9fe56441c6ac15581","isMergeCommit":true,"messageTitle":"Merge pull request #16 from AY2324S2-CS2103T-W09-1/revert-15-tutorial-adding-command","messageBody":"Revert \"Tutorial adding command\"","fileTypesAndContributionMap":{}},{"hash":"201bebc8e093fbc82a52c227b8a2649c95e4a7c6","isMergeCommit":false,"messageTitle":"Update DeveloperGuide.md","messageBody":"Edited target user profile, value proposition, user stories and glossary.\n","fileTypesAndContributionMap":{"docs":{"insertions":42,"deletions":11}}},{"hash":"c4387b86ba92c4c66fe9b7d201913bff5e2f0b91","isMergeCommit":false,"messageTitle":"Upload placeholder image and change some links","messageBody":"","fileTypesAndContributionMap":{"docs":{"insertions":3,"deletions":4}}},{"hash":"bc4666b7980635394d2d5d460ace1087f9705688","isMergeCommit":false,"messageTitle":"Add email","messageBody":"","fileTypesAndContributionMap":{"docs":{"insertions":1,"deletions":1}}}]},{"date":"2024-03-07","commitResults":[{"hash":"6291069b1a50ea2741a20610f232e6aafa4acfda","isMergeCommit":true,"messageTitle":"Merge pull request #23 from GERARDJM018/about-us","messageBody":"Update AboutUs.md","fileTypesAndContributionMap":{}},{"hash":"e9ce6f7130ca1224a2235028ecd70f35f663f5f9","isMergeCommit":true,"messageTitle":"Merge remote-tracking branch \u0027upstream/master\u0027 into update-zijia-about-us","messageBody":"","fileTypesAndContributionMap":{}}]},{"date":"2024-03-08","commitResults":[{"hash":"205cda491a8566ed140cfdc325d4fae058e9deb1","isMergeCommit":false,"messageTitle":"Update About Us","messageBody":"","fileTypesAndContributionMap":{"docs":{"insertions":3,"deletions":2}}},{"hash":"27207e2fae59cd72ecafd588fd229daef34feefc","isMergeCommit":true,"messageTitle":"Merge pull request #25 from moguries/update-DG-for-use-cases","messageBody":"Update the DG for use cases","fileTypesAndContributionMap":{}}]}],"moguries":[{"date":"2024-03-07","commitResults":[{"hash":"221f90a77e7bfc6be4d9108ae09348661e7eabd7","isMergeCommit":false,"messageTitle":"Update the DG for use cases","messageBody":"","fileTypesAndContributionMap":{"docs":{"insertions":111,"deletions":8}}}]},{"date":"2024-03-08","commitResults":[{"hash":"bcb7ce3eed49c1bc9d75e6265e2f15b35afebe43","isMergeCommit":true,"messageTitle":"Merge pull request #26 from LimZiJia/update-zijia-about-us","messageBody":"Update zijia about us","fileTypesAndContributionMap":{}},{"hash":"a176a4d01319b033e415e147facc6840aff30867","isMergeCommit":false,"messageTitle":"Update AboutUs","messageBody":"","fileTypesAndContributionMap":{"docs":{"insertions":9,"deletions":0}}},{"hash":"02a882c1fb0936d16cf06039940eb6fde3f28186","isMergeCommit":true,"messageTitle":"Merge pull request #30 from gosongying/master","messageBody":"Update README","fileTypesAndContributionMap":{}}]}],"gosongying":[{"date":"2024-03-07","commitResults":[{"hash":"5e4572baf8a27a58e9332ced314704840132da9d","isMergeCommit":true,"messageTitle":"Merge pull request #22 from GERARDJM018/Developer-Guide","messageBody":"Update DeveloperGuide.md","fileTypesAndContributionMap":{}}]},{"date":"2024-03-08","commitResults":[{"hash":"d3640276dd019e68f68682bb1987cb9e41b5bae2","isMergeCommit":false,"messageTitle":"Update AboutUs","messageBody":"","fileTypesAndContributionMap":{"docs":{"insertions":9,"deletions":0}}},{"hash":"1f859cf8f7de75a5bb62381812712d3cc086c7de","isMergeCommit":false,"messageTitle":"Update README","messageBody":"","fileTypesAndContributionMap":{"docs":{"insertions":19,"deletions":11}}},{"hash":"7de7649f1759b8dd52db5e6772772c2fc9543291","isMergeCommit":true,"messageTitle":"Merge pull request #31 from GERARDJM018/about-us","messageBody":"Update AboutUs.md","fileTypesAndContributionMap":{}}]}],"GERARDJM018":[{"date":"2024-03-07","commitResults":[{"hash":"4a6461f6ad7de9271210e08c55e12a665d0f250e","isMergeCommit":true,"messageTitle":"Merge pull request #19 from LimZiJia/update-dg-user-stories-and-glossary","messageBody":"Update DeveloperGuide.md","fileTypesAndContributionMap":{}},{"hash":"8ae312fdf7b18f360d89ff0ff7888d9595e4e05a","isMergeCommit":false,"messageTitle":"Update DeveloperGuide.md","messageBody":"","fileTypesAndContributionMap":{"docs":{"insertions":8,"deletions":3}}},{"hash":"3b06122880c2883b7937f2a0806275b955e9cdb1","isMergeCommit":false,"messageTitle":"Update AboutUs.md","messageBody":"","fileTypesAndContributionMap":{"docs":{"insertions":5,"deletions":6}}}]},{"date":"2024-03-08","commitResults":[{"hash":"3b42659caf493aace51027d3b27c82c0023325a1","isMergeCommit":true,"messageTitle":"Merge pull request #27 from gosongying/update-aboutus","messageBody":"Update AboutUs","fileTypesAndContributionMap":{}},{"hash":"daa06b3db4496389a6c71d492e71781bc1adb9ed","isMergeCommit":true,"messageTitle":"Merge pull request #29 from moguries/update-aboutus","messageBody":"Update AboutUs Celeste","fileTypesAndContributionMap":{}},{"hash":"225fe7fba04f500d0df18a17078017b1538c606c","isMergeCommit":true,"messageTitle":"Merge branch \u0027master\u0027 into about-us","messageBody":"","fileTypesAndContributionMap":{}},{"hash":"425369d3645673a4eb5c039cc0ad7f6d638e1512","isMergeCommit":false,"messageTitle":"Update AboutUs.md","messageBody":"Delete some dummy profiles.\n","fileTypesAndContributionMap":{"docs":{"insertions":0,"deletions":37}}}]}]},"authorFileTypeContributionMap":{"LimZiJia":{"docs":50,"functional-code":0,"test-code":0},"moguries":{"docs":114,"functional-code":0,"test-code":0},"gosongying":{"docs":23,"functional-code":0,"test-code":0},"GERARDJM018":{"docs":11,"functional-code":0,"test-code":0}},"authorContributionVariance":{"LimZiJia":61682.727,"moguries":876.64886,"gosongying":94.64001,"GERARDJM018":108.06222},"authorDisplayNameMap":{"LimZiJia":"CS2103T-W09-1 LIM .. JIA","moguries":"CS2103T-W09-1 HUAN..ESTE","gosongying":"CS2103T-W09-1 GO S..YING","GERARDJM018":"CS2103T-W09-1 GERA..THEW"}} diff --git a/AY2324S2-CS2103T-W10-3_tp_master/authorship.json b/AY2324S2-CS2103T-W10-3_tp_master/authorship.json index 25016071..328bd7c5 100644 --- a/AY2324S2-CS2103T-W10-3_tp_master/authorship.json +++ b/AY2324S2-CS2103T-W10-3_tp_master/authorship.json @@ -1 +1 @@ -[{"path":"README.md","fileType":"docs","lines":[{"lineNumber":1,"author":{"gitId":"-"},"content":"[![CI Status](https://github.com/AY2324S2-CS2103T-W10-3/tp/workflows/Java%20CI/badge.svg)](https://github.com/AY2324S2-CS2103T-W10-3/tp/actions)","lastModifiedDate":"2024-02-19"},{"lineNumber":2,"author":{"gitId":"-"},"content":"[![codecov](https://codecov.io/gh/AY2324S2-CS2103T-W10-3/tp/graph/badge.svg?token\u003dPXSE5NPSA4)](https://codecov.io/gh/AY2324S2-CS2103T-W10-3/tp)","lastModifiedDate":"2024-02-17"},{"lineNumber":3,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":4,"author":{"gitId":"ongzhili"},"content":"![Ui.png](docs%2Fimages%2FUi.png)","lastModifiedDate":"2024-03-04"},{"lineNumber":5,"author":{"gitId":"ongzhili"},"content":"# PedagoguePages","lastModifiedDate":"2024-03-04"},{"lineNumber":6,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":7,"author":{"gitId":"ongzhili"},"content":"\u003e \"Building Bridges, Bridging Gaps: PedagoguePages, Your Contact Map\"","lastModifiedDate":"2024-03-04"},{"lineNumber":8,"author":{"gitId":"ongzhili"},"content":"","lastModifiedDate":"2024-03-04"},{"lineNumber":9,"author":{"gitId":"ongzhili"},"content":"## What is PedagoguePages?","lastModifiedDate":"2024-03-04"},{"lineNumber":10,"author":{"gitId":"ongzhili"},"content":"* `PedagoguePages` (`PePes` for short) is a **contact management application**.","lastModifiedDate":"2024-03-04"},{"lineNumber":11,"author":{"gitId":"ongzhili"},"content":"* Naming:","lastModifiedDate":"2024-03-04"},{"lineNumber":12,"author":{"gitId":"ongzhili"},"content":" * Product Name:","lastModifiedDate":"2024-03-04"},{"lineNumber":13,"author":{"gitId":"ongzhili"},"content":" * `Pedagogue` - Pedagogy, education.","lastModifiedDate":"2024-03-04"},{"lineNumber":14,"author":{"gitId":"ongzhili"},"content":" * `Pages` - Lists of contacts","lastModifiedDate":"2024-03-04"},{"lineNumber":15,"author":{"gitId":"ongzhili"},"content":" * Together, forming a contact list for educators!","lastModifiedDate":"2024-03-04"},{"lineNumber":16,"author":{"gitId":"ongzhili"},"content":" * Catchy abbreviation:","lastModifiedDate":"2024-03-04"},{"lineNumber":17,"author":{"gitId":"ongzhili"},"content":" * `Pe` from Pedagogue, and `Pes` from pages (`PAY-ge-S`)","lastModifiedDate":"2024-03-04"},{"lineNumber":18,"author":{"gitId":"ongzhili"},"content":" ","lastModifiedDate":"2024-03-04"},{"lineNumber":19,"author":{"gitId":"ongzhili"},"content":"* PedagogyPages is a **Command Line Interface** (CLI) based system.","lastModifiedDate":"2024-03-04"},{"lineNumber":20,"author":{"gitId":"ongzhili"},"content":"","lastModifiedDate":"2024-03-04"},{"lineNumber":21,"author":{"gitId":"ongzhili"},"content":"","lastModifiedDate":"2024-03-04"},{"lineNumber":22,"author":{"gitId":"ongzhili"},"content":"## What is PedagogyPages for?","lastModifiedDate":"2024-03-04"},{"lineNumber":23,"author":{"gitId":"ongzhili"},"content":"* PedagogyPages is optimized for **Educators**, specifically in the primary / secondary school area, where class sizes are large.\u003cbr\u003e","lastModifiedDate":"2024-03-04"},{"lineNumber":24,"author":{"gitId":"ongzhili"},"content":"* PedagogyPages is more optimized for users who are:","lastModifiedDate":"2024-03-04"},{"lineNumber":25,"author":{"gitId":"ongzhili"},"content":" * Generally faster typists","lastModifiedDate":"2024-03-04"},{"lineNumber":26,"author":{"gitId":"ongzhili"},"content":" * Users that prefer command line interfaces","lastModifiedDate":"2024-03-04"},{"lineNumber":27,"author":{"gitId":"ongzhili"},"content":"* PedagogyPages boasts features such as:","lastModifiedDate":"2024-03-04"},{"lineNumber":28,"author":{"gitId":"ongzhili"},"content":" * Basic **Create, Read, Update, Delete (CRUD)** operations on student contact information.","lastModifiedDate":"2024-03-04"},{"lineNumber":29,"author":{"gitId":"ongzhili"},"content":" * Search functionality based on different modes (e.g classes, student ID, etc)","lastModifiedDate":"2024-03-04"},{"lineNumber":30,"author":{"gitId":"ongzhili"},"content":"","lastModifiedDate":"2024-03-04"},{"lineNumber":31,"author":{"gitId":"ongzhili"},"content":"","lastModifiedDate":"2024-03-04"},{"lineNumber":32,"author":{"gitId":"ongzhili"},"content":"## What is PedagogyPages based on?","lastModifiedDate":"2024-03-04"},{"lineNumber":33,"author":{"gitId":"ongzhili"},"content":"* PedagogyPages is also our (CS2103-W10-3\u0027s) brownfield development project, based on the AddressBook-Level3 project created by the [SE-EDU initiative](https://se-education.org).","lastModifiedDate":"2024-03-04"},{"lineNumber":34,"author":{"gitId":"-"},"content":" * The project simulates an ongoing software project for a desktop application (called _AddressBook_) used for managing contact details.","lastModifiedDate":"2020-05-23"},{"lineNumber":35,"author":{"gitId":"-"},"content":" * 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.","lastModifiedDate":"2020-05-23"},{"lineNumber":36,"author":{"gitId":"-"},"content":" * It comes with a **reasonable level of user and developer documentation**.","lastModifiedDate":"2020-05-23"},{"lineNumber":37,"author":{"gitId":"-"},"content":"* For the detailed documentation of this project, see the **[Address Book Product Website](https://se-education.org/addressbook-level3)**.","lastModifiedDate":"2020-05-23"},{"lineNumber":38,"author":{"gitId":"-"},"content":"* 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.","lastModifiedDate":"2020-05-23"},{"lineNumber":39,"author":{"gitId":"wallacexuhanxiao"},"content":"","lastModifiedDate":"2024-02-24"}],"authorContributionMap":{"ongzhili":29,"wallacexuhanxiao":1,"-":9}},{"path":"docs/AboutUs.md","fileType":"docs","lines":[{"lineNumber":1,"author":{"gitId":"-"},"content":"---","lastModifiedDate":"2020-05-23"},{"lineNumber":2,"author":{"gitId":"-"},"content":"layout: page","lastModifiedDate":"2020-05-23"},{"lineNumber":3,"author":{"gitId":"-"},"content":"title: About Us","lastModifiedDate":"2020-05-23"},{"lineNumber":4,"author":{"gitId":"-"},"content":"---","lastModifiedDate":"2020-05-23"},{"lineNumber":5,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":6,"author":{"gitId":"-"},"content":"We are a team based in the [School of Computing, National University of Singapore](http://www.comp.nus.edu.sg).","lastModifiedDate":"2020-05-23"},{"lineNumber":7,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":8,"author":{"gitId":"wallacexuhanxiao"},"content":"You can reach us at the email `xxxxxx@u.nus.edu`","lastModifiedDate":"2024-03-07"},{"lineNumber":9,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-06-17"},{"lineNumber":10,"author":{"gitId":"-"},"content":"## Project team","lastModifiedDate":"2020-06-07"},{"lineNumber":11,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":12,"author":{"gitId":"-"},"content":"### John Doe","lastModifiedDate":"2020-05-23"},{"lineNumber":13,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":14,"author":{"gitId":"-"},"content":"\u003cimg src\u003d\"images/johndoe.png\" width\u003d\"200px\"\u003e","lastModifiedDate":"2020-06-17"},{"lineNumber":15,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":16,"author":{"gitId":"-"},"content":"[[homepage](http://www.comp.nus.edu.sg/~damithch)]","lastModifiedDate":"2020-05-23"},{"lineNumber":17,"author":{"gitId":"-"},"content":"[[github](https://github.com/johndoe)]","lastModifiedDate":"2020-06-17"},{"lineNumber":18,"author":{"gitId":"-"},"content":"[[portfolio](team/johndoe.md)]","lastModifiedDate":"2020-05-23"},{"lineNumber":19,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":20,"author":{"gitId":"-"},"content":"* Role: Project Advisor","lastModifiedDate":"2020-05-23"},{"lineNumber":21,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":22,"author":{"gitId":"J-wang-CSMA"},"content":"### Jeremy Wang","lastModifiedDate":"2024-02-28"},{"lineNumber":23,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":24,"author":{"gitId":"J-wang-CSMA"},"content":"\u003cimg src\u003d\"images/j-wang-csma.png\" width\u003d\"200px\"\u003e","lastModifiedDate":"2024-02-28"},{"lineNumber":25,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":26,"author":{"gitId":"J-wang-CSMA"},"content":"[[github](http://github.com/J-wang-CSMA)]","lastModifiedDate":"2024-02-28"},{"lineNumber":27,"author":{"gitId":"J-wang-CSMA"},"content":"[[portfolio](team/j-wang-csma.md)]","lastModifiedDate":"2024-02-28"},{"lineNumber":28,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":29,"author":{"gitId":"J-wang-CSMA"},"content":"* Role: Developer, Deliverables and deadlines","lastModifiedDate":"2024-02-28"},{"lineNumber":30,"author":{"gitId":"J-wang-CSMA"},"content":"* Responsibilities: Data + UI","lastModifiedDate":"2024-02-28"},{"lineNumber":31,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":32,"author":{"gitId":"wallacexuhanxiao"},"content":"### XU HANXIAO","lastModifiedDate":"2024-02-28"},{"lineNumber":33,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":34,"author":{"gitId":"wallacexuhanxiao"},"content":"\u003cimg src\u003d\"images/wallacexuhanxiao.png\" width\u003d\"200px\"\u003e","lastModifiedDate":"2024-03-06"},{"lineNumber":35,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":36,"author":{"gitId":"wallacexuhanxiao"},"content":"[[github](https://github.com/wallacexuhanxiao] [[portfolio](team/wallacexuhanxiao.md)]","lastModifiedDate":"2024-03-07"},{"lineNumber":37,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":38,"author":{"gitId":"-"},"content":"* Role: Developer","lastModifiedDate":"2020-05-23"},{"lineNumber":39,"author":{"gitId":"wallacexuhanxiao"},"content":"* Responsibilities: Develop","lastModifiedDate":"2024-02-28"},{"lineNumber":40,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":41,"author":{"gitId":"ongzhili"},"content":"### Ong Zhi Li","lastModifiedDate":"2024-02-28"},{"lineNumber":42,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":43,"author":{"gitId":"ongzhili"},"content":"\u003cimg src\u003d\"images/ongzhili.png\" width\u003d\"200px\"\u003e","lastModifiedDate":"2024-03-07"},{"lineNumber":44,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":45,"author":{"gitId":"ongzhili"},"content":"[[github](http://github.com/ongzhili)]","lastModifiedDate":"2024-02-28"},{"lineNumber":46,"author":{"gitId":"ongzhili"},"content":"[[portfolio](team/ongzhili.md)]","lastModifiedDate":"2024-02-28"},{"lineNumber":47,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":48,"author":{"gitId":"-"},"content":"* Role: Developer","lastModifiedDate":"2020-05-23"},{"lineNumber":49,"author":{"gitId":"ongzhili"},"content":"* Responsibilities: UI + Logic handling","lastModifiedDate":"2024-02-28"},{"lineNumber":50,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":51,"author":{"gitId":"IamZhenHong"},"content":"### Seng Zhen Hong","lastModifiedDate":"2024-03-07"},{"lineNumber":52,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2024-03-07"},{"lineNumber":53,"author":{"gitId":"IamZhenHong"},"content":"\u003cimg src\u003d\"images/iamzhenhong.png\" width\u003d\"200px\"\u003e","lastModifiedDate":"2024-03-07"},{"lineNumber":54,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2024-03-07"},{"lineNumber":55,"author":{"gitId":"IamZhenHong"},"content":"[[github](http://github.com/IamZhenHong)]","lastModifiedDate":"2024-03-07"},{"lineNumber":56,"author":{"gitId":"IamZhenHong"},"content":"[[portfolio](team/iamzhenhong.md)]","lastModifiedDate":"2024-03-07"},{"lineNumber":57,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2024-03-07"}],"authorContributionMap":{"IamZhenHong":4,"wallacexuhanxiao":5,"ongzhili":5,"-":37,"J-wang-CSMA":6}},{"path":"docs/DeveloperGuide.md","fileType":"docs","lines":[{"lineNumber":1,"author":{"gitId":"-"},"content":"---","lastModifiedDate":"2020-05-23"},{"lineNumber":2,"author":{"gitId":"-"},"content":"layout: page","lastModifiedDate":"2020-05-23"},{"lineNumber":3,"author":{"gitId":"-"},"content":"title: Developer Guide","lastModifiedDate":"2020-05-23"},{"lineNumber":4,"author":{"gitId":"-"},"content":"---","lastModifiedDate":"2020-05-23"},{"lineNumber":5,"author":{"gitId":"-"},"content":"* Table of Contents","lastModifiedDate":"2020-05-23"},{"lineNumber":6,"author":{"gitId":"-"},"content":"{:toc}","lastModifiedDate":"2020-05-23"},{"lineNumber":7,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":8,"author":{"gitId":"-"},"content":"--------------------------------------------------------------------------------------------------------------------","lastModifiedDate":"2020-05-23"},{"lineNumber":9,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2021-07-30"},{"lineNumber":10,"author":{"gitId":"-"},"content":"## **Acknowledgements**","lastModifiedDate":"2021-07-30"},{"lineNumber":11,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2021-07-30"},{"lineNumber":12,"author":{"gitId":"wallacexuhanxiao"},"content":"* This project is based on the AddressBook-Level3 project created by the [SE-EDU initiative](https://se-education.org).","lastModifiedDate":"2024-02-28"},{"lineNumber":13,"author":{"gitId":"-"},"content":"--------------------------------------------------------------------------------------------------------------------","lastModifiedDate":"2021-07-30"},{"lineNumber":14,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":15,"author":{"gitId":"-"},"content":"## **Setting up, getting started**","lastModifiedDate":"2020-05-23"},{"lineNumber":16,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":17,"author":{"gitId":"-"},"content":"Refer to the guide [_Setting up and getting started_](SettingUp.md).","lastModifiedDate":"2020-05-23"},{"lineNumber":18,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":19,"author":{"gitId":"-"},"content":"--------------------------------------------------------------------------------------------------------------------","lastModifiedDate":"2020-05-23"},{"lineNumber":20,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":21,"author":{"gitId":"-"},"content":"## **Design**","lastModifiedDate":"2020-05-23"},{"lineNumber":22,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":23,"author":{"gitId":"-"},"content":"\u003cdiv markdown\u003d\"span\" class\u003d\"alert alert-primary\"\u003e","lastModifiedDate":"2021-07-31"},{"lineNumber":24,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":25,"author":{"gitId":"-"},"content":":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.","lastModifiedDate":"2023-09-03"},{"lineNumber":26,"author":{"gitId":"-"},"content":"\u003c/div\u003e","lastModifiedDate":"2021-07-31"},{"lineNumber":27,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":28,"author":{"gitId":"-"},"content":"### Architecture","lastModifiedDate":"2021-07-31"},{"lineNumber":29,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":30,"author":{"gitId":"-"},"content":"\u003cimg src\u003d\"images/ArchitectureDiagram.png\" width\u003d\"280\" /\u003e","lastModifiedDate":"2021-07-31"},{"lineNumber":31,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":32,"author":{"gitId":"-"},"content":"The ***Architecture Diagram*** given above explains the high-level design of the App.","lastModifiedDate":"2021-07-31"},{"lineNumber":33,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":34,"author":{"gitId":"-"},"content":"Given below is a quick overview of main components and how they interact with each other.","lastModifiedDate":"2021-07-31"},{"lineNumber":35,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2021-07-31"},{"lineNumber":36,"author":{"gitId":"-"},"content":"**Main components of the architecture**","lastModifiedDate":"2021-07-31"},{"lineNumber":37,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":38,"author":{"gitId":"-"},"content":"**`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.","lastModifiedDate":"2023-09-03"},{"lineNumber":39,"author":{"gitId":"-"},"content":"* At app launch, it initializes the other components in the correct sequence, and connects them up with each other.","lastModifiedDate":"2023-09-03"},{"lineNumber":40,"author":{"gitId":"-"},"content":"* At shut down, it shuts down the other components and invokes cleanup methods where necessary.","lastModifiedDate":"2023-09-03"},{"lineNumber":41,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":42,"author":{"gitId":"-"},"content":"The bulk of the app\u0027s work is done by the following four components:","lastModifiedDate":"2023-09-03"},{"lineNumber":43,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":44,"author":{"gitId":"-"},"content":"* [**`UI`**](#ui-component): The UI of the App.","lastModifiedDate":"2020-05-23"},{"lineNumber":45,"author":{"gitId":"-"},"content":"* [**`Logic`**](#logic-component): The command executor.","lastModifiedDate":"2020-05-23"},{"lineNumber":46,"author":{"gitId":"-"},"content":"* [**`Model`**](#model-component): Holds the data of the App in memory.","lastModifiedDate":"2020-05-23"},{"lineNumber":47,"author":{"gitId":"-"},"content":"* [**`Storage`**](#storage-component): Reads data from, and writes data to, the hard disk.","lastModifiedDate":"2020-05-23"},{"lineNumber":48,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":49,"author":{"gitId":"-"},"content":"[**`Commons`**](#common-classes) represents a collection of classes used by multiple other components.","lastModifiedDate":"2023-09-03"},{"lineNumber":50,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":51,"author":{"gitId":"-"},"content":"**How the architecture components interact with each other**","lastModifiedDate":"2020-05-23"},{"lineNumber":52,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":53,"author":{"gitId":"-"},"content":"The *Sequence Diagram* below shows how the components interact with each other for the scenario where the user issues the command `delete 1`.","lastModifiedDate":"2020-05-23"},{"lineNumber":54,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":55,"author":{"gitId":"-"},"content":"\u003cimg src\u003d\"images/ArchitectureSequenceDiagram.png\" width\u003d\"574\" /\u003e","lastModifiedDate":"2020-06-07"},{"lineNumber":56,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":57,"author":{"gitId":"-"},"content":"Each of the four main components (also shown in the diagram above),","lastModifiedDate":"2021-07-31"},{"lineNumber":58,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2021-07-31"},{"lineNumber":59,"author":{"gitId":"-"},"content":"* defines its *API* in an `interface` with the same name as the Component.","lastModifiedDate":"2021-07-31"},{"lineNumber":60,"author":{"gitId":"-"},"content":"* implements its functionality using a concrete `{Component Name}Manager` class (which follows the corresponding API `interface` mentioned in the previous point.","lastModifiedDate":"2021-07-31"},{"lineNumber":61,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2021-07-31"},{"lineNumber":62,"author":{"gitId":"-"},"content":"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\u0027s being coupled to the implementation of a component), as illustrated in the (partial) class diagram below.","lastModifiedDate":"2021-07-31"},{"lineNumber":63,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2021-07-31"},{"lineNumber":64,"author":{"gitId":"-"},"content":"\u003cimg src\u003d\"images/ComponentManagers.png\" width\u003d\"300\" /\u003e","lastModifiedDate":"2021-07-31"},{"lineNumber":65,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2021-07-31"},{"lineNumber":66,"author":{"gitId":"-"},"content":"The sections below give more details of each component.","lastModifiedDate":"2020-05-23"},{"lineNumber":67,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":68,"author":{"gitId":"-"},"content":"### UI component","lastModifiedDate":"2020-05-23"},{"lineNumber":69,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":70,"author":{"gitId":"-"},"content":"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)","lastModifiedDate":"2021-07-31"},{"lineNumber":71,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":72,"author":{"gitId":"-"},"content":"![Structure of the UI Component](images/UiClassDiagram.png)","lastModifiedDate":"2021-07-31"},{"lineNumber":73,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":74,"author":{"gitId":"-"},"content":"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.","lastModifiedDate":"2021-07-31"},{"lineNumber":75,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":76,"author":{"gitId":"-"},"content":"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)","lastModifiedDate":"2021-07-31"},{"lineNumber":77,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":78,"author":{"gitId":"-"},"content":"The `UI` component,","lastModifiedDate":"2020-05-23"},{"lineNumber":79,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":80,"author":{"gitId":"-"},"content":"* executes user commands using the `Logic` component.","lastModifiedDate":"2021-07-31"},{"lineNumber":81,"author":{"gitId":"-"},"content":"* listens for changes to `Model` data so that the UI can be updated with the modified data.","lastModifiedDate":"2021-07-31"},{"lineNumber":82,"author":{"gitId":"-"},"content":"* keeps a reference to the `Logic` component, because the `UI` relies on the `Logic` to execute commands.","lastModifiedDate":"2021-07-31"},{"lineNumber":83,"author":{"gitId":"-"},"content":"* depends on some classes in the `Model` component, as it displays `Person` object residing in the `Model`.","lastModifiedDate":"2021-07-31"},{"lineNumber":84,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":85,"author":{"gitId":"-"},"content":"### Logic component","lastModifiedDate":"2020-05-23"},{"lineNumber":86,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":87,"author":{"gitId":"-"},"content":"**API** : [`Logic.java`](https://github.com/se-edu/addressbook-level3/tree/master/src/main/java/seedu/address/logic/Logic.java)","lastModifiedDate":"2021-07-31"},{"lineNumber":88,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":89,"author":{"gitId":"-"},"content":"Here\u0027s a (partial) class diagram of the `Logic` component:","lastModifiedDate":"2021-07-31"},{"lineNumber":90,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":91,"author":{"gitId":"-"},"content":"\u003cimg src\u003d\"images/LogicClassDiagram.png\" width\u003d\"550\"/\u003e","lastModifiedDate":"2021-07-31"},{"lineNumber":92,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":93,"author":{"gitId":"-"},"content":"The sequence diagram below illustrates the interactions within the `Logic` component, taking `execute(\"delete 1\")` API call as an example.","lastModifiedDate":"2023-09-03"},{"lineNumber":94,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":95,"author":{"gitId":"-"},"content":"![Interactions Inside the Logic Component for the `delete 1` Command](images/DeleteSequenceDiagram.png)","lastModifiedDate":"2020-05-23"},{"lineNumber":96,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":97,"author":{"gitId":"-"},"content":"\u003cdiv markdown\u003d\"span\" class\u003d\"alert alert-info\"\u003e:information_source: **Note:** The lifeline for `DeleteCommandParser` should end at the destroy marker (X) but due to a limitation of PlantUML, the lifeline continues till the end of diagram.","lastModifiedDate":"2024-02-09"},{"lineNumber":98,"author":{"gitId":"-"},"content":"\u003c/div\u003e","lastModifiedDate":"2020-05-23"},{"lineNumber":99,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":100,"author":{"gitId":"-"},"content":"How the `Logic` component works:","lastModifiedDate":"2023-09-03"},{"lineNumber":101,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2023-09-03"},{"lineNumber":102,"author":{"gitId":"-"},"content":"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.","lastModifiedDate":"2023-09-03"},{"lineNumber":103,"author":{"gitId":"-"},"content":"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`.","lastModifiedDate":"2023-09-03"},{"lineNumber":104,"author":{"gitId":"-"},"content":"1. The command can communicate with the `Model` when it is executed (e.g. to delete a person).\u003cbr\u003e","lastModifiedDate":"2024-02-09"},{"lineNumber":105,"author":{"gitId":"-"},"content":" Note that although this is shown as a single step in the diagram above (for simplicity), in the code it can take several interactions (between the command object and the `Model`) to achieve.","lastModifiedDate":"2024-02-09"},{"lineNumber":106,"author":{"gitId":"-"},"content":"1. The result of the command execution is encapsulated as a `CommandResult` object which is returned back from `Logic`.","lastModifiedDate":"2023-09-03"},{"lineNumber":107,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2023-09-03"},{"lineNumber":108,"author":{"gitId":"-"},"content":"Here are the other classes in `Logic` (omitted from the class diagram above) that are used for parsing a user command:","lastModifiedDate":"2021-07-31"},{"lineNumber":109,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2021-07-31"},{"lineNumber":110,"author":{"gitId":"-"},"content":"\u003cimg src\u003d\"images/ParserClasses.png\" width\u003d\"600\"/\u003e","lastModifiedDate":"2021-07-31"},{"lineNumber":111,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":112,"author":{"gitId":"-"},"content":"How the parsing works:","lastModifiedDate":"2021-07-31"},{"lineNumber":113,"author":{"gitId":"-"},"content":"* 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.","lastModifiedDate":"2021-07-31"},{"lineNumber":114,"author":{"gitId":"-"},"content":"* 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.","lastModifiedDate":"2021-07-31"},{"lineNumber":115,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":116,"author":{"gitId":"-"},"content":"### Model component","lastModifiedDate":"2021-07-31"},{"lineNumber":117,"author":{"gitId":"-"},"content":"**API** : [`Model.java`](https://github.com/se-edu/addressbook-level3/tree/master/src/main/java/seedu/address/model/Model.java)","lastModifiedDate":"2020-05-23"},{"lineNumber":118,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":119,"author":{"gitId":"-"},"content":"\u003cimg src\u003d\"images/ModelClassDiagram.png\" width\u003d\"450\" /\u003e","lastModifiedDate":"2021-07-31"},{"lineNumber":120,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":121,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":122,"author":{"gitId":"-"},"content":"The `Model` component,","lastModifiedDate":"2021-07-31"},{"lineNumber":123,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":124,"author":{"gitId":"-"},"content":"* stores the address book data i.e., all `Person` objects (which are contained in a `UniquePersonList` object).","lastModifiedDate":"2021-07-31"},{"lineNumber":125,"author":{"gitId":"-"},"content":"* stores the currently \u0027selected\u0027 `Person` objects (e.g., results of a search query) as a separate _filtered_ list which is exposed to outsiders as an unmodifiable `ObservableList\u003cPerson\u003e` that can be \u0027observed\u0027 e.g. the UI can be bound to this list so that the UI automatically updates when the data in the list change.","lastModifiedDate":"2021-07-31"},{"lineNumber":126,"author":{"gitId":"-"},"content":"* stores a `UserPref` object that represents the user’s preferences. This is exposed to the outside as a `ReadOnlyUserPref` objects.","lastModifiedDate":"2021-07-31"},{"lineNumber":127,"author":{"gitId":"-"},"content":"* 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)","lastModifiedDate":"2021-07-31"},{"lineNumber":128,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2021-07-31"},{"lineNumber":129,"author":{"gitId":"-"},"content":"\u003cdiv markdown\u003d\"span\" class\u003d\"alert alert-info\"\u003e: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.\u003cbr\u003e","lastModifiedDate":"2021-07-31"},{"lineNumber":130,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2021-07-31"},{"lineNumber":131,"author":{"gitId":"-"},"content":"\u003cimg src\u003d\"images/BetterModelClassDiagram.png\" width\u003d\"450\" /\u003e","lastModifiedDate":"2021-07-31"},{"lineNumber":132,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":133,"author":{"gitId":"-"},"content":"\u003c/div\u003e","lastModifiedDate":"2020-05-23"},{"lineNumber":134,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":135,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":136,"author":{"gitId":"-"},"content":"### Storage component","lastModifiedDate":"2020-05-23"},{"lineNumber":137,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":138,"author":{"gitId":"-"},"content":"**API** : [`Storage.java`](https://github.com/se-edu/addressbook-level3/tree/master/src/main/java/seedu/address/storage/Storage.java)","lastModifiedDate":"2020-05-23"},{"lineNumber":139,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":140,"author":{"gitId":"-"},"content":"\u003cimg src\u003d\"images/StorageClassDiagram.png\" width\u003d\"550\" /\u003e","lastModifiedDate":"2021-07-31"},{"lineNumber":141,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2021-07-31"},{"lineNumber":142,"author":{"gitId":"-"},"content":"The `Storage` component,","lastModifiedDate":"2020-05-23"},{"lineNumber":143,"author":{"gitId":"-"},"content":"* can save both address book data and user preference data in JSON format, and read them back into corresponding objects.","lastModifiedDate":"2023-09-03"},{"lineNumber":144,"author":{"gitId":"-"},"content":"* inherits from both `AddressBookStorage` and `UserPrefStorage`, which means it can be treated as either one (if only the functionality of only one is needed).","lastModifiedDate":"2021-07-31"},{"lineNumber":145,"author":{"gitId":"-"},"content":"* depends on some classes in the `Model` component (because the `Storage` component\u0027s job is to save/retrieve objects that belong to the `Model`)","lastModifiedDate":"2021-07-21"},{"lineNumber":146,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":147,"author":{"gitId":"-"},"content":"### Common classes","lastModifiedDate":"2020-05-23"},{"lineNumber":148,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":149,"author":{"gitId":"-"},"content":"Classes used by multiple components are in the `seedu.addressbook.commons` package.","lastModifiedDate":"2020-05-23"},{"lineNumber":150,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":151,"author":{"gitId":"-"},"content":"--------------------------------------------------------------------------------------------------------------------","lastModifiedDate":"2020-05-23"},{"lineNumber":152,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":153,"author":{"gitId":"-"},"content":"## **Implementation**","lastModifiedDate":"2020-05-23"},{"lineNumber":154,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":155,"author":{"gitId":"-"},"content":"This section describes some noteworthy details on how certain features are implemented.","lastModifiedDate":"2020-05-23"},{"lineNumber":156,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":157,"author":{"gitId":"-"},"content":"### \\[Proposed\\] Undo/redo feature","lastModifiedDate":"2020-06-07"},{"lineNumber":158,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":159,"author":{"gitId":"-"},"content":"#### Proposed Implementation","lastModifiedDate":"2020-05-23"},{"lineNumber":160,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":161,"author":{"gitId":"-"},"content":"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:","lastModifiedDate":"2020-05-23"},{"lineNumber":162,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":163,"author":{"gitId":"-"},"content":"* `VersionedAddressBook#commit()` — Saves the current address book state in its history.","lastModifiedDate":"2020-05-23"},{"lineNumber":164,"author":{"gitId":"-"},"content":"* `VersionedAddressBook#undo()` — Restores the previous address book state from its history.","lastModifiedDate":"2020-05-23"},{"lineNumber":165,"author":{"gitId":"-"},"content":"* `VersionedAddressBook#redo()` — Restores a previously undone address book state from its history.","lastModifiedDate":"2020-05-23"},{"lineNumber":166,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":167,"author":{"gitId":"-"},"content":"These operations are exposed in the `Model` interface as `Model#commitAddressBook()`, `Model#undoAddressBook()` and `Model#redoAddressBook()` respectively.","lastModifiedDate":"2020-05-23"},{"lineNumber":168,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":169,"author":{"gitId":"-"},"content":"Given below is an example usage scenario and how the undo/redo mechanism behaves at each step.","lastModifiedDate":"2020-05-23"},{"lineNumber":170,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":171,"author":{"gitId":"-"},"content":"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.","lastModifiedDate":"2020-05-23"},{"lineNumber":172,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":173,"author":{"gitId":"-"},"content":"![UndoRedoState0](images/UndoRedoState0.png)","lastModifiedDate":"2020-05-23"},{"lineNumber":174,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":175,"author":{"gitId":"-"},"content":"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.","lastModifiedDate":"2020-05-23"},{"lineNumber":176,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":177,"author":{"gitId":"-"},"content":"![UndoRedoState1](images/UndoRedoState1.png)","lastModifiedDate":"2020-05-23"},{"lineNumber":178,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":179,"author":{"gitId":"-"},"content":"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`.","lastModifiedDate":"2020-05-23"},{"lineNumber":180,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":181,"author":{"gitId":"-"},"content":"![UndoRedoState2](images/UndoRedoState2.png)","lastModifiedDate":"2020-05-23"},{"lineNumber":182,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":183,"author":{"gitId":"-"},"content":"\u003cdiv markdown\u003d\"span\" class\u003d\"alert alert-info\"\u003e: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`.","lastModifiedDate":"2020-05-23"},{"lineNumber":184,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":185,"author":{"gitId":"-"},"content":"\u003c/div\u003e","lastModifiedDate":"2020-05-23"},{"lineNumber":186,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":187,"author":{"gitId":"-"},"content":"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.","lastModifiedDate":"2020-05-23"},{"lineNumber":188,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":189,"author":{"gitId":"-"},"content":"![UndoRedoState3](images/UndoRedoState3.png)","lastModifiedDate":"2020-05-23"},{"lineNumber":190,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":191,"author":{"gitId":"-"},"content":"\u003cdiv markdown\u003d\"span\" class\u003d\"alert alert-info\"\u003e: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","lastModifiedDate":"2020-05-23"},{"lineNumber":192,"author":{"gitId":"-"},"content":"than attempting to perform the undo.","lastModifiedDate":"2020-05-23"},{"lineNumber":193,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":194,"author":{"gitId":"-"},"content":"\u003c/div\u003e","lastModifiedDate":"2020-05-23"},{"lineNumber":195,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":196,"author":{"gitId":"-"},"content":"The following sequence diagram shows how an undo operation goes through the `Logic` component:","lastModifiedDate":"2024-02-09"},{"lineNumber":197,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":198,"author":{"gitId":"-"},"content":"![UndoSequenceDiagram](images/UndoSequenceDiagram-Logic.png)","lastModifiedDate":"2024-02-09"},{"lineNumber":199,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":200,"author":{"gitId":"-"},"content":"\u003cdiv markdown\u003d\"span\" class\u003d\"alert alert-info\"\u003e: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.","lastModifiedDate":"2020-05-23"},{"lineNumber":201,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":202,"author":{"gitId":"-"},"content":"\u003c/div\u003e","lastModifiedDate":"2020-05-23"},{"lineNumber":203,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":204,"author":{"gitId":"-"},"content":"Similarly, how an undo operation goes through the `Model` component is shown below:","lastModifiedDate":"2024-02-09"},{"lineNumber":205,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2024-02-09"},{"lineNumber":206,"author":{"gitId":"-"},"content":"![UndoSequenceDiagram](images/UndoSequenceDiagram-Model.png)","lastModifiedDate":"2024-02-09"},{"lineNumber":207,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2024-02-09"},{"lineNumber":208,"author":{"gitId":"-"},"content":"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.","lastModifiedDate":"2020-05-23"},{"lineNumber":209,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":210,"author":{"gitId":"-"},"content":"\u003cdiv markdown\u003d\"span\" class\u003d\"alert alert-info\"\u003e: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.","lastModifiedDate":"2020-05-23"},{"lineNumber":211,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":212,"author":{"gitId":"-"},"content":"\u003c/div\u003e","lastModifiedDate":"2020-05-23"},{"lineNumber":213,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":214,"author":{"gitId":"-"},"content":"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.","lastModifiedDate":"2020-05-23"},{"lineNumber":215,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":216,"author":{"gitId":"-"},"content":"![UndoRedoState4](images/UndoRedoState4.png)","lastModifiedDate":"2020-05-23"},{"lineNumber":217,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":218,"author":{"gitId":"-"},"content":"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.","lastModifiedDate":"2020-05-23"},{"lineNumber":219,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":220,"author":{"gitId":"-"},"content":"![UndoRedoState5](images/UndoRedoState5.png)","lastModifiedDate":"2020-05-23"},{"lineNumber":221,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":222,"author":{"gitId":"-"},"content":"The following activity diagram summarizes what happens when a user executes a new command:","lastModifiedDate":"2020-05-23"},{"lineNumber":223,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":224,"author":{"gitId":"-"},"content":"\u003cimg src\u003d\"images/CommitActivityDiagram.png\" width\u003d\"250\" /\u003e","lastModifiedDate":"2021-07-31"},{"lineNumber":225,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":226,"author":{"gitId":"-"},"content":"#### Design considerations:","lastModifiedDate":"2021-07-31"},{"lineNumber":227,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":228,"author":{"gitId":"-"},"content":"**Aspect: How undo \u0026 redo executes:**","lastModifiedDate":"2021-07-31"},{"lineNumber":229,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":230,"author":{"gitId":"-"},"content":"* **Alternative 1 (current choice):** Saves the entire address book.","lastModifiedDate":"2020-05-23"},{"lineNumber":231,"author":{"gitId":"-"},"content":" * Pros: Easy to implement.","lastModifiedDate":"2020-05-23"},{"lineNumber":232,"author":{"gitId":"-"},"content":" * Cons: May have performance issues in terms of memory usage.","lastModifiedDate":"2020-05-23"},{"lineNumber":233,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":234,"author":{"gitId":"-"},"content":"* **Alternative 2:** Individual command knows how to undo/redo by","lastModifiedDate":"2020-05-23"},{"lineNumber":235,"author":{"gitId":"-"},"content":" itself.","lastModifiedDate":"2020-05-23"},{"lineNumber":236,"author":{"gitId":"-"},"content":" * Pros: Will use less memory (e.g. for `delete`, just save the person being deleted).","lastModifiedDate":"2020-05-23"},{"lineNumber":237,"author":{"gitId":"-"},"content":" * Cons: We must ensure that the implementation of each individual command are correct.","lastModifiedDate":"2020-05-23"},{"lineNumber":238,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":239,"author":{"gitId":"-"},"content":"_{more aspects and alternatives to be added}_","lastModifiedDate":"2020-05-23"},{"lineNumber":240,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":241,"author":{"gitId":"-"},"content":"### \\[Proposed\\] Data archiving","lastModifiedDate":"2020-05-23"},{"lineNumber":242,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":243,"author":{"gitId":"-"},"content":"_{Explain here how the data archiving feature will be implemented}_","lastModifiedDate":"2020-05-23"},{"lineNumber":244,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":245,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":246,"author":{"gitId":"-"},"content":"--------------------------------------------------------------------------------------------------------------------","lastModifiedDate":"2020-05-23"},{"lineNumber":247,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":248,"author":{"gitId":"-"},"content":"## **Documentation, logging, testing, configuration, dev-ops**","lastModifiedDate":"2020-06-07"},{"lineNumber":249,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":250,"author":{"gitId":"-"},"content":"* [Documentation guide](Documentation.md)","lastModifiedDate":"2020-06-07"},{"lineNumber":251,"author":{"gitId":"-"},"content":"* [Testing guide](Testing.md)","lastModifiedDate":"2020-06-07"},{"lineNumber":252,"author":{"gitId":"-"},"content":"* [Logging guide](Logging.md)","lastModifiedDate":"2020-06-07"},{"lineNumber":253,"author":{"gitId":"-"},"content":"* [Configuration guide](Configuration.md)","lastModifiedDate":"2020-06-07"},{"lineNumber":254,"author":{"gitId":"-"},"content":"* [DevOps guide](DevOps.md)","lastModifiedDate":"2020-06-07"},{"lineNumber":255,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":256,"author":{"gitId":"-"},"content":"--------------------------------------------------------------------------------------------------------------------","lastModifiedDate":"2020-05-23"},{"lineNumber":257,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":258,"author":{"gitId":"-"},"content":"## **Appendix: Requirements**","lastModifiedDate":"2020-05-23"},{"lineNumber":259,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":260,"author":{"gitId":"-"},"content":"### Product scope","lastModifiedDate":"2020-05-23"},{"lineNumber":261,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":262,"author":{"gitId":"-"},"content":"**Target user profile**:","lastModifiedDate":"2020-05-23"},{"lineNumber":263,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":264,"author":{"gitId":"wallacexuhanxiao"},"content":"* is an educator working with the education of primary / secondary students ","lastModifiedDate":"2024-02-28"},{"lineNumber":265,"author":{"gitId":"wallacexuhanxiao"},"content":"* require fast and organized access to students\u0027 and parents\u0027 contact detail ","lastModifiedDate":"2024-02-28"},{"lineNumber":266,"author":{"gitId":"wallacexuhanxiao"},"content":"* have many students\u0027 information to manage ","lastModifiedDate":"2024-02-28"},{"lineNumber":267,"author":{"gitId":"-"},"content":"* prefer desktop apps over other types","lastModifiedDate":"2020-05-23"},{"lineNumber":268,"author":{"gitId":"-"},"content":"* can type fast","lastModifiedDate":"2020-05-23"},{"lineNumber":269,"author":{"gitId":"-"},"content":"* prefers typing to mouse interactions","lastModifiedDate":"2020-05-26"},{"lineNumber":270,"author":{"gitId":"-"},"content":"* is reasonably comfortable using CLI apps","lastModifiedDate":"2020-05-23"},{"lineNumber":271,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":272,"author":{"gitId":"wallacexuhanxiao"},"content":"**Value proposition**: Provide fast and organized access to students’ and parents’ contact details for the educator across multiple classes with large class sizes.","lastModifiedDate":"2024-02-28"},{"lineNumber":273,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":274,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":275,"author":{"gitId":"-"},"content":"### User stories","lastModifiedDate":"2020-06-07"},{"lineNumber":276,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":277,"author":{"gitId":"-"},"content":"Priorities: High (must have) - `* * *`, Medium (nice to have) - `* *`, Low (unlikely to have) - `*`","lastModifiedDate":"2020-05-23"},{"lineNumber":278,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":279,"author":{"gitId":"-"},"content":"| Priority | As a …​ | I want to …​ | So that I can…​ |","lastModifiedDate":"2020-05-23"},{"lineNumber":280,"author":{"gitId":"-"},"content":"| -------- | ------------------------------------------ | ------------------------------ | ---------------------------------------------------------------------- |","lastModifiedDate":"2020-05-23"},{"lineNumber":281,"author":{"gitId":"-"},"content":"| `* * *` | new user | see usage instructions | refer to instructions when I forget how to use the App |","lastModifiedDate":"2020-05-23"},{"lineNumber":282,"author":{"gitId":"wallacexuhanxiao"},"content":"| `* * *` | teacher | view student and his/her parents’ contact records fully | contact them when needed. |","lastModifiedDate":"2024-02-28"},{"lineNumber":283,"author":{"gitId":"wallacexuhanxiao"},"content":"|`* * *` | teacher | easily update students’ contact records via their ID |track students’ latest contact information|","lastModifiedDate":"2024-02-28"},{"lineNumber":284,"author":{"gitId":"wallacexuhanxiao"},"content":"| `* * *` | teacher | delete student contact records | remove unnecessary data when a student graduates / drops out |","lastModifiedDate":"2024-02-28"},{"lineNumber":285,"author":{"gitId":"wallacexuhanxiao"},"content":"| `* * *` | teacher | easily identify duplicate entries | make sure there is no repetition of student records|","lastModifiedDate":"2024-02-28"},{"lineNumber":286,"author":{"gitId":"wallacexuhanxiao"},"content":"| `* *` | teacher | tag my students | find them easily|","lastModifiedDate":"2024-02-28"},{"lineNumber":287,"author":{"gitId":"wallacexuhanxiao"},"content":"| `* *` | administrator | delete all student info in one go| delete the whole class in one command after each semester|","lastModifiedDate":"2024-02-28"},{"lineNumber":288,"author":{"gitId":"wallacexuhanxiao"},"content":"| `* *` | expert teacher user | search for students by tags | view each class/CCA/tutoring group I am in charge of at a glance |","lastModifiedDate":"2024-02-28"},{"lineNumber":289,"author":{"gitId":"wallacexuhanxiao"},"content":"| `* *` | teacher | search for students by name | find specific student\u0027s information by their name |","lastModifiedDate":"2024-02-28"},{"lineNumber":290,"author":{"gitId":"wallacexuhanxiao"},"content":"| `* *` | teacher | search for students by id | find specific students by their unique student id |","lastModifiedDate":"2024-02-28"},{"lineNumber":291,"author":{"gitId":"wallacexuhanxiao"},"content":"| `* *` | busy teacher (teaching multiple subjects at once) | obtain class lists per class easily||","lastModifiedDate":"2024-02-28"},{"lineNumber":292,"author":{"gitId":"wallacexuhanxiao"},"content":"| `* *` | teacher | view my class roster at a glance| |","lastModifiedDate":"2024-02-28"},{"lineNumber":293,"author":{"gitId":"wallacexuhanxiao"},"content":"| `* *` | careful teacher | back up my students’ information| avoid losing any student\u0027s information|","lastModifiedDate":"2024-02-28"},{"lineNumber":294,"author":{"gitId":"wallacexuhanxiao"},"content":"| `* *` | school staff member |export contact lists for emergency purposes| ensure student safety in case of emergencies |","lastModifiedDate":"2024-02-28"},{"lineNumber":295,"author":{"gitId":"wallacexuhanxiao"},"content":"| `* *` | careless (but fast typing) teacher | run the command with some minor typo | use the application with greater ease|","lastModifiedDate":"2024-02-28"},{"lineNumber":296,"author":{"gitId":"wallacexuhanxiao"},"content":"| `* *`| forgetful teacher | add notes or additional information to each student | remember important details about them |","lastModifiedDate":"2024-02-28"},{"lineNumber":297,"author":{"gitId":"wallacexuhanxiao"},"content":"| `*` | careless teacher | undo my previous command | avoid making mistake like delete the wrong student | ","lastModifiedDate":"2024-02-28"},{"lineNumber":298,"author":{"gitId":"wallacexuhanxiao"},"content":"| `* ` | teacher | mark students’ attendance for each class session| |","lastModifiedDate":"2024-02-28"},{"lineNumber":299,"author":{"gitId":"wallacexuhanxiao"},"content":"| `* ` | teacher | set reminders for events such as parent-teacher/student-teacher meetings| I don\u0027t miss any important appointments|","lastModifiedDate":"2024-02-28"},{"lineNumber":300,"author":{"gitId":"wallacexuhanxiao"},"content":"| `*` | teacher | utilize the application to understand the geographic distribution of my students | planning school trips or outreach programs |","lastModifiedDate":"2024-02-28"},{"lineNumber":301,"author":{"gitId":"wallacexuhanxiao"},"content":"","lastModifiedDate":"2024-02-28"},{"lineNumber":302,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":303,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":304,"author":{"gitId":"-"},"content":"### Use cases","lastModifiedDate":"2020-06-07"},{"lineNumber":305,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":306,"author":{"gitId":"wallacexuhanxiao"},"content":"(For all use cases below, the **System** is the `PedagoguePages` and the **Actor** is the `teacher`, unless specified otherwise)","lastModifiedDate":"2024-02-28"},{"lineNumber":307,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":308,"author":{"gitId":"wallacexuhanxiao"},"content":"**Use case: View the usage help list**","lastModifiedDate":"2024-02-28"},{"lineNumber":309,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":310,"author":{"gitId":"-"},"content":"**MSS**","lastModifiedDate":"2020-05-23"},{"lineNumber":311,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":312,"author":{"gitId":"wallacexuhanxiao"},"content":"1. Teacher requests to view the user guide of PedagoguePages","lastModifiedDate":"2024-02-28"},{"lineNumber":313,"author":{"gitId":"wallacexuhanxiao"},"content":"2. PedagoguePages shows the user guide to teacher","lastModifiedDate":"2024-02-28"},{"lineNumber":314,"author":{"gitId":"wallacexuhanxiao"},"content":"","lastModifiedDate":"2024-02-28"},{"lineNumber":315,"author":{"gitId":"wallacexuhanxiao"},"content":" Use case ends.","lastModifiedDate":"2024-02-28"},{"lineNumber":316,"author":{"gitId":"wallacexuhanxiao"},"content":"","lastModifiedDate":"2024-02-28"},{"lineNumber":317,"author":{"gitId":"wallacexuhanxiao"},"content":"","lastModifiedDate":"2024-02-28"},{"lineNumber":318,"author":{"gitId":"wallacexuhanxiao"},"content":"**Use case: View the student list**","lastModifiedDate":"2024-02-28"},{"lineNumber":319,"author":{"gitId":"wallacexuhanxiao"},"content":"","lastModifiedDate":"2024-02-28"},{"lineNumber":320,"author":{"gitId":"wallacexuhanxiao"},"content":"**MSS**","lastModifiedDate":"2024-02-28"},{"lineNumber":321,"author":{"gitId":"wallacexuhanxiao"},"content":"","lastModifiedDate":"2024-02-28"},{"lineNumber":322,"author":{"gitId":"wallacexuhanxiao"},"content":"1. Teacher requests to view all the info in PedagoguePages","lastModifiedDate":"2024-02-28"},{"lineNumber":323,"author":{"gitId":"wallacexuhanxiao"},"content":"2. PedagoguePages shows a list of students\u0027 info","lastModifiedDate":"2024-02-28"},{"lineNumber":324,"author":{"gitId":"wallacexuhanxiao"},"content":"","lastModifiedDate":"2024-02-28"},{"lineNumber":325,"author":{"gitId":"wallacexuhanxiao"},"content":" Use case ends.","lastModifiedDate":"2024-02-28"},{"lineNumber":326,"author":{"gitId":"wallacexuhanxiao"},"content":"","lastModifiedDate":"2024-02-28"},{"lineNumber":327,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2024-02-28"},{"lineNumber":328,"author":{"gitId":"wallacexuhanxiao"},"content":"**Use case: Delete a student**","lastModifiedDate":"2024-02-28"},{"lineNumber":329,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2024-02-28"},{"lineNumber":330,"author":{"gitId":"-"},"content":"**MSS**","lastModifiedDate":"2024-02-28"},{"lineNumber":331,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2024-02-28"},{"lineNumber":332,"author":{"gitId":"wallacexuhanxiao"},"content":"1. Teacher requests to find a student by his name","lastModifiedDate":"2024-02-28"},{"lineNumber":333,"author":{"gitId":"wallacexuhanxiao"},"content":"2. PedagoguePages shows a list of matched students","lastModifiedDate":"2024-02-28"},{"lineNumber":334,"author":{"gitId":"wallacexuhanxiao"},"content":"3. Teacher requests to delete a specific person in the list","lastModifiedDate":"2024-02-28"},{"lineNumber":335,"author":{"gitId":"wallacexuhanxiao"},"content":"4. PedagoguePages deletes the person","lastModifiedDate":"2024-02-28"},{"lineNumber":336,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2024-02-28"},{"lineNumber":337,"author":{"gitId":"-"},"content":" Use case ends.","lastModifiedDate":"2024-02-28"},{"lineNumber":338,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2024-02-28"},{"lineNumber":339,"author":{"gitId":"-"},"content":"**Extensions**","lastModifiedDate":"2024-02-28"},{"lineNumber":340,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2024-02-28"},{"lineNumber":341,"author":{"gitId":"-"},"content":"* 2a. The list is empty.","lastModifiedDate":"2024-02-28"},{"lineNumber":342,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2024-02-28"},{"lineNumber":343,"author":{"gitId":"-"},"content":" Use case ends.","lastModifiedDate":"2024-02-28"},{"lineNumber":344,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2024-02-28"},{"lineNumber":345,"author":{"gitId":"wallacexuhanxiao"},"content":"* 3a. The given student_id is invalid.","lastModifiedDate":"2024-02-28"},{"lineNumber":346,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2024-02-28"},{"lineNumber":347,"author":{"gitId":"wallacexuhanxiao"},"content":" * 3a1. PedagoguePages shows an error message.","lastModifiedDate":"2024-02-28"},{"lineNumber":348,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2024-02-28"},{"lineNumber":349,"author":{"gitId":"-"},"content":" Use case resumes at step 2.","lastModifiedDate":"2024-02-28"},{"lineNumber":350,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2024-02-28"},{"lineNumber":351,"author":{"gitId":"wallacexuhanxiao"},"content":"**Use case: Add a student**","lastModifiedDate":"2024-02-28"},{"lineNumber":352,"author":{"gitId":"wallacexuhanxiao"},"content":"","lastModifiedDate":"2024-02-28"},{"lineNumber":353,"author":{"gitId":"wallacexuhanxiao"},"content":"**MSS**","lastModifiedDate":"2024-02-28"},{"lineNumber":354,"author":{"gitId":"wallacexuhanxiao"},"content":"","lastModifiedDate":"2024-02-28"},{"lineNumber":355,"author":{"gitId":"wallacexuhanxiao"},"content":"1. Teacher enter the student info","lastModifiedDate":"2024-02-28"},{"lineNumber":356,"author":{"gitId":"wallacexuhanxiao"},"content":"2. PedagoguePages shows a success message and add the student\u0027s info","lastModifiedDate":"2024-02-28"},{"lineNumber":357,"author":{"gitId":"wallacexuhanxiao"},"content":"","lastModifiedDate":"2024-02-28"},{"lineNumber":358,"author":{"gitId":"wallacexuhanxiao"},"content":" Use case ends.","lastModifiedDate":"2024-02-28"},{"lineNumber":359,"author":{"gitId":"wallacexuhanxiao"},"content":"","lastModifiedDate":"2024-02-28"},{"lineNumber":360,"author":{"gitId":"wallacexuhanxiao"},"content":"**Extensions**","lastModifiedDate":"2024-02-28"},{"lineNumber":361,"author":{"gitId":"wallacexuhanxiao"},"content":"","lastModifiedDate":"2024-02-28"},{"lineNumber":362,"author":{"gitId":"wallacexuhanxiao"},"content":"* 2a. Teacher enter a invalid command.","lastModifiedDate":"2024-02-28"},{"lineNumber":363,"author":{"gitId":"wallacexuhanxiao"},"content":" * 2a1. PedagoguePages shows an error message and give a hint.","lastModifiedDate":"2024-02-28"},{"lineNumber":364,"author":{"gitId":"wallacexuhanxiao"},"content":" ","lastModifiedDate":"2024-02-28"},{"lineNumber":365,"author":{"gitId":"wallacexuhanxiao"},"content":" Use case ends.","lastModifiedDate":"2024-02-28"},{"lineNumber":366,"author":{"gitId":"wallacexuhanxiao"},"content":"","lastModifiedDate":"2024-02-28"},{"lineNumber":367,"author":{"gitId":"wallacexuhanxiao"},"content":"","lastModifiedDate":"2024-02-28"},{"lineNumber":368,"author":{"gitId":"wallacexuhanxiao"},"content":"**Use case: Update the info of a student**","lastModifiedDate":"2024-02-28"},{"lineNumber":369,"author":{"gitId":"wallacexuhanxiao"},"content":"","lastModifiedDate":"2024-02-28"},{"lineNumber":370,"author":{"gitId":"wallacexuhanxiao"},"content":"**MSS**","lastModifiedDate":"2024-02-28"},{"lineNumber":371,"author":{"gitId":"wallacexuhanxiao"},"content":"","lastModifiedDate":"2024-02-28"},{"lineNumber":372,"author":{"gitId":"wallacexuhanxiao"},"content":"1. Teacher requests to find a student by his name","lastModifiedDate":"2024-02-28"},{"lineNumber":373,"author":{"gitId":"wallacexuhanxiao"},"content":"2. PedagoguePages shows a list of matched students","lastModifiedDate":"2024-02-28"},{"lineNumber":374,"author":{"gitId":"wallacexuhanxiao"},"content":"3. Teacher requests to update the info of a specific person in the list","lastModifiedDate":"2024-02-28"},{"lineNumber":375,"author":{"gitId":"wallacexuhanxiao"},"content":"4. PedagoguePages update the info for the student","lastModifiedDate":"2024-02-28"},{"lineNumber":376,"author":{"gitId":"-"},"content":" ","lastModifiedDate":"2020-05-23"},{"lineNumber":377,"author":{"gitId":"-"},"content":" Use case ends.","lastModifiedDate":"2020-05-23"},{"lineNumber":378,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":379,"author":{"gitId":"-"},"content":"**Extensions**","lastModifiedDate":"2020-05-23"},{"lineNumber":380,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":381,"author":{"gitId":"-"},"content":"* 2a. The list is empty.","lastModifiedDate":"2020-05-23"},{"lineNumber":382,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":383,"author":{"gitId":"-"},"content":" Use case ends.","lastModifiedDate":"2020-05-23"},{"lineNumber":384,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":385,"author":{"gitId":"wallacexuhanxiao"},"content":"* 3a. The given student_id is invalid.","lastModifiedDate":"2024-02-28"},{"lineNumber":386,"author":{"gitId":"wallacexuhanxiao"},"content":"","lastModifiedDate":"2024-02-28"},{"lineNumber":387,"author":{"gitId":"wallacexuhanxiao"},"content":" * 3a1. PedagoguePages shows an error message.","lastModifiedDate":"2024-02-28"},{"lineNumber":388,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":389,"author":{"gitId":"wallacexuhanxiao"},"content":" Use case resumes at step 2.","lastModifiedDate":"2024-02-28"},{"lineNumber":390,"author":{"gitId":"wallacexuhanxiao"},"content":" ","lastModifiedDate":"2024-02-28"},{"lineNumber":391,"author":{"gitId":"wallacexuhanxiao"},"content":"* 3b. The updated field is in a wrong format","lastModifiedDate":"2024-02-28"},{"lineNumber":392,"author":{"gitId":"wallacexuhanxiao"},"content":" * 3b1. PedagoguePages shows an error message.","lastModifiedDate":"2024-03-04"},{"lineNumber":393,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":394,"author":{"gitId":"-"},"content":" Use case resumes at step 2.","lastModifiedDate":"2020-05-23"},{"lineNumber":395,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":396,"author":{"gitId":"wallacexuhanxiao"},"content":"**Use case: find a group of a students by tag**","lastModifiedDate":"2024-02-28"},{"lineNumber":397,"author":{"gitId":"wallacexuhanxiao"},"content":"","lastModifiedDate":"2024-02-28"},{"lineNumber":398,"author":{"gitId":"wallacexuhanxiao"},"content":"**MSS**","lastModifiedDate":"2024-02-28"},{"lineNumber":399,"author":{"gitId":"wallacexuhanxiao"},"content":"","lastModifiedDate":"2024-02-28"},{"lineNumber":400,"author":{"gitId":"wallacexuhanxiao"},"content":"1. Teacher requests to find a group of students by specific tag","lastModifiedDate":"2024-02-28"},{"lineNumber":401,"author":{"gitId":"wallacexuhanxiao"},"content":"2. PedagoguePages shows a list of matched students","lastModifiedDate":"2024-02-28"},{"lineNumber":402,"author":{"gitId":"wallacexuhanxiao"},"content":"","lastModifiedDate":"2024-02-28"},{"lineNumber":403,"author":{"gitId":"wallacexuhanxiao"},"content":" Use case ends.","lastModifiedDate":"2024-02-28"},{"lineNumber":404,"author":{"gitId":"wallacexuhanxiao"},"content":"","lastModifiedDate":"2024-02-28"},{"lineNumber":405,"author":{"gitId":"wallacexuhanxiao"},"content":"**Extensions**","lastModifiedDate":"2024-03-04"},{"lineNumber":406,"author":{"gitId":"wallacexuhanxiao"},"content":"","lastModifiedDate":"2024-03-04"},{"lineNumber":407,"author":{"gitId":"wallacexuhanxiao"},"content":"* 2a. The tag is invalid","lastModifiedDate":"2024-03-04"},{"lineNumber":408,"author":{"gitId":"wallacexuhanxiao"},"content":" * 2a1. PedagoguePages shows an error message.","lastModifiedDate":"2024-03-04"},{"lineNumber":409,"author":{"gitId":"wallacexuhanxiao"},"content":"","lastModifiedDate":"2024-03-04"},{"lineNumber":410,"author":{"gitId":"wallacexuhanxiao"},"content":" Use case ends.","lastModifiedDate":"2024-03-04"},{"lineNumber":411,"author":{"gitId":"wallacexuhanxiao"},"content":"","lastModifiedDate":"2024-03-04"},{"lineNumber":412,"author":{"gitId":"wallacexuhanxiao"},"content":"**Use case: find a specific student by name**","lastModifiedDate":"2024-02-28"},{"lineNumber":413,"author":{"gitId":"wallacexuhanxiao"},"content":"","lastModifiedDate":"2024-02-28"},{"lineNumber":414,"author":{"gitId":"wallacexuhanxiao"},"content":"**MSS**","lastModifiedDate":"2024-02-28"},{"lineNumber":415,"author":{"gitId":"wallacexuhanxiao"},"content":"","lastModifiedDate":"2024-02-28"},{"lineNumber":416,"author":{"gitId":"wallacexuhanxiao"},"content":"1. Teacher requests to find a student by student\u0027s name","lastModifiedDate":"2024-02-28"},{"lineNumber":417,"author":{"gitId":"wallacexuhanxiao"},"content":"2. PedagoguePages shows a list of matched students","lastModifiedDate":"2024-02-28"},{"lineNumber":418,"author":{"gitId":"wallacexuhanxiao"},"content":"3. Teacher select the student from the list","lastModifiedDate":"2024-02-28"},{"lineNumber":419,"author":{"gitId":"wallacexuhanxiao"},"content":"","lastModifiedDate":"2024-02-28"},{"lineNumber":420,"author":{"gitId":"wallacexuhanxiao"},"content":" Use case ends.","lastModifiedDate":"2024-02-28"},{"lineNumber":421,"author":{"gitId":"wallacexuhanxiao"},"content":" ","lastModifiedDate":"2024-02-28"},{"lineNumber":422,"author":{"gitId":"wallacexuhanxiao"},"content":"**Extensions**","lastModifiedDate":"2024-02-28"},{"lineNumber":423,"author":{"gitId":"wallacexuhanxiao"},"content":"","lastModifiedDate":"2024-02-28"},{"lineNumber":424,"author":{"gitId":"wallacexuhanxiao"},"content":"* 2a. The list is empty.","lastModifiedDate":"2024-02-28"},{"lineNumber":425,"author":{"gitId":"wallacexuhanxiao"},"content":"","lastModifiedDate":"2024-02-28"},{"lineNumber":426,"author":{"gitId":"wallacexuhanxiao"},"content":" Use case ends.","lastModifiedDate":"2024-02-28"},{"lineNumber":427,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":428,"author":{"gitId":"-"},"content":"### Non-Functional Requirements","lastModifiedDate":"2020-05-23"},{"lineNumber":429,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":430,"author":{"gitId":"-"},"content":"1. Should work on any _mainstream OS_ as long as it has Java `11` or above installed.","lastModifiedDate":"2020-05-23"},{"lineNumber":431,"author":{"gitId":"-"},"content":"2. Should be able to hold up to 1000 persons without a noticeable sluggishness in performance for typical usage.","lastModifiedDate":"2020-05-23"},{"lineNumber":432,"author":{"gitId":"-"},"content":"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.","lastModifiedDate":"2020-05-23"},{"lineNumber":433,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":434,"author":{"gitId":"-"},"content":"*{More to be added}*","lastModifiedDate":"2020-05-23"},{"lineNumber":435,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":436,"author":{"gitId":"-"},"content":"### Glossary","lastModifiedDate":"2020-05-23"},{"lineNumber":437,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":438,"author":{"gitId":"-"},"content":"* **Mainstream OS**: Windows, Linux, Unix, MacOS","lastModifiedDate":"2024-02-09"},{"lineNumber":439,"author":{"gitId":"-"},"content":"* **Private contact detail**: A contact detail that is not meant to be shared with others","lastModifiedDate":"2020-05-23"},{"lineNumber":440,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":441,"author":{"gitId":"-"},"content":"--------------------------------------------------------------------------------------------------------------------","lastModifiedDate":"2020-05-23"},{"lineNumber":442,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":443,"author":{"gitId":"-"},"content":"## **Appendix: Instructions for manual testing**","lastModifiedDate":"2020-05-23"},{"lineNumber":444,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":445,"author":{"gitId":"-"},"content":"Given below are instructions to test the app manually.","lastModifiedDate":"2020-05-23"},{"lineNumber":446,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":447,"author":{"gitId":"-"},"content":"\u003cdiv markdown\u003d\"span\" class\u003d\"alert alert-info\"\u003e:information_source: **Note:** These instructions only provide a starting point for testers to work on;","lastModifiedDate":"2020-05-23"},{"lineNumber":448,"author":{"gitId":"-"},"content":"testers are expected to do more *exploratory* testing.","lastModifiedDate":"2020-05-23"},{"lineNumber":449,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":450,"author":{"gitId":"-"},"content":"\u003c/div\u003e","lastModifiedDate":"2020-05-23"},{"lineNumber":451,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":452,"author":{"gitId":"-"},"content":"### Launch and shutdown","lastModifiedDate":"2020-05-23"},{"lineNumber":453,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":454,"author":{"gitId":"-"},"content":"1. Initial launch","lastModifiedDate":"2020-05-23"},{"lineNumber":455,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":456,"author":{"gitId":"-"},"content":" 1. Download the jar file and copy into an empty folder","lastModifiedDate":"2020-05-23"},{"lineNumber":457,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":458,"author":{"gitId":"-"},"content":" 1. Double-click the jar file Expected: Shows the GUI with a set of sample contacts. The window size may not be optimum.","lastModifiedDate":"2020-05-23"},{"lineNumber":459,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":460,"author":{"gitId":"-"},"content":"1. Saving window preferences","lastModifiedDate":"2020-05-23"},{"lineNumber":461,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":462,"author":{"gitId":"-"},"content":" 1. Resize the window to an optimum size. Move the window to a different location. Close the window.","lastModifiedDate":"2020-05-23"},{"lineNumber":463,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":464,"author":{"gitId":"-"},"content":" 1. Re-launch the app by double-clicking the jar file.\u003cbr\u003e","lastModifiedDate":"2020-05-23"},{"lineNumber":465,"author":{"gitId":"-"},"content":" Expected: The most recent window size and location is retained.","lastModifiedDate":"2020-05-23"},{"lineNumber":466,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":467,"author":{"gitId":"-"},"content":"1. _{ more test cases …​ }_","lastModifiedDate":"2020-05-23"},{"lineNumber":468,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":469,"author":{"gitId":"-"},"content":"### Deleting a person","lastModifiedDate":"2020-05-23"},{"lineNumber":470,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":471,"author":{"gitId":"-"},"content":"1. Deleting a person while all persons are being shown","lastModifiedDate":"2020-05-23"},{"lineNumber":472,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":473,"author":{"gitId":"-"},"content":" 1. Prerequisites: List all persons using the `list` command. Multiple persons in the list.","lastModifiedDate":"2020-05-23"},{"lineNumber":474,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":475,"author":{"gitId":"-"},"content":" 1. Test case: `delete 1`\u003cbr\u003e","lastModifiedDate":"2020-05-23"},{"lineNumber":476,"author":{"gitId":"-"},"content":" 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.","lastModifiedDate":"2020-05-23"},{"lineNumber":477,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":478,"author":{"gitId":"-"},"content":" 1. Test case: `delete 0`\u003cbr\u003e","lastModifiedDate":"2020-05-23"},{"lineNumber":479,"author":{"gitId":"-"},"content":" Expected: No person is deleted. Error details shown in the status message. Status bar remains the same.","lastModifiedDate":"2020-05-23"},{"lineNumber":480,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":481,"author":{"gitId":"-"},"content":" 1. Other incorrect delete commands to try: `delete`, `delete x`, `...` (where x is larger than the list size)\u003cbr\u003e","lastModifiedDate":"2020-05-23"},{"lineNumber":482,"author":{"gitId":"-"},"content":" Expected: Similar to previous.","lastModifiedDate":"2020-05-23"},{"lineNumber":483,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":484,"author":{"gitId":"-"},"content":"1. _{ more test cases …​ }_","lastModifiedDate":"2020-05-23"},{"lineNumber":485,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":486,"author":{"gitId":"-"},"content":"### Saving data","lastModifiedDate":"2020-05-23"},{"lineNumber":487,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":488,"author":{"gitId":"-"},"content":"1. Dealing with missing/corrupted data files","lastModifiedDate":"2020-05-23"},{"lineNumber":489,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":490,"author":{"gitId":"-"},"content":" 1. _{explain how to simulate a missing/corrupted file, and the expected behavior}_","lastModifiedDate":"2020-05-23"},{"lineNumber":491,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":492,"author":{"gitId":"-"},"content":"1. _{ more test cases …​ }_","lastModifiedDate":"2020-05-23"}],"authorContributionMap":{"wallacexuhanxiao":112,"-":380}},{"path":"docs/team/iamzhenhong.md","fileType":"docs","lines":[{"lineNumber":1,"author":{"gitId":"IamZhenHong"},"content":"# zhen hong \u0027s Project Portfolio Page","lastModifiedDate":"2024-03-07"}],"authorContributionMap":{"IamZhenHong":1}},{"path":"docs/team/j-wang-csma.md","fileType":"docs","lines":[{"lineNumber":1,"author":{"gitId":"J-wang-CSMA"},"content":"---","lastModifiedDate":"2024-02-28"},{"lineNumber":2,"author":{"gitId":"J-wang-CSMA"},"content":"layout: page","lastModifiedDate":"2024-02-28"},{"lineNumber":3,"author":{"gitId":"J-wang-CSMA"},"content":"title: Jeremy Wang\u0027s Project Portfolio Page","lastModifiedDate":"2024-02-28"},{"lineNumber":4,"author":{"gitId":"J-wang-CSMA"},"content":"---","lastModifiedDate":"2024-02-28"},{"lineNumber":5,"author":{"gitId":"J-wang-CSMA"},"content":"","lastModifiedDate":"2024-02-28"},{"lineNumber":6,"author":{"gitId":"J-wang-CSMA"},"content":"### Project: PedagoguePages","lastModifiedDate":"2024-02-28"},{"lineNumber":7,"author":{"gitId":"J-wang-CSMA"},"content":"","lastModifiedDate":"2024-02-28"},{"lineNumber":8,"author":{"gitId":"J-wang-CSMA"},"content":"PedagoguePages is a desktop address book application for teachers to manage their students\u0027 contact information.","lastModifiedDate":"2024-02-28"},{"lineNumber":9,"author":{"gitId":"J-wang-CSMA"},"content":"The user interacts with it using a CLI, and it has a GUI created with JavaFX.","lastModifiedDate":"2024-02-28"},{"lineNumber":10,"author":{"gitId":"J-wang-CSMA"},"content":"It is written in Java, and has about 10 kLoC.","lastModifiedDate":"2024-02-28"},{"lineNumber":11,"author":{"gitId":"J-wang-CSMA"},"content":"Given below are my contributions to the project.","lastModifiedDate":"2024-02-28"},{"lineNumber":12,"author":{"gitId":"J-wang-CSMA"},"content":"","lastModifiedDate":"2024-02-28"},{"lineNumber":13,"author":{"gitId":"J-wang-CSMA"},"content":"* **New Features**: ","lastModifiedDate":"2024-02-28"},{"lineNumber":14,"author":{"gitId":"J-wang-CSMA"},"content":"","lastModifiedDate":"2024-02-28"},{"lineNumber":15,"author":{"gitId":"J-wang-CSMA"},"content":"","lastModifiedDate":"2024-02-28"},{"lineNumber":16,"author":{"gitId":"J-wang-CSMA"},"content":"","lastModifiedDate":"2024-02-28"},{"lineNumber":17,"author":{"gitId":"J-wang-CSMA"},"content":"* **Code contributed**: [RepoSense link]()","lastModifiedDate":"2024-02-28"},{"lineNumber":18,"author":{"gitId":"J-wang-CSMA"},"content":"","lastModifiedDate":"2024-02-28"},{"lineNumber":19,"author":{"gitId":"J-wang-CSMA"},"content":"","lastModifiedDate":"2024-02-28"},{"lineNumber":20,"author":{"gitId":"J-wang-CSMA"},"content":"","lastModifiedDate":"2024-02-28"},{"lineNumber":21,"author":{"gitId":"J-wang-CSMA"},"content":"* **Project management**:","lastModifiedDate":"2024-02-28"},{"lineNumber":22,"author":{"gitId":"J-wang-CSMA"},"content":" * Managed releases: ","lastModifiedDate":"2024-02-28"},{"lineNumber":23,"author":{"gitId":"J-wang-CSMA"},"content":"","lastModifiedDate":"2024-02-28"},{"lineNumber":24,"author":{"gitId":"J-wang-CSMA"},"content":"","lastModifiedDate":"2024-02-28"},{"lineNumber":25,"author":{"gitId":"J-wang-CSMA"},"content":"* **Enhancements to existing features**:","lastModifiedDate":"2024-02-28"},{"lineNumber":26,"author":{"gitId":"J-wang-CSMA"},"content":"","lastModifiedDate":"2024-02-28"},{"lineNumber":27,"author":{"gitId":"J-wang-CSMA"},"content":"","lastModifiedDate":"2024-02-28"},{"lineNumber":28,"author":{"gitId":"J-wang-CSMA"},"content":"","lastModifiedDate":"2024-02-28"},{"lineNumber":29,"author":{"gitId":"J-wang-CSMA"},"content":"* **Documentation**:","lastModifiedDate":"2024-02-28"},{"lineNumber":30,"author":{"gitId":"J-wang-CSMA"},"content":" * User Guide:","lastModifiedDate":"2024-02-28"},{"lineNumber":31,"author":{"gitId":"J-wang-CSMA"},"content":" * Developer Guide:","lastModifiedDate":"2024-02-28"},{"lineNumber":32,"author":{"gitId":"J-wang-CSMA"},"content":"","lastModifiedDate":"2024-02-28"},{"lineNumber":33,"author":{"gitId":"J-wang-CSMA"},"content":"","lastModifiedDate":"2024-02-28"},{"lineNumber":34,"author":{"gitId":"J-wang-CSMA"},"content":"* **Community**:","lastModifiedDate":"2024-02-28"},{"lineNumber":35,"author":{"gitId":"J-wang-CSMA"},"content":"","lastModifiedDate":"2024-02-28"},{"lineNumber":36,"author":{"gitId":"J-wang-CSMA"},"content":"* **Tools**:","lastModifiedDate":"2024-02-28"},{"lineNumber":37,"author":{"gitId":"J-wang-CSMA"},"content":"","lastModifiedDate":"2024-02-28"}],"authorContributionMap":{"J-wang-CSMA":37}},{"path":"docs/team/ongzhili.md","fileType":"docs","lines":[{"lineNumber":1,"author":{"gitId":"ongzhili"},"content":"---","lastModifiedDate":"2024-02-28"},{"lineNumber":2,"author":{"gitId":"ongzhili"},"content":"layout: page","lastModifiedDate":"2024-02-28"},{"lineNumber":3,"author":{"gitId":"ongzhili"},"content":"title: John Doe\u0027s Project Portfolio Page","lastModifiedDate":"2024-02-28"},{"lineNumber":4,"author":{"gitId":"ongzhili"},"content":"---","lastModifiedDate":"2024-02-28"},{"lineNumber":5,"author":{"gitId":"ongzhili"},"content":"","lastModifiedDate":"2024-02-28"},{"lineNumber":6,"author":{"gitId":"ongzhili"},"content":"### Project: PedagogyPages","lastModifiedDate":"2024-02-28"},{"lineNumber":7,"author":{"gitId":"ongzhili"},"content":"","lastModifiedDate":"2024-02-28"},{"lineNumber":8,"author":{"gitId":"ongzhili"},"content":"PedagogyPages is a desktop address book","lastModifiedDate":"2024-02-28"},{"lineNumber":9,"author":{"gitId":"ongzhili"},"content":"application used for teachers to manage their students\u0027 contact information. ","lastModifiedDate":"2024-02-28"},{"lineNumber":10,"author":{"gitId":"ongzhili"},"content":"The user interacts with it using a CLI, and it has a GUI created with JavaFX. ","lastModifiedDate":"2024-02-28"},{"lineNumber":11,"author":{"gitId":"ongzhili"},"content":"It is written in Java, and has about 10 kLoC.","lastModifiedDate":"2024-02-28"},{"lineNumber":12,"author":{"gitId":"ongzhili"},"content":"","lastModifiedDate":"2024-02-28"},{"lineNumber":13,"author":{"gitId":"ongzhili"},"content":"Given below are my contributions to the project.","lastModifiedDate":"2024-02-28"},{"lineNumber":14,"author":{"gitId":"ongzhili"},"content":"","lastModifiedDate":"2024-02-28"},{"lineNumber":15,"author":{"gitId":"ongzhili"},"content":"* **Code contributed**: [RepoSense link]()","lastModifiedDate":"2024-02-28"},{"lineNumber":16,"author":{"gitId":"ongzhili"},"content":"","lastModifiedDate":"2024-02-28"},{"lineNumber":17,"author":{"gitId":"ongzhili"},"content":"* **Documentation**:","lastModifiedDate":"2024-02-28"},{"lineNumber":18,"author":{"gitId":"ongzhili"},"content":" * User Guide:","lastModifiedDate":"2024-02-28"},{"lineNumber":19,"author":{"gitId":"ongzhili"},"content":" * Updated AboutUs with own information","lastModifiedDate":"2024-02-28"},{"lineNumber":20,"author":{"gitId":"ongzhili"},"content":" * Added portfolio file (this file)","lastModifiedDate":"2024-02-28"}],"authorContributionMap":{"ongzhili":20}},{"path":"docs/team/wallacexuhanxiao.md","fileType":"docs","lines":[{"lineNumber":1,"author":{"gitId":"wallacexuhanxiao"},"content":"# Hanxiao\u0027s Project Portfolio Page","lastModifiedDate":"2024-02-28"}],"authorContributionMap":{"wallacexuhanxiao":1}}] +[{"path":"README.md","fileType":"docs","lines":[{"lineNumber":1,"author":{"gitId":"-"},"content":"[![CI Status](https://github.com/AY2324S2-CS2103T-W10-3/tp/workflows/Java%20CI/badge.svg)](https://github.com/AY2324S2-CS2103T-W10-3/tp/actions)","lastModifiedDate":"2024-02-19"},{"lineNumber":2,"author":{"gitId":"-"},"content":"[![codecov](https://codecov.io/gh/AY2324S2-CS2103T-W10-3/tp/graph/badge.svg?token\u003dPXSE5NPSA4)](https://codecov.io/gh/AY2324S2-CS2103T-W10-3/tp)","lastModifiedDate":"2024-02-17"},{"lineNumber":3,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":4,"author":{"gitId":"ongzhili"},"content":"![Ui.png](docs%2Fimages%2FUi.png)","lastModifiedDate":"2024-03-04"},{"lineNumber":5,"author":{"gitId":"ongzhili"},"content":"# PedagoguePages","lastModifiedDate":"2024-03-04"},{"lineNumber":6,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":7,"author":{"gitId":"ongzhili"},"content":"\u003e \"Building Bridges, Bridging Gaps: PedagoguePages, Your Contact Map\"","lastModifiedDate":"2024-03-04"},{"lineNumber":8,"author":{"gitId":"ongzhili"},"content":"","lastModifiedDate":"2024-03-04"},{"lineNumber":9,"author":{"gitId":"ongzhili"},"content":"## What is PedagoguePages?","lastModifiedDate":"2024-03-04"},{"lineNumber":10,"author":{"gitId":"ongzhili"},"content":"* `PedagoguePages` (`PePes` for short) is a **contact management application**.","lastModifiedDate":"2024-03-04"},{"lineNumber":11,"author":{"gitId":"ongzhili"},"content":"* Naming:","lastModifiedDate":"2024-03-04"},{"lineNumber":12,"author":{"gitId":"ongzhili"},"content":" * Product Name:","lastModifiedDate":"2024-03-04"},{"lineNumber":13,"author":{"gitId":"ongzhili"},"content":" * `Pedagogue` - Pedagogy, education.","lastModifiedDate":"2024-03-04"},{"lineNumber":14,"author":{"gitId":"ongzhili"},"content":" * `Pages` - Lists of contacts","lastModifiedDate":"2024-03-04"},{"lineNumber":15,"author":{"gitId":"ongzhili"},"content":" * Together, forming a contact list for educators!","lastModifiedDate":"2024-03-04"},{"lineNumber":16,"author":{"gitId":"ongzhili"},"content":" * Catchy abbreviation:","lastModifiedDate":"2024-03-04"},{"lineNumber":17,"author":{"gitId":"ongzhili"},"content":" * `Pe` from Pedagogue, and `Pes` from pages (`PAY-ge-S`)","lastModifiedDate":"2024-03-04"},{"lineNumber":18,"author":{"gitId":"ongzhili"},"content":" ","lastModifiedDate":"2024-03-04"},{"lineNumber":19,"author":{"gitId":"ongzhili"},"content":"* PedagogyPages is a **Command Line Interface** (CLI) based system.","lastModifiedDate":"2024-03-04"},{"lineNumber":20,"author":{"gitId":"ongzhili"},"content":"","lastModifiedDate":"2024-03-04"},{"lineNumber":21,"author":{"gitId":"ongzhili"},"content":"","lastModifiedDate":"2024-03-04"},{"lineNumber":22,"author":{"gitId":"ongzhili"},"content":"## What is PedagogyPages for?","lastModifiedDate":"2024-03-04"},{"lineNumber":23,"author":{"gitId":"ongzhili"},"content":"* PedagogyPages is optimized for **Educators**, specifically in the primary / secondary school area, where class sizes are large.\u003cbr\u003e","lastModifiedDate":"2024-03-04"},{"lineNumber":24,"author":{"gitId":"ongzhili"},"content":"* PedagogyPages is more optimized for users who are:","lastModifiedDate":"2024-03-04"},{"lineNumber":25,"author":{"gitId":"ongzhili"},"content":" * Generally faster typists","lastModifiedDate":"2024-03-04"},{"lineNumber":26,"author":{"gitId":"ongzhili"},"content":" * Users that prefer command line interfaces","lastModifiedDate":"2024-03-04"},{"lineNumber":27,"author":{"gitId":"ongzhili"},"content":"* PedagogyPages boasts features such as:","lastModifiedDate":"2024-03-04"},{"lineNumber":28,"author":{"gitId":"ongzhili"},"content":" * Basic **Create, Read, Update, Delete (CRUD)** operations on student contact information.","lastModifiedDate":"2024-03-04"},{"lineNumber":29,"author":{"gitId":"ongzhili"},"content":" * Search functionality based on different modes (e.g classes, student ID, etc)","lastModifiedDate":"2024-03-04"},{"lineNumber":30,"author":{"gitId":"ongzhili"},"content":"","lastModifiedDate":"2024-03-04"},{"lineNumber":31,"author":{"gitId":"ongzhili"},"content":"","lastModifiedDate":"2024-03-04"},{"lineNumber":32,"author":{"gitId":"ongzhili"},"content":"## What is PedagogyPages based on?","lastModifiedDate":"2024-03-04"},{"lineNumber":33,"author":{"gitId":"ongzhili"},"content":"* PedagogyPages is also our (CS2103-W10-3\u0027s) brownfield development project, based on the AddressBook-Level3 project created by the [SE-EDU initiative](https://se-education.org).","lastModifiedDate":"2024-03-04"},{"lineNumber":34,"author":{"gitId":"-"},"content":" * The project simulates an ongoing software project for a desktop application (called _AddressBook_) used for managing contact details.","lastModifiedDate":"2020-05-23"},{"lineNumber":35,"author":{"gitId":"-"},"content":" * 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.","lastModifiedDate":"2020-05-23"},{"lineNumber":36,"author":{"gitId":"-"},"content":" * It comes with a **reasonable level of user and developer documentation**.","lastModifiedDate":"2020-05-23"},{"lineNumber":37,"author":{"gitId":"-"},"content":"* For the detailed documentation of this project, see the **[Address Book Product Website](https://se-education.org/addressbook-level3)**.","lastModifiedDate":"2020-05-23"},{"lineNumber":38,"author":{"gitId":"-"},"content":"* 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.","lastModifiedDate":"2020-05-23"},{"lineNumber":39,"author":{"gitId":"wallacexuhanxiao"},"content":"","lastModifiedDate":"2024-02-24"}],"authorContributionMap":{"ongzhili":29,"wallacexuhanxiao":1,"-":9}},{"path":"docs/AboutUs.md","fileType":"docs","lines":[{"lineNumber":1,"author":{"gitId":"-"},"content":"---","lastModifiedDate":"2020-05-23"},{"lineNumber":2,"author":{"gitId":"-"},"content":"layout: page","lastModifiedDate":"2020-05-23"},{"lineNumber":3,"author":{"gitId":"-"},"content":"title: About Us","lastModifiedDate":"2020-05-23"},{"lineNumber":4,"author":{"gitId":"-"},"content":"---","lastModifiedDate":"2020-05-23"},{"lineNumber":5,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":6,"author":{"gitId":"-"},"content":"We are a team based in the [School of Computing, National University of Singapore](http://www.comp.nus.edu.sg).","lastModifiedDate":"2020-05-23"},{"lineNumber":7,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":8,"author":{"gitId":"-"},"content":"## Project team","lastModifiedDate":"2020-06-07"},{"lineNumber":9,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":10,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":11,"author":{"gitId":"J-wang-CSMA"},"content":"### Jeremy Wang","lastModifiedDate":"2024-02-28"},{"lineNumber":12,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":13,"author":{"gitId":"J-wang-CSMA"},"content":"\u003cimg src\u003d\"images/j-wang-csma.png\" width\u003d\"200px\"\u003e","lastModifiedDate":"2024-02-28"},{"lineNumber":14,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":15,"author":{"gitId":"J-wang-CSMA"},"content":"[[github](http://github.com/J-wang-CSMA)]","lastModifiedDate":"2024-02-28"},{"lineNumber":16,"author":{"gitId":"J-wang-CSMA"},"content":"[[portfolio](team/j-wang-csma.md)]","lastModifiedDate":"2024-02-28"},{"lineNumber":17,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":18,"author":{"gitId":"J-wang-CSMA"},"content":"* Role: Developer, Deliverables and deadlines","lastModifiedDate":"2024-02-28"},{"lineNumber":19,"author":{"gitId":"J-wang-CSMA"},"content":"* Responsibilities: Data + UI","lastModifiedDate":"2024-02-28"},{"lineNumber":20,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":21,"author":{"gitId":"wallacexuhanxiao"},"content":"### XU HANXIAO","lastModifiedDate":"2024-02-28"},{"lineNumber":22,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":23,"author":{"gitId":"wallacexuhanxiao"},"content":"\u003cimg src\u003d\"images/wallacexuhanxiao.png\" width\u003d\"200px\"\u003e","lastModifiedDate":"2024-03-06"},{"lineNumber":24,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":25,"author":{"gitId":"wallacexuhanxiao"},"content":"[[github](http://github.com/wallacexuhanxiao)]","lastModifiedDate":"2024-03-08"},{"lineNumber":26,"author":{"gitId":"wallacexuhanxiao"},"content":"[[portfolio](team/wallacexuhanxiao.md)]","lastModifiedDate":"2024-03-08"},{"lineNumber":27,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":28,"author":{"gitId":"-"},"content":"* Role: Developer","lastModifiedDate":"2020-05-23"},{"lineNumber":29,"author":{"gitId":"wallacexuhanxiao"},"content":"* Responsibilities: Develop","lastModifiedDate":"2024-02-28"},{"lineNumber":30,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":31,"author":{"gitId":"ongzhili"},"content":"### Ong Zhi Li","lastModifiedDate":"2024-02-28"},{"lineNumber":32,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":33,"author":{"gitId":"ongzhili"},"content":"\u003cimg src\u003d\"images/ongzhili.png\" width\u003d\"200px\"\u003e","lastModifiedDate":"2024-03-07"},{"lineNumber":34,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":35,"author":{"gitId":"ongzhili"},"content":"[[github](http://github.com/ongzhili)]","lastModifiedDate":"2024-02-28"},{"lineNumber":36,"author":{"gitId":"ongzhili"},"content":"[[portfolio](team/ongzhili.md)]","lastModifiedDate":"2024-02-28"},{"lineNumber":37,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":38,"author":{"gitId":"-"},"content":"* Role: Developer","lastModifiedDate":"2020-05-23"},{"lineNumber":39,"author":{"gitId":"ongzhili"},"content":"* Responsibilities: UI + Logic handling","lastModifiedDate":"2024-02-28"},{"lineNumber":40,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":41,"author":{"gitId":"IamZhenHong"},"content":"### Seng Zhen Hong","lastModifiedDate":"2024-03-07"},{"lineNumber":42,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2024-03-07"},{"lineNumber":43,"author":{"gitId":"IamZhenHong"},"content":"\u003cimg src\u003d\"images/iamzhenhong.png\" width\u003d\"200px\"\u003e","lastModifiedDate":"2024-03-07"},{"lineNumber":44,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2024-03-07"},{"lineNumber":45,"author":{"gitId":"IamZhenHong"},"content":"[[github](http://github.com/IamZhenHong)]","lastModifiedDate":"2024-03-07"},{"lineNumber":46,"author":{"gitId":"IamZhenHong"},"content":"[[portfolio](team/iamzhenhong.md)]","lastModifiedDate":"2024-03-07"},{"lineNumber":47,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2024-03-07"},{"lineNumber":48,"author":{"gitId":"-"},"content":"* Role: Developer","lastModifiedDate":"2024-03-08"},{"lineNumber":49,"author":{"gitId":"wallacexuhanxiao"},"content":"* Responsibilities: Develop","lastModifiedDate":"2024-03-08"},{"lineNumber":50,"author":{"gitId":"wallacexuhanxiao"},"content":"* ","lastModifiedDate":"2024-03-08"}],"authorContributionMap":{"IamZhenHong":4,"wallacexuhanxiao":7,"ongzhili":5,"-":28,"J-wang-CSMA":6}},{"path":"docs/DeveloperGuide.md","fileType":"docs","lines":[{"lineNumber":1,"author":{"gitId":"-"},"content":"---","lastModifiedDate":"2020-05-23"},{"lineNumber":2,"author":{"gitId":"-"},"content":"layout: page","lastModifiedDate":"2020-05-23"},{"lineNumber":3,"author":{"gitId":"-"},"content":"title: Developer Guide","lastModifiedDate":"2020-05-23"},{"lineNumber":4,"author":{"gitId":"-"},"content":"---","lastModifiedDate":"2020-05-23"},{"lineNumber":5,"author":{"gitId":"-"},"content":"* Table of Contents","lastModifiedDate":"2020-05-23"},{"lineNumber":6,"author":{"gitId":"-"},"content":"{:toc}","lastModifiedDate":"2020-05-23"},{"lineNumber":7,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":8,"author":{"gitId":"-"},"content":"--------------------------------------------------------------------------------------------------------------------","lastModifiedDate":"2020-05-23"},{"lineNumber":9,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2021-07-30"},{"lineNumber":10,"author":{"gitId":"-"},"content":"## **Acknowledgements**","lastModifiedDate":"2021-07-30"},{"lineNumber":11,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2021-07-30"},{"lineNumber":12,"author":{"gitId":"wallacexuhanxiao"},"content":"* This project is based on the AddressBook-Level3 project created by the [SE-EDU initiative](https://se-education.org).","lastModifiedDate":"2024-02-28"},{"lineNumber":13,"author":{"gitId":"-"},"content":"--------------------------------------------------------------------------------------------------------------------","lastModifiedDate":"2021-07-30"},{"lineNumber":14,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":15,"author":{"gitId":"-"},"content":"## **Setting up, getting started**","lastModifiedDate":"2020-05-23"},{"lineNumber":16,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":17,"author":{"gitId":"-"},"content":"Refer to the guide [_Setting up and getting started_](SettingUp.md).","lastModifiedDate":"2020-05-23"},{"lineNumber":18,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":19,"author":{"gitId":"-"},"content":"--------------------------------------------------------------------------------------------------------------------","lastModifiedDate":"2020-05-23"},{"lineNumber":20,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":21,"author":{"gitId":"-"},"content":"## **Design**","lastModifiedDate":"2020-05-23"},{"lineNumber":22,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":23,"author":{"gitId":"-"},"content":"\u003cdiv markdown\u003d\"span\" class\u003d\"alert alert-primary\"\u003e","lastModifiedDate":"2021-07-31"},{"lineNumber":24,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":25,"author":{"gitId":"-"},"content":":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.","lastModifiedDate":"2023-09-03"},{"lineNumber":26,"author":{"gitId":"-"},"content":"\u003c/div\u003e","lastModifiedDate":"2021-07-31"},{"lineNumber":27,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":28,"author":{"gitId":"-"},"content":"### Architecture","lastModifiedDate":"2021-07-31"},{"lineNumber":29,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":30,"author":{"gitId":"-"},"content":"\u003cimg src\u003d\"images/ArchitectureDiagram.png\" width\u003d\"280\" /\u003e","lastModifiedDate":"2021-07-31"},{"lineNumber":31,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":32,"author":{"gitId":"-"},"content":"The ***Architecture Diagram*** given above explains the high-level design of the App.","lastModifiedDate":"2021-07-31"},{"lineNumber":33,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":34,"author":{"gitId":"-"},"content":"Given below is a quick overview of main components and how they interact with each other.","lastModifiedDate":"2021-07-31"},{"lineNumber":35,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2021-07-31"},{"lineNumber":36,"author":{"gitId":"-"},"content":"**Main components of the architecture**","lastModifiedDate":"2021-07-31"},{"lineNumber":37,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":38,"author":{"gitId":"-"},"content":"**`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.","lastModifiedDate":"2023-09-03"},{"lineNumber":39,"author":{"gitId":"-"},"content":"* At app launch, it initializes the other components in the correct sequence, and connects them up with each other.","lastModifiedDate":"2023-09-03"},{"lineNumber":40,"author":{"gitId":"-"},"content":"* At shut down, it shuts down the other components and invokes cleanup methods where necessary.","lastModifiedDate":"2023-09-03"},{"lineNumber":41,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":42,"author":{"gitId":"-"},"content":"The bulk of the app\u0027s work is done by the following four components:","lastModifiedDate":"2023-09-03"},{"lineNumber":43,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":44,"author":{"gitId":"-"},"content":"* [**`UI`**](#ui-component): The UI of the App.","lastModifiedDate":"2020-05-23"},{"lineNumber":45,"author":{"gitId":"-"},"content":"* [**`Logic`**](#logic-component): The command executor.","lastModifiedDate":"2020-05-23"},{"lineNumber":46,"author":{"gitId":"-"},"content":"* [**`Model`**](#model-component): Holds the data of the App in memory.","lastModifiedDate":"2020-05-23"},{"lineNumber":47,"author":{"gitId":"-"},"content":"* [**`Storage`**](#storage-component): Reads data from, and writes data to, the hard disk.","lastModifiedDate":"2020-05-23"},{"lineNumber":48,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":49,"author":{"gitId":"-"},"content":"[**`Commons`**](#common-classes) represents a collection of classes used by multiple other components.","lastModifiedDate":"2023-09-03"},{"lineNumber":50,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":51,"author":{"gitId":"-"},"content":"**How the architecture components interact with each other**","lastModifiedDate":"2020-05-23"},{"lineNumber":52,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":53,"author":{"gitId":"-"},"content":"The *Sequence Diagram* below shows how the components interact with each other for the scenario where the user issues the command `delete 1`.","lastModifiedDate":"2020-05-23"},{"lineNumber":54,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":55,"author":{"gitId":"-"},"content":"\u003cimg src\u003d\"images/ArchitectureSequenceDiagram.png\" width\u003d\"574\" /\u003e","lastModifiedDate":"2020-06-07"},{"lineNumber":56,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":57,"author":{"gitId":"-"},"content":"Each of the four main components (also shown in the diagram above),","lastModifiedDate":"2021-07-31"},{"lineNumber":58,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2021-07-31"},{"lineNumber":59,"author":{"gitId":"-"},"content":"* defines its *API* in an `interface` with the same name as the Component.","lastModifiedDate":"2021-07-31"},{"lineNumber":60,"author":{"gitId":"-"},"content":"* implements its functionality using a concrete `{Component Name}Manager` class (which follows the corresponding API `interface` mentioned in the previous point.","lastModifiedDate":"2021-07-31"},{"lineNumber":61,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2021-07-31"},{"lineNumber":62,"author":{"gitId":"-"},"content":"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\u0027s being coupled to the implementation of a component), as illustrated in the (partial) class diagram below.","lastModifiedDate":"2021-07-31"},{"lineNumber":63,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2021-07-31"},{"lineNumber":64,"author":{"gitId":"-"},"content":"\u003cimg src\u003d\"images/ComponentManagers.png\" width\u003d\"300\" /\u003e","lastModifiedDate":"2021-07-31"},{"lineNumber":65,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2021-07-31"},{"lineNumber":66,"author":{"gitId":"-"},"content":"The sections below give more details of each component.","lastModifiedDate":"2020-05-23"},{"lineNumber":67,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":68,"author":{"gitId":"-"},"content":"### UI component","lastModifiedDate":"2020-05-23"},{"lineNumber":69,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":70,"author":{"gitId":"-"},"content":"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)","lastModifiedDate":"2021-07-31"},{"lineNumber":71,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":72,"author":{"gitId":"-"},"content":"![Structure of the UI Component](images/UiClassDiagram.png)","lastModifiedDate":"2021-07-31"},{"lineNumber":73,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":74,"author":{"gitId":"-"},"content":"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.","lastModifiedDate":"2021-07-31"},{"lineNumber":75,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":76,"author":{"gitId":"-"},"content":"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)","lastModifiedDate":"2021-07-31"},{"lineNumber":77,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":78,"author":{"gitId":"-"},"content":"The `UI` component,","lastModifiedDate":"2020-05-23"},{"lineNumber":79,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":80,"author":{"gitId":"-"},"content":"* executes user commands using the `Logic` component.","lastModifiedDate":"2021-07-31"},{"lineNumber":81,"author":{"gitId":"-"},"content":"* listens for changes to `Model` data so that the UI can be updated with the modified data.","lastModifiedDate":"2021-07-31"},{"lineNumber":82,"author":{"gitId":"-"},"content":"* keeps a reference to the `Logic` component, because the `UI` relies on the `Logic` to execute commands.","lastModifiedDate":"2021-07-31"},{"lineNumber":83,"author":{"gitId":"-"},"content":"* depends on some classes in the `Model` component, as it displays `Person` object residing in the `Model`.","lastModifiedDate":"2021-07-31"},{"lineNumber":84,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":85,"author":{"gitId":"-"},"content":"### Logic component","lastModifiedDate":"2020-05-23"},{"lineNumber":86,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":87,"author":{"gitId":"-"},"content":"**API** : [`Logic.java`](https://github.com/se-edu/addressbook-level3/tree/master/src/main/java/seedu/address/logic/Logic.java)","lastModifiedDate":"2021-07-31"},{"lineNumber":88,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":89,"author":{"gitId":"-"},"content":"Here\u0027s a (partial) class diagram of the `Logic` component:","lastModifiedDate":"2021-07-31"},{"lineNumber":90,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":91,"author":{"gitId":"-"},"content":"\u003cimg src\u003d\"images/LogicClassDiagram.png\" width\u003d\"550\"/\u003e","lastModifiedDate":"2021-07-31"},{"lineNumber":92,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":93,"author":{"gitId":"-"},"content":"The sequence diagram below illustrates the interactions within the `Logic` component, taking `execute(\"delete 1\")` API call as an example.","lastModifiedDate":"2023-09-03"},{"lineNumber":94,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":95,"author":{"gitId":"-"},"content":"![Interactions Inside the Logic Component for the `delete 1` Command](images/DeleteSequenceDiagram.png)","lastModifiedDate":"2020-05-23"},{"lineNumber":96,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":97,"author":{"gitId":"-"},"content":"\u003cdiv markdown\u003d\"span\" class\u003d\"alert alert-info\"\u003e:information_source: **Note:** The lifeline for `DeleteCommandParser` should end at the destroy marker (X) but due to a limitation of PlantUML, the lifeline continues till the end of diagram.","lastModifiedDate":"2024-02-09"},{"lineNumber":98,"author":{"gitId":"-"},"content":"\u003c/div\u003e","lastModifiedDate":"2020-05-23"},{"lineNumber":99,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":100,"author":{"gitId":"-"},"content":"How the `Logic` component works:","lastModifiedDate":"2023-09-03"},{"lineNumber":101,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2023-09-03"},{"lineNumber":102,"author":{"gitId":"-"},"content":"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.","lastModifiedDate":"2023-09-03"},{"lineNumber":103,"author":{"gitId":"-"},"content":"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`.","lastModifiedDate":"2023-09-03"},{"lineNumber":104,"author":{"gitId":"-"},"content":"1. The command can communicate with the `Model` when it is executed (e.g. to delete a person).\u003cbr\u003e","lastModifiedDate":"2024-02-09"},{"lineNumber":105,"author":{"gitId":"-"},"content":" Note that although this is shown as a single step in the diagram above (for simplicity), in the code it can take several interactions (between the command object and the `Model`) to achieve.","lastModifiedDate":"2024-02-09"},{"lineNumber":106,"author":{"gitId":"-"},"content":"1. The result of the command execution is encapsulated as a `CommandResult` object which is returned back from `Logic`.","lastModifiedDate":"2023-09-03"},{"lineNumber":107,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2023-09-03"},{"lineNumber":108,"author":{"gitId":"-"},"content":"Here are the other classes in `Logic` (omitted from the class diagram above) that are used for parsing a user command:","lastModifiedDate":"2021-07-31"},{"lineNumber":109,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2021-07-31"},{"lineNumber":110,"author":{"gitId":"-"},"content":"\u003cimg src\u003d\"images/ParserClasses.png\" width\u003d\"600\"/\u003e","lastModifiedDate":"2021-07-31"},{"lineNumber":111,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":112,"author":{"gitId":"-"},"content":"How the parsing works:","lastModifiedDate":"2021-07-31"},{"lineNumber":113,"author":{"gitId":"-"},"content":"* 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.","lastModifiedDate":"2021-07-31"},{"lineNumber":114,"author":{"gitId":"-"},"content":"* 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.","lastModifiedDate":"2021-07-31"},{"lineNumber":115,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":116,"author":{"gitId":"-"},"content":"### Model component","lastModifiedDate":"2021-07-31"},{"lineNumber":117,"author":{"gitId":"-"},"content":"**API** : [`Model.java`](https://github.com/se-edu/addressbook-level3/tree/master/src/main/java/seedu/address/model/Model.java)","lastModifiedDate":"2020-05-23"},{"lineNumber":118,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":119,"author":{"gitId":"-"},"content":"\u003cimg src\u003d\"images/ModelClassDiagram.png\" width\u003d\"450\" /\u003e","lastModifiedDate":"2021-07-31"},{"lineNumber":120,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":121,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":122,"author":{"gitId":"-"},"content":"The `Model` component,","lastModifiedDate":"2021-07-31"},{"lineNumber":123,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":124,"author":{"gitId":"-"},"content":"* stores the address book data i.e., all `Person` objects (which are contained in a `UniquePersonList` object).","lastModifiedDate":"2021-07-31"},{"lineNumber":125,"author":{"gitId":"-"},"content":"* stores the currently \u0027selected\u0027 `Person` objects (e.g., results of a search query) as a separate _filtered_ list which is exposed to outsiders as an unmodifiable `ObservableList\u003cPerson\u003e` that can be \u0027observed\u0027 e.g. the UI can be bound to this list so that the UI automatically updates when the data in the list change.","lastModifiedDate":"2021-07-31"},{"lineNumber":126,"author":{"gitId":"-"},"content":"* stores a `UserPref` object that represents the user’s preferences. This is exposed to the outside as a `ReadOnlyUserPref` objects.","lastModifiedDate":"2021-07-31"},{"lineNumber":127,"author":{"gitId":"-"},"content":"* 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)","lastModifiedDate":"2021-07-31"},{"lineNumber":128,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2021-07-31"},{"lineNumber":129,"author":{"gitId":"-"},"content":"\u003cdiv markdown\u003d\"span\" class\u003d\"alert alert-info\"\u003e: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.\u003cbr\u003e","lastModifiedDate":"2021-07-31"},{"lineNumber":130,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2021-07-31"},{"lineNumber":131,"author":{"gitId":"-"},"content":"\u003cimg src\u003d\"images/BetterModelClassDiagram.png\" width\u003d\"450\" /\u003e","lastModifiedDate":"2021-07-31"},{"lineNumber":132,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":133,"author":{"gitId":"-"},"content":"\u003c/div\u003e","lastModifiedDate":"2020-05-23"},{"lineNumber":134,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":135,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":136,"author":{"gitId":"-"},"content":"### Storage component","lastModifiedDate":"2020-05-23"},{"lineNumber":137,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":138,"author":{"gitId":"-"},"content":"**API** : [`Storage.java`](https://github.com/se-edu/addressbook-level3/tree/master/src/main/java/seedu/address/storage/Storage.java)","lastModifiedDate":"2020-05-23"},{"lineNumber":139,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":140,"author":{"gitId":"-"},"content":"\u003cimg src\u003d\"images/StorageClassDiagram.png\" width\u003d\"550\" /\u003e","lastModifiedDate":"2021-07-31"},{"lineNumber":141,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2021-07-31"},{"lineNumber":142,"author":{"gitId":"-"},"content":"The `Storage` component,","lastModifiedDate":"2020-05-23"},{"lineNumber":143,"author":{"gitId":"-"},"content":"* can save both address book data and user preference data in JSON format, and read them back into corresponding objects.","lastModifiedDate":"2023-09-03"},{"lineNumber":144,"author":{"gitId":"-"},"content":"* inherits from both `AddressBookStorage` and `UserPrefStorage`, which means it can be treated as either one (if only the functionality of only one is needed).","lastModifiedDate":"2021-07-31"},{"lineNumber":145,"author":{"gitId":"-"},"content":"* depends on some classes in the `Model` component (because the `Storage` component\u0027s job is to save/retrieve objects that belong to the `Model`)","lastModifiedDate":"2021-07-21"},{"lineNumber":146,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":147,"author":{"gitId":"-"},"content":"### Common classes","lastModifiedDate":"2020-05-23"},{"lineNumber":148,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":149,"author":{"gitId":"-"},"content":"Classes used by multiple components are in the `seedu.addressbook.commons` package.","lastModifiedDate":"2020-05-23"},{"lineNumber":150,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":151,"author":{"gitId":"-"},"content":"--------------------------------------------------------------------------------------------------------------------","lastModifiedDate":"2020-05-23"},{"lineNumber":152,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":153,"author":{"gitId":"-"},"content":"## **Implementation**","lastModifiedDate":"2020-05-23"},{"lineNumber":154,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":155,"author":{"gitId":"-"},"content":"This section describes some noteworthy details on how certain features are implemented.","lastModifiedDate":"2020-05-23"},{"lineNumber":156,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":157,"author":{"gitId":"-"},"content":"### \\[Proposed\\] Undo/redo feature","lastModifiedDate":"2020-06-07"},{"lineNumber":158,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":159,"author":{"gitId":"-"},"content":"#### Proposed Implementation","lastModifiedDate":"2020-05-23"},{"lineNumber":160,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":161,"author":{"gitId":"-"},"content":"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:","lastModifiedDate":"2020-05-23"},{"lineNumber":162,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":163,"author":{"gitId":"-"},"content":"* `VersionedAddressBook#commit()` — Saves the current address book state in its history.","lastModifiedDate":"2020-05-23"},{"lineNumber":164,"author":{"gitId":"-"},"content":"* `VersionedAddressBook#undo()` — Restores the previous address book state from its history.","lastModifiedDate":"2020-05-23"},{"lineNumber":165,"author":{"gitId":"-"},"content":"* `VersionedAddressBook#redo()` — Restores a previously undone address book state from its history.","lastModifiedDate":"2020-05-23"},{"lineNumber":166,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":167,"author":{"gitId":"-"},"content":"These operations are exposed in the `Model` interface as `Model#commitAddressBook()`, `Model#undoAddressBook()` and `Model#redoAddressBook()` respectively.","lastModifiedDate":"2020-05-23"},{"lineNumber":168,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":169,"author":{"gitId":"-"},"content":"Given below is an example usage scenario and how the undo/redo mechanism behaves at each step.","lastModifiedDate":"2020-05-23"},{"lineNumber":170,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":171,"author":{"gitId":"-"},"content":"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.","lastModifiedDate":"2020-05-23"},{"lineNumber":172,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":173,"author":{"gitId":"-"},"content":"![UndoRedoState0](images/UndoRedoState0.png)","lastModifiedDate":"2020-05-23"},{"lineNumber":174,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":175,"author":{"gitId":"-"},"content":"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.","lastModifiedDate":"2020-05-23"},{"lineNumber":176,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":177,"author":{"gitId":"-"},"content":"![UndoRedoState1](images/UndoRedoState1.png)","lastModifiedDate":"2020-05-23"},{"lineNumber":178,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":179,"author":{"gitId":"-"},"content":"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`.","lastModifiedDate":"2020-05-23"},{"lineNumber":180,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":181,"author":{"gitId":"-"},"content":"![UndoRedoState2](images/UndoRedoState2.png)","lastModifiedDate":"2020-05-23"},{"lineNumber":182,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":183,"author":{"gitId":"-"},"content":"\u003cdiv markdown\u003d\"span\" class\u003d\"alert alert-info\"\u003e: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`.","lastModifiedDate":"2020-05-23"},{"lineNumber":184,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":185,"author":{"gitId":"-"},"content":"\u003c/div\u003e","lastModifiedDate":"2020-05-23"},{"lineNumber":186,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":187,"author":{"gitId":"-"},"content":"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.","lastModifiedDate":"2020-05-23"},{"lineNumber":188,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":189,"author":{"gitId":"-"},"content":"![UndoRedoState3](images/UndoRedoState3.png)","lastModifiedDate":"2020-05-23"},{"lineNumber":190,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":191,"author":{"gitId":"-"},"content":"\u003cdiv markdown\u003d\"span\" class\u003d\"alert alert-info\"\u003e: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","lastModifiedDate":"2020-05-23"},{"lineNumber":192,"author":{"gitId":"-"},"content":"than attempting to perform the undo.","lastModifiedDate":"2020-05-23"},{"lineNumber":193,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":194,"author":{"gitId":"-"},"content":"\u003c/div\u003e","lastModifiedDate":"2020-05-23"},{"lineNumber":195,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":196,"author":{"gitId":"-"},"content":"The following sequence diagram shows how an undo operation goes through the `Logic` component:","lastModifiedDate":"2024-02-09"},{"lineNumber":197,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":198,"author":{"gitId":"-"},"content":"![UndoSequenceDiagram](images/UndoSequenceDiagram-Logic.png)","lastModifiedDate":"2024-02-09"},{"lineNumber":199,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":200,"author":{"gitId":"-"},"content":"\u003cdiv markdown\u003d\"span\" class\u003d\"alert alert-info\"\u003e: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.","lastModifiedDate":"2020-05-23"},{"lineNumber":201,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":202,"author":{"gitId":"-"},"content":"\u003c/div\u003e","lastModifiedDate":"2020-05-23"},{"lineNumber":203,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":204,"author":{"gitId":"-"},"content":"Similarly, how an undo operation goes through the `Model` component is shown below:","lastModifiedDate":"2024-02-09"},{"lineNumber":205,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2024-02-09"},{"lineNumber":206,"author":{"gitId":"-"},"content":"![UndoSequenceDiagram](images/UndoSequenceDiagram-Model.png)","lastModifiedDate":"2024-02-09"},{"lineNumber":207,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2024-02-09"},{"lineNumber":208,"author":{"gitId":"-"},"content":"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.","lastModifiedDate":"2020-05-23"},{"lineNumber":209,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":210,"author":{"gitId":"-"},"content":"\u003cdiv markdown\u003d\"span\" class\u003d\"alert alert-info\"\u003e: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.","lastModifiedDate":"2020-05-23"},{"lineNumber":211,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":212,"author":{"gitId":"-"},"content":"\u003c/div\u003e","lastModifiedDate":"2020-05-23"},{"lineNumber":213,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":214,"author":{"gitId":"-"},"content":"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.","lastModifiedDate":"2020-05-23"},{"lineNumber":215,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":216,"author":{"gitId":"-"},"content":"![UndoRedoState4](images/UndoRedoState4.png)","lastModifiedDate":"2020-05-23"},{"lineNumber":217,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":218,"author":{"gitId":"-"},"content":"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.","lastModifiedDate":"2020-05-23"},{"lineNumber":219,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":220,"author":{"gitId":"-"},"content":"![UndoRedoState5](images/UndoRedoState5.png)","lastModifiedDate":"2020-05-23"},{"lineNumber":221,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":222,"author":{"gitId":"-"},"content":"The following activity diagram summarizes what happens when a user executes a new command:","lastModifiedDate":"2020-05-23"},{"lineNumber":223,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":224,"author":{"gitId":"-"},"content":"\u003cimg src\u003d\"images/CommitActivityDiagram.png\" width\u003d\"250\" /\u003e","lastModifiedDate":"2021-07-31"},{"lineNumber":225,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":226,"author":{"gitId":"-"},"content":"#### Design considerations:","lastModifiedDate":"2021-07-31"},{"lineNumber":227,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":228,"author":{"gitId":"-"},"content":"**Aspect: How undo \u0026 redo executes:**","lastModifiedDate":"2021-07-31"},{"lineNumber":229,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":230,"author":{"gitId":"-"},"content":"* **Alternative 1 (current choice):** Saves the entire address book.","lastModifiedDate":"2020-05-23"},{"lineNumber":231,"author":{"gitId":"-"},"content":" * Pros: Easy to implement.","lastModifiedDate":"2020-05-23"},{"lineNumber":232,"author":{"gitId":"-"},"content":" * Cons: May have performance issues in terms of memory usage.","lastModifiedDate":"2020-05-23"},{"lineNumber":233,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":234,"author":{"gitId":"-"},"content":"* **Alternative 2:** Individual command knows how to undo/redo by","lastModifiedDate":"2020-05-23"},{"lineNumber":235,"author":{"gitId":"-"},"content":" itself.","lastModifiedDate":"2020-05-23"},{"lineNumber":236,"author":{"gitId":"-"},"content":" * Pros: Will use less memory (e.g. for `delete`, just save the person being deleted).","lastModifiedDate":"2020-05-23"},{"lineNumber":237,"author":{"gitId":"-"},"content":" * Cons: We must ensure that the implementation of each individual command are correct.","lastModifiedDate":"2020-05-23"},{"lineNumber":238,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":239,"author":{"gitId":"-"},"content":"_{more aspects and alternatives to be added}_","lastModifiedDate":"2020-05-23"},{"lineNumber":240,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":241,"author":{"gitId":"-"},"content":"### \\[Proposed\\] Data archiving","lastModifiedDate":"2020-05-23"},{"lineNumber":242,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":243,"author":{"gitId":"-"},"content":"_{Explain here how the data archiving feature will be implemented}_","lastModifiedDate":"2020-05-23"},{"lineNumber":244,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":245,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":246,"author":{"gitId":"-"},"content":"--------------------------------------------------------------------------------------------------------------------","lastModifiedDate":"2020-05-23"},{"lineNumber":247,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":248,"author":{"gitId":"-"},"content":"## **Documentation, logging, testing, configuration, dev-ops**","lastModifiedDate":"2020-06-07"},{"lineNumber":249,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":250,"author":{"gitId":"-"},"content":"* [Documentation guide](Documentation.md)","lastModifiedDate":"2020-06-07"},{"lineNumber":251,"author":{"gitId":"-"},"content":"* [Testing guide](Testing.md)","lastModifiedDate":"2020-06-07"},{"lineNumber":252,"author":{"gitId":"-"},"content":"* [Logging guide](Logging.md)","lastModifiedDate":"2020-06-07"},{"lineNumber":253,"author":{"gitId":"-"},"content":"* [Configuration guide](Configuration.md)","lastModifiedDate":"2020-06-07"},{"lineNumber":254,"author":{"gitId":"-"},"content":"* [DevOps guide](DevOps.md)","lastModifiedDate":"2020-06-07"},{"lineNumber":255,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":256,"author":{"gitId":"-"},"content":"--------------------------------------------------------------------------------------------------------------------","lastModifiedDate":"2020-05-23"},{"lineNumber":257,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":258,"author":{"gitId":"-"},"content":"## **Appendix: Requirements**","lastModifiedDate":"2020-05-23"},{"lineNumber":259,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":260,"author":{"gitId":"-"},"content":"### Product scope","lastModifiedDate":"2020-05-23"},{"lineNumber":261,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":262,"author":{"gitId":"-"},"content":"**Target user profile**:","lastModifiedDate":"2020-05-23"},{"lineNumber":263,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":264,"author":{"gitId":"wallacexuhanxiao"},"content":"* is an educator working with the education of primary / secondary students ","lastModifiedDate":"2024-02-28"},{"lineNumber":265,"author":{"gitId":"wallacexuhanxiao"},"content":"* require fast and organized access to students\u0027 and parents\u0027 contact detail ","lastModifiedDate":"2024-02-28"},{"lineNumber":266,"author":{"gitId":"wallacexuhanxiao"},"content":"* have many students\u0027 information to manage ","lastModifiedDate":"2024-02-28"},{"lineNumber":267,"author":{"gitId":"-"},"content":"* prefer desktop apps over other types","lastModifiedDate":"2020-05-23"},{"lineNumber":268,"author":{"gitId":"-"},"content":"* can type fast","lastModifiedDate":"2020-05-23"},{"lineNumber":269,"author":{"gitId":"-"},"content":"* prefers typing to mouse interactions","lastModifiedDate":"2020-05-26"},{"lineNumber":270,"author":{"gitId":"-"},"content":"* is reasonably comfortable using CLI apps","lastModifiedDate":"2020-05-23"},{"lineNumber":271,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":272,"author":{"gitId":"wallacexuhanxiao"},"content":"**Value proposition**: Provide fast and organized access to students’ and parents’ contact details for the educator across multiple classes with large class sizes.","lastModifiedDate":"2024-02-28"},{"lineNumber":273,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":274,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":275,"author":{"gitId":"-"},"content":"### User stories","lastModifiedDate":"2020-06-07"},{"lineNumber":276,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":277,"author":{"gitId":"-"},"content":"Priorities: High (must have) - `* * *`, Medium (nice to have) - `* *`, Low (unlikely to have) - `*`","lastModifiedDate":"2020-05-23"},{"lineNumber":278,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":279,"author":{"gitId":"-"},"content":"| Priority | As a …​ | I want to …​ | So that I can…​ |","lastModifiedDate":"2020-05-23"},{"lineNumber":280,"author":{"gitId":"-"},"content":"| -------- | ------------------------------------------ | ------------------------------ | ---------------------------------------------------------------------- |","lastModifiedDate":"2020-05-23"},{"lineNumber":281,"author":{"gitId":"-"},"content":"| `* * *` | new user | see usage instructions | refer to instructions when I forget how to use the App |","lastModifiedDate":"2020-05-23"},{"lineNumber":282,"author":{"gitId":"wallacexuhanxiao"},"content":"| `* * *` | teacher | view student and his/her parents’ contact records fully | contact them when needed. |","lastModifiedDate":"2024-02-28"},{"lineNumber":283,"author":{"gitId":"wallacexuhanxiao"},"content":"|`* * *` | teacher | easily update students’ contact records via their ID |track students’ latest contact information|","lastModifiedDate":"2024-02-28"},{"lineNumber":284,"author":{"gitId":"wallacexuhanxiao"},"content":"| `* * *` | teacher | delete student contact records | remove unnecessary data when a student graduates / drops out |","lastModifiedDate":"2024-02-28"},{"lineNumber":285,"author":{"gitId":"wallacexuhanxiao"},"content":"| `* * *` | teacher | easily identify duplicate entries | make sure there is no repetition of student records|","lastModifiedDate":"2024-02-28"},{"lineNumber":286,"author":{"gitId":"wallacexuhanxiao"},"content":"| `* *` | teacher | tag my students | find them easily|","lastModifiedDate":"2024-02-28"},{"lineNumber":287,"author":{"gitId":"wallacexuhanxiao"},"content":"| `* *` | administrator | delete all student info in one go| delete the whole class in one command after each semester|","lastModifiedDate":"2024-02-28"},{"lineNumber":288,"author":{"gitId":"wallacexuhanxiao"},"content":"| `* *` | expert teacher user | search for students by tags | view each class/CCA/tutoring group I am in charge of at a glance |","lastModifiedDate":"2024-02-28"},{"lineNumber":289,"author":{"gitId":"wallacexuhanxiao"},"content":"| `* *` | teacher | search for students by name | find specific student\u0027s information by their name |","lastModifiedDate":"2024-02-28"},{"lineNumber":290,"author":{"gitId":"wallacexuhanxiao"},"content":"| `* *` | teacher | search for students by id | find specific students by their unique student id |","lastModifiedDate":"2024-02-28"},{"lineNumber":291,"author":{"gitId":"wallacexuhanxiao"},"content":"| `* *` | busy teacher (teaching multiple subjects at once) | obtain class lists per class easily||","lastModifiedDate":"2024-02-28"},{"lineNumber":292,"author":{"gitId":"wallacexuhanxiao"},"content":"| `* *` | teacher | view my class roster at a glance| |","lastModifiedDate":"2024-02-28"},{"lineNumber":293,"author":{"gitId":"wallacexuhanxiao"},"content":"| `* *` | careful teacher | back up my students’ information| avoid losing any student\u0027s information|","lastModifiedDate":"2024-02-28"},{"lineNumber":294,"author":{"gitId":"wallacexuhanxiao"},"content":"| `* *` | school staff member |export contact lists for emergency purposes| ensure student safety in case of emergencies |","lastModifiedDate":"2024-02-28"},{"lineNumber":295,"author":{"gitId":"wallacexuhanxiao"},"content":"| `* *` | careless (but fast typing) teacher | run the command with some minor typo | use the application with greater ease|","lastModifiedDate":"2024-02-28"},{"lineNumber":296,"author":{"gitId":"wallacexuhanxiao"},"content":"| `* *`| forgetful teacher | add notes or additional information to each student | remember important details about them |","lastModifiedDate":"2024-02-28"},{"lineNumber":297,"author":{"gitId":"wallacexuhanxiao"},"content":"| `*` | careless teacher | undo my previous command | avoid making mistake like delete the wrong student | ","lastModifiedDate":"2024-02-28"},{"lineNumber":298,"author":{"gitId":"wallacexuhanxiao"},"content":"| `* ` | teacher | mark students’ attendance for each class session| |","lastModifiedDate":"2024-02-28"},{"lineNumber":299,"author":{"gitId":"wallacexuhanxiao"},"content":"| `* ` | teacher | set reminders for events such as parent-teacher/student-teacher meetings| I don\u0027t miss any important appointments|","lastModifiedDate":"2024-02-28"},{"lineNumber":300,"author":{"gitId":"wallacexuhanxiao"},"content":"| `*` | teacher | utilize the application to understand the geographic distribution of my students | planning school trips or outreach programs |","lastModifiedDate":"2024-02-28"},{"lineNumber":301,"author":{"gitId":"wallacexuhanxiao"},"content":"","lastModifiedDate":"2024-02-28"},{"lineNumber":302,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":303,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":304,"author":{"gitId":"-"},"content":"### Use cases","lastModifiedDate":"2020-06-07"},{"lineNumber":305,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":306,"author":{"gitId":"wallacexuhanxiao"},"content":"(For all use cases below, the **System** is the `PedagoguePages` and the **Actor** is the `teacher`, unless specified otherwise)","lastModifiedDate":"2024-02-28"},{"lineNumber":307,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":308,"author":{"gitId":"wallacexuhanxiao"},"content":"**Use case: View the usage help list**","lastModifiedDate":"2024-02-28"},{"lineNumber":309,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":310,"author":{"gitId":"-"},"content":"**MSS**","lastModifiedDate":"2020-05-23"},{"lineNumber":311,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":312,"author":{"gitId":"wallacexuhanxiao"},"content":"1. Teacher requests to view the user guide of PedagoguePages","lastModifiedDate":"2024-02-28"},{"lineNumber":313,"author":{"gitId":"wallacexuhanxiao"},"content":"2. PedagoguePages shows the user guide to teacher","lastModifiedDate":"2024-02-28"},{"lineNumber":314,"author":{"gitId":"wallacexuhanxiao"},"content":"","lastModifiedDate":"2024-02-28"},{"lineNumber":315,"author":{"gitId":"wallacexuhanxiao"},"content":" Use case ends.","lastModifiedDate":"2024-02-28"},{"lineNumber":316,"author":{"gitId":"wallacexuhanxiao"},"content":"","lastModifiedDate":"2024-02-28"},{"lineNumber":317,"author":{"gitId":"wallacexuhanxiao"},"content":"","lastModifiedDate":"2024-02-28"},{"lineNumber":318,"author":{"gitId":"wallacexuhanxiao"},"content":"**Use case: View the student list**","lastModifiedDate":"2024-02-28"},{"lineNumber":319,"author":{"gitId":"wallacexuhanxiao"},"content":"","lastModifiedDate":"2024-02-28"},{"lineNumber":320,"author":{"gitId":"wallacexuhanxiao"},"content":"**MSS**","lastModifiedDate":"2024-02-28"},{"lineNumber":321,"author":{"gitId":"wallacexuhanxiao"},"content":"","lastModifiedDate":"2024-02-28"},{"lineNumber":322,"author":{"gitId":"wallacexuhanxiao"},"content":"1. Teacher requests to view all the info in PedagoguePages","lastModifiedDate":"2024-02-28"},{"lineNumber":323,"author":{"gitId":"wallacexuhanxiao"},"content":"2. PedagoguePages shows a list of students\u0027 info","lastModifiedDate":"2024-02-28"},{"lineNumber":324,"author":{"gitId":"wallacexuhanxiao"},"content":"","lastModifiedDate":"2024-02-28"},{"lineNumber":325,"author":{"gitId":"wallacexuhanxiao"},"content":" Use case ends.","lastModifiedDate":"2024-02-28"},{"lineNumber":326,"author":{"gitId":"wallacexuhanxiao"},"content":"","lastModifiedDate":"2024-02-28"},{"lineNumber":327,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2024-02-28"},{"lineNumber":328,"author":{"gitId":"wallacexuhanxiao"},"content":"**Use case: Delete a student**","lastModifiedDate":"2024-02-28"},{"lineNumber":329,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2024-02-28"},{"lineNumber":330,"author":{"gitId":"-"},"content":"**MSS**","lastModifiedDate":"2024-02-28"},{"lineNumber":331,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2024-02-28"},{"lineNumber":332,"author":{"gitId":"wallacexuhanxiao"},"content":"1. Teacher requests to find a student by his name","lastModifiedDate":"2024-02-28"},{"lineNumber":333,"author":{"gitId":"wallacexuhanxiao"},"content":"2. PedagoguePages shows a list of matched students","lastModifiedDate":"2024-02-28"},{"lineNumber":334,"author":{"gitId":"wallacexuhanxiao"},"content":"3. Teacher requests to delete a specific person in the list","lastModifiedDate":"2024-02-28"},{"lineNumber":335,"author":{"gitId":"wallacexuhanxiao"},"content":"4. PedagoguePages deletes the person","lastModifiedDate":"2024-02-28"},{"lineNumber":336,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2024-02-28"},{"lineNumber":337,"author":{"gitId":"-"},"content":" Use case ends.","lastModifiedDate":"2024-02-28"},{"lineNumber":338,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2024-02-28"},{"lineNumber":339,"author":{"gitId":"-"},"content":"**Extensions**","lastModifiedDate":"2024-02-28"},{"lineNumber":340,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2024-02-28"},{"lineNumber":341,"author":{"gitId":"-"},"content":"* 2a. The list is empty.","lastModifiedDate":"2024-02-28"},{"lineNumber":342,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2024-02-28"},{"lineNumber":343,"author":{"gitId":"-"},"content":" Use case ends.","lastModifiedDate":"2024-02-28"},{"lineNumber":344,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2024-02-28"},{"lineNumber":345,"author":{"gitId":"wallacexuhanxiao"},"content":"* 3a. The given student_id is invalid.","lastModifiedDate":"2024-02-28"},{"lineNumber":346,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2024-02-28"},{"lineNumber":347,"author":{"gitId":"wallacexuhanxiao"},"content":" * 3a1. PedagoguePages shows an error message.","lastModifiedDate":"2024-02-28"},{"lineNumber":348,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2024-02-28"},{"lineNumber":349,"author":{"gitId":"-"},"content":" Use case resumes at step 2.","lastModifiedDate":"2024-02-28"},{"lineNumber":350,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2024-02-28"},{"lineNumber":351,"author":{"gitId":"wallacexuhanxiao"},"content":"**Use case: Add a student**","lastModifiedDate":"2024-02-28"},{"lineNumber":352,"author":{"gitId":"wallacexuhanxiao"},"content":"","lastModifiedDate":"2024-02-28"},{"lineNumber":353,"author":{"gitId":"wallacexuhanxiao"},"content":"**MSS**","lastModifiedDate":"2024-02-28"},{"lineNumber":354,"author":{"gitId":"wallacexuhanxiao"},"content":"","lastModifiedDate":"2024-02-28"},{"lineNumber":355,"author":{"gitId":"wallacexuhanxiao"},"content":"1. Teacher enter the student info","lastModifiedDate":"2024-02-28"},{"lineNumber":356,"author":{"gitId":"wallacexuhanxiao"},"content":"2. PedagoguePages shows a success message and add the student\u0027s info","lastModifiedDate":"2024-02-28"},{"lineNumber":357,"author":{"gitId":"wallacexuhanxiao"},"content":"","lastModifiedDate":"2024-02-28"},{"lineNumber":358,"author":{"gitId":"wallacexuhanxiao"},"content":" Use case ends.","lastModifiedDate":"2024-02-28"},{"lineNumber":359,"author":{"gitId":"wallacexuhanxiao"},"content":"","lastModifiedDate":"2024-02-28"},{"lineNumber":360,"author":{"gitId":"wallacexuhanxiao"},"content":"**Extensions**","lastModifiedDate":"2024-02-28"},{"lineNumber":361,"author":{"gitId":"wallacexuhanxiao"},"content":"","lastModifiedDate":"2024-02-28"},{"lineNumber":362,"author":{"gitId":"wallacexuhanxiao"},"content":"* 2a. Teacher enter a invalid command.","lastModifiedDate":"2024-02-28"},{"lineNumber":363,"author":{"gitId":"wallacexuhanxiao"},"content":" * 2a1. PedagoguePages shows an error message and give a hint.","lastModifiedDate":"2024-02-28"},{"lineNumber":364,"author":{"gitId":"wallacexuhanxiao"},"content":" ","lastModifiedDate":"2024-02-28"},{"lineNumber":365,"author":{"gitId":"wallacexuhanxiao"},"content":" Use case ends.","lastModifiedDate":"2024-02-28"},{"lineNumber":366,"author":{"gitId":"wallacexuhanxiao"},"content":"","lastModifiedDate":"2024-02-28"},{"lineNumber":367,"author":{"gitId":"wallacexuhanxiao"},"content":"","lastModifiedDate":"2024-02-28"},{"lineNumber":368,"author":{"gitId":"wallacexuhanxiao"},"content":"**Use case: Update the info of a student**","lastModifiedDate":"2024-02-28"},{"lineNumber":369,"author":{"gitId":"wallacexuhanxiao"},"content":"","lastModifiedDate":"2024-02-28"},{"lineNumber":370,"author":{"gitId":"wallacexuhanxiao"},"content":"**MSS**","lastModifiedDate":"2024-02-28"},{"lineNumber":371,"author":{"gitId":"wallacexuhanxiao"},"content":"","lastModifiedDate":"2024-02-28"},{"lineNumber":372,"author":{"gitId":"wallacexuhanxiao"},"content":"1. Teacher requests to find a student by his name","lastModifiedDate":"2024-02-28"},{"lineNumber":373,"author":{"gitId":"wallacexuhanxiao"},"content":"2. PedagoguePages shows a list of matched students","lastModifiedDate":"2024-02-28"},{"lineNumber":374,"author":{"gitId":"wallacexuhanxiao"},"content":"3. Teacher requests to update the info of a specific person in the list","lastModifiedDate":"2024-02-28"},{"lineNumber":375,"author":{"gitId":"wallacexuhanxiao"},"content":"4. PedagoguePages update the info for the student","lastModifiedDate":"2024-02-28"},{"lineNumber":376,"author":{"gitId":"-"},"content":" ","lastModifiedDate":"2020-05-23"},{"lineNumber":377,"author":{"gitId":"-"},"content":" Use case ends.","lastModifiedDate":"2020-05-23"},{"lineNumber":378,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":379,"author":{"gitId":"-"},"content":"**Extensions**","lastModifiedDate":"2020-05-23"},{"lineNumber":380,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":381,"author":{"gitId":"-"},"content":"* 2a. The list is empty.","lastModifiedDate":"2020-05-23"},{"lineNumber":382,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":383,"author":{"gitId":"-"},"content":" Use case ends.","lastModifiedDate":"2020-05-23"},{"lineNumber":384,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":385,"author":{"gitId":"wallacexuhanxiao"},"content":"* 3a. The given student_id is invalid.","lastModifiedDate":"2024-02-28"},{"lineNumber":386,"author":{"gitId":"wallacexuhanxiao"},"content":"","lastModifiedDate":"2024-02-28"},{"lineNumber":387,"author":{"gitId":"wallacexuhanxiao"},"content":" * 3a1. PedagoguePages shows an error message.","lastModifiedDate":"2024-02-28"},{"lineNumber":388,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":389,"author":{"gitId":"wallacexuhanxiao"},"content":" Use case resumes at step 2.","lastModifiedDate":"2024-02-28"},{"lineNumber":390,"author":{"gitId":"wallacexuhanxiao"},"content":" ","lastModifiedDate":"2024-02-28"},{"lineNumber":391,"author":{"gitId":"wallacexuhanxiao"},"content":"* 3b. The updated field is in a wrong format","lastModifiedDate":"2024-02-28"},{"lineNumber":392,"author":{"gitId":"wallacexuhanxiao"},"content":" * 3b1. PedagoguePages shows an error message.","lastModifiedDate":"2024-03-04"},{"lineNumber":393,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":394,"author":{"gitId":"-"},"content":" Use case resumes at step 2.","lastModifiedDate":"2020-05-23"},{"lineNumber":395,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":396,"author":{"gitId":"wallacexuhanxiao"},"content":"**Use case: find a group of a students by tag**","lastModifiedDate":"2024-02-28"},{"lineNumber":397,"author":{"gitId":"wallacexuhanxiao"},"content":"","lastModifiedDate":"2024-02-28"},{"lineNumber":398,"author":{"gitId":"wallacexuhanxiao"},"content":"**MSS**","lastModifiedDate":"2024-02-28"},{"lineNumber":399,"author":{"gitId":"wallacexuhanxiao"},"content":"","lastModifiedDate":"2024-02-28"},{"lineNumber":400,"author":{"gitId":"wallacexuhanxiao"},"content":"1. Teacher requests to find a group of students by specific tag","lastModifiedDate":"2024-02-28"},{"lineNumber":401,"author":{"gitId":"wallacexuhanxiao"},"content":"2. PedagoguePages shows a list of matched students","lastModifiedDate":"2024-02-28"},{"lineNumber":402,"author":{"gitId":"wallacexuhanxiao"},"content":"","lastModifiedDate":"2024-02-28"},{"lineNumber":403,"author":{"gitId":"wallacexuhanxiao"},"content":" Use case ends.","lastModifiedDate":"2024-02-28"},{"lineNumber":404,"author":{"gitId":"wallacexuhanxiao"},"content":"","lastModifiedDate":"2024-02-28"},{"lineNumber":405,"author":{"gitId":"wallacexuhanxiao"},"content":"**Extensions**","lastModifiedDate":"2024-03-04"},{"lineNumber":406,"author":{"gitId":"wallacexuhanxiao"},"content":"","lastModifiedDate":"2024-03-04"},{"lineNumber":407,"author":{"gitId":"wallacexuhanxiao"},"content":"* 2a. The tag is invalid","lastModifiedDate":"2024-03-04"},{"lineNumber":408,"author":{"gitId":"wallacexuhanxiao"},"content":" * 2a1. PedagoguePages shows an error message.","lastModifiedDate":"2024-03-04"},{"lineNumber":409,"author":{"gitId":"wallacexuhanxiao"},"content":"","lastModifiedDate":"2024-03-04"},{"lineNumber":410,"author":{"gitId":"wallacexuhanxiao"},"content":" Use case ends.","lastModifiedDate":"2024-03-04"},{"lineNumber":411,"author":{"gitId":"wallacexuhanxiao"},"content":"","lastModifiedDate":"2024-03-04"},{"lineNumber":412,"author":{"gitId":"wallacexuhanxiao"},"content":"**Use case: find a specific student by name**","lastModifiedDate":"2024-02-28"},{"lineNumber":413,"author":{"gitId":"wallacexuhanxiao"},"content":"","lastModifiedDate":"2024-02-28"},{"lineNumber":414,"author":{"gitId":"wallacexuhanxiao"},"content":"**MSS**","lastModifiedDate":"2024-02-28"},{"lineNumber":415,"author":{"gitId":"wallacexuhanxiao"},"content":"","lastModifiedDate":"2024-02-28"},{"lineNumber":416,"author":{"gitId":"wallacexuhanxiao"},"content":"1. Teacher requests to find a student by student\u0027s name","lastModifiedDate":"2024-02-28"},{"lineNumber":417,"author":{"gitId":"wallacexuhanxiao"},"content":"2. PedagoguePages shows a list of matched students","lastModifiedDate":"2024-02-28"},{"lineNumber":418,"author":{"gitId":"wallacexuhanxiao"},"content":"3. Teacher select the student from the list","lastModifiedDate":"2024-02-28"},{"lineNumber":419,"author":{"gitId":"wallacexuhanxiao"},"content":"","lastModifiedDate":"2024-02-28"},{"lineNumber":420,"author":{"gitId":"wallacexuhanxiao"},"content":" Use case ends.","lastModifiedDate":"2024-02-28"},{"lineNumber":421,"author":{"gitId":"wallacexuhanxiao"},"content":" ","lastModifiedDate":"2024-02-28"},{"lineNumber":422,"author":{"gitId":"wallacexuhanxiao"},"content":"**Extensions**","lastModifiedDate":"2024-02-28"},{"lineNumber":423,"author":{"gitId":"wallacexuhanxiao"},"content":"","lastModifiedDate":"2024-02-28"},{"lineNumber":424,"author":{"gitId":"wallacexuhanxiao"},"content":"* 2a. The list is empty.","lastModifiedDate":"2024-02-28"},{"lineNumber":425,"author":{"gitId":"wallacexuhanxiao"},"content":"","lastModifiedDate":"2024-02-28"},{"lineNumber":426,"author":{"gitId":"wallacexuhanxiao"},"content":" Use case ends.","lastModifiedDate":"2024-02-28"},{"lineNumber":427,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":428,"author":{"gitId":"-"},"content":"### Non-Functional Requirements","lastModifiedDate":"2020-05-23"},{"lineNumber":429,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":430,"author":{"gitId":"-"},"content":"1. Should work on any _mainstream OS_ as long as it has Java `11` or above installed.","lastModifiedDate":"2020-05-23"},{"lineNumber":431,"author":{"gitId":"-"},"content":"2. Should be able to hold up to 1000 persons without a noticeable sluggishness in performance for typical usage.","lastModifiedDate":"2020-05-23"},{"lineNumber":432,"author":{"gitId":"-"},"content":"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.","lastModifiedDate":"2020-05-23"},{"lineNumber":433,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":434,"author":{"gitId":"-"},"content":"*{More to be added}*","lastModifiedDate":"2020-05-23"},{"lineNumber":435,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":436,"author":{"gitId":"-"},"content":"### Glossary","lastModifiedDate":"2020-05-23"},{"lineNumber":437,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":438,"author":{"gitId":"-"},"content":"* **Mainstream OS**: Windows, Linux, Unix, MacOS","lastModifiedDate":"2024-02-09"},{"lineNumber":439,"author":{"gitId":"-"},"content":"* **Private contact detail**: A contact detail that is not meant to be shared with others","lastModifiedDate":"2020-05-23"},{"lineNumber":440,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":441,"author":{"gitId":"-"},"content":"--------------------------------------------------------------------------------------------------------------------","lastModifiedDate":"2020-05-23"},{"lineNumber":442,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":443,"author":{"gitId":"-"},"content":"## **Appendix: Instructions for manual testing**","lastModifiedDate":"2020-05-23"},{"lineNumber":444,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":445,"author":{"gitId":"-"},"content":"Given below are instructions to test the app manually.","lastModifiedDate":"2020-05-23"},{"lineNumber":446,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":447,"author":{"gitId":"-"},"content":"\u003cdiv markdown\u003d\"span\" class\u003d\"alert alert-info\"\u003e:information_source: **Note:** These instructions only provide a starting point for testers to work on;","lastModifiedDate":"2020-05-23"},{"lineNumber":448,"author":{"gitId":"-"},"content":"testers are expected to do more *exploratory* testing.","lastModifiedDate":"2020-05-23"},{"lineNumber":449,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":450,"author":{"gitId":"-"},"content":"\u003c/div\u003e","lastModifiedDate":"2020-05-23"},{"lineNumber":451,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":452,"author":{"gitId":"-"},"content":"### Launch and shutdown","lastModifiedDate":"2020-05-23"},{"lineNumber":453,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":454,"author":{"gitId":"-"},"content":"1. Initial launch","lastModifiedDate":"2020-05-23"},{"lineNumber":455,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":456,"author":{"gitId":"-"},"content":" 1. Download the jar file and copy into an empty folder","lastModifiedDate":"2020-05-23"},{"lineNumber":457,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":458,"author":{"gitId":"-"},"content":" 1. Double-click the jar file Expected: Shows the GUI with a set of sample contacts. The window size may not be optimum.","lastModifiedDate":"2020-05-23"},{"lineNumber":459,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":460,"author":{"gitId":"-"},"content":"1. Saving window preferences","lastModifiedDate":"2020-05-23"},{"lineNumber":461,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":462,"author":{"gitId":"-"},"content":" 1. Resize the window to an optimum size. Move the window to a different location. Close the window.","lastModifiedDate":"2020-05-23"},{"lineNumber":463,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":464,"author":{"gitId":"-"},"content":" 1. Re-launch the app by double-clicking the jar file.\u003cbr\u003e","lastModifiedDate":"2020-05-23"},{"lineNumber":465,"author":{"gitId":"-"},"content":" Expected: The most recent window size and location is retained.","lastModifiedDate":"2020-05-23"},{"lineNumber":466,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":467,"author":{"gitId":"-"},"content":"1. _{ more test cases …​ }_","lastModifiedDate":"2020-05-23"},{"lineNumber":468,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":469,"author":{"gitId":"-"},"content":"### Deleting a person","lastModifiedDate":"2020-05-23"},{"lineNumber":470,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":471,"author":{"gitId":"-"},"content":"1. Deleting a person while all persons are being shown","lastModifiedDate":"2020-05-23"},{"lineNumber":472,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":473,"author":{"gitId":"-"},"content":" 1. Prerequisites: List all persons using the `list` command. Multiple persons in the list.","lastModifiedDate":"2020-05-23"},{"lineNumber":474,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":475,"author":{"gitId":"-"},"content":" 1. Test case: `delete 1`\u003cbr\u003e","lastModifiedDate":"2020-05-23"},{"lineNumber":476,"author":{"gitId":"-"},"content":" 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.","lastModifiedDate":"2020-05-23"},{"lineNumber":477,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":478,"author":{"gitId":"-"},"content":" 1. Test case: `delete 0`\u003cbr\u003e","lastModifiedDate":"2020-05-23"},{"lineNumber":479,"author":{"gitId":"-"},"content":" Expected: No person is deleted. Error details shown in the status message. Status bar remains the same.","lastModifiedDate":"2020-05-23"},{"lineNumber":480,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":481,"author":{"gitId":"-"},"content":" 1. Other incorrect delete commands to try: `delete`, `delete x`, `...` (where x is larger than the list size)\u003cbr\u003e","lastModifiedDate":"2020-05-23"},{"lineNumber":482,"author":{"gitId":"-"},"content":" Expected: Similar to previous.","lastModifiedDate":"2020-05-23"},{"lineNumber":483,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":484,"author":{"gitId":"-"},"content":"1. _{ more test cases …​ }_","lastModifiedDate":"2020-05-23"},{"lineNumber":485,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":486,"author":{"gitId":"-"},"content":"### Saving data","lastModifiedDate":"2020-05-23"},{"lineNumber":487,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":488,"author":{"gitId":"-"},"content":"1. Dealing with missing/corrupted data files","lastModifiedDate":"2020-05-23"},{"lineNumber":489,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":490,"author":{"gitId":"-"},"content":" 1. _{explain how to simulate a missing/corrupted file, and the expected behavior}_","lastModifiedDate":"2020-05-23"},{"lineNumber":491,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":492,"author":{"gitId":"-"},"content":"1. _{ more test cases …​ }_","lastModifiedDate":"2020-05-23"}],"authorContributionMap":{"wallacexuhanxiao":112,"-":380}},{"path":"docs/team/iamzhenhong.md","fileType":"docs","lines":[{"lineNumber":1,"author":{"gitId":"IamZhenHong"},"content":"# zhen hong \u0027s Project Portfolio Page","lastModifiedDate":"2024-03-07"}],"authorContributionMap":{"IamZhenHong":1}},{"path":"docs/team/j-wang-csma.md","fileType":"docs","lines":[{"lineNumber":1,"author":{"gitId":"J-wang-CSMA"},"content":"---","lastModifiedDate":"2024-02-28"},{"lineNumber":2,"author":{"gitId":"J-wang-CSMA"},"content":"layout: page","lastModifiedDate":"2024-02-28"},{"lineNumber":3,"author":{"gitId":"J-wang-CSMA"},"content":"title: Jeremy Wang\u0027s Project Portfolio Page","lastModifiedDate":"2024-02-28"},{"lineNumber":4,"author":{"gitId":"J-wang-CSMA"},"content":"---","lastModifiedDate":"2024-02-28"},{"lineNumber":5,"author":{"gitId":"J-wang-CSMA"},"content":"","lastModifiedDate":"2024-02-28"},{"lineNumber":6,"author":{"gitId":"J-wang-CSMA"},"content":"### Project: PedagoguePages","lastModifiedDate":"2024-02-28"},{"lineNumber":7,"author":{"gitId":"J-wang-CSMA"},"content":"","lastModifiedDate":"2024-02-28"},{"lineNumber":8,"author":{"gitId":"J-wang-CSMA"},"content":"PedagoguePages is a desktop address book application for teachers to manage their students\u0027 contact information.","lastModifiedDate":"2024-02-28"},{"lineNumber":9,"author":{"gitId":"J-wang-CSMA"},"content":"The user interacts with it using a CLI, and it has a GUI created with JavaFX.","lastModifiedDate":"2024-02-28"},{"lineNumber":10,"author":{"gitId":"J-wang-CSMA"},"content":"It is written in Java, and has about 10 kLoC.","lastModifiedDate":"2024-02-28"},{"lineNumber":11,"author":{"gitId":"J-wang-CSMA"},"content":"Given below are my contributions to the project.","lastModifiedDate":"2024-02-28"},{"lineNumber":12,"author":{"gitId":"J-wang-CSMA"},"content":"","lastModifiedDate":"2024-02-28"},{"lineNumber":13,"author":{"gitId":"J-wang-CSMA"},"content":"* **New Features**: ","lastModifiedDate":"2024-02-28"},{"lineNumber":14,"author":{"gitId":"J-wang-CSMA"},"content":"","lastModifiedDate":"2024-02-28"},{"lineNumber":15,"author":{"gitId":"J-wang-CSMA"},"content":"","lastModifiedDate":"2024-02-28"},{"lineNumber":16,"author":{"gitId":"J-wang-CSMA"},"content":"","lastModifiedDate":"2024-02-28"},{"lineNumber":17,"author":{"gitId":"J-wang-CSMA"},"content":"* **Code contributed**: [RepoSense link]()","lastModifiedDate":"2024-02-28"},{"lineNumber":18,"author":{"gitId":"J-wang-CSMA"},"content":"","lastModifiedDate":"2024-02-28"},{"lineNumber":19,"author":{"gitId":"J-wang-CSMA"},"content":"","lastModifiedDate":"2024-02-28"},{"lineNumber":20,"author":{"gitId":"J-wang-CSMA"},"content":"","lastModifiedDate":"2024-02-28"},{"lineNumber":21,"author":{"gitId":"J-wang-CSMA"},"content":"* **Project management**:","lastModifiedDate":"2024-02-28"},{"lineNumber":22,"author":{"gitId":"J-wang-CSMA"},"content":" * Managed releases: ","lastModifiedDate":"2024-02-28"},{"lineNumber":23,"author":{"gitId":"J-wang-CSMA"},"content":"","lastModifiedDate":"2024-02-28"},{"lineNumber":24,"author":{"gitId":"J-wang-CSMA"},"content":"","lastModifiedDate":"2024-02-28"},{"lineNumber":25,"author":{"gitId":"J-wang-CSMA"},"content":"* **Enhancements to existing features**:","lastModifiedDate":"2024-02-28"},{"lineNumber":26,"author":{"gitId":"J-wang-CSMA"},"content":"","lastModifiedDate":"2024-02-28"},{"lineNumber":27,"author":{"gitId":"J-wang-CSMA"},"content":"","lastModifiedDate":"2024-02-28"},{"lineNumber":28,"author":{"gitId":"J-wang-CSMA"},"content":"","lastModifiedDate":"2024-02-28"},{"lineNumber":29,"author":{"gitId":"J-wang-CSMA"},"content":"* **Documentation**:","lastModifiedDate":"2024-02-28"},{"lineNumber":30,"author":{"gitId":"J-wang-CSMA"},"content":" * User Guide:","lastModifiedDate":"2024-02-28"},{"lineNumber":31,"author":{"gitId":"J-wang-CSMA"},"content":" * Developer Guide:","lastModifiedDate":"2024-02-28"},{"lineNumber":32,"author":{"gitId":"J-wang-CSMA"},"content":"","lastModifiedDate":"2024-02-28"},{"lineNumber":33,"author":{"gitId":"J-wang-CSMA"},"content":"","lastModifiedDate":"2024-02-28"},{"lineNumber":34,"author":{"gitId":"J-wang-CSMA"},"content":"* **Community**:","lastModifiedDate":"2024-02-28"},{"lineNumber":35,"author":{"gitId":"J-wang-CSMA"},"content":"","lastModifiedDate":"2024-02-28"},{"lineNumber":36,"author":{"gitId":"J-wang-CSMA"},"content":"* **Tools**:","lastModifiedDate":"2024-02-28"},{"lineNumber":37,"author":{"gitId":"J-wang-CSMA"},"content":"","lastModifiedDate":"2024-02-28"}],"authorContributionMap":{"J-wang-CSMA":37}},{"path":"docs/team/ongzhili.md","fileType":"docs","lines":[{"lineNumber":1,"author":{"gitId":"ongzhili"},"content":"---","lastModifiedDate":"2024-02-28"},{"lineNumber":2,"author":{"gitId":"ongzhili"},"content":"layout: page","lastModifiedDate":"2024-02-28"},{"lineNumber":3,"author":{"gitId":"ongzhili"},"content":"title: John Doe\u0027s Project Portfolio Page","lastModifiedDate":"2024-02-28"},{"lineNumber":4,"author":{"gitId":"ongzhili"},"content":"---","lastModifiedDate":"2024-02-28"},{"lineNumber":5,"author":{"gitId":"ongzhili"},"content":"","lastModifiedDate":"2024-02-28"},{"lineNumber":6,"author":{"gitId":"ongzhili"},"content":"### Project: PedagogyPages","lastModifiedDate":"2024-02-28"},{"lineNumber":7,"author":{"gitId":"ongzhili"},"content":"","lastModifiedDate":"2024-02-28"},{"lineNumber":8,"author":{"gitId":"ongzhili"},"content":"PedagogyPages is a desktop address book","lastModifiedDate":"2024-02-28"},{"lineNumber":9,"author":{"gitId":"ongzhili"},"content":"application used for teachers to manage their students\u0027 contact information. ","lastModifiedDate":"2024-02-28"},{"lineNumber":10,"author":{"gitId":"ongzhili"},"content":"The user interacts with it using a CLI, and it has a GUI created with JavaFX. ","lastModifiedDate":"2024-02-28"},{"lineNumber":11,"author":{"gitId":"ongzhili"},"content":"It is written in Java, and has about 10 kLoC.","lastModifiedDate":"2024-02-28"},{"lineNumber":12,"author":{"gitId":"ongzhili"},"content":"","lastModifiedDate":"2024-02-28"},{"lineNumber":13,"author":{"gitId":"ongzhili"},"content":"Given below are my contributions to the project.","lastModifiedDate":"2024-02-28"},{"lineNumber":14,"author":{"gitId":"ongzhili"},"content":"","lastModifiedDate":"2024-02-28"},{"lineNumber":15,"author":{"gitId":"ongzhili"},"content":"* **Code contributed**: [RepoSense link]()","lastModifiedDate":"2024-02-28"},{"lineNumber":16,"author":{"gitId":"ongzhili"},"content":"","lastModifiedDate":"2024-02-28"},{"lineNumber":17,"author":{"gitId":"ongzhili"},"content":"* **Documentation**:","lastModifiedDate":"2024-02-28"},{"lineNumber":18,"author":{"gitId":"ongzhili"},"content":" * User Guide:","lastModifiedDate":"2024-02-28"},{"lineNumber":19,"author":{"gitId":"ongzhili"},"content":" * Updated AboutUs with own information","lastModifiedDate":"2024-02-28"},{"lineNumber":20,"author":{"gitId":"ongzhili"},"content":" * Added portfolio file (this file)","lastModifiedDate":"2024-02-28"}],"authorContributionMap":{"ongzhili":20}},{"path":"docs/team/wallacexuhanxiao.md","fileType":"docs","lines":[{"lineNumber":1,"author":{"gitId":"wallacexuhanxiao"},"content":"# Hanxiao\u0027s Project Portfolio Page","lastModifiedDate":"2024-02-28"}],"authorContributionMap":{"wallacexuhanxiao":1}}] diff --git a/AY2324S2-CS2103T-W10-3_tp_master/commits.json b/AY2324S2-CS2103T-W10-3_tp_master/commits.json index b4390bd3..9f7b730d 100644 --- a/AY2324S2-CS2103T-W10-3_tp_master/commits.json +++ b/AY2324S2-CS2103T-W10-3_tp_master/commits.json @@ -1 +1 @@ -{"authorDailyContributionsMap":{"IamZhenHong":[{"date":"2024-03-07","commitResults":[{"hash":"6c03658084af0e8f0dd45447382129947931c609","isMergeCommit":false,"messageTitle":"Update AboutUs","messageBody":"","fileTypesAndContributionMap":{"docs":{"insertions":8,"deletions":0}}},{"hash":"92f4e27d22a1d3538509fa7c939f7fdc34498503","isMergeCommit":true,"messageTitle":"Merge pull request #26 from IamZhenHong/Update-ZhenHong_AboutUs","messageBody":"Update AboutUs","fileTypesAndContributionMap":{}}]}],"ongzhili":[{"date":"2024-02-28","commitResults":[{"hash":"9385799409105c26b28c56cef388d382521797e8","isMergeCommit":false,"messageTitle":"Update AboutUs and add portfolio document","messageBody":"","fileTypesAndContributionMap":{"docs":{"insertions":25,"deletions":14}}},{"hash":"0d4d8dde6bc98ef5b9f7aa17b474ce30744715d5","isMergeCommit":true,"messageTitle":"Merge branch \u0027ongzhili-aboutus\u0027","messageBody":"","fileTypesAndContributionMap":{}},{"hash":"1cdca2a8236930177923a58a23db170bcbc34658","isMergeCommit":true,"messageTitle":"Merge branch \u0027master\u0027 of https://github.com/AY2324S2-CS2103T-W10-3/tp","messageBody":"","fileTypesAndContributionMap":{}},{"hash":"b92aa4cf1a7fa10d192874fa2ac256960bd5de86","isMergeCommit":true,"messageTitle":"Merge pull request #12 from ongzhili/master","messageBody":"Update Zhi Li\u0027s information and add porfolio document","fileTypesAndContributionMap":{}}]},{"date":"2024-03-04","commitResults":[{"hash":"02d00ce9d38c44b1adc0de95ab432b7302f15c4c","isMergeCommit":false,"messageTitle":"Update Readme and Ui mockup","messageBody":"","fileTypesAndContributionMap":{"docs":{"insertions":33,"deletions":11}}},{"hash":"7dba2bd9811194cec98ef1fd9ce0833fad676a8a","isMergeCommit":true,"messageTitle":"Merge branch \u0027ongzhili-readme\u0027","messageBody":"","fileTypesAndContributionMap":{}}]},{"date":"2024-03-06","commitResults":[{"hash":"303c97cc2458edc8079556dc5cc01c9dd4395790","isMergeCommit":true,"messageTitle":"Merge pull request #18 from wallacexuhanxiao/tutorial-adding-command","messageBody":"Trival commit to fullfil the task","fileTypesAndContributionMap":{}}]},{"date":"2024-03-07","commitResults":[{"hash":"256a9a93e5475c7d2cbb7909d48b4c99addb2aa5","isMergeCommit":false,"messageTitle":"Update ongzhili.PNG filename and corresponding references","messageBody":"","fileTypesAndContributionMap":{"docs":{"insertions":1,"deletions":1}}}]}],"wallacexuhanxiao":[{"date":"2024-02-24","commitResults":[{"hash":"c9f7c4d577bee6bc5230f9e5123d6cf4a1c9ba1c","isMergeCommit":false,"messageTitle":"Update README.md","messageBody":"","fileTypesAndContributionMap":{"docs":{"insertions":2,"deletions":0}}}]},{"date":"2024-02-28","commitResults":[{"hash":"919ecb18046289168a7eaf90c02cc309261b679e","isMergeCommit":false,"messageTitle":"Update about us for Hanxiao","messageBody":"","fileTypesAndContributionMap":{"docs":{"insertions":5,"deletions":4}}},{"hash":"4e09887f7596159395ec7d397e1df70dd84dc7ab","isMergeCommit":false,"messageTitle":"Fix minor bug","messageBody":"","fileTypesAndContributionMap":{"docs":{"insertions":1,"deletions":1}}},{"hash":"14a7036a7cfd60bd09d7909e394ceeb83a4715f6","isMergeCommit":true,"messageTitle":"Merge branch \u0027Update-Hanxiao_AboutUs\u0027","messageBody":"","fileTypesAndContributionMap":{}},{"hash":"b4a351ff43dd7d1c15719dbd263a1dff03179eae","isMergeCommit":true,"messageTitle":"Merge pull request #10 from wallacexuhanxiao/Update-Hanxiao_AboutUs","messageBody":"Update about us for Hanxiao","fileTypesAndContributionMap":{}},{"hash":"7296ae707a6d00ea992fc5fb17bb707e4fa7cfcd","isMergeCommit":true,"messageTitle":"Merge branch \u0027AY2324S2-CS2103T-W10-3:master\u0027 into master","messageBody":"","fileTypesAndContributionMap":{}},{"hash":"ed843ebaa8031e8fddb0f5b79e4dedd96ddb905c","isMergeCommit":false,"messageTitle":"Update developer guide","messageBody":"","fileTypesAndContributionMap":{"docs":{"insertions":25,"deletions":10}}},{"hash":"a62de54094445ca0bb6fd6bbb1ab57878a3c8e6f","isMergeCommit":false,"messageTitle":"Update use cases","messageBody":"","fileTypesAndContributionMap":{"docs":{"insertions":97,"deletions":9}}}]},{"date":"2024-03-04","commitResults":[{"hash":"26e9cbe6fde203eb0cadfa7e2c9bc010d337a048","isMergeCommit":false,"messageTitle":"Add extension on one of use case","messageBody":"","fileTypesAndContributionMap":{"docs":{"insertions":8,"deletions":1}}},{"hash":"210877125a8899c968f0feefa46e45ec780c1034","isMergeCommit":true,"messageTitle":"Merge pull request","messageBody":"Update user story and use case","fileTypesAndContributionMap":{}}]},{"date":"2024-03-05","commitResults":[{"hash":"d5d40cb05359c517c61ba677e2a7cbf6bfa6db0f","isMergeCommit":false,"messageTitle":"Trival commit to fullfil the task","messageBody":"","fileTypesAndContributionMap":{"docs":{"insertions":1,"deletions":1}}}]},{"date":"2024-03-06","commitResults":[{"hash":"a87b8b983aacee0240f60c9d434f0c849e3d38fe","isMergeCommit":false,"messageTitle":"Update AboutUs.md","messageBody":"","fileTypesAndContributionMap":{"docs":{"insertions":1,"deletions":1}}},{"hash":"cbfde2c3e413724d73c55a6c2a5a0d4f3e933392","isMergeCommit":true,"messageTitle":"Merge pull request #16 from ongzhili/master","messageBody":"Update README.md and Ui.png","fileTypesAndContributionMap":{}}]},{"date":"2024-03-07","commitResults":[{"hash":"f957dced0a7cb777b2322bcfadb664f8a055f0ed","isMergeCommit":false,"messageTitle":"Some minor update on about us","messageBody":"","fileTypesAndContributionMap":{"docs":{"insertions":2,"deletions":2}}},{"hash":"93ba48f6c63def592ca8bc686c7d0b435b43c726","isMergeCommit":true,"messageTitle":"Merge pull request #21 from wallacexuhanxiao/Clear-AB3","messageBody":"Clear AB3 on the website","fileTypesAndContributionMap":{}},{"hash":"33b24443ad46b16ef14f70d2e21108e2d16458e6","isMergeCommit":true,"messageTitle":"Merge pull request #27 from ongzhili/ongzhili-image-renaming","messageBody":"Update ongzhili.PNG filename and corresponding references","fileTypesAndContributionMap":{}}]}],"J-wang-CSMA":[{"date":"2024-02-28","commitResults":[{"hash":"6904df26d33ff50f462fe6761cea38f33bced0ee","isMergeCommit":false,"messageTitle":"Edit AboutUs page and add relevant documents","messageBody":"","fileTypesAndContributionMap":{"docs":{"insertions":49,"deletions":6}}},{"hash":"23c5fc971ff7b838b6ec07055f5931ea1b285465","isMergeCommit":false,"messageTitle":"Update project portfolio page","messageBody":"","fileTypesAndContributionMap":{"docs":{"insertions":4,"deletions":10}}},{"hash":"e045d19f119c818d5d636c633b1d4e17b1ea998e","isMergeCommit":true,"messageTitle":"Merge pull request #8 from J-wang-CSMA/branch-AboutUsJeremy","messageBody":"Edit AboutUs page and add relevant documents for J-Wang-CSMA","fileTypesAndContributionMap":{}}]}]},"authorFileTypeContributionMap":{"IamZhenHong":{"docs":5,"functional-code":0,"test-code":0},"ongzhili":{"docs":54,"functional-code":0,"test-code":0},"wallacexuhanxiao":{"docs":119,"functional-code":0,"test-code":0},"J-wang-CSMA":{"docs":43,"functional-code":0,"test-code":0}},"authorContributionVariance":{"IamZhenHong":4.244898,"ongzhili":210.35204,"wallacexuhanxiao":1508.883,"J-wang-CSMA":315.7807},"authorDisplayNameMap":{"IamZhenHong":"CS2103T-W10-3 SENG..HONG","ongzhili":"CS2103T-W10-3 ONG ..I LI","wallacexuhanxiao":"CS2103T-W10-3 XU H..XIAO","J-wang-CSMA":"CS2103T-W10-3 WANG..REMY"}} +{"authorDailyContributionsMap":{"IamZhenHong":[{"date":"2024-03-07","commitResults":[{"hash":"6c03658084af0e8f0dd45447382129947931c609","isMergeCommit":false,"messageTitle":"Update AboutUs","messageBody":"","fileTypesAndContributionMap":{"docs":{"insertions":8,"deletions":0}}},{"hash":"92f4e27d22a1d3538509fa7c939f7fdc34498503","isMergeCommit":true,"messageTitle":"Merge pull request #26 from IamZhenHong/Update-ZhenHong_AboutUs","messageBody":"Update AboutUs","fileTypesAndContributionMap":{}}]}],"ongzhili":[{"date":"2024-02-28","commitResults":[{"hash":"9385799409105c26b28c56cef388d382521797e8","isMergeCommit":false,"messageTitle":"Update AboutUs and add portfolio document","messageBody":"","fileTypesAndContributionMap":{"docs":{"insertions":25,"deletions":14}}},{"hash":"0d4d8dde6bc98ef5b9f7aa17b474ce30744715d5","isMergeCommit":true,"messageTitle":"Merge branch \u0027ongzhili-aboutus\u0027","messageBody":"","fileTypesAndContributionMap":{}},{"hash":"1cdca2a8236930177923a58a23db170bcbc34658","isMergeCommit":true,"messageTitle":"Merge branch \u0027master\u0027 of https://github.com/AY2324S2-CS2103T-W10-3/tp","messageBody":"","fileTypesAndContributionMap":{}},{"hash":"b92aa4cf1a7fa10d192874fa2ac256960bd5de86","isMergeCommit":true,"messageTitle":"Merge pull request #12 from ongzhili/master","messageBody":"Update Zhi Li\u0027s information and add porfolio document","fileTypesAndContributionMap":{}}]},{"date":"2024-03-04","commitResults":[{"hash":"02d00ce9d38c44b1adc0de95ab432b7302f15c4c","isMergeCommit":false,"messageTitle":"Update Readme and Ui mockup","messageBody":"","fileTypesAndContributionMap":{"docs":{"insertions":33,"deletions":11}}},{"hash":"7dba2bd9811194cec98ef1fd9ce0833fad676a8a","isMergeCommit":true,"messageTitle":"Merge branch \u0027ongzhili-readme\u0027","messageBody":"","fileTypesAndContributionMap":{}}]},{"date":"2024-03-06","commitResults":[{"hash":"303c97cc2458edc8079556dc5cc01c9dd4395790","isMergeCommit":true,"messageTitle":"Merge pull request #18 from wallacexuhanxiao/tutorial-adding-command","messageBody":"Trival commit to fullfil the task","fileTypesAndContributionMap":{}}]},{"date":"2024-03-07","commitResults":[{"hash":"256a9a93e5475c7d2cbb7909d48b4c99addb2aa5","isMergeCommit":false,"messageTitle":"Update ongzhili.PNG filename and corresponding references","messageBody":"","fileTypesAndContributionMap":{"docs":{"insertions":1,"deletions":1}}}]}],"wallacexuhanxiao":[{"date":"2024-02-24","commitResults":[{"hash":"c9f7c4d577bee6bc5230f9e5123d6cf4a1c9ba1c","isMergeCommit":false,"messageTitle":"Update README.md","messageBody":"","fileTypesAndContributionMap":{"docs":{"insertions":2,"deletions":0}}}]},{"date":"2024-02-28","commitResults":[{"hash":"919ecb18046289168a7eaf90c02cc309261b679e","isMergeCommit":false,"messageTitle":"Update about us for Hanxiao","messageBody":"","fileTypesAndContributionMap":{"docs":{"insertions":5,"deletions":4}}},{"hash":"4e09887f7596159395ec7d397e1df70dd84dc7ab","isMergeCommit":false,"messageTitle":"Fix minor bug","messageBody":"","fileTypesAndContributionMap":{"docs":{"insertions":1,"deletions":1}}},{"hash":"14a7036a7cfd60bd09d7909e394ceeb83a4715f6","isMergeCommit":true,"messageTitle":"Merge branch \u0027Update-Hanxiao_AboutUs\u0027","messageBody":"","fileTypesAndContributionMap":{}},{"hash":"b4a351ff43dd7d1c15719dbd263a1dff03179eae","isMergeCommit":true,"messageTitle":"Merge pull request #10 from wallacexuhanxiao/Update-Hanxiao_AboutUs","messageBody":"Update about us for Hanxiao","fileTypesAndContributionMap":{}},{"hash":"7296ae707a6d00ea992fc5fb17bb707e4fa7cfcd","isMergeCommit":true,"messageTitle":"Merge branch \u0027AY2324S2-CS2103T-W10-3:master\u0027 into master","messageBody":"","fileTypesAndContributionMap":{}},{"hash":"ed843ebaa8031e8fddb0f5b79e4dedd96ddb905c","isMergeCommit":false,"messageTitle":"Update developer guide","messageBody":"","fileTypesAndContributionMap":{"docs":{"insertions":25,"deletions":10}}},{"hash":"a62de54094445ca0bb6fd6bbb1ab57878a3c8e6f","isMergeCommit":false,"messageTitle":"Update use cases","messageBody":"","fileTypesAndContributionMap":{"docs":{"insertions":97,"deletions":9}}}]},{"date":"2024-03-04","commitResults":[{"hash":"26e9cbe6fde203eb0cadfa7e2c9bc010d337a048","isMergeCommit":false,"messageTitle":"Add extension on one of use case","messageBody":"","fileTypesAndContributionMap":{"docs":{"insertions":8,"deletions":1}}},{"hash":"210877125a8899c968f0feefa46e45ec780c1034","isMergeCommit":true,"messageTitle":"Merge pull request","messageBody":"Update user story and use case","fileTypesAndContributionMap":{}}]},{"date":"2024-03-05","commitResults":[{"hash":"d5d40cb05359c517c61ba677e2a7cbf6bfa6db0f","isMergeCommit":false,"messageTitle":"Trival commit to fullfil the task","messageBody":"","fileTypesAndContributionMap":{"docs":{"insertions":1,"deletions":1}}}]},{"date":"2024-03-06","commitResults":[{"hash":"a87b8b983aacee0240f60c9d434f0c849e3d38fe","isMergeCommit":false,"messageTitle":"Update AboutUs.md","messageBody":"","fileTypesAndContributionMap":{"docs":{"insertions":1,"deletions":1}}},{"hash":"cbfde2c3e413724d73c55a6c2a5a0d4f3e933392","isMergeCommit":true,"messageTitle":"Merge pull request #16 from ongzhili/master","messageBody":"Update README.md and Ui.png","fileTypesAndContributionMap":{}}]},{"date":"2024-03-07","commitResults":[{"hash":"f957dced0a7cb777b2322bcfadb664f8a055f0ed","isMergeCommit":false,"messageTitle":"Some minor update on about us","messageBody":"","fileTypesAndContributionMap":{"docs":{"insertions":2,"deletions":2}}},{"hash":"93ba48f6c63def592ca8bc686c7d0b435b43c726","isMergeCommit":true,"messageTitle":"Merge pull request #21 from wallacexuhanxiao/Clear-AB3","messageBody":"Clear AB3 on the website","fileTypesAndContributionMap":{}},{"hash":"33b24443ad46b16ef14f70d2e21108e2d16458e6","isMergeCommit":true,"messageTitle":"Merge pull request #27 from ongzhili/ongzhili-image-renaming","messageBody":"Update ongzhili.PNG filename and corresponding references","fileTypesAndContributionMap":{}},{"hash":"f12928f714cd072675cf8838fbf3057933c25128","isMergeCommit":false,"messageTitle":"Delete john doe from about us","messageBody":"","fileTypesAndContributionMap":{"docs":{"insertions":0,"deletions":9}}}]},{"date":"2024-03-08","commitResults":[{"hash":"c45b029d4c092923e7dfd07b006dde9b7b229460","isMergeCommit":true,"messageTitle":"Merge pull request #31 from wallacexuhanxiao/Clear-Placeholder-Text","messageBody":"Clear placeholder text in about us","fileTypesAndContributionMap":{}},{"hash":"dce400cf4062c5b882131e8ed84b759fb74a1d80","isMergeCommit":false,"messageTitle":"Fix minor bug in aboutus","messageBody":"","fileTypesAndContributionMap":{"docs":{"insertions":4,"deletions":3}}},{"hash":"948814cba2d02fcc3ab661541d80b68d7338b347","isMergeCommit":false,"messageTitle":"Update AboutUs.md","messageBody":"Add new line at EOF","fileTypesAndContributionMap":{"docs":{"insertions":2,"deletions":1}}},{"hash":"d03a78a672d1b7005f259831dfad016037a94bc3","isMergeCommit":true,"messageTitle":"Merge pull request #33 from wallacexuhanxiao/Change-Aboutus","messageBody":"Fix minor bug in aboutus","fileTypesAndContributionMap":{}}]}],"J-wang-CSMA":[{"date":"2024-02-28","commitResults":[{"hash":"6904df26d33ff50f462fe6761cea38f33bced0ee","isMergeCommit":false,"messageTitle":"Edit AboutUs page and add relevant documents","messageBody":"","fileTypesAndContributionMap":{"docs":{"insertions":49,"deletions":6}}},{"hash":"23c5fc971ff7b838b6ec07055f5931ea1b285465","isMergeCommit":false,"messageTitle":"Update project portfolio page","messageBody":"","fileTypesAndContributionMap":{"docs":{"insertions":4,"deletions":10}}},{"hash":"e045d19f119c818d5d636c633b1d4e17b1ea998e","isMergeCommit":true,"messageTitle":"Merge pull request #8 from J-wang-CSMA/branch-AboutUsJeremy","messageBody":"Edit AboutUs page and add relevant documents for J-Wang-CSMA","fileTypesAndContributionMap":{}}]}]},"authorFileTypeContributionMap":{"IamZhenHong":{"docs":5,"functional-code":0,"test-code":0},"ongzhili":{"docs":54,"functional-code":0,"test-code":0},"wallacexuhanxiao":{"docs":121,"functional-code":0,"test-code":0},"J-wang-CSMA":{"docs":43,"functional-code":0,"test-code":0}},"authorContributionVariance":{"IamZhenHong":3.9822223,"ongzhili":198.62221,"wallacexuhanxiao":1403.9557,"J-wang-CSMA":296.2401},"authorDisplayNameMap":{"IamZhenHong":"CS2103T-W10-3 SENG..HONG","ongzhili":"CS2103T-W10-3 ONG ..I LI","wallacexuhanxiao":"CS2103T-W10-3 XU H..XIAO","J-wang-CSMA":"CS2103T-W10-3 WANG..REMY"}} diff --git a/AY2324S2-CS2103T-W11-1_tp_master/authorship.json b/AY2324S2-CS2103T-W11-1_tp_master/authorship.json index b95af596..6514c392 100644 --- a/AY2324S2-CS2103T-W11-1_tp_master/authorship.json +++ b/AY2324S2-CS2103T-W11-1_tp_master/authorship.json @@ -1 +1 @@ -[{"path":"README.md","fileType":"docs","lines":[{"lineNumber":1,"author":{"gitId":"jieqiboh"},"content":"[![Java CI](https://github.com/AY2324S2-CS2103T-W11-1/tp/actions/workflows/gradle.yml/badge.svg)](https://github.com/AY2324S2-CS2103T-W11-1/tp/actions/workflows/gradle.yml)","lastModifiedDate":"2024-03-05"},{"lineNumber":2,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":3,"author":{"gitId":"-"},"content":"![Ui](docs/images/Ui.png)","lastModifiedDate":"2020-05-23"},{"lineNumber":4,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":5,"author":{"gitId":"-"},"content":"* This is **a sample project for Software Engineering (SE) students**.\u003cbr\u003e","lastModifiedDate":"2020-05-23"},{"lineNumber":6,"author":{"gitId":"-"},"content":" Example usages:","lastModifiedDate":"2020-05-23"},{"lineNumber":7,"author":{"gitId":"-"},"content":" * as a starting point of a course project (as opposed to writing everything from scratch)","lastModifiedDate":"2020-05-23"},{"lineNumber":8,"author":{"gitId":"-"},"content":" * as a case study","lastModifiedDate":"2020-05-23"},{"lineNumber":9,"author":{"gitId":"-"},"content":"* The project simulates an ongoing software project for a desktop application (called _AddressBook_) used for managing contact details.","lastModifiedDate":"2020-05-23"},{"lineNumber":10,"author":{"gitId":"-"},"content":" * 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.","lastModifiedDate":"2020-05-23"},{"lineNumber":11,"author":{"gitId":"-"},"content":" * It comes with a **reasonable level of user and developer documentation**.","lastModifiedDate":"2020-05-23"},{"lineNumber":12,"author":{"gitId":"-"},"content":"* 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` ...).","lastModifiedDate":"2020-05-23"},{"lineNumber":13,"author":{"gitId":"-"},"content":"* For the detailed documentation of this project, see the **[Address Book Product Website](https://se-education.org/addressbook-level3)**.","lastModifiedDate":"2020-05-23"},{"lineNumber":14,"author":{"gitId":"-"},"content":"* 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.","lastModifiedDate":"2020-05-23"}],"authorContributionMap":{"jieqiboh":1,"-":13}},{"path":"docs/AboutUs.md","fileType":"docs","lines":[{"lineNumber":1,"author":{"gitId":"-"},"content":"---","lastModifiedDate":"2020-05-23"},{"lineNumber":2,"author":{"gitId":"-"},"content":"layout: page","lastModifiedDate":"2020-05-23"},{"lineNumber":3,"author":{"gitId":"-"},"content":"title: About Us","lastModifiedDate":"2020-05-23"},{"lineNumber":4,"author":{"gitId":"-"},"content":"---","lastModifiedDate":"2020-05-23"},{"lineNumber":5,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":6,"author":{"gitId":"-"},"content":"We are a team based in the [School of Computing, National University of Singapore](http://www.comp.nus.edu.sg).","lastModifiedDate":"2020-05-23"},{"lineNumber":7,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":8,"author":{"gitId":"jieqiboh"},"content":"You can reach us at the email `cs2103t_w11_1[at]comp.nus.edu.sg`","lastModifiedDate":"2024-02-29"},{"lineNumber":9,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-06-17"},{"lineNumber":10,"author":{"gitId":"-"},"content":"## Project team","lastModifiedDate":"2020-06-07"},{"lineNumber":11,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":12,"author":{"gitId":"HM33-Stu"},"content":"### Loh Jun Heng Donovan","lastModifiedDate":"2024-03-01"},{"lineNumber":13,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":14,"author":{"gitId":"HM33-Stu"},"content":"\u003cimg src\u003d\"images/captainkeqing.png\" width\u003d\"200px\"\u003e","lastModifiedDate":"2024-03-01"},{"lineNumber":15,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":16,"author":{"gitId":"-"},"content":"[[homepage](http://www.comp.nus.edu.sg/~damithch)]","lastModifiedDate":"2020-05-23"},{"lineNumber":17,"author":{"gitId":"HM33-Stu"},"content":"[[github](https://github.com/CaptainKeqing)]","lastModifiedDate":"2024-03-01"},{"lineNumber":18,"author":{"gitId":"HM33-Stu"},"content":"[[portfolio](team/captainkeqing.md)]","lastModifiedDate":"2024-03-01"},{"lineNumber":19,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":20,"author":{"gitId":"HM33-Stu"},"content":"* Role: Code Quality Manager","lastModifiedDate":"2024-03-01"},{"lineNumber":21,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":22,"author":{"gitId":"HM33-Stu"},"content":"### Hariprasath S/O R Mohan","lastModifiedDate":"2024-03-01"},{"lineNumber":23,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":24,"author":{"gitId":"HM33-Stu"},"content":"\u003cimg src\u003d\"images/hm33-stu.png\" width\u003d\"200px\"\u003e","lastModifiedDate":"2024-03-02"},{"lineNumber":25,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":26,"author":{"gitId":"HM33-Stu"},"content":"[[github](http://github.com/HM33-Stu)]","lastModifiedDate":"2024-03-01"},{"lineNumber":27,"author":{"gitId":"HM33-Stu"},"content":"[[portfolio](team/hm33-stu.md)]","lastModifiedDate":"2024-03-02"},{"lineNumber":28,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":29,"author":{"gitId":"HM33-Stu"},"content":"* Role: Documentation, Deliverables and Deadlines","lastModifiedDate":"2024-03-01"},{"lineNumber":30,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":31,"author":{"gitId":"LWS49"},"content":"### Wei Sheng","lastModifiedDate":"2024-03-02"},{"lineNumber":32,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":33,"author":{"gitId":"LWS49"},"content":"\u003cimg src\u003d\"images/lws49.png\" width\u003d\"200px\"\u003e","lastModifiedDate":"2024-03-02"},{"lineNumber":34,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":35,"author":{"gitId":"HM33-Stu"},"content":"[[github](http://github.com/LWS49)] ","lastModifiedDate":"2024-03-02"},{"lineNumber":36,"author":{"gitId":"HM33-Stu"},"content":"[[portfolio](team/lws49.md)]","lastModifiedDate":"2024-03-02"},{"lineNumber":37,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":38,"author":{"gitId":"LWS49"},"content":"* Role: Tech Lead, Scheduling and Tracking","lastModifiedDate":"2024-03-02"},{"lineNumber":39,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":40,"author":{"gitId":"LWS49"},"content":"### Boh Jie Qi","lastModifiedDate":"2024-03-02"},{"lineNumber":41,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":42,"author":{"gitId":"LWS49"},"content":"\u003cimg src\u003d\"images/jieqiboh.png\" width\u003d\"200px\"\u003e","lastModifiedDate":"2024-03-02"},{"lineNumber":43,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":44,"author":{"gitId":"LWS49"},"content":"[[github](https://github.com/jieqiboh)]","lastModifiedDate":"2024-03-02"},{"lineNumber":45,"author":{"gitId":"jieqiboh"},"content":"[[portfolio](team/jieqiboh)]","lastModifiedDate":"2024-02-29"},{"lineNumber":46,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":47,"author":{"gitId":"-"},"content":"* Role: Developer","lastModifiedDate":"2020-05-23"},{"lineNumber":48,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2024-03-02"},{"lineNumber":49,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":50,"author":{"gitId":"theman-oj10"},"content":"### Rajendran Ramesh Babu Manoj Narender","lastModifiedDate":"2024-03-02"},{"lineNumber":51,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":52,"author":{"gitId":"theman-oj10"},"content":"\u003cimg src\u003d\"images/theman-oj10.png\" width\u003d\"200px\"\u003e","lastModifiedDate":"2024-03-02"},{"lineNumber":53,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":54,"author":{"gitId":"theman-oj10"},"content":"[[github](http://github.com/theman-oj10)]","lastModifiedDate":"2024-03-02"},{"lineNumber":55,"author":{"gitId":"theman-oj10"},"content":"[[portfolio](team/theman-oj10.md)]","lastModifiedDate":"2024-03-02"},{"lineNumber":56,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":57,"author":{"gitId":"theman-oj10"},"content":"* Role: Integration, Testing","lastModifiedDate":"2024-03-02"}],"authorContributionMap":{"jieqiboh":2,"HM33-Stu":12,"LWS49":6,"theman-oj10":5,"-":32}},{"path":"docs/Configuration.md","fileType":"docs","lines":[{"lineNumber":1,"author":{"gitId":"-"},"content":"---","lastModifiedDate":"2020-06-07"},{"lineNumber":2,"author":{"gitId":"jieqiboh"},"content":"layout: page","lastModifiedDate":"2024-03-02"},{"lineNumber":3,"author":{"gitId":"jieqiboh"},"content":"title: Configuration guide","lastModifiedDate":"2024-03-02"},{"lineNumber":4,"author":{"gitId":"-"},"content":"---","lastModifiedDate":"2020-06-07"},{"lineNumber":5,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-06-07"},{"lineNumber":6,"author":{"gitId":"-"},"content":"Certain properties of the application can be controlled (e.g user preferences file location, logging level) through the configuration file (default: `config.json`).","lastModifiedDate":"2020-06-07"}],"authorContributionMap":{"jieqiboh":2,"-":4}},{"path":"docs/DevOps.md","fileType":"docs","lines":[{"lineNumber":1,"author":{"gitId":"-"},"content":"---","lastModifiedDate":"2020-05-23"},{"lineNumber":2,"author":{"gitId":"jieqiboh"},"content":"layout: page","lastModifiedDate":"2024-03-02"},{"lineNumber":3,"author":{"gitId":"jieqiboh"},"content":"title: DevOps guide","lastModifiedDate":"2024-03-02"},{"lineNumber":4,"author":{"gitId":"-"},"content":"---","lastModifiedDate":"2020-05-23"},{"lineNumber":5,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":6,"author":{"gitId":"jieqiboh"},"content":"* Table of Contents","lastModifiedDate":"2024-03-02"},{"lineNumber":7,"author":{"gitId":"jieqiboh"},"content":"{:toc}","lastModifiedDate":"2024-03-02"},{"lineNumber":8,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":9,"author":{"gitId":"jieqiboh"},"content":"--------------------------------------------------------------------------------------------------------------------","lastModifiedDate":"2024-03-02"},{"lineNumber":10,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":11,"author":{"gitId":"-"},"content":"## Build automation","lastModifiedDate":"2020-05-23"},{"lineNumber":12,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":13,"author":{"gitId":"-"},"content":"This project uses Gradle for **build automation and dependency management**. **You are recommended to read [this Gradle Tutorial from the se-edu/guides](https://se-education.org/guides/tutorials/gradle.html)**.","lastModifiedDate":"2020-06-07"},{"lineNumber":14,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-26"},{"lineNumber":15,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-26"},{"lineNumber":16,"author":{"gitId":"-"},"content":"Given below are how to use Gradle for some important project tasks.","lastModifiedDate":"2020-05-26"},{"lineNumber":17,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-26"},{"lineNumber":18,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-26"},{"lineNumber":19,"author":{"gitId":"-"},"content":"* **`clean`**: Deletes the files created during the previous build tasks (e.g. files in the `build` folder).\u003cbr\u003e","lastModifiedDate":"2020-05-26"},{"lineNumber":20,"author":{"gitId":"-"},"content":" e.g. `./gradlew clean`","lastModifiedDate":"2020-05-26"},{"lineNumber":21,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-26"},{"lineNumber":22,"author":{"gitId":"-"},"content":"* **`shadowJar`**: Uses the ShadowJar plugin to creat a fat JAR file in the `build/lib` folder, *if the current file is outdated*.\u003cbr\u003e","lastModifiedDate":"2020-05-26"},{"lineNumber":23,"author":{"gitId":"-"},"content":" e.g. `./gradlew shadowJar`.","lastModifiedDate":"2020-05-26"},{"lineNumber":24,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-26"},{"lineNumber":25,"author":{"gitId":"-"},"content":"* **`run`**: Builds and runs the application.\u003cbr\u003e","lastModifiedDate":"2020-05-26"},{"lineNumber":26,"author":{"gitId":"-"},"content":" **`runShadow`**: Builds the application as a fat JAR, and then runs it.","lastModifiedDate":"2020-05-26"},{"lineNumber":27,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-26"},{"lineNumber":28,"author":{"gitId":"-"},"content":"* **`checkstyleMain`**: Runs the code style check for the main code base.\u003cbr\u003e","lastModifiedDate":"2020-05-26"},{"lineNumber":29,"author":{"gitId":"-"},"content":" **`checkstyleTest`**: Runs the code style check for the test code base.","lastModifiedDate":"2020-05-26"},{"lineNumber":30,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-26"},{"lineNumber":31,"author":{"gitId":"-"},"content":"* **`test`**: Runs all tests.","lastModifiedDate":"2023-01-01"},{"lineNumber":32,"author":{"gitId":"-"},"content":" * `./gradlew test` — Runs all tests","lastModifiedDate":"2020-05-26"},{"lineNumber":33,"author":{"gitId":"-"},"content":" * `./gradlew clean test` — Cleans the project and runs tests","lastModifiedDate":"2020-05-26"},{"lineNumber":34,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":35,"author":{"gitId":"-"},"content":"--------------------------------------------------------------------------------------------------------------------","lastModifiedDate":"2020-05-23"},{"lineNumber":36,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":37,"author":{"gitId":"-"},"content":"## Continuous integration (CI)","lastModifiedDate":"2020-05-23"},{"lineNumber":38,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":39,"author":{"gitId":"-"},"content":"This project uses GitHub Actions for CI. The project comes with the necessary GitHub Actions configurations files (in the `.github/workflows` folder). No further setting up required.","lastModifiedDate":"2020-05-23"},{"lineNumber":40,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":41,"author":{"gitId":"-"},"content":"### Code coverage","lastModifiedDate":"2020-08-07"},{"lineNumber":42,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-08-07"},{"lineNumber":43,"author":{"gitId":"-"},"content":"As part of CI, this project uses Codecov to generate coverage reports. When CI runs, it will generate code coverage data (based on the tests run by CI) and upload that data to the CodeCov website, which in turn can provide you more info about the coverage of your tests.","lastModifiedDate":"2023-02-02"},{"lineNumber":44,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-08-07"},{"lineNumber":45,"author":{"gitId":"-"},"content":"However, because Codecov is known to run into intermittent problems (e.g., report upload fails) due to issues on the Codecov service side, the CI is configured to pass even if the Codecov task failed. Therefore, developers are advised to check the code coverage levels periodically and take corrective actions if the coverage level falls below desired levels.","lastModifiedDate":"2023-02-02"},{"lineNumber":46,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-08-07"},{"lineNumber":47,"author":{"gitId":"-"},"content":"To enable Codecov for forks of this project, follow the steps given in [this se-edu guide](https://se-education.org/guides/tutorials/codecov.html).","lastModifiedDate":"2023-02-02"},{"lineNumber":48,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2023-01-01"},{"lineNumber":49,"author":{"gitId":"-"},"content":"### Repository-wide checks","lastModifiedDate":"2020-07-28"},{"lineNumber":50,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-07-28"},{"lineNumber":51,"author":{"gitId":"-"},"content":"In addition to running Gradle checks, CI includes some repository-wide checks. Unlike the Gradle checks which only cover files used in the build process, these repository-wide checks cover all files in the repository. They check for repository rules which are hard to enforce on development machines such as line ending requirements.","lastModifiedDate":"2020-07-28"},{"lineNumber":52,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-07-28"},{"lineNumber":53,"author":{"gitId":"-"},"content":"These checks are implemented as POSIX shell scripts, and thus can only be run on POSIX-compliant operating systems such as macOS and Linux. To run all checks locally on these operating systems, execute the following in the repository root directory:","lastModifiedDate":"2020-07-28"},{"lineNumber":54,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-07-28"},{"lineNumber":55,"author":{"gitId":"-"},"content":"`./config/travis/run-checks.sh`","lastModifiedDate":"2020-07-28"},{"lineNumber":56,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-07-28"},{"lineNumber":57,"author":{"gitId":"-"},"content":"Any warnings or errors will be printed out to the console.","lastModifiedDate":"2020-07-28"},{"lineNumber":58,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-07-28"},{"lineNumber":59,"author":{"gitId":"-"},"content":"**If adding new checks:**","lastModifiedDate":"2020-07-28"},{"lineNumber":60,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-07-28"},{"lineNumber":61,"author":{"gitId":"-"},"content":"* Checks are implemented as executable `check-*` scripts within the `.github` directory. The `run-checks.sh` script will automatically pick up and run files named as such. That is, you can add more such files if you need and the CI will do the rest.","lastModifiedDate":"2020-07-28"},{"lineNumber":62,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-07-28"},{"lineNumber":63,"author":{"gitId":"-"},"content":"* Check scripts should print out errors in the format `SEVERITY:FILENAME:LINE: MESSAGE`","lastModifiedDate":"2020-07-28"},{"lineNumber":64,"author":{"gitId":"-"},"content":" * SEVERITY is either ERROR or WARN.","lastModifiedDate":"2020-07-28"},{"lineNumber":65,"author":{"gitId":"-"},"content":" * FILENAME is the path to the file relative to the current directory.","lastModifiedDate":"2020-07-28"},{"lineNumber":66,"author":{"gitId":"-"},"content":" * LINE is the line of the file where the error occurred and MESSAGE is the message explaining the error.","lastModifiedDate":"2020-07-28"},{"lineNumber":67,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-07-28"},{"lineNumber":68,"author":{"gitId":"-"},"content":"* Check scripts must exit with a non-zero exit code if any errors occur.","lastModifiedDate":"2020-07-28"},{"lineNumber":69,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-07-28"},{"lineNumber":70,"author":{"gitId":"-"},"content":"--------------------------------------------------------------------------------------------------------------------","lastModifiedDate":"2020-05-23"},{"lineNumber":71,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":72,"author":{"gitId":"-"},"content":"## Making a release","lastModifiedDate":"2020-05-23"},{"lineNumber":73,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":74,"author":{"gitId":"-"},"content":"Here are the steps to create a new release.","lastModifiedDate":"2020-05-23"},{"lineNumber":75,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":76,"author":{"gitId":"-"},"content":"1. Update the version number in [`MainApp.java`](https://github.com/se-edu/addressbook-level3/tree/master/src/main/java/seedu/address/MainApp.java).","lastModifiedDate":"2020-05-23"},{"lineNumber":77,"author":{"gitId":"-"},"content":"1. Generate a fat JAR file using Gradle (i.e., `gradlew shadowJar`).","lastModifiedDate":"2021-08-30"},{"lineNumber":78,"author":{"gitId":"-"},"content":"1. Tag the repo with the version number. e.g. `v0.1`","lastModifiedDate":"2020-05-23"},{"lineNumber":79,"author":{"gitId":"-"},"content":"1. [Create a new release using GitHub](https://help.github.com/articles/creating-releases/). Upload the JAR file you created.","lastModifiedDate":"2020-05-26"}],"authorContributionMap":{"jieqiboh":5,"-":74}},{"path":"docs/DeveloperGuide.md","fileType":"docs","lines":[{"lineNumber":1,"author":{"gitId":"-"},"content":"---","lastModifiedDate":"2020-05-23"},{"lineNumber":2,"author":{"gitId":"-"},"content":"layout: page","lastModifiedDate":"2020-05-23"},{"lineNumber":3,"author":{"gitId":"-"},"content":"title: Developer Guide","lastModifiedDate":"2020-05-23"},{"lineNumber":4,"author":{"gitId":"-"},"content":"---","lastModifiedDate":"2020-05-23"},{"lineNumber":5,"author":{"gitId":"-"},"content":"* Table of Contents","lastModifiedDate":"2020-05-23"},{"lineNumber":6,"author":{"gitId":"-"},"content":" {:toc}","lastModifiedDate":"2020-05-23"},{"lineNumber":7,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":8,"author":{"gitId":"-"},"content":"--------------------------------------------------------------------------------------------------------------------","lastModifiedDate":"2020-05-23"},{"lineNumber":9,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2021-07-30"},{"lineNumber":10,"author":{"gitId":"-"},"content":"## **Acknowledgements**","lastModifiedDate":"2021-07-30"},{"lineNumber":11,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2021-07-30"},{"lineNumber":12,"author":{"gitId":"-"},"content":"* {list here sources of all reused/adapted ideas, code, documentation, and third-party libraries -- include links to the original source as well}","lastModifiedDate":"2021-07-30"},{"lineNumber":13,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2021-07-30"},{"lineNumber":14,"author":{"gitId":"-"},"content":"--------------------------------------------------------------------------------------------------------------------","lastModifiedDate":"2021-07-30"},{"lineNumber":15,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":16,"author":{"gitId":"-"},"content":"## **Setting up, getting started**","lastModifiedDate":"2020-05-23"},{"lineNumber":17,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":18,"author":{"gitId":"-"},"content":"Refer to the guide [_Setting up and getting started_](SettingUp.md).","lastModifiedDate":"2020-05-23"},{"lineNumber":19,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":20,"author":{"gitId":"-"},"content":"--------------------------------------------------------------------------------------------------------------------","lastModifiedDate":"2020-05-23"},{"lineNumber":21,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":22,"author":{"gitId":"-"},"content":"## **Design**","lastModifiedDate":"2020-05-23"},{"lineNumber":23,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":24,"author":{"gitId":"-"},"content":"\u003cdiv markdown\u003d\"span\" class\u003d\"alert alert-primary\"\u003e","lastModifiedDate":"2021-07-31"},{"lineNumber":25,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":26,"author":{"gitId":"-"},"content":":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.","lastModifiedDate":"2023-09-03"},{"lineNumber":27,"author":{"gitId":"-"},"content":"\u003c/div\u003e","lastModifiedDate":"2021-07-31"},{"lineNumber":28,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":29,"author":{"gitId":"-"},"content":"### Architecture","lastModifiedDate":"2021-07-31"},{"lineNumber":30,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":31,"author":{"gitId":"-"},"content":"\u003cimg src\u003d\"images/ArchitectureDiagram.png\" width\u003d\"280\" /\u003e","lastModifiedDate":"2021-07-31"},{"lineNumber":32,"author":{"gitId":"LWS49"},"content":"c","lastModifiedDate":"2024-03-04"},{"lineNumber":33,"author":{"gitId":"-"},"content":"The ***Architecture Diagram*** given above explains the high-level design of the App.","lastModifiedDate":"2021-07-31"},{"lineNumber":34,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":35,"author":{"gitId":"-"},"content":"Given below is a quick overview of main components and how they interact with each other.","lastModifiedDate":"2021-07-31"},{"lineNumber":36,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2021-07-31"},{"lineNumber":37,"author":{"gitId":"-"},"content":"**Main components of the architecture**","lastModifiedDate":"2021-07-31"},{"lineNumber":38,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":39,"author":{"gitId":"-"},"content":"**`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.","lastModifiedDate":"2023-09-03"},{"lineNumber":40,"author":{"gitId":"-"},"content":"* At app launch, it initializes the other components in the correct sequence, and connects them up with each other.","lastModifiedDate":"2023-09-03"},{"lineNumber":41,"author":{"gitId":"-"},"content":"* At shut down, it shuts down the other components and invokes cleanup methods where necessary.","lastModifiedDate":"2023-09-03"},{"lineNumber":42,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":43,"author":{"gitId":"-"},"content":"The bulk of the app\u0027s work is done by the following four components:","lastModifiedDate":"2023-09-03"},{"lineNumber":44,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":45,"author":{"gitId":"-"},"content":"* [**`UI`**](#ui-component): The UI of the App.","lastModifiedDate":"2020-05-23"},{"lineNumber":46,"author":{"gitId":"-"},"content":"* [**`Logic`**](#logic-component): The command executor.","lastModifiedDate":"2020-05-23"},{"lineNumber":47,"author":{"gitId":"-"},"content":"* [**`Model`**](#model-component): Holds the data of the App in memory.","lastModifiedDate":"2020-05-23"},{"lineNumber":48,"author":{"gitId":"-"},"content":"* [**`Storage`**](#storage-component): Reads data from, and writes data to, the hard disk.","lastModifiedDate":"2020-05-23"},{"lineNumber":49,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":50,"author":{"gitId":"-"},"content":"[**`Commons`**](#common-classes) represents a collection of classes used by multiple other components.","lastModifiedDate":"2023-09-03"},{"lineNumber":51,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":52,"author":{"gitId":"-"},"content":"**How the architecture components interact with each other**","lastModifiedDate":"2020-05-23"},{"lineNumber":53,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":54,"author":{"gitId":"-"},"content":"The *Sequence Diagram* below shows how the components interact with each other for the scenario where the user issues the command `delete 1`.","lastModifiedDate":"2020-05-23"},{"lineNumber":55,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":56,"author":{"gitId":"-"},"content":"\u003cimg src\u003d\"images/ArchitectureSequenceDiagram.png\" width\u003d\"574\" /\u003e","lastModifiedDate":"2020-06-07"},{"lineNumber":57,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":58,"author":{"gitId":"-"},"content":"Each of the four main components (also shown in the diagram above),","lastModifiedDate":"2021-07-31"},{"lineNumber":59,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2021-07-31"},{"lineNumber":60,"author":{"gitId":"-"},"content":"* defines its *API* in an `interface` with the same name as the Component.","lastModifiedDate":"2021-07-31"},{"lineNumber":61,"author":{"gitId":"-"},"content":"* implements its functionality using a concrete `{Component Name}Manager` class (which follows the corresponding API `interface` mentioned in the previous point.","lastModifiedDate":"2021-07-31"},{"lineNumber":62,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2021-07-31"},{"lineNumber":63,"author":{"gitId":"-"},"content":"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\u0027s being coupled to the implementation of a component), as illustrated in the (partial) class diagram below.","lastModifiedDate":"2021-07-31"},{"lineNumber":64,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2021-07-31"},{"lineNumber":65,"author":{"gitId":"-"},"content":"\u003cimg src\u003d\"images/ComponentManagers.png\" width\u003d\"300\" /\u003e","lastModifiedDate":"2021-07-31"},{"lineNumber":66,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2021-07-31"},{"lineNumber":67,"author":{"gitId":"-"},"content":"The sections below give more details of each component.","lastModifiedDate":"2020-05-23"},{"lineNumber":68,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":69,"author":{"gitId":"-"},"content":"### UI component","lastModifiedDate":"2020-05-23"},{"lineNumber":70,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":71,"author":{"gitId":"-"},"content":"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)","lastModifiedDate":"2021-07-31"},{"lineNumber":72,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":73,"author":{"gitId":"-"},"content":"![Structure of the UI Component](images/UiClassDiagram.png)","lastModifiedDate":"2021-07-31"},{"lineNumber":74,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":75,"author":{"gitId":"-"},"content":"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.","lastModifiedDate":"2021-07-31"},{"lineNumber":76,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":77,"author":{"gitId":"-"},"content":"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)","lastModifiedDate":"2021-07-31"},{"lineNumber":78,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":79,"author":{"gitId":"-"},"content":"The `UI` component,","lastModifiedDate":"2020-05-23"},{"lineNumber":80,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":81,"author":{"gitId":"-"},"content":"* executes user commands using the `Logic` component.","lastModifiedDate":"2021-07-31"},{"lineNumber":82,"author":{"gitId":"-"},"content":"* listens for changes to `Model` data so that the UI can be updated with the modified data.","lastModifiedDate":"2021-07-31"},{"lineNumber":83,"author":{"gitId":"-"},"content":"* keeps a reference to the `Logic` component, because the `UI` relies on the `Logic` to execute commands.","lastModifiedDate":"2021-07-31"},{"lineNumber":84,"author":{"gitId":"-"},"content":"* depends on some classes in the `Model` component, as it displays `Person` object residing in the `Model`.","lastModifiedDate":"2021-07-31"},{"lineNumber":85,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":86,"author":{"gitId":"-"},"content":"### Logic component","lastModifiedDate":"2020-05-23"},{"lineNumber":87,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":88,"author":{"gitId":"-"},"content":"**API** : [`Logic.java`](https://github.com/se-edu/addressbook-level3/tree/master/src/main/java/seedu/address/logic/Logic.java)","lastModifiedDate":"2021-07-31"},{"lineNumber":89,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":90,"author":{"gitId":"-"},"content":"Here\u0027s a (partial) class diagram of the `Logic` component:","lastModifiedDate":"2021-07-31"},{"lineNumber":91,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":92,"author":{"gitId":"-"},"content":"\u003cimg src\u003d\"images/LogicClassDiagram.png\" width\u003d\"550\"/\u003e","lastModifiedDate":"2021-07-31"},{"lineNumber":93,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":94,"author":{"gitId":"-"},"content":"The sequence diagram below illustrates the interactions within the `Logic` component, taking `execute(\"delete 1\")` API call as an example.","lastModifiedDate":"2023-09-03"},{"lineNumber":95,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":96,"author":{"gitId":"-"},"content":"![Interactions Inside the Logic Component for the `delete 1` Command](images/DeleteSequenceDiagram.png)","lastModifiedDate":"2020-05-23"},{"lineNumber":97,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":98,"author":{"gitId":"-"},"content":"\u003cdiv markdown\u003d\"span\" class\u003d\"alert alert-info\"\u003e:information_source: **Note:** The lifeline for `DeleteCommandParser` should end at the destroy marker (X) but due to a limitation of PlantUML, the lifeline continues till the end of diagram.","lastModifiedDate":"2024-02-09"},{"lineNumber":99,"author":{"gitId":"-"},"content":"\u003c/div\u003e","lastModifiedDate":"2020-05-23"},{"lineNumber":100,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":101,"author":{"gitId":"-"},"content":"How the `Logic` component works:","lastModifiedDate":"2023-09-03"},{"lineNumber":102,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2023-09-03"},{"lineNumber":103,"author":{"gitId":"-"},"content":"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.","lastModifiedDate":"2023-09-03"},{"lineNumber":104,"author":{"gitId":"-"},"content":"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`.","lastModifiedDate":"2023-09-03"},{"lineNumber":105,"author":{"gitId":"-"},"content":"1. The command can communicate with the `Model` when it is executed (e.g. to delete a person).\u003cbr\u003e","lastModifiedDate":"2024-02-09"},{"lineNumber":106,"author":{"gitId":"-"},"content":" Note that although this is shown as a single step in the diagram above (for simplicity), in the code it can take several interactions (between the command object and the `Model`) to achieve.","lastModifiedDate":"2024-02-09"},{"lineNumber":107,"author":{"gitId":"-"},"content":"1. The result of the command execution is encapsulated as a `CommandResult` object which is returned back from `Logic`.","lastModifiedDate":"2023-09-03"},{"lineNumber":108,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2023-09-03"},{"lineNumber":109,"author":{"gitId":"-"},"content":"Here are the other classes in `Logic` (omitted from the class diagram above) that are used for parsing a user command:","lastModifiedDate":"2021-07-31"},{"lineNumber":110,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2021-07-31"},{"lineNumber":111,"author":{"gitId":"-"},"content":"\u003cimg src\u003d\"images/ParserClasses.png\" width\u003d\"600\"/\u003e","lastModifiedDate":"2021-07-31"},{"lineNumber":112,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":113,"author":{"gitId":"-"},"content":"How the parsing works:","lastModifiedDate":"2021-07-31"},{"lineNumber":114,"author":{"gitId":"-"},"content":"* 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.","lastModifiedDate":"2021-07-31"},{"lineNumber":115,"author":{"gitId":"-"},"content":"* 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.","lastModifiedDate":"2021-07-31"},{"lineNumber":116,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":117,"author":{"gitId":"-"},"content":"### Model component","lastModifiedDate":"2021-07-31"},{"lineNumber":118,"author":{"gitId":"-"},"content":"**API** : [`Model.java`](https://github.com/se-edu/addressbook-level3/tree/master/src/main/java/seedu/address/model/Model.java)","lastModifiedDate":"2020-05-23"},{"lineNumber":119,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":120,"author":{"gitId":"-"},"content":"\u003cimg src\u003d\"images/ModelClassDiagram.png\" width\u003d\"450\" /\u003e","lastModifiedDate":"2021-07-31"},{"lineNumber":121,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":122,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":123,"author":{"gitId":"-"},"content":"The `Model` component,","lastModifiedDate":"2021-07-31"},{"lineNumber":124,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":125,"author":{"gitId":"-"},"content":"* stores the address book data i.e., all `Person` objects (which are contained in a `UniquePersonList` object).","lastModifiedDate":"2021-07-31"},{"lineNumber":126,"author":{"gitId":"-"},"content":"* stores the currently \u0027selected\u0027 `Person` objects (e.g., results of a search query) as a separate _filtered_ list which is exposed to outsiders as an unmodifiable `ObservableList\u003cPerson\u003e` that can be \u0027observed\u0027 e.g. the UI can be bound to this list so that the UI automatically updates when the data in the list change.","lastModifiedDate":"2021-07-31"},{"lineNumber":127,"author":{"gitId":"-"},"content":"* stores a `UserPref` object that represents the user’s preferences. This is exposed to the outside as a `ReadOnlyUserPref` objects.","lastModifiedDate":"2021-07-31"},{"lineNumber":128,"author":{"gitId":"-"},"content":"* 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)","lastModifiedDate":"2021-07-31"},{"lineNumber":129,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2021-07-31"},{"lineNumber":130,"author":{"gitId":"-"},"content":"\u003cdiv markdown\u003d\"span\" class\u003d\"alert alert-info\"\u003e: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.\u003cbr\u003e","lastModifiedDate":"2021-07-31"},{"lineNumber":131,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2021-07-31"},{"lineNumber":132,"author":{"gitId":"-"},"content":"\u003cimg src\u003d\"images/BetterModelClassDiagram.png\" width\u003d\"450\" /\u003e","lastModifiedDate":"2021-07-31"},{"lineNumber":133,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":134,"author":{"gitId":"-"},"content":"\u003c/div\u003e","lastModifiedDate":"2020-05-23"},{"lineNumber":135,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":136,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":137,"author":{"gitId":"-"},"content":"### Storage component","lastModifiedDate":"2020-05-23"},{"lineNumber":138,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":139,"author":{"gitId":"-"},"content":"**API** : [`Storage.java`](https://github.com/se-edu/addressbook-level3/tree/master/src/main/java/seedu/address/storage/Storage.java)","lastModifiedDate":"2020-05-23"},{"lineNumber":140,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":141,"author":{"gitId":"-"},"content":"\u003cimg src\u003d\"images/StorageClassDiagram.png\" width\u003d\"550\" /\u003e","lastModifiedDate":"2021-07-31"},{"lineNumber":142,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2021-07-31"},{"lineNumber":143,"author":{"gitId":"-"},"content":"The `Storage` component,","lastModifiedDate":"2020-05-23"},{"lineNumber":144,"author":{"gitId":"-"},"content":"* can save both address book data and user preference data in JSON format, and read them back into corresponding objects.","lastModifiedDate":"2023-09-03"},{"lineNumber":145,"author":{"gitId":"-"},"content":"* inherits from both `AddressBookStorage` and `UserPrefStorage`, which means it can be treated as either one (if only the functionality of only one is needed).","lastModifiedDate":"2021-07-31"},{"lineNumber":146,"author":{"gitId":"-"},"content":"* depends on some classes in the `Model` component (because the `Storage` component\u0027s job is to save/retrieve objects that belong to the `Model`)","lastModifiedDate":"2021-07-21"},{"lineNumber":147,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":148,"author":{"gitId":"-"},"content":"### Common classes","lastModifiedDate":"2020-05-23"},{"lineNumber":149,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":150,"author":{"gitId":"-"},"content":"Classes used by multiple components are in the `seedu.addressbook.commons` package.","lastModifiedDate":"2020-05-23"},{"lineNumber":151,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":152,"author":{"gitId":"-"},"content":"--------------------------------------------------------------------------------------------------------------------","lastModifiedDate":"2020-05-23"},{"lineNumber":153,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":154,"author":{"gitId":"-"},"content":"## **Implementation**","lastModifiedDate":"2020-05-23"},{"lineNumber":155,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":156,"author":{"gitId":"-"},"content":"This section describes some noteworthy details on how certain features are implemented.","lastModifiedDate":"2020-05-23"},{"lineNumber":157,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":158,"author":{"gitId":"-"},"content":"### \\[Proposed\\] Undo/redo feature","lastModifiedDate":"2020-06-07"},{"lineNumber":159,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":160,"author":{"gitId":"-"},"content":"#### Proposed Implementation","lastModifiedDate":"2020-05-23"},{"lineNumber":161,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":162,"author":{"gitId":"-"},"content":"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:","lastModifiedDate":"2020-05-23"},{"lineNumber":163,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":164,"author":{"gitId":"-"},"content":"* `VersionedAddressBook#commit()` — Saves the current address book state in its history.","lastModifiedDate":"2020-05-23"},{"lineNumber":165,"author":{"gitId":"-"},"content":"* `VersionedAddressBook#undo()` — Restores the previous address book state from its history.","lastModifiedDate":"2020-05-23"},{"lineNumber":166,"author":{"gitId":"-"},"content":"* `VersionedAddressBook#redo()` — Restores a previously undone address book state from its history.","lastModifiedDate":"2020-05-23"},{"lineNumber":167,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":168,"author":{"gitId":"-"},"content":"These operations are exposed in the `Model` interface as `Model#commitAddressBook()`, `Model#undoAddressBook()` and `Model#redoAddressBook()` respectively.","lastModifiedDate":"2020-05-23"},{"lineNumber":169,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":170,"author":{"gitId":"-"},"content":"Given below is an example usage scenario and how the undo/redo mechanism behaves at each step.","lastModifiedDate":"2020-05-23"},{"lineNumber":171,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":172,"author":{"gitId":"-"},"content":"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.","lastModifiedDate":"2020-05-23"},{"lineNumber":173,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":174,"author":{"gitId":"-"},"content":"![UndoRedoState0](images/UndoRedoState0.png)","lastModifiedDate":"2020-05-23"},{"lineNumber":175,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":176,"author":{"gitId":"-"},"content":"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.","lastModifiedDate":"2020-05-23"},{"lineNumber":177,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":178,"author":{"gitId":"-"},"content":"![UndoRedoState1](images/UndoRedoState1.png)","lastModifiedDate":"2020-05-23"},{"lineNumber":179,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":180,"author":{"gitId":"-"},"content":"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`.","lastModifiedDate":"2020-05-23"},{"lineNumber":181,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":182,"author":{"gitId":"-"},"content":"![UndoRedoState2](images/UndoRedoState2.png)","lastModifiedDate":"2020-05-23"},{"lineNumber":183,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":184,"author":{"gitId":"-"},"content":"\u003cdiv markdown\u003d\"span\" class\u003d\"alert alert-info\"\u003e: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`.","lastModifiedDate":"2020-05-23"},{"lineNumber":185,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":186,"author":{"gitId":"-"},"content":"\u003c/div\u003e","lastModifiedDate":"2020-05-23"},{"lineNumber":187,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":188,"author":{"gitId":"-"},"content":"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.","lastModifiedDate":"2020-05-23"},{"lineNumber":189,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":190,"author":{"gitId":"-"},"content":"![UndoRedoState3](images/UndoRedoState3.png)","lastModifiedDate":"2020-05-23"},{"lineNumber":191,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":192,"author":{"gitId":"-"},"content":"\u003cdiv markdown\u003d\"span\" class\u003d\"alert alert-info\"\u003e: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","lastModifiedDate":"2020-05-23"},{"lineNumber":193,"author":{"gitId":"-"},"content":"than attempting to perform the undo.","lastModifiedDate":"2020-05-23"},{"lineNumber":194,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":195,"author":{"gitId":"-"},"content":"\u003c/div\u003e","lastModifiedDate":"2020-05-23"},{"lineNumber":196,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":197,"author":{"gitId":"-"},"content":"The following sequence diagram shows how an undo operation goes through the `Logic` component:","lastModifiedDate":"2024-02-09"},{"lineNumber":198,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":199,"author":{"gitId":"-"},"content":"![UndoSequenceDiagram](images/UndoSequenceDiagram-Logic.png)","lastModifiedDate":"2024-02-09"},{"lineNumber":200,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":201,"author":{"gitId":"-"},"content":"\u003cdiv markdown\u003d\"span\" class\u003d\"alert alert-info\"\u003e: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.","lastModifiedDate":"2020-05-23"},{"lineNumber":202,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":203,"author":{"gitId":"-"},"content":"\u003c/div\u003e","lastModifiedDate":"2020-05-23"},{"lineNumber":204,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":205,"author":{"gitId":"-"},"content":"Similarly, how an undo operation goes through the `Model` component is shown below:","lastModifiedDate":"2024-02-09"},{"lineNumber":206,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2024-02-09"},{"lineNumber":207,"author":{"gitId":"-"},"content":"![UndoSequenceDiagram](images/UndoSequenceDiagram-Model.png)","lastModifiedDate":"2024-02-09"},{"lineNumber":208,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2024-02-09"},{"lineNumber":209,"author":{"gitId":"-"},"content":"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.","lastModifiedDate":"2020-05-23"},{"lineNumber":210,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":211,"author":{"gitId":"-"},"content":"\u003cdiv markdown\u003d\"span\" class\u003d\"alert alert-info\"\u003e: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.","lastModifiedDate":"2020-05-23"},{"lineNumber":212,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":213,"author":{"gitId":"-"},"content":"\u003c/div\u003e","lastModifiedDate":"2020-05-23"},{"lineNumber":214,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":215,"author":{"gitId":"-"},"content":"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.","lastModifiedDate":"2020-05-23"},{"lineNumber":216,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":217,"author":{"gitId":"-"},"content":"![UndoRedoState4](images/UndoRedoState4.png)","lastModifiedDate":"2020-05-23"},{"lineNumber":218,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":219,"author":{"gitId":"-"},"content":"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.","lastModifiedDate":"2020-05-23"},{"lineNumber":220,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":221,"author":{"gitId":"-"},"content":"![UndoRedoState5](images/UndoRedoState5.png)","lastModifiedDate":"2020-05-23"},{"lineNumber":222,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":223,"author":{"gitId":"-"},"content":"The following activity diagram summarizes what happens when a user executes a new command:","lastModifiedDate":"2020-05-23"},{"lineNumber":224,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":225,"author":{"gitId":"-"},"content":"\u003cimg src\u003d\"images/CommitActivityDiagram.png\" width\u003d\"250\" /\u003e","lastModifiedDate":"2021-07-31"},{"lineNumber":226,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":227,"author":{"gitId":"-"},"content":"#### Design considerations:","lastModifiedDate":"2021-07-31"},{"lineNumber":228,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":229,"author":{"gitId":"-"},"content":"**Aspect: How undo \u0026 redo executes:**","lastModifiedDate":"2021-07-31"},{"lineNumber":230,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":231,"author":{"gitId":"-"},"content":"* **Alternative 1 (current choice):** Saves the entire address book.","lastModifiedDate":"2020-05-23"},{"lineNumber":232,"author":{"gitId":"-"},"content":" * Pros: Easy to implement.","lastModifiedDate":"2020-05-23"},{"lineNumber":233,"author":{"gitId":"-"},"content":" * Cons: May have performance issues in terms of memory usage.","lastModifiedDate":"2020-05-23"},{"lineNumber":234,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":235,"author":{"gitId":"-"},"content":"* **Alternative 2:** Individual command knows how to undo/redo by","lastModifiedDate":"2020-05-23"},{"lineNumber":236,"author":{"gitId":"-"},"content":" itself.","lastModifiedDate":"2020-05-23"},{"lineNumber":237,"author":{"gitId":"-"},"content":" * Pros: Will use less memory (e.g. for `delete`, just save the person being deleted).","lastModifiedDate":"2020-05-23"},{"lineNumber":238,"author":{"gitId":"-"},"content":" * Cons: We must ensure that the implementation of each individual command are correct.","lastModifiedDate":"2020-05-23"},{"lineNumber":239,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":240,"author":{"gitId":"-"},"content":"_{more aspects and alternatives to be added}_","lastModifiedDate":"2020-05-23"},{"lineNumber":241,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":242,"author":{"gitId":"-"},"content":"### \\[Proposed\\] Data archiving","lastModifiedDate":"2020-05-23"},{"lineNumber":243,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":244,"author":{"gitId":"-"},"content":"_{Explain here how the data archiving feature will be implemented}_","lastModifiedDate":"2020-05-23"},{"lineNumber":245,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":246,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":247,"author":{"gitId":"-"},"content":"--------------------------------------------------------------------------------------------------------------------","lastModifiedDate":"2020-05-23"},{"lineNumber":248,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":249,"author":{"gitId":"-"},"content":"## **Documentation, logging, testing, configuration, dev-ops**","lastModifiedDate":"2020-06-07"},{"lineNumber":250,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":251,"author":{"gitId":"-"},"content":"* [Documentation guide](Documentation.md)","lastModifiedDate":"2020-06-07"},{"lineNumber":252,"author":{"gitId":"-"},"content":"* [Testing guide](Testing.md)","lastModifiedDate":"2020-06-07"},{"lineNumber":253,"author":{"gitId":"-"},"content":"* [Logging guide](Logging.md)","lastModifiedDate":"2020-06-07"},{"lineNumber":254,"author":{"gitId":"-"},"content":"* [Configuration guide](Configuration.md)","lastModifiedDate":"2020-06-07"},{"lineNumber":255,"author":{"gitId":"-"},"content":"* [DevOps guide](DevOps.md)","lastModifiedDate":"2020-06-07"},{"lineNumber":256,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":257,"author":{"gitId":"-"},"content":"--------------------------------------------------------------------------------------------------------------------","lastModifiedDate":"2020-05-23"},{"lineNumber":258,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":259,"author":{"gitId":"-"},"content":"## **Appendix: Requirements**","lastModifiedDate":"2020-05-23"},{"lineNumber":260,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":261,"author":{"gitId":"-"},"content":"### Product scope","lastModifiedDate":"2020-05-23"},{"lineNumber":262,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":263,"author":{"gitId":"HM33-Stu"},"content":"**Target user profile**: People sourcing for internships (specifically, CS students)","lastModifiedDate":"2024-03-02"},{"lineNumber":264,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":265,"author":{"gitId":"HM33-Stu"},"content":"* has a need to manage a significant number of internship applications","lastModifiedDate":"2024-03-02"},{"lineNumber":266,"author":{"gitId":"-"},"content":"* prefer desktop apps over other types","lastModifiedDate":"2020-05-23"},{"lineNumber":267,"author":{"gitId":"-"},"content":"* can type fast","lastModifiedDate":"2020-05-23"},{"lineNumber":268,"author":{"gitId":"-"},"content":"* prefers typing to mouse interactions","lastModifiedDate":"2020-05-26"},{"lineNumber":269,"author":{"gitId":"-"},"content":"* is reasonably comfortable using CLI apps","lastModifiedDate":"2020-05-23"},{"lineNumber":270,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":271,"author":{"gitId":"HM33-Stu"},"content":"**Value proposition**:","lastModifiedDate":"2024-03-02"},{"lineNumber":272,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":273,"author":{"gitId":"HM33-Stu"},"content":"``` plaintext","lastModifiedDate":"2024-03-02"},{"lineNumber":274,"author":{"gitId":"HM33-Stu"},"content":"Effortlessly manage, search, and sift through your various internship applications. ","lastModifiedDate":"2024-03-02"},{"lineNumber":275,"author":{"gitId":"HM33-Stu"},"content":"Enter details rapidly using CLI, and avoid losing track of crucial information. ","lastModifiedDate":"2024-03-02"},{"lineNumber":276,"author":{"gitId":"HM33-Stu"},"content":"Targeted to those with numerous applications to keep track of and prefer using CLI. ","lastModifiedDate":"2024-03-02"},{"lineNumber":277,"author":{"gitId":"HM33-Stu"},"content":"Your all-in-one solution for seamless application management.","lastModifiedDate":"2024-03-02"},{"lineNumber":278,"author":{"gitId":"HM33-Stu"},"content":"```","lastModifiedDate":"2024-03-02"},{"lineNumber":279,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":280,"author":{"gitId":"-"},"content":"### User stories","lastModifiedDate":"2020-06-07"},{"lineNumber":281,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":282,"author":{"gitId":"HM33-Stu"},"content":"Priorities: High (Must-Have) - `* * *`, Medium (Nice-To-Have) - `* *`, Low (Not Useful) - `*`","lastModifiedDate":"2024-03-02"},{"lineNumber":283,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":284,"author":{"gitId":"HM33-Stu"},"content":"| Priority | As a/an …​ | I want to …​ | So that I can…​ |","lastModifiedDate":"2024-03-02"},{"lineNumber":285,"author":{"gitId":"HM33-Stu"},"content":"|----------|-----------------|--------------------------------------------------|---------------------------------------------------------------|","lastModifiedDate":"2024-03-02"},{"lineNumber":286,"author":{"gitId":"HM33-Stu"},"content":"| `* * *` | impatient user | Enter internship information from the main page | Quickly note down potential internships at a career fair |","lastModifiedDate":"2024-03-02"},{"lineNumber":287,"author":{"gitId":"HM33-Stu"},"content":"| `* * *` | savvy user | Access all commands via a text-based input | Add, delete, and modify entries without using my mouse |","lastModifiedDate":"2024-03-02"},{"lineNumber":288,"author":{"gitId":"HM33-Stu"},"content":"| `* * *` | beginner user | Access sample data in the app | Play around with the features to get the hang of them |","lastModifiedDate":"2024-03-02"},{"lineNumber":289,"author":{"gitId":"HM33-Stu"},"content":"| `* * *` | up-to-date user | Modify internship details | Keep myself updated on changing details |","lastModifiedDate":"2024-03-02"},{"lineNumber":290,"author":{"gitId":"HM33-Stu"},"content":"| `* * *` | regular user | View all internship details | Easily view all details in one screen. |","lastModifiedDate":"2024-03-02"},{"lineNumber":291,"author":{"gitId":"HM33-Stu"},"content":"| `* * *` | detailed user | Add information to the notes section of an entry | Customise to see internships that fall under specific fields. |","lastModifiedDate":"2024-03-02"},{"lineNumber":292,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":293,"author":{"gitId":"-"},"content":"*{More to be added}*","lastModifiedDate":"2020-05-23"},{"lineNumber":294,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":295,"author":{"gitId":"-"},"content":"### Use cases","lastModifiedDate":"2020-06-07"},{"lineNumber":296,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":297,"author":{"gitId":"HM33-Stu"},"content":"(For all use cases below, the **System** is `CareerSync` and the **Actor** is the `user`, unless specified otherwise)","lastModifiedDate":"2024-03-02"},{"lineNumber":298,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":299,"author":{"gitId":"HM33-Stu"},"content":"**Use case: Enter Internship Information From The Main Page**","lastModifiedDate":"2024-03-02"},{"lineNumber":300,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":301,"author":{"gitId":"-"},"content":"**MSS**","lastModifiedDate":"2020-05-23"},{"lineNumber":302,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":303,"author":{"gitId":"HM33-Stu"},"content":"1. User accesses the main page. ","lastModifiedDate":"2024-03-02"},{"lineNumber":304,"author":{"gitId":"HM33-Stu"},"content":"2. User selects the option to enter internship information. ","lastModifiedDate":"2024-03-02"},{"lineNumber":305,"author":{"gitId":"HM33-Stu"},"content":"3. System prompts the user to input internship details such as title, company, start/end dates, etc. ","lastModifiedDate":"2024-03-02"},{"lineNumber":306,"author":{"gitId":"HM33-Stu"},"content":"4. User inputs the required internship details. ","lastModifiedDate":"2024-03-02"},{"lineNumber":307,"author":{"gitId":"HM33-Stu"},"content":"5. System validates the input data. ","lastModifiedDate":"2024-03-02"},{"lineNumber":308,"author":{"gitId":"HM33-Stu"},"content":"6. System saves the internship information. ","lastModifiedDate":"2024-03-02"},{"lineNumber":309,"author":{"gitId":"HM33-Stu"},"content":"7. System displays a confirmation message indicating successful submission.","lastModifiedDate":"2024-03-02"},{"lineNumber":310,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":311,"author":{"gitId":"-"},"content":" Use case ends.","lastModifiedDate":"2020-05-23"},{"lineNumber":312,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":313,"author":{"gitId":"-"},"content":"**Extensions**","lastModifiedDate":"2020-05-23"},{"lineNumber":314,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":315,"author":{"gitId":"HM33-Stu"},"content":"* 1a. User is unable to access the main page.","lastModifiedDate":"2024-03-02"},{"lineNumber":316,"author":{"gitId":"HM33-Stu"},"content":" *1a1. System displays an error message.","lastModifiedDate":"2024-03-02"},{"lineNumber":317,"author":{"gitId":"HM33-Stu"},"content":"* 2a. User cancels entering internship information.","lastModifiedDate":"2024-03-02"},{"lineNumber":318,"author":{"gitId":"HM33-Stu"},"content":" * 2a1. System cancels the entry process and returns the user to the main page.","lastModifiedDate":"2024-03-02"},{"lineNumber":319,"author":{"gitId":"HM33-Stu"},"content":"* 5a. User inputs invalid internship details.","lastModifiedDate":"2024-03-02"},{"lineNumber":320,"author":{"gitId":"HM33-Stu"},"content":" * 5a1. System displays an error message indicating the specific validation error(s).","lastModifiedDate":"2024-03-02"},{"lineNumber":321,"author":{"gitId":"HM33-Stu"},"content":"* 6a. System fails to save the internship information.","lastModifiedDate":"2024-03-02"},{"lineNumber":322,"author":{"gitId":"HM33-Stu"},"content":" * 6a1. System displays an error message and prompts the user to retry or cancel the submission.","lastModifiedDate":"2024-03-02"},{"lineNumber":323,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":324,"author":{"gitId":"-"},"content":" Use case ends.","lastModifiedDate":"2020-05-23"},{"lineNumber":325,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":326,"author":{"gitId":"HM33-Stu"},"content":"**Use case: Access All Commands Via A Text-Based Input**","lastModifiedDate":"2024-03-02"},{"lineNumber":327,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":328,"author":{"gitId":"HM33-Stu"},"content":"**MSS**","lastModifiedDate":"2024-03-02"},{"lineNumber":329,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2024-03-02"},{"lineNumber":330,"author":{"gitId":"HM33-Stu"},"content":"1. User accesses the main page. ","lastModifiedDate":"2024-03-02"},{"lineNumber":331,"author":{"gitId":"HM33-Stu"},"content":"2. System displays a prompt for text-based input. ","lastModifiedDate":"2024-03-02"},{"lineNumber":332,"author":{"gitId":"HM33-Stu"},"content":"3. User enters a command using text-based input. ","lastModifiedDate":"2024-03-02"},{"lineNumber":333,"author":{"gitId":"HM33-Stu"},"content":"4. System recognizes and processes the entered command. ","lastModifiedDate":"2024-03-02"},{"lineNumber":334,"author":{"gitId":"HM33-Stu"},"content":"5. System executes the requested action corresponding to the entered command. ","lastModifiedDate":"2024-03-02"},{"lineNumber":335,"author":{"gitId":"HM33-Stu"},"content":"6. User receives feedback or output based on the executed command.","lastModifiedDate":"2024-03-02"},{"lineNumber":336,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2024-03-02"},{"lineNumber":337,"author":{"gitId":"HM33-Stu"},"content":" Use case ends.","lastModifiedDate":"2024-03-02"},{"lineNumber":338,"author":{"gitId":"HM33-Stu"},"content":"","lastModifiedDate":"2024-03-02"},{"lineNumber":339,"author":{"gitId":"HM33-Stu"},"content":"**Extensions**","lastModifiedDate":"2024-03-02"},{"lineNumber":340,"author":{"gitId":"HM33-Stu"},"content":"","lastModifiedDate":"2024-03-02"},{"lineNumber":341,"author":{"gitId":"HM33-Stu"},"content":"* 1a. User is unable to access the main page.","lastModifiedDate":"2024-03-02"},{"lineNumber":342,"author":{"gitId":"HM33-Stu"},"content":" * 1a1. System displays an error message.","lastModifiedDate":"2024-03-02"},{"lineNumber":343,"author":{"gitId":"HM33-Stu"},"content":"* 3a. User enters an invalid command.","lastModifiedDate":"2024-03-02"},{"lineNumber":344,"author":{"gitId":"HM33-Stu"},"content":" * 3a1. System displays an error message indicating that the command is not recognized.","lastModifiedDate":"2024-03-02"},{"lineNumber":345,"author":{"gitId":"HM33-Stu"},"content":"* 4a. System fails to recognize or process the entered command.","lastModifiedDate":"2024-03-02"},{"lineNumber":346,"author":{"gitId":"HM33-Stu"},"content":" * 4a1. System displays an error message and prompts the user to retry or enter a different command.","lastModifiedDate":"2024-03-02"},{"lineNumber":347,"author":{"gitId":"HM33-Stu"},"content":"* 5a. System encounters an error while executing the requested action.","lastModifiedDate":"2024-03-02"},{"lineNumber":348,"author":{"gitId":"HM33-Stu"},"content":" * 5a1. System displays an error message and prompts the user to retry or perform a different action.","lastModifiedDate":"2024-03-02"},{"lineNumber":349,"author":{"gitId":"HM33-Stu"},"content":"","lastModifiedDate":"2024-03-02"},{"lineNumber":350,"author":{"gitId":"HM33-Stu"},"content":" Use case ends.","lastModifiedDate":"2024-03-02"},{"lineNumber":351,"author":{"gitId":"HM33-Stu"},"content":"","lastModifiedDate":"2024-03-02"},{"lineNumber":352,"author":{"gitId":"HM33-Stu"},"content":"**Use case: Access Sample Data In The App**","lastModifiedDate":"2024-03-02"},{"lineNumber":353,"author":{"gitId":"HM33-Stu"},"content":"","lastModifiedDate":"2024-03-02"},{"lineNumber":354,"author":{"gitId":"HM33-Stu"},"content":"**MSS**","lastModifiedDate":"2024-03-02"},{"lineNumber":355,"author":{"gitId":"HM33-Stu"},"content":"","lastModifiedDate":"2024-03-02"},{"lineNumber":356,"author":{"gitId":"HM33-Stu"},"content":"1. User accesses the main page. ","lastModifiedDate":"2024-03-02"},{"lineNumber":357,"author":{"gitId":"HM33-Stu"},"content":"2. User selects the option to access sample data. ","lastModifiedDate":"2024-03-02"},{"lineNumber":358,"author":{"gitId":"HM33-Stu"},"content":"3. System retrieves and displays sample internship data. ","lastModifiedDate":"2024-03-02"},{"lineNumber":359,"author":{"gitId":"HM33-Stu"},"content":"4. User views the sample internship data presented by the system.","lastModifiedDate":"2024-03-02"},{"lineNumber":360,"author":{"gitId":"HM33-Stu"},"content":"","lastModifiedDate":"2024-03-02"},{"lineNumber":361,"author":{"gitId":"HM33-Stu"},"content":" Use case ends.","lastModifiedDate":"2024-03-02"},{"lineNumber":362,"author":{"gitId":"HM33-Stu"},"content":"","lastModifiedDate":"2024-03-02"},{"lineNumber":363,"author":{"gitId":"HM33-Stu"},"content":"**Extensions**","lastModifiedDate":"2024-03-02"},{"lineNumber":364,"author":{"gitId":"HM33-Stu"},"content":"","lastModifiedDate":"2024-03-02"},{"lineNumber":365,"author":{"gitId":"HM33-Stu"},"content":"* 1a. User is unable to access the main page.","lastModifiedDate":"2024-03-02"},{"lineNumber":366,"author":{"gitId":"HM33-Stu"},"content":" * 1a1. System displays an error message.","lastModifiedDate":"2024-03-02"},{"lineNumber":367,"author":{"gitId":"HM33-Stu"},"content":"* 2a. User cancels accessing sample data.","lastModifiedDate":"2024-03-02"},{"lineNumber":368,"author":{"gitId":"HM33-Stu"},"content":" * 2a1. System cancels the process and returns the user to the main page.","lastModifiedDate":"2024-03-02"},{"lineNumber":369,"author":{"gitId":"HM33-Stu"},"content":"* 3a. System fails to retrieve sample data.","lastModifiedDate":"2024-03-02"},{"lineNumber":370,"author":{"gitId":"HM33-Stu"},"content":" * 3a1. System displays an error message and prompts the user to retry or exit.","lastModifiedDate":"2024-03-02"},{"lineNumber":371,"author":{"gitId":"HM33-Stu"},"content":"* 4a. User encounters issues while viewing the sample data.","lastModifiedDate":"2024-03-02"},{"lineNumber":372,"author":{"gitId":"HM33-Stu"},"content":" * 4a1. System displays an error message and prompts the user to retry or exit.","lastModifiedDate":"2024-03-02"},{"lineNumber":373,"author":{"gitId":"HM33-Stu"},"content":"","lastModifiedDate":"2024-03-02"},{"lineNumber":374,"author":{"gitId":"HM33-Stu"},"content":" Use case ends.","lastModifiedDate":"2024-03-02"},{"lineNumber":375,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2024-03-02"},{"lineNumber":376,"author":{"gitId":"HM33-Stu"},"content":"**Use case: Modify Internship Details**","lastModifiedDate":"2024-03-02"},{"lineNumber":377,"author":{"gitId":"HM33-Stu"},"content":"","lastModifiedDate":"2024-03-02"},{"lineNumber":378,"author":{"gitId":"HM33-Stu"},"content":"**MSS**","lastModifiedDate":"2024-03-02"},{"lineNumber":379,"author":{"gitId":"HM33-Stu"},"content":"","lastModifiedDate":"2024-03-02"},{"lineNumber":380,"author":{"gitId":"HM33-Stu"},"content":"1. User accesses the main page. ","lastModifiedDate":"2024-03-02"},{"lineNumber":381,"author":{"gitId":"HM33-Stu"},"content":"2. User selects the option to view all internship details. ","lastModifiedDate":"2024-03-02"},{"lineNumber":382,"author":{"gitId":"HM33-Stu"},"content":"3. System retrieves and displays a list of all entered internship details. ","lastModifiedDate":"2024-03-02"},{"lineNumber":383,"author":{"gitId":"HM33-Stu"},"content":"4. User selects the internship entry to be modified. ","lastModifiedDate":"2024-03-02"},{"lineNumber":384,"author":{"gitId":"HM33-Stu"},"content":"5. System presents the selected internship details for editing. ","lastModifiedDate":"2024-03-02"},{"lineNumber":385,"author":{"gitId":"HM33-Stu"},"content":"6. User modifies the necessary internship details. ","lastModifiedDate":"2024-03-02"},{"lineNumber":386,"author":{"gitId":"HM33-Stu"},"content":"7. System validates the modified data.","lastModifiedDate":"2024-03-02"},{"lineNumber":387,"author":{"gitId":"HM33-Stu"},"content":"8. System saves the updated internship information. ","lastModifiedDate":"2024-03-02"},{"lineNumber":388,"author":{"gitId":"HM33-Stu"},"content":"9. System displays a confirmation message indicating successful modification.","lastModifiedDate":"2024-03-02"},{"lineNumber":389,"author":{"gitId":"HM33-Stu"},"content":"","lastModifiedDate":"2024-03-02"},{"lineNumber":390,"author":{"gitId":"HM33-Stu"},"content":" Use case ends.","lastModifiedDate":"2024-03-02"},{"lineNumber":391,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":392,"author":{"gitId":"HM33-Stu"},"content":"**Extensions**","lastModifiedDate":"2024-03-02"},{"lineNumber":393,"author":{"gitId":"HM33-Stu"},"content":"","lastModifiedDate":"2024-03-02"},{"lineNumber":394,"author":{"gitId":"HM33-Stu"},"content":"* 1a. User is unable to access the main page.","lastModifiedDate":"2024-03-02"},{"lineNumber":395,"author":{"gitId":"HM33-Stu"},"content":" * 1a1. System displays an error message.","lastModifiedDate":"2024-03-02"},{"lineNumber":396,"author":{"gitId":"HM33-Stu"},"content":"* 2a. User cancels viewing all internship details.","lastModifiedDate":"2024-03-02"},{"lineNumber":397,"author":{"gitId":"HM33-Stu"},"content":" * 2a1. System cancels the process and returns the user to the main page.","lastModifiedDate":"2024-03-02"},{"lineNumber":398,"author":{"gitId":"HM33-Stu"},"content":"* 4a. User cancels selecting the internship entry to be modified.","lastModifiedDate":"2024-03-02"},{"lineNumber":399,"author":{"gitId":"HM33-Stu"},"content":" * 4a1. System cancels the modification process and returns the user to the list of internship details.","lastModifiedDate":"2024-03-02"},{"lineNumber":400,"author":{"gitId":"HM33-Stu"},"content":"* 6a. User inputs invalid internship details.","lastModifiedDate":"2024-03-02"},{"lineNumber":401,"author":{"gitId":"HM33-Stu"},"content":" * 6a1. System displays an error message indicating the specific validation error(s).","lastModifiedDate":"2024-03-02"},{"lineNumber":402,"author":{"gitId":"HM33-Stu"},"content":"* 7a. System fails to validate the modified data.","lastModifiedDate":"2024-03-02"},{"lineNumber":403,"author":{"gitId":"HM33-Stu"},"content":" * 7a1. System displays an error message and prompts the user to correct the data.","lastModifiedDate":"2024-03-02"},{"lineNumber":404,"author":{"gitId":"HM33-Stu"},"content":"* 8a. System fails to save the updated internship information.","lastModifiedDate":"2024-03-02"},{"lineNumber":405,"author":{"gitId":"HM33-Stu"},"content":" * 8a1. System displays an error message and prompts the user to retry or exit.","lastModifiedDate":"2024-03-02"},{"lineNumber":406,"author":{"gitId":"HM33-Stu"},"content":"","lastModifiedDate":"2024-03-02"},{"lineNumber":407,"author":{"gitId":"HM33-Stu"},"content":" Use case ends.","lastModifiedDate":"2024-03-02"},{"lineNumber":408,"author":{"gitId":"HM33-Stu"},"content":"","lastModifiedDate":"2024-03-02"},{"lineNumber":409,"author":{"gitId":"HM33-Stu"},"content":"**Use case: View All Internship Details**","lastModifiedDate":"2024-03-02"},{"lineNumber":410,"author":{"gitId":"HM33-Stu"},"content":"","lastModifiedDate":"2024-03-02"},{"lineNumber":411,"author":{"gitId":"HM33-Stu"},"content":"**MSS**","lastModifiedDate":"2024-03-02"},{"lineNumber":412,"author":{"gitId":"HM33-Stu"},"content":"","lastModifiedDate":"2024-03-02"},{"lineNumber":413,"author":{"gitId":"HM33-Stu"},"content":"1. User accesses the main page. ","lastModifiedDate":"2024-03-02"},{"lineNumber":414,"author":{"gitId":"HM33-Stu"},"content":"2. User selects the option to view all internship details. ","lastModifiedDate":"2024-03-02"},{"lineNumber":415,"author":{"gitId":"HM33-Stu"},"content":"3. System retrieves and displays a list of all entered internship details. ","lastModifiedDate":"2024-03-02"},{"lineNumber":416,"author":{"gitId":"HM33-Stu"},"content":"4. User views the list of internship details presented by the system.","lastModifiedDate":"2024-03-02"},{"lineNumber":417,"author":{"gitId":"HM33-Stu"},"content":"","lastModifiedDate":"2024-03-02"},{"lineNumber":418,"author":{"gitId":"HM33-Stu"},"content":" Use case ends.","lastModifiedDate":"2024-03-02"},{"lineNumber":419,"author":{"gitId":"HM33-Stu"},"content":"","lastModifiedDate":"2024-03-02"},{"lineNumber":420,"author":{"gitId":"HM33-Stu"},"content":"**Extensions**","lastModifiedDate":"2024-03-02"},{"lineNumber":421,"author":{"gitId":"HM33-Stu"},"content":"","lastModifiedDate":"2024-03-02"},{"lineNumber":422,"author":{"gitId":"HM33-Stu"},"content":"* 1a. User is unable to access the main page.","lastModifiedDate":"2024-03-02"},{"lineNumber":423,"author":{"gitId":"HM33-Stu"},"content":" * 1a1. System displays an error message.","lastModifiedDate":"2024-03-02"},{"lineNumber":424,"author":{"gitId":"HM33-Stu"},"content":"* 2a. User cancels viewing all internship details.","lastModifiedDate":"2024-03-02"},{"lineNumber":425,"author":{"gitId":"HM33-Stu"},"content":" * 2a1. System cancels the process and returns the user to the main page.","lastModifiedDate":"2024-03-02"},{"lineNumber":426,"author":{"gitId":"HM33-Stu"},"content":"* 3a. System fails to retrieve all internship details.","lastModifiedDate":"2024-03-02"},{"lineNumber":427,"author":{"gitId":"HM33-Stu"},"content":" * 3a1. System displays an error message and prompts the user to retry or exit.","lastModifiedDate":"2024-03-02"},{"lineNumber":428,"author":{"gitId":"HM33-Stu"},"content":"","lastModifiedDate":"2024-03-02"},{"lineNumber":429,"author":{"gitId":"HM33-Stu"},"content":" Use case ends.","lastModifiedDate":"2024-03-02"},{"lineNumber":430,"author":{"gitId":"HM33-Stu"},"content":"","lastModifiedDate":"2024-03-02"},{"lineNumber":431,"author":{"gitId":"HM33-Stu"},"content":"**Use case: Add Information To The Notes Section Of An Entry**","lastModifiedDate":"2024-03-02"},{"lineNumber":432,"author":{"gitId":"HM33-Stu"},"content":"","lastModifiedDate":"2024-03-02"},{"lineNumber":433,"author":{"gitId":"HM33-Stu"},"content":"**MSS**","lastModifiedDate":"2024-03-02"},{"lineNumber":434,"author":{"gitId":"HM33-Stu"},"content":"","lastModifiedDate":"2024-03-02"},{"lineNumber":435,"author":{"gitId":"HM33-Stu"},"content":"1. User accesses the main page. ","lastModifiedDate":"2024-03-02"},{"lineNumber":436,"author":{"gitId":"HM33-Stu"},"content":"2. User selects the option to view all internship details. ","lastModifiedDate":"2024-03-02"},{"lineNumber":437,"author":{"gitId":"HM33-Stu"},"content":"3. System retrieves and displays a list of all entered internship details. ","lastModifiedDate":"2024-03-02"},{"lineNumber":438,"author":{"gitId":"HM33-Stu"},"content":"4. User selects the internship entry to which notes will be added. ","lastModifiedDate":"2024-03-02"},{"lineNumber":439,"author":{"gitId":"HM33-Stu"},"content":"5. System presents the selected internship details along with the current notes section.","lastModifiedDate":"2024-03-02"},{"lineNumber":440,"author":{"gitId":"HM33-Stu"},"content":"6. User enters additional information in the notes section.","lastModifiedDate":"2024-03-02"},{"lineNumber":441,"author":{"gitId":"HM33-Stu"},"content":"7. System saves the updated notes.","lastModifiedDate":"2024-03-02"},{"lineNumber":442,"author":{"gitId":"HM33-Stu"},"content":"8. System displays a confirmation message indicating successful addition of notes.","lastModifiedDate":"2024-03-02"},{"lineNumber":443,"author":{"gitId":"HM33-Stu"},"content":"","lastModifiedDate":"2024-03-02"},{"lineNumber":444,"author":{"gitId":"HM33-Stu"},"content":" Use case ends.","lastModifiedDate":"2024-03-02"},{"lineNumber":445,"author":{"gitId":"HM33-Stu"},"content":"","lastModifiedDate":"2024-03-02"},{"lineNumber":446,"author":{"gitId":"HM33-Stu"},"content":"**Extensions**","lastModifiedDate":"2024-03-02"},{"lineNumber":447,"author":{"gitId":"HM33-Stu"},"content":"","lastModifiedDate":"2024-03-02"},{"lineNumber":448,"author":{"gitId":"HM33-Stu"},"content":"* 1a. User is unable to access the main page.","lastModifiedDate":"2024-03-02"},{"lineNumber":449,"author":{"gitId":"HM33-Stu"},"content":" * 1a1. System displays an error message.","lastModifiedDate":"2024-03-02"},{"lineNumber":450,"author":{"gitId":"HM33-Stu"},"content":"* 2a. User cancels viewing all internship details.","lastModifiedDate":"2024-03-02"},{"lineNumber":451,"author":{"gitId":"HM33-Stu"},"content":" * 2a1. System cancels the process and returns the user to the main page.","lastModifiedDate":"2024-03-02"},{"lineNumber":452,"author":{"gitId":"HM33-Stu"},"content":"* 4a. User cancels selecting the internship entry to add notes.","lastModifiedDate":"2024-03-02"},{"lineNumber":453,"author":{"gitId":"HM33-Stu"},"content":" * 4a1. System cancels the process and returns the user to the list of internship details.","lastModifiedDate":"2024-03-02"},{"lineNumber":454,"author":{"gitId":"HM33-Stu"},"content":"* 6a. User encounters an error while adding notes.","lastModifiedDate":"2024-03-02"},{"lineNumber":455,"author":{"gitId":"HM33-Stu"},"content":" * 6a1. System displays an error message and prompts the user to retry or exit.","lastModifiedDate":"2024-03-02"},{"lineNumber":456,"author":{"gitId":"HM33-Stu"},"content":"* 7a. System fails to save the updated notes.","lastModifiedDate":"2024-03-02"},{"lineNumber":457,"author":{"gitId":"HM33-Stu"},"content":" * 7a1. System displays an error message and prompts the user to retry or exit.","lastModifiedDate":"2024-03-02"},{"lineNumber":458,"author":{"gitId":"HM33-Stu"},"content":"","lastModifiedDate":"2024-03-02"},{"lineNumber":459,"author":{"gitId":"HM33-Stu"},"content":" Use case ends.","lastModifiedDate":"2024-03-02"},{"lineNumber":460,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":461,"author":{"gitId":"-"},"content":"*{More to be added}*","lastModifiedDate":"2020-05-23"},{"lineNumber":462,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":463,"author":{"gitId":"-"},"content":"### Non-Functional Requirements","lastModifiedDate":"2020-05-23"},{"lineNumber":464,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":465,"author":{"gitId":"-"},"content":"1. Should work on any _mainstream OS_ as long as it has Java `11` or above installed.","lastModifiedDate":"2020-05-23"},{"lineNumber":466,"author":{"gitId":"HM33-Stu"},"content":"2. Should be able to hold up to 100 internship entries without a noticeable sluggishness in performance for typical usage.","lastModifiedDate":"2024-03-02"},{"lineNumber":467,"author":{"gitId":"-"},"content":"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.","lastModifiedDate":"2020-05-23"},{"lineNumber":468,"author":{"gitId":"HM33-Stu"},"content":"4. Storage of data should be in a format that is easy to read and write by humans, and easy to parse by machines.","lastModifiedDate":"2024-03-02"},{"lineNumber":469,"author":{"gitId":"HM33-Stu"},"content":"5. System should be backward compatible with data produced by earlier versions of the system.","lastModifiedDate":"2024-03-02"},{"lineNumber":470,"author":{"gitId":"HM33-Stu"},"content":"6. System is expected to be used by a single user on a machine, and does not need to support multiple users on the same machine.","lastModifiedDate":"2024-03-02"},{"lineNumber":471,"author":{"gitId":"HM33-Stu"},"content":"7. System should launch within 2 seconds on any modern machine.","lastModifiedDate":"2024-03-02"},{"lineNumber":472,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":473,"author":{"gitId":"-"},"content":"*{More to be added}*","lastModifiedDate":"2020-05-23"},{"lineNumber":474,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":475,"author":{"gitId":"-"},"content":"### Glossary","lastModifiedDate":"2020-05-23"},{"lineNumber":476,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":477,"author":{"gitId":"LWS49"},"content":"* **API**: Application Programming Interface. The entirety of published methods, properties and other means for software developers to access an application through software they write using this application.","lastModifiedDate":"2024-03-04"},{"lineNumber":478,"author":{"gitId":"LWS49"},"content":"* **GUI**: Graphical User Interface. A graphical user interface uses graphical representations of commands, status feedbacks and data of an application, and offers methods to interact with it through graphical devices, such as a mouse or tablets.","lastModifiedDate":"2024-03-04"},{"lineNumber":479,"author":{"gitId":"LWS49"},"content":"* **Mainstream OS**: Mainstream Operating Systems. Refers to Windows, Linux, Unix and MacOS.","lastModifiedDate":"2024-03-04"},{"lineNumber":480,"author":{"gitId":"-"},"content":"* **Private contact detail**: A contact detail that is not meant to be shared with others","lastModifiedDate":"2020-05-23"},{"lineNumber":481,"author":{"gitId":"LWS49"},"content":"* **UI**: User Interface. The point where a user and a software application meet and interact.","lastModifiedDate":"2024-03-04"},{"lineNumber":482,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":483,"author":{"gitId":"-"},"content":"--------------------------------------------------------------------------------------------------------------------","lastModifiedDate":"2020-05-23"},{"lineNumber":484,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":485,"author":{"gitId":"-"},"content":"## **Appendix: Instructions for manual testing**","lastModifiedDate":"2020-05-23"},{"lineNumber":486,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":487,"author":{"gitId":"-"},"content":"Given below are instructions to test the app manually.","lastModifiedDate":"2020-05-23"},{"lineNumber":488,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":489,"author":{"gitId":"-"},"content":"\u003cdiv markdown\u003d\"span\" class\u003d\"alert alert-info\"\u003e:information_source: **Note:** These instructions only provide a starting point for testers to work on;","lastModifiedDate":"2020-05-23"},{"lineNumber":490,"author":{"gitId":"-"},"content":"testers are expected to do more *exploratory* testing.","lastModifiedDate":"2020-05-23"},{"lineNumber":491,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":492,"author":{"gitId":"-"},"content":"\u003c/div\u003e","lastModifiedDate":"2020-05-23"},{"lineNumber":493,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":494,"author":{"gitId":"-"},"content":"### Launch and shutdown","lastModifiedDate":"2020-05-23"},{"lineNumber":495,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":496,"author":{"gitId":"-"},"content":"1. Initial launch","lastModifiedDate":"2020-05-23"},{"lineNumber":497,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":498,"author":{"gitId":"-"},"content":" 1. Download the jar file and copy into an empty folder","lastModifiedDate":"2020-05-23"},{"lineNumber":499,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":500,"author":{"gitId":"-"},"content":" 1. Double-click the jar file Expected: Shows the GUI with a set of sample contacts. The window size may not be optimum.","lastModifiedDate":"2020-05-23"},{"lineNumber":501,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":502,"author":{"gitId":"-"},"content":"1. Saving window preferences","lastModifiedDate":"2020-05-23"},{"lineNumber":503,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":504,"author":{"gitId":"-"},"content":" 1. Resize the window to an optimum size. Move the window to a different location. Close the window.","lastModifiedDate":"2020-05-23"},{"lineNumber":505,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":506,"author":{"gitId":"-"},"content":" 1. Re-launch the app by double-clicking the jar file.\u003cbr\u003e","lastModifiedDate":"2020-05-23"},{"lineNumber":507,"author":{"gitId":"-"},"content":" Expected: The most recent window size and location is retained.","lastModifiedDate":"2020-05-23"},{"lineNumber":508,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":509,"author":{"gitId":"-"},"content":"1. _{ more test cases …​ }_","lastModifiedDate":"2020-05-23"},{"lineNumber":510,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":511,"author":{"gitId":"-"},"content":"### Deleting a person","lastModifiedDate":"2020-05-23"},{"lineNumber":512,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":513,"author":{"gitId":"-"},"content":"1. Deleting a person while all persons are being shown","lastModifiedDate":"2020-05-23"},{"lineNumber":514,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":515,"author":{"gitId":"-"},"content":" 1. Prerequisites: List all persons using the `list` command. Multiple persons in the list.","lastModifiedDate":"2020-05-23"},{"lineNumber":516,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":517,"author":{"gitId":"-"},"content":" 1. Test case: `delete 1`\u003cbr\u003e","lastModifiedDate":"2020-05-23"},{"lineNumber":518,"author":{"gitId":"-"},"content":" 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.","lastModifiedDate":"2020-05-23"},{"lineNumber":519,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":520,"author":{"gitId":"-"},"content":" 1. Test case: `delete 0`\u003cbr\u003e","lastModifiedDate":"2020-05-23"},{"lineNumber":521,"author":{"gitId":"-"},"content":" Expected: No person is deleted. Error details shown in the status message. Status bar remains the same.","lastModifiedDate":"2020-05-23"},{"lineNumber":522,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":523,"author":{"gitId":"-"},"content":" 1. Other incorrect delete commands to try: `delete`, `delete x`, `...` (where x is larger than the list size)\u003cbr\u003e","lastModifiedDate":"2020-05-23"},{"lineNumber":524,"author":{"gitId":"-"},"content":" Expected: Similar to previous.","lastModifiedDate":"2020-05-23"},{"lineNumber":525,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":526,"author":{"gitId":"-"},"content":"1. _{ more test cases …​ }_","lastModifiedDate":"2020-05-23"},{"lineNumber":527,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":528,"author":{"gitId":"-"},"content":"### Saving data","lastModifiedDate":"2020-05-23"},{"lineNumber":529,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":530,"author":{"gitId":"-"},"content":"1. Dealing with missing/corrupted data files","lastModifiedDate":"2020-05-23"},{"lineNumber":531,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":532,"author":{"gitId":"-"},"content":" 1. _{explain how to simulate a missing/corrupted file, and the expected behavior}_","lastModifiedDate":"2020-05-23"},{"lineNumber":533,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":534,"author":{"gitId":"-"},"content":"1. _{ more test cases …​ }_","lastModifiedDate":"2020-05-23"}],"authorContributionMap":{"HM33-Stu":169,"LWS49":5,"-":360}},{"path":"docs/Documentation.md","fileType":"docs","lines":[{"lineNumber":1,"author":{"gitId":"-"},"content":"---","lastModifiedDate":"2020-05-23"},{"lineNumber":2,"author":{"gitId":"jieqiboh"},"content":"layout: page","lastModifiedDate":"2024-03-02"},{"lineNumber":3,"author":{"gitId":"jieqiboh"},"content":"title: Documentation guide","lastModifiedDate":"2024-03-02"},{"lineNumber":4,"author":{"gitId":"-"},"content":"---","lastModifiedDate":"2020-05-23"},{"lineNumber":5,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":6,"author":{"gitId":"jieqiboh"},"content":"**Setting up and maintaining the project website:**","lastModifiedDate":"2024-03-02"},{"lineNumber":7,"author":{"gitId":"jieqiboh"},"content":"","lastModifiedDate":"2024-03-02"},{"lineNumber":8,"author":{"gitId":"jieqiboh"},"content":"* We use [**Jekyll**](https://jekyllrb.com/) to manage documentation.","lastModifiedDate":"2024-03-02"},{"lineNumber":9,"author":{"gitId":"jieqiboh"},"content":"* The `docs/` folder is used for documentation.","lastModifiedDate":"2024-03-02"},{"lineNumber":10,"author":{"gitId":"jieqiboh"},"content":"* To learn how set it up and maintain the project website, follow the guide [_[se-edu/guides] **Using Jekyll for project documentation**_](https://se-education.org/guides/tutorials/jekyll.html).","lastModifiedDate":"2024-03-02"},{"lineNumber":11,"author":{"gitId":"jieqiboh"},"content":"* Note these points when adapting the documentation to a different project/product:","lastModifiedDate":"2024-03-02"},{"lineNumber":12,"author":{"gitId":"jieqiboh"},"content":" * The \u0027Site-wide settings\u0027 section of the page linked above has information on how to update site-wide elements such as the top navigation bar.","lastModifiedDate":"2024-03-02"},{"lineNumber":13,"author":{"gitId":"jieqiboh"},"content":" * :bulb: In addition to updating content files, you might have to update the config files `docs\\_config.yml` and `docs\\_sass\\minima\\_base.scss` (which contains a reference to `AB-3` that comes into play when converting documentation pages to PDF format).","lastModifiedDate":"2024-03-02"},{"lineNumber":14,"author":{"gitId":"jieqiboh"},"content":"* If you are using Intellij for editing documentation files, you can consider enabling \u0027soft wrapping\u0027 for `*.md` files, as explained in [_[se-edu/guides] **Intellij IDEA: Useful settings**_](https://se-education.org/guides/tutorials/intellijUsefulSettings.html#enabling-soft-wrapping)","lastModifiedDate":"2024-03-02"},{"lineNumber":15,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":16,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":17,"author":{"gitId":"-"},"content":"**Style guidance:**","lastModifiedDate":"2020-06-17"},{"lineNumber":18,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":19,"author":{"gitId":"-"},"content":"* Follow the [**_Google developer documentation style guide_**](https://developers.google.com/style).","lastModifiedDate":"2020-06-17"},{"lineNumber":20,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":21,"author":{"gitId":"jieqiboh"},"content":"* Also relevant is the [_[se-edu/guides] **Markdown coding standard**_](https://se-education.org/guides/conventions/markdown.html)","lastModifiedDate":"2024-03-02"},{"lineNumber":22,"author":{"gitId":"jieqiboh"},"content":"","lastModifiedDate":"2024-03-02"},{"lineNumber":23,"author":{"gitId":"jieqiboh"},"content":"**Diagrams:**","lastModifiedDate":"2024-03-02"},{"lineNumber":24,"author":{"gitId":"jieqiboh"},"content":"","lastModifiedDate":"2024-03-02"},{"lineNumber":25,"author":{"gitId":"jieqiboh"},"content":"* See the [_[se-edu/guides] **Using PlantUML**_](https://se-education.org/guides/tutorials/plantUml.html)","lastModifiedDate":"2024-03-02"},{"lineNumber":26,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":27,"author":{"gitId":"jieqiboh"},"content":"**Converting a document to the PDF format:**","lastModifiedDate":"2024-03-02"},{"lineNumber":28,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":29,"author":{"gitId":"jieqiboh"},"content":"* See the guide [_[se-edu/guides] **Saving web documents as PDF files**_](https://se-education.org/guides/tutorials/savingPdf.html)","lastModifiedDate":"2024-03-02"}],"authorContributionMap":{"jieqiboh":18,"-":11}},{"path":"docs/Logging.md","fileType":"docs","lines":[{"lineNumber":1,"author":{"gitId":"-"},"content":"---","lastModifiedDate":"2020-06-07"},{"lineNumber":2,"author":{"gitId":"jieqiboh"},"content":"layout: page","lastModifiedDate":"2024-03-02"},{"lineNumber":3,"author":{"gitId":"jieqiboh"},"content":"title: Logging guide","lastModifiedDate":"2024-03-02"},{"lineNumber":4,"author":{"gitId":"-"},"content":"---","lastModifiedDate":"2020-06-07"},{"lineNumber":5,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-06-07"},{"lineNumber":6,"author":{"gitId":"-"},"content":"* We are using `java.util.logging` package for logging.","lastModifiedDate":"2020-06-07"},{"lineNumber":7,"author":{"gitId":"-"},"content":"* The `LogsCenter` class is used to manage the logging levels and logging destinations.","lastModifiedDate":"2020-06-07"},{"lineNumber":8,"author":{"gitId":"-"},"content":"* The `Logger` for a class can be obtained using `LogsCenter.getLogger(Class)` which will log messages according to the specified logging level.","lastModifiedDate":"2020-06-07"},{"lineNumber":9,"author":{"gitId":"-"},"content":"* Log messages are output through the console and to a `.log` file.","lastModifiedDate":"2020-06-07"},{"lineNumber":10,"author":{"gitId":"-"},"content":"* The output logging level can be controlled using the `logLevel` setting in the configuration file (See the [Configuration guide](Configuration.md) section).","lastModifiedDate":"2020-06-07"},{"lineNumber":11,"author":{"gitId":"-"},"content":"* **When choosing a level for a log message**, follow the conventions given in [_[se-edu/guides] Java: Logging conventions_](https://se-education.org/guides/conventions/java/logging.html).","lastModifiedDate":"2020-06-07"}],"authorContributionMap":{"jieqiboh":2,"-":9}},{"path":"docs/SettingUp.md","fileType":"docs","lines":[{"lineNumber":1,"author":{"gitId":"-"},"content":"---","lastModifiedDate":"2020-05-23"},{"lineNumber":2,"author":{"gitId":"jieqiboh"},"content":"layout: page","lastModifiedDate":"2024-03-02"},{"lineNumber":3,"author":{"gitId":"jieqiboh"},"content":"title: Setting up and getting started","lastModifiedDate":"2024-03-02"},{"lineNumber":4,"author":{"gitId":"-"},"content":"---","lastModifiedDate":"2020-05-23"},{"lineNumber":5,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":6,"author":{"gitId":"jieqiboh"},"content":"* Table of Contents","lastModifiedDate":"2024-03-02"},{"lineNumber":7,"author":{"gitId":"jieqiboh"},"content":"{:toc}","lastModifiedDate":"2024-03-02"},{"lineNumber":8,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":9,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":10,"author":{"gitId":"-"},"content":"--------------------------------------------------------------------------------------------------------------------","lastModifiedDate":"2020-05-23"},{"lineNumber":11,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":12,"author":{"gitId":"-"},"content":"## Setting up the project in your computer","lastModifiedDate":"2020-05-23"},{"lineNumber":13,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":14,"author":{"gitId":"jieqiboh"},"content":"\u003cdiv markdown\u003d\"span\" class\u003d\"alert alert-warning\"\u003e:exclamation: **Caution:**","lastModifiedDate":"2024-03-02"},{"lineNumber":15,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":16,"author":{"gitId":"-"},"content":"Follow the steps in the following guide precisely. Things will not work out if you deviate in some steps.","lastModifiedDate":"2020-06-07"},{"lineNumber":17,"author":{"gitId":"jieqiboh"},"content":"\u003c/div\u003e","lastModifiedDate":"2024-03-02"},{"lineNumber":18,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":19,"author":{"gitId":"-"},"content":"First, **fork** this repo, and **clone** the fork into your computer.","lastModifiedDate":"2020-06-07"},{"lineNumber":20,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-06-07"},{"lineNumber":21,"author":{"gitId":"-"},"content":"If you plan to use Intellij IDEA (highly recommended):","lastModifiedDate":"2020-06-07"},{"lineNumber":22,"author":{"gitId":"-"},"content":"1. **Configure the JDK**: Follow the guide [_[se-edu/guides] IDEA: Configuring the JDK_](https://se-education.org/guides/tutorials/intellijJdk.html) to to ensure Intellij is configured to use **JDK 11**.","lastModifiedDate":"2020-06-07"},{"lineNumber":23,"author":{"gitId":"jieqiboh"},"content":"1. **Import the project as a Gradle project**: Follow the guide [_[se-edu/guides] IDEA: Importing a Gradle project_](https://se-education.org/guides/tutorials/intellijImportGradleProject.html) to import the project into IDEA.\u003cbr\u003e","lastModifiedDate":"2024-03-02"},{"lineNumber":24,"author":{"gitId":"jieqiboh"},"content":" :exclamation: Note: Importing a Gradle project is slightly different from importing a normal Java project.","lastModifiedDate":"2024-03-02"},{"lineNumber":25,"author":{"gitId":"-"},"content":"1. **Verify the setup**:","lastModifiedDate":"2020-06-07"},{"lineNumber":26,"author":{"gitId":"-"},"content":" 1. Run the `seedu.address.Main` and try a few commands.","lastModifiedDate":"2020-06-07"},{"lineNumber":27,"author":{"gitId":"-"},"content":" 1. [Run the tests](Testing.md) to ensure they all pass.","lastModifiedDate":"2020-06-07"},{"lineNumber":28,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-06-07"},{"lineNumber":29,"author":{"gitId":"-"},"content":"--------------------------------------------------------------------------------------------------------------------","lastModifiedDate":"2020-05-23"},{"lineNumber":30,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":31,"author":{"gitId":"-"},"content":"## Before writing code","lastModifiedDate":"2020-05-23"},{"lineNumber":32,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":33,"author":{"gitId":"-"},"content":"1. **Configure the coding style**","lastModifiedDate":"2020-06-07"},{"lineNumber":34,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":35,"author":{"gitId":"-"},"content":" If using IDEA, follow the guide [_[se-edu/guides] IDEA: Configuring the code style_](https://se-education.org/guides/tutorials/intellijCodeStyle.html) to set up IDEA\u0027s coding style to match ours.","lastModifiedDate":"2020-09-15"},{"lineNumber":36,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":37,"author":{"gitId":"jieqiboh"},"content":" \u003cdiv markdown\u003d\"span\" class\u003d\"alert alert-primary\"\u003e:bulb: **Tip:**","lastModifiedDate":"2024-03-02"},{"lineNumber":38,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":39,"author":{"gitId":"-"},"content":" Optionally, you can follow the guide [_[se-edu/guides] Using Checkstyle_](https://se-education.org/guides/tutorials/checkstyle.html) to find how to use the CheckStyle within IDEA e.g., to report problems _as_ you write code.","lastModifiedDate":"2020-06-07"},{"lineNumber":40,"author":{"gitId":"jieqiboh"},"content":" \u003c/div\u003e","lastModifiedDate":"2024-03-02"},{"lineNumber":41,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":42,"author":{"gitId":"-"},"content":"1. **Set up CI**","lastModifiedDate":"2020-06-07"},{"lineNumber":43,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":44,"author":{"gitId":"-"},"content":" This project comes with a GitHub Actions config files (in `.github/workflows` folder). When GitHub detects those files, it will run the CI for your project automatically at each push to the `master` branch or to any PR. No set up required.","lastModifiedDate":"2020-05-23"},{"lineNumber":45,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":46,"author":{"gitId":"-"},"content":"1. **Learn the design**","lastModifiedDate":"2020-06-07"},{"lineNumber":47,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":48,"author":{"gitId":"-"},"content":" When you are ready to start coding, we recommend that you get some sense of the overall design by reading about [AddressBook’s architecture](DeveloperGuide.md#architecture).","lastModifiedDate":"2020-06-07"},{"lineNumber":49,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":50,"author":{"gitId":"-"},"content":"1. **Do the tutorials**","lastModifiedDate":"2020-06-07"},{"lineNumber":51,"author":{"gitId":"-"},"content":" These tutorials will help you get acquainted with the codebase.","lastModifiedDate":"2020-05-23"},{"lineNumber":52,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":53,"author":{"gitId":"-"},"content":" * [Tracing code](tutorials/TracingCode.md)","lastModifiedDate":"2020-07-29"},{"lineNumber":54,"author":{"gitId":"-"},"content":" * [Adding a new command](tutorials/AddRemark.md)","lastModifiedDate":"2020-07-29"},{"lineNumber":55,"author":{"gitId":"-"},"content":" * [Removing fields](tutorials/RemovingFields.md)","lastModifiedDate":"2021-08-01"}],"authorContributionMap":{"jieqiboh":10,"-":45}},{"path":"docs/Testing.md","fileType":"docs","lines":[{"lineNumber":1,"author":{"gitId":"-"},"content":"---","lastModifiedDate":"2020-05-23"},{"lineNumber":2,"author":{"gitId":"jieqiboh"},"content":"layout: page","lastModifiedDate":"2024-03-02"},{"lineNumber":3,"author":{"gitId":"jieqiboh"},"content":"title: Testing guide","lastModifiedDate":"2024-03-02"},{"lineNumber":4,"author":{"gitId":"-"},"content":"---","lastModifiedDate":"2020-05-23"},{"lineNumber":5,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":6,"author":{"gitId":"jieqiboh"},"content":"* Table of Contents","lastModifiedDate":"2024-03-02"},{"lineNumber":7,"author":{"gitId":"jieqiboh"},"content":"{:toc}","lastModifiedDate":"2024-03-02"},{"lineNumber":8,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":9,"author":{"gitId":"jieqiboh"},"content":"--------------------------------------------------------------------------------------------------------------------","lastModifiedDate":"2024-03-02"},{"lineNumber":10,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":11,"author":{"gitId":"-"},"content":"## Running tests","lastModifiedDate":"2020-05-23"},{"lineNumber":12,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":13,"author":{"gitId":"-"},"content":"There are two ways to run tests.","lastModifiedDate":"2020-05-23"},{"lineNumber":14,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":15,"author":{"gitId":"-"},"content":"* **Method 1: Using IntelliJ JUnit test runner**","lastModifiedDate":"2020-05-23"},{"lineNumber":16,"author":{"gitId":"-"},"content":" * To run all tests, right-click on the `src/test/java` folder and choose `Run \u0027All Tests\u0027`","lastModifiedDate":"2020-05-23"},{"lineNumber":17,"author":{"gitId":"-"},"content":" * To run a subset of tests, you can right-click on a test package,","lastModifiedDate":"2020-05-23"},{"lineNumber":18,"author":{"gitId":"-"},"content":" test class, or a test and choose `Run \u0027ABC\u0027`","lastModifiedDate":"2020-05-23"},{"lineNumber":19,"author":{"gitId":"-"},"content":"* **Method 2: Using Gradle**","lastModifiedDate":"2020-05-23"},{"lineNumber":20,"author":{"gitId":"-"},"content":" * Open a console and run the command `gradlew clean test` (Mac/Linux: `./gradlew clean test`)","lastModifiedDate":"2020-05-23"},{"lineNumber":21,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":22,"author":{"gitId":"jieqiboh"},"content":"\u003cdiv markdown\u003d\"span\" class\u003d\"alert alert-secondary\"\u003e:link: **Link**: Read [this Gradle Tutorial from the se-edu/guides](https://se-education.org/guides/tutorials/gradle.html) to learn more about using Gradle.","lastModifiedDate":"2024-03-02"},{"lineNumber":23,"author":{"gitId":"jieqiboh"},"content":"\u003c/div\u003e","lastModifiedDate":"2024-03-02"},{"lineNumber":24,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":25,"author":{"gitId":"-"},"content":"--------------------------------------------------------------------------------------------------------------------","lastModifiedDate":"2020-05-23"},{"lineNumber":26,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":27,"author":{"gitId":"-"},"content":"## Types of tests","lastModifiedDate":"2020-05-23"},{"lineNumber":28,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":29,"author":{"gitId":"-"},"content":"This project has three types of tests:","lastModifiedDate":"2020-05-23"},{"lineNumber":30,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":31,"author":{"gitId":"-"},"content":"1. *Unit tests* targeting the lowest level methods/classes.\u003cbr\u003e","lastModifiedDate":"2020-05-23"},{"lineNumber":32,"author":{"gitId":"-"},"content":" e.g. `seedu.address.commons.StringUtilTest`","lastModifiedDate":"2020-05-23"},{"lineNumber":33,"author":{"gitId":"-"},"content":"1. *Integration tests* that are checking the integration of multiple code units (those code units are assumed to be working).\u003cbr\u003e","lastModifiedDate":"2020-05-23"},{"lineNumber":34,"author":{"gitId":"-"},"content":" e.g. `seedu.address.storage.StorageManagerTest`","lastModifiedDate":"2020-05-23"},{"lineNumber":35,"author":{"gitId":"-"},"content":"1. Hybrids of unit and integration tests. These test are checking multiple code units as well as how the are connected together.\u003cbr\u003e","lastModifiedDate":"2020-05-23"},{"lineNumber":36,"author":{"gitId":"-"},"content":" e.g. `seedu.address.logic.LogicManagerTest`","lastModifiedDate":"2020-05-23"}],"authorContributionMap":{"jieqiboh":7,"-":29}},{"path":"docs/UserGuide.md","fileType":"docs","lines":[{"lineNumber":1,"author":{"gitId":"-"},"content":"---","lastModifiedDate":"2020-05-23"},{"lineNumber":2,"author":{"gitId":"CaptainKeqing"},"content":"layout: page","lastModifiedDate":"2024-03-02"},{"lineNumber":3,"author":{"gitId":"CaptainKeqing"},"content":"title: User Guide","lastModifiedDate":"2024-03-02"},{"lineNumber":4,"author":{"gitId":"-"},"content":"---","lastModifiedDate":"2020-05-23"},{"lineNumber":5,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":6,"author":{"gitId":"CaptainKeqing"},"content":"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.","lastModifiedDate":"2024-03-02"},{"lineNumber":7,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":8,"author":{"gitId":"CaptainKeqing"},"content":"* Table of Contents","lastModifiedDate":"2024-03-02"},{"lineNumber":9,"author":{"gitId":"CaptainKeqing"},"content":" {:toc}","lastModifiedDate":"2024-03-02"},{"lineNumber":10,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":11,"author":{"gitId":"-"},"content":"--------------------------------------------------------------------------------------------------------------------","lastModifiedDate":"2020-05-23"},{"lineNumber":12,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":13,"author":{"gitId":"-"},"content":"## Quick start","lastModifiedDate":"2020-05-23"},{"lineNumber":14,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":15,"author":{"gitId":"-"},"content":"1. Ensure you have Java `11` or above installed in your Computer.","lastModifiedDate":"2020-05-23"},{"lineNumber":16,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":17,"author":{"gitId":"-"},"content":"1. Download the latest `addressbook.jar` from [here](https://github.com/se-edu/addressbook-level3/releases).","lastModifiedDate":"2020-05-23"},{"lineNumber":18,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":19,"author":{"gitId":"theman-oj10"},"content":"1. Copy the file to the folder you want to use as the _home folder_ for your CareerSync.","lastModifiedDate":"2024-03-02"},{"lineNumber":20,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":21,"author":{"gitId":"-"},"content":"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.\u003cbr\u003e","lastModifiedDate":"2023-01-01"},{"lineNumber":22,"author":{"gitId":"-"},"content":" A GUI similar to the below should appear in a few seconds. Note how the app contains some sample data.\u003cbr\u003e","lastModifiedDate":"2023-01-01"},{"lineNumber":23,"author":{"gitId":"-"},"content":" ![Ui](images/Ui.png)","lastModifiedDate":"2020-05-23"},{"lineNumber":24,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":25,"author":{"gitId":"-"},"content":"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.\u003cbr\u003e","lastModifiedDate":"2020-05-23"},{"lineNumber":26,"author":{"gitId":"-"},"content":" Some example commands you can try:","lastModifiedDate":"2020-05-23"},{"lineNumber":27,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":28,"author":{"gitId":"-"},"content":" * `list` : Lists all contacts.","lastModifiedDate":"2023-01-01"},{"lineNumber":29,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":30,"author":{"gitId":"HM33-Stu"},"content":" * `add /company Titktok /email hr@tiktok.com /number 9089030 /location remote /status ongoing /description create new recommendation engine /role Software Intern` : Adds the internship entry to the CareerSync application.","lastModifiedDate":"2024-03-01"},{"lineNumber":31,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":32,"author":{"gitId":"HM33-Stu"},"content":" * `delete 2` : Deletes the 2nd internship entry shown in the current list.","lastModifiedDate":"2024-03-01"},{"lineNumber":33,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":34,"author":{"gitId":"-"},"content":" * `clear` : Deletes all contacts.","lastModifiedDate":"2023-01-01"},{"lineNumber":35,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":36,"author":{"gitId":"-"},"content":" * `exit` : Exits the app.","lastModifiedDate":"2023-01-01"},{"lineNumber":37,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":38,"author":{"gitId":"-"},"content":"1. Refer to the [Features](#features) below for details of each command.","lastModifiedDate":"2020-05-23"},{"lineNumber":39,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":40,"author":{"gitId":"-"},"content":"--------------------------------------------------------------------------------------------------------------------","lastModifiedDate":"2020-05-23"},{"lineNumber":41,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":42,"author":{"gitId":"-"},"content":"## Features","lastModifiedDate":"2020-05-23"},{"lineNumber":43,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":44,"author":{"gitId":"CaptainKeqing"},"content":"\u003cdiv markdown\u003d\"block\" class\u003d\"alert alert-info\"\u003e","lastModifiedDate":"2024-03-02"},{"lineNumber":45,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":46,"author":{"gitId":"CaptainKeqing"},"content":"**:information_source: Notes about the command format:**\u003cbr\u003e","lastModifiedDate":"2024-03-02"},{"lineNumber":47,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":48,"author":{"gitId":"-"},"content":"* Words in `UPPER_CASE` are the parameters to be supplied by the user.\u003cbr\u003e","lastModifiedDate":"2020-05-23"},{"lineNumber":49,"author":{"gitId":"-"},"content":" e.g. in `add n/NAME`, `NAME` is a parameter which can be used as `add n/John Doe`.","lastModifiedDate":"2020-05-23"},{"lineNumber":50,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":51,"author":{"gitId":"-"},"content":"* Items in square brackets are optional.\u003cbr\u003e","lastModifiedDate":"2020-05-23"},{"lineNumber":52,"author":{"gitId":"-"},"content":" e.g `n/NAME [t/TAG]` can be used as `n/John Doe t/friend` or as `n/John Doe`.","lastModifiedDate":"2020-05-23"},{"lineNumber":53,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":54,"author":{"gitId":"-"},"content":"* Items with `…`​ after them can be used multiple times including zero times.\u003cbr\u003e","lastModifiedDate":"2020-05-23"},{"lineNumber":55,"author":{"gitId":"-"},"content":" e.g. `[t/TAG]…​` can be used as ` ` (i.e. 0 times), `t/friend`, `t/friend t/family` etc.","lastModifiedDate":"2020-05-23"},{"lineNumber":56,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":57,"author":{"gitId":"-"},"content":"* Parameters can be in any order.\u003cbr\u003e","lastModifiedDate":"2020-05-23"},{"lineNumber":58,"author":{"gitId":"-"},"content":" e.g. if the command specifies `n/NAME p/PHONE_NUMBER`, `p/PHONE_NUMBER n/NAME` is also acceptable.","lastModifiedDate":"2020-05-23"},{"lineNumber":59,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":60,"author":{"gitId":"-"},"content":"* Extraneous parameters for commands that do not take in parameters (such as `help`, `list`, `exit` and `clear`) will be ignored.\u003cbr\u003e","lastModifiedDate":"2021-02-03"},{"lineNumber":61,"author":{"gitId":"-"},"content":" e.g. if the command specifies `help 123`, it will be interpreted as `help`.","lastModifiedDate":"2021-02-03"},{"lineNumber":62,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2021-02-03"},{"lineNumber":63,"author":{"gitId":"-"},"content":"* 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.","lastModifiedDate":"2023-06-26"},{"lineNumber":64,"author":{"gitId":"CaptainKeqing"},"content":"\u003c/div\u003e","lastModifiedDate":"2024-03-02"},{"lineNumber":65,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":66,"author":{"gitId":"-"},"content":"### Viewing help : `help`","lastModifiedDate":"2020-05-23"},{"lineNumber":67,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":68,"author":{"gitId":"-"},"content":"Shows a message explaning how to access the help page.","lastModifiedDate":"2020-05-23"},{"lineNumber":69,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":70,"author":{"gitId":"-"},"content":"![help message](images/helpMessage.png)","lastModifiedDate":"2020-05-23"},{"lineNumber":71,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":72,"author":{"gitId":"-"},"content":"Format: `help`","lastModifiedDate":"2020-05-23"},{"lineNumber":73,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":74,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":75,"author":{"gitId":"HM33-Stu"},"content":"### Adding an entry: `add`","lastModifiedDate":"2024-03-01"},{"lineNumber":76,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":77,"author":{"gitId":"HM33-Stu"},"content":"Add an internship entry and all the relevant fields","lastModifiedDate":"2024-03-01"},{"lineNumber":78,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":79,"author":{"gitId":"HM33-Stu"},"content":"Format: `add /company COMPANY_NAME /description DESCRIPTION /status STATUS [/pocname NAME_OF_CONTACT] [/email EMAIL_OF_CONTACT] [/number NUMBER_OF_CONTACT] [/location LOCATION_ENUM] [/role ROLE]​`","lastModifiedDate":"2024-03-01"},{"lineNumber":80,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":81,"author":{"gitId":"-"},"content":"Examples:","lastModifiedDate":"2020-05-23"},{"lineNumber":82,"author":{"gitId":"HM33-Stu"},"content":"* `add /company Titktok /email hr@tiktok.com /number 9089030 /location remote /status ongoing /description create new recommendation engine /role Software Intern`","lastModifiedDate":"2024-03-01"},{"lineNumber":83,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":84,"author":{"gitId":"-"},"content":"### Listing all persons : `list`","lastModifiedDate":"2020-05-23"},{"lineNumber":85,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":86,"author":{"gitId":"theman-oj10"},"content":"Shows a list of all internships in the application","lastModifiedDate":"2024-03-02"},{"lineNumber":87,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":88,"author":{"gitId":"-"},"content":"Format: `list`","lastModifiedDate":"2020-05-23"},{"lineNumber":89,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":90,"author":{"gitId":"CaptainKeqing"},"content":"### Viewing an internship entry\u0027s details","lastModifiedDate":"2024-03-02"},{"lineNumber":91,"author":{"gitId":"CaptainKeqing"},"content":"","lastModifiedDate":"2024-03-02"},{"lineNumber":92,"author":{"gitId":"CaptainKeqing"},"content":"This feature is accessible by clicking on an internship entry in the internship list.","lastModifiedDate":"2024-03-02"},{"lineNumber":93,"author":{"gitId":"CaptainKeqing"},"content":"Click the back button to return to the previous view of internship entries.","lastModifiedDate":"2024-03-02"},{"lineNumber":94,"author":{"gitId":"CaptainKeqing"},"content":"","lastModifiedDate":"2024-03-02"},{"lineNumber":95,"author":{"gitId":"CaptainKeqing"},"content":"Shows the full details of an internship entry. This replaces the current view of internship entries.","lastModifiedDate":"2024-03-02"},{"lineNumber":96,"author":{"gitId":"CaptainKeqing"},"content":"","lastModifiedDate":"2024-03-02"},{"lineNumber":97,"author":{"gitId":"CaptainKeqing"},"content":"CLI input will be implemented in a future release.","lastModifiedDate":"2024-03-02"},{"lineNumber":98,"author":{"gitId":"CaptainKeqing"},"content":"","lastModifiedDate":"2024-03-02"},{"lineNumber":99,"author":{"gitId":"-"},"content":"### Editing a person : `edit`","lastModifiedDate":"2020-05-23"},{"lineNumber":100,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":101,"author":{"gitId":"theman-oj10"},"content":"Edits an existing internship entry in the application.","lastModifiedDate":"2024-03-02"},{"lineNumber":102,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":103,"author":{"gitId":"LWS49"},"content":"Format: `edit INDEX [/company COMPANY_NAME] [/pocname NAME_OF_CONTACT] [/email EMAIL_OF_CONTACT] [/number NUMBER_OF_CONTACT] [/location LOCATION_ENUM] [/status STATUS] [/description DESCRIPTION] [/role ROLE] …​`","lastModifiedDate":"2024-03-02"},{"lineNumber":104,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":105,"author":{"gitId":"-"},"content":"* 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, …​","lastModifiedDate":"2020-05-23"},{"lineNumber":106,"author":{"gitId":"LWS49"},"content":"* At least one of the optional fields must be provided. Multiple fields can be edited at once.","lastModifiedDate":"2024-03-02"},{"lineNumber":107,"author":{"gitId":"-"},"content":"* Existing values will be updated to the input values.","lastModifiedDate":"2020-05-23"},{"lineNumber":108,"author":{"gitId":"LWS49"},"content":"* When editing status, only the valid statuses will be accepeted. Not-valid statuses will cause the command to be rejected.","lastModifiedDate":"2024-03-02"},{"lineNumber":109,"author":{"gitId":"LWS49"},"content":"","lastModifiedDate":"2024-03-02"},{"lineNumber":110,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":111,"author":{"gitId":"-"},"content":"Examples:","lastModifiedDate":"2020-05-23"},{"lineNumber":112,"author":{"gitId":"LWS49"},"content":"* `edit 1 /email nussu@u.nus.edu /number 9666 1666` Edits the email and phone number of the 1st person to be `nussu@u.nus.edu` and `9666 1666` respectively.","lastModifiedDate":"2024-03-02"},{"lineNumber":113,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":114,"author":{"gitId":"-"},"content":"### Locating persons by name: `find`","lastModifiedDate":"2020-05-23"},{"lineNumber":115,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":116,"author":{"gitId":"theman-oj10"},"content":"Finds internship entries whose names contain any of the given keywords.","lastModifiedDate":"2024-03-02"},{"lineNumber":117,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":118,"author":{"gitId":"-"},"content":"Format: `find KEYWORD [MORE_KEYWORDS]`","lastModifiedDate":"2020-05-23"},{"lineNumber":119,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":120,"author":{"gitId":"-"},"content":"* The search is case-insensitive. e.g `hans` will match `Hans`","lastModifiedDate":"2020-05-23"},{"lineNumber":121,"author":{"gitId":"-"},"content":"* The order of the keywords does not matter. e.g. `Hans Bo` will match `Bo Hans`","lastModifiedDate":"2020-05-23"},{"lineNumber":122,"author":{"gitId":"-"},"content":"* Only the name is searched.","lastModifiedDate":"2020-05-23"},{"lineNumber":123,"author":{"gitId":"-"},"content":"* Only full words will be matched e.g. `Han` will not match `Hans`","lastModifiedDate":"2020-05-23"},{"lineNumber":124,"author":{"gitId":"-"},"content":"* Persons matching at least one keyword will be returned (i.e. `OR` search).","lastModifiedDate":"2020-05-23"},{"lineNumber":125,"author":{"gitId":"-"},"content":" e.g. `Hans Bo` will return `Hans Gruber`, `Bo Yang`","lastModifiedDate":"2020-05-23"},{"lineNumber":126,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":127,"author":{"gitId":"-"},"content":"Examples:","lastModifiedDate":"2020-05-23"},{"lineNumber":128,"author":{"gitId":"-"},"content":"* `find John` returns `john` and `John Doe`","lastModifiedDate":"2020-05-23"},{"lineNumber":129,"author":{"gitId":"-"},"content":"* `find alex david` returns `Alex Yeoh`, `David Li`\u003cbr\u003e","lastModifiedDate":"2020-05-23"},{"lineNumber":130,"author":{"gitId":"-"},"content":" ![result for \u0027find alex david\u0027](images/findAlexDavidResult.png)","lastModifiedDate":"2020-05-23"},{"lineNumber":131,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":132,"author":{"gitId":"-"},"content":"### Deleting a person : `delete`","lastModifiedDate":"2020-05-23"},{"lineNumber":133,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":134,"author":{"gitId":"HM33-Stu"},"content":"Deletes the internship entry with the corresponding index (based on the displayed list at point of deletion)","lastModifiedDate":"2024-03-01"},{"lineNumber":135,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":136,"author":{"gitId":"-"},"content":"Format: `delete INDEX`","lastModifiedDate":"2020-05-23"},{"lineNumber":137,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":138,"author":{"gitId":"-"},"content":"* Deletes the person at the specified `INDEX`.","lastModifiedDate":"2020-05-23"},{"lineNumber":139,"author":{"gitId":"HM33-Stu"},"content":"* The index refers to the index number shown in the displayed list of internship entries at point of deletion.","lastModifiedDate":"2024-03-01"},{"lineNumber":140,"author":{"gitId":"-"},"content":"* The index **must be a positive integer** 1, 2, 3, …​","lastModifiedDate":"2020-05-23"},{"lineNumber":141,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":142,"author":{"gitId":"-"},"content":"Examples:","lastModifiedDate":"2020-05-23"},{"lineNumber":143,"author":{"gitId":"HM33-Stu"},"content":"* `list` followed by `delete 7` deletes the 7th entry in the internship entries list.","lastModifiedDate":"2024-03-01"},{"lineNumber":144,"author":{"gitId":"HM33-Stu"},"content":"* `find Google` followed by `delete 1` deletes the 1st entry in the results of the `find` command.","lastModifiedDate":"2024-03-01"},{"lineNumber":145,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":146,"author":{"gitId":"-"},"content":"### Clearing all entries : `clear`","lastModifiedDate":"2020-05-23"},{"lineNumber":147,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":148,"author":{"gitId":"theman-oj10"},"content":"Clears all entries from the application.","lastModifiedDate":"2024-03-02"},{"lineNumber":149,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":150,"author":{"gitId":"-"},"content":"Format: `clear`","lastModifiedDate":"2020-05-23"},{"lineNumber":151,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":152,"author":{"gitId":"-"},"content":"### Exiting the program : `exit`","lastModifiedDate":"2020-05-23"},{"lineNumber":153,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":154,"author":{"gitId":"-"},"content":"Exits the program.","lastModifiedDate":"2020-05-23"},{"lineNumber":155,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":156,"author":{"gitId":"-"},"content":"Format: `exit`","lastModifiedDate":"2020-05-23"},{"lineNumber":157,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":158,"author":{"gitId":"-"},"content":"### Saving the data","lastModifiedDate":"2020-05-23"},{"lineNumber":159,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":160,"author":{"gitId":"theman-oj10"},"content":"CareerSync data are saved in the hard disk automatically after any command that changes the data. There is no need to save manually.","lastModifiedDate":"2024-03-02"},{"lineNumber":161,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":162,"author":{"gitId":"-"},"content":"### Editing the data file","lastModifiedDate":"2021-02-04"},{"lineNumber":163,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2021-02-04"},{"lineNumber":164,"author":{"gitId":"theman-oj10"},"content":"CareerSync 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.","lastModifiedDate":"2024-03-02"},{"lineNumber":165,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2021-02-04"},{"lineNumber":166,"author":{"gitId":"CaptainKeqing"},"content":"\u003cdiv markdown\u003d\"span\" class\u003d\"alert alert-warning\"\u003e:exclamation: **Caution:**","lastModifiedDate":"2024-03-02"},{"lineNumber":167,"author":{"gitId":"theman-oj10"},"content":"If your changes to the data file makes its format invalid, CareerSync 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.\u003cbr\u003e","lastModifiedDate":"2024-03-02"},{"lineNumber":168,"author":{"gitId":"theman-oj10"},"content":"Furthermore, certain edits can cause the CareerSync to behave in unexpected ways (e.g., if a value entered is outside of the acceptable range). Therefore, edit the data file only if you are confident that you can update it correctly.","lastModifiedDate":"2024-03-02"},{"lineNumber":169,"author":{"gitId":"CaptainKeqing"},"content":"\u003c/div\u003e","lastModifiedDate":"2024-03-02"},{"lineNumber":170,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2021-02-04"},{"lineNumber":171,"author":{"gitId":"-"},"content":"### Archiving data files `[coming in v2.0]`","lastModifiedDate":"2020-05-23"},{"lineNumber":172,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":173,"author":{"gitId":"-"},"content":"_Details coming soon ..._","lastModifiedDate":"2021-02-04"},{"lineNumber":174,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":175,"author":{"gitId":"-"},"content":"--------------------------------------------------------------------------------------------------------------------","lastModifiedDate":"2020-05-23"},{"lineNumber":176,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":177,"author":{"gitId":"-"},"content":"## FAQ","lastModifiedDate":"2020-05-23"},{"lineNumber":178,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":179,"author":{"gitId":"-"},"content":"**Q**: How do I transfer my data to another Computer?\u003cbr\u003e","lastModifiedDate":"2020-05-23"},{"lineNumber":180,"author":{"gitId":"theman-oj10"},"content":"**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 CareerSync home folder.","lastModifiedDate":"2024-03-02"},{"lineNumber":181,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":182,"author":{"gitId":"-"},"content":"--------------------------------------------------------------------------------------------------------------------","lastModifiedDate":"2020-05-23"},{"lineNumber":183,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":184,"author":{"gitId":"-"},"content":"## Known issues","lastModifiedDate":"2023-09-08"},{"lineNumber":185,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2023-09-08"},{"lineNumber":186,"author":{"gitId":"-"},"content":"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.","lastModifiedDate":"2023-09-08"},{"lineNumber":187,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2023-09-08"},{"lineNumber":188,"author":{"gitId":"-"},"content":"--------------------------------------------------------------------------------------------------------------------","lastModifiedDate":"2023-09-08"},{"lineNumber":189,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2023-09-08"},{"lineNumber":190,"author":{"gitId":"-"},"content":"## Command summary","lastModifiedDate":"2020-05-23"},{"lineNumber":191,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":192,"author":{"gitId":"-"},"content":"Action | Format, Examples","lastModifiedDate":"2020-05-23"},{"lineNumber":193,"author":{"gitId":"CaptainKeqing"},"content":"--------|------------------","lastModifiedDate":"2024-03-02"},{"lineNumber":194,"author":{"gitId":"HM33-Stu"},"content":"**Add** |`add /company COMPANY_NAME /description DESCRIPTION /status STATUS [/pocname NAME_OF_CONTACT] [/email EMAIL_OF_CONTACT] [/number NUMBER_OF_CONTACT] [/location LOCATION_ENUM] [/role ROLE]`","lastModifiedDate":"2024-03-01"},{"lineNumber":195,"author":{"gitId":"-"},"content":"**Clear** | `clear`","lastModifiedDate":"2020-05-23"},{"lineNumber":196,"author":{"gitId":"-"},"content":"**Delete** | `delete INDEX`\u003cbr\u003e e.g., `delete 3`","lastModifiedDate":"2020-05-23"},{"lineNumber":197,"author":{"gitId":"LWS49"},"content":"**Edit** | `edit INDEX [/company COMPANY_NAME] [/pocname NAME_OF_CONTACT] [/email EMAIL_OF_CONTACT] [/number NUMBER_OF_CONTACT] [/location LOCATION_ENUM] [/status STATUS] [/description DESCRIPTION] [/role ROLE] `\u003cbr\u003e e.g.,`edit 1 /email nussu@u.nus.edu /number 9666 1666`","lastModifiedDate":"2024-03-02"},{"lineNumber":198,"author":{"gitId":"-"},"content":"**Find** | `find KEYWORD [MORE_KEYWORDS]`\u003cbr\u003e e.g., `find James Jake`","lastModifiedDate":"2020-05-23"},{"lineNumber":199,"author":{"gitId":"-"},"content":"**List** | `list`","lastModifiedDate":"2020-05-23"},{"lineNumber":200,"author":{"gitId":"-"},"content":"**Help** | `help`","lastModifiedDate":"2020-05-23"}],"authorContributionMap":{"HM33-Stu":11,"LWS49":6,"theman-oj10":10,"-":153,"CaptainKeqing":20}},{"path":"docs/_sass/minima/_base.scss","fileType":"other","lines":[{"lineNumber":1,"author":{"gitId":"-"},"content":"html {","lastModifiedDate":"2020-05-23"},{"lineNumber":2,"author":{"gitId":"-"},"content":" font-size: $base-font-size;","lastModifiedDate":"2020-05-23"},{"lineNumber":3,"author":{"gitId":"-"},"content":"}","lastModifiedDate":"2020-05-23"},{"lineNumber":4,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":5,"author":{"gitId":"-"},"content":"/**","lastModifiedDate":"2020-05-23"},{"lineNumber":6,"author":{"gitId":"-"},"content":" * Reset some basic elements","lastModifiedDate":"2020-05-23"},{"lineNumber":7,"author":{"gitId":"-"},"content":" */","lastModifiedDate":"2020-05-23"},{"lineNumber":8,"author":{"gitId":"-"},"content":"body, h1, h2, h3, h4, h5, h6,","lastModifiedDate":"2020-05-23"},{"lineNumber":9,"author":{"gitId":"-"},"content":"p, blockquote, pre, hr,","lastModifiedDate":"2020-05-23"},{"lineNumber":10,"author":{"gitId":"-"},"content":"dl, dd, ol, ul, figure {","lastModifiedDate":"2020-05-23"},{"lineNumber":11,"author":{"gitId":"-"},"content":" margin: 0;","lastModifiedDate":"2020-05-23"},{"lineNumber":12,"author":{"gitId":"-"},"content":" padding: 0;","lastModifiedDate":"2020-05-23"},{"lineNumber":13,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":14,"author":{"gitId":"-"},"content":"}","lastModifiedDate":"2020-05-23"},{"lineNumber":15,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":16,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":17,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":18,"author":{"gitId":"-"},"content":"/**","lastModifiedDate":"2020-05-23"},{"lineNumber":19,"author":{"gitId":"-"},"content":" * Basic styling","lastModifiedDate":"2020-05-23"},{"lineNumber":20,"author":{"gitId":"-"},"content":" */","lastModifiedDate":"2020-05-23"},{"lineNumber":21,"author":{"gitId":"-"},"content":"body {","lastModifiedDate":"2020-05-23"},{"lineNumber":22,"author":{"gitId":"-"},"content":" font: $base-font-weight #{$base-font-size}/#{$base-line-height} $base-font-family;","lastModifiedDate":"2020-05-23"},{"lineNumber":23,"author":{"gitId":"-"},"content":" color: $text-color;","lastModifiedDate":"2020-05-23"},{"lineNumber":24,"author":{"gitId":"-"},"content":" background-color: $background-color;","lastModifiedDate":"2020-05-23"},{"lineNumber":25,"author":{"gitId":"-"},"content":" -webkit-text-size-adjust: 100%;","lastModifiedDate":"2020-05-23"},{"lineNumber":26,"author":{"gitId":"-"},"content":" -webkit-font-feature-settings: \"kern\" 1;","lastModifiedDate":"2020-05-23"},{"lineNumber":27,"author":{"gitId":"-"},"content":" -moz-font-feature-settings: \"kern\" 1;","lastModifiedDate":"2020-05-23"},{"lineNumber":28,"author":{"gitId":"-"},"content":" -o-font-feature-settings: \"kern\" 1;","lastModifiedDate":"2020-05-23"},{"lineNumber":29,"author":{"gitId":"-"},"content":" font-feature-settings: \"kern\" 1;","lastModifiedDate":"2020-05-23"},{"lineNumber":30,"author":{"gitId":"-"},"content":" font-kerning: normal;","lastModifiedDate":"2020-05-23"},{"lineNumber":31,"author":{"gitId":"-"},"content":" display: flex;","lastModifiedDate":"2020-05-23"},{"lineNumber":32,"author":{"gitId":"-"},"content":" min-height: 100vh;","lastModifiedDate":"2020-05-23"},{"lineNumber":33,"author":{"gitId":"-"},"content":" flex-direction: column;","lastModifiedDate":"2020-05-23"},{"lineNumber":34,"author":{"gitId":"-"},"content":" overflow-wrap: break-word;","lastModifiedDate":"2020-05-23"},{"lineNumber":35,"author":{"gitId":"-"},"content":"}","lastModifiedDate":"2020-05-23"},{"lineNumber":36,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":37,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":38,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":39,"author":{"gitId":"-"},"content":"/**","lastModifiedDate":"2020-05-23"},{"lineNumber":40,"author":{"gitId":"-"},"content":" * Set `margin-bottom` to maintain vertical rhythm","lastModifiedDate":"2020-05-23"},{"lineNumber":41,"author":{"gitId":"-"},"content":" */","lastModifiedDate":"2020-05-23"},{"lineNumber":42,"author":{"gitId":"-"},"content":"h1, h2, h3, h4, h5, h6,","lastModifiedDate":"2020-05-23"},{"lineNumber":43,"author":{"gitId":"-"},"content":"p, blockquote, pre,","lastModifiedDate":"2020-05-23"},{"lineNumber":44,"author":{"gitId":"-"},"content":"ul, ol, dl, figure,","lastModifiedDate":"2020-05-23"},{"lineNumber":45,"author":{"gitId":"-"},"content":"%vertical-rhythm {","lastModifiedDate":"2020-05-23"},{"lineNumber":46,"author":{"gitId":"-"},"content":" margin-bottom: $spacing-unit / 2;","lastModifiedDate":"2020-05-23"},{"lineNumber":47,"author":{"gitId":"-"},"content":"}","lastModifiedDate":"2020-05-23"},{"lineNumber":48,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":49,"author":{"gitId":"-"},"content":"hr {","lastModifiedDate":"2020-05-23"},{"lineNumber":50,"author":{"gitId":"-"},"content":" margin-top: $spacing-unit;","lastModifiedDate":"2020-05-23"},{"lineNumber":51,"author":{"gitId":"-"},"content":" margin-bottom: $spacing-unit;","lastModifiedDate":"2020-05-23"},{"lineNumber":52,"author":{"gitId":"-"},"content":"}","lastModifiedDate":"2020-05-23"},{"lineNumber":53,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":54,"author":{"gitId":"-"},"content":"/**","lastModifiedDate":"2020-05-23"},{"lineNumber":55,"author":{"gitId":"-"},"content":" * `main` element","lastModifiedDate":"2020-05-23"},{"lineNumber":56,"author":{"gitId":"-"},"content":" */","lastModifiedDate":"2020-05-23"},{"lineNumber":57,"author":{"gitId":"-"},"content":"main {","lastModifiedDate":"2020-05-23"},{"lineNumber":58,"author":{"gitId":"-"},"content":" display: block; /* Default value of `display` of `main` element is \u0027inline\u0027 in IE 11. */","lastModifiedDate":"2020-05-23"},{"lineNumber":59,"author":{"gitId":"-"},"content":"}","lastModifiedDate":"2020-05-23"},{"lineNumber":60,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":61,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":62,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":63,"author":{"gitId":"-"},"content":"/**","lastModifiedDate":"2020-05-23"},{"lineNumber":64,"author":{"gitId":"-"},"content":" * Images","lastModifiedDate":"2020-05-23"},{"lineNumber":65,"author":{"gitId":"-"},"content":" */","lastModifiedDate":"2020-05-23"},{"lineNumber":66,"author":{"gitId":"-"},"content":"img {","lastModifiedDate":"2020-05-23"},{"lineNumber":67,"author":{"gitId":"-"},"content":" max-width: 100%;","lastModifiedDate":"2020-05-23"},{"lineNumber":68,"author":{"gitId":"-"},"content":" vertical-align: middle;","lastModifiedDate":"2020-05-23"},{"lineNumber":69,"author":{"gitId":"-"},"content":"}","lastModifiedDate":"2020-05-23"},{"lineNumber":70,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":71,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":72,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":73,"author":{"gitId":"-"},"content":"/**","lastModifiedDate":"2020-05-23"},{"lineNumber":74,"author":{"gitId":"-"},"content":" * Figures","lastModifiedDate":"2020-05-23"},{"lineNumber":75,"author":{"gitId":"-"},"content":" */","lastModifiedDate":"2020-05-23"},{"lineNumber":76,"author":{"gitId":"-"},"content":"figure \u003e img {","lastModifiedDate":"2020-05-23"},{"lineNumber":77,"author":{"gitId":"-"},"content":" display: block;","lastModifiedDate":"2020-05-23"},{"lineNumber":78,"author":{"gitId":"-"},"content":"}","lastModifiedDate":"2020-05-23"},{"lineNumber":79,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":80,"author":{"gitId":"-"},"content":"figcaption {","lastModifiedDate":"2020-05-23"},{"lineNumber":81,"author":{"gitId":"-"},"content":" font-size: $small-font-size;","lastModifiedDate":"2020-05-23"},{"lineNumber":82,"author":{"gitId":"-"},"content":"}","lastModifiedDate":"2020-05-23"},{"lineNumber":83,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":84,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":85,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":86,"author":{"gitId":"-"},"content":"/**","lastModifiedDate":"2020-05-23"},{"lineNumber":87,"author":{"gitId":"-"},"content":" * Lists","lastModifiedDate":"2020-05-23"},{"lineNumber":88,"author":{"gitId":"-"},"content":" */","lastModifiedDate":"2020-05-23"},{"lineNumber":89,"author":{"gitId":"-"},"content":"ul, ol {","lastModifiedDate":"2020-05-23"},{"lineNumber":90,"author":{"gitId":"-"},"content":" margin-left: $spacing-unit;","lastModifiedDate":"2020-05-23"},{"lineNumber":91,"author":{"gitId":"-"},"content":"}","lastModifiedDate":"2020-05-23"},{"lineNumber":92,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":93,"author":{"gitId":"-"},"content":"li {","lastModifiedDate":"2020-05-23"},{"lineNumber":94,"author":{"gitId":"-"},"content":" \u003e ul,","lastModifiedDate":"2020-05-23"},{"lineNumber":95,"author":{"gitId":"-"},"content":" \u003e ol {","lastModifiedDate":"2020-05-23"},{"lineNumber":96,"author":{"gitId":"-"},"content":" margin-bottom: 0;","lastModifiedDate":"2020-05-23"},{"lineNumber":97,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2020-05-23"},{"lineNumber":98,"author":{"gitId":"-"},"content":"}","lastModifiedDate":"2020-05-23"},{"lineNumber":99,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":100,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":101,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":102,"author":{"gitId":"-"},"content":"/**","lastModifiedDate":"2020-05-23"},{"lineNumber":103,"author":{"gitId":"-"},"content":" * Headings","lastModifiedDate":"2020-05-23"},{"lineNumber":104,"author":{"gitId":"-"},"content":" */","lastModifiedDate":"2020-05-23"},{"lineNumber":105,"author":{"gitId":"-"},"content":"h1, h2, h3, h4, h5, h6 {","lastModifiedDate":"2020-05-23"},{"lineNumber":106,"author":{"gitId":"-"},"content":" font-weight: $base-font-weight;","lastModifiedDate":"2020-05-23"},{"lineNumber":107,"author":{"gitId":"-"},"content":"}","lastModifiedDate":"2020-05-23"},{"lineNumber":108,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":109,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":110,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":111,"author":{"gitId":"-"},"content":"/**","lastModifiedDate":"2020-05-23"},{"lineNumber":112,"author":{"gitId":"-"},"content":" * Links","lastModifiedDate":"2020-05-23"},{"lineNumber":113,"author":{"gitId":"-"},"content":" */","lastModifiedDate":"2020-05-23"},{"lineNumber":114,"author":{"gitId":"-"},"content":"a {","lastModifiedDate":"2020-05-23"},{"lineNumber":115,"author":{"gitId":"-"},"content":" color: $link-base-color;","lastModifiedDate":"2020-05-23"},{"lineNumber":116,"author":{"gitId":"-"},"content":" text-decoration: none;","lastModifiedDate":"2020-05-23"},{"lineNumber":117,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":118,"author":{"gitId":"-"},"content":" \u0026:visited {","lastModifiedDate":"2020-05-23"},{"lineNumber":119,"author":{"gitId":"-"},"content":" color: $link-visited-color;","lastModifiedDate":"2020-05-23"},{"lineNumber":120,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2020-05-23"},{"lineNumber":121,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":122,"author":{"gitId":"-"},"content":" \u0026:hover {","lastModifiedDate":"2020-05-23"},{"lineNumber":123,"author":{"gitId":"-"},"content":" color: $text-color;","lastModifiedDate":"2020-05-23"},{"lineNumber":124,"author":{"gitId":"-"},"content":" text-decoration: underline;","lastModifiedDate":"2020-05-23"},{"lineNumber":125,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2020-05-23"},{"lineNumber":126,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":127,"author":{"gitId":"-"},"content":" .social-media-list \u0026:hover {","lastModifiedDate":"2020-05-23"},{"lineNumber":128,"author":{"gitId":"-"},"content":" text-decoration: none;","lastModifiedDate":"2020-05-23"},{"lineNumber":129,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":130,"author":{"gitId":"-"},"content":" .username {","lastModifiedDate":"2020-05-23"},{"lineNumber":131,"author":{"gitId":"-"},"content":" text-decoration: underline;","lastModifiedDate":"2020-05-23"},{"lineNumber":132,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2020-05-23"},{"lineNumber":133,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2020-05-23"},{"lineNumber":134,"author":{"gitId":"-"},"content":"}","lastModifiedDate":"2020-05-23"},{"lineNumber":135,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":136,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":137,"author":{"gitId":"-"},"content":"/**","lastModifiedDate":"2020-05-23"},{"lineNumber":138,"author":{"gitId":"-"},"content":" * Blockquotes","lastModifiedDate":"2020-05-23"},{"lineNumber":139,"author":{"gitId":"-"},"content":" */","lastModifiedDate":"2020-05-23"},{"lineNumber":140,"author":{"gitId":"-"},"content":"blockquote {","lastModifiedDate":"2020-05-23"},{"lineNumber":141,"author":{"gitId":"-"},"content":" color: $brand-color;","lastModifiedDate":"2020-05-23"},{"lineNumber":142,"author":{"gitId":"-"},"content":" border-left: 4px solid $brand-color-light;","lastModifiedDate":"2020-05-23"},{"lineNumber":143,"author":{"gitId":"-"},"content":" padding-left: $spacing-unit / 2;","lastModifiedDate":"2020-05-23"},{"lineNumber":144,"author":{"gitId":"-"},"content":" @include relative-font-size(1.125);","lastModifiedDate":"2020-05-23"},{"lineNumber":145,"author":{"gitId":"-"},"content":" font-style: italic;","lastModifiedDate":"2020-05-23"},{"lineNumber":146,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":147,"author":{"gitId":"-"},"content":" \u003e :last-child {","lastModifiedDate":"2020-05-23"},{"lineNumber":148,"author":{"gitId":"-"},"content":" margin-bottom: 0;","lastModifiedDate":"2020-05-23"},{"lineNumber":149,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2020-05-23"},{"lineNumber":150,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":151,"author":{"gitId":"-"},"content":" i, em {","lastModifiedDate":"2020-05-23"},{"lineNumber":152,"author":{"gitId":"-"},"content":" font-style: normal;","lastModifiedDate":"2020-05-23"},{"lineNumber":153,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2020-05-23"},{"lineNumber":154,"author":{"gitId":"-"},"content":"}","lastModifiedDate":"2020-05-23"},{"lineNumber":155,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":156,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":157,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":158,"author":{"gitId":"-"},"content":"/**","lastModifiedDate":"2020-05-23"},{"lineNumber":159,"author":{"gitId":"-"},"content":" * Code formatting","lastModifiedDate":"2020-05-23"},{"lineNumber":160,"author":{"gitId":"-"},"content":" */","lastModifiedDate":"2020-05-23"},{"lineNumber":161,"author":{"gitId":"-"},"content":"pre,","lastModifiedDate":"2020-05-23"},{"lineNumber":162,"author":{"gitId":"-"},"content":"code {","lastModifiedDate":"2020-05-23"},{"lineNumber":163,"author":{"gitId":"-"},"content":" font-family: $code-font-family;","lastModifiedDate":"2020-05-23"},{"lineNumber":164,"author":{"gitId":"-"},"content":" font-size: 0.9375em;","lastModifiedDate":"2020-05-23"},{"lineNumber":165,"author":{"gitId":"-"},"content":" border: 1px solid $brand-color-light;","lastModifiedDate":"2020-05-23"},{"lineNumber":166,"author":{"gitId":"-"},"content":" border-radius: 3px;","lastModifiedDate":"2020-05-23"},{"lineNumber":167,"author":{"gitId":"-"},"content":" background-color: $code-background-color;","lastModifiedDate":"2020-05-23"},{"lineNumber":168,"author":{"gitId":"-"},"content":"}","lastModifiedDate":"2020-05-23"},{"lineNumber":169,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":170,"author":{"gitId":"-"},"content":"code {","lastModifiedDate":"2020-05-23"},{"lineNumber":171,"author":{"gitId":"-"},"content":" padding: 1px 5px;","lastModifiedDate":"2020-05-23"},{"lineNumber":172,"author":{"gitId":"-"},"content":"}","lastModifiedDate":"2020-05-23"},{"lineNumber":173,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":174,"author":{"gitId":"-"},"content":"pre {","lastModifiedDate":"2020-05-23"},{"lineNumber":175,"author":{"gitId":"-"},"content":" padding: 8px 12px;","lastModifiedDate":"2020-05-23"},{"lineNumber":176,"author":{"gitId":"-"},"content":" overflow-x: auto;","lastModifiedDate":"2020-05-23"},{"lineNumber":177,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":178,"author":{"gitId":"-"},"content":" \u003e code {","lastModifiedDate":"2020-05-23"},{"lineNumber":179,"author":{"gitId":"-"},"content":" border: 0;","lastModifiedDate":"2020-05-23"},{"lineNumber":180,"author":{"gitId":"-"},"content":" padding-right: 0;","lastModifiedDate":"2020-05-23"},{"lineNumber":181,"author":{"gitId":"-"},"content":" padding-left: 0;","lastModifiedDate":"2020-05-23"},{"lineNumber":182,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2020-05-23"},{"lineNumber":183,"author":{"gitId":"-"},"content":"}","lastModifiedDate":"2020-05-23"},{"lineNumber":184,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":185,"author":{"gitId":"-"},"content":".highlight {","lastModifiedDate":"2020-05-23"},{"lineNumber":186,"author":{"gitId":"-"},"content":" border-radius: 3px;","lastModifiedDate":"2020-05-23"},{"lineNumber":187,"author":{"gitId":"-"},"content":" background: $code-background-color;","lastModifiedDate":"2020-05-23"},{"lineNumber":188,"author":{"gitId":"-"},"content":" @extend %vertical-rhythm;","lastModifiedDate":"2020-05-23"},{"lineNumber":189,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":190,"author":{"gitId":"-"},"content":" .highlighter-rouge \u0026 {","lastModifiedDate":"2020-05-23"},{"lineNumber":191,"author":{"gitId":"-"},"content":" background: $code-background-color;","lastModifiedDate":"2020-05-23"},{"lineNumber":192,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2020-05-23"},{"lineNumber":193,"author":{"gitId":"-"},"content":"}","lastModifiedDate":"2020-05-23"},{"lineNumber":194,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":195,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":196,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":197,"author":{"gitId":"-"},"content":"/**","lastModifiedDate":"2020-05-23"},{"lineNumber":198,"author":{"gitId":"-"},"content":" * Wrapper","lastModifiedDate":"2020-05-23"},{"lineNumber":199,"author":{"gitId":"-"},"content":" */","lastModifiedDate":"2020-05-23"},{"lineNumber":200,"author":{"gitId":"-"},"content":".wrapper {","lastModifiedDate":"2020-05-23"},{"lineNumber":201,"author":{"gitId":"-"},"content":" max-width: calc(#{$content-width} - (#{$spacing-unit}));","lastModifiedDate":"2020-05-23"},{"lineNumber":202,"author":{"gitId":"-"},"content":" margin-right: auto;","lastModifiedDate":"2020-05-23"},{"lineNumber":203,"author":{"gitId":"-"},"content":" margin-left: auto;","lastModifiedDate":"2020-05-23"},{"lineNumber":204,"author":{"gitId":"-"},"content":" padding-right: $spacing-unit / 2;","lastModifiedDate":"2020-05-23"},{"lineNumber":205,"author":{"gitId":"-"},"content":" padding-left: $spacing-unit / 2;","lastModifiedDate":"2020-05-23"},{"lineNumber":206,"author":{"gitId":"-"},"content":" @extend %clearfix;","lastModifiedDate":"2020-05-23"},{"lineNumber":207,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":208,"author":{"gitId":"-"},"content":" @media screen and (min-width: $on-large) {","lastModifiedDate":"2020-05-23"},{"lineNumber":209,"author":{"gitId":"-"},"content":" max-width: calc(#{$content-width} - (#{$spacing-unit} * 2));","lastModifiedDate":"2020-05-23"},{"lineNumber":210,"author":{"gitId":"-"},"content":" padding-right: $spacing-unit;","lastModifiedDate":"2020-05-23"},{"lineNumber":211,"author":{"gitId":"-"},"content":" padding-left: $spacing-unit;","lastModifiedDate":"2020-05-23"},{"lineNumber":212,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2020-05-23"},{"lineNumber":213,"author":{"gitId":"-"},"content":"}","lastModifiedDate":"2020-05-23"},{"lineNumber":214,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":215,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":216,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":217,"author":{"gitId":"-"},"content":"/**","lastModifiedDate":"2020-05-23"},{"lineNumber":218,"author":{"gitId":"-"},"content":" * Clearfix","lastModifiedDate":"2020-05-23"},{"lineNumber":219,"author":{"gitId":"-"},"content":" */","lastModifiedDate":"2020-05-23"},{"lineNumber":220,"author":{"gitId":"-"},"content":"%clearfix:after {","lastModifiedDate":"2020-05-23"},{"lineNumber":221,"author":{"gitId":"-"},"content":" content: \"\";","lastModifiedDate":"2020-05-23"},{"lineNumber":222,"author":{"gitId":"-"},"content":" display: table;","lastModifiedDate":"2020-05-23"},{"lineNumber":223,"author":{"gitId":"-"},"content":" clear: both;","lastModifiedDate":"2020-05-23"},{"lineNumber":224,"author":{"gitId":"-"},"content":"}","lastModifiedDate":"2020-05-23"},{"lineNumber":225,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":226,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":227,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":228,"author":{"gitId":"-"},"content":"/**","lastModifiedDate":"2020-05-23"},{"lineNumber":229,"author":{"gitId":"-"},"content":" * Icons","lastModifiedDate":"2020-05-23"},{"lineNumber":230,"author":{"gitId":"-"},"content":" */","lastModifiedDate":"2020-05-23"},{"lineNumber":231,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":232,"author":{"gitId":"-"},"content":".orange {","lastModifiedDate":"2020-05-23"},{"lineNumber":233,"author":{"gitId":"-"},"content":" color: #f66a0a;","lastModifiedDate":"2020-05-23"},{"lineNumber":234,"author":{"gitId":"-"},"content":"}","lastModifiedDate":"2020-05-23"},{"lineNumber":235,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":236,"author":{"gitId":"-"},"content":".grey {","lastModifiedDate":"2020-05-23"},{"lineNumber":237,"author":{"gitId":"-"},"content":" color: #828282;","lastModifiedDate":"2020-05-23"},{"lineNumber":238,"author":{"gitId":"-"},"content":"}","lastModifiedDate":"2020-05-23"},{"lineNumber":239,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":240,"author":{"gitId":"-"},"content":"/**","lastModifiedDate":"2020-05-23"},{"lineNumber":241,"author":{"gitId":"-"},"content":" * Tables","lastModifiedDate":"2020-05-23"},{"lineNumber":242,"author":{"gitId":"-"},"content":" */","lastModifiedDate":"2020-05-23"},{"lineNumber":243,"author":{"gitId":"-"},"content":"table {","lastModifiedDate":"2020-05-23"},{"lineNumber":244,"author":{"gitId":"-"},"content":" margin-bottom: $spacing-unit;","lastModifiedDate":"2020-05-23"},{"lineNumber":245,"author":{"gitId":"-"},"content":" width: 100%;","lastModifiedDate":"2020-05-23"},{"lineNumber":246,"author":{"gitId":"-"},"content":" text-align: $table-text-align;","lastModifiedDate":"2020-05-23"},{"lineNumber":247,"author":{"gitId":"-"},"content":" color: $table-text-color;","lastModifiedDate":"2020-05-23"},{"lineNumber":248,"author":{"gitId":"-"},"content":" border-collapse: collapse;","lastModifiedDate":"2020-05-23"},{"lineNumber":249,"author":{"gitId":"-"},"content":" border: 1px solid $table-border-color;","lastModifiedDate":"2020-05-23"},{"lineNumber":250,"author":{"gitId":"-"},"content":" tr {","lastModifiedDate":"2020-05-23"},{"lineNumber":251,"author":{"gitId":"-"},"content":" \u0026:nth-child(even) {","lastModifiedDate":"2020-05-23"},{"lineNumber":252,"author":{"gitId":"-"},"content":" background-color: $table-zebra-color;","lastModifiedDate":"2020-05-23"},{"lineNumber":253,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2020-05-23"},{"lineNumber":254,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2020-05-23"},{"lineNumber":255,"author":{"gitId":"-"},"content":" th, td {","lastModifiedDate":"2020-05-23"},{"lineNumber":256,"author":{"gitId":"-"},"content":" padding: ($spacing-unit / 3) ($spacing-unit / 2);","lastModifiedDate":"2020-05-23"},{"lineNumber":257,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2020-05-23"},{"lineNumber":258,"author":{"gitId":"-"},"content":" th {","lastModifiedDate":"2020-05-23"},{"lineNumber":259,"author":{"gitId":"-"},"content":" background-color: $table-header-bg-color;","lastModifiedDate":"2020-05-23"},{"lineNumber":260,"author":{"gitId":"-"},"content":" border: 1px solid $table-header-border;","lastModifiedDate":"2020-05-23"},{"lineNumber":261,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2020-05-23"},{"lineNumber":262,"author":{"gitId":"-"},"content":" td {","lastModifiedDate":"2020-05-23"},{"lineNumber":263,"author":{"gitId":"-"},"content":" border: 1px solid $table-border-color;","lastModifiedDate":"2020-05-23"},{"lineNumber":264,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2020-05-23"},{"lineNumber":265,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":266,"author":{"gitId":"-"},"content":" @include media-query($on-laptop) {","lastModifiedDate":"2020-05-23"},{"lineNumber":267,"author":{"gitId":"-"},"content":" display: block;","lastModifiedDate":"2020-05-23"},{"lineNumber":268,"author":{"gitId":"-"},"content":" overflow-x: auto;","lastModifiedDate":"2020-05-23"},{"lineNumber":269,"author":{"gitId":"-"},"content":" -webkit-overflow-scrolling: touch;","lastModifiedDate":"2020-05-23"},{"lineNumber":270,"author":{"gitId":"-"},"content":" -ms-overflow-style: -ms-autohiding-scrollbar;","lastModifiedDate":"2020-05-23"},{"lineNumber":271,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2020-05-23"},{"lineNumber":272,"author":{"gitId":"-"},"content":"}","lastModifiedDate":"2020-05-23"},{"lineNumber":273,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2021-01-11"},{"lineNumber":274,"author":{"gitId":"-"},"content":"@media print {","lastModifiedDate":"2021-01-12"},{"lineNumber":275,"author":{"gitId":"-"},"content":" /**","lastModifiedDate":"2021-01-11"},{"lineNumber":276,"author":{"gitId":"-"},"content":" * Prevents page break from cutting through content when printing","lastModifiedDate":"2021-01-12"},{"lineNumber":277,"author":{"gitId":"-"},"content":" */","lastModifiedDate":"2021-01-11"},{"lineNumber":278,"author":{"gitId":"-"},"content":" body {","lastModifiedDate":"2021-01-11"},{"lineNumber":279,"author":{"gitId":"-"},"content":" display: block;","lastModifiedDate":"2021-01-11"},{"lineNumber":280,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2021-01-11"},{"lineNumber":281,"author":{"gitId":"-"},"content":" /**","lastModifiedDate":"2021-01-12"},{"lineNumber":282,"author":{"gitId":"-"},"content":" * Replaces the top navigation menu with the project name when printing","lastModifiedDate":"2021-01-12"},{"lineNumber":283,"author":{"gitId":"-"},"content":" */","lastModifiedDate":"2021-01-12"},{"lineNumber":284,"author":{"gitId":"-"},"content":" .site-header .wrapper {","lastModifiedDate":"2021-01-12"},{"lineNumber":285,"author":{"gitId":"-"},"content":" display: none;","lastModifiedDate":"2021-01-12"},{"lineNumber":286,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2021-01-12"},{"lineNumber":287,"author":{"gitId":"-"},"content":" .site-header {","lastModifiedDate":"2021-01-12"},{"lineNumber":288,"author":{"gitId":"-"},"content":" text-align: center;","lastModifiedDate":"2021-01-12"},{"lineNumber":289,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2021-01-12"},{"lineNumber":290,"author":{"gitId":"-"},"content":" .site-header:before {","lastModifiedDate":"2021-01-12"},{"lineNumber":291,"author":{"gitId":"jieqiboh"},"content":" content: \"CareerSync\";","lastModifiedDate":"2024-02-29"},{"lineNumber":292,"author":{"gitId":"-"},"content":" font-size: 32px;","lastModifiedDate":"2021-01-12"},{"lineNumber":293,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2021-01-11"},{"lineNumber":294,"author":{"gitId":"-"},"content":"}","lastModifiedDate":"2021-01-12"},{"lineNumber":295,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2021-01-12"}],"authorContributionMap":{"jieqiboh":1,"-":294}},{"path":"docs/_sass/minima/_layout.scss","fileType":"other","lines":[{"lineNumber":1,"author":{"gitId":"jieqiboh"},"content":"/**","lastModifiedDate":"2024-03-02"},{"lineNumber":2,"author":{"gitId":"jieqiboh"},"content":" * Site header","lastModifiedDate":"2024-03-02"},{"lineNumber":3,"author":{"gitId":"jieqiboh"},"content":" */","lastModifiedDate":"2024-03-02"},{"lineNumber":4,"author":{"gitId":"jieqiboh"},"content":".site-header {","lastModifiedDate":"2024-03-02"},{"lineNumber":5,"author":{"gitId":"jieqiboh"},"content":" border-top: 5px solid $brand-color-dark;","lastModifiedDate":"2024-03-02"},{"lineNumber":6,"author":{"gitId":"jieqiboh"},"content":" border-bottom: 1px solid $brand-color-light;","lastModifiedDate":"2024-03-02"},{"lineNumber":7,"author":{"gitId":"jieqiboh"},"content":" min-height: $spacing-unit * 1.865;","lastModifiedDate":"2024-03-02"},{"lineNumber":8,"author":{"gitId":"jieqiboh"},"content":" line-height: $base-line-height * $base-font-size * 2.25;","lastModifiedDate":"2024-03-02"},{"lineNumber":9,"author":{"gitId":"jieqiboh"},"content":"","lastModifiedDate":"2024-03-02"},{"lineNumber":10,"author":{"gitId":"jieqiboh"},"content":" // Positioning context for the mobile navigation icon","lastModifiedDate":"2024-03-02"},{"lineNumber":11,"author":{"gitId":"jieqiboh"},"content":" position: relative;","lastModifiedDate":"2024-03-02"},{"lineNumber":12,"author":{"gitId":"jieqiboh"},"content":"}","lastModifiedDate":"2024-03-02"},{"lineNumber":13,"author":{"gitId":"jieqiboh"},"content":"","lastModifiedDate":"2024-03-02"},{"lineNumber":14,"author":{"gitId":"jieqiboh"},"content":".site-title {","lastModifiedDate":"2024-03-02"},{"lineNumber":15,"author":{"gitId":"jieqiboh"},"content":" @include relative-font-size(1.625);","lastModifiedDate":"2024-03-02"},{"lineNumber":16,"author":{"gitId":"jieqiboh"},"content":" font-weight: 300;","lastModifiedDate":"2024-03-02"},{"lineNumber":17,"author":{"gitId":"jieqiboh"},"content":" letter-spacing: -1px;","lastModifiedDate":"2024-03-02"},{"lineNumber":18,"author":{"gitId":"jieqiboh"},"content":" margin-bottom: 0;","lastModifiedDate":"2024-03-02"},{"lineNumber":19,"author":{"gitId":"jieqiboh"},"content":" float: left;","lastModifiedDate":"2024-03-02"},{"lineNumber":20,"author":{"gitId":"jieqiboh"},"content":"","lastModifiedDate":"2024-03-02"},{"lineNumber":21,"author":{"gitId":"jieqiboh"},"content":" @include media-query($on-palm) {","lastModifiedDate":"2024-03-02"},{"lineNumber":22,"author":{"gitId":"jieqiboh"},"content":" padding-right: 45px;","lastModifiedDate":"2024-03-02"},{"lineNumber":23,"author":{"gitId":"jieqiboh"},"content":" }","lastModifiedDate":"2024-03-02"},{"lineNumber":24,"author":{"gitId":"jieqiboh"},"content":"","lastModifiedDate":"2024-03-02"},{"lineNumber":25,"author":{"gitId":"jieqiboh"},"content":" \u0026,","lastModifiedDate":"2024-03-02"},{"lineNumber":26,"author":{"gitId":"jieqiboh"},"content":" \u0026:visited {","lastModifiedDate":"2024-03-02"},{"lineNumber":27,"author":{"gitId":"jieqiboh"},"content":" color: $brand-color-dark;","lastModifiedDate":"2024-03-02"},{"lineNumber":28,"author":{"gitId":"jieqiboh"},"content":" }","lastModifiedDate":"2024-03-02"},{"lineNumber":29,"author":{"gitId":"jieqiboh"},"content":"}","lastModifiedDate":"2024-03-02"},{"lineNumber":30,"author":{"gitId":"jieqiboh"},"content":"","lastModifiedDate":"2024-03-02"},{"lineNumber":31,"author":{"gitId":"jieqiboh"},"content":".site-nav {","lastModifiedDate":"2024-03-02"},{"lineNumber":32,"author":{"gitId":"jieqiboh"},"content":" position: absolute;","lastModifiedDate":"2024-03-02"},{"lineNumber":33,"author":{"gitId":"jieqiboh"},"content":" top: 9px;","lastModifiedDate":"2024-03-02"},{"lineNumber":34,"author":{"gitId":"jieqiboh"},"content":" right: $spacing-unit / 2;","lastModifiedDate":"2024-03-02"},{"lineNumber":35,"author":{"gitId":"jieqiboh"},"content":" background-color: $background-color;","lastModifiedDate":"2024-03-02"},{"lineNumber":36,"author":{"gitId":"jieqiboh"},"content":" border: 1px solid $brand-color-light;","lastModifiedDate":"2024-03-02"},{"lineNumber":37,"author":{"gitId":"jieqiboh"},"content":" border-radius: 5px;","lastModifiedDate":"2024-03-02"},{"lineNumber":38,"author":{"gitId":"jieqiboh"},"content":" text-align: right;","lastModifiedDate":"2024-03-02"},{"lineNumber":39,"author":{"gitId":"jieqiboh"},"content":"","lastModifiedDate":"2024-03-02"},{"lineNumber":40,"author":{"gitId":"jieqiboh"},"content":" .nav-trigger {","lastModifiedDate":"2024-03-02"},{"lineNumber":41,"author":{"gitId":"jieqiboh"},"content":" display: none;","lastModifiedDate":"2024-03-02"},{"lineNumber":42,"author":{"gitId":"jieqiboh"},"content":" }","lastModifiedDate":"2024-03-02"},{"lineNumber":43,"author":{"gitId":"jieqiboh"},"content":"","lastModifiedDate":"2024-03-02"},{"lineNumber":44,"author":{"gitId":"jieqiboh"},"content":" .menu-icon {","lastModifiedDate":"2024-03-02"},{"lineNumber":45,"author":{"gitId":"jieqiboh"},"content":" float: right;","lastModifiedDate":"2024-03-02"},{"lineNumber":46,"author":{"gitId":"jieqiboh"},"content":" width: 36px;","lastModifiedDate":"2024-03-02"},{"lineNumber":47,"author":{"gitId":"jieqiboh"},"content":" height: 26px;","lastModifiedDate":"2024-03-02"},{"lineNumber":48,"author":{"gitId":"jieqiboh"},"content":" line-height: 0;","lastModifiedDate":"2024-03-02"},{"lineNumber":49,"author":{"gitId":"jieqiboh"},"content":" padding-top: 10px;","lastModifiedDate":"2024-03-02"},{"lineNumber":50,"author":{"gitId":"jieqiboh"},"content":" text-align: center;","lastModifiedDate":"2024-03-02"},{"lineNumber":51,"author":{"gitId":"jieqiboh"},"content":"","lastModifiedDate":"2024-03-02"},{"lineNumber":52,"author":{"gitId":"jieqiboh"},"content":" \u003e svg path {","lastModifiedDate":"2024-03-02"},{"lineNumber":53,"author":{"gitId":"jieqiboh"},"content":" fill: $brand-color-dark;","lastModifiedDate":"2024-03-02"},{"lineNumber":54,"author":{"gitId":"jieqiboh"},"content":" }","lastModifiedDate":"2024-03-02"},{"lineNumber":55,"author":{"gitId":"jieqiboh"},"content":" }","lastModifiedDate":"2024-03-02"},{"lineNumber":56,"author":{"gitId":"jieqiboh"},"content":"","lastModifiedDate":"2024-03-02"},{"lineNumber":57,"author":{"gitId":"jieqiboh"},"content":" label[for\u003d\"nav-trigger\"] {","lastModifiedDate":"2024-03-02"},{"lineNumber":58,"author":{"gitId":"jieqiboh"},"content":" display: block;","lastModifiedDate":"2024-03-02"},{"lineNumber":59,"author":{"gitId":"jieqiboh"},"content":" float: right;","lastModifiedDate":"2024-03-02"},{"lineNumber":60,"author":{"gitId":"jieqiboh"},"content":" width: 36px;","lastModifiedDate":"2024-03-02"},{"lineNumber":61,"author":{"gitId":"jieqiboh"},"content":" height: 36px;","lastModifiedDate":"2024-03-02"},{"lineNumber":62,"author":{"gitId":"jieqiboh"},"content":" z-index: 2;","lastModifiedDate":"2024-03-02"},{"lineNumber":63,"author":{"gitId":"jieqiboh"},"content":" cursor: pointer;","lastModifiedDate":"2024-03-02"},{"lineNumber":64,"author":{"gitId":"jieqiboh"},"content":" }","lastModifiedDate":"2024-03-02"},{"lineNumber":65,"author":{"gitId":"jieqiboh"},"content":"","lastModifiedDate":"2024-03-02"},{"lineNumber":66,"author":{"gitId":"jieqiboh"},"content":" input ~ .trigger {","lastModifiedDate":"2024-03-02"},{"lineNumber":67,"author":{"gitId":"jieqiboh"},"content":" clear: both;","lastModifiedDate":"2024-03-02"},{"lineNumber":68,"author":{"gitId":"jieqiboh"},"content":" display: none;","lastModifiedDate":"2024-03-02"},{"lineNumber":69,"author":{"gitId":"jieqiboh"},"content":" }","lastModifiedDate":"2024-03-02"},{"lineNumber":70,"author":{"gitId":"jieqiboh"},"content":"","lastModifiedDate":"2024-03-02"},{"lineNumber":71,"author":{"gitId":"jieqiboh"},"content":" input:checked ~ .trigger {","lastModifiedDate":"2024-03-02"},{"lineNumber":72,"author":{"gitId":"jieqiboh"},"content":" display: block;","lastModifiedDate":"2024-03-02"},{"lineNumber":73,"author":{"gitId":"jieqiboh"},"content":" padding-bottom: 5px;","lastModifiedDate":"2024-03-02"},{"lineNumber":74,"author":{"gitId":"jieqiboh"},"content":" }","lastModifiedDate":"2024-03-02"},{"lineNumber":75,"author":{"gitId":"jieqiboh"},"content":"","lastModifiedDate":"2024-03-02"},{"lineNumber":76,"author":{"gitId":"jieqiboh"},"content":" .page-link {","lastModifiedDate":"2024-03-02"},{"lineNumber":77,"author":{"gitId":"jieqiboh"},"content":" color: $text-color;","lastModifiedDate":"2024-03-02"},{"lineNumber":78,"author":{"gitId":"jieqiboh"},"content":" line-height: $base-line-height;","lastModifiedDate":"2024-03-02"},{"lineNumber":79,"author":{"gitId":"jieqiboh"},"content":" display: block;","lastModifiedDate":"2024-03-02"},{"lineNumber":80,"author":{"gitId":"jieqiboh"},"content":" padding: 5px 10px;","lastModifiedDate":"2024-03-02"},{"lineNumber":81,"author":{"gitId":"jieqiboh"},"content":"","lastModifiedDate":"2024-03-02"},{"lineNumber":82,"author":{"gitId":"jieqiboh"},"content":" // Gaps between nav items, but not on the last one","lastModifiedDate":"2024-03-02"},{"lineNumber":83,"author":{"gitId":"jieqiboh"},"content":" \u0026:not(:last-child) {","lastModifiedDate":"2024-03-02"},{"lineNumber":84,"author":{"gitId":"jieqiboh"},"content":" margin-right: 0;","lastModifiedDate":"2024-03-02"},{"lineNumber":85,"author":{"gitId":"jieqiboh"},"content":" }","lastModifiedDate":"2024-03-02"},{"lineNumber":86,"author":{"gitId":"jieqiboh"},"content":" margin-left: 20px;","lastModifiedDate":"2024-03-02"},{"lineNumber":87,"author":{"gitId":"jieqiboh"},"content":" }","lastModifiedDate":"2024-03-02"},{"lineNumber":88,"author":{"gitId":"jieqiboh"},"content":"","lastModifiedDate":"2024-03-02"},{"lineNumber":89,"author":{"gitId":"jieqiboh"},"content":" @media screen and (min-width: $on-medium) {","lastModifiedDate":"2024-03-02"},{"lineNumber":90,"author":{"gitId":"jieqiboh"},"content":" position: static;","lastModifiedDate":"2024-03-02"},{"lineNumber":91,"author":{"gitId":"jieqiboh"},"content":" float: right;","lastModifiedDate":"2024-03-02"},{"lineNumber":92,"author":{"gitId":"jieqiboh"},"content":" border: none;","lastModifiedDate":"2024-03-02"},{"lineNumber":93,"author":{"gitId":"jieqiboh"},"content":" background-color: inherit;","lastModifiedDate":"2024-03-02"},{"lineNumber":94,"author":{"gitId":"jieqiboh"},"content":"","lastModifiedDate":"2024-03-02"},{"lineNumber":95,"author":{"gitId":"jieqiboh"},"content":" label[for\u003d\"nav-trigger\"] {","lastModifiedDate":"2024-03-02"},{"lineNumber":96,"author":{"gitId":"jieqiboh"},"content":" display: none;","lastModifiedDate":"2024-03-02"},{"lineNumber":97,"author":{"gitId":"jieqiboh"},"content":" }","lastModifiedDate":"2024-03-02"},{"lineNumber":98,"author":{"gitId":"jieqiboh"},"content":"","lastModifiedDate":"2024-03-02"},{"lineNumber":99,"author":{"gitId":"jieqiboh"},"content":" .menu-icon {","lastModifiedDate":"2024-03-02"},{"lineNumber":100,"author":{"gitId":"jieqiboh"},"content":" display: none;","lastModifiedDate":"2024-03-02"},{"lineNumber":101,"author":{"gitId":"jieqiboh"},"content":" }","lastModifiedDate":"2024-03-02"},{"lineNumber":102,"author":{"gitId":"jieqiboh"},"content":"","lastModifiedDate":"2024-03-02"},{"lineNumber":103,"author":{"gitId":"jieqiboh"},"content":" input ~ .trigger {","lastModifiedDate":"2024-03-02"},{"lineNumber":104,"author":{"gitId":"jieqiboh"},"content":" display: block;","lastModifiedDate":"2024-03-02"},{"lineNumber":105,"author":{"gitId":"jieqiboh"},"content":" }","lastModifiedDate":"2024-03-02"},{"lineNumber":106,"author":{"gitId":"jieqiboh"},"content":"","lastModifiedDate":"2024-03-02"},{"lineNumber":107,"author":{"gitId":"jieqiboh"},"content":" .page-link {","lastModifiedDate":"2024-03-02"},{"lineNumber":108,"author":{"gitId":"jieqiboh"},"content":" display: inline;","lastModifiedDate":"2024-03-02"},{"lineNumber":109,"author":{"gitId":"jieqiboh"},"content":" padding: 0;","lastModifiedDate":"2024-03-02"},{"lineNumber":110,"author":{"gitId":"jieqiboh"},"content":"","lastModifiedDate":"2024-03-02"},{"lineNumber":111,"author":{"gitId":"jieqiboh"},"content":" \u0026:not(:last-child) {","lastModifiedDate":"2024-03-02"},{"lineNumber":112,"author":{"gitId":"jieqiboh"},"content":" margin-right: 20px;","lastModifiedDate":"2024-03-02"},{"lineNumber":113,"author":{"gitId":"jieqiboh"},"content":" }","lastModifiedDate":"2024-03-02"},{"lineNumber":114,"author":{"gitId":"jieqiboh"},"content":" margin-left: auto;","lastModifiedDate":"2024-03-02"},{"lineNumber":115,"author":{"gitId":"jieqiboh"},"content":" }","lastModifiedDate":"2024-03-02"},{"lineNumber":116,"author":{"gitId":"jieqiboh"},"content":" }","lastModifiedDate":"2024-03-02"},{"lineNumber":117,"author":{"gitId":"jieqiboh"},"content":"}","lastModifiedDate":"2024-03-02"},{"lineNumber":118,"author":{"gitId":"jieqiboh"},"content":"","lastModifiedDate":"2024-03-02"},{"lineNumber":119,"author":{"gitId":"jieqiboh"},"content":"","lastModifiedDate":"2024-03-02"},{"lineNumber":120,"author":{"gitId":"jieqiboh"},"content":"","lastModifiedDate":"2024-03-02"},{"lineNumber":121,"author":{"gitId":"jieqiboh"},"content":"/**","lastModifiedDate":"2024-03-02"},{"lineNumber":122,"author":{"gitId":"jieqiboh"},"content":" * Page content","lastModifiedDate":"2024-03-02"},{"lineNumber":123,"author":{"gitId":"jieqiboh"},"content":" */","lastModifiedDate":"2024-03-02"},{"lineNumber":124,"author":{"gitId":"jieqiboh"},"content":".page-content {","lastModifiedDate":"2024-03-02"},{"lineNumber":125,"author":{"gitId":"jieqiboh"},"content":" padding: $spacing-unit 0;","lastModifiedDate":"2024-03-02"},{"lineNumber":126,"author":{"gitId":"jieqiboh"},"content":" flex: 1 0 auto;","lastModifiedDate":"2024-03-02"},{"lineNumber":127,"author":{"gitId":"jieqiboh"},"content":"}","lastModifiedDate":"2024-03-02"},{"lineNumber":128,"author":{"gitId":"jieqiboh"},"content":"","lastModifiedDate":"2024-03-02"},{"lineNumber":129,"author":{"gitId":"jieqiboh"},"content":".page-heading {","lastModifiedDate":"2024-03-02"},{"lineNumber":130,"author":{"gitId":"jieqiboh"},"content":" @include relative-font-size(2);","lastModifiedDate":"2024-03-02"},{"lineNumber":131,"author":{"gitId":"jieqiboh"},"content":"}","lastModifiedDate":"2024-03-02"},{"lineNumber":132,"author":{"gitId":"jieqiboh"},"content":"","lastModifiedDate":"2024-03-02"},{"lineNumber":133,"author":{"gitId":"jieqiboh"},"content":".post-list-heading {","lastModifiedDate":"2024-03-02"},{"lineNumber":134,"author":{"gitId":"jieqiboh"},"content":" @include relative-font-size(1.75);","lastModifiedDate":"2024-03-02"},{"lineNumber":135,"author":{"gitId":"jieqiboh"},"content":"}","lastModifiedDate":"2024-03-02"},{"lineNumber":136,"author":{"gitId":"jieqiboh"},"content":"","lastModifiedDate":"2024-03-02"},{"lineNumber":137,"author":{"gitId":"jieqiboh"},"content":".post-list {","lastModifiedDate":"2024-03-02"},{"lineNumber":138,"author":{"gitId":"jieqiboh"},"content":" margin-left: 0;","lastModifiedDate":"2024-03-02"},{"lineNumber":139,"author":{"gitId":"jieqiboh"},"content":" list-style: none;","lastModifiedDate":"2024-03-02"},{"lineNumber":140,"author":{"gitId":"jieqiboh"},"content":"","lastModifiedDate":"2024-03-02"},{"lineNumber":141,"author":{"gitId":"jieqiboh"},"content":" \u003e li {","lastModifiedDate":"2024-03-02"},{"lineNumber":142,"author":{"gitId":"jieqiboh"},"content":" margin-bottom: $spacing-unit;","lastModifiedDate":"2024-03-02"},{"lineNumber":143,"author":{"gitId":"jieqiboh"},"content":" }","lastModifiedDate":"2024-03-02"},{"lineNumber":144,"author":{"gitId":"jieqiboh"},"content":"}","lastModifiedDate":"2024-03-02"},{"lineNumber":145,"author":{"gitId":"jieqiboh"},"content":"","lastModifiedDate":"2024-03-02"},{"lineNumber":146,"author":{"gitId":"jieqiboh"},"content":".post-meta {","lastModifiedDate":"2024-03-02"},{"lineNumber":147,"author":{"gitId":"jieqiboh"},"content":" font-size: $small-font-size;","lastModifiedDate":"2024-03-02"},{"lineNumber":148,"author":{"gitId":"jieqiboh"},"content":" color: $brand-color;","lastModifiedDate":"2024-03-02"},{"lineNumber":149,"author":{"gitId":"jieqiboh"},"content":"}","lastModifiedDate":"2024-03-02"},{"lineNumber":150,"author":{"gitId":"jieqiboh"},"content":"","lastModifiedDate":"2024-03-02"},{"lineNumber":151,"author":{"gitId":"jieqiboh"},"content":".post-link {","lastModifiedDate":"2024-03-02"},{"lineNumber":152,"author":{"gitId":"jieqiboh"},"content":" display: block;","lastModifiedDate":"2024-03-02"},{"lineNumber":153,"author":{"gitId":"jieqiboh"},"content":" @include relative-font-size(1.5);","lastModifiedDate":"2024-03-02"},{"lineNumber":154,"author":{"gitId":"jieqiboh"},"content":"}","lastModifiedDate":"2024-03-02"},{"lineNumber":155,"author":{"gitId":"jieqiboh"},"content":"","lastModifiedDate":"2024-03-02"},{"lineNumber":156,"author":{"gitId":"jieqiboh"},"content":"","lastModifiedDate":"2024-03-02"},{"lineNumber":157,"author":{"gitId":"jieqiboh"},"content":"","lastModifiedDate":"2024-03-02"},{"lineNumber":158,"author":{"gitId":"jieqiboh"},"content":"/**","lastModifiedDate":"2024-03-02"},{"lineNumber":159,"author":{"gitId":"jieqiboh"},"content":" * Posts","lastModifiedDate":"2024-03-02"},{"lineNumber":160,"author":{"gitId":"jieqiboh"},"content":" */","lastModifiedDate":"2024-03-02"},{"lineNumber":161,"author":{"gitId":"jieqiboh"},"content":".post-header {","lastModifiedDate":"2024-03-02"},{"lineNumber":162,"author":{"gitId":"jieqiboh"},"content":" margin-bottom: $spacing-unit;","lastModifiedDate":"2024-03-02"},{"lineNumber":163,"author":{"gitId":"jieqiboh"},"content":"}","lastModifiedDate":"2024-03-02"},{"lineNumber":164,"author":{"gitId":"jieqiboh"},"content":"","lastModifiedDate":"2024-03-02"},{"lineNumber":165,"author":{"gitId":"jieqiboh"},"content":".post-title,","lastModifiedDate":"2024-03-02"},{"lineNumber":166,"author":{"gitId":"jieqiboh"},"content":".post-content h1 {","lastModifiedDate":"2024-03-02"},{"lineNumber":167,"author":{"gitId":"jieqiboh"},"content":" @include relative-font-size(2.625);","lastModifiedDate":"2024-03-02"},{"lineNumber":168,"author":{"gitId":"jieqiboh"},"content":" letter-spacing: -1px;","lastModifiedDate":"2024-03-02"},{"lineNumber":169,"author":{"gitId":"jieqiboh"},"content":" line-height: 1.15;","lastModifiedDate":"2024-03-02"},{"lineNumber":170,"author":{"gitId":"jieqiboh"},"content":"","lastModifiedDate":"2024-03-02"},{"lineNumber":171,"author":{"gitId":"jieqiboh"},"content":" @media screen and (min-width: $on-large) {","lastModifiedDate":"2024-03-02"},{"lineNumber":172,"author":{"gitId":"jieqiboh"},"content":" @include relative-font-size(2.625);","lastModifiedDate":"2024-03-02"},{"lineNumber":173,"author":{"gitId":"jieqiboh"},"content":" }","lastModifiedDate":"2024-03-02"},{"lineNumber":174,"author":{"gitId":"jieqiboh"},"content":"}","lastModifiedDate":"2024-03-02"},{"lineNumber":175,"author":{"gitId":"jieqiboh"},"content":"","lastModifiedDate":"2024-03-02"},{"lineNumber":176,"author":{"gitId":"jieqiboh"},"content":".post-content {","lastModifiedDate":"2024-03-02"},{"lineNumber":177,"author":{"gitId":"jieqiboh"},"content":" margin-bottom: $spacing-unit;","lastModifiedDate":"2024-03-02"},{"lineNumber":178,"author":{"gitId":"jieqiboh"},"content":"","lastModifiedDate":"2024-03-02"},{"lineNumber":179,"author":{"gitId":"jieqiboh"},"content":" h1, h2, h3 { margin-top: $spacing-unit * 2 }","lastModifiedDate":"2024-03-02"},{"lineNumber":180,"author":{"gitId":"jieqiboh"},"content":" h4, h5, h6 { margin-top: $spacing-unit }","lastModifiedDate":"2024-03-02"},{"lineNumber":181,"author":{"gitId":"jieqiboh"},"content":"","lastModifiedDate":"2024-03-02"},{"lineNumber":182,"author":{"gitId":"jieqiboh"},"content":" h2 {","lastModifiedDate":"2024-03-02"},{"lineNumber":183,"author":{"gitId":"jieqiboh"},"content":" @include relative-font-size(1.75);","lastModifiedDate":"2024-03-02"},{"lineNumber":184,"author":{"gitId":"jieqiboh"},"content":"","lastModifiedDate":"2024-03-02"},{"lineNumber":185,"author":{"gitId":"jieqiboh"},"content":" @media screen and (min-width: $on-large) {","lastModifiedDate":"2024-03-02"},{"lineNumber":186,"author":{"gitId":"jieqiboh"},"content":" @include relative-font-size(2);","lastModifiedDate":"2024-03-02"},{"lineNumber":187,"author":{"gitId":"jieqiboh"},"content":" }","lastModifiedDate":"2024-03-02"},{"lineNumber":188,"author":{"gitId":"jieqiboh"},"content":" }","lastModifiedDate":"2024-03-02"},{"lineNumber":189,"author":{"gitId":"jieqiboh"},"content":"","lastModifiedDate":"2024-03-02"},{"lineNumber":190,"author":{"gitId":"jieqiboh"},"content":" h3 {","lastModifiedDate":"2024-03-02"},{"lineNumber":191,"author":{"gitId":"jieqiboh"},"content":" @include relative-font-size(1.375);","lastModifiedDate":"2024-03-02"},{"lineNumber":192,"author":{"gitId":"jieqiboh"},"content":"","lastModifiedDate":"2024-03-02"},{"lineNumber":193,"author":{"gitId":"jieqiboh"},"content":" @media screen and (min-width: $on-large) {","lastModifiedDate":"2024-03-02"},{"lineNumber":194,"author":{"gitId":"jieqiboh"},"content":" @include relative-font-size(1.625);","lastModifiedDate":"2024-03-02"},{"lineNumber":195,"author":{"gitId":"jieqiboh"},"content":" }","lastModifiedDate":"2024-03-02"},{"lineNumber":196,"author":{"gitId":"jieqiboh"},"content":" }","lastModifiedDate":"2024-03-02"},{"lineNumber":197,"author":{"gitId":"jieqiboh"},"content":"","lastModifiedDate":"2024-03-02"},{"lineNumber":198,"author":{"gitId":"jieqiboh"},"content":" h4 {","lastModifiedDate":"2024-03-02"},{"lineNumber":199,"author":{"gitId":"jieqiboh"},"content":" @include relative-font-size(1.25);","lastModifiedDate":"2024-03-02"},{"lineNumber":200,"author":{"gitId":"jieqiboh"},"content":" }","lastModifiedDate":"2024-03-02"},{"lineNumber":201,"author":{"gitId":"jieqiboh"},"content":"","lastModifiedDate":"2024-03-02"},{"lineNumber":202,"author":{"gitId":"jieqiboh"},"content":" h5 {","lastModifiedDate":"2024-03-02"},{"lineNumber":203,"author":{"gitId":"jieqiboh"},"content":" @include relative-font-size(1.125);","lastModifiedDate":"2024-03-02"},{"lineNumber":204,"author":{"gitId":"jieqiboh"},"content":" }","lastModifiedDate":"2024-03-02"},{"lineNumber":205,"author":{"gitId":"jieqiboh"},"content":" h6 {","lastModifiedDate":"2024-03-02"},{"lineNumber":206,"author":{"gitId":"jieqiboh"},"content":" @include relative-font-size(1.0625);","lastModifiedDate":"2024-03-02"},{"lineNumber":207,"author":{"gitId":"jieqiboh"},"content":" }","lastModifiedDate":"2024-03-02"},{"lineNumber":208,"author":{"gitId":"jieqiboh"},"content":"}","lastModifiedDate":"2024-03-02"},{"lineNumber":209,"author":{"gitId":"jieqiboh"},"content":"","lastModifiedDate":"2024-03-02"},{"lineNumber":210,"author":{"gitId":"jieqiboh"},"content":"","lastModifiedDate":"2024-03-02"},{"lineNumber":211,"author":{"gitId":"jieqiboh"},"content":".social-media-list {","lastModifiedDate":"2024-03-02"},{"lineNumber":212,"author":{"gitId":"jieqiboh"},"content":" display: table;","lastModifiedDate":"2024-03-02"},{"lineNumber":213,"author":{"gitId":"jieqiboh"},"content":" margin: 0 auto;","lastModifiedDate":"2024-03-02"},{"lineNumber":214,"author":{"gitId":"jieqiboh"},"content":" li {","lastModifiedDate":"2024-03-02"},{"lineNumber":215,"author":{"gitId":"jieqiboh"},"content":" float: left;","lastModifiedDate":"2024-03-02"},{"lineNumber":216,"author":{"gitId":"jieqiboh"},"content":" margin: 5px 10px 5px 0;","lastModifiedDate":"2024-03-02"},{"lineNumber":217,"author":{"gitId":"jieqiboh"},"content":" \u0026:last-of-type { margin-right: 0 }","lastModifiedDate":"2024-03-02"},{"lineNumber":218,"author":{"gitId":"jieqiboh"},"content":" a {","lastModifiedDate":"2024-03-02"},{"lineNumber":219,"author":{"gitId":"jieqiboh"},"content":" display: block;","lastModifiedDate":"2024-03-02"},{"lineNumber":220,"author":{"gitId":"jieqiboh"},"content":" padding: $spacing-unit / 4;","lastModifiedDate":"2024-03-02"},{"lineNumber":221,"author":{"gitId":"jieqiboh"},"content":" border: 1px solid $brand-color-light;","lastModifiedDate":"2024-03-02"},{"lineNumber":222,"author":{"gitId":"jieqiboh"},"content":" \u0026:hover { border-color: darken($brand-color-light, 10%) }","lastModifiedDate":"2024-03-02"},{"lineNumber":223,"author":{"gitId":"jieqiboh"},"content":" }","lastModifiedDate":"2024-03-02"},{"lineNumber":224,"author":{"gitId":"jieqiboh"},"content":" }","lastModifiedDate":"2024-03-02"},{"lineNumber":225,"author":{"gitId":"jieqiboh"},"content":"}","lastModifiedDate":"2024-03-02"},{"lineNumber":226,"author":{"gitId":"jieqiboh"},"content":"","lastModifiedDate":"2024-03-02"},{"lineNumber":227,"author":{"gitId":"jieqiboh"},"content":"","lastModifiedDate":"2024-03-02"},{"lineNumber":228,"author":{"gitId":"jieqiboh"},"content":"","lastModifiedDate":"2024-03-02"},{"lineNumber":229,"author":{"gitId":"jieqiboh"},"content":"/**","lastModifiedDate":"2024-03-02"},{"lineNumber":230,"author":{"gitId":"jieqiboh"},"content":" * Pagination navbar","lastModifiedDate":"2024-03-02"},{"lineNumber":231,"author":{"gitId":"jieqiboh"},"content":" */","lastModifiedDate":"2024-03-02"},{"lineNumber":232,"author":{"gitId":"jieqiboh"},"content":".pagination {","lastModifiedDate":"2024-03-02"},{"lineNumber":233,"author":{"gitId":"jieqiboh"},"content":" margin-bottom: $spacing-unit;","lastModifiedDate":"2024-03-02"},{"lineNumber":234,"author":{"gitId":"jieqiboh"},"content":" @extend .social-media-list;","lastModifiedDate":"2024-03-02"},{"lineNumber":235,"author":{"gitId":"jieqiboh"},"content":" li {","lastModifiedDate":"2024-03-02"},{"lineNumber":236,"author":{"gitId":"jieqiboh"},"content":" a, div {","lastModifiedDate":"2024-03-02"},{"lineNumber":237,"author":{"gitId":"jieqiboh"},"content":" min-width: 41px;","lastModifiedDate":"2024-03-02"},{"lineNumber":238,"author":{"gitId":"jieqiboh"},"content":" text-align: center;","lastModifiedDate":"2024-03-02"},{"lineNumber":239,"author":{"gitId":"jieqiboh"},"content":" box-sizing: border-box;","lastModifiedDate":"2024-03-02"},{"lineNumber":240,"author":{"gitId":"jieqiboh"},"content":" }","lastModifiedDate":"2024-03-02"},{"lineNumber":241,"author":{"gitId":"jieqiboh"},"content":" div {","lastModifiedDate":"2024-03-02"},{"lineNumber":242,"author":{"gitId":"jieqiboh"},"content":" display: block;","lastModifiedDate":"2024-03-02"},{"lineNumber":243,"author":{"gitId":"jieqiboh"},"content":" padding: $spacing-unit / 4;","lastModifiedDate":"2024-03-02"},{"lineNumber":244,"author":{"gitId":"jieqiboh"},"content":" border: 1px solid transparent;","lastModifiedDate":"2024-03-02"},{"lineNumber":245,"author":{"gitId":"jieqiboh"},"content":"","lastModifiedDate":"2024-03-02"},{"lineNumber":246,"author":{"gitId":"jieqiboh"},"content":" \u0026.pager-edge {","lastModifiedDate":"2024-03-02"},{"lineNumber":247,"author":{"gitId":"jieqiboh"},"content":" color: darken($brand-color-light, 5%);","lastModifiedDate":"2024-03-02"},{"lineNumber":248,"author":{"gitId":"jieqiboh"},"content":" border: 1px dashed;","lastModifiedDate":"2024-03-02"},{"lineNumber":249,"author":{"gitId":"jieqiboh"},"content":" }","lastModifiedDate":"2024-03-02"},{"lineNumber":250,"author":{"gitId":"jieqiboh"},"content":" }","lastModifiedDate":"2024-03-02"},{"lineNumber":251,"author":{"gitId":"jieqiboh"},"content":" }","lastModifiedDate":"2024-03-02"},{"lineNumber":252,"author":{"gitId":"jieqiboh"},"content":"}","lastModifiedDate":"2024-03-02"},{"lineNumber":253,"author":{"gitId":"jieqiboh"},"content":"","lastModifiedDate":"2024-03-02"},{"lineNumber":254,"author":{"gitId":"jieqiboh"},"content":"","lastModifiedDate":"2024-03-02"},{"lineNumber":255,"author":{"gitId":"jieqiboh"},"content":"","lastModifiedDate":"2024-03-02"},{"lineNumber":256,"author":{"gitId":"jieqiboh"},"content":"/**","lastModifiedDate":"2024-03-02"},{"lineNumber":257,"author":{"gitId":"jieqiboh"},"content":" * Grid helpers","lastModifiedDate":"2024-03-02"},{"lineNumber":258,"author":{"gitId":"jieqiboh"},"content":" */","lastModifiedDate":"2024-03-02"},{"lineNumber":259,"author":{"gitId":"jieqiboh"},"content":"@media screen and (min-width: $on-large) {","lastModifiedDate":"2024-03-02"},{"lineNumber":260,"author":{"gitId":"jieqiboh"},"content":" .one-half {","lastModifiedDate":"2024-03-02"},{"lineNumber":261,"author":{"gitId":"jieqiboh"},"content":" width: calc(50% - (#{$spacing-unit} / 2));","lastModifiedDate":"2024-03-02"},{"lineNumber":262,"author":{"gitId":"jieqiboh"},"content":" }","lastModifiedDate":"2024-03-02"},{"lineNumber":263,"author":{"gitId":"jieqiboh"},"content":"}","lastModifiedDate":"2024-03-02"}],"authorContributionMap":{"jieqiboh":263}},{"path":"docs/_sass/minima/custom-mixins.scss","fileType":"other","lines":[{"lineNumber":1,"author":{"gitId":"jieqiboh"},"content":"@mixin alert-variant($background, $border, $color) {","lastModifiedDate":"2024-03-02"},{"lineNumber":2,"author":{"gitId":"jieqiboh"},"content":" color: $color;","lastModifiedDate":"2024-03-02"},{"lineNumber":3,"author":{"gitId":"jieqiboh"},"content":" @include gradient-bg($background);","lastModifiedDate":"2024-03-02"},{"lineNumber":4,"author":{"gitId":"jieqiboh"},"content":" border-color: $border;","lastModifiedDate":"2024-03-02"},{"lineNumber":5,"author":{"gitId":"jieqiboh"},"content":"","lastModifiedDate":"2024-03-02"},{"lineNumber":6,"author":{"gitId":"jieqiboh"},"content":" .alert-link {","lastModifiedDate":"2024-03-02"},{"lineNumber":7,"author":{"gitId":"jieqiboh"},"content":" color: darken($color, 10%);","lastModifiedDate":"2024-03-02"},{"lineNumber":8,"author":{"gitId":"jieqiboh"},"content":" }","lastModifiedDate":"2024-03-02"},{"lineNumber":9,"author":{"gitId":"jieqiboh"},"content":"}","lastModifiedDate":"2024-03-02"},{"lineNumber":10,"author":{"gitId":"jieqiboh"},"content":"","lastModifiedDate":"2024-03-02"},{"lineNumber":11,"author":{"gitId":"jieqiboh"},"content":"@mixin gradient-bg($color, $foreground: null) {","lastModifiedDate":"2024-03-02"},{"lineNumber":12,"author":{"gitId":"jieqiboh"},"content":" @if $enable-gradients {","lastModifiedDate":"2024-03-02"},{"lineNumber":13,"author":{"gitId":"jieqiboh"},"content":" @if $foreground {","lastModifiedDate":"2024-03-02"},{"lineNumber":14,"author":{"gitId":"jieqiboh"},"content":" background-image: $foreground, linear-gradient(180deg, mix($body-bg, $color, 15%), $color);","lastModifiedDate":"2024-03-02"},{"lineNumber":15,"author":{"gitId":"jieqiboh"},"content":" } @else {","lastModifiedDate":"2024-03-02"},{"lineNumber":16,"author":{"gitId":"jieqiboh"},"content":" background-image: linear-gradient(180deg, mix($body-bg, $color, 15%), $color);","lastModifiedDate":"2024-03-02"},{"lineNumber":17,"author":{"gitId":"jieqiboh"},"content":" }","lastModifiedDate":"2024-03-02"},{"lineNumber":18,"author":{"gitId":"jieqiboh"},"content":" } @else {","lastModifiedDate":"2024-03-02"},{"lineNumber":19,"author":{"gitId":"jieqiboh"},"content":" background-color: $color;","lastModifiedDate":"2024-03-02"},{"lineNumber":20,"author":{"gitId":"jieqiboh"},"content":" }","lastModifiedDate":"2024-03-02"},{"lineNumber":21,"author":{"gitId":"jieqiboh"},"content":"}","lastModifiedDate":"2024-03-02"}],"authorContributionMap":{"jieqiboh":21}},{"path":"docs/_sass/minima/custom-styles.scss","fileType":"other","lines":[{"lineNumber":1,"author":{"gitId":"jieqiboh"},"content":"// Placeholder to allow defining custom styles that override everything else.","lastModifiedDate":"2024-03-02"},{"lineNumber":2,"author":{"gitId":"jieqiboh"},"content":"// (Use `_sass/minima/custom-variables.scss` to override variable defaults)","lastModifiedDate":"2024-03-02"},{"lineNumber":3,"author":{"gitId":"jieqiboh"},"content":"h2, h3, h4, h5, h6 {","lastModifiedDate":"2024-03-02"},{"lineNumber":4,"author":{"gitId":"jieqiboh"},"content":" color: #e46c0a;","lastModifiedDate":"2024-03-02"},{"lineNumber":5,"author":{"gitId":"jieqiboh"},"content":"}","lastModifiedDate":"2024-03-02"},{"lineNumber":6,"author":{"gitId":"jieqiboh"},"content":"","lastModifiedDate":"2024-03-02"},{"lineNumber":7,"author":{"gitId":"jieqiboh"},"content":"// Bootstrap style alerts","lastModifiedDate":"2024-03-02"},{"lineNumber":8,"author":{"gitId":"jieqiboh"},"content":".alert {","lastModifiedDate":"2024-03-02"},{"lineNumber":9,"author":{"gitId":"jieqiboh"},"content":" position: relative;","lastModifiedDate":"2024-03-02"},{"lineNumber":10,"author":{"gitId":"jieqiboh"},"content":" padding: $alert-padding-y $alert-padding-x;","lastModifiedDate":"2024-03-02"},{"lineNumber":11,"author":{"gitId":"jieqiboh"},"content":" margin-bottom: $alert-margin-bottom;","lastModifiedDate":"2024-03-02"},{"lineNumber":12,"author":{"gitId":"jieqiboh"},"content":" border: $alert-border-width solid transparent;","lastModifiedDate":"2024-03-02"},{"lineNumber":13,"author":{"gitId":"jieqiboh"},"content":" border-radius : $alert-border-radius;","lastModifiedDate":"2024-03-02"},{"lineNumber":14,"author":{"gitId":"jieqiboh"},"content":"}","lastModifiedDate":"2024-03-02"},{"lineNumber":15,"author":{"gitId":"jieqiboh"},"content":"","lastModifiedDate":"2024-03-02"},{"lineNumber":16,"author":{"gitId":"jieqiboh"},"content":"// Headings for larger alerts","lastModifiedDate":"2024-03-02"},{"lineNumber":17,"author":{"gitId":"jieqiboh"},"content":".alert-heading {","lastModifiedDate":"2024-03-02"},{"lineNumber":18,"author":{"gitId":"jieqiboh"},"content":" // Specified to prevent conflicts of changing $headings-color","lastModifiedDate":"2024-03-02"},{"lineNumber":19,"author":{"gitId":"jieqiboh"},"content":" color: inherit;","lastModifiedDate":"2024-03-02"},{"lineNumber":20,"author":{"gitId":"jieqiboh"},"content":"}","lastModifiedDate":"2024-03-02"},{"lineNumber":21,"author":{"gitId":"jieqiboh"},"content":"","lastModifiedDate":"2024-03-02"},{"lineNumber":22,"author":{"gitId":"jieqiboh"},"content":"// Provide class for links that match alerts","lastModifiedDate":"2024-03-02"},{"lineNumber":23,"author":{"gitId":"jieqiboh"},"content":".alert-link {","lastModifiedDate":"2024-03-02"},{"lineNumber":24,"author":{"gitId":"jieqiboh"},"content":" font-weight: $alert-link-font-weight;","lastModifiedDate":"2024-03-02"},{"lineNumber":25,"author":{"gitId":"jieqiboh"},"content":"}","lastModifiedDate":"2024-03-02"},{"lineNumber":26,"author":{"gitId":"jieqiboh"},"content":"","lastModifiedDate":"2024-03-02"},{"lineNumber":27,"author":{"gitId":"jieqiboh"},"content":"// Generate contextual modifier classes for colorizing the alert.","lastModifiedDate":"2024-03-02"},{"lineNumber":28,"author":{"gitId":"jieqiboh"},"content":"","lastModifiedDate":"2024-03-02"},{"lineNumber":29,"author":{"gitId":"jieqiboh"},"content":"@each $color, $value in $theme-colors {","lastModifiedDate":"2024-03-02"},{"lineNumber":30,"author":{"gitId":"jieqiboh"},"content":" .alert-#{$color} {","lastModifiedDate":"2024-03-02"},{"lineNumber":31,"author":{"gitId":"jieqiboh"},"content":" @include alert-variant(color-level($value, $alert-bg-level), color-level($value, $alert-border-level), color-level($value, $alert-color-level));","lastModifiedDate":"2024-03-02"},{"lineNumber":32,"author":{"gitId":"jieqiboh"},"content":" }","lastModifiedDate":"2024-03-02"},{"lineNumber":33,"author":{"gitId":"jieqiboh"},"content":"}","lastModifiedDate":"2024-03-02"},{"lineNumber":34,"author":{"gitId":"jieqiboh"},"content":"","lastModifiedDate":"2024-03-02"}],"authorContributionMap":{"jieqiboh":34}},{"path":"docs/_sass/minima/custom-variables.scss","fileType":"other","lines":[{"lineNumber":1,"author":{"gitId":"jieqiboh"},"content":"// Placeholder to allow overriding predefined variables smoothly.","lastModifiedDate":"2024-03-02"},{"lineNumber":2,"author":{"gitId":"jieqiboh"},"content":"","lastModifiedDate":"2024-03-02"},{"lineNumber":3,"author":{"gitId":"jieqiboh"},"content":"//Bootstrap\u0027s default","lastModifiedDate":"2024-03-02"},{"lineNumber":4,"author":{"gitId":"jieqiboh"},"content":"$white: #fff !default;","lastModifiedDate":"2024-03-02"},{"lineNumber":5,"author":{"gitId":"jieqiboh"},"content":"$gray-100: #f8f9fa !default;","lastModifiedDate":"2024-03-02"},{"lineNumber":6,"author":{"gitId":"jieqiboh"},"content":"$gray-200: #e9ecef !default;","lastModifiedDate":"2024-03-02"},{"lineNumber":7,"author":{"gitId":"jieqiboh"},"content":"$gray-300: #dee2e6 !default;","lastModifiedDate":"2024-03-02"},{"lineNumber":8,"author":{"gitId":"jieqiboh"},"content":"$gray-400: #ced4da !default;","lastModifiedDate":"2024-03-02"},{"lineNumber":9,"author":{"gitId":"jieqiboh"},"content":"$gray-500: #adb5bd !default;","lastModifiedDate":"2024-03-02"},{"lineNumber":10,"author":{"gitId":"jieqiboh"},"content":"$gray-600: #6c757d !default;","lastModifiedDate":"2024-03-02"},{"lineNumber":11,"author":{"gitId":"jieqiboh"},"content":"$gray-700: #495057 !default;","lastModifiedDate":"2024-03-02"},{"lineNumber":12,"author":{"gitId":"jieqiboh"},"content":"$gray-800: #343a40 !default;","lastModifiedDate":"2024-03-02"},{"lineNumber":13,"author":{"gitId":"jieqiboh"},"content":"$gray-900: #212529 !default;","lastModifiedDate":"2024-03-02"},{"lineNumber":14,"author":{"gitId":"jieqiboh"},"content":"$black: #000 !default;","lastModifiedDate":"2024-03-02"},{"lineNumber":15,"author":{"gitId":"jieqiboh"},"content":"$blue: #0d6efd !default;","lastModifiedDate":"2024-03-02"},{"lineNumber":16,"author":{"gitId":"jieqiboh"},"content":"$indigo: #6610f2 !default;","lastModifiedDate":"2024-03-02"},{"lineNumber":17,"author":{"gitId":"jieqiboh"},"content":"$purple: #6f42c1 !default;","lastModifiedDate":"2024-03-02"},{"lineNumber":18,"author":{"gitId":"jieqiboh"},"content":"$pink: #d63384 !default;","lastModifiedDate":"2024-03-02"},{"lineNumber":19,"author":{"gitId":"jieqiboh"},"content":"$red: #dc3545 !default;","lastModifiedDate":"2024-03-02"},{"lineNumber":20,"author":{"gitId":"jieqiboh"},"content":"$orange: #fd7e14 !default;","lastModifiedDate":"2024-03-02"},{"lineNumber":21,"author":{"gitId":"jieqiboh"},"content":"$yellow: #ffc107 !default;","lastModifiedDate":"2024-03-02"},{"lineNumber":22,"author":{"gitId":"jieqiboh"},"content":"$green: #28a745 !default;","lastModifiedDate":"2024-03-02"},{"lineNumber":23,"author":{"gitId":"jieqiboh"},"content":"$teal: #20c997 !default;","lastModifiedDate":"2024-03-02"},{"lineNumber":24,"author":{"gitId":"jieqiboh"},"content":"$cyan: #17a2b8 !default;","lastModifiedDate":"2024-03-02"},{"lineNumber":25,"author":{"gitId":"jieqiboh"},"content":"","lastModifiedDate":"2024-03-02"},{"lineNumber":26,"author":{"gitId":"jieqiboh"},"content":"$primary: $blue !default;","lastModifiedDate":"2024-03-02"},{"lineNumber":27,"author":{"gitId":"jieqiboh"},"content":"$secondary: $gray-600 !default;","lastModifiedDate":"2024-03-02"},{"lineNumber":28,"author":{"gitId":"jieqiboh"},"content":"$success: $green !default;","lastModifiedDate":"2024-03-02"},{"lineNumber":29,"author":{"gitId":"jieqiboh"},"content":"$info: $cyan !default;","lastModifiedDate":"2024-03-02"},{"lineNumber":30,"author":{"gitId":"jieqiboh"},"content":"$warning: $yellow !default;","lastModifiedDate":"2024-03-02"},{"lineNumber":31,"author":{"gitId":"jieqiboh"},"content":"$danger: $red !default;","lastModifiedDate":"2024-03-02"},{"lineNumber":32,"author":{"gitId":"jieqiboh"},"content":"$light: $gray-100 !default;","lastModifiedDate":"2024-03-02"},{"lineNumber":33,"author":{"gitId":"jieqiboh"},"content":"$dark: $gray-800 !default;","lastModifiedDate":"2024-03-02"},{"lineNumber":34,"author":{"gitId":"jieqiboh"},"content":"","lastModifiedDate":"2024-03-02"},{"lineNumber":35,"author":{"gitId":"jieqiboh"},"content":"$theme-colors: (","lastModifiedDate":"2024-03-02"},{"lineNumber":36,"author":{"gitId":"jieqiboh"},"content":" \"primary\": $primary,","lastModifiedDate":"2024-03-02"},{"lineNumber":37,"author":{"gitId":"jieqiboh"},"content":" \"secondary\": $secondary,","lastModifiedDate":"2024-03-02"},{"lineNumber":38,"author":{"gitId":"jieqiboh"},"content":" \"success\": $success,","lastModifiedDate":"2024-03-02"},{"lineNumber":39,"author":{"gitId":"jieqiboh"},"content":" \"info\": $info,","lastModifiedDate":"2024-03-02"},{"lineNumber":40,"author":{"gitId":"jieqiboh"},"content":" \"warning\": $warning,","lastModifiedDate":"2024-03-02"},{"lineNumber":41,"author":{"gitId":"jieqiboh"},"content":" \"danger\": $danger,","lastModifiedDate":"2024-03-02"},{"lineNumber":42,"author":{"gitId":"jieqiboh"},"content":" \"light\": $light,","lastModifiedDate":"2024-03-02"},{"lineNumber":43,"author":{"gitId":"jieqiboh"},"content":" \"dark\": $dark","lastModifiedDate":"2024-03-02"},{"lineNumber":44,"author":{"gitId":"jieqiboh"},"content":") !default;","lastModifiedDate":"2024-03-02"},{"lineNumber":45,"author":{"gitId":"jieqiboh"},"content":"","lastModifiedDate":"2024-03-02"},{"lineNumber":46,"author":{"gitId":"jieqiboh"},"content":"$theme-color-interval: 8% !default;","lastModifiedDate":"2024-03-02"},{"lineNumber":47,"author":{"gitId":"jieqiboh"},"content":"","lastModifiedDate":"2024-03-02"},{"lineNumber":48,"author":{"gitId":"jieqiboh"},"content":"$body-bg: $white !default;","lastModifiedDate":"2024-03-02"},{"lineNumber":49,"author":{"gitId":"jieqiboh"},"content":"$body-color: $gray-900 !default;","lastModifiedDate":"2024-03-02"},{"lineNumber":50,"author":{"gitId":"jieqiboh"},"content":"$body-text-align: null !default;","lastModifiedDate":"2024-03-02"},{"lineNumber":51,"author":{"gitId":"jieqiboh"},"content":"","lastModifiedDate":"2024-03-02"},{"lineNumber":52,"author":{"gitId":"jieqiboh"},"content":"$enable-gradients: true;","lastModifiedDate":"2024-03-02"},{"lineNumber":53,"author":{"gitId":"jieqiboh"},"content":"","lastModifiedDate":"2024-03-02"},{"lineNumber":54,"author":{"gitId":"jieqiboh"},"content":"// Define alert colors, border radius, and padding.","lastModifiedDate":"2024-03-02"},{"lineNumber":55,"author":{"gitId":"jieqiboh"},"content":"$border-radius: .25rem !default;","lastModifiedDate":"2024-03-02"},{"lineNumber":56,"author":{"gitId":"jieqiboh"},"content":"$border-width: 1px !default;","lastModifiedDate":"2024-03-02"},{"lineNumber":57,"author":{"gitId":"jieqiboh"},"content":"$font-weight-bold: 700 !default;","lastModifiedDate":"2024-03-02"},{"lineNumber":58,"author":{"gitId":"jieqiboh"},"content":"","lastModifiedDate":"2024-03-02"},{"lineNumber":59,"author":{"gitId":"jieqiboh"},"content":"$alert-padding-y: .75rem !default;","lastModifiedDate":"2024-03-02"},{"lineNumber":60,"author":{"gitId":"jieqiboh"},"content":"$alert-padding-x: 1.25rem !default;","lastModifiedDate":"2024-03-02"},{"lineNumber":61,"author":{"gitId":"jieqiboh"},"content":"$alert-margin-bottom: 1rem !default;","lastModifiedDate":"2024-03-02"},{"lineNumber":62,"author":{"gitId":"jieqiboh"},"content":"$alert-border-radius: $border-radius !default;","lastModifiedDate":"2024-03-02"},{"lineNumber":63,"author":{"gitId":"jieqiboh"},"content":"$alert-link-font-weight: $font-weight-bold !default;","lastModifiedDate":"2024-03-02"},{"lineNumber":64,"author":{"gitId":"jieqiboh"},"content":"$alert-border-width: $border-width !default;","lastModifiedDate":"2024-03-02"},{"lineNumber":65,"author":{"gitId":"jieqiboh"},"content":"","lastModifiedDate":"2024-03-02"},{"lineNumber":66,"author":{"gitId":"jieqiboh"},"content":"$alert-bg-level: -10 !default;","lastModifiedDate":"2024-03-02"},{"lineNumber":67,"author":{"gitId":"jieqiboh"},"content":"$alert-border-level: -9 !default;","lastModifiedDate":"2024-03-02"},{"lineNumber":68,"author":{"gitId":"jieqiboh"},"content":"$alert-color-level: 6 !default;","lastModifiedDate":"2024-03-02"},{"lineNumber":69,"author":{"gitId":"jieqiboh"},"content":"","lastModifiedDate":"2024-03-02"},{"lineNumber":70,"author":{"gitId":"jieqiboh"},"content":"// Request a color level","lastModifiedDate":"2024-03-02"},{"lineNumber":71,"author":{"gitId":"jieqiboh"},"content":"// scss-docs-start color-level","lastModifiedDate":"2024-03-02"},{"lineNumber":72,"author":{"gitId":"jieqiboh"},"content":"@function color-level($color: $primary, $level: 0) {","lastModifiedDate":"2024-03-02"},{"lineNumber":73,"author":{"gitId":"jieqiboh"},"content":" $color-base: if($level \u003e 0, $black, $white);","lastModifiedDate":"2024-03-02"},{"lineNumber":74,"author":{"gitId":"jieqiboh"},"content":" $level: abs($level);","lastModifiedDate":"2024-03-02"},{"lineNumber":75,"author":{"gitId":"jieqiboh"},"content":" @return mix($color-base, $color, $level * $theme-color-interval);","lastModifiedDate":"2024-03-02"},{"lineNumber":76,"author":{"gitId":"jieqiboh"},"content":"}","lastModifiedDate":"2024-03-02"}],"authorContributionMap":{"jieqiboh":76}},{"path":"docs/_sass/minima/initialize.scss","fileType":"other","lines":[{"lineNumber":1,"author":{"gitId":"jieqiboh"},"content":"@charset \"utf-8\";","lastModifiedDate":"2024-03-02"},{"lineNumber":2,"author":{"gitId":"jieqiboh"},"content":"","lastModifiedDate":"2024-03-02"},{"lineNumber":3,"author":{"gitId":"jieqiboh"},"content":"// Define defaults for each variable.","lastModifiedDate":"2024-03-02"},{"lineNumber":4,"author":{"gitId":"jieqiboh"},"content":"","lastModifiedDate":"2024-03-02"},{"lineNumber":5,"author":{"gitId":"jieqiboh"},"content":"$base-font-family: -apple-system, BlinkMacSystemFont, \"Segoe UI\", \"Segoe UI Symbol\", \"Segoe UI Emoji\", \"Apple Color Emoji\", Roboto, Helvetica, Arial, sans-serif !default;","lastModifiedDate":"2024-03-02"},{"lineNumber":6,"author":{"gitId":"jieqiboh"},"content":"$code-font-family: \"Menlo\", \"Inconsolata\", \"Consolas\", \"Roboto Mono\", \"Ubuntu Mono\", \"Liberation Mono\", \"Courier New\", monospace;","lastModifiedDate":"2024-03-02"},{"lineNumber":7,"author":{"gitId":"jieqiboh"},"content":"$base-font-size: 16px !default;","lastModifiedDate":"2024-03-02"},{"lineNumber":8,"author":{"gitId":"jieqiboh"},"content":"$base-font-weight: 400 !default;","lastModifiedDate":"2024-03-02"},{"lineNumber":9,"author":{"gitId":"jieqiboh"},"content":"$small-font-size: $base-font-size * 0.875 !default;","lastModifiedDate":"2024-03-02"},{"lineNumber":10,"author":{"gitId":"jieqiboh"},"content":"$base-line-height: 1.5 !default;","lastModifiedDate":"2024-03-02"},{"lineNumber":11,"author":{"gitId":"jieqiboh"},"content":"","lastModifiedDate":"2024-03-02"},{"lineNumber":12,"author":{"gitId":"jieqiboh"},"content":"$spacing-unit: 30px !default;","lastModifiedDate":"2024-03-02"},{"lineNumber":13,"author":{"gitId":"jieqiboh"},"content":"","lastModifiedDate":"2024-03-02"},{"lineNumber":14,"author":{"gitId":"jieqiboh"},"content":"$table-text-align: left !default;","lastModifiedDate":"2024-03-02"},{"lineNumber":15,"author":{"gitId":"jieqiboh"},"content":"","lastModifiedDate":"2024-03-02"},{"lineNumber":16,"author":{"gitId":"jieqiboh"},"content":"// Width of the content area","lastModifiedDate":"2024-03-02"},{"lineNumber":17,"author":{"gitId":"jieqiboh"},"content":"$content-width: 800px !default;","lastModifiedDate":"2024-03-02"},{"lineNumber":18,"author":{"gitId":"jieqiboh"},"content":"","lastModifiedDate":"2024-03-02"},{"lineNumber":19,"author":{"gitId":"jieqiboh"},"content":"$on-palm: 600px !default;","lastModifiedDate":"2024-03-02"},{"lineNumber":20,"author":{"gitId":"jieqiboh"},"content":"$on-laptop: 800px !default;","lastModifiedDate":"2024-03-02"},{"lineNumber":21,"author":{"gitId":"jieqiboh"},"content":"","lastModifiedDate":"2024-03-02"},{"lineNumber":22,"author":{"gitId":"jieqiboh"},"content":"$on-medium: $on-palm !default;","lastModifiedDate":"2024-03-02"},{"lineNumber":23,"author":{"gitId":"jieqiboh"},"content":"$on-large: $on-laptop !default;","lastModifiedDate":"2024-03-02"},{"lineNumber":24,"author":{"gitId":"jieqiboh"},"content":"","lastModifiedDate":"2024-03-02"},{"lineNumber":25,"author":{"gitId":"jieqiboh"},"content":"// Use media queries like this:","lastModifiedDate":"2024-03-02"},{"lineNumber":26,"author":{"gitId":"jieqiboh"},"content":"// @include media-query($on-palm) {","lastModifiedDate":"2024-03-02"},{"lineNumber":27,"author":{"gitId":"jieqiboh"},"content":"// .wrapper {","lastModifiedDate":"2024-03-02"},{"lineNumber":28,"author":{"gitId":"jieqiboh"},"content":"// padding-right: $spacing-unit / 2;","lastModifiedDate":"2024-03-02"},{"lineNumber":29,"author":{"gitId":"jieqiboh"},"content":"// padding-left: $spacing-unit / 2;","lastModifiedDate":"2024-03-02"},{"lineNumber":30,"author":{"gitId":"jieqiboh"},"content":"// }","lastModifiedDate":"2024-03-02"},{"lineNumber":31,"author":{"gitId":"jieqiboh"},"content":"// }","lastModifiedDate":"2024-03-02"},{"lineNumber":32,"author":{"gitId":"jieqiboh"},"content":"// Notice the following mixin uses max-width, in a deprecated, desktop-first","lastModifiedDate":"2024-03-02"},{"lineNumber":33,"author":{"gitId":"jieqiboh"},"content":"// approach, whereas media queries used elsewhere now use min-width.","lastModifiedDate":"2024-03-02"},{"lineNumber":34,"author":{"gitId":"jieqiboh"},"content":"@mixin media-query($device) {","lastModifiedDate":"2024-03-02"},{"lineNumber":35,"author":{"gitId":"jieqiboh"},"content":" @media screen and (max-width: $device) {","lastModifiedDate":"2024-03-02"},{"lineNumber":36,"author":{"gitId":"jieqiboh"},"content":" @content;","lastModifiedDate":"2024-03-02"},{"lineNumber":37,"author":{"gitId":"jieqiboh"},"content":" }","lastModifiedDate":"2024-03-02"},{"lineNumber":38,"author":{"gitId":"jieqiboh"},"content":"}","lastModifiedDate":"2024-03-02"},{"lineNumber":39,"author":{"gitId":"jieqiboh"},"content":"","lastModifiedDate":"2024-03-02"},{"lineNumber":40,"author":{"gitId":"jieqiboh"},"content":"@mixin relative-font-size($ratio) {","lastModifiedDate":"2024-03-02"},{"lineNumber":41,"author":{"gitId":"jieqiboh"},"content":" font-size: #{$ratio}rem;","lastModifiedDate":"2024-03-02"},{"lineNumber":42,"author":{"gitId":"jieqiboh"},"content":"}","lastModifiedDate":"2024-03-02"},{"lineNumber":43,"author":{"gitId":"jieqiboh"},"content":"","lastModifiedDate":"2024-03-02"},{"lineNumber":44,"author":{"gitId":"jieqiboh"},"content":"// Import pre-styling-overrides hook and style-partials.","lastModifiedDate":"2024-03-02"},{"lineNumber":45,"author":{"gitId":"jieqiboh"},"content":"@import","lastModifiedDate":"2024-03-02"},{"lineNumber":46,"author":{"gitId":"jieqiboh"},"content":" \"minima/custom-variables\", // Hook to override predefined variables.","lastModifiedDate":"2024-03-02"},{"lineNumber":47,"author":{"gitId":"jieqiboh"},"content":" \"minima/custom-mixins\", // Hook to add custom mixins.","lastModifiedDate":"2024-03-02"},{"lineNumber":48,"author":{"gitId":"jieqiboh"},"content":" \"minima/base\", // Defines element resets.","lastModifiedDate":"2024-03-02"},{"lineNumber":49,"author":{"gitId":"jieqiboh"},"content":" \"minima/layout\", // Defines structure and style based on CSS selectors.","lastModifiedDate":"2024-03-02"},{"lineNumber":50,"author":{"gitId":"jieqiboh"},"content":" \"minima/custom-styles\" // Hook to override existing styles.","lastModifiedDate":"2024-03-02"},{"lineNumber":51,"author":{"gitId":"jieqiboh"},"content":";","lastModifiedDate":"2024-03-02"}],"authorContributionMap":{"jieqiboh":51}},{"path":"docs/_sass/minima/skins/classic.scss","fileType":"other","lines":[{"lineNumber":1,"author":{"gitId":"jieqiboh"},"content":"@charset \"utf-8\";","lastModifiedDate":"2024-03-02"},{"lineNumber":2,"author":{"gitId":"jieqiboh"},"content":"","lastModifiedDate":"2024-03-02"},{"lineNumber":3,"author":{"gitId":"jieqiboh"},"content":"$brand-color: #828282 !default;","lastModifiedDate":"2024-03-02"},{"lineNumber":4,"author":{"gitId":"jieqiboh"},"content":"$brand-color-light: lighten($brand-color, 40%) !default;","lastModifiedDate":"2024-03-02"},{"lineNumber":5,"author":{"gitId":"jieqiboh"},"content":"$brand-color-dark: darken($brand-color, 25%) !default;","lastModifiedDate":"2024-03-02"},{"lineNumber":6,"author":{"gitId":"jieqiboh"},"content":"","lastModifiedDate":"2024-03-02"},{"lineNumber":7,"author":{"gitId":"jieqiboh"},"content":"$text-color: #111 !default;","lastModifiedDate":"2024-03-02"},{"lineNumber":8,"author":{"gitId":"jieqiboh"},"content":"$background-color: #fdfdfd !default;","lastModifiedDate":"2024-03-02"},{"lineNumber":9,"author":{"gitId":"jieqiboh"},"content":"$code-background-color: #eef !default;","lastModifiedDate":"2024-03-02"},{"lineNumber":10,"author":{"gitId":"jieqiboh"},"content":"","lastModifiedDate":"2024-03-02"},{"lineNumber":11,"author":{"gitId":"jieqiboh"},"content":"$link-base-color: #2a7ae2 !default;","lastModifiedDate":"2024-03-02"},{"lineNumber":12,"author":{"gitId":"jieqiboh"},"content":"$link-visited-color: darken($link-base-color, 15%) !default;","lastModifiedDate":"2024-03-02"},{"lineNumber":13,"author":{"gitId":"jieqiboh"},"content":"","lastModifiedDate":"2024-03-02"},{"lineNumber":14,"author":{"gitId":"jieqiboh"},"content":"$table-text-color: lighten($text-color, 18%) !default;","lastModifiedDate":"2024-03-02"},{"lineNumber":15,"author":{"gitId":"jieqiboh"},"content":"$table-zebra-color: lighten($brand-color, 46%) !default;","lastModifiedDate":"2024-03-02"},{"lineNumber":16,"author":{"gitId":"jieqiboh"},"content":"$table-header-bg-color: lighten($brand-color, 43%) !default;","lastModifiedDate":"2024-03-02"},{"lineNumber":17,"author":{"gitId":"jieqiboh"},"content":"$table-header-border: lighten($brand-color, 36%) !default;","lastModifiedDate":"2024-03-02"},{"lineNumber":18,"author":{"gitId":"jieqiboh"},"content":"$table-border-color: $brand-color-light !default;","lastModifiedDate":"2024-03-02"},{"lineNumber":19,"author":{"gitId":"jieqiboh"},"content":"","lastModifiedDate":"2024-03-02"},{"lineNumber":20,"author":{"gitId":"jieqiboh"},"content":"","lastModifiedDate":"2024-03-02"},{"lineNumber":21,"author":{"gitId":"jieqiboh"},"content":"// Syntax highlighting styles should be adjusted appropriately for every \"skin\"","lastModifiedDate":"2024-03-02"},{"lineNumber":22,"author":{"gitId":"jieqiboh"},"content":"// ----------------------------------------------------------------------------","lastModifiedDate":"2024-03-02"},{"lineNumber":23,"author":{"gitId":"jieqiboh"},"content":"","lastModifiedDate":"2024-03-02"},{"lineNumber":24,"author":{"gitId":"jieqiboh"},"content":".highlight {","lastModifiedDate":"2024-03-02"},{"lineNumber":25,"author":{"gitId":"jieqiboh"},"content":" .c { color: #998; font-style: italic } // Comment","lastModifiedDate":"2024-03-02"},{"lineNumber":26,"author":{"gitId":"jieqiboh"},"content":" .err { color: #a61717; background-color: #e3d2d2 } // Error","lastModifiedDate":"2024-03-02"},{"lineNumber":27,"author":{"gitId":"jieqiboh"},"content":" .k { font-weight: bold } // Keyword","lastModifiedDate":"2024-03-02"},{"lineNumber":28,"author":{"gitId":"jieqiboh"},"content":" .o { font-weight: bold } // Operator","lastModifiedDate":"2024-03-02"},{"lineNumber":29,"author":{"gitId":"jieqiboh"},"content":" .cm { color: #998; font-style: italic } // Comment.Multiline","lastModifiedDate":"2024-03-02"},{"lineNumber":30,"author":{"gitId":"jieqiboh"},"content":" .cp { color: #999; font-weight: bold } // Comment.Preproc","lastModifiedDate":"2024-03-02"},{"lineNumber":31,"author":{"gitId":"jieqiboh"},"content":" .c1 { color: #998; font-style: italic } // Comment.Single","lastModifiedDate":"2024-03-02"},{"lineNumber":32,"author":{"gitId":"jieqiboh"},"content":" .cs { color: #999; font-weight: bold; font-style: italic } // Comment.Special","lastModifiedDate":"2024-03-02"},{"lineNumber":33,"author":{"gitId":"jieqiboh"},"content":" .gd { color: #000; background-color: #fdd } // Generic.Deleted","lastModifiedDate":"2024-03-02"},{"lineNumber":34,"author":{"gitId":"jieqiboh"},"content":" .gd .x { color: #000; background-color: #faa } // Generic.Deleted.Specific","lastModifiedDate":"2024-03-02"},{"lineNumber":35,"author":{"gitId":"jieqiboh"},"content":" .ge { font-style: italic } // Generic.Emph","lastModifiedDate":"2024-03-02"},{"lineNumber":36,"author":{"gitId":"jieqiboh"},"content":" .gr { color: #a00 } // Generic.Error","lastModifiedDate":"2024-03-02"},{"lineNumber":37,"author":{"gitId":"jieqiboh"},"content":" .gh { color: #999 } // Generic.Heading","lastModifiedDate":"2024-03-02"},{"lineNumber":38,"author":{"gitId":"jieqiboh"},"content":" .gi { color: #000; background-color: #dfd } // Generic.Inserted","lastModifiedDate":"2024-03-02"},{"lineNumber":39,"author":{"gitId":"jieqiboh"},"content":" .gi .x { color: #000; background-color: #afa } // Generic.Inserted.Specific","lastModifiedDate":"2024-03-02"},{"lineNumber":40,"author":{"gitId":"jieqiboh"},"content":" .go { color: #888 } // Generic.Output","lastModifiedDate":"2024-03-02"},{"lineNumber":41,"author":{"gitId":"jieqiboh"},"content":" .gp { color: #555 } // Generic.Prompt","lastModifiedDate":"2024-03-02"},{"lineNumber":42,"author":{"gitId":"jieqiboh"},"content":" .gs { font-weight: bold } // Generic.Strong","lastModifiedDate":"2024-03-02"},{"lineNumber":43,"author":{"gitId":"jieqiboh"},"content":" .gu { color: #aaa } // Generic.Subheading","lastModifiedDate":"2024-03-02"},{"lineNumber":44,"author":{"gitId":"jieqiboh"},"content":" .gt { color: #a00 } // Generic.Traceback","lastModifiedDate":"2024-03-02"},{"lineNumber":45,"author":{"gitId":"jieqiboh"},"content":" .kc { font-weight: bold } // Keyword.Constant","lastModifiedDate":"2024-03-02"},{"lineNumber":46,"author":{"gitId":"jieqiboh"},"content":" .kd { font-weight: bold } // Keyword.Declaration","lastModifiedDate":"2024-03-02"},{"lineNumber":47,"author":{"gitId":"jieqiboh"},"content":" .kp { font-weight: bold } // Keyword.Pseudo","lastModifiedDate":"2024-03-02"},{"lineNumber":48,"author":{"gitId":"jieqiboh"},"content":" .kr { font-weight: bold } // Keyword.Reserved","lastModifiedDate":"2024-03-02"},{"lineNumber":49,"author":{"gitId":"jieqiboh"},"content":" .kt { color: #458; font-weight: bold } // Keyword.Type","lastModifiedDate":"2024-03-02"},{"lineNumber":50,"author":{"gitId":"jieqiboh"},"content":" .m { color: #099 } // Literal.Number","lastModifiedDate":"2024-03-02"},{"lineNumber":51,"author":{"gitId":"jieqiboh"},"content":" .s { color: #d14 } // Literal.String","lastModifiedDate":"2024-03-02"},{"lineNumber":52,"author":{"gitId":"jieqiboh"},"content":" .na { color: #008080 } // Name.Attribute","lastModifiedDate":"2024-03-02"},{"lineNumber":53,"author":{"gitId":"jieqiboh"},"content":" .nb { color: #0086B3 } // Name.Builtin","lastModifiedDate":"2024-03-02"},{"lineNumber":54,"author":{"gitId":"jieqiboh"},"content":" .nc { color: #458; font-weight: bold } // Name.Class","lastModifiedDate":"2024-03-02"},{"lineNumber":55,"author":{"gitId":"jieqiboh"},"content":" .no { color: #008080 } // Name.Constant","lastModifiedDate":"2024-03-02"},{"lineNumber":56,"author":{"gitId":"jieqiboh"},"content":" .ni { color: #800080 } // Name.Entity","lastModifiedDate":"2024-03-02"},{"lineNumber":57,"author":{"gitId":"jieqiboh"},"content":" .ne { color: #900; font-weight: bold } // Name.Exception","lastModifiedDate":"2024-03-02"},{"lineNumber":58,"author":{"gitId":"jieqiboh"},"content":" .nf { color: #900; font-weight: bold } // Name.Function","lastModifiedDate":"2024-03-02"},{"lineNumber":59,"author":{"gitId":"jieqiboh"},"content":" .nn { color: #555 } // Name.Namespace","lastModifiedDate":"2024-03-02"},{"lineNumber":60,"author":{"gitId":"jieqiboh"},"content":" .nt { color: #000080 } // Name.Tag","lastModifiedDate":"2024-03-02"},{"lineNumber":61,"author":{"gitId":"jieqiboh"},"content":" .nv { color: #008080 } // Name.Variable","lastModifiedDate":"2024-03-02"},{"lineNumber":62,"author":{"gitId":"jieqiboh"},"content":" .ow { font-weight: bold } // Operator.Word","lastModifiedDate":"2024-03-02"},{"lineNumber":63,"author":{"gitId":"jieqiboh"},"content":" .w { color: #bbb } // Text.Whitespace","lastModifiedDate":"2024-03-02"},{"lineNumber":64,"author":{"gitId":"jieqiboh"},"content":" .mf { color: #099 } // Literal.Number.Float","lastModifiedDate":"2024-03-02"},{"lineNumber":65,"author":{"gitId":"jieqiboh"},"content":" .mh { color: #099 } // Literal.Number.Hex","lastModifiedDate":"2024-03-02"},{"lineNumber":66,"author":{"gitId":"jieqiboh"},"content":" .mi { color: #099 } // Literal.Number.Integer","lastModifiedDate":"2024-03-02"},{"lineNumber":67,"author":{"gitId":"jieqiboh"},"content":" .mo { color: #099 } // Literal.Number.Oct","lastModifiedDate":"2024-03-02"},{"lineNumber":68,"author":{"gitId":"jieqiboh"},"content":" .sb { color: #d14 } // Literal.String.Backtick","lastModifiedDate":"2024-03-02"},{"lineNumber":69,"author":{"gitId":"jieqiboh"},"content":" .sc { color: #d14 } // Literal.String.Char","lastModifiedDate":"2024-03-02"},{"lineNumber":70,"author":{"gitId":"jieqiboh"},"content":" .sd { color: #d14 } // Literal.String.Doc","lastModifiedDate":"2024-03-02"},{"lineNumber":71,"author":{"gitId":"jieqiboh"},"content":" .s2 { color: #d14 } // Literal.String.Double","lastModifiedDate":"2024-03-02"},{"lineNumber":72,"author":{"gitId":"jieqiboh"},"content":" .se { color: #d14 } // Literal.String.Escape","lastModifiedDate":"2024-03-02"},{"lineNumber":73,"author":{"gitId":"jieqiboh"},"content":" .sh { color: #d14 } // Literal.String.Heredoc","lastModifiedDate":"2024-03-02"},{"lineNumber":74,"author":{"gitId":"jieqiboh"},"content":" .si { color: #d14 } // Literal.String.Interpol","lastModifiedDate":"2024-03-02"},{"lineNumber":75,"author":{"gitId":"jieqiboh"},"content":" .sx { color: #d14 } // Literal.String.Other","lastModifiedDate":"2024-03-02"},{"lineNumber":76,"author":{"gitId":"jieqiboh"},"content":" .sr { color: #009926 } // Literal.String.Regex","lastModifiedDate":"2024-03-02"},{"lineNumber":77,"author":{"gitId":"jieqiboh"},"content":" .s1 { color: #d14 } // Literal.String.Single","lastModifiedDate":"2024-03-02"},{"lineNumber":78,"author":{"gitId":"jieqiboh"},"content":" .ss { color: #990073 } // Literal.String.Symbol","lastModifiedDate":"2024-03-02"},{"lineNumber":79,"author":{"gitId":"jieqiboh"},"content":" .bp { color: #999 } // Name.Builtin.Pseudo","lastModifiedDate":"2024-03-02"},{"lineNumber":80,"author":{"gitId":"jieqiboh"},"content":" .vc { color: #008080 } // Name.Variable.Class","lastModifiedDate":"2024-03-02"},{"lineNumber":81,"author":{"gitId":"jieqiboh"},"content":" .vg { color: #008080 } // Name.Variable.Global","lastModifiedDate":"2024-03-02"},{"lineNumber":82,"author":{"gitId":"jieqiboh"},"content":" .vi { color: #008080 } // Name.Variable.Instance","lastModifiedDate":"2024-03-02"},{"lineNumber":83,"author":{"gitId":"jieqiboh"},"content":" .il { color: #099 } // Literal.Number.Integer.Long","lastModifiedDate":"2024-03-02"},{"lineNumber":84,"author":{"gitId":"jieqiboh"},"content":"}","lastModifiedDate":"2024-03-02"}],"authorContributionMap":{"jieqiboh":84}},{"path":"docs/_sass/minima/skins/solarized-dark.scss","fileType":"other","lines":[{"lineNumber":1,"author":{"gitId":"jieqiboh"},"content":"@charset \"utf-8\";","lastModifiedDate":"2024-03-02"},{"lineNumber":2,"author":{"gitId":"jieqiboh"},"content":"","lastModifiedDate":"2024-03-02"},{"lineNumber":3,"author":{"gitId":"jieqiboh"},"content":"$sol-is-dark: true;","lastModifiedDate":"2024-03-02"},{"lineNumber":4,"author":{"gitId":"jieqiboh"},"content":"@import \"minima/skins/solarized\";","lastModifiedDate":"2024-03-02"}],"authorContributionMap":{"jieqiboh":4}},{"path":"docs/_sass/minima/skins/solarized.scss","fileType":"other","lines":[{"lineNumber":1,"author":{"gitId":"jieqiboh"},"content":"@charset \"utf-8\";","lastModifiedDate":"2024-03-02"},{"lineNumber":2,"author":{"gitId":"jieqiboh"},"content":"","lastModifiedDate":"2024-03-02"},{"lineNumber":3,"author":{"gitId":"jieqiboh"},"content":"// Solarized skin","lastModifiedDate":"2024-03-02"},{"lineNumber":4,"author":{"gitId":"jieqiboh"},"content":"// \u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d","lastModifiedDate":"2024-03-02"},{"lineNumber":5,"author":{"gitId":"jieqiboh"},"content":"// Created by Sander Voerman \u003cmailto:sander@savoerman.nl\u003e using the Solarized","lastModifiedDate":"2024-03-02"},{"lineNumber":6,"author":{"gitId":"jieqiboh"},"content":"// color scheme by Ethan Schoonover \u003chttps://ethanschoonover.com/solarized\u003e.","lastModifiedDate":"2024-03-02"},{"lineNumber":7,"author":{"gitId":"jieqiboh"},"content":"","lastModifiedDate":"2024-03-02"},{"lineNumber":8,"author":{"gitId":"jieqiboh"},"content":"// This style sheet implements two options for the minima.skin setting:","lastModifiedDate":"2024-03-02"},{"lineNumber":9,"author":{"gitId":"jieqiboh"},"content":"// \"solarized\" for light mode and \"solarized-dark\" for dark mode.","lastModifiedDate":"2024-03-02"},{"lineNumber":10,"author":{"gitId":"jieqiboh"},"content":"$sol-is-dark: false !default;","lastModifiedDate":"2024-03-02"},{"lineNumber":11,"author":{"gitId":"jieqiboh"},"content":"","lastModifiedDate":"2024-03-02"},{"lineNumber":12,"author":{"gitId":"jieqiboh"},"content":"","lastModifiedDate":"2024-03-02"},{"lineNumber":13,"author":{"gitId":"jieqiboh"},"content":"// Color scheme","lastModifiedDate":"2024-03-02"},{"lineNumber":14,"author":{"gitId":"jieqiboh"},"content":"// ------------","lastModifiedDate":"2024-03-02"},{"lineNumber":15,"author":{"gitId":"jieqiboh"},"content":"// The inline comments show the canonical L*a*b values for each color.","lastModifiedDate":"2024-03-02"},{"lineNumber":16,"author":{"gitId":"jieqiboh"},"content":"","lastModifiedDate":"2024-03-02"},{"lineNumber":17,"author":{"gitId":"jieqiboh"},"content":"$sol-base03: #002b36; // 15 -12 -12","lastModifiedDate":"2024-03-02"},{"lineNumber":18,"author":{"gitId":"jieqiboh"},"content":"$sol-base02: #073642; // 20 -12 -12","lastModifiedDate":"2024-03-02"},{"lineNumber":19,"author":{"gitId":"jieqiboh"},"content":"$sol-base01: #586e75; // 45 -07 -07","lastModifiedDate":"2024-03-02"},{"lineNumber":20,"author":{"gitId":"jieqiboh"},"content":"$sol-base00: #657b83; // 50 -07 -07","lastModifiedDate":"2024-03-02"},{"lineNumber":21,"author":{"gitId":"jieqiboh"},"content":"$sol-base0: #839496; // 60 -06 -03","lastModifiedDate":"2024-03-02"},{"lineNumber":22,"author":{"gitId":"jieqiboh"},"content":"$sol-base1: #93a1a1; // 65 -05 -02","lastModifiedDate":"2024-03-02"},{"lineNumber":23,"author":{"gitId":"jieqiboh"},"content":"$sol-base2: #eee8d5; // 92 -00 10","lastModifiedDate":"2024-03-02"},{"lineNumber":24,"author":{"gitId":"jieqiboh"},"content":"$sol-base3: #fdf6e3; // 97 00 10","lastModifiedDate":"2024-03-02"},{"lineNumber":25,"author":{"gitId":"jieqiboh"},"content":"$sol-yellow: #b58900; // 60 10 65","lastModifiedDate":"2024-03-02"},{"lineNumber":26,"author":{"gitId":"jieqiboh"},"content":"$sol-orange: #cb4b16; // 50 50 55","lastModifiedDate":"2024-03-02"},{"lineNumber":27,"author":{"gitId":"jieqiboh"},"content":"$sol-red: #dc322f; // 50 65 45","lastModifiedDate":"2024-03-02"},{"lineNumber":28,"author":{"gitId":"jieqiboh"},"content":"$sol-magenta: #d33682; // 50 65 -05","lastModifiedDate":"2024-03-02"},{"lineNumber":29,"author":{"gitId":"jieqiboh"},"content":"$sol-violet: #6c71c4; // 50 15 -45","lastModifiedDate":"2024-03-02"},{"lineNumber":30,"author":{"gitId":"jieqiboh"},"content":"$sol-blue: #268bd2; // 55 -10 -45","lastModifiedDate":"2024-03-02"},{"lineNumber":31,"author":{"gitId":"jieqiboh"},"content":"$sol-cyan: #2aa198; // 60 -35 -05","lastModifiedDate":"2024-03-02"},{"lineNumber":32,"author":{"gitId":"jieqiboh"},"content":"$sol-green: #859900; // 60 -20 65","lastModifiedDate":"2024-03-02"},{"lineNumber":33,"author":{"gitId":"jieqiboh"},"content":"","lastModifiedDate":"2024-03-02"},{"lineNumber":34,"author":{"gitId":"jieqiboh"},"content":"$sol-mono3: $sol-base3;","lastModifiedDate":"2024-03-02"},{"lineNumber":35,"author":{"gitId":"jieqiboh"},"content":"$sol-mono2: $sol-base2;","lastModifiedDate":"2024-03-02"},{"lineNumber":36,"author":{"gitId":"jieqiboh"},"content":"$sol-mono1: $sol-base1;","lastModifiedDate":"2024-03-02"},{"lineNumber":37,"author":{"gitId":"jieqiboh"},"content":"$sol-mono00: $sol-base00;","lastModifiedDate":"2024-03-02"},{"lineNumber":38,"author":{"gitId":"jieqiboh"},"content":"$sol-mono01: $sol-base01;","lastModifiedDate":"2024-03-02"},{"lineNumber":39,"author":{"gitId":"jieqiboh"},"content":"","lastModifiedDate":"2024-03-02"},{"lineNumber":40,"author":{"gitId":"jieqiboh"},"content":"@if $sol-is-dark {","lastModifiedDate":"2024-03-02"},{"lineNumber":41,"author":{"gitId":"jieqiboh"},"content":" $sol-mono3: $sol-base03;","lastModifiedDate":"2024-03-02"},{"lineNumber":42,"author":{"gitId":"jieqiboh"},"content":" $sol-mono2: $sol-base02;","lastModifiedDate":"2024-03-02"},{"lineNumber":43,"author":{"gitId":"jieqiboh"},"content":" $sol-mono1: $sol-base01;","lastModifiedDate":"2024-03-02"},{"lineNumber":44,"author":{"gitId":"jieqiboh"},"content":" $sol-mono00: $sol-base0;","lastModifiedDate":"2024-03-02"},{"lineNumber":45,"author":{"gitId":"jieqiboh"},"content":" $sol-mono01: $sol-base1;","lastModifiedDate":"2024-03-02"},{"lineNumber":46,"author":{"gitId":"jieqiboh"},"content":"}","lastModifiedDate":"2024-03-02"},{"lineNumber":47,"author":{"gitId":"jieqiboh"},"content":"","lastModifiedDate":"2024-03-02"},{"lineNumber":48,"author":{"gitId":"jieqiboh"},"content":"","lastModifiedDate":"2024-03-02"},{"lineNumber":49,"author":{"gitId":"jieqiboh"},"content":"// Minima color variables","lastModifiedDate":"2024-03-02"},{"lineNumber":50,"author":{"gitId":"jieqiboh"},"content":"// ----------------------","lastModifiedDate":"2024-03-02"},{"lineNumber":51,"author":{"gitId":"jieqiboh"},"content":"","lastModifiedDate":"2024-03-02"},{"lineNumber":52,"author":{"gitId":"jieqiboh"},"content":"$brand-color: $sol-mono1 !default;","lastModifiedDate":"2024-03-02"},{"lineNumber":53,"author":{"gitId":"jieqiboh"},"content":"$brand-color-light: mix($sol-mono1, $sol-mono3) !default;","lastModifiedDate":"2024-03-02"},{"lineNumber":54,"author":{"gitId":"jieqiboh"},"content":"$brand-color-dark: $sol-mono00 !default;","lastModifiedDate":"2024-03-02"},{"lineNumber":55,"author":{"gitId":"jieqiboh"},"content":"","lastModifiedDate":"2024-03-02"},{"lineNumber":56,"author":{"gitId":"jieqiboh"},"content":"$text-color: $sol-mono01 !default;","lastModifiedDate":"2024-03-02"},{"lineNumber":57,"author":{"gitId":"jieqiboh"},"content":"$background-color: $sol-mono3 !default;","lastModifiedDate":"2024-03-02"},{"lineNumber":58,"author":{"gitId":"jieqiboh"},"content":"$code-background-color: $sol-mono2 !default;","lastModifiedDate":"2024-03-02"},{"lineNumber":59,"author":{"gitId":"jieqiboh"},"content":"","lastModifiedDate":"2024-03-02"},{"lineNumber":60,"author":{"gitId":"jieqiboh"},"content":"$link-base-color: $sol-blue !default;","lastModifiedDate":"2024-03-02"},{"lineNumber":61,"author":{"gitId":"jieqiboh"},"content":"$link-visited-color: mix($sol-blue, $sol-mono00) !default;","lastModifiedDate":"2024-03-02"},{"lineNumber":62,"author":{"gitId":"jieqiboh"},"content":"","lastModifiedDate":"2024-03-02"},{"lineNumber":63,"author":{"gitId":"jieqiboh"},"content":"$table-text-color: $sol-mono00 !default;","lastModifiedDate":"2024-03-02"},{"lineNumber":64,"author":{"gitId":"jieqiboh"},"content":"$table-zebra-color: mix($sol-mono2, $sol-mono3) !default;","lastModifiedDate":"2024-03-02"},{"lineNumber":65,"author":{"gitId":"jieqiboh"},"content":"$table-header-bg-color: $sol-mono2 !default;","lastModifiedDate":"2024-03-02"},{"lineNumber":66,"author":{"gitId":"jieqiboh"},"content":"$table-header-border: $sol-mono1 !default;","lastModifiedDate":"2024-03-02"},{"lineNumber":67,"author":{"gitId":"jieqiboh"},"content":"$table-border-color: $sol-mono1 !default;","lastModifiedDate":"2024-03-02"},{"lineNumber":68,"author":{"gitId":"jieqiboh"},"content":"","lastModifiedDate":"2024-03-02"},{"lineNumber":69,"author":{"gitId":"jieqiboh"},"content":"","lastModifiedDate":"2024-03-02"},{"lineNumber":70,"author":{"gitId":"jieqiboh"},"content":"// Syntax highlighting styles","lastModifiedDate":"2024-03-02"},{"lineNumber":71,"author":{"gitId":"jieqiboh"},"content":"// --------------------------","lastModifiedDate":"2024-03-02"},{"lineNumber":72,"author":{"gitId":"jieqiboh"},"content":"","lastModifiedDate":"2024-03-02"},{"lineNumber":73,"author":{"gitId":"jieqiboh"},"content":".highlight {","lastModifiedDate":"2024-03-02"},{"lineNumber":74,"author":{"gitId":"jieqiboh"},"content":" .c { color: $sol-mono1; font-style: italic } // Comment","lastModifiedDate":"2024-03-02"},{"lineNumber":75,"author":{"gitId":"jieqiboh"},"content":" .err { color: $sol-red } // Error","lastModifiedDate":"2024-03-02"},{"lineNumber":76,"author":{"gitId":"jieqiboh"},"content":" .k { color: $sol-mono01; font-weight: bold } // Keyword","lastModifiedDate":"2024-03-02"},{"lineNumber":77,"author":{"gitId":"jieqiboh"},"content":" .o { color: $sol-mono01; font-weight: bold } // Operator","lastModifiedDate":"2024-03-02"},{"lineNumber":78,"author":{"gitId":"jieqiboh"},"content":" .cm { color: $sol-mono1; font-style: italic } // Comment.Multiline","lastModifiedDate":"2024-03-02"},{"lineNumber":79,"author":{"gitId":"jieqiboh"},"content":" .cp { color: $sol-mono1; font-weight: bold } // Comment.Preproc","lastModifiedDate":"2024-03-02"},{"lineNumber":80,"author":{"gitId":"jieqiboh"},"content":" .c1 { color: $sol-mono1; font-style: italic } // Comment.Single","lastModifiedDate":"2024-03-02"},{"lineNumber":81,"author":{"gitId":"jieqiboh"},"content":" .cs { color: $sol-mono1; font-weight: bold; font-style: italic } // Comment.Special","lastModifiedDate":"2024-03-02"},{"lineNumber":82,"author":{"gitId":"jieqiboh"},"content":" .gd { color: $sol-red } // Generic.Deleted","lastModifiedDate":"2024-03-02"},{"lineNumber":83,"author":{"gitId":"jieqiboh"},"content":" .gd .x { color: $sol-red } // Generic.Deleted.Specific","lastModifiedDate":"2024-03-02"},{"lineNumber":84,"author":{"gitId":"jieqiboh"},"content":" .ge { color: $sol-mono00; font-style: italic } // Generic.Emph","lastModifiedDate":"2024-03-02"},{"lineNumber":85,"author":{"gitId":"jieqiboh"},"content":" .gr { color: $sol-red } // Generic.Error","lastModifiedDate":"2024-03-02"},{"lineNumber":86,"author":{"gitId":"jieqiboh"},"content":" .gh { color: $sol-mono1 } // Generic.Heading","lastModifiedDate":"2024-03-02"},{"lineNumber":87,"author":{"gitId":"jieqiboh"},"content":" .gi { color: $sol-green } // Generic.Inserted","lastModifiedDate":"2024-03-02"},{"lineNumber":88,"author":{"gitId":"jieqiboh"},"content":" .gi .x { color: $sol-green } // Generic.Inserted.Specific","lastModifiedDate":"2024-03-02"},{"lineNumber":89,"author":{"gitId":"jieqiboh"},"content":" .go { color: $sol-mono00 } // Generic.Output","lastModifiedDate":"2024-03-02"},{"lineNumber":90,"author":{"gitId":"jieqiboh"},"content":" .gp { color: $sol-mono00 } // Generic.Prompt","lastModifiedDate":"2024-03-02"},{"lineNumber":91,"author":{"gitId":"jieqiboh"},"content":" .gs { color: $sol-mono01; font-weight: bold } // Generic.Strong","lastModifiedDate":"2024-03-02"},{"lineNumber":92,"author":{"gitId":"jieqiboh"},"content":" .gu { color: $sol-mono1 } // Generic.Subheading","lastModifiedDate":"2024-03-02"},{"lineNumber":93,"author":{"gitId":"jieqiboh"},"content":" .gt { color: $sol-red } // Generic.Traceback","lastModifiedDate":"2024-03-02"},{"lineNumber":94,"author":{"gitId":"jieqiboh"},"content":" .kc { color: $sol-mono01; font-weight: bold } // Keyword.Constant","lastModifiedDate":"2024-03-02"},{"lineNumber":95,"author":{"gitId":"jieqiboh"},"content":" .kd { color: $sol-mono01; font-weight: bold } // Keyword.Declaration","lastModifiedDate":"2024-03-02"},{"lineNumber":96,"author":{"gitId":"jieqiboh"},"content":" .kp { color: $sol-mono01; font-weight: bold } // Keyword.Pseudo","lastModifiedDate":"2024-03-02"},{"lineNumber":97,"author":{"gitId":"jieqiboh"},"content":" .kr { color: $sol-mono01; font-weight: bold } // Keyword.Reserved","lastModifiedDate":"2024-03-02"},{"lineNumber":98,"author":{"gitId":"jieqiboh"},"content":" .kt { color: $sol-violet; font-weight: bold } // Keyword.Type","lastModifiedDate":"2024-03-02"},{"lineNumber":99,"author":{"gitId":"jieqiboh"},"content":" .m { color: $sol-cyan } // Literal.Number","lastModifiedDate":"2024-03-02"},{"lineNumber":100,"author":{"gitId":"jieqiboh"},"content":" .s { color: $sol-magenta } // Literal.String","lastModifiedDate":"2024-03-02"},{"lineNumber":101,"author":{"gitId":"jieqiboh"},"content":" .na { color: $sol-cyan } // Name.Attribute","lastModifiedDate":"2024-03-02"},{"lineNumber":102,"author":{"gitId":"jieqiboh"},"content":" .nb { color: $sol-blue } // Name.Builtin","lastModifiedDate":"2024-03-02"},{"lineNumber":103,"author":{"gitId":"jieqiboh"},"content":" .nc { color: $sol-violet; font-weight: bold } // Name.Class","lastModifiedDate":"2024-03-02"},{"lineNumber":104,"author":{"gitId":"jieqiboh"},"content":" .no { color: $sol-cyan } // Name.Constant","lastModifiedDate":"2024-03-02"},{"lineNumber":105,"author":{"gitId":"jieqiboh"},"content":" .ni { color: $sol-violet } // Name.Entity","lastModifiedDate":"2024-03-02"},{"lineNumber":106,"author":{"gitId":"jieqiboh"},"content":" .ne { color: $sol-violet; font-weight: bold } // Name.Exception","lastModifiedDate":"2024-03-02"},{"lineNumber":107,"author":{"gitId":"jieqiboh"},"content":" .nf { color: $sol-blue; font-weight: bold } // Name.Function","lastModifiedDate":"2024-03-02"},{"lineNumber":108,"author":{"gitId":"jieqiboh"},"content":" .nn { color: $sol-mono00 } // Name.Namespace","lastModifiedDate":"2024-03-02"},{"lineNumber":109,"author":{"gitId":"jieqiboh"},"content":" .nt { color: $sol-blue } // Name.Tag","lastModifiedDate":"2024-03-02"},{"lineNumber":110,"author":{"gitId":"jieqiboh"},"content":" .nv { color: $sol-cyan } // Name.Variable","lastModifiedDate":"2024-03-02"},{"lineNumber":111,"author":{"gitId":"jieqiboh"},"content":" .ow { color: $sol-mono01; font-weight: bold } // Operator.Word","lastModifiedDate":"2024-03-02"},{"lineNumber":112,"author":{"gitId":"jieqiboh"},"content":" .w { color: $sol-mono1 } // Text.Whitespace","lastModifiedDate":"2024-03-02"},{"lineNumber":113,"author":{"gitId":"jieqiboh"},"content":" .mf { color: $sol-cyan } // Literal.Number.Float","lastModifiedDate":"2024-03-02"},{"lineNumber":114,"author":{"gitId":"jieqiboh"},"content":" .mh { color: $sol-cyan } // Literal.Number.Hex","lastModifiedDate":"2024-03-02"},{"lineNumber":115,"author":{"gitId":"jieqiboh"},"content":" .mi { color: $sol-cyan } // Literal.Number.Integer","lastModifiedDate":"2024-03-02"},{"lineNumber":116,"author":{"gitId":"jieqiboh"},"content":" .mo { color: $sol-cyan } // Literal.Number.Oct","lastModifiedDate":"2024-03-02"},{"lineNumber":117,"author":{"gitId":"jieqiboh"},"content":" .sb { color: $sol-magenta } // Literal.String.Backtick","lastModifiedDate":"2024-03-02"},{"lineNumber":118,"author":{"gitId":"jieqiboh"},"content":" .sc { color: $sol-magenta } // Literal.String.Char","lastModifiedDate":"2024-03-02"},{"lineNumber":119,"author":{"gitId":"jieqiboh"},"content":" .sd { color: $sol-magenta } // Literal.String.Doc","lastModifiedDate":"2024-03-02"},{"lineNumber":120,"author":{"gitId":"jieqiboh"},"content":" .s2 { color: $sol-magenta } // Literal.String.Double","lastModifiedDate":"2024-03-02"},{"lineNumber":121,"author":{"gitId":"jieqiboh"},"content":" .se { color: $sol-magenta } // Literal.String.Escape","lastModifiedDate":"2024-03-02"},{"lineNumber":122,"author":{"gitId":"jieqiboh"},"content":" .sh { color: $sol-magenta } // Literal.String.Heredoc","lastModifiedDate":"2024-03-02"},{"lineNumber":123,"author":{"gitId":"jieqiboh"},"content":" .si { color: $sol-magenta } // Literal.String.Interpol","lastModifiedDate":"2024-03-02"},{"lineNumber":124,"author":{"gitId":"jieqiboh"},"content":" .sx { color: $sol-magenta } // Literal.String.Other","lastModifiedDate":"2024-03-02"},{"lineNumber":125,"author":{"gitId":"jieqiboh"},"content":" .sr { color: $sol-green } // Literal.String.Regex","lastModifiedDate":"2024-03-02"},{"lineNumber":126,"author":{"gitId":"jieqiboh"},"content":" .s1 { color: $sol-magenta } // Literal.String.Single","lastModifiedDate":"2024-03-02"},{"lineNumber":127,"author":{"gitId":"jieqiboh"},"content":" .ss { color: $sol-magenta } // Literal.String.Symbol","lastModifiedDate":"2024-03-02"},{"lineNumber":128,"author":{"gitId":"jieqiboh"},"content":" .bp { color: $sol-mono1 } // Name.Builtin.Pseudo","lastModifiedDate":"2024-03-02"},{"lineNumber":129,"author":{"gitId":"jieqiboh"},"content":" .vc { color: $sol-cyan } // Name.Variable.Class","lastModifiedDate":"2024-03-02"},{"lineNumber":130,"author":{"gitId":"jieqiboh"},"content":" .vg { color: $sol-cyan } // Name.Variable.Global","lastModifiedDate":"2024-03-02"},{"lineNumber":131,"author":{"gitId":"jieqiboh"},"content":" .vi { color: $sol-cyan } // Name.Variable.Instance","lastModifiedDate":"2024-03-02"},{"lineNumber":132,"author":{"gitId":"jieqiboh"},"content":" .il { color: $sol-cyan } // Literal.Number.Integer.Long","lastModifiedDate":"2024-03-02"},{"lineNumber":133,"author":{"gitId":"jieqiboh"},"content":"}","lastModifiedDate":"2024-03-02"}],"authorContributionMap":{"jieqiboh":133}},{"path":"docs/assets/css/style.scss","fileType":"other","lines":[{"lineNumber":1,"author":{"gitId":"jieqiboh"},"content":"---","lastModifiedDate":"2024-03-02"},{"lineNumber":2,"author":{"gitId":"jieqiboh"},"content":"# Only the main Sass file needs front matter (the dashes are enough)","lastModifiedDate":"2024-03-02"},{"lineNumber":3,"author":{"gitId":"jieqiboh"},"content":"---","lastModifiedDate":"2024-03-02"},{"lineNumber":4,"author":{"gitId":"jieqiboh"},"content":"","lastModifiedDate":"2024-03-02"},{"lineNumber":5,"author":{"gitId":"jieqiboh"},"content":"@import","lastModifiedDate":"2024-03-02"},{"lineNumber":6,"author":{"gitId":"jieqiboh"},"content":" \"minima/skins/{{ site.minima.skin | default: \u0027classic\u0027 }}\",","lastModifiedDate":"2024-03-02"},{"lineNumber":7,"author":{"gitId":"jieqiboh"},"content":" \"minima/initialize\";","lastModifiedDate":"2024-03-02"},{"lineNumber":8,"author":{"gitId":"jieqiboh"},"content":"","lastModifiedDate":"2024-03-02"},{"lineNumber":9,"author":{"gitId":"jieqiboh"},"content":".icon {","lastModifiedDate":"2024-03-02"},{"lineNumber":10,"author":{"gitId":"jieqiboh"},"content":" height: 21px;","lastModifiedDate":"2024-03-02"},{"lineNumber":11,"author":{"gitId":"jieqiboh"},"content":" width: 21px","lastModifiedDate":"2024-03-02"},{"lineNumber":12,"author":{"gitId":"jieqiboh"},"content":"}","lastModifiedDate":"2024-03-02"}],"authorContributionMap":{"jieqiboh":12}},{"path":"docs/index.md","fileType":"docs","lines":[{"lineNumber":1,"author":{"gitId":"-"},"content":"---","lastModifiedDate":"2020-05-23"},{"lineNumber":2,"author":{"gitId":"jieqiboh"},"content":"layout: page","lastModifiedDate":"2024-03-02"},{"lineNumber":3,"author":{"gitId":"jieqiboh"},"content":"title: AddressBook Level-3","lastModifiedDate":"2024-03-02"},{"lineNumber":4,"author":{"gitId":"-"},"content":"---","lastModifiedDate":"2020-05-23"},{"lineNumber":5,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":6,"author":{"gitId":"-"},"content":"[![CI Status](https://github.com/se-edu/addressbook-level3/workflows/Java%20CI/badge.svg)](https://github.com/se-edu/addressbook-level3/actions)","lastModifiedDate":"2020-05-23"},{"lineNumber":7,"author":{"gitId":"-"},"content":"[![codecov](https://codecov.io/gh/se-edu/addressbook-level3/branch/master/graph/badge.svg)](https://codecov.io/gh/se-edu/addressbook-level3)","lastModifiedDate":"2020-08-07"},{"lineNumber":8,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":9,"author":{"gitId":"-"},"content":"![Ui](images/Ui.png)","lastModifiedDate":"2020-05-23"},{"lineNumber":10,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":11,"author":{"gitId":"-"},"content":"**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).","lastModifiedDate":"2020-05-23"},{"lineNumber":12,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":13,"author":{"gitId":"-"},"content":"* If you are interested in using AddressBook, head over to the [_Quick Start_ section of the **User Guide**](UserGuide.html#quick-start).","lastModifiedDate":"2020-05-23"},{"lineNumber":14,"author":{"gitId":"-"},"content":"* If you are interested about developing AddressBook, the [**Developer Guide**](DeveloperGuide.html) is a good place to start.","lastModifiedDate":"2020-05-23"},{"lineNumber":15,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":16,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":17,"author":{"gitId":"-"},"content":"**Acknowledgements**","lastModifiedDate":"2020-05-23"},{"lineNumber":18,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":19,"author":{"gitId":"-"},"content":"* Libraries used: [JavaFX](https://openjfx.io/), [Jackson](https://github.com/FasterXML/jackson), [JUnit5](https://github.com/junit-team/junit5)","lastModifiedDate":"2020-05-23"}],"authorContributionMap":{"jieqiboh":2,"-":17}},{"path":"docs/team/captainkeqing.md","fileType":"docs","lines":[{"lineNumber":1,"author":{"gitId":"CaptainKeqing"},"content":"---","lastModifiedDate":"2024-03-02"},{"lineNumber":2,"author":{"gitId":"CaptainKeqing"},"content":"layout: page","lastModifiedDate":"2024-03-02"},{"lineNumber":3,"author":{"gitId":"CaptainKeqing"},"content":"title: CaptainKeqing\u0027s Project Portfolio Page","lastModifiedDate":"2024-03-02"},{"lineNumber":4,"author":{"gitId":"CaptainKeqing"},"content":"---","lastModifiedDate":"2024-03-02"},{"lineNumber":5,"author":{"gitId":"CaptainKeqing"},"content":"","lastModifiedDate":"2024-03-02"},{"lineNumber":6,"author":{"gitId":"CaptainKeqing"},"content":"### Project: CareerSync","lastModifiedDate":"2024-03-02"},{"lineNumber":7,"author":{"gitId":"CaptainKeqing"},"content":"","lastModifiedDate":"2024-03-02"},{"lineNumber":8,"author":{"gitId":"CaptainKeqing"},"content":"Given below are my contributions to the project.","lastModifiedDate":"2024-03-02"}],"authorContributionMap":{"CaptainKeqing":8}},{"path":"docs/team/hm33-stu.md","fileType":"docs","lines":[{"lineNumber":1,"author":{"gitId":"HM33-Stu"},"content":"---","lastModifiedDate":"2024-03-01"},{"lineNumber":2,"author":{"gitId":"HM33-Stu"},"content":" layout: default.md","lastModifiedDate":"2024-03-01"},{"lineNumber":3,"author":{"gitId":"HM33-Stu"},"content":" title: \"HM33-Stu\u0027s Project Portfolio Page\"","lastModifiedDate":"2024-03-01"},{"lineNumber":4,"author":{"gitId":"HM33-Stu"},"content":"---","lastModifiedDate":"2024-03-01"},{"lineNumber":5,"author":{"gitId":"HM33-Stu"},"content":"","lastModifiedDate":"2024-03-01"},{"lineNumber":6,"author":{"gitId":"HM33-Stu"},"content":"### Project: CareerSync","lastModifiedDate":"2024-03-01"},{"lineNumber":7,"author":{"gitId":"HM33-Stu"},"content":"","lastModifiedDate":"2024-03-01"},{"lineNumber":8,"author":{"gitId":"HM33-Stu"},"content":"Given below are my contributions to the project.","lastModifiedDate":"2024-03-01"}],"authorContributionMap":{"HM33-Stu":8}},{"path":"docs/team/jieqiboh.md","fileType":"docs","lines":[{"lineNumber":1,"author":{"gitId":"-"},"content":"---","lastModifiedDate":"2020-05-23"},{"lineNumber":2,"author":{"gitId":"-"},"content":"layout: page","lastModifiedDate":"2020-05-23"},{"lineNumber":3,"author":{"gitId":"jieqiboh"},"content":"title: Boh Jie Qi\u0027s Project Portfolio Page","lastModifiedDate":"2024-02-29"},{"lineNumber":4,"author":{"gitId":"-"},"content":"---","lastModifiedDate":"2020-05-23"},{"lineNumber":5,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":6,"author":{"gitId":"-"},"content":"### Project: AddressBook Level 3","lastModifiedDate":"2021-07-30"},{"lineNumber":7,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":8,"author":{"gitId":"-"},"content":"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.","lastModifiedDate":"2020-05-23"},{"lineNumber":9,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":10,"author":{"gitId":"-"},"content":"Given below are my contributions to the project.","lastModifiedDate":"2020-05-23"},{"lineNumber":11,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":12,"author":{"gitId":"-"},"content":"* **New Feature**: Added the ability to undo/redo previous commands.","lastModifiedDate":"2020-05-23"},{"lineNumber":13,"author":{"gitId":"-"},"content":" * 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.","lastModifiedDate":"2020-05-23"},{"lineNumber":14,"author":{"gitId":"-"},"content":" * 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.","lastModifiedDate":"2020-05-23"},{"lineNumber":15,"author":{"gitId":"-"},"content":" * 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.","lastModifiedDate":"2020-05-23"},{"lineNumber":16,"author":{"gitId":"-"},"content":" * 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}*","lastModifiedDate":"2020-05-23"},{"lineNumber":17,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":18,"author":{"gitId":"-"},"content":"* **New Feature**: Added a history command that allows the user to navigate to previous commands using up/down keys.","lastModifiedDate":"2020-05-23"},{"lineNumber":19,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":20,"author":{"gitId":"-"},"content":"* **Code contributed**: [RepoSense link]()","lastModifiedDate":"2020-05-23"},{"lineNumber":21,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":22,"author":{"gitId":"-"},"content":"* **Project management**:","lastModifiedDate":"2020-05-23"},{"lineNumber":23,"author":{"gitId":"-"},"content":" * Managed releases `v1.3` - `v1.5rc` (3 releases) on GitHub","lastModifiedDate":"2020-05-23"},{"lineNumber":24,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":25,"author":{"gitId":"-"},"content":"* **Enhancements to existing features**:","lastModifiedDate":"2020-05-23"},{"lineNumber":26,"author":{"gitId":"-"},"content":" * Updated the GUI color scheme (Pull requests [\\#33](), [\\#34]())","lastModifiedDate":"2020-05-23"},{"lineNumber":27,"author":{"gitId":"-"},"content":" * Wrote additional tests for existing features to increase coverage from 88% to 92% (Pull requests [\\#36](), [\\#38]())","lastModifiedDate":"2020-05-23"},{"lineNumber":28,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":29,"author":{"gitId":"-"},"content":"* **Documentation**:","lastModifiedDate":"2020-05-23"},{"lineNumber":30,"author":{"gitId":"-"},"content":" * User Guide:","lastModifiedDate":"2020-05-23"},{"lineNumber":31,"author":{"gitId":"-"},"content":" * Added documentation for the features `delete` and `find` [\\#72]()","lastModifiedDate":"2020-05-23"},{"lineNumber":32,"author":{"gitId":"-"},"content":" * Did cosmetic tweaks to existing documentation of features `clear`, `exit`: [\\#74]()","lastModifiedDate":"2020-05-23"},{"lineNumber":33,"author":{"gitId":"-"},"content":" * Developer Guide:","lastModifiedDate":"2020-05-23"},{"lineNumber":34,"author":{"gitId":"-"},"content":" * Added implementation details of the `delete` feature.","lastModifiedDate":"2020-05-23"},{"lineNumber":35,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":36,"author":{"gitId":"-"},"content":"* **Community**:","lastModifiedDate":"2020-05-23"},{"lineNumber":37,"author":{"gitId":"-"},"content":" * PRs reviewed (with non-trivial review comments): [\\#12](), [\\#32](), [\\#19](), [\\#42]()","lastModifiedDate":"2020-05-23"},{"lineNumber":38,"author":{"gitId":"-"},"content":" * Contributed to forum discussions (examples: [1](), [2](), [3](), [4]())","lastModifiedDate":"2020-05-23"},{"lineNumber":39,"author":{"gitId":"-"},"content":" * Reported bugs and suggestions for other teams in the class (examples: [1](), [2](), [3]())","lastModifiedDate":"2020-05-23"},{"lineNumber":40,"author":{"gitId":"-"},"content":" * Some parts of the history feature I added was adopted by several other class mates ([1](), [2]())","lastModifiedDate":"2020-05-23"},{"lineNumber":41,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":42,"author":{"gitId":"-"},"content":"* **Tools**:","lastModifiedDate":"2020-05-23"},{"lineNumber":43,"author":{"gitId":"-"},"content":" * Integrated a third party library (Natty) to the project ([\\#42]())","lastModifiedDate":"2020-05-23"},{"lineNumber":44,"author":{"gitId":"-"},"content":" * Integrated a new Github plugin (CircleCI) to the team repo","lastModifiedDate":"2020-05-23"},{"lineNumber":45,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":46,"author":{"gitId":"-"},"content":"* _{you can add/remove categories in the list above}_","lastModifiedDate":"2020-05-23"}],"authorContributionMap":{"jieqiboh":1,"-":45}},{"path":"docs/team/lws49.md","fileType":"docs","lines":[{"lineNumber":1,"author":{"gitId":"LWS49"},"content":"---","lastModifiedDate":"2024-03-02"},{"lineNumber":2,"author":{"gitId":"LWS49"},"content":"layout: page","lastModifiedDate":"2024-03-02"},{"lineNumber":3,"author":{"gitId":"LWS49"},"content":"title: LWS49\u0027s Project Portfolio Page","lastModifiedDate":"2024-03-02"},{"lineNumber":4,"author":{"gitId":"LWS49"},"content":"---","lastModifiedDate":"2024-03-02"},{"lineNumber":5,"author":{"gitId":"LWS49"},"content":"","lastModifiedDate":"2024-03-02"},{"lineNumber":6,"author":{"gitId":"LWS49"},"content":"### Project: CareerSync","lastModifiedDate":"2024-03-02"},{"lineNumber":7,"author":{"gitId":"LWS49"},"content":"","lastModifiedDate":"2024-03-02"},{"lineNumber":8,"author":{"gitId":"LWS49"},"content":"Given below are my contributions to the project.","lastModifiedDate":"2024-03-02"}],"authorContributionMap":{"LWS49":8}},{"path":"docs/team/theman-oj10.md","fileType":"docs","lines":[{"lineNumber":1,"author":{"gitId":"theman-oj10"},"content":"---","lastModifiedDate":"2024-03-02"},{"lineNumber":2,"author":{"gitId":"theman-oj10"},"content":"layout: page","lastModifiedDate":"2024-03-02"},{"lineNumber":3,"author":{"gitId":"theman-oj10"},"content":"title: Manoj\u0027s Project Portfolio Page","lastModifiedDate":"2024-03-02"},{"lineNumber":4,"author":{"gitId":"theman-oj10"},"content":"---","lastModifiedDate":"2024-03-02"},{"lineNumber":5,"author":{"gitId":"theman-oj10"},"content":"","lastModifiedDate":"2024-03-02"},{"lineNumber":6,"author":{"gitId":"theman-oj10"},"content":"### Project: CareerSync","lastModifiedDate":"2024-03-02"},{"lineNumber":7,"author":{"gitId":"theman-oj10"},"content":"","lastModifiedDate":"2024-03-02"},{"lineNumber":8,"author":{"gitId":"theman-oj10"},"content":"Given below are my contributions to the project.","lastModifiedDate":"2024-03-02"}],"authorContributionMap":{"theman-oj10":8}},{"path":"docs/tutorials/AddRemark.md","fileType":"docs","lines":[{"lineNumber":1,"author":{"gitId":"-"},"content":"---","lastModifiedDate":"2020-07-29"},{"lineNumber":2,"author":{"gitId":"jieqiboh"},"content":"layout: page","lastModifiedDate":"2024-03-02"},{"lineNumber":3,"author":{"gitId":"-"},"content":"title: \"Tutorial: Adding a command\"","lastModifiedDate":"2020-07-29"},{"lineNumber":4,"author":{"gitId":"-"},"content":"---","lastModifiedDate":"2020-07-29"},{"lineNumber":5,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-07-29"},{"lineNumber":6,"author":{"gitId":"-"},"content":"Let\u0027s walk you through the implementation of a new command — `remark`.","lastModifiedDate":"2020-07-29"},{"lineNumber":7,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-07-29"},{"lineNumber":8,"author":{"gitId":"-"},"content":"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:","lastModifiedDate":"2020-07-29"},{"lineNumber":9,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-07-29"},{"lineNumber":10,"author":{"gitId":"-"},"content":"`remark INDEX r/REMARK` (e.g., `remark 2 r/Likes baseball`)","lastModifiedDate":"2020-07-29"},{"lineNumber":11,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-07-29"},{"lineNumber":12,"author":{"gitId":"-"},"content":"We’ll assume that you have already set up the development environment as outlined in the Developer’s Guide.","lastModifiedDate":"2020-07-29"},{"lineNumber":13,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-07-29"},{"lineNumber":14,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-07-29"},{"lineNumber":15,"author":{"gitId":"-"},"content":"## Create a new `remark` command","lastModifiedDate":"2020-07-29"},{"lineNumber":16,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-07-29"},{"lineNumber":17,"author":{"gitId":"-"},"content":"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`.","lastModifiedDate":"2020-07-29"},{"lineNumber":18,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-07-29"},{"lineNumber":19,"author":{"gitId":"-"},"content":"Let’s start by creating a new `RemarkCommand` class in the `src/main/java/seedu/address/logic/command` directory.","lastModifiedDate":"2020-07-29"},{"lineNumber":20,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-07-29"},{"lineNumber":21,"author":{"gitId":"-"},"content":"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.","lastModifiedDate":"2020-07-29"},{"lineNumber":22,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-07-29"},{"lineNumber":23,"author":{"gitId":"-"},"content":"**`RemarkCommand.java`:**","lastModifiedDate":"2020-07-29"},{"lineNumber":24,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-07-29"},{"lineNumber":25,"author":{"gitId":"-"},"content":"``` java","lastModifiedDate":"2020-07-29"},{"lineNumber":26,"author":{"gitId":"-"},"content":"package seedu.address.logic.commands;","lastModifiedDate":"2020-07-29"},{"lineNumber":27,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-07-29"},{"lineNumber":28,"author":{"gitId":"-"},"content":"import seedu.address.model.Model;","lastModifiedDate":"2020-07-29"},{"lineNumber":29,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-07-29"},{"lineNumber":30,"author":{"gitId":"-"},"content":"/**","lastModifiedDate":"2020-07-29"},{"lineNumber":31,"author":{"gitId":"-"},"content":" * Changes the remark of an existing person in the address book.","lastModifiedDate":"2020-07-29"},{"lineNumber":32,"author":{"gitId":"-"},"content":" */","lastModifiedDate":"2020-07-29"},{"lineNumber":33,"author":{"gitId":"-"},"content":"public class RemarkCommand extends Command {","lastModifiedDate":"2020-07-29"},{"lineNumber":34,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-07-29"},{"lineNumber":35,"author":{"gitId":"-"},"content":" public static final String COMMAND_WORD \u003d \"remark\";","lastModifiedDate":"2020-07-29"},{"lineNumber":36,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-07-29"},{"lineNumber":37,"author":{"gitId":"-"},"content":" @Override","lastModifiedDate":"2020-07-29"},{"lineNumber":38,"author":{"gitId":"-"},"content":" public CommandResult execute(Model model) {","lastModifiedDate":"2020-07-29"},{"lineNumber":39,"author":{"gitId":"-"},"content":" return new CommandResult(\"Hello from remark\");","lastModifiedDate":"2020-07-29"},{"lineNumber":40,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2020-07-29"},{"lineNumber":41,"author":{"gitId":"-"},"content":"}","lastModifiedDate":"2020-07-29"},{"lineNumber":42,"author":{"gitId":"-"},"content":"```","lastModifiedDate":"2020-07-29"},{"lineNumber":43,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-07-29"},{"lineNumber":44,"author":{"gitId":"-"},"content":"### Hook `RemarkCommand` into the application","lastModifiedDate":"2020-07-29"},{"lineNumber":45,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-07-29"},{"lineNumber":46,"author":{"gitId":"-"},"content":"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`.","lastModifiedDate":"2020-07-29"},{"lineNumber":47,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-07-29"},{"lineNumber":48,"author":{"gitId":"-"},"content":"You can refer to the changes in this [diff](https://github.com/se-edu/addressbook-level3/commit/35eb7286f18a029d39cb7a29df8f172a001e4fd8#diff-399c284cb892c20b7c04a69116fcff6ccc0666c5230a1db8e4a9145def8fa4ee).","lastModifiedDate":"2022-01-02"},{"lineNumber":49,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-07-29"},{"lineNumber":50,"author":{"gitId":"-"},"content":"### Run the application","lastModifiedDate":"2020-07-29"},{"lineNumber":51,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-07-29"},{"lineNumber":52,"author":{"gitId":"-"},"content":"Run `Main#main` and try out your new `RemarkCommand`. If everything went well, you should see something like this:","lastModifiedDate":"2020-07-29"},{"lineNumber":53,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-07-29"},{"lineNumber":54,"author":{"gitId":"-"},"content":"![Output displayed](../images/add-remark/RemarkHello.png)","lastModifiedDate":"2020-07-29"},{"lineNumber":55,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-07-29"},{"lineNumber":56,"author":{"gitId":"-"},"content":"## Change `RemarkCommand` to throw an exception","lastModifiedDate":"2020-07-29"},{"lineNumber":57,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-07-29"},{"lineNumber":58,"author":{"gitId":"-"},"content":"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.","lastModifiedDate":"2020-12-12"},{"lineNumber":59,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-07-29"},{"lineNumber":60,"author":{"gitId":"jieqiboh"},"content":"![The relationship between RemarkCommand and Command](../images/add-remark/RemarkCommandClass.png)","lastModifiedDate":"2024-03-02"},{"lineNumber":61,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-07-29"},{"lineNumber":62,"author":{"gitId":"-"},"content":"Following the convention in other commands, we add relevant messages as constants and use them.","lastModifiedDate":"2020-07-29"},{"lineNumber":63,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-07-29"},{"lineNumber":64,"author":{"gitId":"-"},"content":"**`RemarkCommand.java`:**","lastModifiedDate":"2020-07-29"},{"lineNumber":65,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-07-29"},{"lineNumber":66,"author":{"gitId":"-"},"content":"``` java","lastModifiedDate":"2020-07-29"},{"lineNumber":67,"author":{"gitId":"-"},"content":" public static final String MESSAGE_USAGE \u003d COMMAND_WORD","lastModifiedDate":"2021-08-01"},{"lineNumber":68,"author":{"gitId":"-"},"content":" + \": Edits the remark of the person identified \"","lastModifiedDate":"2021-08-01"},{"lineNumber":69,"author":{"gitId":"-"},"content":" + \"by the index number used in the last person listing. \"","lastModifiedDate":"2020-07-29"},{"lineNumber":70,"author":{"gitId":"-"},"content":" + \"Existing remark will be overwritten by the input.\\n\"","lastModifiedDate":"2020-07-29"},{"lineNumber":71,"author":{"gitId":"-"},"content":" + \"Parameters: INDEX (must be a positive integer) \"","lastModifiedDate":"2020-07-29"},{"lineNumber":72,"author":{"gitId":"-"},"content":" + \"r/ [REMARK]\\n\"","lastModifiedDate":"2020-07-29"},{"lineNumber":73,"author":{"gitId":"-"},"content":" + \"Example: \" + COMMAND_WORD + \" 1 \"","lastModifiedDate":"2020-07-29"},{"lineNumber":74,"author":{"gitId":"-"},"content":" + \"r/ Likes to swim.\";","lastModifiedDate":"2020-07-29"},{"lineNumber":75,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-07-29"},{"lineNumber":76,"author":{"gitId":"-"},"content":" public static final String MESSAGE_NOT_IMPLEMENTED_YET \u003d","lastModifiedDate":"2021-08-01"},{"lineNumber":77,"author":{"gitId":"-"},"content":" \"Remark command not implemented yet\";","lastModifiedDate":"2021-08-01"},{"lineNumber":78,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-07-29"},{"lineNumber":79,"author":{"gitId":"-"},"content":" @Override","lastModifiedDate":"2020-07-29"},{"lineNumber":80,"author":{"gitId":"-"},"content":" public CommandResult execute(Model model) throws CommandException {","lastModifiedDate":"2020-07-29"},{"lineNumber":81,"author":{"gitId":"-"},"content":" throw new CommandException(MESSAGE_NOT_IMPLEMENTED_YET);","lastModifiedDate":"2020-07-29"},{"lineNumber":82,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2020-07-29"},{"lineNumber":83,"author":{"gitId":"-"},"content":"```","lastModifiedDate":"2020-07-29"},{"lineNumber":84,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-07-29"},{"lineNumber":85,"author":{"gitId":"-"},"content":"## Enhancing `RemarkCommand`","lastModifiedDate":"2020-07-29"},{"lineNumber":86,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-07-29"},{"lineNumber":87,"author":{"gitId":"-"},"content":"Let’s change `RemarkCommand` to parse input from the user.","lastModifiedDate":"2020-07-29"},{"lineNumber":88,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-07-29"},{"lineNumber":89,"author":{"gitId":"-"},"content":"### Make the command accept parameters","lastModifiedDate":"2020-07-29"},{"lineNumber":90,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-07-29"},{"lineNumber":91,"author":{"gitId":"-"},"content":"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.","lastModifiedDate":"2020-07-29"},{"lineNumber":92,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-07-29"},{"lineNumber":93,"author":{"gitId":"-"},"content":"``` java","lastModifiedDate":"2020-07-29"},{"lineNumber":94,"author":{"gitId":"-"},"content":"import static seedu.address.commons.util.CollectionUtil.requireAllNonNull;","lastModifiedDate":"2020-07-29"},{"lineNumber":95,"author":{"gitId":"-"},"content":"//...","lastModifiedDate":"2020-07-29"},{"lineNumber":96,"author":{"gitId":"-"},"content":"public class RemarkCommand extends Command {","lastModifiedDate":"2020-07-29"},{"lineNumber":97,"author":{"gitId":"-"},"content":" //...","lastModifiedDate":"2020-07-29"},{"lineNumber":98,"author":{"gitId":"-"},"content":" public static final String MESSAGE_ARGUMENTS \u003d \"Index: %1$d, Remark: %2$s\";","lastModifiedDate":"2020-07-29"},{"lineNumber":99,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-07-29"},{"lineNumber":100,"author":{"gitId":"-"},"content":" private final Index index;","lastModifiedDate":"2020-07-29"},{"lineNumber":101,"author":{"gitId":"-"},"content":" private final String remark;","lastModifiedDate":"2020-07-29"},{"lineNumber":102,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-07-29"},{"lineNumber":103,"author":{"gitId":"-"},"content":" /**","lastModifiedDate":"2020-07-29"},{"lineNumber":104,"author":{"gitId":"-"},"content":" * @param index of the person in the filtered person list to edit the remark","lastModifiedDate":"2020-07-29"},{"lineNumber":105,"author":{"gitId":"-"},"content":" * @param remark of the person to be updated to","lastModifiedDate":"2020-07-29"},{"lineNumber":106,"author":{"gitId":"-"},"content":" */","lastModifiedDate":"2020-07-29"},{"lineNumber":107,"author":{"gitId":"-"},"content":" public RemarkCommand(Index index, String remark) {","lastModifiedDate":"2020-07-29"},{"lineNumber":108,"author":{"gitId":"-"},"content":" requireAllNonNull(index, remark);","lastModifiedDate":"2020-07-29"},{"lineNumber":109,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-07-29"},{"lineNumber":110,"author":{"gitId":"-"},"content":" this.index \u003d index;","lastModifiedDate":"2020-07-29"},{"lineNumber":111,"author":{"gitId":"-"},"content":" this.remark \u003d remark;","lastModifiedDate":"2020-07-29"},{"lineNumber":112,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2020-07-29"},{"lineNumber":113,"author":{"gitId":"-"},"content":" @Override","lastModifiedDate":"2020-07-29"},{"lineNumber":114,"author":{"gitId":"-"},"content":" public CommandResult execute(Model model) throws CommandException {","lastModifiedDate":"2020-07-29"},{"lineNumber":115,"author":{"gitId":"-"},"content":" throw new CommandException(","lastModifiedDate":"2021-08-01"},{"lineNumber":116,"author":{"gitId":"-"},"content":" String.format(MESSAGE_ARGUMENTS, index.getOneBased(), remark));","lastModifiedDate":"2021-08-01"},{"lineNumber":117,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2020-07-29"},{"lineNumber":118,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-07-29"},{"lineNumber":119,"author":{"gitId":"-"},"content":" @Override","lastModifiedDate":"2020-07-29"},{"lineNumber":120,"author":{"gitId":"-"},"content":" public boolean equals(Object other) {","lastModifiedDate":"2020-07-29"},{"lineNumber":121,"author":{"gitId":"-"},"content":" if (other \u003d\u003d this) {","lastModifiedDate":"2020-07-29"},{"lineNumber":122,"author":{"gitId":"-"},"content":" return true;","lastModifiedDate":"2020-07-29"},{"lineNumber":123,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2020-07-29"},{"lineNumber":124,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-07-29"},{"lineNumber":125,"author":{"gitId":"-"},"content":" // instanceof handles nulls","lastModifiedDate":"2020-07-29"},{"lineNumber":126,"author":{"gitId":"-"},"content":" if (!(other instanceof RemarkCommand)) {","lastModifiedDate":"2020-07-29"},{"lineNumber":127,"author":{"gitId":"-"},"content":" return false;","lastModifiedDate":"2020-07-29"},{"lineNumber":128,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2020-07-29"},{"lineNumber":129,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-07-29"},{"lineNumber":130,"author":{"gitId":"-"},"content":" RemarkCommand e \u003d (RemarkCommand) other;","lastModifiedDate":"2020-07-29"},{"lineNumber":131,"author":{"gitId":"-"},"content":" return index.equals(e.index)","lastModifiedDate":"2020-07-29"},{"lineNumber":132,"author":{"gitId":"-"},"content":" \u0026\u0026 remark.equals(e.remark);","lastModifiedDate":"2020-07-29"},{"lineNumber":133,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2020-07-29"},{"lineNumber":134,"author":{"gitId":"-"},"content":"}","lastModifiedDate":"2020-07-29"},{"lineNumber":135,"author":{"gitId":"-"},"content":"```","lastModifiedDate":"2020-07-29"},{"lineNumber":136,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-07-29"},{"lineNumber":137,"author":{"gitId":"-"},"content":"Your code should look something like [this](https://github.com/se-edu/addressbook-level3/commit/dc6d5139d08f6403da0ec624ea32bd79a2ae0cbf#diff-a8e35af8f9c251525063fae36c9852922a7e7195763018eacec60f3a4d87c594) after you are done.","lastModifiedDate":"2022-01-02"},{"lineNumber":138,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-07-29"},{"lineNumber":139,"author":{"gitId":"-"},"content":"### Parse user input","lastModifiedDate":"2020-07-29"},{"lineNumber":140,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-07-29"},{"lineNumber":141,"author":{"gitId":"-"},"content":"Now let’s move on to writing a parser that will extract the index and remark from the input provided by the user.","lastModifiedDate":"2020-07-29"},{"lineNumber":142,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-07-29"},{"lineNumber":143,"author":{"gitId":"-"},"content":"Create a `RemarkCommandParser` class in the `seedu.address.logic.parser` package. The class must extend the `Parser` interface.","lastModifiedDate":"2020-07-29"},{"lineNumber":144,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-07-29"},{"lineNumber":145,"author":{"gitId":"jieqiboh"},"content":"![The relationship between Parser and RemarkCommandParser](../images/add-remark/RemarkCommandParserClass.png)","lastModifiedDate":"2024-03-02"},{"lineNumber":146,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-07-29"},{"lineNumber":147,"author":{"gitId":"-"},"content":"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.","lastModifiedDate":"2020-07-29"},{"lineNumber":148,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-07-29"},{"lineNumber":149,"author":{"gitId":"-"},"content":"**`ArgumentTokenizer.java`:**","lastModifiedDate":"2020-07-29"},{"lineNumber":150,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-07-29"},{"lineNumber":151,"author":{"gitId":"-"},"content":"``` java","lastModifiedDate":"2020-07-29"},{"lineNumber":152,"author":{"gitId":"-"},"content":"/**","lastModifiedDate":"2020-07-29"},{"lineNumber":153,"author":{"gitId":"-"},"content":" * Tokenizes an arguments string and returns an {@code ArgumentMultimap}","lastModifiedDate":"2020-07-29"},{"lineNumber":154,"author":{"gitId":"-"},"content":" * object that maps prefixes to their respective argument values. Only the","lastModifiedDate":"2020-07-29"},{"lineNumber":155,"author":{"gitId":"-"},"content":" * given prefixes will be recognized in the arguments string.","lastModifiedDate":"2020-07-29"},{"lineNumber":156,"author":{"gitId":"-"},"content":" *","lastModifiedDate":"2020-07-29"},{"lineNumber":157,"author":{"gitId":"-"},"content":" * @param argsString Arguments string of the form:","lastModifiedDate":"2020-07-29"},{"lineNumber":158,"author":{"gitId":"-"},"content":" * {@code preamble \u003cprefix\u003evalue \u003cprefix\u003evalue ...}","lastModifiedDate":"2020-07-29"},{"lineNumber":159,"author":{"gitId":"-"},"content":" * @param prefixes Prefixes to tokenize the arguments string with","lastModifiedDate":"2020-07-29"},{"lineNumber":160,"author":{"gitId":"-"},"content":" * @return ArgumentMultimap object that maps prefixes to their","lastModifiedDate":"2020-07-29"},{"lineNumber":161,"author":{"gitId":"-"},"content":" * arguments","lastModifiedDate":"2020-07-29"},{"lineNumber":162,"author":{"gitId":"-"},"content":" */","lastModifiedDate":"2020-07-29"},{"lineNumber":163,"author":{"gitId":"-"},"content":"```","lastModifiedDate":"2020-07-29"},{"lineNumber":164,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-07-29"},{"lineNumber":165,"author":{"gitId":"-"},"content":"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` :","lastModifiedDate":"2020-07-29"},{"lineNumber":166,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-07-29"},{"lineNumber":167,"author":{"gitId":"-"},"content":"**`ArgumentMultimap.java`:**","lastModifiedDate":"2020-07-29"},{"lineNumber":168,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-07-29"},{"lineNumber":169,"author":{"gitId":"-"},"content":"``` java","lastModifiedDate":"2020-07-29"},{"lineNumber":170,"author":{"gitId":"-"},"content":"/**","lastModifiedDate":"2020-07-29"},{"lineNumber":171,"author":{"gitId":"-"},"content":" * Returns the last value of {@code prefix}.","lastModifiedDate":"2020-07-29"},{"lineNumber":172,"author":{"gitId":"-"},"content":" */","lastModifiedDate":"2020-07-29"},{"lineNumber":173,"author":{"gitId":"-"},"content":"public Optional\u003cString\u003e getValue(Prefix prefix) {","lastModifiedDate":"2020-07-29"},{"lineNumber":174,"author":{"gitId":"-"},"content":" List\u003cString\u003e values \u003d getAllValues(prefix);","lastModifiedDate":"2020-07-29"},{"lineNumber":175,"author":{"gitId":"-"},"content":" return values.isEmpty() ? Optional.empty() :","lastModifiedDate":"2020-07-29"},{"lineNumber":176,"author":{"gitId":"-"},"content":" Optional.of(values.get(values.size() - 1));","lastModifiedDate":"2020-07-29"},{"lineNumber":177,"author":{"gitId":"-"},"content":"}","lastModifiedDate":"2020-07-29"},{"lineNumber":178,"author":{"gitId":"-"},"content":"```","lastModifiedDate":"2020-07-29"},{"lineNumber":179,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-07-29"},{"lineNumber":180,"author":{"gitId":"-"},"content":"This appears to be what we need to get a String of the remark. But what about the Index? Let\u0027s take a quick peek at existing `Command` that uses an index to see how it is done.","lastModifiedDate":"2020-07-29"},{"lineNumber":181,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-07-29"},{"lineNumber":182,"author":{"gitId":"-"},"content":"**`DeleteCommandParser.java`:**","lastModifiedDate":"2020-07-29"},{"lineNumber":183,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-07-29"},{"lineNumber":184,"author":{"gitId":"-"},"content":"``` java","lastModifiedDate":"2020-07-29"},{"lineNumber":185,"author":{"gitId":"-"},"content":"Index index \u003d ParserUtil.parseIndex(args);","lastModifiedDate":"2020-07-29"},{"lineNumber":186,"author":{"gitId":"-"},"content":"return new DeleteCommand(index);","lastModifiedDate":"2020-07-29"},{"lineNumber":187,"author":{"gitId":"-"},"content":"```","lastModifiedDate":"2020-07-29"},{"lineNumber":188,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-07-29"},{"lineNumber":189,"author":{"gitId":"-"},"content":"There appears to be another utility class that obtains an `Index` from the input provided by the user.","lastModifiedDate":"2020-07-29"},{"lineNumber":190,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-07-29"},{"lineNumber":191,"author":{"gitId":"-"},"content":"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.","lastModifiedDate":"2020-07-29"},{"lineNumber":192,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-07-29"},{"lineNumber":193,"author":{"gitId":"-"},"content":"**`RemarkCommandParser.java`:**","lastModifiedDate":"2020-07-29"},{"lineNumber":194,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-07-29"},{"lineNumber":195,"author":{"gitId":"-"},"content":"``` java","lastModifiedDate":"2020-07-29"},{"lineNumber":196,"author":{"gitId":"-"},"content":"public RemarkCommand parse(String args) throws ParseException {","lastModifiedDate":"2020-07-29"},{"lineNumber":197,"author":{"gitId":"-"},"content":" requireNonNull(args);","lastModifiedDate":"2020-07-29"},{"lineNumber":198,"author":{"gitId":"-"},"content":" ArgumentMultimap argMultimap \u003d ArgumentTokenizer.tokenize(args,","lastModifiedDate":"2020-07-29"},{"lineNumber":199,"author":{"gitId":"-"},"content":" PREFIX_REMARK);","lastModifiedDate":"2020-07-29"},{"lineNumber":200,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-07-29"},{"lineNumber":201,"author":{"gitId":"-"},"content":" Index index;","lastModifiedDate":"2020-07-29"},{"lineNumber":202,"author":{"gitId":"-"},"content":" try {","lastModifiedDate":"2020-07-29"},{"lineNumber":203,"author":{"gitId":"-"},"content":" index \u003d ParserUtil.parseIndex(argMultimap.getPreamble());","lastModifiedDate":"2020-07-29"},{"lineNumber":204,"author":{"gitId":"-"},"content":" } catch (IllegalValueException ive) {","lastModifiedDate":"2020-07-29"},{"lineNumber":205,"author":{"gitId":"-"},"content":" throw new ParseException(String.format(MESSAGE_INVALID_COMMAND_FORMAT,","lastModifiedDate":"2020-07-29"},{"lineNumber":206,"author":{"gitId":"-"},"content":" RemarkCommand.MESSAGE_USAGE), ive);","lastModifiedDate":"2020-07-29"},{"lineNumber":207,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2020-07-29"},{"lineNumber":208,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-07-29"},{"lineNumber":209,"author":{"gitId":"-"},"content":" String remark \u003d argMultimap.getValue(PREFIX_REMARK).orElse(\"\");","lastModifiedDate":"2020-07-29"},{"lineNumber":210,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-07-29"},{"lineNumber":211,"author":{"gitId":"-"},"content":" return new RemarkCommand(index, remark);","lastModifiedDate":"2020-07-29"},{"lineNumber":212,"author":{"gitId":"-"},"content":"}","lastModifiedDate":"2020-07-29"},{"lineNumber":213,"author":{"gitId":"-"},"content":"```","lastModifiedDate":"2020-07-29"},{"lineNumber":214,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-07-29"},{"lineNumber":215,"author":{"gitId":"jieqiboh"},"content":"\u003cdiv markdown\u003d\"span\" class\u003d\"alert alert-primary\"\u003e","lastModifiedDate":"2024-03-02"},{"lineNumber":216,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-07-29"},{"lineNumber":217,"author":{"gitId":"jieqiboh"},"content":":information_source: Don’t forget to update `AddressBookParser` to use our new `RemarkCommandParser`!","lastModifiedDate":"2024-03-02"},{"lineNumber":218,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-07-29"},{"lineNumber":219,"author":{"gitId":"jieqiboh"},"content":"\u003c/div\u003e","lastModifiedDate":"2024-03-02"},{"lineNumber":220,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-07-29"},{"lineNumber":221,"author":{"gitId":"-"},"content":"If you are stuck, check out the sample","lastModifiedDate":"2020-07-29"},{"lineNumber":222,"author":{"gitId":"-"},"content":"[here](https://github.com/se-edu/addressbook-level3/commit/dc6d5139d08f6403da0ec624ea32bd79a2ae0cbf#diff-8bf239e8e9529369b577701303ddd96af93178b4ed6735f91c2d8488b20c6b4a).","lastModifiedDate":"2022-01-02"},{"lineNumber":223,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-07-29"},{"lineNumber":224,"author":{"gitId":"-"},"content":"## Add `Remark` to the model","lastModifiedDate":"2020-07-29"},{"lineNumber":225,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-07-29"},{"lineNumber":226,"author":{"gitId":"-"},"content":"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.","lastModifiedDate":"2020-07-29"},{"lineNumber":227,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-07-29"},{"lineNumber":228,"author":{"gitId":"-"},"content":"### Add a new `Remark` class","lastModifiedDate":"2020-07-29"},{"lineNumber":229,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-07-29"},{"lineNumber":230,"author":{"gitId":"-"},"content":"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.","lastModifiedDate":"2020-07-29"},{"lineNumber":231,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-07-29"},{"lineNumber":232,"author":{"gitId":"-"},"content":"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","lastModifiedDate":"2022-01-02"},{"lineNumber":233,"author":{"gitId":"-"},"content":"validation.","lastModifiedDate":"2020-07-29"},{"lineNumber":234,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-07-29"},{"lineNumber":235,"author":{"gitId":"-"},"content":"### Make use of `Remark`","lastModifiedDate":"2020-07-29"},{"lineNumber":236,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-07-29"},{"lineNumber":237,"author":{"gitId":"-"},"content":"Let’s change `RemarkCommand` and `RemarkCommandParser` to use the new `Remark` class instead of plain `String`. These should be relatively simple changes.","lastModifiedDate":"2020-07-29"},{"lineNumber":238,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-07-29"},{"lineNumber":239,"author":{"gitId":"-"},"content":"## Add a placeholder element for remark to the UI","lastModifiedDate":"2020-07-29"},{"lineNumber":240,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-07-29"},{"lineNumber":241,"author":{"gitId":"-"},"content":"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.","lastModifiedDate":"2020-07-29"},{"lineNumber":242,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-07-29"},{"lineNumber":243,"author":{"gitId":"-"},"content":"Simply add the following to [`seedu.address.ui.PersonCard`](https://github.com/se-edu/addressbook-level3/commit/850b78879582f38accb05dd20c245963c65ea599#diff-639834f1e05afe2276a86372adf0fe5f69314642c2d93cfa543d614ce5a76688).","lastModifiedDate":"2022-01-02"},{"lineNumber":244,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-07-29"},{"lineNumber":245,"author":{"gitId":"-"},"content":"**`PersonCard.java`:**","lastModifiedDate":"2020-07-29"},{"lineNumber":246,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-07-29"},{"lineNumber":247,"author":{"gitId":"-"},"content":"``` java","lastModifiedDate":"2020-07-29"},{"lineNumber":248,"author":{"gitId":"-"},"content":"@FXML","lastModifiedDate":"2020-07-29"},{"lineNumber":249,"author":{"gitId":"-"},"content":"private Label remark;","lastModifiedDate":"2020-07-29"},{"lineNumber":250,"author":{"gitId":"-"},"content":"```","lastModifiedDate":"2020-07-29"},{"lineNumber":251,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-07-29"},{"lineNumber":252,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-07-29"},{"lineNumber":253,"author":{"gitId":"-"},"content":"`@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.","lastModifiedDate":"2020-07-29"},{"lineNumber":254,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-07-29"},{"lineNumber":255,"author":{"gitId":"-"},"content":"Then insert the following into [`main/resources/view/PersonListCard.fxml`](https://github.com/se-edu/addressbook-level3/commit/850b78879582f38accb05dd20c245963c65ea599#diff-d44c4f51c24f6253c277a2bb9bc440b8064d9c15ad7cb7ceda280bca032efce9).","lastModifiedDate":"2022-01-02"},{"lineNumber":256,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-07-29"},{"lineNumber":257,"author":{"gitId":"-"},"content":"**`PersonListCard.fxml`:**","lastModifiedDate":"2020-07-29"},{"lineNumber":258,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-07-29"},{"lineNumber":259,"author":{"gitId":"-"},"content":"``` xml","lastModifiedDate":"2020-07-29"},{"lineNumber":260,"author":{"gitId":"-"},"content":"\u003cLabel fx:id\u003d\"remark\" styleClass\u003d\"cell_small_label\" text\u003d\"\\$remark\" /\u003e","lastModifiedDate":"2020-07-29"},{"lineNumber":261,"author":{"gitId":"-"},"content":"```","lastModifiedDate":"2020-07-29"},{"lineNumber":262,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-07-29"},{"lineNumber":263,"author":{"gitId":"-"},"content":"That’s it! Fire up the application again and you should see something like this:","lastModifiedDate":"2020-07-29"},{"lineNumber":264,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-07-29"},{"lineNumber":265,"author":{"gitId":"-"},"content":"![$remark shows up in each entry](../images/add-remark/$Remark.png)","lastModifiedDate":"2020-07-29"},{"lineNumber":266,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-07-29"},{"lineNumber":267,"author":{"gitId":"-"},"content":"## Modify `Person` to support a `Remark` field","lastModifiedDate":"2020-07-29"},{"lineNumber":268,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-07-29"},{"lineNumber":269,"author":{"gitId":"-"},"content":"Since `PersonCard` displays data from a `Person`, we need to update `Person` to get our `Remark` displayed!","lastModifiedDate":"2020-07-29"},{"lineNumber":270,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-07-29"},{"lineNumber":271,"author":{"gitId":"-"},"content":"### Modify `Person`","lastModifiedDate":"2020-07-29"},{"lineNumber":272,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-07-29"},{"lineNumber":273,"author":{"gitId":"-"},"content":"We change the constructor of `Person` to take a `Remark`. We will also need to define new fields and accessors accordingly to store our new addition.","lastModifiedDate":"2020-07-29"},{"lineNumber":274,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-07-29"},{"lineNumber":275,"author":{"gitId":"-"},"content":"### Update other usages of `Person`","lastModifiedDate":"2020-07-29"},{"lineNumber":276,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-07-29"},{"lineNumber":277,"author":{"gitId":"-"},"content":"Unfortunately, a change to `Person` will cause other commands to break, you will have to modify these commands to use the updated `Person`!","lastModifiedDate":"2020-07-29"},{"lineNumber":278,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-07-29"},{"lineNumber":279,"author":{"gitId":"jieqiboh"},"content":"\u003cdiv markdown\u003d\"span\" class\u003d\"alert alert-primary\"\u003e","lastModifiedDate":"2024-03-02"},{"lineNumber":280,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-07-29"},{"lineNumber":281,"author":{"gitId":"jieqiboh"},"content":":bulb: Use the `Find Usages` feature in IntelliJ IDEA on the `Person` class to find these commands.","lastModifiedDate":"2024-03-02"},{"lineNumber":282,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-07-29"},{"lineNumber":283,"author":{"gitId":"jieqiboh"},"content":"\u003c/div\u003e","lastModifiedDate":"2024-03-02"},{"lineNumber":284,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-07-29"},{"lineNumber":285,"author":{"gitId":"-"},"content":"Refer to [this commit](https://github.com/se-edu/addressbook-level3/commit/ce998c37e65b92d35c91d28c7822cd139c2c0a5c) and check that you have got everything in order!","lastModifiedDate":"2020-07-29"},{"lineNumber":286,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-07-29"},{"lineNumber":287,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-07-29"},{"lineNumber":288,"author":{"gitId":"-"},"content":"## Updating Storage","lastModifiedDate":"2020-07-29"},{"lineNumber":289,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-07-29"},{"lineNumber":290,"author":{"gitId":"-"},"content":"AddressBook stores data by serializing `JsonAdaptedPerson` into `json` with the help of an external library — Jackson. Let’s update `JsonAdaptedPerson` to work with our new `Person`!","lastModifiedDate":"2020-07-29"},{"lineNumber":291,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-07-29"},{"lineNumber":292,"author":{"gitId":"-"},"content":"While the changes to code may be minimal, the test data will have to be updated as well.","lastModifiedDate":"2020-07-29"},{"lineNumber":293,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-07-29"},{"lineNumber":294,"author":{"gitId":"jieqiboh"},"content":"\u003cdiv markdown\u003d\"span\" class\u003d\"alert alert-warning\"\u003e","lastModifiedDate":"2024-03-02"},{"lineNumber":295,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-07-29"},{"lineNumber":296,"author":{"gitId":"jieqiboh"},"content":":exclamation: You must delete AddressBook’s storage file located at `/data/addressbook.json` before running it! Not doing so will cause AddressBook to default to an empty address book!","lastModifiedDate":"2024-03-02"},{"lineNumber":297,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-07-29"},{"lineNumber":298,"author":{"gitId":"jieqiboh"},"content":"\u003c/div\u003e","lastModifiedDate":"2024-03-02"},{"lineNumber":299,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-07-29"},{"lineNumber":300,"author":{"gitId":"-"},"content":"Check out [this commit](https://github.com/se-edu/addressbook-level3/commit/556cbd0e03ff224d7a68afba171ad2eb0ce56bbf)","lastModifiedDate":"2020-07-29"},{"lineNumber":301,"author":{"gitId":"-"},"content":"to see what the changes entail.","lastModifiedDate":"2020-07-29"},{"lineNumber":302,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-07-29"},{"lineNumber":303,"author":{"gitId":"-"},"content":"## Finalizing the UI","lastModifiedDate":"2020-07-29"},{"lineNumber":304,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-07-29"},{"lineNumber":305,"author":{"gitId":"-"},"content":"Now that we have finalized the `Person` class and its dependencies, we can now bind the `Remark` field to the UI.","lastModifiedDate":"2020-07-29"},{"lineNumber":306,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-07-29"},{"lineNumber":307,"author":{"gitId":"-"},"content":"Just add [this one line of code!](https://github.com/se-edu/addressbook-level3/commit/5b98fee11b6b3f5749b6b943c4f3bd3aa049b692)","lastModifiedDate":"2020-07-29"},{"lineNumber":308,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-07-29"},{"lineNumber":309,"author":{"gitId":"-"},"content":"**`PersonCard.java`:**","lastModifiedDate":"2020-07-29"},{"lineNumber":310,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-07-29"},{"lineNumber":311,"author":{"gitId":"-"},"content":"``` java","lastModifiedDate":"2020-07-29"},{"lineNumber":312,"author":{"gitId":"-"},"content":"public PersonCard(Person person, int displayedIndex) {","lastModifiedDate":"2020-07-29"},{"lineNumber":313,"author":{"gitId":"-"},"content":" //...","lastModifiedDate":"2020-07-29"},{"lineNumber":314,"author":{"gitId":"-"},"content":" remark.setText(person.getRemark().value);","lastModifiedDate":"2020-07-29"},{"lineNumber":315,"author":{"gitId":"-"},"content":"}","lastModifiedDate":"2020-07-29"},{"lineNumber":316,"author":{"gitId":"-"},"content":"```","lastModifiedDate":"2020-07-29"},{"lineNumber":317,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-07-29"},{"lineNumber":318,"author":{"gitId":"-"},"content":"![The remark label is bound properly!](../images/add-remark/RemarkBound.png)","lastModifiedDate":"2020-07-29"},{"lineNumber":319,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-07-29"},{"lineNumber":320,"author":{"gitId":"-"},"content":"## Putting everything together","lastModifiedDate":"2020-07-29"},{"lineNumber":321,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-07-29"},{"lineNumber":322,"author":{"gitId":"-"},"content":"After the previous step, we notice a peculiar regression — we went from displaying something to nothing at all. However, this is expected behavior as we are yet to update the `RemarkCommand` to make use of the code we\u0027ve been adding in the last few steps.","lastModifiedDate":"2020-07-29"},{"lineNumber":323,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-07-29"},{"lineNumber":324,"author":{"gitId":"-"},"content":"### Update `RemarkCommand` and `RemarkCommandParser`","lastModifiedDate":"2020-07-29"},{"lineNumber":325,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-07-29"},{"lineNumber":326,"author":{"gitId":"-"},"content":"In this last step, we modify `RemarkCommand#execute()` to change the `Remark` of a `Person`. Since all fields in a `Person` are immutable, we create a new instance of a `Person` with the values that we want and","lastModifiedDate":"2020-07-29"},{"lineNumber":327,"author":{"gitId":"-"},"content":"save it with `Model#setPerson()`.","lastModifiedDate":"2020-07-29"},{"lineNumber":328,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-07-29"},{"lineNumber":329,"author":{"gitId":"-"},"content":"**`RemarkCommand.java`:**","lastModifiedDate":"2020-07-29"},{"lineNumber":330,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-07-29"},{"lineNumber":331,"author":{"gitId":"-"},"content":"``` java","lastModifiedDate":"2020-07-29"},{"lineNumber":332,"author":{"gitId":"-"},"content":"//...","lastModifiedDate":"2020-07-29"},{"lineNumber":333,"author":{"gitId":"-"},"content":" public static final String MESSAGE_ADD_REMARK_SUCCESS \u003d \"Added remark to Person: %1$s\";","lastModifiedDate":"2020-07-29"},{"lineNumber":334,"author":{"gitId":"-"},"content":" public static final String MESSAGE_DELETE_REMARK_SUCCESS \u003d \"Removed remark from Person: %1$s\";","lastModifiedDate":"2020-07-29"},{"lineNumber":335,"author":{"gitId":"-"},"content":"//...","lastModifiedDate":"2020-07-29"},{"lineNumber":336,"author":{"gitId":"-"},"content":" @Override","lastModifiedDate":"2020-07-29"},{"lineNumber":337,"author":{"gitId":"-"},"content":" public CommandResult execute(Model model) throws CommandException {","lastModifiedDate":"2020-07-29"},{"lineNumber":338,"author":{"gitId":"-"},"content":" List\u003cPerson\u003e lastShownList \u003d model.getFilteredPersonList();","lastModifiedDate":"2020-07-29"},{"lineNumber":339,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-07-29"},{"lineNumber":340,"author":{"gitId":"-"},"content":" if (index.getZeroBased() \u003e\u003d lastShownList.size()) {","lastModifiedDate":"2020-07-29"},{"lineNumber":341,"author":{"gitId":"-"},"content":" throw new CommandException(Messages.MESSAGE_INVALID_PERSON_DISPLAYED_INDEX);","lastModifiedDate":"2020-07-29"},{"lineNumber":342,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2020-07-29"},{"lineNumber":343,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-07-29"},{"lineNumber":344,"author":{"gitId":"-"},"content":" Person personToEdit \u003d lastShownList.get(index.getZeroBased());","lastModifiedDate":"2020-07-29"},{"lineNumber":345,"author":{"gitId":"-"},"content":" Person editedPerson \u003d new Person(","lastModifiedDate":"2021-08-01"},{"lineNumber":346,"author":{"gitId":"-"},"content":" personToEdit.getName(), personToEdit.getPhone(), personToEdit.getEmail(),","lastModifiedDate":"2021-08-01"},{"lineNumber":347,"author":{"gitId":"-"},"content":" personToEdit.getAddress(), remark, personToEdit.getTags());","lastModifiedDate":"2020-07-29"},{"lineNumber":348,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-07-29"},{"lineNumber":349,"author":{"gitId":"-"},"content":" model.setPerson(personToEdit, editedPerson);","lastModifiedDate":"2020-07-29"},{"lineNumber":350,"author":{"gitId":"-"},"content":" model.updateFilteredPersonList(PREDICATE_SHOW_ALL_PERSONS);","lastModifiedDate":"2020-07-29"},{"lineNumber":351,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-07-29"},{"lineNumber":352,"author":{"gitId":"-"},"content":" return new CommandResult(generateSuccessMessage(editedPerson));","lastModifiedDate":"2020-07-29"},{"lineNumber":353,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2020-07-29"},{"lineNumber":354,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-07-29"},{"lineNumber":355,"author":{"gitId":"-"},"content":" /**","lastModifiedDate":"2020-07-29"},{"lineNumber":356,"author":{"gitId":"-"},"content":" * Generates a command execution success message based on whether","lastModifiedDate":"2021-08-01"},{"lineNumber":357,"author":{"gitId":"-"},"content":" * the remark is added to or removed from","lastModifiedDate":"2021-08-01"},{"lineNumber":358,"author":{"gitId":"-"},"content":" * {@code personToEdit}.","lastModifiedDate":"2020-07-29"},{"lineNumber":359,"author":{"gitId":"-"},"content":" */","lastModifiedDate":"2020-07-29"},{"lineNumber":360,"author":{"gitId":"-"},"content":" private String generateSuccessMessage(Person personToEdit) {","lastModifiedDate":"2020-07-29"},{"lineNumber":361,"author":{"gitId":"-"},"content":" String message \u003d !remark.value.isEmpty() ? MESSAGE_ADD_REMARK_SUCCESS : MESSAGE_DELETE_REMARK_SUCCESS;","lastModifiedDate":"2020-07-29"},{"lineNumber":362,"author":{"gitId":"-"},"content":" return String.format(message, personToEdit);","lastModifiedDate":"2020-07-29"},{"lineNumber":363,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2020-07-29"},{"lineNumber":364,"author":{"gitId":"-"},"content":"```","lastModifiedDate":"2020-07-29"},{"lineNumber":365,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-07-29"},{"lineNumber":366,"author":{"gitId":"-"},"content":"![Congratulations!](../images/add-remark/RemarkComplete.png)","lastModifiedDate":"2020-07-29"},{"lineNumber":367,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-07-29"},{"lineNumber":368,"author":{"gitId":"-"},"content":"## Writing tests","lastModifiedDate":"2020-07-29"},{"lineNumber":369,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-07-29"},{"lineNumber":370,"author":{"gitId":"-"},"content":"Tests are crucial to ensuring that bugs don’t slip into the codebase unnoticed. This is especially true for large code bases where a change might lead to unintended behavior.","lastModifiedDate":"2020-07-29"},{"lineNumber":371,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-07-29"},{"lineNumber":372,"author":{"gitId":"-"},"content":"Let’s verify the correctness of our code by writing some tests!","lastModifiedDate":"2020-07-29"},{"lineNumber":373,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-07-29"},{"lineNumber":374,"author":{"gitId":"-"},"content":"Of course you can simply add the test cases manually, like you\u0027ve been doing all along this tutorial. The result would be like the test cases in [here](https://github.com/se-edu/addressbook-level3/commit/fac8f3fd855d55831ca0cc73313b5943d49d4d6e#diff-ff58f7c10338b34f76645df49b71ecb2bafaf7611b20e7ff59ebc98475538a01). Alternatively, you can get the help of IntelliJ to generate the skeletons of the test cases, as explained in the next section.","lastModifiedDate":"2022-01-02"},{"lineNumber":375,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2021-08-01"},{"lineNumber":376,"author":{"gitId":"-"},"content":"### Automatically generating tests","lastModifiedDate":"2020-07-29"},{"lineNumber":377,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-07-29"},{"lineNumber":378,"author":{"gitId":"-"},"content":"The goal is to write effective and efficient tests to ensure that `RemarkCommand#execute()` behaves as expected.","lastModifiedDate":"2020-07-29"},{"lineNumber":379,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-07-29"},{"lineNumber":380,"author":{"gitId":"-"},"content":"The convention for test names is `methodName_testScenario_expectedResult`. An example would be","lastModifiedDate":"2020-07-29"},{"lineNumber":381,"author":{"gitId":"-"},"content":"`execute_filteredList_success`.","lastModifiedDate":"2020-07-29"},{"lineNumber":382,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-07-29"},{"lineNumber":383,"author":{"gitId":"-"},"content":"Let’s create a test for `RemarkCommand#execute()` to test that adding a remark works. On `IntelliJ IDEA` you can bring up the context menu and choose to `Go To` \\\u003e `Test` or use the appropriate keyboard shortcut.","lastModifiedDate":"2020-07-29"},{"lineNumber":384,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-07-29"},{"lineNumber":385,"author":{"gitId":"-"},"content":"![Using the context menu to jump to tests](../images/add-remark/ContextMenu.png)","lastModifiedDate":"2020-07-29"},{"lineNumber":386,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-07-29"},{"lineNumber":387,"author":{"gitId":"-"},"content":"Then, create a test for the `execute` method.","lastModifiedDate":"2020-07-29"},{"lineNumber":388,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-07-29"},{"lineNumber":389,"author":{"gitId":"-"},"content":"![Creating a test for `execute`.](../images/add-remark/CreateTest.png)","lastModifiedDate":"2020-07-29"},{"lineNumber":390,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-07-29"},{"lineNumber":391,"author":{"gitId":"-"},"content":"Following convention, let’s change the name of the generated method to `execute_addRemarkUnfilteredList_success`.","lastModifiedDate":"2020-07-29"},{"lineNumber":392,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-07-29"},{"lineNumber":393,"author":{"gitId":"-"},"content":"Let’s use the utility functions provided in `CommandTestUtil`. The functions ensure that commands produce the expected `CommandResult` and output the correct message. In this case, `CommandTestUtil#assertCommandSuccess` is the best fit as we are testing that a `RemarkCommand` will successfully add a `Remark`.","lastModifiedDate":"2020-07-29"},{"lineNumber":394,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-07-29"},{"lineNumber":395,"author":{"gitId":"-"},"content":"You should end up with a test that looks something like [this](https://github.com/se-edu/addressbook-level3/commit/fac8f3fd855d55831ca0cc73313b5943d49d4d6e#diff-ff58f7c10338b34f76645df49b71ecb2bafaf7611b20e7ff59ebc98475538a01R36-R49).","lastModifiedDate":"2022-01-02"},{"lineNumber":396,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-07-29"},{"lineNumber":397,"author":{"gitId":"-"},"content":"## Conclusion","lastModifiedDate":"2020-07-29"},{"lineNumber":398,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-07-29"},{"lineNumber":399,"author":{"gitId":"-"},"content":"This concludes the tutorial for adding a new `Command` to AddressBook.","lastModifiedDate":"2020-07-29"}],"authorContributionMap":{"jieqiboh":12,"-":387}},{"path":"docs/tutorials/RemovingFields.md","fileType":"docs","lines":[{"lineNumber":1,"author":{"gitId":"-"},"content":"---","lastModifiedDate":"2020-05-23"},{"lineNumber":2,"author":{"gitId":"jieqiboh"},"content":"layout: page","lastModifiedDate":"2024-03-02"},{"lineNumber":3,"author":{"gitId":"-"},"content":"title: \"Tutorial: Removing Fields\"","lastModifiedDate":"2020-05-23"},{"lineNumber":4,"author":{"gitId":"-"},"content":"---","lastModifiedDate":"2020-05-23"},{"lineNumber":5,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":6,"author":{"gitId":"-"},"content":"\u003e Perfection is achieved, not when there is nothing more to add, but when there is nothing left to take away.","lastModifiedDate":"2020-05-23"},{"lineNumber":7,"author":{"gitId":"-"},"content":"\u003e","lastModifiedDate":"2020-05-23"},{"lineNumber":8,"author":{"gitId":"-"},"content":"\u003e — Antoine de Saint-Exupery","lastModifiedDate":"2020-05-23"},{"lineNumber":9,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":10,"author":{"gitId":"-"},"content":"When working on an existing code base, you will most likely find that some features that are no longer necessary.","lastModifiedDate":"2021-08-01"},{"lineNumber":11,"author":{"gitId":"-"},"content":"This tutorial aims to give you some practice on such a code \u0027removal\u0027 activity by removing the `address` field from `Person` class.","lastModifiedDate":"2021-08-01"},{"lineNumber":12,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2021-08-01"},{"lineNumber":13,"author":{"gitId":"jieqiboh"},"content":"\u003cdiv markdown\u003d\"span\" class\u003d\"alert alert-success\"\u003e","lastModifiedDate":"2024-03-02"},{"lineNumber":14,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2021-08-01"},{"lineNumber":15,"author":{"gitId":"-"},"content":"**If you have done the [Add `remark` command tutorial](AddRemark.html) already**, you should know where the code had to be updated to add the field `remark`. From that experience, you can deduce where the code needs to be changed to _remove_ that field too. The removing of the `address` field can be done similarly.","lastModifiedDate":"2021-08-01"},{"lineNumber":16,"author":{"gitId":"-"},"content":"\u003cbr\u003e","lastModifiedDate":"2021-08-01"},{"lineNumber":17,"author":{"gitId":"-"},"content":"\u003cbr\u003e","lastModifiedDate":"2021-08-01"},{"lineNumber":18,"author":{"gitId":"-"},"content":"However, if you have no such prior knowledge, removing a field can take a quite a bit of detective work. This tutorial takes you through that process. **At least have a read even if you don\u0027t actually do the steps yourself.**","lastModifiedDate":"2021-08-01"},{"lineNumber":19,"author":{"gitId":"jieqiboh"},"content":"\u003c/div\u003e","lastModifiedDate":"2024-03-02"},{"lineNumber":20,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":21,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":22,"author":{"gitId":"jieqiboh"},"content":"* Table of Contents","lastModifiedDate":"2024-03-02"},{"lineNumber":23,"author":{"gitId":"jieqiboh"},"content":"{:toc}","lastModifiedDate":"2024-03-02"},{"lineNumber":24,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":25,"author":{"gitId":"-"},"content":"## Safely deleting `Address`","lastModifiedDate":"2020-05-23"},{"lineNumber":26,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":27,"author":{"gitId":"-"},"content":"IntelliJ IDEA provides a refactoring tool that can identify *most* parts of a removal easily. Let’s try to use it as much as we can.","lastModifiedDate":"2021-08-01"},{"lineNumber":28,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":29,"author":{"gitId":"-"},"content":"### Assisted refactoring","lastModifiedDate":"2020-05-23"},{"lineNumber":30,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":31,"author":{"gitId":"-"},"content":"The `address` field in `Person` is actually an instance of the `seedu.address.model.person.Address` class. Since removing the `Address` class will break the application, we start by identifying `Address`\u0027s usages. This allows us to see code that depends on `Address` to function properly and edit them on a case-by-case basis. Right-click the `Address` class and select `Refactor` \\\u003e `Safe Delete` through the menu.","lastModifiedDate":"2020-05-23"},{"lineNumber":32,"author":{"gitId":"-"},"content":"* :bulb: To make things simpler, you can unselect the options `Search in comments and strings` and `Search for text occurrences`","lastModifiedDate":"2021-08-01"},{"lineNumber":33,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":34,"author":{"gitId":"-"},"content":"![Usages detected](../images/remove/UnsafeDelete.png)","lastModifiedDate":"2020-05-23"},{"lineNumber":35,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":36,"author":{"gitId":"-"},"content":"Choose to `View Usages` and you should be presented with a list of `Safe Delete Conflicts`. These conflicts describe locations in which the `Address` class is used.","lastModifiedDate":"2020-05-23"},{"lineNumber":37,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":38,"author":{"gitId":"-"},"content":"![List of conflicts](../images/remove/SafeDeleteConflicts.png)","lastModifiedDate":"2020-05-23"},{"lineNumber":39,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":40,"author":{"gitId":"-"},"content":"Remove usages of `Address` by performing `Safe Delete`s on each entry i.e., double-click on the entry (which takes you to the code in concern, right-click on that entity, and choose `Refactor` -\u003e `Safe delete` as before). You will need to exercise discretion when removing usages of `Address`. Functions like `ParserUtil#parseAddress()` can be safely removed but its usages must be removed as well. Other usages like in `EditPersonDescriptor` may require more careful inspection.","lastModifiedDate":"2021-08-01"},{"lineNumber":41,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":42,"author":{"gitId":"-"},"content":"Let’s try removing references to `Address` in `EditPersonDescriptor`.","lastModifiedDate":"2020-05-23"},{"lineNumber":43,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":44,"author":{"gitId":"-"},"content":"1. Safe delete the field `address` in `EditPersonDescriptor`.","lastModifiedDate":"2020-05-23"},{"lineNumber":45,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":46,"author":{"gitId":"-"},"content":"1. Select `Yes` when prompted to remove getters and setters.","lastModifiedDate":"2020-05-23"},{"lineNumber":47,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":48,"author":{"gitId":"-"},"content":"1. Select `View Usages` again.\u003cbr\u003e","lastModifiedDate":"2020-05-23"},{"lineNumber":49,"author":{"gitId":"-"},"content":" ![UnsafeDeleteOnField](../images/remove/UnsafeDeleteOnField.png)","lastModifiedDate":"2020-05-23"},{"lineNumber":50,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":51,"author":{"gitId":"-"},"content":"1. Remove the usages of `address` and select `Do refactor` when you are done.","lastModifiedDate":"2020-05-23"},{"lineNumber":52,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":53,"author":{"gitId":"jieqiboh"},"content":" \u003cdiv markdown\u003d\"span\" class\u003d\"alert alert-primary\"\u003e","lastModifiedDate":"2024-03-02"},{"lineNumber":54,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":55,"author":{"gitId":"jieqiboh"},"content":" :bulb: **Tip:** Removing usages may result in errors. Exercise discretion and fix them. For example, removing the `address` field from the `Person` class will require you to modify its constructor.","lastModifiedDate":"2024-03-02"},{"lineNumber":56,"author":{"gitId":"jieqiboh"},"content":" \u003c/div\u003e","lastModifiedDate":"2024-03-02"},{"lineNumber":57,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":58,"author":{"gitId":"-"},"content":"1. Repeat the steps for the remaining usages of `Address`","lastModifiedDate":"2020-05-23"},{"lineNumber":59,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":60,"author":{"gitId":"-"},"content":"After you are done, verify that the application still works by compiling and running it again.","lastModifiedDate":"2020-05-23"},{"lineNumber":61,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":62,"author":{"gitId":"-"},"content":"### Manual refactoring","lastModifiedDate":"2020-05-23"},{"lineNumber":63,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":64,"author":{"gitId":"-"},"content":"Unfortunately, there are usages of `Address` that IntelliJ IDEA cannot identify. You can find them by searching for instances of the word `address` in your code (`Edit` \\\u003e `Find` \\\u003e `Find in path`).","lastModifiedDate":"2020-05-23"},{"lineNumber":65,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":66,"author":{"gitId":"-"},"content":"Places of interest to look out for would be resources used by the application. `main/resources` contains images and `fxml` files used by the application and `test/resources` contains test data. For example, there is a `$address` in each `PersonCard` that has not been removed nor identified.","lastModifiedDate":"2020-05-23"},{"lineNumber":67,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":68,"author":{"gitId":"-"},"content":"![$address](../images/remove/$address.png)","lastModifiedDate":"2020-05-23"},{"lineNumber":69,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":70,"author":{"gitId":"-"},"content":"A quick look at the `PersonCard` class and its `fxml` file quickly reveals why it slipped past the automated refactoring.","lastModifiedDate":"2020-05-23"},{"lineNumber":71,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":72,"author":{"gitId":"-"},"content":"**`PersonCard.java`**","lastModifiedDate":"2020-05-23"},{"lineNumber":73,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":74,"author":{"gitId":"-"},"content":"``` java","lastModifiedDate":"2020-05-23"},{"lineNumber":75,"author":{"gitId":"-"},"content":"...","lastModifiedDate":"2020-05-23"},{"lineNumber":76,"author":{"gitId":"-"},"content":"@FXML","lastModifiedDate":"2020-05-23"},{"lineNumber":77,"author":{"gitId":"-"},"content":"private Label address;","lastModifiedDate":"2020-05-23"},{"lineNumber":78,"author":{"gitId":"-"},"content":"...","lastModifiedDate":"2020-05-23"},{"lineNumber":79,"author":{"gitId":"-"},"content":"```","lastModifiedDate":"2020-05-23"},{"lineNumber":80,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":81,"author":{"gitId":"-"},"content":"**`PersonCard.fxml`**","lastModifiedDate":"2020-05-23"},{"lineNumber":82,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":83,"author":{"gitId":"-"},"content":"``` xml","lastModifiedDate":"2020-05-23"},{"lineNumber":84,"author":{"gitId":"-"},"content":"...","lastModifiedDate":"2020-05-23"},{"lineNumber":85,"author":{"gitId":"-"},"content":"\u003cLabel fx:id\u003d\"phone\" styleClass\u003d\"cell_small_label\" text\u003d\"\\$phone\" /\u003e","lastModifiedDate":"2020-05-23"},{"lineNumber":86,"author":{"gitId":"-"},"content":"\u003cLabel fx:id\u003d\"address\" styleClass\u003d\"cell_small_label\" text\u003d\"\\$address\" /\u003e","lastModifiedDate":"2020-05-23"},{"lineNumber":87,"author":{"gitId":"-"},"content":"\u003cLabel fx:id\u003d\"email\" styleClass\u003d\"cell_small_label\" text\u003d\"\\$email\" /\u003e","lastModifiedDate":"2020-05-23"},{"lineNumber":88,"author":{"gitId":"-"},"content":"...","lastModifiedDate":"2020-05-23"},{"lineNumber":89,"author":{"gitId":"-"},"content":"```","lastModifiedDate":"2020-05-23"},{"lineNumber":90,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":91,"author":{"gitId":"-"},"content":"After removing the `Label`, we can proceed to formally test our code. If everything went well, you should have most of your tests pass. Fix any remaining errors until the tests all pass.","lastModifiedDate":"2020-05-23"},{"lineNumber":92,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":93,"author":{"gitId":"-"},"content":"## Tidying up","lastModifiedDate":"2020-05-23"},{"lineNumber":94,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":95,"author":{"gitId":"-"},"content":"At this point, your application is working as intended and all your tests are passing. What’s left to do is to clean up references to `Address` in test data and documentation.","lastModifiedDate":"2020-05-23"},{"lineNumber":96,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":97,"author":{"gitId":"-"},"content":"In `src/test/data/`, data meant for testing purposes are stored. While keeping the `address` field in the json files does not cause the tests to fail, it is not good practice to let cruft from old features accumulate.","lastModifiedDate":"2020-05-23"},{"lineNumber":98,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":99,"author":{"gitId":"-"},"content":"**`invalidPersonAddressBook.json`:**","lastModifiedDate":"2020-05-23"},{"lineNumber":100,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":101,"author":{"gitId":"-"},"content":"```json","lastModifiedDate":"2020-05-23"},{"lineNumber":102,"author":{"gitId":"-"},"content":"{","lastModifiedDate":"2020-05-23"},{"lineNumber":103,"author":{"gitId":"-"},"content":" \"persons\": [ {","lastModifiedDate":"2020-05-23"},{"lineNumber":104,"author":{"gitId":"-"},"content":" \"name\": \"Person with invalid name field: Ha!ns Mu@ster\",","lastModifiedDate":"2020-05-23"},{"lineNumber":105,"author":{"gitId":"-"},"content":" \"phone\": \"9482424\",","lastModifiedDate":"2020-05-23"},{"lineNumber":106,"author":{"gitId":"-"},"content":" \"email\": \"hans@example.com\",","lastModifiedDate":"2020-05-23"},{"lineNumber":107,"author":{"gitId":"-"},"content":" \"address\": \"4th street\"","lastModifiedDate":"2020-05-23"},{"lineNumber":108,"author":{"gitId":"-"},"content":" } ]","lastModifiedDate":"2020-05-23"},{"lineNumber":109,"author":{"gitId":"-"},"content":"}","lastModifiedDate":"2020-05-23"},{"lineNumber":110,"author":{"gitId":"-"},"content":"```","lastModifiedDate":"2020-05-23"},{"lineNumber":111,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":112,"author":{"gitId":"-"},"content":"You can go through each individual `json` file and manually remove the `address` field.","lastModifiedDate":"2020-05-23"}],"authorContributionMap":{"jieqiboh":8,"-":104}},{"path":"docs/tutorials/TracingCode.md","fileType":"docs","lines":[{"lineNumber":1,"author":{"gitId":"-"},"content":"---","lastModifiedDate":"2020-05-23"},{"lineNumber":2,"author":{"gitId":"jieqiboh"},"content":"layout: page","lastModifiedDate":"2024-03-02"},{"lineNumber":3,"author":{"gitId":"-"},"content":"title: \"Tutorial: Tracing code\"","lastModifiedDate":"2020-05-23"},{"lineNumber":4,"author":{"gitId":"-"},"content":"---","lastModifiedDate":"2020-05-23"},{"lineNumber":5,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":6,"author":{"gitId":"-"},"content":"\u003e Indeed, the ratio of time spent reading versus writing is well over 10 to 1. We are constantly reading old code as part of the effort to write new code. …​\\[Therefore,\\] making it easy to read makes it easier to write.","lastModifiedDate":"2020-05-23"},{"lineNumber":7,"author":{"gitId":"-"},"content":"\u003e","lastModifiedDate":"2020-05-23"},{"lineNumber":8,"author":{"gitId":"-"},"content":"\u003e — Robert C. Martin Clean Code: A Handbook of Agile Software Craftsmanship","lastModifiedDate":"2020-05-23"},{"lineNumber":9,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":10,"author":{"gitId":"-"},"content":"When trying to understand an unfamiliar code base, one common strategy used is to trace some representative execution path through the code base. One easy way to trace an execution path is to use a debugger to step through the code. In this tutorial, you will be using the IntelliJ IDEA’s debugger to trace the execution path of a specific user command.","lastModifiedDate":"2020-05-23"},{"lineNumber":11,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":12,"author":{"gitId":"jieqiboh"},"content":"* Table of Contents","lastModifiedDate":"2024-03-02"},{"lineNumber":13,"author":{"gitId":"jieqiboh"},"content":"{:toc}","lastModifiedDate":"2024-03-02"},{"lineNumber":14,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":15,"author":{"gitId":"-"},"content":"## Before we start","lastModifiedDate":"2020-05-23"},{"lineNumber":16,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":17,"author":{"gitId":"-"},"content":"Before we jump into the code, it is useful to get an idea of the overall structure and the high-level behavior of the application. This is provided in the \u0027Architecture\u0027 section of the developer guide. In particular, the architecture diagram (reproduced below), tells us that the App consists of several components.","lastModifiedDate":"2020-05-23"},{"lineNumber":18,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":19,"author":{"gitId":"jieqiboh"},"content":"![ArchitectureDiagram](../images/ArchitectureDiagram.png)","lastModifiedDate":"2024-03-02"},{"lineNumber":20,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":21,"author":{"gitId":"-"},"content":"It also has a sequence diagram (reproduced below) that tells us how a command propagates through the App.","lastModifiedDate":"2020-05-23"},{"lineNumber":22,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":23,"author":{"gitId":"jieqiboh"},"content":"\u003cimg src\u003d\"../images/ArchitectureSequenceDiagram.png\" width\u003d\"550\" /\u003e","lastModifiedDate":"2024-03-02"},{"lineNumber":24,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":25,"author":{"gitId":"-"},"content":"Note how the diagram shows only the execution flows _between_ the main components. That is, it does not show details of the execution path *inside* each component. By hiding those details, the diagram aims to inform the reader about the overall execution path of a command without overwhelming the reader with too much details. In this tutorial, you aim to find those omitted details so that you get a more in-depth understanding of how the code works.","lastModifiedDate":"2021-07-31"},{"lineNumber":26,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":27,"author":{"gitId":"-"},"content":"Before we proceed, ensure that you have done the following:","lastModifiedDate":"2020-05-23"},{"lineNumber":28,"author":{"gitId":"-"},"content":"1. Read the [*Architecture* section of the DG](../DeveloperGuide.md#architecture)","lastModifiedDate":"2020-05-23"},{"lineNumber":29,"author":{"gitId":"-"},"content":"1. Set up the project in Intellij IDEA","lastModifiedDate":"2020-05-23"},{"lineNumber":30,"author":{"gitId":"-"},"content":"1. Learn basic debugging features of Intellij IDEA","lastModifiedDate":"2020-05-23"},{"lineNumber":31,"author":{"gitId":"-"},"content":" * If you are using a different IDE, we\u0027ll leave it to you to figure out the equivalent feature to use in your IDE.","lastModifiedDate":"2021-07-31"},{"lineNumber":32,"author":{"gitId":"-"},"content":" * If you are not using an IDE, we\u0027ll let you figure out how to achieve the same using your coding toolchain.","lastModifiedDate":"2021-07-31"},{"lineNumber":33,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":34,"author":{"gitId":"-"},"content":"## Setting a breakpoint","lastModifiedDate":"2020-05-23"},{"lineNumber":35,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":36,"author":{"gitId":"-"},"content":"As you know, the first step of debugging is to put in a breakpoint where you want the debugger to pause the execution. For example, if you are trying to understand how the App starts up, you would put a breakpoint in the first statement of the `main` method.","lastModifiedDate":"2021-07-31"},{"lineNumber":37,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":38,"author":{"gitId":"-"},"content":"In our case, we would want to begin the tracing at the very point where the App start processing user input (i.e., somewhere in the UI component), and then trace through how the execution proceeds through the UI component. However, the execution path through a GUI is often somewhat obscure due to various *event-driven mechanisms* used by GUI frameworks, which happens to be the case here too. Therefore, let us put the breakpoint where the `UI` transfers control to the `Logic` component.","lastModifiedDate":"2021-07-31"},{"lineNumber":39,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":40,"author":{"gitId":"jieqiboh"},"content":"\u003cimg src\u003d\"../images/ArchitectureSequenceDiagram.png\" width\u003d\"550\" /\u003e","lastModifiedDate":"2024-03-02"},{"lineNumber":41,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2021-07-31"},{"lineNumber":42,"author":{"gitId":"-"},"content":"According to the sequence diagram you saw earlier (and repeated above for reference), the `UI` component yields control to the `Logic` component through a method named `execute`. Searching through the code base for an `execute()` method that belongs to the `Logic` component yields a promising candidate in `seedu.address.logic.Logic`.","lastModifiedDate":"2021-07-31"},{"lineNumber":43,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2021-07-31"},{"lineNumber":44,"author":{"gitId":"-"},"content":"\u003cimg src\u003d\"../images/tracing/searchResultsForExecuteMethod.png\" /\u003e","lastModifiedDate":"2021-07-31"},{"lineNumber":45,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2021-07-31"},{"lineNumber":46,"author":{"gitId":"jieqiboh"},"content":"\u003cdiv markdown\u003d\"span\" class\u003d\"alert alert-primary\"\u003e","lastModifiedDate":"2024-03-02"},{"lineNumber":47,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2021-07-31"},{"lineNumber":48,"author":{"gitId":"jieqiboh"},"content":":bulb: **Intellij Tip:** The [\u0027**Search Everywhere**\u0027 feature](https://www.jetbrains.com/help/idea/searching-everywhere.html) can be used here. In particular, the \u0027**Find Symbol**\u0027 (\u0027Symbol\u0027 here refers to methods, variables, classes etc.) variant of that feature is quite useful here as we are looking for a _method_ named `execute`, not simply the text `execute`.","lastModifiedDate":"2024-03-02"},{"lineNumber":49,"author":{"gitId":"jieqiboh"},"content":"\u003c/div\u003e","lastModifiedDate":"2024-03-02"},{"lineNumber":50,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2021-07-31"},{"lineNumber":51,"author":{"gitId":"-"},"content":"A quick look at the `seedu.address.logic.Logic` (an extract given below) confirms that this indeed might be what we’re looking for.","lastModifiedDate":"2021-07-31"},{"lineNumber":52,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2021-07-31"},{"lineNumber":53,"author":{"gitId":"-"},"content":"```java","lastModifiedDate":"2021-07-31"},{"lineNumber":54,"author":{"gitId":"-"},"content":"public interface Logic {","lastModifiedDate":"2021-07-31"},{"lineNumber":55,"author":{"gitId":"-"},"content":" /**","lastModifiedDate":"2021-07-31"},{"lineNumber":56,"author":{"gitId":"-"},"content":" * Executes the command and returns the result.","lastModifiedDate":"2021-07-31"},{"lineNumber":57,"author":{"gitId":"-"},"content":" * @param commandText The command as entered by the user.","lastModifiedDate":"2021-07-31"},{"lineNumber":58,"author":{"gitId":"-"},"content":" * @return the result of the command execution.","lastModifiedDate":"2021-07-31"},{"lineNumber":59,"author":{"gitId":"-"},"content":" * @throws CommandException If an error occurs during command execution.","lastModifiedDate":"2021-07-31"},{"lineNumber":60,"author":{"gitId":"-"},"content":" * @throws ParseException If an error occurs during parsing.","lastModifiedDate":"2021-07-31"},{"lineNumber":61,"author":{"gitId":"-"},"content":" */","lastModifiedDate":"2021-07-31"},{"lineNumber":62,"author":{"gitId":"-"},"content":" CommandResult execute(String commandText) throws CommandException, ParseException;","lastModifiedDate":"2021-07-31"},{"lineNumber":63,"author":{"gitId":"-"},"content":"...","lastModifiedDate":"2021-07-31"},{"lineNumber":64,"author":{"gitId":"-"},"content":"}","lastModifiedDate":"2021-07-31"},{"lineNumber":65,"author":{"gitId":"-"},"content":"```","lastModifiedDate":"2021-07-31"},{"lineNumber":66,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2021-07-31"},{"lineNumber":67,"author":{"gitId":"-"},"content":"But apparently, this is an interface, not a concrete implementation.","lastModifiedDate":"2021-07-31"},{"lineNumber":68,"author":{"gitId":"-"},"content":"That should be fine because the [Architecture section of the Developer Guide](../DeveloperGuide.html#architecture) tells us that components interact through interfaces. Here\u0027s the relevant diagram:","lastModifiedDate":"2021-07-31"},{"lineNumber":69,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2021-07-31"},{"lineNumber":70,"author":{"gitId":"jieqiboh"},"content":"\u003cimg src\u003d\"../images/ComponentManagers.png\" width\u003d\"300\" /\u003e","lastModifiedDate":"2024-03-02"},{"lineNumber":71,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2021-07-31"},{"lineNumber":72,"author":{"gitId":"-"},"content":"Next, let\u0027s find out which statement(s) in the `UI` code is calling this method, thus transferring control from the `UI` to the `Logic`.","lastModifiedDate":"2021-07-31"},{"lineNumber":73,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2021-07-31"},{"lineNumber":74,"author":{"gitId":"jieqiboh"},"content":"\u003cdiv markdown\u003d\"span\" class\u003d\"alert alert-primary\"\u003e","lastModifiedDate":"2024-03-02"},{"lineNumber":75,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2021-07-31"},{"lineNumber":76,"author":{"gitId":"jieqiboh"},"content":":bulb: **Intellij Tip:** The [\u0027**Find Usages**\u0027 feature](https://www.jetbrains.com/help/idea/find-highlight-usages.html#find-usages) can find from which parts of the code a class/method/variable is being used.","lastModifiedDate":"2024-03-02"},{"lineNumber":77,"author":{"gitId":"jieqiboh"},"content":"\u003c/div\u003e","lastModifiedDate":"2024-03-02"},{"lineNumber":78,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":79,"author":{"gitId":"-"},"content":"![`Find Usages` tool window. `Edit` \\\u003e `Find` \\\u003e `Find Usages`.](../images/tracing/FindUsages.png)","lastModifiedDate":"2020-05-23"},{"lineNumber":80,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":81,"author":{"gitId":"-"},"content":"Bingo\\! `MainWindow#executeCommand()` seems to be exactly what we’re looking for\\!","lastModifiedDate":"2020-05-23"},{"lineNumber":82,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":83,"author":{"gitId":"-"},"content":"Now let’s set the breakpoint. First, double-click the item to reach the corresponding code. Once there, click on the left gutter to set a breakpoint, as shown below.","lastModifiedDate":"2020-05-23"},{"lineNumber":84,"author":{"gitId":"-"},"content":" ![LeftGutter](../images/tracing/LeftGutter.png)","lastModifiedDate":"2020-05-23"},{"lineNumber":85,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":86,"author":{"gitId":"-"},"content":"## Tracing the execution path","lastModifiedDate":"2020-05-23"},{"lineNumber":87,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":88,"author":{"gitId":"-"},"content":"Recall from the User Guide that the `edit` command has the format: `edit INDEX [n/NAME] [p/PHONE] [e/EMAIL] [a/ADDRESS] [t/TAG]…​` For this tutorial we will be issuing the command `edit 1 n/Alice Yeoh`.","lastModifiedDate":"2020-05-23"},{"lineNumber":89,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":90,"author":{"gitId":"jieqiboh"},"content":"\u003cdiv markdown\u003d\"span\" class\u003d\"alert alert-primary\"\u003e","lastModifiedDate":"2024-03-02"},{"lineNumber":91,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":92,"author":{"gitId":"jieqiboh"},"content":":bulb: **Tip:** Over the course of the debugging session, you will encounter every major component in the application. Try to keep track of what happens inside the component and where the execution transfers to another component.","lastModifiedDate":"2024-03-02"},{"lineNumber":93,"author":{"gitId":"jieqiboh"},"content":"\u003c/div\u003e","lastModifiedDate":"2024-03-02"},{"lineNumber":94,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":95,"author":{"gitId":"-"},"content":"1. To start the debugging session, simply `Run` \\\u003e `Debug Main`","lastModifiedDate":"2020-05-23"},{"lineNumber":96,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":97,"author":{"gitId":"-"},"content":"1. When the GUI appears, enter `edit 1 n/Alice Yeoh` into the command box and press `Enter`.","lastModifiedDate":"2021-07-31"},{"lineNumber":98,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":99,"author":{"gitId":"-"},"content":"1. The Debugger tool window should show up and show something like this:\u003cbr\u003e","lastModifiedDate":"2021-07-31"},{"lineNumber":100,"author":{"gitId":"-"},"content":" ![DebuggerStep1](../images/tracing/DebuggerStep1.png)","lastModifiedDate":"2020-05-23"},{"lineNumber":101,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":102,"author":{"gitId":"-"},"content":"1. Use the _Show execution point_ feature to jump to the line of code that we stopped at:\u003cbr\u003e","lastModifiedDate":"2021-07-31"},{"lineNumber":103,"author":{"gitId":"-"},"content":" ![ShowExecutionPoint](../images/tracing/ShowExecutionPoint.png)\u003cbr\u003e","lastModifiedDate":"2021-07-31"},{"lineNumber":104,"author":{"gitId":"-"},"content":" `CommandResult commandResult \u003d logic.execute(commandText);` is the line that you end up at (i.e., the place where we put the breakpoint).","lastModifiedDate":"2021-07-31"},{"lineNumber":105,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":106,"author":{"gitId":"-"},"content":"1. We are interested in the `logic.execute(commandText)` portion of that line so let’s _Step in_ into that method call:\u003cbr\u003e","lastModifiedDate":"2021-07-31"},{"lineNumber":107,"author":{"gitId":"-"},"content":" ![StepInto](../images/tracing/StepInto.png)","lastModifiedDate":"2020-05-23"},{"lineNumber":108,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":109,"author":{"gitId":"-"},"content":"1. We end up in `LogicManager#execute()` (not `Logic#execute` -- but this is expected because we know the `execute()` method in the `Logic` interface is actually implemented by the `LogicManager` class). Let’s take a look at the body of the method. Given below is the same code, with additional explanatory comments.","lastModifiedDate":"2021-07-31"},{"lineNumber":110,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":111,"author":{"gitId":"-"},"content":" **LogicManager\\#execute().**","lastModifiedDate":"2020-05-23"},{"lineNumber":112,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":113,"author":{"gitId":"-"},"content":" ``` java","lastModifiedDate":"2020-05-23"},{"lineNumber":114,"author":{"gitId":"-"},"content":" @Override","lastModifiedDate":"2020-05-23"},{"lineNumber":115,"author":{"gitId":"-"},"content":" public CommandResult execute(String commandText)","lastModifiedDate":"2020-05-23"},{"lineNumber":116,"author":{"gitId":"-"},"content":" throws CommandException, ParseException {","lastModifiedDate":"2020-05-23"},{"lineNumber":117,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":118,"author":{"gitId":"-"},"content":" //Logging, safe to ignore","lastModifiedDate":"2020-05-23"},{"lineNumber":119,"author":{"gitId":"-"},"content":" logger.info(\"----------------[USER COMMAND][\" + commandText + \"]\");","lastModifiedDate":"2020-05-23"},{"lineNumber":120,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":121,"author":{"gitId":"-"},"content":" CommandResult commandResult;","lastModifiedDate":"2020-05-23"},{"lineNumber":122,"author":{"gitId":"-"},"content":" //Parse user input from String to a Command","lastModifiedDate":"2020-05-23"},{"lineNumber":123,"author":{"gitId":"-"},"content":" Command command \u003d addressBookParser.parseCommand(commandText);","lastModifiedDate":"2020-05-23"},{"lineNumber":124,"author":{"gitId":"-"},"content":" //Executes the Command and stores the result","lastModifiedDate":"2020-05-23"},{"lineNumber":125,"author":{"gitId":"-"},"content":" commandResult \u003d command.execute(model);","lastModifiedDate":"2020-05-23"},{"lineNumber":126,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":127,"author":{"gitId":"-"},"content":" try {","lastModifiedDate":"2020-05-23"},{"lineNumber":128,"author":{"gitId":"-"},"content":" //We can deduce that the previous line of code modifies model in some way","lastModifiedDate":"2020-05-23"},{"lineNumber":129,"author":{"gitId":"-"},"content":" // since it\u0027s being stored here.","lastModifiedDate":"2020-05-23"},{"lineNumber":130,"author":{"gitId":"-"},"content":" storage.saveAddressBook(model.getAddressBook());","lastModifiedDate":"2020-05-23"},{"lineNumber":131,"author":{"gitId":"-"},"content":" } catch (IOException ioe) {","lastModifiedDate":"2020-05-23"},{"lineNumber":132,"author":{"gitId":"-"},"content":" throw new CommandException(FILE_OPS_ERROR_MESSAGE + ioe, ioe);","lastModifiedDate":"2020-05-23"},{"lineNumber":133,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2020-05-23"},{"lineNumber":134,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":135,"author":{"gitId":"-"},"content":" return commandResult;","lastModifiedDate":"2020-05-23"},{"lineNumber":136,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2020-05-23"},{"lineNumber":137,"author":{"gitId":"-"},"content":" ```","lastModifiedDate":"2020-05-23"},{"lineNumber":138,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":139,"author":{"gitId":"-"},"content":"1. `LogicManager#execute()` appears to delegate most of the heavy lifting to other components. Let’s take a closer look at each one.","lastModifiedDate":"2020-05-23"},{"lineNumber":140,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":141,"author":{"gitId":"-"},"content":"1. _Step over_ the logging code since it is of no interest to us now.","lastModifiedDate":"2021-07-31"},{"lineNumber":142,"author":{"gitId":"-"},"content":" ![StepOver](../images/tracing/StepOver.png)","lastModifiedDate":"2021-07-31"},{"lineNumber":143,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":144,"author":{"gitId":"-"},"content":"1. _Step into_ the line where user input in parsed from a String to a Command, which should bring you to the `AddressBookParser#parseCommand()` method (partial code given below):","lastModifiedDate":"2021-07-31"},{"lineNumber":145,"author":{"gitId":"-"},"content":" ``` java","lastModifiedDate":"2020-05-23"},{"lineNumber":146,"author":{"gitId":"-"},"content":" public Command parseCommand(String userInput) throws ParseException {","lastModifiedDate":"2020-05-23"},{"lineNumber":147,"author":{"gitId":"-"},"content":" ...","lastModifiedDate":"2020-05-23"},{"lineNumber":148,"author":{"gitId":"-"},"content":" final String commandWord \u003d matcher.group(\"commandWord\");","lastModifiedDate":"2020-05-23"},{"lineNumber":149,"author":{"gitId":"-"},"content":" final String arguments \u003d matcher.group(\"arguments\");","lastModifiedDate":"2020-05-23"},{"lineNumber":150,"author":{"gitId":"-"},"content":" ...","lastModifiedDate":"2020-05-23"},{"lineNumber":151,"author":{"gitId":"-"},"content":" ```","lastModifiedDate":"2020-05-23"},{"lineNumber":152,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":153,"author":{"gitId":"-"},"content":"1. _Step over_ the statements in that method until you reach the `switch` statement. The \u0027Variables\u0027 window now shows the value of both `commandWord` and `arguments`:\u003cbr\u003e","lastModifiedDate":"2021-07-31"},{"lineNumber":154,"author":{"gitId":"-"},"content":" ![Variables](../images/tracing/Variables.png)","lastModifiedDate":"2020-05-23"},{"lineNumber":155,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":156,"author":{"gitId":"-"},"content":"1. We see that the value of `commandWord` is now `edit` but `arguments` is still not processed in any meaningful way.","lastModifiedDate":"2020-05-23"},{"lineNumber":157,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":158,"author":{"gitId":"-"},"content":"1. Stepping through the `switch` block, we end up at a call to `EditCommandParser().parse()` as expected (because the command we typed is an edit command).","lastModifiedDate":"2021-07-31"},{"lineNumber":159,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":160,"author":{"gitId":"-"},"content":" ``` java","lastModifiedDate":"2020-05-23"},{"lineNumber":161,"author":{"gitId":"-"},"content":" ...","lastModifiedDate":"2020-05-23"},{"lineNumber":162,"author":{"gitId":"-"},"content":" case EditCommand.COMMAND_WORD:","lastModifiedDate":"2020-05-23"},{"lineNumber":163,"author":{"gitId":"-"},"content":" return new EditCommandParser().parse(arguments);","lastModifiedDate":"2020-05-23"},{"lineNumber":164,"author":{"gitId":"-"},"content":" ...","lastModifiedDate":"2020-05-23"},{"lineNumber":165,"author":{"gitId":"-"},"content":" ```","lastModifiedDate":"2020-05-23"},{"lineNumber":166,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":167,"author":{"gitId":"-"},"content":"1. Let’s see what `EditCommandParser#parse()` does by stepping into it. You might have to click the \u0027step into\u0027 button multiple times here because there are two method calls in that statement: `EditCommandParser()` and `parse()`.","lastModifiedDate":"2021-07-31"},{"lineNumber":168,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":169,"author":{"gitId":"jieqiboh"},"content":" \u003cdiv markdown\u003d\"span\" class\u003d\"alert alert-primary\"\u003e:bulb: **Intellij Tip:** Sometimes, you might end up stepping into functions that are not of interest. Simply use the `step out` button to get out of them!","lastModifiedDate":"2024-03-02"},{"lineNumber":170,"author":{"gitId":"jieqiboh"},"content":" \u003c/div\u003e","lastModifiedDate":"2024-03-02"},{"lineNumber":171,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":172,"author":{"gitId":"-"},"content":"1. Stepping through the method shows that it calls `ArgumentTokenizer#tokenize()` and `ParserUtil#parseIndex()` to obtain the arguments and index required.","lastModifiedDate":"2021-07-31"},{"lineNumber":173,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2021-07-31"},{"lineNumber":174,"author":{"gitId":"-"},"content":"1. The rest of the method seems to exhaustively check for the existence of each possible parameter of the `edit` command and store any possible changes in an `EditPersonDescriptor`. Recall that we can verify the contents of `editPersonDesciptor` through the \u0027Variables\u0027 window.\u003cbr\u003e","lastModifiedDate":"2021-07-31"},{"lineNumber":175,"author":{"gitId":"-"},"content":" ![EditCommand](../images/tracing/EditCommand.png)","lastModifiedDate":"2020-05-23"},{"lineNumber":176,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":177,"author":{"gitId":"-"},"content":"1. As you just traced through some code involved in parsing a command, you can take a look at this class diagram to see where the various parsing-related classes you encountered fit into the design of the `Logic` component.","lastModifiedDate":"2021-07-31"},{"lineNumber":178,"author":{"gitId":"jieqiboh"},"content":" \u003cimg src\u003d\"../images/ParserClasses.png\" width\u003d\"600\"/\u003e","lastModifiedDate":"2024-03-02"},{"lineNumber":179,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2021-07-31"},{"lineNumber":180,"author":{"gitId":"-"},"content":"1. Let’s continue stepping through until we return to `LogicManager#execute()`.","lastModifiedDate":"2020-05-23"},{"lineNumber":181,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":182,"author":{"gitId":"-"},"content":" The sequence diagram below shows the details of the execution path through the Logic component. Does the execution path you traced in the code so far match the diagram?\u003cbr\u003e","lastModifiedDate":"2021-07-31"},{"lineNumber":183,"author":{"gitId":"jieqiboh"},"content":" ![Tracing an `edit` command through the Logic component](../images/tracing/LogicSequenceDiagram.png)","lastModifiedDate":"2024-03-02"},{"lineNumber":184,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":185,"author":{"gitId":"-"},"content":"1. Now, step over until you read the statement that calls the `execute()` method of the `EditCommand` object received, and step into that `execute()` method (partial code given below):","lastModifiedDate":"2021-07-31"},{"lineNumber":186,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":187,"author":{"gitId":"-"},"content":" **`EditCommand#execute()`:**","lastModifiedDate":"2021-07-31"},{"lineNumber":188,"author":{"gitId":"-"},"content":" ``` java","lastModifiedDate":"2020-05-23"},{"lineNumber":189,"author":{"gitId":"-"},"content":" @Override","lastModifiedDate":"2020-05-23"},{"lineNumber":190,"author":{"gitId":"-"},"content":" public CommandResult execute(Model model) throws CommandException {","lastModifiedDate":"2020-05-23"},{"lineNumber":191,"author":{"gitId":"-"},"content":" ...","lastModifiedDate":"2020-05-23"},{"lineNumber":192,"author":{"gitId":"-"},"content":" Person personToEdit \u003d lastShownList.get(index.getZeroBased());","lastModifiedDate":"2020-05-23"},{"lineNumber":193,"author":{"gitId":"-"},"content":" Person editedPerson \u003d createEditedPerson(personToEdit, editPersonDescriptor);","lastModifiedDate":"2020-05-23"},{"lineNumber":194,"author":{"gitId":"-"},"content":" if (!personToEdit.isSamePerson(editedPerson) \u0026\u0026 model.hasPerson(editedPerson)) {","lastModifiedDate":"2020-05-23"},{"lineNumber":195,"author":{"gitId":"-"},"content":" throw new CommandException(MESSAGE_DUPLICATE_PERSON);","lastModifiedDate":"2020-05-23"},{"lineNumber":196,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2020-05-23"},{"lineNumber":197,"author":{"gitId":"-"},"content":" model.setPerson(personToEdit, editedPerson);","lastModifiedDate":"2020-05-23"},{"lineNumber":198,"author":{"gitId":"-"},"content":" model.updateFilteredPersonList(PREDICATE_SHOW_ALL_PERSONS);","lastModifiedDate":"2020-05-23"},{"lineNumber":199,"author":{"gitId":"-"},"content":" return new CommandResult(String.format(MESSAGE_EDIT_PERSON_SUCCESS, editedPerson));","lastModifiedDate":"2020-05-23"},{"lineNumber":200,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2020-05-23"},{"lineNumber":201,"author":{"gitId":"-"},"content":" ```","lastModifiedDate":"2020-05-23"},{"lineNumber":202,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":203,"author":{"gitId":"-"},"content":"1. As suspected, `command#execute()` does indeed make changes to the `model` object. Specifically,","lastModifiedDate":"2021-07-31"},{"lineNumber":204,"author":{"gitId":"-"},"content":" * it uses the `setPerson()` method (defined in the interface `Model` and implemented in `ModelManager` as per the usual pattern) to update the person data.","lastModifiedDate":"2021-07-31"},{"lineNumber":205,"author":{"gitId":"-"},"content":" * it uses the `updateFilteredPersonList` method to ask the `Model` to populate the \u0027filtered list\u0027 with _all_ persons.\u003cbr\u003e","lastModifiedDate":"2021-07-31"},{"lineNumber":206,"author":{"gitId":"-"},"content":" FYI, The \u0027filtered list\u0027 is the list of persons resulting from the most recent operation that will be shown to the user immediately after. For the `edit` command, we populate it with all the persons so that the user can see the edited person along with all other persons. If this was a `find` command, we would be setting that list to contain the search results instead.\u003cbr\u003e","lastModifiedDate":"2021-07-31"},{"lineNumber":207,"author":{"gitId":"-"},"content":" To provide some context, given below is the class diagram of the `Model` component. See if you can figure out where the \u0027filtered list\u0027 of persons is being tracked.","lastModifiedDate":"2021-07-31"},{"lineNumber":208,"author":{"gitId":"jieqiboh"},"content":" \u003cimg src\u003d\"../images/ModelClassDiagram.png\" width\u003d\"450\" /\u003e\u003cbr\u003e","lastModifiedDate":"2024-03-02"},{"lineNumber":209,"author":{"gitId":"-"},"content":" * :bulb: This may be a good time to read through the [`Model` component section of the DG](../DeveloperGuide.html#model-component)","lastModifiedDate":"2021-07-31"},{"lineNumber":210,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":211,"author":{"gitId":"-"},"content":"1. As you step through the rest of the statements in the `EditCommand#execute()` method, you\u0027ll see that it creates a `CommandResult` object (containing information about the result of the execution) and returns it.\u003cbr\u003e","lastModifiedDate":"2021-07-31"},{"lineNumber":212,"author":{"gitId":"-"},"content":" Advancing the debugger by one more step should take you back to the middle of the `LogicManager#execute()` method.\u003cbr\u003e","lastModifiedDate":"2021-07-31"},{"lineNumber":213,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":214,"author":{"gitId":"-"},"content":"1. Given that you have already seen quite a few classes in the `Logic` component in action, see if you can identify in this partial class diagram some of the classes you\u0027ve encountered so far, and see how they fit into the class structure of the `Logic` component:","lastModifiedDate":"2021-07-31"},{"lineNumber":215,"author":{"gitId":"jieqiboh"},"content":" \u003cimg src\u003d\"../images/LogicClassDiagram.png\" width\u003d\"550\"/\u003e","lastModifiedDate":"2024-03-02"},{"lineNumber":216,"author":{"gitId":"-"},"content":" * :bulb: This may be a good time to read through the [`Logic` component section of the DG](../DeveloperGuide.html#logic-component)","lastModifiedDate":"2021-07-31"},{"lineNumber":217,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":218,"author":{"gitId":"-"},"content":"1. Similar to before, you can step over/into statements in the `LogicManager#execute()` method to examine how the control is transferred to the `Storage` component and what happens inside that component.","lastModifiedDate":"2021-07-31"},{"lineNumber":219,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2021-07-31"},{"lineNumber":220,"author":{"gitId":"jieqiboh"},"content":" \u003cdiv markdown\u003d\"span\" class\u003d\"alert alert-primary\"\u003e:bulb: **Intellij Tip:** When trying to step into a statement such as `storage.saveAddressBook(model.getAddressBook())` which contains multiple method calls, Intellij will let you choose (by clicking) which one you want to step into.","lastModifiedDate":"2024-03-02"},{"lineNumber":221,"author":{"gitId":"jieqiboh"},"content":" \u003c/div\u003e","lastModifiedDate":"2024-03-02"},{"lineNumber":222,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":223,"author":{"gitId":"-"},"content":"1. As you step through the code inside the `Storage` component, you will eventually arrive at the `JsonAddressBook#saveAddressBook()` method which calls the `JsonSerializableAddressBook` constructor, to create an object that can be _serialized_ (i.e., stored in storage medium) in JSON format. That constructor is given below (with added line breaks for easier readability):","lastModifiedDate":"2021-07-31"},{"lineNumber":224,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2021-07-31"},{"lineNumber":225,"author":{"gitId":"-"},"content":" **`JsonSerializableAddressBook` constructor:**","lastModifiedDate":"2021-07-31"},{"lineNumber":226,"author":{"gitId":"-"},"content":" ``` java","lastModifiedDate":"2020-05-23"},{"lineNumber":227,"author":{"gitId":"-"},"content":" /**","lastModifiedDate":"2020-05-23"},{"lineNumber":228,"author":{"gitId":"-"},"content":" * Converts a given {@code ReadOnlyAddressBook} into this class for Jackson use.","lastModifiedDate":"2020-05-23"},{"lineNumber":229,"author":{"gitId":"-"},"content":" *","lastModifiedDate":"2020-05-23"},{"lineNumber":230,"author":{"gitId":"-"},"content":" * @param source future changes to this will not affect the created","lastModifiedDate":"2020-05-23"},{"lineNumber":231,"author":{"gitId":"-"},"content":" * {@code JsonSerializableAddressBook}.","lastModifiedDate":"2020-05-23"},{"lineNumber":232,"author":{"gitId":"-"},"content":" */","lastModifiedDate":"2020-05-23"},{"lineNumber":233,"author":{"gitId":"-"},"content":" public JsonSerializableAddressBook(ReadOnlyAddressBook source) {","lastModifiedDate":"2020-05-23"},{"lineNumber":234,"author":{"gitId":"-"},"content":" persons.addAll(","lastModifiedDate":"2020-05-23"},{"lineNumber":235,"author":{"gitId":"-"},"content":" source.getPersonList()","lastModifiedDate":"2020-05-23"},{"lineNumber":236,"author":{"gitId":"-"},"content":" .stream()","lastModifiedDate":"2020-05-23"},{"lineNumber":237,"author":{"gitId":"-"},"content":" .map(JsonAdaptedPerson::new)","lastModifiedDate":"2020-05-23"},{"lineNumber":238,"author":{"gitId":"-"},"content":" .collect(Collectors.toList()));","lastModifiedDate":"2020-05-23"},{"lineNumber":239,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2020-05-23"},{"lineNumber":240,"author":{"gitId":"-"},"content":" ```","lastModifiedDate":"2020-05-23"},{"lineNumber":241,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":242,"author":{"gitId":"-"},"content":"1. It appears that a `JsonAdaptedPerson` is created for each `Person` and then added to the `JsonSerializableAddressBook`.","lastModifiedDate":"2020-05-23"},{"lineNumber":243,"author":{"gitId":"-"},"content":" This is because regular Java objects need to go through an _adaptation_ for them to be suitable to be saved in JSON format.","lastModifiedDate":"2021-07-31"},{"lineNumber":244,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":245,"author":{"gitId":"-"},"content":"1. While you are stepping through the classes in the `Storage` component, here is the component\u0027s class diagram to help you understand how those classes fit into the structure of the component.\u003cbr\u003e","lastModifiedDate":"2021-07-31"},{"lineNumber":246,"author":{"gitId":"jieqiboh"},"content":" \u003cimg src\u003d\"../images/StorageClassDiagram.png\" width\u003d\"550\" /\u003e","lastModifiedDate":"2024-03-02"},{"lineNumber":247,"author":{"gitId":"-"},"content":" * :bulb: This may be a good time to read through the [`Storage` component section of the DG](../DeveloperGuide.html#storage-component)","lastModifiedDate":"2021-07-31"},{"lineNumber":248,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":249,"author":{"gitId":"-"},"content":"1. We can continue to step through until you reach the end of the `LogicManager#execute()` method and return to the `MainWindow#executeCommand()` method (the place where we put the original breakpoint).","lastModifiedDate":"2021-07-31"},{"lineNumber":250,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":251,"author":{"gitId":"-"},"content":"1. Stepping into `resultDisplay.setFeedbackToUser(commandResult.getFeedbackToUser());`, we end up in:","lastModifiedDate":"2021-07-31"},{"lineNumber":252,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":253,"author":{"gitId":"-"},"content":" **`ResultDisplay#setFeedbackToUser()`**","lastModifiedDate":"2021-07-31"},{"lineNumber":254,"author":{"gitId":"-"},"content":" ``` java","lastModifiedDate":"2020-05-23"},{"lineNumber":255,"author":{"gitId":"-"},"content":" public void setFeedbackToUser(String feedbackToUser) {","lastModifiedDate":"2020-05-23"},{"lineNumber":256,"author":{"gitId":"-"},"content":" requireNonNull(feedbackToUser);","lastModifiedDate":"2020-05-23"},{"lineNumber":257,"author":{"gitId":"-"},"content":" resultDisplay.setText(feedbackToUser);","lastModifiedDate":"2020-05-23"},{"lineNumber":258,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2020-05-23"},{"lineNumber":259,"author":{"gitId":"-"},"content":" ```","lastModifiedDate":"2020-05-23"},{"lineNumber":260,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":261,"author":{"gitId":"-"},"content":"1. Finally, you can step through until you reach the end of`MainWindow#executeCommand()`.\u003cbr\u003e","lastModifiedDate":"2021-07-31"},{"lineNumber":262,"author":{"gitId":"-"},"content":" :bulb: This may be a good time to read through the [`UI` component section of the DG](../DeveloperGuide.html#ui-component)","lastModifiedDate":"2021-07-31"},{"lineNumber":263,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2021-07-31"},{"lineNumber":264,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":265,"author":{"gitId":"-"},"content":"## Conclusion","lastModifiedDate":"2020-05-23"},{"lineNumber":266,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":267,"author":{"gitId":"-"},"content":"In this tutorial, we traced a valid edit command from raw user input to the result being displayed to the user. From this tutorial, you learned more about how the various components work together to produce a response to a user command.","lastModifiedDate":"2021-07-31"},{"lineNumber":268,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":269,"author":{"gitId":"-"},"content":"Here are some quick questions you can try to answer based on your execution path tracing. In some cases, you can do further tracing for the given commands to find exactly what happens.","lastModifiedDate":"2021-07-31"},{"lineNumber":270,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":271,"author":{"gitId":"-"},"content":"1. In this tutorial, we traced the \"happy path\" (i.e., no errors). What","lastModifiedDate":"2020-05-23"},{"lineNumber":272,"author":{"gitId":"-"},"content":" do you think will happen if we traced the following commands","lastModifiedDate":"2020-05-23"},{"lineNumber":273,"author":{"gitId":"-"},"content":" instead? What exceptions do you think will be thrown (if any), where","lastModifiedDate":"2020-05-23"},{"lineNumber":274,"author":{"gitId":"-"},"content":" will the exceptions be thrown and where will they be handled?","lastModifiedDate":"2020-05-23"},{"lineNumber":275,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":276,"author":{"gitId":"-"},"content":" 1. `redit 1 n/Alice Yu`","lastModifiedDate":"2020-05-23"},{"lineNumber":277,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":278,"author":{"gitId":"-"},"content":" 2. `edit 0 n/Alice Yu`","lastModifiedDate":"2020-05-23"},{"lineNumber":279,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":280,"author":{"gitId":"-"},"content":" 3. `edit 1 n/Alex Yeoh`","lastModifiedDate":"2020-05-23"},{"lineNumber":281,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":282,"author":{"gitId":"-"},"content":" 4. `edit 1`","lastModifiedDate":"2020-05-23"},{"lineNumber":283,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":284,"author":{"gitId":"-"},"content":" 5. `edit 1 n/アリス ユー`","lastModifiedDate":"2020-05-23"},{"lineNumber":285,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":286,"author":{"gitId":"-"},"content":" 6. `edit 1 t/one t/two t/three t/one`","lastModifiedDate":"2020-05-23"},{"lineNumber":287,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":288,"author":{"gitId":"-"},"content":"2. What components will you have to modify to perform the following","lastModifiedDate":"2020-05-23"},{"lineNumber":289,"author":{"gitId":"-"},"content":" enhancements to the application?","lastModifiedDate":"2020-05-23"},{"lineNumber":290,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":291,"author":{"gitId":"-"},"content":" 1. Make command words case-insensitive","lastModifiedDate":"2020-05-23"},{"lineNumber":292,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":293,"author":{"gitId":"-"},"content":" 2. Allow `delete` to remove more than one index at a time","lastModifiedDate":"2020-05-23"},{"lineNumber":294,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":295,"author":{"gitId":"-"},"content":" 3. Save the address book in the CSV format instead","lastModifiedDate":"2020-05-23"},{"lineNumber":296,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":297,"author":{"gitId":"-"},"content":" 4. Add a new command","lastModifiedDate":"2020-05-23"},{"lineNumber":298,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":299,"author":{"gitId":"-"},"content":" 5. Add a new field to `Person`","lastModifiedDate":"2020-05-23"},{"lineNumber":300,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":301,"author":{"gitId":"-"},"content":" 6. Add a new entity to the address book","lastModifiedDate":"2020-05-23"}],"authorContributionMap":{"jieqiboh":25,"-":276}},{"path":"src/main/java/seedu/address/model/internship/ApplicationStatus.java","fileType":"functional-code","lines":[{"lineNumber":1,"author":{"gitId":"jieqiboh"},"content":"package seedu.address.model.internship;","lastModifiedDate":"2024-03-06"},{"lineNumber":2,"author":{"gitId":"jieqiboh"},"content":"","lastModifiedDate":"2024-03-06"},{"lineNumber":3,"author":{"gitId":"jieqiboh"},"content":"import static java.util.Objects.requireNonNull;","lastModifiedDate":"2024-03-06"},{"lineNumber":4,"author":{"gitId":"jieqiboh"},"content":"","lastModifiedDate":"2024-03-06"},{"lineNumber":5,"author":{"gitId":"jieqiboh"},"content":"/**","lastModifiedDate":"2024-03-06"},{"lineNumber":6,"author":{"gitId":"jieqiboh"},"content":" * Represents an Internship\u0027s application status in the internship book.","lastModifiedDate":"2024-03-06"},{"lineNumber":7,"author":{"gitId":"jieqiboh"},"content":" */","lastModifiedDate":"2024-03-06"},{"lineNumber":8,"author":{"gitId":"jieqiboh"},"content":"public class ApplicationStatus {","lastModifiedDate":"2024-03-06"},{"lineNumber":9,"author":{"gitId":"jieqiboh"},"content":" /**","lastModifiedDate":"2024-03-06"},{"lineNumber":10,"author":{"gitId":"jieqiboh"},"content":" * Enum of statuses","lastModifiedDate":"2024-03-06"},{"lineNumber":11,"author":{"gitId":"jieqiboh"},"content":" */","lastModifiedDate":"2024-03-06"},{"lineNumber":12,"author":{"gitId":"jieqiboh"},"content":" public enum StatusEnum {","lastModifiedDate":"2024-03-06"},{"lineNumber":13,"author":{"gitId":"jieqiboh"},"content":" TO_APPLY,","lastModifiedDate":"2024-03-06"},{"lineNumber":14,"author":{"gitId":"jieqiboh"},"content":" PENDING,","lastModifiedDate":"2024-03-06"},{"lineNumber":15,"author":{"gitId":"jieqiboh"},"content":" REJECTED,","lastModifiedDate":"2024-03-06"},{"lineNumber":16,"author":{"gitId":"jieqiboh"},"content":" ACCEPTED,","lastModifiedDate":"2024-03-06"},{"lineNumber":17,"author":{"gitId":"jieqiboh"},"content":" ONGOING","lastModifiedDate":"2024-03-06"},{"lineNumber":18,"author":{"gitId":"jieqiboh"},"content":" }","lastModifiedDate":"2024-03-06"},{"lineNumber":19,"author":{"gitId":"jieqiboh"},"content":"","lastModifiedDate":"2024-03-06"},{"lineNumber":20,"author":{"gitId":"jieqiboh"},"content":" public final StatusEnum applicationStatus;","lastModifiedDate":"2024-03-06"},{"lineNumber":21,"author":{"gitId":"jieqiboh"},"content":"","lastModifiedDate":"2024-03-06"},{"lineNumber":22,"author":{"gitId":"jieqiboh"},"content":" /**","lastModifiedDate":"2024-03-06"},{"lineNumber":23,"author":{"gitId":"jieqiboh"},"content":" * Constructs a {@code ApplicationStatus}.","lastModifiedDate":"2024-03-06"},{"lineNumber":24,"author":{"gitId":"jieqiboh"},"content":" *","lastModifiedDate":"2024-03-06"},{"lineNumber":25,"author":{"gitId":"jieqiboh"},"content":" * @param applicationStatus A valid applicationStatus.","lastModifiedDate":"2024-03-06"},{"lineNumber":26,"author":{"gitId":"jieqiboh"},"content":" */","lastModifiedDate":"2024-03-06"},{"lineNumber":27,"author":{"gitId":"jieqiboh"},"content":" public ApplicationStatus(StatusEnum applicationStatus) {","lastModifiedDate":"2024-03-06"},{"lineNumber":28,"author":{"gitId":"jieqiboh"},"content":" requireNonNull(applicationStatus);","lastModifiedDate":"2024-03-06"},{"lineNumber":29,"author":{"gitId":"jieqiboh"},"content":" this.applicationStatus \u003d applicationStatus;","lastModifiedDate":"2024-03-06"},{"lineNumber":30,"author":{"gitId":"jieqiboh"},"content":" }","lastModifiedDate":"2024-03-06"},{"lineNumber":31,"author":{"gitId":"jieqiboh"},"content":"","lastModifiedDate":"2024-03-06"},{"lineNumber":32,"author":{"gitId":"jieqiboh"},"content":" @Override","lastModifiedDate":"2024-03-06"},{"lineNumber":33,"author":{"gitId":"jieqiboh"},"content":" public String toString() {","lastModifiedDate":"2024-03-06"},{"lineNumber":34,"author":{"gitId":"jieqiboh"},"content":" switch (applicationStatus) {","lastModifiedDate":"2024-03-06"},{"lineNumber":35,"author":{"gitId":"jieqiboh"},"content":" case TO_APPLY:","lastModifiedDate":"2024-03-06"},{"lineNumber":36,"author":{"gitId":"jieqiboh"},"content":" return \"To Apply\";","lastModifiedDate":"2024-03-06"},{"lineNumber":37,"author":{"gitId":"jieqiboh"},"content":" case PENDING:","lastModifiedDate":"2024-03-06"},{"lineNumber":38,"author":{"gitId":"jieqiboh"},"content":" return \"Pending\";","lastModifiedDate":"2024-03-06"},{"lineNumber":39,"author":{"gitId":"jieqiboh"},"content":" case REJECTED:","lastModifiedDate":"2024-03-06"},{"lineNumber":40,"author":{"gitId":"jieqiboh"},"content":" return \"Rejected\";","lastModifiedDate":"2024-03-06"},{"lineNumber":41,"author":{"gitId":"jieqiboh"},"content":" case ACCEPTED:","lastModifiedDate":"2024-03-06"},{"lineNumber":42,"author":{"gitId":"jieqiboh"},"content":" return \"Accepted\";","lastModifiedDate":"2024-03-06"},{"lineNumber":43,"author":{"gitId":"jieqiboh"},"content":" case ONGOING:","lastModifiedDate":"2024-03-06"},{"lineNumber":44,"author":{"gitId":"jieqiboh"},"content":" return \"Ongoing\";","lastModifiedDate":"2024-03-06"},{"lineNumber":45,"author":{"gitId":"jieqiboh"},"content":" default:","lastModifiedDate":"2024-03-06"},{"lineNumber":46,"author":{"gitId":"jieqiboh"},"content":" throw new IllegalArgumentException(\"Unexpected application status: \" + applicationStatus);","lastModifiedDate":"2024-03-06"},{"lineNumber":47,"author":{"gitId":"jieqiboh"},"content":" }","lastModifiedDate":"2024-03-06"},{"lineNumber":48,"author":{"gitId":"jieqiboh"},"content":" }","lastModifiedDate":"2024-03-06"},{"lineNumber":49,"author":{"gitId":"jieqiboh"},"content":"","lastModifiedDate":"2024-03-06"},{"lineNumber":50,"author":{"gitId":"jieqiboh"},"content":"","lastModifiedDate":"2024-03-06"},{"lineNumber":51,"author":{"gitId":"jieqiboh"},"content":" @Override","lastModifiedDate":"2024-03-06"},{"lineNumber":52,"author":{"gitId":"jieqiboh"},"content":" public int hashCode() {","lastModifiedDate":"2024-03-06"},{"lineNumber":53,"author":{"gitId":"jieqiboh"},"content":" return applicationStatus.hashCode();","lastModifiedDate":"2024-03-06"},{"lineNumber":54,"author":{"gitId":"jieqiboh"},"content":" }","lastModifiedDate":"2024-03-06"},{"lineNumber":55,"author":{"gitId":"jieqiboh"},"content":"}","lastModifiedDate":"2024-03-06"}],"authorContributionMap":{"jieqiboh":55}},{"path":"src/main/java/seedu/address/model/internship/CompanyName.java","fileType":"functional-code","lines":[{"lineNumber":1,"author":{"gitId":"jieqiboh"},"content":"package seedu.address.model.internship;","lastModifiedDate":"2024-03-06"},{"lineNumber":2,"author":{"gitId":"jieqiboh"},"content":"","lastModifiedDate":"2024-03-06"},{"lineNumber":3,"author":{"gitId":"jieqiboh"},"content":"import static java.util.Objects.requireNonNull;","lastModifiedDate":"2024-03-06"},{"lineNumber":4,"author":{"gitId":"jieqiboh"},"content":"import static seedu.address.commons.util.AppUtil.checkArgument;","lastModifiedDate":"2024-03-06"},{"lineNumber":5,"author":{"gitId":"jieqiboh"},"content":"","lastModifiedDate":"2024-03-06"},{"lineNumber":6,"author":{"gitId":"jieqiboh"},"content":"/**","lastModifiedDate":"2024-03-06"},{"lineNumber":7,"author":{"gitId":"jieqiboh"},"content":" * Represents a Company\u0027s name in the address book.","lastModifiedDate":"2024-03-06"},{"lineNumber":8,"author":{"gitId":"jieqiboh"},"content":" * Guarantees: immutable; is valid as declared in {@link #isValidContactName(String)}","lastModifiedDate":"2024-03-06"},{"lineNumber":9,"author":{"gitId":"jieqiboh"},"content":" */","lastModifiedDate":"2024-03-06"},{"lineNumber":10,"author":{"gitId":"jieqiboh"},"content":"public class CompanyName {","lastModifiedDate":"2024-03-06"},{"lineNumber":11,"author":{"gitId":"jieqiboh"},"content":" public static final String MESSAGE_CONSTRAINTS \u003d","lastModifiedDate":"2024-03-06"},{"lineNumber":12,"author":{"gitId":"jieqiboh"},"content":" \"Names should only contain alphanumeric characters and spaces, and it should not be blank\";","lastModifiedDate":"2024-03-06"},{"lineNumber":13,"author":{"gitId":"jieqiboh"},"content":"","lastModifiedDate":"2024-03-06"},{"lineNumber":14,"author":{"gitId":"jieqiboh"},"content":" /*","lastModifiedDate":"2024-03-06"},{"lineNumber":15,"author":{"gitId":"jieqiboh"},"content":" * Matches an arbitrarily long string of alphanumeric characters","lastModifiedDate":"2024-03-06"},{"lineNumber":16,"author":{"gitId":"jieqiboh"},"content":" */","lastModifiedDate":"2024-03-06"},{"lineNumber":17,"author":{"gitId":"jieqiboh"},"content":" public static final String VALIDATION_REGEX \u003d \"^\\\\p{Alnum}+$\";","lastModifiedDate":"2024-03-06"},{"lineNumber":18,"author":{"gitId":"jieqiboh"},"content":"","lastModifiedDate":"2024-03-06"},{"lineNumber":19,"author":{"gitId":"jieqiboh"},"content":" public final String companyName;","lastModifiedDate":"2024-03-06"},{"lineNumber":20,"author":{"gitId":"jieqiboh"},"content":"","lastModifiedDate":"2024-03-06"},{"lineNumber":21,"author":{"gitId":"jieqiboh"},"content":" /**","lastModifiedDate":"2024-03-06"},{"lineNumber":22,"author":{"gitId":"jieqiboh"},"content":" * Constructs a {@code CompanyName}.","lastModifiedDate":"2024-03-06"},{"lineNumber":23,"author":{"gitId":"jieqiboh"},"content":" *","lastModifiedDate":"2024-03-06"},{"lineNumber":24,"author":{"gitId":"jieqiboh"},"content":" * @param companyName A valid companyName.","lastModifiedDate":"2024-03-06"},{"lineNumber":25,"author":{"gitId":"jieqiboh"},"content":" */","lastModifiedDate":"2024-03-06"},{"lineNumber":26,"author":{"gitId":"jieqiboh"},"content":" public CompanyName(String companyName) {","lastModifiedDate":"2024-03-06"},{"lineNumber":27,"author":{"gitId":"jieqiboh"},"content":" requireNonNull(companyName);","lastModifiedDate":"2024-03-06"},{"lineNumber":28,"author":{"gitId":"jieqiboh"},"content":" checkArgument(isValidContactName(companyName), MESSAGE_CONSTRAINTS);","lastModifiedDate":"2024-03-06"},{"lineNumber":29,"author":{"gitId":"jieqiboh"},"content":" this.companyName \u003d companyName;","lastModifiedDate":"2024-03-06"},{"lineNumber":30,"author":{"gitId":"jieqiboh"},"content":" }","lastModifiedDate":"2024-03-06"},{"lineNumber":31,"author":{"gitId":"jieqiboh"},"content":"","lastModifiedDate":"2024-03-06"},{"lineNumber":32,"author":{"gitId":"jieqiboh"},"content":" /**","lastModifiedDate":"2024-03-06"},{"lineNumber":33,"author":{"gitId":"jieqiboh"},"content":" * Returns true if a given string is a valid companyName.","lastModifiedDate":"2024-03-06"},{"lineNumber":34,"author":{"gitId":"jieqiboh"},"content":" */","lastModifiedDate":"2024-03-06"},{"lineNumber":35,"author":{"gitId":"jieqiboh"},"content":" public static boolean isValidContactName(String test) {","lastModifiedDate":"2024-03-06"},{"lineNumber":36,"author":{"gitId":"jieqiboh"},"content":" return test.matches(VALIDATION_REGEX);","lastModifiedDate":"2024-03-06"},{"lineNumber":37,"author":{"gitId":"jieqiboh"},"content":" }","lastModifiedDate":"2024-03-06"},{"lineNumber":38,"author":{"gitId":"jieqiboh"},"content":"","lastModifiedDate":"2024-03-06"},{"lineNumber":39,"author":{"gitId":"jieqiboh"},"content":"","lastModifiedDate":"2024-03-06"},{"lineNumber":40,"author":{"gitId":"jieqiboh"},"content":" @Override","lastModifiedDate":"2024-03-06"},{"lineNumber":41,"author":{"gitId":"jieqiboh"},"content":" public String toString() {","lastModifiedDate":"2024-03-06"},{"lineNumber":42,"author":{"gitId":"jieqiboh"},"content":" return companyName;","lastModifiedDate":"2024-03-06"},{"lineNumber":43,"author":{"gitId":"jieqiboh"},"content":" }","lastModifiedDate":"2024-03-06"},{"lineNumber":44,"author":{"gitId":"jieqiboh"},"content":"","lastModifiedDate":"2024-03-06"},{"lineNumber":45,"author":{"gitId":"jieqiboh"},"content":" @Override","lastModifiedDate":"2024-03-06"},{"lineNumber":46,"author":{"gitId":"jieqiboh"},"content":" public boolean equals(Object other) {","lastModifiedDate":"2024-03-06"},{"lineNumber":47,"author":{"gitId":"jieqiboh"},"content":" if (other \u003d\u003d this) {","lastModifiedDate":"2024-03-06"},{"lineNumber":48,"author":{"gitId":"jieqiboh"},"content":" return true;","lastModifiedDate":"2024-03-06"},{"lineNumber":49,"author":{"gitId":"jieqiboh"},"content":" }","lastModifiedDate":"2024-03-06"},{"lineNumber":50,"author":{"gitId":"jieqiboh"},"content":"","lastModifiedDate":"2024-03-06"},{"lineNumber":51,"author":{"gitId":"jieqiboh"},"content":" // instanceof handles nulls","lastModifiedDate":"2024-03-06"},{"lineNumber":52,"author":{"gitId":"jieqiboh"},"content":" if (!(other instanceof CompanyName)) {","lastModifiedDate":"2024-03-06"},{"lineNumber":53,"author":{"gitId":"jieqiboh"},"content":" return false;","lastModifiedDate":"2024-03-06"},{"lineNumber":54,"author":{"gitId":"jieqiboh"},"content":" }","lastModifiedDate":"2024-03-06"},{"lineNumber":55,"author":{"gitId":"jieqiboh"},"content":"","lastModifiedDate":"2024-03-06"},{"lineNumber":56,"author":{"gitId":"jieqiboh"},"content":" CompanyName otherName \u003d (CompanyName) other;","lastModifiedDate":"2024-03-06"},{"lineNumber":57,"author":{"gitId":"jieqiboh"},"content":" return companyName.equals(otherName.companyName);","lastModifiedDate":"2024-03-06"},{"lineNumber":58,"author":{"gitId":"jieqiboh"},"content":" }","lastModifiedDate":"2024-03-06"},{"lineNumber":59,"author":{"gitId":"jieqiboh"},"content":"","lastModifiedDate":"2024-03-06"},{"lineNumber":60,"author":{"gitId":"jieqiboh"},"content":" @Override","lastModifiedDate":"2024-03-06"},{"lineNumber":61,"author":{"gitId":"jieqiboh"},"content":" public int hashCode() {","lastModifiedDate":"2024-03-06"},{"lineNumber":62,"author":{"gitId":"jieqiboh"},"content":" return companyName.hashCode();","lastModifiedDate":"2024-03-06"},{"lineNumber":63,"author":{"gitId":"jieqiboh"},"content":" }","lastModifiedDate":"2024-03-06"},{"lineNumber":64,"author":{"gitId":"jieqiboh"},"content":"}","lastModifiedDate":"2024-03-06"}],"authorContributionMap":{"jieqiboh":64}},{"path":"src/main/java/seedu/address/model/internship/ContactEmail.java","fileType":"functional-code","lines":[{"lineNumber":1,"author":{"gitId":"jieqiboh"},"content":"package seedu.address.model.internship;","lastModifiedDate":"2024-03-06"},{"lineNumber":2,"author":{"gitId":"jieqiboh"},"content":"","lastModifiedDate":"2024-03-06"},{"lineNumber":3,"author":{"gitId":"jieqiboh"},"content":"import static java.util.Objects.requireNonNull;","lastModifiedDate":"2024-03-06"},{"lineNumber":4,"author":{"gitId":"jieqiboh"},"content":"import static seedu.address.commons.util.AppUtil.checkArgument;","lastModifiedDate":"2024-03-06"},{"lineNumber":5,"author":{"gitId":"jieqiboh"},"content":"","lastModifiedDate":"2024-03-06"},{"lineNumber":6,"author":{"gitId":"jieqiboh"},"content":"/**","lastModifiedDate":"2024-03-06"},{"lineNumber":7,"author":{"gitId":"jieqiboh"},"content":" * Represents an Internship Contact\u0027s email in the internship book.","lastModifiedDate":"2024-03-06"},{"lineNumber":8,"author":{"gitId":"jieqiboh"},"content":" */","lastModifiedDate":"2024-03-06"},{"lineNumber":9,"author":{"gitId":"jieqiboh"},"content":"public class ContactEmail {","lastModifiedDate":"2024-03-06"},{"lineNumber":10,"author":{"gitId":"jieqiboh"},"content":"","lastModifiedDate":"2024-03-06"},{"lineNumber":11,"author":{"gitId":"jieqiboh"},"content":" private static final String SPECIAL_CHARACTERS \u003d \"+_.-\";","lastModifiedDate":"2024-03-06"},{"lineNumber":12,"author":{"gitId":"jieqiboh"},"content":" public static final String MESSAGE_CONSTRAINTS \u003d \"Emails should be of the format local-part@domain \"","lastModifiedDate":"2024-03-06"},{"lineNumber":13,"author":{"gitId":"jieqiboh"},"content":" + \"and adhere to the following constraints:\\n\"","lastModifiedDate":"2024-03-06"},{"lineNumber":14,"author":{"gitId":"jieqiboh"},"content":" + \"1. The local-part should only contain alphanumeric characters and these special characters, excluding \"","lastModifiedDate":"2024-03-06"},{"lineNumber":15,"author":{"gitId":"jieqiboh"},"content":" + \"the parentheses, (\" + SPECIAL_CHARACTERS + \"). The local-part may not start or end with any special \"","lastModifiedDate":"2024-03-06"},{"lineNumber":16,"author":{"gitId":"jieqiboh"},"content":" + \"characters.\\n\"","lastModifiedDate":"2024-03-06"},{"lineNumber":17,"author":{"gitId":"jieqiboh"},"content":" + \"2. This is followed by a \u0027@\u0027 and then a domain name. The domain name is made up of domain labels \"","lastModifiedDate":"2024-03-06"},{"lineNumber":18,"author":{"gitId":"jieqiboh"},"content":" + \"separated by periods.\\n\"","lastModifiedDate":"2024-03-06"},{"lineNumber":19,"author":{"gitId":"jieqiboh"},"content":" + \"The domain name must:\\n\"","lastModifiedDate":"2024-03-06"},{"lineNumber":20,"author":{"gitId":"jieqiboh"},"content":" + \" - end with a domain label at least 2 characters long\\n\"","lastModifiedDate":"2024-03-06"},{"lineNumber":21,"author":{"gitId":"jieqiboh"},"content":" + \" - have each domain label start and end with alphanumeric characters\\n\"","lastModifiedDate":"2024-03-06"},{"lineNumber":22,"author":{"gitId":"jieqiboh"},"content":" + \" - have each domain label consist of alphanumeric characters, separated only by hyphens, if any.\";","lastModifiedDate":"2024-03-06"},{"lineNumber":23,"author":{"gitId":"jieqiboh"},"content":" // alphanumeric and special characters","lastModifiedDate":"2024-03-06"},{"lineNumber":24,"author":{"gitId":"jieqiboh"},"content":" private static final String ALPHANUMERIC_NO_UNDERSCORE \u003d \"[^\\\\W_]+\"; // alphanumeric characters except underscore","lastModifiedDate":"2024-03-06"},{"lineNumber":25,"author":{"gitId":"jieqiboh"},"content":" private static final String LOCAL_PART_REGEX \u003d \"^\" + ALPHANUMERIC_NO_UNDERSCORE + \"([\" + SPECIAL_CHARACTERS + \"]\"","lastModifiedDate":"2024-03-06"},{"lineNumber":26,"author":{"gitId":"jieqiboh"},"content":" + ALPHANUMERIC_NO_UNDERSCORE + \")*\";","lastModifiedDate":"2024-03-06"},{"lineNumber":27,"author":{"gitId":"jieqiboh"},"content":" private static final String DOMAIN_PART_REGEX \u003d ALPHANUMERIC_NO_UNDERSCORE","lastModifiedDate":"2024-03-06"},{"lineNumber":28,"author":{"gitId":"jieqiboh"},"content":" + \"(-\" + ALPHANUMERIC_NO_UNDERSCORE + \")*\";","lastModifiedDate":"2024-03-06"},{"lineNumber":29,"author":{"gitId":"jieqiboh"},"content":" private static final String DOMAIN_LAST_PART_REGEX \u003d \"(\" + DOMAIN_PART_REGEX + \"){2,}$\"; // At least two chars","lastModifiedDate":"2024-03-06"},{"lineNumber":30,"author":{"gitId":"jieqiboh"},"content":" private static final String DOMAIN_REGEX \u003d \"(\" + DOMAIN_PART_REGEX + \"\\\\.)*\" + DOMAIN_LAST_PART_REGEX;","lastModifiedDate":"2024-03-06"},{"lineNumber":31,"author":{"gitId":"jieqiboh"},"content":" public static final String VALIDATION_REGEX \u003d LOCAL_PART_REGEX + \"@\" + DOMAIN_REGEX;","lastModifiedDate":"2024-03-06"},{"lineNumber":32,"author":{"gitId":"jieqiboh"},"content":"","lastModifiedDate":"2024-03-06"},{"lineNumber":33,"author":{"gitId":"jieqiboh"},"content":" public final String value;","lastModifiedDate":"2024-03-06"},{"lineNumber":34,"author":{"gitId":"jieqiboh"},"content":"","lastModifiedDate":"2024-03-06"},{"lineNumber":35,"author":{"gitId":"jieqiboh"},"content":" /**","lastModifiedDate":"2024-03-06"},{"lineNumber":36,"author":{"gitId":"jieqiboh"},"content":" * Constructs an {@code ContactEmail}.","lastModifiedDate":"2024-03-06"},{"lineNumber":37,"author":{"gitId":"jieqiboh"},"content":" *","lastModifiedDate":"2024-03-06"},{"lineNumber":38,"author":{"gitId":"jieqiboh"},"content":" * @param contactEmail A valid contactEmail address.","lastModifiedDate":"2024-03-06"},{"lineNumber":39,"author":{"gitId":"jieqiboh"},"content":" */","lastModifiedDate":"2024-03-06"},{"lineNumber":40,"author":{"gitId":"jieqiboh"},"content":" public ContactEmail(String contactEmail) {","lastModifiedDate":"2024-03-06"},{"lineNumber":41,"author":{"gitId":"jieqiboh"},"content":" requireNonNull(contactEmail);","lastModifiedDate":"2024-03-06"},{"lineNumber":42,"author":{"gitId":"jieqiboh"},"content":" checkArgument(isValidEmail(contactEmail), MESSAGE_CONSTRAINTS);","lastModifiedDate":"2024-03-06"},{"lineNumber":43,"author":{"gitId":"jieqiboh"},"content":" value \u003d contactEmail;","lastModifiedDate":"2024-03-06"},{"lineNumber":44,"author":{"gitId":"jieqiboh"},"content":" }","lastModifiedDate":"2024-03-06"},{"lineNumber":45,"author":{"gitId":"jieqiboh"},"content":"","lastModifiedDate":"2024-03-06"},{"lineNumber":46,"author":{"gitId":"jieqiboh"},"content":" /**","lastModifiedDate":"2024-03-06"},{"lineNumber":47,"author":{"gitId":"jieqiboh"},"content":" * Returns if a given string is a valid contactEmail.","lastModifiedDate":"2024-03-06"},{"lineNumber":48,"author":{"gitId":"jieqiboh"},"content":" */","lastModifiedDate":"2024-03-06"},{"lineNumber":49,"author":{"gitId":"jieqiboh"},"content":" public static boolean isValidEmail(String test) {","lastModifiedDate":"2024-03-06"},{"lineNumber":50,"author":{"gitId":"jieqiboh"},"content":" return test.matches(VALIDATION_REGEX);","lastModifiedDate":"2024-03-06"},{"lineNumber":51,"author":{"gitId":"jieqiboh"},"content":" }","lastModifiedDate":"2024-03-06"},{"lineNumber":52,"author":{"gitId":"jieqiboh"},"content":"","lastModifiedDate":"2024-03-06"},{"lineNumber":53,"author":{"gitId":"jieqiboh"},"content":" @Override","lastModifiedDate":"2024-03-06"},{"lineNumber":54,"author":{"gitId":"jieqiboh"},"content":" public String toString() {","lastModifiedDate":"2024-03-06"},{"lineNumber":55,"author":{"gitId":"jieqiboh"},"content":" return value;","lastModifiedDate":"2024-03-06"},{"lineNumber":56,"author":{"gitId":"jieqiboh"},"content":" }","lastModifiedDate":"2024-03-06"},{"lineNumber":57,"author":{"gitId":"jieqiboh"},"content":"","lastModifiedDate":"2024-03-06"},{"lineNumber":58,"author":{"gitId":"jieqiboh"},"content":" @Override","lastModifiedDate":"2024-03-06"},{"lineNumber":59,"author":{"gitId":"jieqiboh"},"content":" public boolean equals(Object other) {","lastModifiedDate":"2024-03-06"},{"lineNumber":60,"author":{"gitId":"jieqiboh"},"content":" if (other \u003d\u003d this) {","lastModifiedDate":"2024-03-06"},{"lineNumber":61,"author":{"gitId":"jieqiboh"},"content":" return true;","lastModifiedDate":"2024-03-06"},{"lineNumber":62,"author":{"gitId":"jieqiboh"},"content":" }","lastModifiedDate":"2024-03-06"},{"lineNumber":63,"author":{"gitId":"jieqiboh"},"content":"","lastModifiedDate":"2024-03-06"},{"lineNumber":64,"author":{"gitId":"jieqiboh"},"content":" // instanceof handles nulls","lastModifiedDate":"2024-03-06"},{"lineNumber":65,"author":{"gitId":"jieqiboh"},"content":" if (!(other instanceof ContactEmail)) {","lastModifiedDate":"2024-03-06"},{"lineNumber":66,"author":{"gitId":"jieqiboh"},"content":" return false;","lastModifiedDate":"2024-03-06"},{"lineNumber":67,"author":{"gitId":"jieqiboh"},"content":" }","lastModifiedDate":"2024-03-06"},{"lineNumber":68,"author":{"gitId":"jieqiboh"},"content":"","lastModifiedDate":"2024-03-06"},{"lineNumber":69,"author":{"gitId":"jieqiboh"},"content":" ContactEmail otherEmail \u003d (ContactEmail) other;","lastModifiedDate":"2024-03-06"},{"lineNumber":70,"author":{"gitId":"jieqiboh"},"content":" return value.equals(otherEmail.value);","lastModifiedDate":"2024-03-06"},{"lineNumber":71,"author":{"gitId":"jieqiboh"},"content":" }","lastModifiedDate":"2024-03-06"},{"lineNumber":72,"author":{"gitId":"jieqiboh"},"content":"","lastModifiedDate":"2024-03-06"},{"lineNumber":73,"author":{"gitId":"jieqiboh"},"content":" @Override","lastModifiedDate":"2024-03-06"},{"lineNumber":74,"author":{"gitId":"jieqiboh"},"content":" public int hashCode() {","lastModifiedDate":"2024-03-06"},{"lineNumber":75,"author":{"gitId":"jieqiboh"},"content":" return value.hashCode();","lastModifiedDate":"2024-03-06"},{"lineNumber":76,"author":{"gitId":"jieqiboh"},"content":" }","lastModifiedDate":"2024-03-06"},{"lineNumber":77,"author":{"gitId":"jieqiboh"},"content":"}","lastModifiedDate":"2024-03-06"}],"authorContributionMap":{"jieqiboh":77}},{"path":"src/main/java/seedu/address/model/internship/ContactName.java","fileType":"functional-code","lines":[{"lineNumber":1,"author":{"gitId":"jieqiboh"},"content":"package seedu.address.model.internship;","lastModifiedDate":"2024-03-06"},{"lineNumber":2,"author":{"gitId":"jieqiboh"},"content":"","lastModifiedDate":"2024-03-06"},{"lineNumber":3,"author":{"gitId":"jieqiboh"},"content":"import static java.util.Objects.requireNonNull;","lastModifiedDate":"2024-03-06"},{"lineNumber":4,"author":{"gitId":"jieqiboh"},"content":"import static seedu.address.commons.util.AppUtil.checkArgument;","lastModifiedDate":"2024-03-06"},{"lineNumber":5,"author":{"gitId":"jieqiboh"},"content":"","lastModifiedDate":"2024-03-06"},{"lineNumber":6,"author":{"gitId":"jieqiboh"},"content":"/**","lastModifiedDate":"2024-03-06"},{"lineNumber":7,"author":{"gitId":"jieqiboh"},"content":" * Represents a Company Contact\u0027s name in the address book.","lastModifiedDate":"2024-03-06"},{"lineNumber":8,"author":{"gitId":"jieqiboh"},"content":" * Guarantees: immutable; is valid as declared in {@link #isValidContactName(String)}","lastModifiedDate":"2024-03-06"},{"lineNumber":9,"author":{"gitId":"jieqiboh"},"content":" */","lastModifiedDate":"2024-03-06"},{"lineNumber":10,"author":{"gitId":"jieqiboh"},"content":"public class ContactName {","lastModifiedDate":"2024-03-06"},{"lineNumber":11,"author":{"gitId":"jieqiboh"},"content":"","lastModifiedDate":"2024-03-06"},{"lineNumber":12,"author":{"gitId":"jieqiboh"},"content":" public static final String MESSAGE_CONSTRAINTS \u003d","lastModifiedDate":"2024-03-06"},{"lineNumber":13,"author":{"gitId":"jieqiboh"},"content":" \"Names should only contain alphanumeric characters and spaces, and it should not be blank\";","lastModifiedDate":"2024-03-06"},{"lineNumber":14,"author":{"gitId":"jieqiboh"},"content":"","lastModifiedDate":"2024-03-06"},{"lineNumber":15,"author":{"gitId":"jieqiboh"},"content":" /*","lastModifiedDate":"2024-03-06"},{"lineNumber":16,"author":{"gitId":"jieqiboh"},"content":" * The first character of the address must not be a whitespace,","lastModifiedDate":"2024-03-06"},{"lineNumber":17,"author":{"gitId":"jieqiboh"},"content":" * otherwise \" \" (a blank string) becomes a valid input.","lastModifiedDate":"2024-03-06"},{"lineNumber":18,"author":{"gitId":"jieqiboh"},"content":" */","lastModifiedDate":"2024-03-06"},{"lineNumber":19,"author":{"gitId":"jieqiboh"},"content":" public static final String VALIDATION_REGEX \u003d \"[\\\\p{Alnum}][\\\\p{Alnum} ]*\";","lastModifiedDate":"2024-03-06"},{"lineNumber":20,"author":{"gitId":"jieqiboh"},"content":"","lastModifiedDate":"2024-03-06"},{"lineNumber":21,"author":{"gitId":"jieqiboh"},"content":" public final String contactName;","lastModifiedDate":"2024-03-06"},{"lineNumber":22,"author":{"gitId":"jieqiboh"},"content":"","lastModifiedDate":"2024-03-06"},{"lineNumber":23,"author":{"gitId":"jieqiboh"},"content":" /**","lastModifiedDate":"2024-03-06"},{"lineNumber":24,"author":{"gitId":"jieqiboh"},"content":" * Constructs a {@code ContactName}.","lastModifiedDate":"2024-03-06"},{"lineNumber":25,"author":{"gitId":"jieqiboh"},"content":" *","lastModifiedDate":"2024-03-06"},{"lineNumber":26,"author":{"gitId":"jieqiboh"},"content":" * @param contactName A valid contactName.","lastModifiedDate":"2024-03-06"},{"lineNumber":27,"author":{"gitId":"jieqiboh"},"content":" */","lastModifiedDate":"2024-03-06"},{"lineNumber":28,"author":{"gitId":"jieqiboh"},"content":" public ContactName(String contactName) {","lastModifiedDate":"2024-03-06"},{"lineNumber":29,"author":{"gitId":"jieqiboh"},"content":" requireNonNull(contactName);","lastModifiedDate":"2024-03-06"},{"lineNumber":30,"author":{"gitId":"jieqiboh"},"content":" checkArgument(isValidContactName(contactName), MESSAGE_CONSTRAINTS);","lastModifiedDate":"2024-03-06"},{"lineNumber":31,"author":{"gitId":"jieqiboh"},"content":" this.contactName \u003d contactName;","lastModifiedDate":"2024-03-06"},{"lineNumber":32,"author":{"gitId":"jieqiboh"},"content":" }","lastModifiedDate":"2024-03-06"},{"lineNumber":33,"author":{"gitId":"jieqiboh"},"content":"","lastModifiedDate":"2024-03-06"},{"lineNumber":34,"author":{"gitId":"jieqiboh"},"content":" /**","lastModifiedDate":"2024-03-06"},{"lineNumber":35,"author":{"gitId":"jieqiboh"},"content":" * Returns true if a given string is a valid contactName.","lastModifiedDate":"2024-03-06"},{"lineNumber":36,"author":{"gitId":"jieqiboh"},"content":" */","lastModifiedDate":"2024-03-06"},{"lineNumber":37,"author":{"gitId":"jieqiboh"},"content":" public static boolean isValidContactName(String test) {","lastModifiedDate":"2024-03-06"},{"lineNumber":38,"author":{"gitId":"jieqiboh"},"content":" return test.matches(VALIDATION_REGEX);","lastModifiedDate":"2024-03-06"},{"lineNumber":39,"author":{"gitId":"jieqiboh"},"content":" }","lastModifiedDate":"2024-03-06"},{"lineNumber":40,"author":{"gitId":"jieqiboh"},"content":"","lastModifiedDate":"2024-03-06"},{"lineNumber":41,"author":{"gitId":"jieqiboh"},"content":"","lastModifiedDate":"2024-03-06"},{"lineNumber":42,"author":{"gitId":"jieqiboh"},"content":" @Override","lastModifiedDate":"2024-03-06"},{"lineNumber":43,"author":{"gitId":"jieqiboh"},"content":" public String toString() {","lastModifiedDate":"2024-03-06"},{"lineNumber":44,"author":{"gitId":"jieqiboh"},"content":" return contactName;","lastModifiedDate":"2024-03-06"},{"lineNumber":45,"author":{"gitId":"jieqiboh"},"content":" }","lastModifiedDate":"2024-03-06"},{"lineNumber":46,"author":{"gitId":"jieqiboh"},"content":"","lastModifiedDate":"2024-03-06"},{"lineNumber":47,"author":{"gitId":"jieqiboh"},"content":" @Override","lastModifiedDate":"2024-03-06"},{"lineNumber":48,"author":{"gitId":"jieqiboh"},"content":" public boolean equals(Object other) {","lastModifiedDate":"2024-03-06"},{"lineNumber":49,"author":{"gitId":"jieqiboh"},"content":" if (other \u003d\u003d this) {","lastModifiedDate":"2024-03-06"},{"lineNumber":50,"author":{"gitId":"jieqiboh"},"content":" return true;","lastModifiedDate":"2024-03-06"},{"lineNumber":51,"author":{"gitId":"jieqiboh"},"content":" }","lastModifiedDate":"2024-03-06"},{"lineNumber":52,"author":{"gitId":"jieqiboh"},"content":"","lastModifiedDate":"2024-03-06"},{"lineNumber":53,"author":{"gitId":"jieqiboh"},"content":" // instanceof handles nulls","lastModifiedDate":"2024-03-06"},{"lineNumber":54,"author":{"gitId":"jieqiboh"},"content":" if (!(other instanceof ContactName)) {","lastModifiedDate":"2024-03-06"},{"lineNumber":55,"author":{"gitId":"jieqiboh"},"content":" return false;","lastModifiedDate":"2024-03-06"},{"lineNumber":56,"author":{"gitId":"jieqiboh"},"content":" }","lastModifiedDate":"2024-03-06"},{"lineNumber":57,"author":{"gitId":"jieqiboh"},"content":"","lastModifiedDate":"2024-03-06"},{"lineNumber":58,"author":{"gitId":"jieqiboh"},"content":" ContactName otherName \u003d (ContactName) other;","lastModifiedDate":"2024-03-06"},{"lineNumber":59,"author":{"gitId":"jieqiboh"},"content":" return contactName.equals(otherName.contactName);","lastModifiedDate":"2024-03-06"},{"lineNumber":60,"author":{"gitId":"jieqiboh"},"content":" }","lastModifiedDate":"2024-03-06"},{"lineNumber":61,"author":{"gitId":"jieqiboh"},"content":"","lastModifiedDate":"2024-03-06"},{"lineNumber":62,"author":{"gitId":"jieqiboh"},"content":" @Override","lastModifiedDate":"2024-03-06"},{"lineNumber":63,"author":{"gitId":"jieqiboh"},"content":" public int hashCode() {","lastModifiedDate":"2024-03-06"},{"lineNumber":64,"author":{"gitId":"jieqiboh"},"content":" return contactName.hashCode();","lastModifiedDate":"2024-03-06"},{"lineNumber":65,"author":{"gitId":"jieqiboh"},"content":" }","lastModifiedDate":"2024-03-06"},{"lineNumber":66,"author":{"gitId":"jieqiboh"},"content":"}","lastModifiedDate":"2024-03-06"}],"authorContributionMap":{"jieqiboh":66}},{"path":"src/main/java/seedu/address/model/internship/ContactNumber.java","fileType":"functional-code","lines":[{"lineNumber":1,"author":{"gitId":"jieqiboh"},"content":"package seedu.address.model.internship;","lastModifiedDate":"2024-03-06"},{"lineNumber":2,"author":{"gitId":"jieqiboh"},"content":"","lastModifiedDate":"2024-03-06"},{"lineNumber":3,"author":{"gitId":"jieqiboh"},"content":"import static java.util.Objects.requireNonNull;","lastModifiedDate":"2024-03-06"},{"lineNumber":4,"author":{"gitId":"jieqiboh"},"content":"import static seedu.address.commons.util.AppUtil.checkArgument;","lastModifiedDate":"2024-03-06"},{"lineNumber":5,"author":{"gitId":"jieqiboh"},"content":"","lastModifiedDate":"2024-03-06"},{"lineNumber":6,"author":{"gitId":"jieqiboh"},"content":"/**","lastModifiedDate":"2024-03-06"},{"lineNumber":7,"author":{"gitId":"jieqiboh"},"content":" * Represents an Internship Contact\u0027s contactNumber in the internship book.","lastModifiedDate":"2024-03-06"},{"lineNumber":8,"author":{"gitId":"jieqiboh"},"content":" * Guarantees: immutable; is valid as declared in {@link #isValidContactNumber(String)}","lastModifiedDate":"2024-03-06"},{"lineNumber":9,"author":{"gitId":"jieqiboh"},"content":" */","lastModifiedDate":"2024-03-06"},{"lineNumber":10,"author":{"gitId":"jieqiboh"},"content":"","lastModifiedDate":"2024-03-06"},{"lineNumber":11,"author":{"gitId":"jieqiboh"},"content":"public class ContactNumber {","lastModifiedDate":"2024-03-06"},{"lineNumber":12,"author":{"gitId":"jieqiboh"},"content":" public static final String MESSAGE_CONSTRAINTS \u003d","lastModifiedDate":"2024-03-06"},{"lineNumber":13,"author":{"gitId":"jieqiboh"},"content":" \"ContactNumber should only contain numbers, and it should be at least 3 digits long\";","lastModifiedDate":"2024-03-06"},{"lineNumber":14,"author":{"gitId":"jieqiboh"},"content":" public static final String VALIDATION_REGEX \u003d \"\\\\d{3,}\";","lastModifiedDate":"2024-03-06"},{"lineNumber":15,"author":{"gitId":"jieqiboh"},"content":" public final String value;","lastModifiedDate":"2024-03-06"},{"lineNumber":16,"author":{"gitId":"jieqiboh"},"content":"","lastModifiedDate":"2024-03-06"},{"lineNumber":17,"author":{"gitId":"jieqiboh"},"content":" /**","lastModifiedDate":"2024-03-06"},{"lineNumber":18,"author":{"gitId":"jieqiboh"},"content":" * Constructs a {@code ContactNumber}.","lastModifiedDate":"2024-03-06"},{"lineNumber":19,"author":{"gitId":"jieqiboh"},"content":" *","lastModifiedDate":"2024-03-06"},{"lineNumber":20,"author":{"gitId":"jieqiboh"},"content":" * @param contactNumber A valid contactNumber.","lastModifiedDate":"2024-03-06"},{"lineNumber":21,"author":{"gitId":"jieqiboh"},"content":" */","lastModifiedDate":"2024-03-06"},{"lineNumber":22,"author":{"gitId":"jieqiboh"},"content":" public ContactNumber(String contactNumber) {","lastModifiedDate":"2024-03-06"},{"lineNumber":23,"author":{"gitId":"jieqiboh"},"content":" requireNonNull(contactNumber);","lastModifiedDate":"2024-03-06"},{"lineNumber":24,"author":{"gitId":"jieqiboh"},"content":" checkArgument(isValidContactNumber(contactNumber), MESSAGE_CONSTRAINTS);","lastModifiedDate":"2024-03-06"},{"lineNumber":25,"author":{"gitId":"jieqiboh"},"content":" value \u003d contactNumber;","lastModifiedDate":"2024-03-06"},{"lineNumber":26,"author":{"gitId":"jieqiboh"},"content":" }","lastModifiedDate":"2024-03-06"},{"lineNumber":27,"author":{"gitId":"jieqiboh"},"content":"","lastModifiedDate":"2024-03-06"},{"lineNumber":28,"author":{"gitId":"jieqiboh"},"content":" /**","lastModifiedDate":"2024-03-06"},{"lineNumber":29,"author":{"gitId":"jieqiboh"},"content":" * Returns true if a given string is a valid contactNumber.","lastModifiedDate":"2024-03-06"},{"lineNumber":30,"author":{"gitId":"jieqiboh"},"content":" */","lastModifiedDate":"2024-03-06"},{"lineNumber":31,"author":{"gitId":"jieqiboh"},"content":" public static boolean isValidContactNumber(String test) {","lastModifiedDate":"2024-03-06"},{"lineNumber":32,"author":{"gitId":"jieqiboh"},"content":" return test.matches(VALIDATION_REGEX);","lastModifiedDate":"2024-03-06"},{"lineNumber":33,"author":{"gitId":"jieqiboh"},"content":" }","lastModifiedDate":"2024-03-06"},{"lineNumber":34,"author":{"gitId":"jieqiboh"},"content":"","lastModifiedDate":"2024-03-06"},{"lineNumber":35,"author":{"gitId":"jieqiboh"},"content":" @Override","lastModifiedDate":"2024-03-06"},{"lineNumber":36,"author":{"gitId":"jieqiboh"},"content":" public String toString() {","lastModifiedDate":"2024-03-06"},{"lineNumber":37,"author":{"gitId":"jieqiboh"},"content":" return value;","lastModifiedDate":"2024-03-06"},{"lineNumber":38,"author":{"gitId":"jieqiboh"},"content":" }","lastModifiedDate":"2024-03-06"},{"lineNumber":39,"author":{"gitId":"jieqiboh"},"content":"","lastModifiedDate":"2024-03-06"},{"lineNumber":40,"author":{"gitId":"jieqiboh"},"content":" @Override","lastModifiedDate":"2024-03-06"},{"lineNumber":41,"author":{"gitId":"jieqiboh"},"content":" public boolean equals(Object other) {","lastModifiedDate":"2024-03-06"},{"lineNumber":42,"author":{"gitId":"jieqiboh"},"content":" if (other \u003d\u003d this) {","lastModifiedDate":"2024-03-06"},{"lineNumber":43,"author":{"gitId":"jieqiboh"},"content":" return true;","lastModifiedDate":"2024-03-06"},{"lineNumber":44,"author":{"gitId":"jieqiboh"},"content":" }","lastModifiedDate":"2024-03-06"},{"lineNumber":45,"author":{"gitId":"jieqiboh"},"content":"","lastModifiedDate":"2024-03-06"},{"lineNumber":46,"author":{"gitId":"jieqiboh"},"content":" // instanceof handles nulls","lastModifiedDate":"2024-03-06"},{"lineNumber":47,"author":{"gitId":"jieqiboh"},"content":" if (!(other instanceof seedu.address.model.internship.ContactNumber)) {","lastModifiedDate":"2024-03-06"},{"lineNumber":48,"author":{"gitId":"jieqiboh"},"content":" return false;","lastModifiedDate":"2024-03-06"},{"lineNumber":49,"author":{"gitId":"jieqiboh"},"content":" }","lastModifiedDate":"2024-03-06"},{"lineNumber":50,"author":{"gitId":"jieqiboh"},"content":"","lastModifiedDate":"2024-03-06"},{"lineNumber":51,"author":{"gitId":"jieqiboh"},"content":" seedu.address.model.internship.ContactNumber otherContactNumber \u003d","lastModifiedDate":"2024-03-06"},{"lineNumber":52,"author":{"gitId":"jieqiboh"},"content":" (seedu.address.model.internship.ContactNumber) other;","lastModifiedDate":"2024-03-06"},{"lineNumber":53,"author":{"gitId":"jieqiboh"},"content":" return value.equals(otherContactNumber.value);","lastModifiedDate":"2024-03-06"},{"lineNumber":54,"author":{"gitId":"jieqiboh"},"content":" }","lastModifiedDate":"2024-03-06"},{"lineNumber":55,"author":{"gitId":"jieqiboh"},"content":"","lastModifiedDate":"2024-03-06"},{"lineNumber":56,"author":{"gitId":"jieqiboh"},"content":" @Override","lastModifiedDate":"2024-03-06"},{"lineNumber":57,"author":{"gitId":"jieqiboh"},"content":" public int hashCode() {","lastModifiedDate":"2024-03-06"},{"lineNumber":58,"author":{"gitId":"jieqiboh"},"content":" return value.hashCode();","lastModifiedDate":"2024-03-06"},{"lineNumber":59,"author":{"gitId":"jieqiboh"},"content":" }","lastModifiedDate":"2024-03-06"},{"lineNumber":60,"author":{"gitId":"jieqiboh"},"content":"}","lastModifiedDate":"2024-03-06"},{"lineNumber":61,"author":{"gitId":"jieqiboh"},"content":"","lastModifiedDate":"2024-03-06"}],"authorContributionMap":{"jieqiboh":61}},{"path":"src/main/java/seedu/address/model/internship/Description.java","fileType":"functional-code","lines":[{"lineNumber":1,"author":{"gitId":"jieqiboh"},"content":"package seedu.address.model.internship;","lastModifiedDate":"2024-03-06"},{"lineNumber":2,"author":{"gitId":"jieqiboh"},"content":"","lastModifiedDate":"2024-03-06"},{"lineNumber":3,"author":{"gitId":"jieqiboh"},"content":"import static java.util.Objects.requireNonNull;","lastModifiedDate":"2024-03-06"},{"lineNumber":4,"author":{"gitId":"jieqiboh"},"content":"","lastModifiedDate":"2024-03-06"},{"lineNumber":5,"author":{"gitId":"jieqiboh"},"content":"/**","lastModifiedDate":"2024-03-06"},{"lineNumber":6,"author":{"gitId":"jieqiboh"},"content":" * Represents an Internship\u0027s description in the internship book.","lastModifiedDate":"2024-03-06"},{"lineNumber":7,"author":{"gitId":"jieqiboh"},"content":" */","lastModifiedDate":"2024-03-06"},{"lineNumber":8,"author":{"gitId":"jieqiboh"},"content":"public class Description {","lastModifiedDate":"2024-03-06"},{"lineNumber":9,"author":{"gitId":"jieqiboh"},"content":"","lastModifiedDate":"2024-03-06"},{"lineNumber":10,"author":{"gitId":"jieqiboh"},"content":" public final String description;","lastModifiedDate":"2024-03-06"},{"lineNumber":11,"author":{"gitId":"jieqiboh"},"content":"","lastModifiedDate":"2024-03-06"},{"lineNumber":12,"author":{"gitId":"jieqiboh"},"content":" /**","lastModifiedDate":"2024-03-06"},{"lineNumber":13,"author":{"gitId":"jieqiboh"},"content":" * Constructs a {@code Description}.","lastModifiedDate":"2024-03-06"},{"lineNumber":14,"author":{"gitId":"jieqiboh"},"content":" *","lastModifiedDate":"2024-03-06"},{"lineNumber":15,"author":{"gitId":"jieqiboh"},"content":" * @param description A valid description.","lastModifiedDate":"2024-03-06"},{"lineNumber":16,"author":{"gitId":"jieqiboh"},"content":" */","lastModifiedDate":"2024-03-06"},{"lineNumber":17,"author":{"gitId":"jieqiboh"},"content":" public Description(String description) {","lastModifiedDate":"2024-03-06"},{"lineNumber":18,"author":{"gitId":"jieqiboh"},"content":" requireNonNull(description);","lastModifiedDate":"2024-03-06"},{"lineNumber":19,"author":{"gitId":"jieqiboh"},"content":" this.description \u003d description;","lastModifiedDate":"2024-03-06"},{"lineNumber":20,"author":{"gitId":"jieqiboh"},"content":" }","lastModifiedDate":"2024-03-06"},{"lineNumber":21,"author":{"gitId":"jieqiboh"},"content":"","lastModifiedDate":"2024-03-06"},{"lineNumber":22,"author":{"gitId":"jieqiboh"},"content":" @Override","lastModifiedDate":"2024-03-06"},{"lineNumber":23,"author":{"gitId":"jieqiboh"},"content":" public String toString() {","lastModifiedDate":"2024-03-06"},{"lineNumber":24,"author":{"gitId":"jieqiboh"},"content":" return description;","lastModifiedDate":"2024-03-06"},{"lineNumber":25,"author":{"gitId":"jieqiboh"},"content":" }","lastModifiedDate":"2024-03-06"},{"lineNumber":26,"author":{"gitId":"jieqiboh"},"content":"","lastModifiedDate":"2024-03-06"},{"lineNumber":27,"author":{"gitId":"jieqiboh"},"content":" @Override","lastModifiedDate":"2024-03-06"},{"lineNumber":28,"author":{"gitId":"jieqiboh"},"content":" public boolean equals(Object other) {","lastModifiedDate":"2024-03-06"},{"lineNumber":29,"author":{"gitId":"jieqiboh"},"content":" if (other \u003d\u003d this) {","lastModifiedDate":"2024-03-06"},{"lineNumber":30,"author":{"gitId":"jieqiboh"},"content":" return true;","lastModifiedDate":"2024-03-06"},{"lineNumber":31,"author":{"gitId":"jieqiboh"},"content":" }","lastModifiedDate":"2024-03-06"},{"lineNumber":32,"author":{"gitId":"jieqiboh"},"content":"","lastModifiedDate":"2024-03-06"},{"lineNumber":33,"author":{"gitId":"jieqiboh"},"content":" // instanceof handles nulls","lastModifiedDate":"2024-03-06"},{"lineNumber":34,"author":{"gitId":"jieqiboh"},"content":" if (!(other instanceof Description)) {","lastModifiedDate":"2024-03-06"},{"lineNumber":35,"author":{"gitId":"jieqiboh"},"content":" return false;","lastModifiedDate":"2024-03-06"},{"lineNumber":36,"author":{"gitId":"jieqiboh"},"content":" }","lastModifiedDate":"2024-03-06"},{"lineNumber":37,"author":{"gitId":"jieqiboh"},"content":"","lastModifiedDate":"2024-03-06"},{"lineNumber":38,"author":{"gitId":"jieqiboh"},"content":" Description otherName \u003d (Description) other;","lastModifiedDate":"2024-03-06"},{"lineNumber":39,"author":{"gitId":"jieqiboh"},"content":" return description.equals(otherName.description);","lastModifiedDate":"2024-03-06"},{"lineNumber":40,"author":{"gitId":"jieqiboh"},"content":" }","lastModifiedDate":"2024-03-06"},{"lineNumber":41,"author":{"gitId":"jieqiboh"},"content":"","lastModifiedDate":"2024-03-06"},{"lineNumber":42,"author":{"gitId":"jieqiboh"},"content":" @Override","lastModifiedDate":"2024-03-06"},{"lineNumber":43,"author":{"gitId":"jieqiboh"},"content":" public int hashCode() {","lastModifiedDate":"2024-03-06"},{"lineNumber":44,"author":{"gitId":"jieqiboh"},"content":" return description.hashCode();","lastModifiedDate":"2024-03-06"},{"lineNumber":45,"author":{"gitId":"jieqiboh"},"content":" }","lastModifiedDate":"2024-03-06"},{"lineNumber":46,"author":{"gitId":"jieqiboh"},"content":"}","lastModifiedDate":"2024-03-06"}],"authorContributionMap":{"jieqiboh":46}},{"path":"src/main/java/seedu/address/model/internship/Internship.java","fileType":"functional-code","lines":[{"lineNumber":1,"author":{"gitId":"jieqiboh"},"content":"package seedu.address.model.internship;","lastModifiedDate":"2024-03-06"},{"lineNumber":2,"author":{"gitId":"jieqiboh"},"content":"","lastModifiedDate":"2024-03-06"},{"lineNumber":3,"author":{"gitId":"jieqiboh"},"content":"import static seedu.address.commons.util.CollectionUtil.requireAllNonNull;","lastModifiedDate":"2024-03-06"},{"lineNumber":4,"author":{"gitId":"jieqiboh"},"content":"","lastModifiedDate":"2024-03-06"},{"lineNumber":5,"author":{"gitId":"jieqiboh"},"content":"import java.util.Objects;","lastModifiedDate":"2024-03-06"},{"lineNumber":6,"author":{"gitId":"jieqiboh"},"content":"","lastModifiedDate":"2024-03-06"},{"lineNumber":7,"author":{"gitId":"jieqiboh"},"content":"import seedu.address.commons.util.ToStringBuilder;","lastModifiedDate":"2024-03-06"},{"lineNumber":8,"author":{"gitId":"jieqiboh"},"content":"","lastModifiedDate":"2024-03-06"},{"lineNumber":9,"author":{"gitId":"jieqiboh"},"content":"/**","lastModifiedDate":"2024-03-06"},{"lineNumber":10,"author":{"gitId":"jieqiboh"},"content":" * Represents an Internship in the internship book.","lastModifiedDate":"2024-03-06"},{"lineNumber":11,"author":{"gitId":"jieqiboh"},"content":" * Guarantees: details are present and not null, field values are validated, immutable.","lastModifiedDate":"2024-03-06"},{"lineNumber":12,"author":{"gitId":"jieqiboh"},"content":" */","lastModifiedDate":"2024-03-06"},{"lineNumber":13,"author":{"gitId":"jieqiboh"},"content":"public class Internship {","lastModifiedDate":"2024-03-06"},{"lineNumber":14,"author":{"gitId":"jieqiboh"},"content":" // Identity fields","lastModifiedDate":"2024-03-06"},{"lineNumber":15,"author":{"gitId":"jieqiboh"},"content":" private final CompanyName companyName;","lastModifiedDate":"2024-03-06"},{"lineNumber":16,"author":{"gitId":"jieqiboh"},"content":" private final Location location;","lastModifiedDate":"2024-03-06"},{"lineNumber":17,"author":{"gitId":"jieqiboh"},"content":" private final Description description;","lastModifiedDate":"2024-03-06"},{"lineNumber":18,"author":{"gitId":"jieqiboh"},"content":" private final Role role;","lastModifiedDate":"2024-03-06"},{"lineNumber":19,"author":{"gitId":"jieqiboh"},"content":"","lastModifiedDate":"2024-03-06"},{"lineNumber":20,"author":{"gitId":"jieqiboh"},"content":" // Data fields","lastModifiedDate":"2024-03-06"},{"lineNumber":21,"author":{"gitId":"jieqiboh"},"content":" private final ContactName contactName;","lastModifiedDate":"2024-03-06"},{"lineNumber":22,"author":{"gitId":"jieqiboh"},"content":" private final ContactEmail contactEmail;","lastModifiedDate":"2024-03-06"},{"lineNumber":23,"author":{"gitId":"jieqiboh"},"content":" private final ContactNumber contactNumber;","lastModifiedDate":"2024-03-06"},{"lineNumber":24,"author":{"gitId":"jieqiboh"},"content":" private final ApplicationStatus applicationStatus;","lastModifiedDate":"2024-03-06"},{"lineNumber":25,"author":{"gitId":"jieqiboh"},"content":" /**","lastModifiedDate":"2024-03-06"},{"lineNumber":26,"author":{"gitId":"jieqiboh"},"content":" * Every field must be present and not null.","lastModifiedDate":"2024-03-06"},{"lineNumber":27,"author":{"gitId":"jieqiboh"},"content":" */","lastModifiedDate":"2024-03-06"},{"lineNumber":28,"author":{"gitId":"jieqiboh"},"content":" public Internship(CompanyName companyName, ContactName contactName, ContactEmail contactEmail,","lastModifiedDate":"2024-03-06"},{"lineNumber":29,"author":{"gitId":"jieqiboh"},"content":" ContactNumber contactNumber, Location location, ApplicationStatus applicationStatus,","lastModifiedDate":"2024-03-06"},{"lineNumber":30,"author":{"gitId":"jieqiboh"},"content":" Description description, Role role) {","lastModifiedDate":"2024-03-06"},{"lineNumber":31,"author":{"gitId":"jieqiboh"},"content":" requireAllNonNull(companyName, contactName, contactEmail, contactNumber, location, applicationStatus,","lastModifiedDate":"2024-03-06"},{"lineNumber":32,"author":{"gitId":"jieqiboh"},"content":" description, role);","lastModifiedDate":"2024-03-06"},{"lineNumber":33,"author":{"gitId":"jieqiboh"},"content":" this.companyName \u003d companyName;","lastModifiedDate":"2024-03-06"},{"lineNumber":34,"author":{"gitId":"jieqiboh"},"content":" this.contactName \u003d contactName;","lastModifiedDate":"2024-03-06"},{"lineNumber":35,"author":{"gitId":"jieqiboh"},"content":" this.contactEmail \u003d contactEmail;","lastModifiedDate":"2024-03-06"},{"lineNumber":36,"author":{"gitId":"jieqiboh"},"content":" this.contactNumber \u003d contactNumber;","lastModifiedDate":"2024-03-06"},{"lineNumber":37,"author":{"gitId":"jieqiboh"},"content":" this.location \u003d location;","lastModifiedDate":"2024-03-06"},{"lineNumber":38,"author":{"gitId":"jieqiboh"},"content":" this.applicationStatus \u003d applicationStatus;","lastModifiedDate":"2024-03-06"},{"lineNumber":39,"author":{"gitId":"jieqiboh"},"content":" this.description \u003d description;","lastModifiedDate":"2024-03-06"},{"lineNumber":40,"author":{"gitId":"jieqiboh"},"content":" this.role \u003d role;","lastModifiedDate":"2024-03-06"},{"lineNumber":41,"author":{"gitId":"jieqiboh"},"content":" }","lastModifiedDate":"2024-03-06"},{"lineNumber":42,"author":{"gitId":"jieqiboh"},"content":"","lastModifiedDate":"2024-03-06"},{"lineNumber":43,"author":{"gitId":"jieqiboh"},"content":" public CompanyName getCompanyName() {","lastModifiedDate":"2024-03-06"},{"lineNumber":44,"author":{"gitId":"jieqiboh"},"content":" return companyName;","lastModifiedDate":"2024-03-06"},{"lineNumber":45,"author":{"gitId":"jieqiboh"},"content":" }","lastModifiedDate":"2024-03-06"},{"lineNumber":46,"author":{"gitId":"jieqiboh"},"content":"","lastModifiedDate":"2024-03-06"},{"lineNumber":47,"author":{"gitId":"jieqiboh"},"content":" public ContactName getContactName() {","lastModifiedDate":"2024-03-06"},{"lineNumber":48,"author":{"gitId":"jieqiboh"},"content":" return contactName;","lastModifiedDate":"2024-03-06"},{"lineNumber":49,"author":{"gitId":"jieqiboh"},"content":" }","lastModifiedDate":"2024-03-06"},{"lineNumber":50,"author":{"gitId":"jieqiboh"},"content":"","lastModifiedDate":"2024-03-06"},{"lineNumber":51,"author":{"gitId":"jieqiboh"},"content":" public ContactEmail getContactEmail() {","lastModifiedDate":"2024-03-06"},{"lineNumber":52,"author":{"gitId":"jieqiboh"},"content":" return contactEmail;","lastModifiedDate":"2024-03-06"},{"lineNumber":53,"author":{"gitId":"jieqiboh"},"content":" }","lastModifiedDate":"2024-03-06"},{"lineNumber":54,"author":{"gitId":"jieqiboh"},"content":"","lastModifiedDate":"2024-03-06"},{"lineNumber":55,"author":{"gitId":"jieqiboh"},"content":" public ContactNumber getContactNumber() {","lastModifiedDate":"2024-03-06"},{"lineNumber":56,"author":{"gitId":"jieqiboh"},"content":" return contactNumber;","lastModifiedDate":"2024-03-06"},{"lineNumber":57,"author":{"gitId":"jieqiboh"},"content":" }","lastModifiedDate":"2024-03-06"},{"lineNumber":58,"author":{"gitId":"jieqiboh"},"content":"","lastModifiedDate":"2024-03-06"},{"lineNumber":59,"author":{"gitId":"jieqiboh"},"content":" public Location getLocation() {","lastModifiedDate":"2024-03-06"},{"lineNumber":60,"author":{"gitId":"jieqiboh"},"content":" return location;","lastModifiedDate":"2024-03-06"},{"lineNumber":61,"author":{"gitId":"jieqiboh"},"content":" }","lastModifiedDate":"2024-03-06"},{"lineNumber":62,"author":{"gitId":"jieqiboh"},"content":"","lastModifiedDate":"2024-03-06"},{"lineNumber":63,"author":{"gitId":"jieqiboh"},"content":" public ApplicationStatus getApplicationStatus() {","lastModifiedDate":"2024-03-06"},{"lineNumber":64,"author":{"gitId":"jieqiboh"},"content":" return applicationStatus;","lastModifiedDate":"2024-03-06"},{"lineNumber":65,"author":{"gitId":"jieqiboh"},"content":" }","lastModifiedDate":"2024-03-06"},{"lineNumber":66,"author":{"gitId":"jieqiboh"},"content":"","lastModifiedDate":"2024-03-06"},{"lineNumber":67,"author":{"gitId":"jieqiboh"},"content":" public Description getDescription() {","lastModifiedDate":"2024-03-06"},{"lineNumber":68,"author":{"gitId":"jieqiboh"},"content":" return description;","lastModifiedDate":"2024-03-06"},{"lineNumber":69,"author":{"gitId":"jieqiboh"},"content":" }","lastModifiedDate":"2024-03-06"},{"lineNumber":70,"author":{"gitId":"jieqiboh"},"content":"","lastModifiedDate":"2024-03-06"},{"lineNumber":71,"author":{"gitId":"jieqiboh"},"content":" public Role getRole() {","lastModifiedDate":"2024-03-06"},{"lineNumber":72,"author":{"gitId":"jieqiboh"},"content":" return role;","lastModifiedDate":"2024-03-06"},{"lineNumber":73,"author":{"gitId":"jieqiboh"},"content":" }","lastModifiedDate":"2024-03-06"},{"lineNumber":74,"author":{"gitId":"jieqiboh"},"content":"","lastModifiedDate":"2024-03-06"},{"lineNumber":75,"author":{"gitId":"jieqiboh"},"content":" /**","lastModifiedDate":"2024-03-06"},{"lineNumber":76,"author":{"gitId":"jieqiboh"},"content":" * Returns true if both internships have the same name.","lastModifiedDate":"2024-03-06"},{"lineNumber":77,"author":{"gitId":"jieqiboh"},"content":" * This defines a weaker notion of equality between two internships.","lastModifiedDate":"2024-03-06"},{"lineNumber":78,"author":{"gitId":"jieqiboh"},"content":" */","lastModifiedDate":"2024-03-06"},{"lineNumber":79,"author":{"gitId":"jieqiboh"},"content":" public boolean isSameInternship(Internship otherInternship) {","lastModifiedDate":"2024-03-06"},{"lineNumber":80,"author":{"gitId":"jieqiboh"},"content":" if (otherInternship \u003d\u003d this) {","lastModifiedDate":"2024-03-06"},{"lineNumber":81,"author":{"gitId":"jieqiboh"},"content":" return true;","lastModifiedDate":"2024-03-06"},{"lineNumber":82,"author":{"gitId":"jieqiboh"},"content":" }","lastModifiedDate":"2024-03-06"},{"lineNumber":83,"author":{"gitId":"jieqiboh"},"content":"","lastModifiedDate":"2024-03-06"},{"lineNumber":84,"author":{"gitId":"jieqiboh"},"content":" return otherInternship !\u003d null","lastModifiedDate":"2024-03-06"},{"lineNumber":85,"author":{"gitId":"jieqiboh"},"content":" \u0026\u0026 otherInternship.getCompanyName().equals(getCompanyName());","lastModifiedDate":"2024-03-06"},{"lineNumber":86,"author":{"gitId":"jieqiboh"},"content":" }","lastModifiedDate":"2024-03-06"},{"lineNumber":87,"author":{"gitId":"jieqiboh"},"content":"","lastModifiedDate":"2024-03-06"},{"lineNumber":88,"author":{"gitId":"jieqiboh"},"content":" /**","lastModifiedDate":"2024-03-06"},{"lineNumber":89,"author":{"gitId":"jieqiboh"},"content":" * Returns true if both internships have the same identity and data fields.","lastModifiedDate":"2024-03-06"},{"lineNumber":90,"author":{"gitId":"jieqiboh"},"content":" * This defines a stronger notion of equality between two internships.","lastModifiedDate":"2024-03-06"},{"lineNumber":91,"author":{"gitId":"jieqiboh"},"content":" */","lastModifiedDate":"2024-03-06"},{"lineNumber":92,"author":{"gitId":"jieqiboh"},"content":" @Override","lastModifiedDate":"2024-03-06"},{"lineNumber":93,"author":{"gitId":"jieqiboh"},"content":" public boolean equals(Object other) {","lastModifiedDate":"2024-03-06"},{"lineNumber":94,"author":{"gitId":"jieqiboh"},"content":" if (other \u003d\u003d this) {","lastModifiedDate":"2024-03-06"},{"lineNumber":95,"author":{"gitId":"jieqiboh"},"content":" return true;","lastModifiedDate":"2024-03-06"},{"lineNumber":96,"author":{"gitId":"jieqiboh"},"content":" }","lastModifiedDate":"2024-03-06"},{"lineNumber":97,"author":{"gitId":"jieqiboh"},"content":"","lastModifiedDate":"2024-03-06"},{"lineNumber":98,"author":{"gitId":"jieqiboh"},"content":" // instanceof handles nulls","lastModifiedDate":"2024-03-06"},{"lineNumber":99,"author":{"gitId":"jieqiboh"},"content":" if (!(other instanceof Internship)) {","lastModifiedDate":"2024-03-06"},{"lineNumber":100,"author":{"gitId":"jieqiboh"},"content":" return false;","lastModifiedDate":"2024-03-06"},{"lineNumber":101,"author":{"gitId":"jieqiboh"},"content":" }","lastModifiedDate":"2024-03-06"},{"lineNumber":102,"author":{"gitId":"jieqiboh"},"content":"","lastModifiedDate":"2024-03-06"},{"lineNumber":103,"author":{"gitId":"jieqiboh"},"content":" Internship otherInternship \u003d (Internship) other;","lastModifiedDate":"2024-03-06"},{"lineNumber":104,"author":{"gitId":"jieqiboh"},"content":" return companyName.equals(otherInternship.companyName)","lastModifiedDate":"2024-03-06"},{"lineNumber":105,"author":{"gitId":"jieqiboh"},"content":" \u0026\u0026 location.equals(otherInternship.location)","lastModifiedDate":"2024-03-06"},{"lineNumber":106,"author":{"gitId":"jieqiboh"},"content":" \u0026\u0026 role.equals(otherInternship.role)","lastModifiedDate":"2024-03-06"},{"lineNumber":107,"author":{"gitId":"jieqiboh"},"content":" \u0026\u0026 description.equals(otherInternship.description);","lastModifiedDate":"2024-03-06"},{"lineNumber":108,"author":{"gitId":"jieqiboh"},"content":" }","lastModifiedDate":"2024-03-06"},{"lineNumber":109,"author":{"gitId":"jieqiboh"},"content":"","lastModifiedDate":"2024-03-06"},{"lineNumber":110,"author":{"gitId":"jieqiboh"},"content":" @Override","lastModifiedDate":"2024-03-06"},{"lineNumber":111,"author":{"gitId":"jieqiboh"},"content":" public int hashCode() {","lastModifiedDate":"2024-03-06"},{"lineNumber":112,"author":{"gitId":"jieqiboh"},"content":" // use this method for custom fields hashing instead of implementing your own","lastModifiedDate":"2024-03-06"},{"lineNumber":113,"author":{"gitId":"jieqiboh"},"content":" return Objects.hash(companyName, location, role, description);","lastModifiedDate":"2024-03-06"},{"lineNumber":114,"author":{"gitId":"jieqiboh"},"content":" }","lastModifiedDate":"2024-03-06"},{"lineNumber":115,"author":{"gitId":"jieqiboh"},"content":"","lastModifiedDate":"2024-03-06"},{"lineNumber":116,"author":{"gitId":"jieqiboh"},"content":" @Override","lastModifiedDate":"2024-03-06"},{"lineNumber":117,"author":{"gitId":"jieqiboh"},"content":" public String toString() {","lastModifiedDate":"2024-03-06"},{"lineNumber":118,"author":{"gitId":"jieqiboh"},"content":" return new ToStringBuilder(this)","lastModifiedDate":"2024-03-06"},{"lineNumber":119,"author":{"gitId":"jieqiboh"},"content":" .add(\"companyName\", companyName)","lastModifiedDate":"2024-03-06"},{"lineNumber":120,"author":{"gitId":"jieqiboh"},"content":" .add(\"contactName\", contactName)","lastModifiedDate":"2024-03-06"},{"lineNumber":121,"author":{"gitId":"jieqiboh"},"content":" .add(\"contactEmail\", contactEmail)","lastModifiedDate":"2024-03-06"},{"lineNumber":122,"author":{"gitId":"jieqiboh"},"content":" .add(\"contactNumber\", contactNumber)","lastModifiedDate":"2024-03-06"},{"lineNumber":123,"author":{"gitId":"jieqiboh"},"content":" .add(\"location\", location)","lastModifiedDate":"2024-03-06"},{"lineNumber":124,"author":{"gitId":"jieqiboh"},"content":" .add(\"applicationStatus\", applicationStatus)","lastModifiedDate":"2024-03-06"},{"lineNumber":125,"author":{"gitId":"jieqiboh"},"content":" .add(\"description\", description)","lastModifiedDate":"2024-03-06"},{"lineNumber":126,"author":{"gitId":"jieqiboh"},"content":" .add(\"role\", role)","lastModifiedDate":"2024-03-06"},{"lineNumber":127,"author":{"gitId":"jieqiboh"},"content":" .toString();","lastModifiedDate":"2024-03-06"},{"lineNumber":128,"author":{"gitId":"jieqiboh"},"content":" }","lastModifiedDate":"2024-03-06"},{"lineNumber":129,"author":{"gitId":"jieqiboh"},"content":"}","lastModifiedDate":"2024-03-06"}],"authorContributionMap":{"jieqiboh":129}},{"path":"src/main/java/seedu/address/model/internship/Location.java","fileType":"functional-code","lines":[{"lineNumber":1,"author":{"gitId":"jieqiboh"},"content":"package seedu.address.model.internship;","lastModifiedDate":"2024-03-06"},{"lineNumber":2,"author":{"gitId":"jieqiboh"},"content":"","lastModifiedDate":"2024-03-06"},{"lineNumber":3,"author":{"gitId":"jieqiboh"},"content":"import static java.util.Objects.requireNonNull;","lastModifiedDate":"2024-03-06"},{"lineNumber":4,"author":{"gitId":"jieqiboh"},"content":"","lastModifiedDate":"2024-03-06"},{"lineNumber":5,"author":{"gitId":"jieqiboh"},"content":"/**","lastModifiedDate":"2024-03-06"},{"lineNumber":6,"author":{"gitId":"jieqiboh"},"content":" * Represents an Internship\u0027s location in the internship book.","lastModifiedDate":"2024-03-06"},{"lineNumber":7,"author":{"gitId":"jieqiboh"},"content":" */","lastModifiedDate":"2024-03-06"},{"lineNumber":8,"author":{"gitId":"jieqiboh"},"content":"public class Location {","lastModifiedDate":"2024-03-06"},{"lineNumber":9,"author":{"gitId":"jieqiboh"},"content":" /**","lastModifiedDate":"2024-03-06"},{"lineNumber":10,"author":{"gitId":"jieqiboh"},"content":" * Enum of locations","lastModifiedDate":"2024-03-06"},{"lineNumber":11,"author":{"gitId":"jieqiboh"},"content":" */","lastModifiedDate":"2024-03-06"},{"lineNumber":12,"author":{"gitId":"jieqiboh"},"content":" public enum LocationEnum {","lastModifiedDate":"2024-03-06"},{"lineNumber":13,"author":{"gitId":"jieqiboh"},"content":" LOCAL,","lastModifiedDate":"2024-03-06"},{"lineNumber":14,"author":{"gitId":"jieqiboh"},"content":" OVERSEAS,","lastModifiedDate":"2024-03-06"},{"lineNumber":15,"author":{"gitId":"jieqiboh"},"content":" REMOTE","lastModifiedDate":"2024-03-06"},{"lineNumber":16,"author":{"gitId":"jieqiboh"},"content":" }","lastModifiedDate":"2024-03-06"},{"lineNumber":17,"author":{"gitId":"jieqiboh"},"content":"","lastModifiedDate":"2024-03-06"},{"lineNumber":18,"author":{"gitId":"jieqiboh"},"content":" public final LocationEnum location;","lastModifiedDate":"2024-03-06"},{"lineNumber":19,"author":{"gitId":"jieqiboh"},"content":"","lastModifiedDate":"2024-03-06"},{"lineNumber":20,"author":{"gitId":"jieqiboh"},"content":" /**","lastModifiedDate":"2024-03-06"},{"lineNumber":21,"author":{"gitId":"jieqiboh"},"content":" * Constructs a {@code ApplicationStatus}.","lastModifiedDate":"2024-03-06"},{"lineNumber":22,"author":{"gitId":"jieqiboh"},"content":" *","lastModifiedDate":"2024-03-06"},{"lineNumber":23,"author":{"gitId":"jieqiboh"},"content":" * @param location A valid location.","lastModifiedDate":"2024-03-06"},{"lineNumber":24,"author":{"gitId":"jieqiboh"},"content":" */","lastModifiedDate":"2024-03-06"},{"lineNumber":25,"author":{"gitId":"jieqiboh"},"content":" public Location(LocationEnum location) {","lastModifiedDate":"2024-03-06"},{"lineNumber":26,"author":{"gitId":"jieqiboh"},"content":" requireNonNull(location);","lastModifiedDate":"2024-03-06"},{"lineNumber":27,"author":{"gitId":"jieqiboh"},"content":" this.location \u003d location;","lastModifiedDate":"2024-03-06"},{"lineNumber":28,"author":{"gitId":"jieqiboh"},"content":" }","lastModifiedDate":"2024-03-06"},{"lineNumber":29,"author":{"gitId":"jieqiboh"},"content":"","lastModifiedDate":"2024-03-06"},{"lineNumber":30,"author":{"gitId":"jieqiboh"},"content":" @Override","lastModifiedDate":"2024-03-06"},{"lineNumber":31,"author":{"gitId":"jieqiboh"},"content":" public String toString() {","lastModifiedDate":"2024-03-06"},{"lineNumber":32,"author":{"gitId":"jieqiboh"},"content":" switch (location) {","lastModifiedDate":"2024-03-06"},{"lineNumber":33,"author":{"gitId":"jieqiboh"},"content":" case LOCAL:","lastModifiedDate":"2024-03-06"},{"lineNumber":34,"author":{"gitId":"jieqiboh"},"content":" return \"Local\";","lastModifiedDate":"2024-03-06"},{"lineNumber":35,"author":{"gitId":"jieqiboh"},"content":" case OVERSEAS:","lastModifiedDate":"2024-03-06"},{"lineNumber":36,"author":{"gitId":"jieqiboh"},"content":" return \"Overseas\";","lastModifiedDate":"2024-03-06"},{"lineNumber":37,"author":{"gitId":"jieqiboh"},"content":" case REMOTE:","lastModifiedDate":"2024-03-06"},{"lineNumber":38,"author":{"gitId":"jieqiboh"},"content":" return \"Remote\";","lastModifiedDate":"2024-03-06"},{"lineNumber":39,"author":{"gitId":"jieqiboh"},"content":" default:","lastModifiedDate":"2024-03-06"},{"lineNumber":40,"author":{"gitId":"jieqiboh"},"content":" throw new IllegalArgumentException(\"Unexpected location: \" + location);","lastModifiedDate":"2024-03-06"},{"lineNumber":41,"author":{"gitId":"jieqiboh"},"content":" }","lastModifiedDate":"2024-03-06"},{"lineNumber":42,"author":{"gitId":"jieqiboh"},"content":" }","lastModifiedDate":"2024-03-06"},{"lineNumber":43,"author":{"gitId":"jieqiboh"},"content":"","lastModifiedDate":"2024-03-06"},{"lineNumber":44,"author":{"gitId":"jieqiboh"},"content":"","lastModifiedDate":"2024-03-06"},{"lineNumber":45,"author":{"gitId":"jieqiboh"},"content":"","lastModifiedDate":"2024-03-06"},{"lineNumber":46,"author":{"gitId":"jieqiboh"},"content":" @Override","lastModifiedDate":"2024-03-06"},{"lineNumber":47,"author":{"gitId":"jieqiboh"},"content":" public int hashCode() {","lastModifiedDate":"2024-03-06"},{"lineNumber":48,"author":{"gitId":"jieqiboh"},"content":" return location.hashCode();","lastModifiedDate":"2024-03-06"},{"lineNumber":49,"author":{"gitId":"jieqiboh"},"content":" }","lastModifiedDate":"2024-03-06"},{"lineNumber":50,"author":{"gitId":"jieqiboh"},"content":"","lastModifiedDate":"2024-03-06"},{"lineNumber":51,"author":{"gitId":"jieqiboh"},"content":"}","lastModifiedDate":"2024-03-06"}],"authorContributionMap":{"jieqiboh":51}},{"path":"src/main/java/seedu/address/model/internship/Role.java","fileType":"functional-code","lines":[{"lineNumber":1,"author":{"gitId":"jieqiboh"},"content":"package seedu.address.model.internship;","lastModifiedDate":"2024-03-06"},{"lineNumber":2,"author":{"gitId":"jieqiboh"},"content":"","lastModifiedDate":"2024-03-06"},{"lineNumber":3,"author":{"gitId":"jieqiboh"},"content":"import static java.util.Objects.requireNonNull;","lastModifiedDate":"2024-03-06"},{"lineNumber":4,"author":{"gitId":"jieqiboh"},"content":"","lastModifiedDate":"2024-03-06"},{"lineNumber":5,"author":{"gitId":"jieqiboh"},"content":"/**","lastModifiedDate":"2024-03-06"},{"lineNumber":6,"author":{"gitId":"jieqiboh"},"content":" * Represent\u0027s an internship\u0027s role in the internship book","lastModifiedDate":"2024-03-06"},{"lineNumber":7,"author":{"gitId":"jieqiboh"},"content":" */","lastModifiedDate":"2024-03-06"},{"lineNumber":8,"author":{"gitId":"jieqiboh"},"content":"public class Role {","lastModifiedDate":"2024-03-06"},{"lineNumber":9,"author":{"gitId":"jieqiboh"},"content":"","lastModifiedDate":"2024-03-06"},{"lineNumber":10,"author":{"gitId":"jieqiboh"},"content":" public final String role;","lastModifiedDate":"2024-03-06"},{"lineNumber":11,"author":{"gitId":"jieqiboh"},"content":"","lastModifiedDate":"2024-03-06"},{"lineNumber":12,"author":{"gitId":"jieqiboh"},"content":" /**","lastModifiedDate":"2024-03-06"},{"lineNumber":13,"author":{"gitId":"jieqiboh"},"content":" * Constructs a {@code Role}.","lastModifiedDate":"2024-03-06"},{"lineNumber":14,"author":{"gitId":"jieqiboh"},"content":" *","lastModifiedDate":"2024-03-06"},{"lineNumber":15,"author":{"gitId":"jieqiboh"},"content":" * @param role A valid role.","lastModifiedDate":"2024-03-06"},{"lineNumber":16,"author":{"gitId":"jieqiboh"},"content":" */","lastModifiedDate":"2024-03-06"},{"lineNumber":17,"author":{"gitId":"jieqiboh"},"content":" public Role(String role) {","lastModifiedDate":"2024-03-06"},{"lineNumber":18,"author":{"gitId":"jieqiboh"},"content":" requireNonNull(role);","lastModifiedDate":"2024-03-06"},{"lineNumber":19,"author":{"gitId":"jieqiboh"},"content":" this.role \u003d role;","lastModifiedDate":"2024-03-06"},{"lineNumber":20,"author":{"gitId":"jieqiboh"},"content":" }","lastModifiedDate":"2024-03-06"},{"lineNumber":21,"author":{"gitId":"jieqiboh"},"content":"","lastModifiedDate":"2024-03-06"},{"lineNumber":22,"author":{"gitId":"jieqiboh"},"content":" @Override","lastModifiedDate":"2024-03-06"},{"lineNumber":23,"author":{"gitId":"jieqiboh"},"content":" public String toString() {","lastModifiedDate":"2024-03-06"},{"lineNumber":24,"author":{"gitId":"jieqiboh"},"content":" return role;","lastModifiedDate":"2024-03-06"},{"lineNumber":25,"author":{"gitId":"jieqiboh"},"content":" }","lastModifiedDate":"2024-03-06"},{"lineNumber":26,"author":{"gitId":"jieqiboh"},"content":"","lastModifiedDate":"2024-03-06"},{"lineNumber":27,"author":{"gitId":"jieqiboh"},"content":" @Override","lastModifiedDate":"2024-03-06"},{"lineNumber":28,"author":{"gitId":"jieqiboh"},"content":" public boolean equals(Object other) {","lastModifiedDate":"2024-03-06"},{"lineNumber":29,"author":{"gitId":"jieqiboh"},"content":" if (other \u003d\u003d this) {","lastModifiedDate":"2024-03-06"},{"lineNumber":30,"author":{"gitId":"jieqiboh"},"content":" return true;","lastModifiedDate":"2024-03-06"},{"lineNumber":31,"author":{"gitId":"jieqiboh"},"content":" }","lastModifiedDate":"2024-03-06"},{"lineNumber":32,"author":{"gitId":"jieqiboh"},"content":"","lastModifiedDate":"2024-03-06"},{"lineNumber":33,"author":{"gitId":"jieqiboh"},"content":" // instanceof handles nulls","lastModifiedDate":"2024-03-06"},{"lineNumber":34,"author":{"gitId":"jieqiboh"},"content":" if (!(other instanceof Role)) {","lastModifiedDate":"2024-03-06"},{"lineNumber":35,"author":{"gitId":"jieqiboh"},"content":" return false;","lastModifiedDate":"2024-03-06"},{"lineNumber":36,"author":{"gitId":"jieqiboh"},"content":" }","lastModifiedDate":"2024-03-06"},{"lineNumber":37,"author":{"gitId":"jieqiboh"},"content":"","lastModifiedDate":"2024-03-06"},{"lineNumber":38,"author":{"gitId":"jieqiboh"},"content":" Role otherName \u003d (Role) other;","lastModifiedDate":"2024-03-06"},{"lineNumber":39,"author":{"gitId":"jieqiboh"},"content":" return role.equals(otherName.role);","lastModifiedDate":"2024-03-06"},{"lineNumber":40,"author":{"gitId":"jieqiboh"},"content":" }","lastModifiedDate":"2024-03-06"},{"lineNumber":41,"author":{"gitId":"jieqiboh"},"content":"","lastModifiedDate":"2024-03-06"},{"lineNumber":42,"author":{"gitId":"jieqiboh"},"content":" @Override","lastModifiedDate":"2024-03-06"},{"lineNumber":43,"author":{"gitId":"jieqiboh"},"content":" public int hashCode() {","lastModifiedDate":"2024-03-06"},{"lineNumber":44,"author":{"gitId":"jieqiboh"},"content":" return role.hashCode();","lastModifiedDate":"2024-03-06"},{"lineNumber":45,"author":{"gitId":"jieqiboh"},"content":" }","lastModifiedDate":"2024-03-06"},{"lineNumber":46,"author":{"gitId":"jieqiboh"},"content":"}","lastModifiedDate":"2024-03-06"}],"authorContributionMap":{"jieqiboh":46}},{"path":"src/main/java/seedu/address/model/internship/exceptions/DuplicateInternshipException.java","fileType":"functional-code","lines":[{"lineNumber":1,"author":{"gitId":"jieqiboh"},"content":"package seedu.address.model.internship.exceptions;","lastModifiedDate":"2024-03-06"},{"lineNumber":2,"author":{"gitId":"jieqiboh"},"content":"","lastModifiedDate":"2024-03-06"},{"lineNumber":3,"author":{"gitId":"jieqiboh"},"content":"/**","lastModifiedDate":"2024-03-06"},{"lineNumber":4,"author":{"gitId":"jieqiboh"},"content":" * Signals that the operation will result in duplicate Internship (Internships are considered duplicates if they","lastModifiedDate":"2024-03-06"},{"lineNumber":5,"author":{"gitId":"jieqiboh"},"content":" * have the same identity).","lastModifiedDate":"2024-03-06"},{"lineNumber":6,"author":{"gitId":"jieqiboh"},"content":" */","lastModifiedDate":"2024-03-06"},{"lineNumber":7,"author":{"gitId":"jieqiboh"},"content":"public class DuplicateInternshipException extends RuntimeException {","lastModifiedDate":"2024-03-06"},{"lineNumber":8,"author":{"gitId":"jieqiboh"},"content":" public DuplicateInternshipException() {","lastModifiedDate":"2024-03-06"},{"lineNumber":9,"author":{"gitId":"jieqiboh"},"content":" super(\"Operation would result in duplicate persons\");","lastModifiedDate":"2024-03-06"},{"lineNumber":10,"author":{"gitId":"jieqiboh"},"content":" }","lastModifiedDate":"2024-03-06"},{"lineNumber":11,"author":{"gitId":"jieqiboh"},"content":"}","lastModifiedDate":"2024-03-06"}],"authorContributionMap":{"jieqiboh":11}},{"path":"src/main/java/seedu/address/model/internship/exceptions/InternshipNotFoundException.java","fileType":"functional-code","lines":[{"lineNumber":1,"author":{"gitId":"jieqiboh"},"content":"package seedu.address.model.internship.exceptions;","lastModifiedDate":"2024-03-06"},{"lineNumber":2,"author":{"gitId":"jieqiboh"},"content":"","lastModifiedDate":"2024-03-06"},{"lineNumber":3,"author":{"gitId":"jieqiboh"},"content":"/**","lastModifiedDate":"2024-03-06"},{"lineNumber":4,"author":{"gitId":"jieqiboh"},"content":" * Signals that the operation is unable to find the specified internship.","lastModifiedDate":"2024-03-06"},{"lineNumber":5,"author":{"gitId":"jieqiboh"},"content":" */","lastModifiedDate":"2024-03-06"},{"lineNumber":6,"author":{"gitId":"jieqiboh"},"content":"public class InternshipNotFoundException extends RuntimeException {}","lastModifiedDate":"2024-03-06"}],"authorContributionMap":{"jieqiboh":6}}] +[{"path":"README.md","fileType":"docs","lines":[{"lineNumber":1,"author":{"gitId":"jieqiboh"},"content":"[![Java CI](https://github.com/AY2324S2-CS2103T-W11-1/tp/actions/workflows/gradle.yml/badge.svg)](https://github.com/AY2324S2-CS2103T-W11-1/tp/actions/workflows/gradle.yml)","lastModifiedDate":"2024-03-05"},{"lineNumber":2,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":3,"author":{"gitId":"-"},"content":"![Ui](docs/images/Ui.png)","lastModifiedDate":"2020-05-23"},{"lineNumber":4,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":5,"author":{"gitId":"-"},"content":"* This is **a sample project for Software Engineering (SE) students**.\u003cbr\u003e","lastModifiedDate":"2020-05-23"},{"lineNumber":6,"author":{"gitId":"-"},"content":" Example usages:","lastModifiedDate":"2020-05-23"},{"lineNumber":7,"author":{"gitId":"-"},"content":" * as a starting point of a course project (as opposed to writing everything from scratch)","lastModifiedDate":"2020-05-23"},{"lineNumber":8,"author":{"gitId":"-"},"content":" * as a case study","lastModifiedDate":"2020-05-23"},{"lineNumber":9,"author":{"gitId":"-"},"content":"* The project simulates an ongoing software project for a desktop application (called _AddressBook_) used for managing contact details.","lastModifiedDate":"2020-05-23"},{"lineNumber":10,"author":{"gitId":"-"},"content":" * 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.","lastModifiedDate":"2020-05-23"},{"lineNumber":11,"author":{"gitId":"-"},"content":" * It comes with a **reasonable level of user and developer documentation**.","lastModifiedDate":"2020-05-23"},{"lineNumber":12,"author":{"gitId":"-"},"content":"* 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` ...).","lastModifiedDate":"2020-05-23"},{"lineNumber":13,"author":{"gitId":"-"},"content":"* For the detailed documentation of this project, see the **[Address Book Product Website](https://se-education.org/addressbook-level3)**.","lastModifiedDate":"2020-05-23"},{"lineNumber":14,"author":{"gitId":"-"},"content":"* 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.","lastModifiedDate":"2020-05-23"}],"authorContributionMap":{"jieqiboh":1,"-":13}},{"path":"docs/AboutUs.md","fileType":"docs","lines":[{"lineNumber":1,"author":{"gitId":"-"},"content":"---","lastModifiedDate":"2020-05-23"},{"lineNumber":2,"author":{"gitId":"-"},"content":"layout: page","lastModifiedDate":"2020-05-23"},{"lineNumber":3,"author":{"gitId":"-"},"content":"title: About Us","lastModifiedDate":"2020-05-23"},{"lineNumber":4,"author":{"gitId":"-"},"content":"---","lastModifiedDate":"2020-05-23"},{"lineNumber":5,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":6,"author":{"gitId":"-"},"content":"We are a team based in the [School of Computing, National University of Singapore](http://www.comp.nus.edu.sg).","lastModifiedDate":"2020-05-23"},{"lineNumber":7,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":8,"author":{"gitId":"jieqiboh"},"content":"You can reach us at the email `cs2103t_w11_1[at]comp.nus.edu.sg`","lastModifiedDate":"2024-02-29"},{"lineNumber":9,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-06-17"},{"lineNumber":10,"author":{"gitId":"-"},"content":"## Project team","lastModifiedDate":"2020-06-07"},{"lineNumber":11,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":12,"author":{"gitId":"HM33-Stu"},"content":"### Loh Jun Heng Donovan","lastModifiedDate":"2024-03-01"},{"lineNumber":13,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":14,"author":{"gitId":"HM33-Stu"},"content":"\u003cimg src\u003d\"images/captainkeqing.png\" width\u003d\"200px\"\u003e","lastModifiedDate":"2024-03-01"},{"lineNumber":15,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":16,"author":{"gitId":"-"},"content":"[[homepage](http://www.comp.nus.edu.sg/~damithch)]","lastModifiedDate":"2020-05-23"},{"lineNumber":17,"author":{"gitId":"HM33-Stu"},"content":"[[github](https://github.com/CaptainKeqing)]","lastModifiedDate":"2024-03-01"},{"lineNumber":18,"author":{"gitId":"HM33-Stu"},"content":"[[portfolio](team/captainkeqing.md)]","lastModifiedDate":"2024-03-01"},{"lineNumber":19,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":20,"author":{"gitId":"HM33-Stu"},"content":"* Role: Code Quality Manager","lastModifiedDate":"2024-03-01"},{"lineNumber":21,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":22,"author":{"gitId":"HM33-Stu"},"content":"### Hariprasath S/O R Mohan","lastModifiedDate":"2024-03-01"},{"lineNumber":23,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":24,"author":{"gitId":"HM33-Stu"},"content":"\u003cimg src\u003d\"images/hm33-stu.png\" width\u003d\"200px\"\u003e","lastModifiedDate":"2024-03-02"},{"lineNumber":25,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":26,"author":{"gitId":"HM33-Stu"},"content":"[[github](http://github.com/HM33-Stu)]","lastModifiedDate":"2024-03-01"},{"lineNumber":27,"author":{"gitId":"HM33-Stu"},"content":"[[portfolio](team/hm33-stu.md)]","lastModifiedDate":"2024-03-02"},{"lineNumber":28,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":29,"author":{"gitId":"HM33-Stu"},"content":"* Role: Documentation, Deliverables and Deadlines","lastModifiedDate":"2024-03-01"},{"lineNumber":30,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":31,"author":{"gitId":"LWS49"},"content":"### Wei Sheng","lastModifiedDate":"2024-03-02"},{"lineNumber":32,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":33,"author":{"gitId":"LWS49"},"content":"\u003cimg src\u003d\"images/lws49.png\" width\u003d\"200px\"\u003e","lastModifiedDate":"2024-03-02"},{"lineNumber":34,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":35,"author":{"gitId":"HM33-Stu"},"content":"[[github](http://github.com/LWS49)]","lastModifiedDate":"2024-03-02"},{"lineNumber":36,"author":{"gitId":"HM33-Stu"},"content":"[[portfolio](team/lws49.md)]","lastModifiedDate":"2024-03-02"},{"lineNumber":37,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":38,"author":{"gitId":"LWS49"},"content":"* Role: Tech Lead, Scheduling and Tracking","lastModifiedDate":"2024-03-02"},{"lineNumber":39,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":40,"author":{"gitId":"LWS49"},"content":"### Boh Jie Qi","lastModifiedDate":"2024-03-02"},{"lineNumber":41,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":42,"author":{"gitId":"LWS49"},"content":"\u003cimg src\u003d\"images/jieqiboh.png\" width\u003d\"200px\"\u003e","lastModifiedDate":"2024-03-02"},{"lineNumber":43,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":44,"author":{"gitId":"LWS49"},"content":"[[github](https://github.com/jieqiboh)]","lastModifiedDate":"2024-03-02"},{"lineNumber":45,"author":{"gitId":"jieqiboh"},"content":"[[portfolio](team/jieqiboh)]","lastModifiedDate":"2024-02-29"},{"lineNumber":46,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":47,"author":{"gitId":"-"},"content":"* Role: Developer","lastModifiedDate":"2020-05-23"},{"lineNumber":48,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2024-03-02"},{"lineNumber":49,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":50,"author":{"gitId":"theman-oj10"},"content":"### Rajendran Ramesh Babu Manoj Narender","lastModifiedDate":"2024-03-02"},{"lineNumber":51,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":52,"author":{"gitId":"theman-oj10"},"content":"\u003cimg src\u003d\"images/theman-oj10.png\" width\u003d\"200px\"\u003e","lastModifiedDate":"2024-03-02"},{"lineNumber":53,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":54,"author":{"gitId":"theman-oj10"},"content":"[[github](http://github.com/theman-oj10)]","lastModifiedDate":"2024-03-02"},{"lineNumber":55,"author":{"gitId":"theman-oj10"},"content":"[[portfolio](team/theman-oj10.md)]","lastModifiedDate":"2024-03-02"},{"lineNumber":56,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":57,"author":{"gitId":"theman-oj10"},"content":"* Role: Integration, Testing","lastModifiedDate":"2024-03-02"}],"authorContributionMap":{"jieqiboh":2,"HM33-Stu":12,"LWS49":6,"theman-oj10":5,"-":32}},{"path":"docs/Configuration.md","fileType":"docs","lines":[{"lineNumber":1,"author":{"gitId":"-"},"content":"---","lastModifiedDate":"2020-06-07"},{"lineNumber":2,"author":{"gitId":"jieqiboh"},"content":"layout: page","lastModifiedDate":"2024-03-02"},{"lineNumber":3,"author":{"gitId":"jieqiboh"},"content":"title: Configuration guide","lastModifiedDate":"2024-03-02"},{"lineNumber":4,"author":{"gitId":"-"},"content":"---","lastModifiedDate":"2020-06-07"},{"lineNumber":5,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-06-07"},{"lineNumber":6,"author":{"gitId":"-"},"content":"Certain properties of the application can be controlled (e.g user preferences file location, logging level) through the configuration file (default: `config.json`).","lastModifiedDate":"2020-06-07"}],"authorContributionMap":{"jieqiboh":2,"-":4}},{"path":"docs/DevOps.md","fileType":"docs","lines":[{"lineNumber":1,"author":{"gitId":"-"},"content":"---","lastModifiedDate":"2020-05-23"},{"lineNumber":2,"author":{"gitId":"jieqiboh"},"content":"layout: page","lastModifiedDate":"2024-03-02"},{"lineNumber":3,"author":{"gitId":"jieqiboh"},"content":"title: DevOps guide","lastModifiedDate":"2024-03-02"},{"lineNumber":4,"author":{"gitId":"-"},"content":"---","lastModifiedDate":"2020-05-23"},{"lineNumber":5,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":6,"author":{"gitId":"jieqiboh"},"content":"* Table of Contents","lastModifiedDate":"2024-03-02"},{"lineNumber":7,"author":{"gitId":"jieqiboh"},"content":"{:toc}","lastModifiedDate":"2024-03-02"},{"lineNumber":8,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":9,"author":{"gitId":"jieqiboh"},"content":"--------------------------------------------------------------------------------------------------------------------","lastModifiedDate":"2024-03-02"},{"lineNumber":10,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":11,"author":{"gitId":"-"},"content":"## Build automation","lastModifiedDate":"2020-05-23"},{"lineNumber":12,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":13,"author":{"gitId":"-"},"content":"This project uses Gradle for **build automation and dependency management**. **You are recommended to read [this Gradle Tutorial from the se-edu/guides](https://se-education.org/guides/tutorials/gradle.html)**.","lastModifiedDate":"2020-06-07"},{"lineNumber":14,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-26"},{"lineNumber":15,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-26"},{"lineNumber":16,"author":{"gitId":"-"},"content":"Given below are how to use Gradle for some important project tasks.","lastModifiedDate":"2020-05-26"},{"lineNumber":17,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-26"},{"lineNumber":18,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-26"},{"lineNumber":19,"author":{"gitId":"-"},"content":"* **`clean`**: Deletes the files created during the previous build tasks (e.g. files in the `build` folder).\u003cbr\u003e","lastModifiedDate":"2020-05-26"},{"lineNumber":20,"author":{"gitId":"-"},"content":" e.g. `./gradlew clean`","lastModifiedDate":"2020-05-26"},{"lineNumber":21,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-26"},{"lineNumber":22,"author":{"gitId":"-"},"content":"* **`shadowJar`**: Uses the ShadowJar plugin to creat a fat JAR file in the `build/lib` folder, *if the current file is outdated*.\u003cbr\u003e","lastModifiedDate":"2020-05-26"},{"lineNumber":23,"author":{"gitId":"-"},"content":" e.g. `./gradlew shadowJar`.","lastModifiedDate":"2020-05-26"},{"lineNumber":24,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-26"},{"lineNumber":25,"author":{"gitId":"-"},"content":"* **`run`**: Builds and runs the application.\u003cbr\u003e","lastModifiedDate":"2020-05-26"},{"lineNumber":26,"author":{"gitId":"-"},"content":" **`runShadow`**: Builds the application as a fat JAR, and then runs it.","lastModifiedDate":"2020-05-26"},{"lineNumber":27,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-26"},{"lineNumber":28,"author":{"gitId":"-"},"content":"* **`checkstyleMain`**: Runs the code style check for the main code base.\u003cbr\u003e","lastModifiedDate":"2020-05-26"},{"lineNumber":29,"author":{"gitId":"-"},"content":" **`checkstyleTest`**: Runs the code style check for the test code base.","lastModifiedDate":"2020-05-26"},{"lineNumber":30,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-26"},{"lineNumber":31,"author":{"gitId":"-"},"content":"* **`test`**: Runs all tests.","lastModifiedDate":"2023-01-01"},{"lineNumber":32,"author":{"gitId":"-"},"content":" * `./gradlew test` — Runs all tests","lastModifiedDate":"2020-05-26"},{"lineNumber":33,"author":{"gitId":"-"},"content":" * `./gradlew clean test` — Cleans the project and runs tests","lastModifiedDate":"2020-05-26"},{"lineNumber":34,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":35,"author":{"gitId":"-"},"content":"--------------------------------------------------------------------------------------------------------------------","lastModifiedDate":"2020-05-23"},{"lineNumber":36,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":37,"author":{"gitId":"-"},"content":"## Continuous integration (CI)","lastModifiedDate":"2020-05-23"},{"lineNumber":38,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":39,"author":{"gitId":"-"},"content":"This project uses GitHub Actions for CI. The project comes with the necessary GitHub Actions configurations files (in the `.github/workflows` folder). No further setting up required.","lastModifiedDate":"2020-05-23"},{"lineNumber":40,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":41,"author":{"gitId":"-"},"content":"### Code coverage","lastModifiedDate":"2020-08-07"},{"lineNumber":42,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-08-07"},{"lineNumber":43,"author":{"gitId":"-"},"content":"As part of CI, this project uses Codecov to generate coverage reports. When CI runs, it will generate code coverage data (based on the tests run by CI) and upload that data to the CodeCov website, which in turn can provide you more info about the coverage of your tests.","lastModifiedDate":"2023-02-02"},{"lineNumber":44,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-08-07"},{"lineNumber":45,"author":{"gitId":"-"},"content":"However, because Codecov is known to run into intermittent problems (e.g., report upload fails) due to issues on the Codecov service side, the CI is configured to pass even if the Codecov task failed. Therefore, developers are advised to check the code coverage levels periodically and take corrective actions if the coverage level falls below desired levels.","lastModifiedDate":"2023-02-02"},{"lineNumber":46,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-08-07"},{"lineNumber":47,"author":{"gitId":"-"},"content":"To enable Codecov for forks of this project, follow the steps given in [this se-edu guide](https://se-education.org/guides/tutorials/codecov.html).","lastModifiedDate":"2023-02-02"},{"lineNumber":48,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2023-01-01"},{"lineNumber":49,"author":{"gitId":"-"},"content":"### Repository-wide checks","lastModifiedDate":"2020-07-28"},{"lineNumber":50,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-07-28"},{"lineNumber":51,"author":{"gitId":"-"},"content":"In addition to running Gradle checks, CI includes some repository-wide checks. Unlike the Gradle checks which only cover files used in the build process, these repository-wide checks cover all files in the repository. They check for repository rules which are hard to enforce on development machines such as line ending requirements.","lastModifiedDate":"2020-07-28"},{"lineNumber":52,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-07-28"},{"lineNumber":53,"author":{"gitId":"-"},"content":"These checks are implemented as POSIX shell scripts, and thus can only be run on POSIX-compliant operating systems such as macOS and Linux. To run all checks locally on these operating systems, execute the following in the repository root directory:","lastModifiedDate":"2020-07-28"},{"lineNumber":54,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-07-28"},{"lineNumber":55,"author":{"gitId":"-"},"content":"`./config/travis/run-checks.sh`","lastModifiedDate":"2020-07-28"},{"lineNumber":56,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-07-28"},{"lineNumber":57,"author":{"gitId":"-"},"content":"Any warnings or errors will be printed out to the console.","lastModifiedDate":"2020-07-28"},{"lineNumber":58,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-07-28"},{"lineNumber":59,"author":{"gitId":"-"},"content":"**If adding new checks:**","lastModifiedDate":"2020-07-28"},{"lineNumber":60,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-07-28"},{"lineNumber":61,"author":{"gitId":"-"},"content":"* Checks are implemented as executable `check-*` scripts within the `.github` directory. The `run-checks.sh` script will automatically pick up and run files named as such. That is, you can add more such files if you need and the CI will do the rest.","lastModifiedDate":"2020-07-28"},{"lineNumber":62,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-07-28"},{"lineNumber":63,"author":{"gitId":"-"},"content":"* Check scripts should print out errors in the format `SEVERITY:FILENAME:LINE: MESSAGE`","lastModifiedDate":"2020-07-28"},{"lineNumber":64,"author":{"gitId":"-"},"content":" * SEVERITY is either ERROR or WARN.","lastModifiedDate":"2020-07-28"},{"lineNumber":65,"author":{"gitId":"-"},"content":" * FILENAME is the path to the file relative to the current directory.","lastModifiedDate":"2020-07-28"},{"lineNumber":66,"author":{"gitId":"-"},"content":" * LINE is the line of the file where the error occurred and MESSAGE is the message explaining the error.","lastModifiedDate":"2020-07-28"},{"lineNumber":67,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-07-28"},{"lineNumber":68,"author":{"gitId":"-"},"content":"* Check scripts must exit with a non-zero exit code if any errors occur.","lastModifiedDate":"2020-07-28"},{"lineNumber":69,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-07-28"},{"lineNumber":70,"author":{"gitId":"-"},"content":"--------------------------------------------------------------------------------------------------------------------","lastModifiedDate":"2020-05-23"},{"lineNumber":71,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":72,"author":{"gitId":"-"},"content":"## Making a release","lastModifiedDate":"2020-05-23"},{"lineNumber":73,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":74,"author":{"gitId":"-"},"content":"Here are the steps to create a new release.","lastModifiedDate":"2020-05-23"},{"lineNumber":75,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":76,"author":{"gitId":"-"},"content":"1. Update the version number in [`MainApp.java`](https://github.com/se-edu/addressbook-level3/tree/master/src/main/java/seedu/address/MainApp.java).","lastModifiedDate":"2020-05-23"},{"lineNumber":77,"author":{"gitId":"-"},"content":"1. Generate a fat JAR file using Gradle (i.e., `gradlew shadowJar`).","lastModifiedDate":"2021-08-30"},{"lineNumber":78,"author":{"gitId":"-"},"content":"1. Tag the repo with the version number. e.g. `v0.1`","lastModifiedDate":"2020-05-23"},{"lineNumber":79,"author":{"gitId":"-"},"content":"1. [Create a new release using GitHub](https://help.github.com/articles/creating-releases/). Upload the JAR file you created.","lastModifiedDate":"2020-05-26"}],"authorContributionMap":{"jieqiboh":5,"-":74}},{"path":"docs/DeveloperGuide.md","fileType":"docs","lines":[{"lineNumber":1,"author":{"gitId":"-"},"content":"---","lastModifiedDate":"2020-05-23"},{"lineNumber":2,"author":{"gitId":"-"},"content":"layout: page","lastModifiedDate":"2020-05-23"},{"lineNumber":3,"author":{"gitId":"-"},"content":"title: Developer Guide","lastModifiedDate":"2020-05-23"},{"lineNumber":4,"author":{"gitId":"-"},"content":"---","lastModifiedDate":"2020-05-23"},{"lineNumber":5,"author":{"gitId":"-"},"content":"* Table of Contents","lastModifiedDate":"2020-05-23"},{"lineNumber":6,"author":{"gitId":"-"},"content":" {:toc}","lastModifiedDate":"2020-05-23"},{"lineNumber":7,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":8,"author":{"gitId":"-"},"content":"--------------------------------------------------------------------------------------------------------------------","lastModifiedDate":"2020-05-23"},{"lineNumber":9,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2021-07-30"},{"lineNumber":10,"author":{"gitId":"-"},"content":"## **Acknowledgements**","lastModifiedDate":"2021-07-30"},{"lineNumber":11,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2021-07-30"},{"lineNumber":12,"author":{"gitId":"-"},"content":"* {list here sources of all reused/adapted ideas, code, documentation, and third-party libraries -- include links to the original source as well}","lastModifiedDate":"2021-07-30"},{"lineNumber":13,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2021-07-30"},{"lineNumber":14,"author":{"gitId":"-"},"content":"--------------------------------------------------------------------------------------------------------------------","lastModifiedDate":"2021-07-30"},{"lineNumber":15,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":16,"author":{"gitId":"-"},"content":"## **Setting up, getting started**","lastModifiedDate":"2020-05-23"},{"lineNumber":17,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":18,"author":{"gitId":"-"},"content":"Refer to the guide [_Setting up and getting started_](SettingUp.md).","lastModifiedDate":"2020-05-23"},{"lineNumber":19,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":20,"author":{"gitId":"-"},"content":"--------------------------------------------------------------------------------------------------------------------","lastModifiedDate":"2020-05-23"},{"lineNumber":21,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":22,"author":{"gitId":"-"},"content":"## **Design**","lastModifiedDate":"2020-05-23"},{"lineNumber":23,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":24,"author":{"gitId":"-"},"content":"\u003cdiv markdown\u003d\"span\" class\u003d\"alert alert-primary\"\u003e","lastModifiedDate":"2021-07-31"},{"lineNumber":25,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":26,"author":{"gitId":"-"},"content":":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.","lastModifiedDate":"2023-09-03"},{"lineNumber":27,"author":{"gitId":"-"},"content":"\u003c/div\u003e","lastModifiedDate":"2021-07-31"},{"lineNumber":28,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":29,"author":{"gitId":"-"},"content":"### Architecture","lastModifiedDate":"2021-07-31"},{"lineNumber":30,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":31,"author":{"gitId":"-"},"content":"\u003cimg src\u003d\"images/ArchitectureDiagram.png\" width\u003d\"280\" /\u003e","lastModifiedDate":"2021-07-31"},{"lineNumber":32,"author":{"gitId":"LWS49"},"content":"c","lastModifiedDate":"2024-03-04"},{"lineNumber":33,"author":{"gitId":"-"},"content":"The ***Architecture Diagram*** given above explains the high-level design of the App.","lastModifiedDate":"2021-07-31"},{"lineNumber":34,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":35,"author":{"gitId":"-"},"content":"Given below is a quick overview of main components and how they interact with each other.","lastModifiedDate":"2021-07-31"},{"lineNumber":36,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2021-07-31"},{"lineNumber":37,"author":{"gitId":"-"},"content":"**Main components of the architecture**","lastModifiedDate":"2021-07-31"},{"lineNumber":38,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":39,"author":{"gitId":"-"},"content":"**`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.","lastModifiedDate":"2023-09-03"},{"lineNumber":40,"author":{"gitId":"-"},"content":"* At app launch, it initializes the other components in the correct sequence, and connects them up with each other.","lastModifiedDate":"2023-09-03"},{"lineNumber":41,"author":{"gitId":"-"},"content":"* At shut down, it shuts down the other components and invokes cleanup methods where necessary.","lastModifiedDate":"2023-09-03"},{"lineNumber":42,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":43,"author":{"gitId":"-"},"content":"The bulk of the app\u0027s work is done by the following four components:","lastModifiedDate":"2023-09-03"},{"lineNumber":44,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":45,"author":{"gitId":"-"},"content":"* [**`UI`**](#ui-component): The UI of the App.","lastModifiedDate":"2020-05-23"},{"lineNumber":46,"author":{"gitId":"-"},"content":"* [**`Logic`**](#logic-component): The command executor.","lastModifiedDate":"2020-05-23"},{"lineNumber":47,"author":{"gitId":"-"},"content":"* [**`Model`**](#model-component): Holds the data of the App in memory.","lastModifiedDate":"2020-05-23"},{"lineNumber":48,"author":{"gitId":"-"},"content":"* [**`Storage`**](#storage-component): Reads data from, and writes data to, the hard disk.","lastModifiedDate":"2020-05-23"},{"lineNumber":49,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":50,"author":{"gitId":"-"},"content":"[**`Commons`**](#common-classes) represents a collection of classes used by multiple other components.","lastModifiedDate":"2023-09-03"},{"lineNumber":51,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":52,"author":{"gitId":"-"},"content":"**How the architecture components interact with each other**","lastModifiedDate":"2020-05-23"},{"lineNumber":53,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":54,"author":{"gitId":"-"},"content":"The *Sequence Diagram* below shows how the components interact with each other for the scenario where the user issues the command `delete 1`.","lastModifiedDate":"2020-05-23"},{"lineNumber":55,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":56,"author":{"gitId":"-"},"content":"\u003cimg src\u003d\"images/ArchitectureSequenceDiagram.png\" width\u003d\"574\" /\u003e","lastModifiedDate":"2020-06-07"},{"lineNumber":57,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":58,"author":{"gitId":"-"},"content":"Each of the four main components (also shown in the diagram above),","lastModifiedDate":"2021-07-31"},{"lineNumber":59,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2021-07-31"},{"lineNumber":60,"author":{"gitId":"-"},"content":"* defines its *API* in an `interface` with the same name as the Component.","lastModifiedDate":"2021-07-31"},{"lineNumber":61,"author":{"gitId":"-"},"content":"* implements its functionality using a concrete `{Component Name}Manager` class (which follows the corresponding API `interface` mentioned in the previous point.","lastModifiedDate":"2021-07-31"},{"lineNumber":62,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2021-07-31"},{"lineNumber":63,"author":{"gitId":"-"},"content":"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\u0027s being coupled to the implementation of a component), as illustrated in the (partial) class diagram below.","lastModifiedDate":"2021-07-31"},{"lineNumber":64,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2021-07-31"},{"lineNumber":65,"author":{"gitId":"-"},"content":"\u003cimg src\u003d\"images/ComponentManagers.png\" width\u003d\"300\" /\u003e","lastModifiedDate":"2021-07-31"},{"lineNumber":66,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2021-07-31"},{"lineNumber":67,"author":{"gitId":"-"},"content":"The sections below give more details of each component.","lastModifiedDate":"2020-05-23"},{"lineNumber":68,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":69,"author":{"gitId":"-"},"content":"### UI component","lastModifiedDate":"2020-05-23"},{"lineNumber":70,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":71,"author":{"gitId":"-"},"content":"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)","lastModifiedDate":"2021-07-31"},{"lineNumber":72,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":73,"author":{"gitId":"-"},"content":"![Structure of the UI Component](images/UiClassDiagram.png)","lastModifiedDate":"2021-07-31"},{"lineNumber":74,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":75,"author":{"gitId":"-"},"content":"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.","lastModifiedDate":"2021-07-31"},{"lineNumber":76,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":77,"author":{"gitId":"-"},"content":"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)","lastModifiedDate":"2021-07-31"},{"lineNumber":78,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":79,"author":{"gitId":"-"},"content":"The `UI` component,","lastModifiedDate":"2020-05-23"},{"lineNumber":80,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":81,"author":{"gitId":"-"},"content":"* executes user commands using the `Logic` component.","lastModifiedDate":"2021-07-31"},{"lineNumber":82,"author":{"gitId":"-"},"content":"* listens for changes to `Model` data so that the UI can be updated with the modified data.","lastModifiedDate":"2021-07-31"},{"lineNumber":83,"author":{"gitId":"-"},"content":"* keeps a reference to the `Logic` component, because the `UI` relies on the `Logic` to execute commands.","lastModifiedDate":"2021-07-31"},{"lineNumber":84,"author":{"gitId":"-"},"content":"* depends on some classes in the `Model` component, as it displays `Person` object residing in the `Model`.","lastModifiedDate":"2021-07-31"},{"lineNumber":85,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":86,"author":{"gitId":"-"},"content":"### Logic component","lastModifiedDate":"2020-05-23"},{"lineNumber":87,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":88,"author":{"gitId":"-"},"content":"**API** : [`Logic.java`](https://github.com/se-edu/addressbook-level3/tree/master/src/main/java/seedu/address/logic/Logic.java)","lastModifiedDate":"2021-07-31"},{"lineNumber":89,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":90,"author":{"gitId":"-"},"content":"Here\u0027s a (partial) class diagram of the `Logic` component:","lastModifiedDate":"2021-07-31"},{"lineNumber":91,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":92,"author":{"gitId":"-"},"content":"\u003cimg src\u003d\"images/LogicClassDiagram.png\" width\u003d\"550\"/\u003e","lastModifiedDate":"2021-07-31"},{"lineNumber":93,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":94,"author":{"gitId":"-"},"content":"The sequence diagram below illustrates the interactions within the `Logic` component, taking `execute(\"delete 1\")` API call as an example.","lastModifiedDate":"2023-09-03"},{"lineNumber":95,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":96,"author":{"gitId":"-"},"content":"![Interactions Inside the Logic Component for the `delete 1` Command](images/DeleteSequenceDiagram.png)","lastModifiedDate":"2020-05-23"},{"lineNumber":97,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":98,"author":{"gitId":"-"},"content":"\u003cdiv markdown\u003d\"span\" class\u003d\"alert alert-info\"\u003e:information_source: **Note:** The lifeline for `DeleteCommandParser` should end at the destroy marker (X) but due to a limitation of PlantUML, the lifeline continues till the end of diagram.","lastModifiedDate":"2024-02-09"},{"lineNumber":99,"author":{"gitId":"-"},"content":"\u003c/div\u003e","lastModifiedDate":"2020-05-23"},{"lineNumber":100,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":101,"author":{"gitId":"-"},"content":"How the `Logic` component works:","lastModifiedDate":"2023-09-03"},{"lineNumber":102,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2023-09-03"},{"lineNumber":103,"author":{"gitId":"-"},"content":"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.","lastModifiedDate":"2023-09-03"},{"lineNumber":104,"author":{"gitId":"-"},"content":"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`.","lastModifiedDate":"2023-09-03"},{"lineNumber":105,"author":{"gitId":"-"},"content":"1. The command can communicate with the `Model` when it is executed (e.g. to delete a person).\u003cbr\u003e","lastModifiedDate":"2024-02-09"},{"lineNumber":106,"author":{"gitId":"-"},"content":" Note that although this is shown as a single step in the diagram above (for simplicity), in the code it can take several interactions (between the command object and the `Model`) to achieve.","lastModifiedDate":"2024-02-09"},{"lineNumber":107,"author":{"gitId":"-"},"content":"1. The result of the command execution is encapsulated as a `CommandResult` object which is returned back from `Logic`.","lastModifiedDate":"2023-09-03"},{"lineNumber":108,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2023-09-03"},{"lineNumber":109,"author":{"gitId":"-"},"content":"Here are the other classes in `Logic` (omitted from the class diagram above) that are used for parsing a user command:","lastModifiedDate":"2021-07-31"},{"lineNumber":110,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2021-07-31"},{"lineNumber":111,"author":{"gitId":"-"},"content":"\u003cimg src\u003d\"images/ParserClasses.png\" width\u003d\"600\"/\u003e","lastModifiedDate":"2021-07-31"},{"lineNumber":112,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":113,"author":{"gitId":"-"},"content":"How the parsing works:","lastModifiedDate":"2021-07-31"},{"lineNumber":114,"author":{"gitId":"-"},"content":"* 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.","lastModifiedDate":"2021-07-31"},{"lineNumber":115,"author":{"gitId":"-"},"content":"* 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.","lastModifiedDate":"2021-07-31"},{"lineNumber":116,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":117,"author":{"gitId":"-"},"content":"### Model component","lastModifiedDate":"2021-07-31"},{"lineNumber":118,"author":{"gitId":"-"},"content":"**API** : [`Model.java`](https://github.com/se-edu/addressbook-level3/tree/master/src/main/java/seedu/address/model/Model.java)","lastModifiedDate":"2020-05-23"},{"lineNumber":119,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":120,"author":{"gitId":"-"},"content":"\u003cimg src\u003d\"images/ModelClassDiagram.png\" width\u003d\"450\" /\u003e","lastModifiedDate":"2021-07-31"},{"lineNumber":121,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":122,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":123,"author":{"gitId":"-"},"content":"The `Model` component,","lastModifiedDate":"2021-07-31"},{"lineNumber":124,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":125,"author":{"gitId":"-"},"content":"* stores the address book data i.e., all `Person` objects (which are contained in a `UniquePersonList` object).","lastModifiedDate":"2021-07-31"},{"lineNumber":126,"author":{"gitId":"-"},"content":"* stores the currently \u0027selected\u0027 `Person` objects (e.g., results of a search query) as a separate _filtered_ list which is exposed to outsiders as an unmodifiable `ObservableList\u003cPerson\u003e` that can be \u0027observed\u0027 e.g. the UI can be bound to this list so that the UI automatically updates when the data in the list change.","lastModifiedDate":"2021-07-31"},{"lineNumber":127,"author":{"gitId":"-"},"content":"* stores a `UserPref` object that represents the user’s preferences. This is exposed to the outside as a `ReadOnlyUserPref` objects.","lastModifiedDate":"2021-07-31"},{"lineNumber":128,"author":{"gitId":"-"},"content":"* 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)","lastModifiedDate":"2021-07-31"},{"lineNumber":129,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2021-07-31"},{"lineNumber":130,"author":{"gitId":"-"},"content":"\u003cdiv markdown\u003d\"span\" class\u003d\"alert alert-info\"\u003e: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.\u003cbr\u003e","lastModifiedDate":"2021-07-31"},{"lineNumber":131,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2021-07-31"},{"lineNumber":132,"author":{"gitId":"-"},"content":"\u003cimg src\u003d\"images/BetterModelClassDiagram.png\" width\u003d\"450\" /\u003e","lastModifiedDate":"2021-07-31"},{"lineNumber":133,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":134,"author":{"gitId":"-"},"content":"\u003c/div\u003e","lastModifiedDate":"2020-05-23"},{"lineNumber":135,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":136,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":137,"author":{"gitId":"-"},"content":"### Storage component","lastModifiedDate":"2020-05-23"},{"lineNumber":138,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":139,"author":{"gitId":"-"},"content":"**API** : [`Storage.java`](https://github.com/se-edu/addressbook-level3/tree/master/src/main/java/seedu/address/storage/Storage.java)","lastModifiedDate":"2020-05-23"},{"lineNumber":140,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":141,"author":{"gitId":"-"},"content":"\u003cimg src\u003d\"images/StorageClassDiagram.png\" width\u003d\"550\" /\u003e","lastModifiedDate":"2021-07-31"},{"lineNumber":142,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2021-07-31"},{"lineNumber":143,"author":{"gitId":"-"},"content":"The `Storage` component,","lastModifiedDate":"2020-05-23"},{"lineNumber":144,"author":{"gitId":"-"},"content":"* can save both address book data and user preference data in JSON format, and read them back into corresponding objects.","lastModifiedDate":"2023-09-03"},{"lineNumber":145,"author":{"gitId":"-"},"content":"* inherits from both `AddressBookStorage` and `UserPrefStorage`, which means it can be treated as either one (if only the functionality of only one is needed).","lastModifiedDate":"2021-07-31"},{"lineNumber":146,"author":{"gitId":"-"},"content":"* depends on some classes in the `Model` component (because the `Storage` component\u0027s job is to save/retrieve objects that belong to the `Model`)","lastModifiedDate":"2021-07-21"},{"lineNumber":147,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":148,"author":{"gitId":"-"},"content":"### Common classes","lastModifiedDate":"2020-05-23"},{"lineNumber":149,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":150,"author":{"gitId":"-"},"content":"Classes used by multiple components are in the `seedu.addressbook.commons` package.","lastModifiedDate":"2020-05-23"},{"lineNumber":151,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":152,"author":{"gitId":"-"},"content":"--------------------------------------------------------------------------------------------------------------------","lastModifiedDate":"2020-05-23"},{"lineNumber":153,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":154,"author":{"gitId":"-"},"content":"## **Implementation**","lastModifiedDate":"2020-05-23"},{"lineNumber":155,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":156,"author":{"gitId":"-"},"content":"This section describes some noteworthy details on how certain features are implemented.","lastModifiedDate":"2020-05-23"},{"lineNumber":157,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":158,"author":{"gitId":"-"},"content":"### \\[Proposed\\] Undo/redo feature","lastModifiedDate":"2020-06-07"},{"lineNumber":159,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":160,"author":{"gitId":"-"},"content":"#### Proposed Implementation","lastModifiedDate":"2020-05-23"},{"lineNumber":161,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":162,"author":{"gitId":"-"},"content":"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:","lastModifiedDate":"2020-05-23"},{"lineNumber":163,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":164,"author":{"gitId":"-"},"content":"* `VersionedAddressBook#commit()` — Saves the current address book state in its history.","lastModifiedDate":"2020-05-23"},{"lineNumber":165,"author":{"gitId":"-"},"content":"* `VersionedAddressBook#undo()` — Restores the previous address book state from its history.","lastModifiedDate":"2020-05-23"},{"lineNumber":166,"author":{"gitId":"-"},"content":"* `VersionedAddressBook#redo()` — Restores a previously undone address book state from its history.","lastModifiedDate":"2020-05-23"},{"lineNumber":167,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":168,"author":{"gitId":"-"},"content":"These operations are exposed in the `Model` interface as `Model#commitAddressBook()`, `Model#undoAddressBook()` and `Model#redoAddressBook()` respectively.","lastModifiedDate":"2020-05-23"},{"lineNumber":169,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":170,"author":{"gitId":"-"},"content":"Given below is an example usage scenario and how the undo/redo mechanism behaves at each step.","lastModifiedDate":"2020-05-23"},{"lineNumber":171,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":172,"author":{"gitId":"-"},"content":"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.","lastModifiedDate":"2020-05-23"},{"lineNumber":173,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":174,"author":{"gitId":"-"},"content":"![UndoRedoState0](images/UndoRedoState0.png)","lastModifiedDate":"2020-05-23"},{"lineNumber":175,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":176,"author":{"gitId":"-"},"content":"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.","lastModifiedDate":"2020-05-23"},{"lineNumber":177,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":178,"author":{"gitId":"-"},"content":"![UndoRedoState1](images/UndoRedoState1.png)","lastModifiedDate":"2020-05-23"},{"lineNumber":179,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":180,"author":{"gitId":"-"},"content":"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`.","lastModifiedDate":"2020-05-23"},{"lineNumber":181,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":182,"author":{"gitId":"-"},"content":"![UndoRedoState2](images/UndoRedoState2.png)","lastModifiedDate":"2020-05-23"},{"lineNumber":183,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":184,"author":{"gitId":"-"},"content":"\u003cdiv markdown\u003d\"span\" class\u003d\"alert alert-info\"\u003e: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`.","lastModifiedDate":"2020-05-23"},{"lineNumber":185,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":186,"author":{"gitId":"-"},"content":"\u003c/div\u003e","lastModifiedDate":"2020-05-23"},{"lineNumber":187,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":188,"author":{"gitId":"-"},"content":"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.","lastModifiedDate":"2020-05-23"},{"lineNumber":189,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":190,"author":{"gitId":"-"},"content":"![UndoRedoState3](images/UndoRedoState3.png)","lastModifiedDate":"2020-05-23"},{"lineNumber":191,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":192,"author":{"gitId":"-"},"content":"\u003cdiv markdown\u003d\"span\" class\u003d\"alert alert-info\"\u003e: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","lastModifiedDate":"2020-05-23"},{"lineNumber":193,"author":{"gitId":"-"},"content":"than attempting to perform the undo.","lastModifiedDate":"2020-05-23"},{"lineNumber":194,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":195,"author":{"gitId":"-"},"content":"\u003c/div\u003e","lastModifiedDate":"2020-05-23"},{"lineNumber":196,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":197,"author":{"gitId":"-"},"content":"The following sequence diagram shows how an undo operation goes through the `Logic` component:","lastModifiedDate":"2024-02-09"},{"lineNumber":198,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":199,"author":{"gitId":"-"},"content":"![UndoSequenceDiagram](images/UndoSequenceDiagram-Logic.png)","lastModifiedDate":"2024-02-09"},{"lineNumber":200,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":201,"author":{"gitId":"-"},"content":"\u003cdiv markdown\u003d\"span\" class\u003d\"alert alert-info\"\u003e: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.","lastModifiedDate":"2020-05-23"},{"lineNumber":202,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":203,"author":{"gitId":"-"},"content":"\u003c/div\u003e","lastModifiedDate":"2020-05-23"},{"lineNumber":204,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":205,"author":{"gitId":"-"},"content":"Similarly, how an undo operation goes through the `Model` component is shown below:","lastModifiedDate":"2024-02-09"},{"lineNumber":206,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2024-02-09"},{"lineNumber":207,"author":{"gitId":"-"},"content":"![UndoSequenceDiagram](images/UndoSequenceDiagram-Model.png)","lastModifiedDate":"2024-02-09"},{"lineNumber":208,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2024-02-09"},{"lineNumber":209,"author":{"gitId":"-"},"content":"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.","lastModifiedDate":"2020-05-23"},{"lineNumber":210,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":211,"author":{"gitId":"-"},"content":"\u003cdiv markdown\u003d\"span\" class\u003d\"alert alert-info\"\u003e: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.","lastModifiedDate":"2020-05-23"},{"lineNumber":212,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":213,"author":{"gitId":"-"},"content":"\u003c/div\u003e","lastModifiedDate":"2020-05-23"},{"lineNumber":214,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":215,"author":{"gitId":"-"},"content":"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.","lastModifiedDate":"2020-05-23"},{"lineNumber":216,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":217,"author":{"gitId":"-"},"content":"![UndoRedoState4](images/UndoRedoState4.png)","lastModifiedDate":"2020-05-23"},{"lineNumber":218,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":219,"author":{"gitId":"-"},"content":"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.","lastModifiedDate":"2020-05-23"},{"lineNumber":220,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":221,"author":{"gitId":"-"},"content":"![UndoRedoState5](images/UndoRedoState5.png)","lastModifiedDate":"2020-05-23"},{"lineNumber":222,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":223,"author":{"gitId":"-"},"content":"The following activity diagram summarizes what happens when a user executes a new command:","lastModifiedDate":"2020-05-23"},{"lineNumber":224,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":225,"author":{"gitId":"-"},"content":"\u003cimg src\u003d\"images/CommitActivityDiagram.png\" width\u003d\"250\" /\u003e","lastModifiedDate":"2021-07-31"},{"lineNumber":226,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":227,"author":{"gitId":"-"},"content":"#### Design considerations:","lastModifiedDate":"2021-07-31"},{"lineNumber":228,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":229,"author":{"gitId":"-"},"content":"**Aspect: How undo \u0026 redo executes:**","lastModifiedDate":"2021-07-31"},{"lineNumber":230,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":231,"author":{"gitId":"-"},"content":"* **Alternative 1 (current choice):** Saves the entire address book.","lastModifiedDate":"2020-05-23"},{"lineNumber":232,"author":{"gitId":"-"},"content":" * Pros: Easy to implement.","lastModifiedDate":"2020-05-23"},{"lineNumber":233,"author":{"gitId":"-"},"content":" * Cons: May have performance issues in terms of memory usage.","lastModifiedDate":"2020-05-23"},{"lineNumber":234,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":235,"author":{"gitId":"-"},"content":"* **Alternative 2:** Individual command knows how to undo/redo by","lastModifiedDate":"2020-05-23"},{"lineNumber":236,"author":{"gitId":"-"},"content":" itself.","lastModifiedDate":"2020-05-23"},{"lineNumber":237,"author":{"gitId":"-"},"content":" * Pros: Will use less memory (e.g. for `delete`, just save the person being deleted).","lastModifiedDate":"2020-05-23"},{"lineNumber":238,"author":{"gitId":"-"},"content":" * Cons: We must ensure that the implementation of each individual command are correct.","lastModifiedDate":"2020-05-23"},{"lineNumber":239,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":240,"author":{"gitId":"-"},"content":"_{more aspects and alternatives to be added}_","lastModifiedDate":"2020-05-23"},{"lineNumber":241,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":242,"author":{"gitId":"-"},"content":"### \\[Proposed\\] Data archiving","lastModifiedDate":"2020-05-23"},{"lineNumber":243,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":244,"author":{"gitId":"-"},"content":"_{Explain here how the data archiving feature will be implemented}_","lastModifiedDate":"2020-05-23"},{"lineNumber":245,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":246,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":247,"author":{"gitId":"-"},"content":"--------------------------------------------------------------------------------------------------------------------","lastModifiedDate":"2020-05-23"},{"lineNumber":248,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":249,"author":{"gitId":"-"},"content":"## **Documentation, logging, testing, configuration, dev-ops**","lastModifiedDate":"2020-06-07"},{"lineNumber":250,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":251,"author":{"gitId":"-"},"content":"* [Documentation guide](Documentation.md)","lastModifiedDate":"2020-06-07"},{"lineNumber":252,"author":{"gitId":"-"},"content":"* [Testing guide](Testing.md)","lastModifiedDate":"2020-06-07"},{"lineNumber":253,"author":{"gitId":"-"},"content":"* [Logging guide](Logging.md)","lastModifiedDate":"2020-06-07"},{"lineNumber":254,"author":{"gitId":"-"},"content":"* [Configuration guide](Configuration.md)","lastModifiedDate":"2020-06-07"},{"lineNumber":255,"author":{"gitId":"-"},"content":"* [DevOps guide](DevOps.md)","lastModifiedDate":"2020-06-07"},{"lineNumber":256,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":257,"author":{"gitId":"-"},"content":"--------------------------------------------------------------------------------------------------------------------","lastModifiedDate":"2020-05-23"},{"lineNumber":258,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":259,"author":{"gitId":"-"},"content":"## **Appendix: Requirements**","lastModifiedDate":"2020-05-23"},{"lineNumber":260,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":261,"author":{"gitId":"-"},"content":"### Product scope","lastModifiedDate":"2020-05-23"},{"lineNumber":262,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":263,"author":{"gitId":"HM33-Stu"},"content":"**Target user profile**: People sourcing for internships (specifically, CS students)","lastModifiedDate":"2024-03-02"},{"lineNumber":264,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":265,"author":{"gitId":"HM33-Stu"},"content":"* has a need to manage a significant number of internship applications","lastModifiedDate":"2024-03-02"},{"lineNumber":266,"author":{"gitId":"-"},"content":"* prefer desktop apps over other types","lastModifiedDate":"2020-05-23"},{"lineNumber":267,"author":{"gitId":"-"},"content":"* can type fast","lastModifiedDate":"2020-05-23"},{"lineNumber":268,"author":{"gitId":"-"},"content":"* prefers typing to mouse interactions","lastModifiedDate":"2020-05-26"},{"lineNumber":269,"author":{"gitId":"-"},"content":"* is reasonably comfortable using CLI apps","lastModifiedDate":"2020-05-23"},{"lineNumber":270,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":271,"author":{"gitId":"HM33-Stu"},"content":"**Value proposition**:","lastModifiedDate":"2024-03-02"},{"lineNumber":272,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":273,"author":{"gitId":"HM33-Stu"},"content":"``` plaintext","lastModifiedDate":"2024-03-02"},{"lineNumber":274,"author":{"gitId":"HM33-Stu"},"content":"Effortlessly manage, search, and sift through your various internship applications.","lastModifiedDate":"2024-03-02"},{"lineNumber":275,"author":{"gitId":"HM33-Stu"},"content":"Enter details rapidly using CLI, and avoid losing track of crucial information.","lastModifiedDate":"2024-03-02"},{"lineNumber":276,"author":{"gitId":"HM33-Stu"},"content":"Targeted to those with numerous applications to keep track of and prefer using CLI.","lastModifiedDate":"2024-03-02"},{"lineNumber":277,"author":{"gitId":"HM33-Stu"},"content":"Your all-in-one solution for seamless application management.","lastModifiedDate":"2024-03-02"},{"lineNumber":278,"author":{"gitId":"HM33-Stu"},"content":"```","lastModifiedDate":"2024-03-02"},{"lineNumber":279,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":280,"author":{"gitId":"-"},"content":"### User stories","lastModifiedDate":"2020-06-07"},{"lineNumber":281,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":282,"author":{"gitId":"HM33-Stu"},"content":"Priorities: High (Must-Have) - `* * *`, Medium (Nice-To-Have) - `* *`, Low (Not Useful) - `*`","lastModifiedDate":"2024-03-02"},{"lineNumber":283,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":284,"author":{"gitId":"HM33-Stu"},"content":"| Priority | As a/an …​ | I want to …​ | So that I can…​ |","lastModifiedDate":"2024-03-02"},{"lineNumber":285,"author":{"gitId":"HM33-Stu"},"content":"|----------|-----------------|--------------------------------------------------|---------------------------------------------------------------|","lastModifiedDate":"2024-03-02"},{"lineNumber":286,"author":{"gitId":"HM33-Stu"},"content":"| `* * *` | impatient user | Enter internship information from the main page | Quickly note down potential internships at a career fair |","lastModifiedDate":"2024-03-02"},{"lineNumber":287,"author":{"gitId":"HM33-Stu"},"content":"| `* * *` | savvy user | Access all commands via a text-based input | Add, delete, and modify entries without using my mouse |","lastModifiedDate":"2024-03-02"},{"lineNumber":288,"author":{"gitId":"HM33-Stu"},"content":"| `* * *` | beginner user | Access sample data in the app | Play around with the features to get the hang of them |","lastModifiedDate":"2024-03-02"},{"lineNumber":289,"author":{"gitId":"HM33-Stu"},"content":"| `* * *` | up-to-date user | Modify internship details | Keep myself updated on changing details |","lastModifiedDate":"2024-03-02"},{"lineNumber":290,"author":{"gitId":"HM33-Stu"},"content":"| `* * *` | regular user | View all internship details | Easily view all details in one screen. |","lastModifiedDate":"2024-03-02"},{"lineNumber":291,"author":{"gitId":"HM33-Stu"},"content":"| `* * *` | detailed user | Add information to the notes section of an entry | Customise to see internships that fall under specific fields. |","lastModifiedDate":"2024-03-02"},{"lineNumber":292,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":293,"author":{"gitId":"-"},"content":"*{More to be added}*","lastModifiedDate":"2020-05-23"},{"lineNumber":294,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":295,"author":{"gitId":"-"},"content":"### Use cases","lastModifiedDate":"2020-06-07"},{"lineNumber":296,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":297,"author":{"gitId":"HM33-Stu"},"content":"(For all use cases below, the **System** is `CareerSync` and the **Actor** is the `user`, unless specified otherwise)","lastModifiedDate":"2024-03-02"},{"lineNumber":298,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":299,"author":{"gitId":"HM33-Stu"},"content":"**Use case: Enter Internship Information From The Main Page**","lastModifiedDate":"2024-03-02"},{"lineNumber":300,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":301,"author":{"gitId":"-"},"content":"**MSS**","lastModifiedDate":"2020-05-23"},{"lineNumber":302,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":303,"author":{"gitId":"HM33-Stu"},"content":"1. User accesses the main page. ","lastModifiedDate":"2024-03-02"},{"lineNumber":304,"author":{"gitId":"HM33-Stu"},"content":"2. User selects the option to enter internship information. ","lastModifiedDate":"2024-03-02"},{"lineNumber":305,"author":{"gitId":"HM33-Stu"},"content":"3. System prompts the user to input internship details such as title, company, start/end dates, etc. ","lastModifiedDate":"2024-03-02"},{"lineNumber":306,"author":{"gitId":"HM33-Stu"},"content":"4. User inputs the required internship details. ","lastModifiedDate":"2024-03-02"},{"lineNumber":307,"author":{"gitId":"HM33-Stu"},"content":"5. System validates the input data. ","lastModifiedDate":"2024-03-02"},{"lineNumber":308,"author":{"gitId":"HM33-Stu"},"content":"6. System saves the internship information. ","lastModifiedDate":"2024-03-02"},{"lineNumber":309,"author":{"gitId":"HM33-Stu"},"content":"7. System displays a confirmation message indicating successful submission.","lastModifiedDate":"2024-03-02"},{"lineNumber":310,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":311,"author":{"gitId":"-"},"content":" Use case ends.","lastModifiedDate":"2020-05-23"},{"lineNumber":312,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":313,"author":{"gitId":"-"},"content":"**Extensions**","lastModifiedDate":"2020-05-23"},{"lineNumber":314,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":315,"author":{"gitId":"HM33-Stu"},"content":"* 1a. User is unable to access the main page.","lastModifiedDate":"2024-03-02"},{"lineNumber":316,"author":{"gitId":"HM33-Stu"},"content":" *1a1. System displays an error message.","lastModifiedDate":"2024-03-02"},{"lineNumber":317,"author":{"gitId":"HM33-Stu"},"content":"* 2a. User cancels entering internship information.","lastModifiedDate":"2024-03-02"},{"lineNumber":318,"author":{"gitId":"HM33-Stu"},"content":" * 2a1. System cancels the entry process and returns the user to the main page.","lastModifiedDate":"2024-03-02"},{"lineNumber":319,"author":{"gitId":"HM33-Stu"},"content":"* 5a. User inputs invalid internship details.","lastModifiedDate":"2024-03-02"},{"lineNumber":320,"author":{"gitId":"HM33-Stu"},"content":" * 5a1. System displays an error message indicating the specific validation error(s).","lastModifiedDate":"2024-03-02"},{"lineNumber":321,"author":{"gitId":"HM33-Stu"},"content":"* 6a. System fails to save the internship information.","lastModifiedDate":"2024-03-02"},{"lineNumber":322,"author":{"gitId":"HM33-Stu"},"content":" * 6a1. System displays an error message and prompts the user to retry or cancel the submission.","lastModifiedDate":"2024-03-02"},{"lineNumber":323,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":324,"author":{"gitId":"-"},"content":" Use case ends.","lastModifiedDate":"2020-05-23"},{"lineNumber":325,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":326,"author":{"gitId":"HM33-Stu"},"content":"**Use case: Access All Commands Via A Text-Based Input**","lastModifiedDate":"2024-03-02"},{"lineNumber":327,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":328,"author":{"gitId":"HM33-Stu"},"content":"**MSS**","lastModifiedDate":"2024-03-02"},{"lineNumber":329,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2024-03-02"},{"lineNumber":330,"author":{"gitId":"HM33-Stu"},"content":"1. User accesses the main page. ","lastModifiedDate":"2024-03-02"},{"lineNumber":331,"author":{"gitId":"HM33-Stu"},"content":"2. System displays a prompt for text-based input. ","lastModifiedDate":"2024-03-02"},{"lineNumber":332,"author":{"gitId":"HM33-Stu"},"content":"3. User enters a command using text-based input. ","lastModifiedDate":"2024-03-02"},{"lineNumber":333,"author":{"gitId":"HM33-Stu"},"content":"4. System recognizes and processes the entered command. ","lastModifiedDate":"2024-03-02"},{"lineNumber":334,"author":{"gitId":"HM33-Stu"},"content":"5. System executes the requested action corresponding to the entered command. ","lastModifiedDate":"2024-03-02"},{"lineNumber":335,"author":{"gitId":"HM33-Stu"},"content":"6. User receives feedback or output based on the executed command.","lastModifiedDate":"2024-03-02"},{"lineNumber":336,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2024-03-02"},{"lineNumber":337,"author":{"gitId":"HM33-Stu"},"content":" Use case ends.","lastModifiedDate":"2024-03-02"},{"lineNumber":338,"author":{"gitId":"HM33-Stu"},"content":"","lastModifiedDate":"2024-03-02"},{"lineNumber":339,"author":{"gitId":"HM33-Stu"},"content":"**Extensions**","lastModifiedDate":"2024-03-02"},{"lineNumber":340,"author":{"gitId":"HM33-Stu"},"content":"","lastModifiedDate":"2024-03-02"},{"lineNumber":341,"author":{"gitId":"HM33-Stu"},"content":"* 1a. User is unable to access the main page.","lastModifiedDate":"2024-03-02"},{"lineNumber":342,"author":{"gitId":"HM33-Stu"},"content":" * 1a1. System displays an error message.","lastModifiedDate":"2024-03-02"},{"lineNumber":343,"author":{"gitId":"HM33-Stu"},"content":"* 3a. User enters an invalid command.","lastModifiedDate":"2024-03-02"},{"lineNumber":344,"author":{"gitId":"HM33-Stu"},"content":" * 3a1. System displays an error message indicating that the command is not recognized.","lastModifiedDate":"2024-03-02"},{"lineNumber":345,"author":{"gitId":"HM33-Stu"},"content":"* 4a. System fails to recognize or process the entered command.","lastModifiedDate":"2024-03-02"},{"lineNumber":346,"author":{"gitId":"HM33-Stu"},"content":" * 4a1. System displays an error message and prompts the user to retry or enter a different command.","lastModifiedDate":"2024-03-02"},{"lineNumber":347,"author":{"gitId":"HM33-Stu"},"content":"* 5a. System encounters an error while executing the requested action.","lastModifiedDate":"2024-03-02"},{"lineNumber":348,"author":{"gitId":"HM33-Stu"},"content":" * 5a1. System displays an error message and prompts the user to retry or perform a different action.","lastModifiedDate":"2024-03-02"},{"lineNumber":349,"author":{"gitId":"HM33-Stu"},"content":"","lastModifiedDate":"2024-03-02"},{"lineNumber":350,"author":{"gitId":"HM33-Stu"},"content":" Use case ends.","lastModifiedDate":"2024-03-02"},{"lineNumber":351,"author":{"gitId":"HM33-Stu"},"content":"","lastModifiedDate":"2024-03-02"},{"lineNumber":352,"author":{"gitId":"HM33-Stu"},"content":"**Use case: Access Sample Data In The App**","lastModifiedDate":"2024-03-02"},{"lineNumber":353,"author":{"gitId":"HM33-Stu"},"content":"","lastModifiedDate":"2024-03-02"},{"lineNumber":354,"author":{"gitId":"HM33-Stu"},"content":"**MSS**","lastModifiedDate":"2024-03-02"},{"lineNumber":355,"author":{"gitId":"HM33-Stu"},"content":"","lastModifiedDate":"2024-03-02"},{"lineNumber":356,"author":{"gitId":"HM33-Stu"},"content":"1. User accesses the main page. ","lastModifiedDate":"2024-03-02"},{"lineNumber":357,"author":{"gitId":"HM33-Stu"},"content":"2. User selects the option to access sample data. ","lastModifiedDate":"2024-03-02"},{"lineNumber":358,"author":{"gitId":"HM33-Stu"},"content":"3. System retrieves and displays sample internship data. ","lastModifiedDate":"2024-03-02"},{"lineNumber":359,"author":{"gitId":"HM33-Stu"},"content":"4. User views the sample internship data presented by the system.","lastModifiedDate":"2024-03-02"},{"lineNumber":360,"author":{"gitId":"HM33-Stu"},"content":"","lastModifiedDate":"2024-03-02"},{"lineNumber":361,"author":{"gitId":"HM33-Stu"},"content":" Use case ends.","lastModifiedDate":"2024-03-02"},{"lineNumber":362,"author":{"gitId":"HM33-Stu"},"content":"","lastModifiedDate":"2024-03-02"},{"lineNumber":363,"author":{"gitId":"HM33-Stu"},"content":"**Extensions**","lastModifiedDate":"2024-03-02"},{"lineNumber":364,"author":{"gitId":"HM33-Stu"},"content":"","lastModifiedDate":"2024-03-02"},{"lineNumber":365,"author":{"gitId":"HM33-Stu"},"content":"* 1a. User is unable to access the main page.","lastModifiedDate":"2024-03-02"},{"lineNumber":366,"author":{"gitId":"HM33-Stu"},"content":" * 1a1. System displays an error message.","lastModifiedDate":"2024-03-02"},{"lineNumber":367,"author":{"gitId":"HM33-Stu"},"content":"* 2a. User cancels accessing sample data.","lastModifiedDate":"2024-03-02"},{"lineNumber":368,"author":{"gitId":"HM33-Stu"},"content":" * 2a1. System cancels the process and returns the user to the main page.","lastModifiedDate":"2024-03-02"},{"lineNumber":369,"author":{"gitId":"HM33-Stu"},"content":"* 3a. System fails to retrieve sample data.","lastModifiedDate":"2024-03-02"},{"lineNumber":370,"author":{"gitId":"HM33-Stu"},"content":" * 3a1. System displays an error message and prompts the user to retry or exit.","lastModifiedDate":"2024-03-02"},{"lineNumber":371,"author":{"gitId":"HM33-Stu"},"content":"* 4a. User encounters issues while viewing the sample data.","lastModifiedDate":"2024-03-02"},{"lineNumber":372,"author":{"gitId":"HM33-Stu"},"content":" * 4a1. System displays an error message and prompts the user to retry or exit.","lastModifiedDate":"2024-03-02"},{"lineNumber":373,"author":{"gitId":"HM33-Stu"},"content":"","lastModifiedDate":"2024-03-02"},{"lineNumber":374,"author":{"gitId":"HM33-Stu"},"content":" Use case ends.","lastModifiedDate":"2024-03-02"},{"lineNumber":375,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2024-03-02"},{"lineNumber":376,"author":{"gitId":"HM33-Stu"},"content":"**Use case: Modify Internship Details**","lastModifiedDate":"2024-03-02"},{"lineNumber":377,"author":{"gitId":"HM33-Stu"},"content":"","lastModifiedDate":"2024-03-02"},{"lineNumber":378,"author":{"gitId":"HM33-Stu"},"content":"**MSS**","lastModifiedDate":"2024-03-02"},{"lineNumber":379,"author":{"gitId":"HM33-Stu"},"content":"","lastModifiedDate":"2024-03-02"},{"lineNumber":380,"author":{"gitId":"HM33-Stu"},"content":"1. User accesses the main page. ","lastModifiedDate":"2024-03-02"},{"lineNumber":381,"author":{"gitId":"HM33-Stu"},"content":"2. User selects the option to view all internship details. ","lastModifiedDate":"2024-03-02"},{"lineNumber":382,"author":{"gitId":"HM33-Stu"},"content":"3. System retrieves and displays a list of all entered internship details. ","lastModifiedDate":"2024-03-02"},{"lineNumber":383,"author":{"gitId":"HM33-Stu"},"content":"4. User selects the internship entry to be modified. ","lastModifiedDate":"2024-03-02"},{"lineNumber":384,"author":{"gitId":"HM33-Stu"},"content":"5. System presents the selected internship details for editing. ","lastModifiedDate":"2024-03-02"},{"lineNumber":385,"author":{"gitId":"HM33-Stu"},"content":"6. User modifies the necessary internship details. ","lastModifiedDate":"2024-03-02"},{"lineNumber":386,"author":{"gitId":"HM33-Stu"},"content":"7. System validates the modified data.","lastModifiedDate":"2024-03-02"},{"lineNumber":387,"author":{"gitId":"HM33-Stu"},"content":"8. System saves the updated internship information. ","lastModifiedDate":"2024-03-02"},{"lineNumber":388,"author":{"gitId":"HM33-Stu"},"content":"9. System displays a confirmation message indicating successful modification.","lastModifiedDate":"2024-03-02"},{"lineNumber":389,"author":{"gitId":"HM33-Stu"},"content":"","lastModifiedDate":"2024-03-02"},{"lineNumber":390,"author":{"gitId":"HM33-Stu"},"content":" Use case ends.","lastModifiedDate":"2024-03-02"},{"lineNumber":391,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":392,"author":{"gitId":"HM33-Stu"},"content":"**Extensions**","lastModifiedDate":"2024-03-02"},{"lineNumber":393,"author":{"gitId":"HM33-Stu"},"content":"","lastModifiedDate":"2024-03-02"},{"lineNumber":394,"author":{"gitId":"HM33-Stu"},"content":"* 1a. User is unable to access the main page.","lastModifiedDate":"2024-03-02"},{"lineNumber":395,"author":{"gitId":"HM33-Stu"},"content":" * 1a1. System displays an error message.","lastModifiedDate":"2024-03-02"},{"lineNumber":396,"author":{"gitId":"HM33-Stu"},"content":"* 2a. User cancels viewing all internship details.","lastModifiedDate":"2024-03-02"},{"lineNumber":397,"author":{"gitId":"HM33-Stu"},"content":" * 2a1. System cancels the process and returns the user to the main page.","lastModifiedDate":"2024-03-02"},{"lineNumber":398,"author":{"gitId":"HM33-Stu"},"content":"* 4a. User cancels selecting the internship entry to be modified.","lastModifiedDate":"2024-03-02"},{"lineNumber":399,"author":{"gitId":"HM33-Stu"},"content":" * 4a1. System cancels the modification process and returns the user to the list of internship details.","lastModifiedDate":"2024-03-02"},{"lineNumber":400,"author":{"gitId":"HM33-Stu"},"content":"* 6a. User inputs invalid internship details.","lastModifiedDate":"2024-03-02"},{"lineNumber":401,"author":{"gitId":"HM33-Stu"},"content":" * 6a1. System displays an error message indicating the specific validation error(s).","lastModifiedDate":"2024-03-02"},{"lineNumber":402,"author":{"gitId":"HM33-Stu"},"content":"* 7a. System fails to validate the modified data.","lastModifiedDate":"2024-03-02"},{"lineNumber":403,"author":{"gitId":"HM33-Stu"},"content":" * 7a1. System displays an error message and prompts the user to correct the data.","lastModifiedDate":"2024-03-02"},{"lineNumber":404,"author":{"gitId":"HM33-Stu"},"content":"* 8a. System fails to save the updated internship information.","lastModifiedDate":"2024-03-02"},{"lineNumber":405,"author":{"gitId":"HM33-Stu"},"content":" * 8a1. System displays an error message and prompts the user to retry or exit.","lastModifiedDate":"2024-03-02"},{"lineNumber":406,"author":{"gitId":"HM33-Stu"},"content":"","lastModifiedDate":"2024-03-02"},{"lineNumber":407,"author":{"gitId":"HM33-Stu"},"content":" Use case ends.","lastModifiedDate":"2024-03-02"},{"lineNumber":408,"author":{"gitId":"HM33-Stu"},"content":"","lastModifiedDate":"2024-03-02"},{"lineNumber":409,"author":{"gitId":"HM33-Stu"},"content":"**Use case: View All Internship Details**","lastModifiedDate":"2024-03-02"},{"lineNumber":410,"author":{"gitId":"HM33-Stu"},"content":"","lastModifiedDate":"2024-03-02"},{"lineNumber":411,"author":{"gitId":"HM33-Stu"},"content":"**MSS**","lastModifiedDate":"2024-03-02"},{"lineNumber":412,"author":{"gitId":"HM33-Stu"},"content":"","lastModifiedDate":"2024-03-02"},{"lineNumber":413,"author":{"gitId":"HM33-Stu"},"content":"1. User accesses the main page. ","lastModifiedDate":"2024-03-02"},{"lineNumber":414,"author":{"gitId":"HM33-Stu"},"content":"2. User selects the option to view all internship details. ","lastModifiedDate":"2024-03-02"},{"lineNumber":415,"author":{"gitId":"HM33-Stu"},"content":"3. System retrieves and displays a list of all entered internship details. ","lastModifiedDate":"2024-03-02"},{"lineNumber":416,"author":{"gitId":"HM33-Stu"},"content":"4. User views the list of internship details presented by the system.","lastModifiedDate":"2024-03-02"},{"lineNumber":417,"author":{"gitId":"HM33-Stu"},"content":"","lastModifiedDate":"2024-03-02"},{"lineNumber":418,"author":{"gitId":"HM33-Stu"},"content":" Use case ends.","lastModifiedDate":"2024-03-02"},{"lineNumber":419,"author":{"gitId":"HM33-Stu"},"content":"","lastModifiedDate":"2024-03-02"},{"lineNumber":420,"author":{"gitId":"HM33-Stu"},"content":"**Extensions**","lastModifiedDate":"2024-03-02"},{"lineNumber":421,"author":{"gitId":"HM33-Stu"},"content":"","lastModifiedDate":"2024-03-02"},{"lineNumber":422,"author":{"gitId":"HM33-Stu"},"content":"* 1a. User is unable to access the main page.","lastModifiedDate":"2024-03-02"},{"lineNumber":423,"author":{"gitId":"HM33-Stu"},"content":" * 1a1. System displays an error message.","lastModifiedDate":"2024-03-02"},{"lineNumber":424,"author":{"gitId":"HM33-Stu"},"content":"* 2a. User cancels viewing all internship details.","lastModifiedDate":"2024-03-02"},{"lineNumber":425,"author":{"gitId":"HM33-Stu"},"content":" * 2a1. System cancels the process and returns the user to the main page.","lastModifiedDate":"2024-03-02"},{"lineNumber":426,"author":{"gitId":"HM33-Stu"},"content":"* 3a. System fails to retrieve all internship details.","lastModifiedDate":"2024-03-02"},{"lineNumber":427,"author":{"gitId":"HM33-Stu"},"content":" * 3a1. System displays an error message and prompts the user to retry or exit.","lastModifiedDate":"2024-03-02"},{"lineNumber":428,"author":{"gitId":"HM33-Stu"},"content":"","lastModifiedDate":"2024-03-02"},{"lineNumber":429,"author":{"gitId":"HM33-Stu"},"content":" Use case ends.","lastModifiedDate":"2024-03-02"},{"lineNumber":430,"author":{"gitId":"HM33-Stu"},"content":"","lastModifiedDate":"2024-03-02"},{"lineNumber":431,"author":{"gitId":"HM33-Stu"},"content":"**Use case: Add Information To The Notes Section Of An Entry**","lastModifiedDate":"2024-03-02"},{"lineNumber":432,"author":{"gitId":"HM33-Stu"},"content":"","lastModifiedDate":"2024-03-02"},{"lineNumber":433,"author":{"gitId":"HM33-Stu"},"content":"**MSS**","lastModifiedDate":"2024-03-02"},{"lineNumber":434,"author":{"gitId":"HM33-Stu"},"content":"","lastModifiedDate":"2024-03-02"},{"lineNumber":435,"author":{"gitId":"HM33-Stu"},"content":"1. User accesses the main page. ","lastModifiedDate":"2024-03-02"},{"lineNumber":436,"author":{"gitId":"HM33-Stu"},"content":"2. User selects the option to view all internship details.","lastModifiedDate":"2024-03-02"},{"lineNumber":437,"author":{"gitId":"HM33-Stu"},"content":"3. System retrieves and displays a list of all entered internship details.","lastModifiedDate":"2024-03-02"},{"lineNumber":438,"author":{"gitId":"HM33-Stu"},"content":"4. User selects the internship entry to which notes will be added.","lastModifiedDate":"2024-03-02"},{"lineNumber":439,"author":{"gitId":"HM33-Stu"},"content":"5. System presents the selected internship details along with the current notes section.","lastModifiedDate":"2024-03-02"},{"lineNumber":440,"author":{"gitId":"HM33-Stu"},"content":"6. User enters additional information in the notes section.","lastModifiedDate":"2024-03-02"},{"lineNumber":441,"author":{"gitId":"HM33-Stu"},"content":"7. System saves the updated notes.","lastModifiedDate":"2024-03-02"},{"lineNumber":442,"author":{"gitId":"HM33-Stu"},"content":"8. System displays a confirmation message indicating successful addition of notes.","lastModifiedDate":"2024-03-02"},{"lineNumber":443,"author":{"gitId":"HM33-Stu"},"content":"","lastModifiedDate":"2024-03-02"},{"lineNumber":444,"author":{"gitId":"HM33-Stu"},"content":" Use case ends.","lastModifiedDate":"2024-03-02"},{"lineNumber":445,"author":{"gitId":"HM33-Stu"},"content":"","lastModifiedDate":"2024-03-02"},{"lineNumber":446,"author":{"gitId":"HM33-Stu"},"content":"**Extensions**","lastModifiedDate":"2024-03-02"},{"lineNumber":447,"author":{"gitId":"HM33-Stu"},"content":"","lastModifiedDate":"2024-03-02"},{"lineNumber":448,"author":{"gitId":"HM33-Stu"},"content":"* 1a. User is unable to access the main page.","lastModifiedDate":"2024-03-02"},{"lineNumber":449,"author":{"gitId":"HM33-Stu"},"content":" * 1a1. System displays an error message.","lastModifiedDate":"2024-03-02"},{"lineNumber":450,"author":{"gitId":"HM33-Stu"},"content":"* 2a. User cancels viewing all internship details.","lastModifiedDate":"2024-03-02"},{"lineNumber":451,"author":{"gitId":"HM33-Stu"},"content":" * 2a1. System cancels the process and returns the user to the main page.","lastModifiedDate":"2024-03-02"},{"lineNumber":452,"author":{"gitId":"HM33-Stu"},"content":"* 4a. User cancels selecting the internship entry to add notes.","lastModifiedDate":"2024-03-02"},{"lineNumber":453,"author":{"gitId":"HM33-Stu"},"content":" * 4a1. System cancels the process and returns the user to the list of internship details.","lastModifiedDate":"2024-03-02"},{"lineNumber":454,"author":{"gitId":"HM33-Stu"},"content":"* 6a. User encounters an error while adding notes.","lastModifiedDate":"2024-03-02"},{"lineNumber":455,"author":{"gitId":"HM33-Stu"},"content":" * 6a1. System displays an error message and prompts the user to retry or exit.","lastModifiedDate":"2024-03-02"},{"lineNumber":456,"author":{"gitId":"HM33-Stu"},"content":"* 7a. System fails to save the updated notes.","lastModifiedDate":"2024-03-02"},{"lineNumber":457,"author":{"gitId":"HM33-Stu"},"content":" * 7a1. System displays an error message and prompts the user to retry or exit.","lastModifiedDate":"2024-03-02"},{"lineNumber":458,"author":{"gitId":"HM33-Stu"},"content":"","lastModifiedDate":"2024-03-02"},{"lineNumber":459,"author":{"gitId":"HM33-Stu"},"content":" Use case ends.","lastModifiedDate":"2024-03-02"},{"lineNumber":460,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":461,"author":{"gitId":"-"},"content":"*{More to be added}*","lastModifiedDate":"2020-05-23"},{"lineNumber":462,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":463,"author":{"gitId":"-"},"content":"### Non-Functional Requirements","lastModifiedDate":"2020-05-23"},{"lineNumber":464,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":465,"author":{"gitId":"-"},"content":"1. Should work on any _mainstream OS_ as long as it has Java `11` or above installed.","lastModifiedDate":"2020-05-23"},{"lineNumber":466,"author":{"gitId":"HM33-Stu"},"content":"2. Should be able to hold up to 100 internship entries without a noticeable sluggishness in performance for typical usage.","lastModifiedDate":"2024-03-02"},{"lineNumber":467,"author":{"gitId":"-"},"content":"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.","lastModifiedDate":"2020-05-23"},{"lineNumber":468,"author":{"gitId":"HM33-Stu"},"content":"4. Storage of data should be in a format that is easy to read and write by humans, and easy to parse by machines.","lastModifiedDate":"2024-03-02"},{"lineNumber":469,"author":{"gitId":"HM33-Stu"},"content":"5. System should be backward compatible with data produced by earlier versions of the system.","lastModifiedDate":"2024-03-02"},{"lineNumber":470,"author":{"gitId":"HM33-Stu"},"content":"6. System is expected to be used by a single user on a machine, and does not need to support multiple users on the same machine.","lastModifiedDate":"2024-03-02"},{"lineNumber":471,"author":{"gitId":"HM33-Stu"},"content":"7. System should launch within 2 seconds on any modern machine.","lastModifiedDate":"2024-03-02"},{"lineNumber":472,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":473,"author":{"gitId":"-"},"content":"*{More to be added}*","lastModifiedDate":"2020-05-23"},{"lineNumber":474,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":475,"author":{"gitId":"-"},"content":"### Glossary","lastModifiedDate":"2020-05-23"},{"lineNumber":476,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":477,"author":{"gitId":"LWS49"},"content":"* **API**: Application Programming Interface. The entirety of published methods, properties and other means for software developers to access an application through software they write using this application.","lastModifiedDate":"2024-03-04"},{"lineNumber":478,"author":{"gitId":"LWS49"},"content":"* **GUI**: Graphical User Interface. A graphical user interface uses graphical representations of commands, status feedbacks and data of an application, and offers methods to interact with it through graphical devices, such as a mouse or tablets.","lastModifiedDate":"2024-03-04"},{"lineNumber":479,"author":{"gitId":"LWS49"},"content":"* **Mainstream OS**: Mainstream Operating Systems. Refers to Windows, Linux, Unix and MacOS.","lastModifiedDate":"2024-03-04"},{"lineNumber":480,"author":{"gitId":"-"},"content":"* **Private contact detail**: A contact detail that is not meant to be shared with others","lastModifiedDate":"2020-05-23"},{"lineNumber":481,"author":{"gitId":"LWS49"},"content":"* **UI**: User Interface. The point where a user and a software application meet and interact.","lastModifiedDate":"2024-03-04"},{"lineNumber":482,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":483,"author":{"gitId":"-"},"content":"--------------------------------------------------------------------------------------------------------------------","lastModifiedDate":"2020-05-23"},{"lineNumber":484,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":485,"author":{"gitId":"-"},"content":"## **Appendix: Instructions for manual testing**","lastModifiedDate":"2020-05-23"},{"lineNumber":486,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":487,"author":{"gitId":"-"},"content":"Given below are instructions to test the app manually.","lastModifiedDate":"2020-05-23"},{"lineNumber":488,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":489,"author":{"gitId":"-"},"content":"\u003cdiv markdown\u003d\"span\" class\u003d\"alert alert-info\"\u003e:information_source: **Note:** These instructions only provide a starting point for testers to work on;","lastModifiedDate":"2020-05-23"},{"lineNumber":490,"author":{"gitId":"-"},"content":"testers are expected to do more *exploratory* testing.","lastModifiedDate":"2020-05-23"},{"lineNumber":491,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":492,"author":{"gitId":"-"},"content":"\u003c/div\u003e","lastModifiedDate":"2020-05-23"},{"lineNumber":493,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":494,"author":{"gitId":"-"},"content":"### Launch and shutdown","lastModifiedDate":"2020-05-23"},{"lineNumber":495,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":496,"author":{"gitId":"-"},"content":"1. Initial launch","lastModifiedDate":"2020-05-23"},{"lineNumber":497,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":498,"author":{"gitId":"-"},"content":" 1. Download the jar file and copy into an empty folder","lastModifiedDate":"2020-05-23"},{"lineNumber":499,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":500,"author":{"gitId":"-"},"content":" 1. Double-click the jar file Expected: Shows the GUI with a set of sample contacts. The window size may not be optimum.","lastModifiedDate":"2020-05-23"},{"lineNumber":501,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":502,"author":{"gitId":"-"},"content":"1. Saving window preferences","lastModifiedDate":"2020-05-23"},{"lineNumber":503,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":504,"author":{"gitId":"-"},"content":" 1. Resize the window to an optimum size. Move the window to a different location. Close the window.","lastModifiedDate":"2020-05-23"},{"lineNumber":505,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":506,"author":{"gitId":"-"},"content":" 1. Re-launch the app by double-clicking the jar file.\u003cbr\u003e","lastModifiedDate":"2020-05-23"},{"lineNumber":507,"author":{"gitId":"-"},"content":" Expected: The most recent window size and location is retained.","lastModifiedDate":"2020-05-23"},{"lineNumber":508,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":509,"author":{"gitId":"-"},"content":"1. _{ more test cases …​ }_","lastModifiedDate":"2020-05-23"},{"lineNumber":510,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":511,"author":{"gitId":"-"},"content":"### Deleting a person","lastModifiedDate":"2020-05-23"},{"lineNumber":512,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":513,"author":{"gitId":"-"},"content":"1. Deleting a person while all persons are being shown","lastModifiedDate":"2020-05-23"},{"lineNumber":514,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":515,"author":{"gitId":"-"},"content":" 1. Prerequisites: List all persons using the `list` command. Multiple persons in the list.","lastModifiedDate":"2020-05-23"},{"lineNumber":516,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":517,"author":{"gitId":"-"},"content":" 1. Test case: `delete 1`\u003cbr\u003e","lastModifiedDate":"2020-05-23"},{"lineNumber":518,"author":{"gitId":"-"},"content":" 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.","lastModifiedDate":"2020-05-23"},{"lineNumber":519,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":520,"author":{"gitId":"-"},"content":" 1. Test case: `delete 0`\u003cbr\u003e","lastModifiedDate":"2020-05-23"},{"lineNumber":521,"author":{"gitId":"-"},"content":" Expected: No person is deleted. Error details shown in the status message. Status bar remains the same.","lastModifiedDate":"2020-05-23"},{"lineNumber":522,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":523,"author":{"gitId":"-"},"content":" 1. Other incorrect delete commands to try: `delete`, `delete x`, `...` (where x is larger than the list size)\u003cbr\u003e","lastModifiedDate":"2020-05-23"},{"lineNumber":524,"author":{"gitId":"-"},"content":" Expected: Similar to previous.","lastModifiedDate":"2020-05-23"},{"lineNumber":525,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":526,"author":{"gitId":"-"},"content":"1. _{ more test cases …​ }_","lastModifiedDate":"2020-05-23"},{"lineNumber":527,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":528,"author":{"gitId":"-"},"content":"### Saving data","lastModifiedDate":"2020-05-23"},{"lineNumber":529,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":530,"author":{"gitId":"-"},"content":"1. Dealing with missing/corrupted data files","lastModifiedDate":"2020-05-23"},{"lineNumber":531,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":532,"author":{"gitId":"-"},"content":" 1. _{explain how to simulate a missing/corrupted file, and the expected behavior}_","lastModifiedDate":"2020-05-23"},{"lineNumber":533,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":534,"author":{"gitId":"-"},"content":"1. _{ more test cases …​ }_","lastModifiedDate":"2020-05-23"}],"authorContributionMap":{"HM33-Stu":169,"LWS49":5,"-":360}},{"path":"docs/Documentation.md","fileType":"docs","lines":[{"lineNumber":1,"author":{"gitId":"-"},"content":"---","lastModifiedDate":"2020-05-23"},{"lineNumber":2,"author":{"gitId":"jieqiboh"},"content":"layout: page","lastModifiedDate":"2024-03-02"},{"lineNumber":3,"author":{"gitId":"jieqiboh"},"content":"title: Documentation guide","lastModifiedDate":"2024-03-02"},{"lineNumber":4,"author":{"gitId":"-"},"content":"---","lastModifiedDate":"2020-05-23"},{"lineNumber":5,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":6,"author":{"gitId":"jieqiboh"},"content":"**Setting up and maintaining the project website:**","lastModifiedDate":"2024-03-02"},{"lineNumber":7,"author":{"gitId":"jieqiboh"},"content":"","lastModifiedDate":"2024-03-02"},{"lineNumber":8,"author":{"gitId":"jieqiboh"},"content":"* We use [**Jekyll**](https://jekyllrb.com/) to manage documentation.","lastModifiedDate":"2024-03-02"},{"lineNumber":9,"author":{"gitId":"jieqiboh"},"content":"* The `docs/` folder is used for documentation.","lastModifiedDate":"2024-03-02"},{"lineNumber":10,"author":{"gitId":"jieqiboh"},"content":"* To learn how set it up and maintain the project website, follow the guide [_[se-edu/guides] **Using Jekyll for project documentation**_](https://se-education.org/guides/tutorials/jekyll.html).","lastModifiedDate":"2024-03-02"},{"lineNumber":11,"author":{"gitId":"jieqiboh"},"content":"* Note these points when adapting the documentation to a different project/product:","lastModifiedDate":"2024-03-02"},{"lineNumber":12,"author":{"gitId":"jieqiboh"},"content":" * The \u0027Site-wide settings\u0027 section of the page linked above has information on how to update site-wide elements such as the top navigation bar.","lastModifiedDate":"2024-03-02"},{"lineNumber":13,"author":{"gitId":"jieqiboh"},"content":" * :bulb: In addition to updating content files, you might have to update the config files `docs\\_config.yml` and `docs\\_sass\\minima\\_base.scss` (which contains a reference to `AB-3` that comes into play when converting documentation pages to PDF format).","lastModifiedDate":"2024-03-02"},{"lineNumber":14,"author":{"gitId":"jieqiboh"},"content":"* If you are using Intellij for editing documentation files, you can consider enabling \u0027soft wrapping\u0027 for `*.md` files, as explained in [_[se-edu/guides] **Intellij IDEA: Useful settings**_](https://se-education.org/guides/tutorials/intellijUsefulSettings.html#enabling-soft-wrapping)","lastModifiedDate":"2024-03-02"},{"lineNumber":15,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":16,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":17,"author":{"gitId":"-"},"content":"**Style guidance:**","lastModifiedDate":"2020-06-17"},{"lineNumber":18,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":19,"author":{"gitId":"-"},"content":"* Follow the [**_Google developer documentation style guide_**](https://developers.google.com/style).","lastModifiedDate":"2020-06-17"},{"lineNumber":20,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":21,"author":{"gitId":"jieqiboh"},"content":"* Also relevant is the [_[se-edu/guides] **Markdown coding standard**_](https://se-education.org/guides/conventions/markdown.html)","lastModifiedDate":"2024-03-02"},{"lineNumber":22,"author":{"gitId":"jieqiboh"},"content":"","lastModifiedDate":"2024-03-02"},{"lineNumber":23,"author":{"gitId":"jieqiboh"},"content":"**Diagrams:**","lastModifiedDate":"2024-03-02"},{"lineNumber":24,"author":{"gitId":"jieqiboh"},"content":"","lastModifiedDate":"2024-03-02"},{"lineNumber":25,"author":{"gitId":"jieqiboh"},"content":"* See the [_[se-edu/guides] **Using PlantUML**_](https://se-education.org/guides/tutorials/plantUml.html)","lastModifiedDate":"2024-03-02"},{"lineNumber":26,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":27,"author":{"gitId":"jieqiboh"},"content":"**Converting a document to the PDF format:**","lastModifiedDate":"2024-03-02"},{"lineNumber":28,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":29,"author":{"gitId":"jieqiboh"},"content":"* See the guide [_[se-edu/guides] **Saving web documents as PDF files**_](https://se-education.org/guides/tutorials/savingPdf.html)","lastModifiedDate":"2024-03-02"}],"authorContributionMap":{"jieqiboh":18,"-":11}},{"path":"docs/Logging.md","fileType":"docs","lines":[{"lineNumber":1,"author":{"gitId":"-"},"content":"---","lastModifiedDate":"2020-06-07"},{"lineNumber":2,"author":{"gitId":"jieqiboh"},"content":"layout: page","lastModifiedDate":"2024-03-02"},{"lineNumber":3,"author":{"gitId":"jieqiboh"},"content":"title: Logging guide","lastModifiedDate":"2024-03-02"},{"lineNumber":4,"author":{"gitId":"-"},"content":"---","lastModifiedDate":"2020-06-07"},{"lineNumber":5,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-06-07"},{"lineNumber":6,"author":{"gitId":"-"},"content":"* We are using `java.util.logging` package for logging.","lastModifiedDate":"2020-06-07"},{"lineNumber":7,"author":{"gitId":"-"},"content":"* The `LogsCenter` class is used to manage the logging levels and logging destinations.","lastModifiedDate":"2020-06-07"},{"lineNumber":8,"author":{"gitId":"-"},"content":"* The `Logger` for a class can be obtained using `LogsCenter.getLogger(Class)` which will log messages according to the specified logging level.","lastModifiedDate":"2020-06-07"},{"lineNumber":9,"author":{"gitId":"-"},"content":"* Log messages are output through the console and to a `.log` file.","lastModifiedDate":"2020-06-07"},{"lineNumber":10,"author":{"gitId":"-"},"content":"* The output logging level can be controlled using the `logLevel` setting in the configuration file (See the [Configuration guide](Configuration.md) section).","lastModifiedDate":"2020-06-07"},{"lineNumber":11,"author":{"gitId":"-"},"content":"* **When choosing a level for a log message**, follow the conventions given in [_[se-edu/guides] Java: Logging conventions_](https://se-education.org/guides/conventions/java/logging.html).","lastModifiedDate":"2020-06-07"}],"authorContributionMap":{"jieqiboh":2,"-":9}},{"path":"docs/SettingUp.md","fileType":"docs","lines":[{"lineNumber":1,"author":{"gitId":"-"},"content":"---","lastModifiedDate":"2020-05-23"},{"lineNumber":2,"author":{"gitId":"jieqiboh"},"content":"layout: page","lastModifiedDate":"2024-03-02"},{"lineNumber":3,"author":{"gitId":"jieqiboh"},"content":"title: Setting up and getting started","lastModifiedDate":"2024-03-02"},{"lineNumber":4,"author":{"gitId":"-"},"content":"---","lastModifiedDate":"2020-05-23"},{"lineNumber":5,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":6,"author":{"gitId":"jieqiboh"},"content":"* Table of Contents","lastModifiedDate":"2024-03-02"},{"lineNumber":7,"author":{"gitId":"jieqiboh"},"content":"{:toc}","lastModifiedDate":"2024-03-02"},{"lineNumber":8,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":9,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":10,"author":{"gitId":"-"},"content":"--------------------------------------------------------------------------------------------------------------------","lastModifiedDate":"2020-05-23"},{"lineNumber":11,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":12,"author":{"gitId":"-"},"content":"## Setting up the project in your computer","lastModifiedDate":"2020-05-23"},{"lineNumber":13,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":14,"author":{"gitId":"jieqiboh"},"content":"\u003cdiv markdown\u003d\"span\" class\u003d\"alert alert-warning\"\u003e:exclamation: **Caution:**","lastModifiedDate":"2024-03-02"},{"lineNumber":15,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":16,"author":{"gitId":"-"},"content":"Follow the steps in the following guide precisely. Things will not work out if you deviate in some steps.","lastModifiedDate":"2020-06-07"},{"lineNumber":17,"author":{"gitId":"jieqiboh"},"content":"\u003c/div\u003e","lastModifiedDate":"2024-03-02"},{"lineNumber":18,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":19,"author":{"gitId":"-"},"content":"First, **fork** this repo, and **clone** the fork into your computer.","lastModifiedDate":"2020-06-07"},{"lineNumber":20,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-06-07"},{"lineNumber":21,"author":{"gitId":"-"},"content":"If you plan to use Intellij IDEA (highly recommended):","lastModifiedDate":"2020-06-07"},{"lineNumber":22,"author":{"gitId":"-"},"content":"1. **Configure the JDK**: Follow the guide [_[se-edu/guides] IDEA: Configuring the JDK_](https://se-education.org/guides/tutorials/intellijJdk.html) to to ensure Intellij is configured to use **JDK 11**.","lastModifiedDate":"2020-06-07"},{"lineNumber":23,"author":{"gitId":"jieqiboh"},"content":"1. **Import the project as a Gradle project**: Follow the guide [_[se-edu/guides] IDEA: Importing a Gradle project_](https://se-education.org/guides/tutorials/intellijImportGradleProject.html) to import the project into IDEA.\u003cbr\u003e","lastModifiedDate":"2024-03-02"},{"lineNumber":24,"author":{"gitId":"jieqiboh"},"content":" :exclamation: Note: Importing a Gradle project is slightly different from importing a normal Java project.","lastModifiedDate":"2024-03-02"},{"lineNumber":25,"author":{"gitId":"-"},"content":"1. **Verify the setup**:","lastModifiedDate":"2020-06-07"},{"lineNumber":26,"author":{"gitId":"-"},"content":" 1. Run the `seedu.address.Main` and try a few commands.","lastModifiedDate":"2020-06-07"},{"lineNumber":27,"author":{"gitId":"-"},"content":" 1. [Run the tests](Testing.md) to ensure they all pass.","lastModifiedDate":"2020-06-07"},{"lineNumber":28,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-06-07"},{"lineNumber":29,"author":{"gitId":"-"},"content":"--------------------------------------------------------------------------------------------------------------------","lastModifiedDate":"2020-05-23"},{"lineNumber":30,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":31,"author":{"gitId":"-"},"content":"## Before writing code","lastModifiedDate":"2020-05-23"},{"lineNumber":32,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":33,"author":{"gitId":"-"},"content":"1. **Configure the coding style**","lastModifiedDate":"2020-06-07"},{"lineNumber":34,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":35,"author":{"gitId":"-"},"content":" If using IDEA, follow the guide [_[se-edu/guides] IDEA: Configuring the code style_](https://se-education.org/guides/tutorials/intellijCodeStyle.html) to set up IDEA\u0027s coding style to match ours.","lastModifiedDate":"2020-09-15"},{"lineNumber":36,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":37,"author":{"gitId":"jieqiboh"},"content":" \u003cdiv markdown\u003d\"span\" class\u003d\"alert alert-primary\"\u003e:bulb: **Tip:**","lastModifiedDate":"2024-03-02"},{"lineNumber":38,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":39,"author":{"gitId":"-"},"content":" Optionally, you can follow the guide [_[se-edu/guides] Using Checkstyle_](https://se-education.org/guides/tutorials/checkstyle.html) to find how to use the CheckStyle within IDEA e.g., to report problems _as_ you write code.","lastModifiedDate":"2020-06-07"},{"lineNumber":40,"author":{"gitId":"jieqiboh"},"content":" \u003c/div\u003e","lastModifiedDate":"2024-03-02"},{"lineNumber":41,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":42,"author":{"gitId":"-"},"content":"1. **Set up CI**","lastModifiedDate":"2020-06-07"},{"lineNumber":43,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":44,"author":{"gitId":"-"},"content":" This project comes with a GitHub Actions config files (in `.github/workflows` folder). When GitHub detects those files, it will run the CI for your project automatically at each push to the `master` branch or to any PR. No set up required.","lastModifiedDate":"2020-05-23"},{"lineNumber":45,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":46,"author":{"gitId":"-"},"content":"1. **Learn the design**","lastModifiedDate":"2020-06-07"},{"lineNumber":47,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":48,"author":{"gitId":"-"},"content":" When you are ready to start coding, we recommend that you get some sense of the overall design by reading about [AddressBook’s architecture](DeveloperGuide.md#architecture).","lastModifiedDate":"2020-06-07"},{"lineNumber":49,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":50,"author":{"gitId":"-"},"content":"1. **Do the tutorials**","lastModifiedDate":"2020-06-07"},{"lineNumber":51,"author":{"gitId":"-"},"content":" These tutorials will help you get acquainted with the codebase.","lastModifiedDate":"2020-05-23"},{"lineNumber":52,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":53,"author":{"gitId":"-"},"content":" * [Tracing code](tutorials/TracingCode.md)","lastModifiedDate":"2020-07-29"},{"lineNumber":54,"author":{"gitId":"-"},"content":" * [Adding a new command](tutorials/AddRemark.md)","lastModifiedDate":"2020-07-29"},{"lineNumber":55,"author":{"gitId":"-"},"content":" * [Removing fields](tutorials/RemovingFields.md)","lastModifiedDate":"2021-08-01"}],"authorContributionMap":{"jieqiboh":10,"-":45}},{"path":"docs/Testing.md","fileType":"docs","lines":[{"lineNumber":1,"author":{"gitId":"-"},"content":"---","lastModifiedDate":"2020-05-23"},{"lineNumber":2,"author":{"gitId":"jieqiboh"},"content":"layout: page","lastModifiedDate":"2024-03-02"},{"lineNumber":3,"author":{"gitId":"jieqiboh"},"content":"title: Testing guide","lastModifiedDate":"2024-03-02"},{"lineNumber":4,"author":{"gitId":"-"},"content":"---","lastModifiedDate":"2020-05-23"},{"lineNumber":5,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":6,"author":{"gitId":"jieqiboh"},"content":"* Table of Contents","lastModifiedDate":"2024-03-02"},{"lineNumber":7,"author":{"gitId":"jieqiboh"},"content":"{:toc}","lastModifiedDate":"2024-03-02"},{"lineNumber":8,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":9,"author":{"gitId":"jieqiboh"},"content":"--------------------------------------------------------------------------------------------------------------------","lastModifiedDate":"2024-03-02"},{"lineNumber":10,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":11,"author":{"gitId":"-"},"content":"## Running tests","lastModifiedDate":"2020-05-23"},{"lineNumber":12,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":13,"author":{"gitId":"-"},"content":"There are two ways to run tests.","lastModifiedDate":"2020-05-23"},{"lineNumber":14,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":15,"author":{"gitId":"-"},"content":"* **Method 1: Using IntelliJ JUnit test runner**","lastModifiedDate":"2020-05-23"},{"lineNumber":16,"author":{"gitId":"-"},"content":" * To run all tests, right-click on the `src/test/java` folder and choose `Run \u0027All Tests\u0027`","lastModifiedDate":"2020-05-23"},{"lineNumber":17,"author":{"gitId":"-"},"content":" * To run a subset of tests, you can right-click on a test package,","lastModifiedDate":"2020-05-23"},{"lineNumber":18,"author":{"gitId":"-"},"content":" test class, or a test and choose `Run \u0027ABC\u0027`","lastModifiedDate":"2020-05-23"},{"lineNumber":19,"author":{"gitId":"-"},"content":"* **Method 2: Using Gradle**","lastModifiedDate":"2020-05-23"},{"lineNumber":20,"author":{"gitId":"-"},"content":" * Open a console and run the command `gradlew clean test` (Mac/Linux: `./gradlew clean test`)","lastModifiedDate":"2020-05-23"},{"lineNumber":21,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":22,"author":{"gitId":"jieqiboh"},"content":"\u003cdiv markdown\u003d\"span\" class\u003d\"alert alert-secondary\"\u003e:link: **Link**: Read [this Gradle Tutorial from the se-edu/guides](https://se-education.org/guides/tutorials/gradle.html) to learn more about using Gradle.","lastModifiedDate":"2024-03-02"},{"lineNumber":23,"author":{"gitId":"jieqiboh"},"content":"\u003c/div\u003e","lastModifiedDate":"2024-03-02"},{"lineNumber":24,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":25,"author":{"gitId":"-"},"content":"--------------------------------------------------------------------------------------------------------------------","lastModifiedDate":"2020-05-23"},{"lineNumber":26,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":27,"author":{"gitId":"-"},"content":"## Types of tests","lastModifiedDate":"2020-05-23"},{"lineNumber":28,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":29,"author":{"gitId":"-"},"content":"This project has three types of tests:","lastModifiedDate":"2020-05-23"},{"lineNumber":30,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":31,"author":{"gitId":"-"},"content":"1. *Unit tests* targeting the lowest level methods/classes.\u003cbr\u003e","lastModifiedDate":"2020-05-23"},{"lineNumber":32,"author":{"gitId":"-"},"content":" e.g. `seedu.address.commons.StringUtilTest`","lastModifiedDate":"2020-05-23"},{"lineNumber":33,"author":{"gitId":"-"},"content":"1. *Integration tests* that are checking the integration of multiple code units (those code units are assumed to be working).\u003cbr\u003e","lastModifiedDate":"2020-05-23"},{"lineNumber":34,"author":{"gitId":"-"},"content":" e.g. `seedu.address.storage.StorageManagerTest`","lastModifiedDate":"2020-05-23"},{"lineNumber":35,"author":{"gitId":"-"},"content":"1. Hybrids of unit and integration tests. These test are checking multiple code units as well as how the are connected together.\u003cbr\u003e","lastModifiedDate":"2020-05-23"},{"lineNumber":36,"author":{"gitId":"-"},"content":" e.g. `seedu.address.logic.LogicManagerTest`","lastModifiedDate":"2020-05-23"}],"authorContributionMap":{"jieqiboh":7,"-":29}},{"path":"docs/UserGuide.md","fileType":"docs","lines":[{"lineNumber":1,"author":{"gitId":"-"},"content":"---","lastModifiedDate":"2020-05-23"},{"lineNumber":2,"author":{"gitId":"CaptainKeqing"},"content":"layout: page","lastModifiedDate":"2024-03-02"},{"lineNumber":3,"author":{"gitId":"CaptainKeqing"},"content":"title: User Guide","lastModifiedDate":"2024-03-02"},{"lineNumber":4,"author":{"gitId":"-"},"content":"---","lastModifiedDate":"2020-05-23"},{"lineNumber":5,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":6,"author":{"gitId":"CaptainKeqing"},"content":"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.","lastModifiedDate":"2024-03-02"},{"lineNumber":7,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":8,"author":{"gitId":"CaptainKeqing"},"content":"* Table of Contents","lastModifiedDate":"2024-03-02"},{"lineNumber":9,"author":{"gitId":"CaptainKeqing"},"content":" {:toc}","lastModifiedDate":"2024-03-02"},{"lineNumber":10,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":11,"author":{"gitId":"-"},"content":"--------------------------------------------------------------------------------------------------------------------","lastModifiedDate":"2020-05-23"},{"lineNumber":12,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":13,"author":{"gitId":"-"},"content":"## Quick start","lastModifiedDate":"2020-05-23"},{"lineNumber":14,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":15,"author":{"gitId":"-"},"content":"1. Ensure you have Java `11` or above installed in your Computer.","lastModifiedDate":"2020-05-23"},{"lineNumber":16,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":17,"author":{"gitId":"-"},"content":"1. Download the latest `addressbook.jar` from [here](https://github.com/se-edu/addressbook-level3/releases).","lastModifiedDate":"2020-05-23"},{"lineNumber":18,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":19,"author":{"gitId":"theman-oj10"},"content":"1. Copy the file to the folder you want to use as the _home folder_ for your CareerSync.","lastModifiedDate":"2024-03-02"},{"lineNumber":20,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":21,"author":{"gitId":"-"},"content":"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.\u003cbr\u003e","lastModifiedDate":"2023-01-01"},{"lineNumber":22,"author":{"gitId":"-"},"content":" A GUI similar to the below should appear in a few seconds. Note how the app contains some sample data.\u003cbr\u003e","lastModifiedDate":"2023-01-01"},{"lineNumber":23,"author":{"gitId":"-"},"content":" ![Ui](images/Ui.png)","lastModifiedDate":"2020-05-23"},{"lineNumber":24,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":25,"author":{"gitId":"-"},"content":"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.\u003cbr\u003e","lastModifiedDate":"2020-05-23"},{"lineNumber":26,"author":{"gitId":"-"},"content":" Some example commands you can try:","lastModifiedDate":"2020-05-23"},{"lineNumber":27,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":28,"author":{"gitId":"-"},"content":" * `list` : Lists all contacts.","lastModifiedDate":"2023-01-01"},{"lineNumber":29,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":30,"author":{"gitId":"HM33-Stu"},"content":" * `add /company Titktok /email hr@tiktok.com /number 9089030 /location remote /status ongoing /description create new recommendation engine /role Software Intern` : Adds the internship entry to the CareerSync application.","lastModifiedDate":"2024-03-01"},{"lineNumber":31,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":32,"author":{"gitId":"HM33-Stu"},"content":" * `delete 2` : Deletes the 2nd internship entry shown in the current list.","lastModifiedDate":"2024-03-01"},{"lineNumber":33,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":34,"author":{"gitId":"-"},"content":" * `clear` : Deletes all contacts.","lastModifiedDate":"2023-01-01"},{"lineNumber":35,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":36,"author":{"gitId":"-"},"content":" * `exit` : Exits the app.","lastModifiedDate":"2023-01-01"},{"lineNumber":37,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":38,"author":{"gitId":"-"},"content":"1. Refer to the [Features](#features) below for details of each command.","lastModifiedDate":"2020-05-23"},{"lineNumber":39,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":40,"author":{"gitId":"-"},"content":"--------------------------------------------------------------------------------------------------------------------","lastModifiedDate":"2020-05-23"},{"lineNumber":41,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":42,"author":{"gitId":"-"},"content":"## Features","lastModifiedDate":"2020-05-23"},{"lineNumber":43,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":44,"author":{"gitId":"CaptainKeqing"},"content":"\u003cdiv markdown\u003d\"block\" class\u003d\"alert alert-info\"\u003e","lastModifiedDate":"2024-03-02"},{"lineNumber":45,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":46,"author":{"gitId":"CaptainKeqing"},"content":"**:information_source: Notes about the command format:**\u003cbr\u003e","lastModifiedDate":"2024-03-02"},{"lineNumber":47,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":48,"author":{"gitId":"-"},"content":"* Words in `UPPER_CASE` are the parameters to be supplied by the user.\u003cbr\u003e","lastModifiedDate":"2020-05-23"},{"lineNumber":49,"author":{"gitId":"-"},"content":" e.g. in `add n/NAME`, `NAME` is a parameter which can be used as `add n/John Doe`.","lastModifiedDate":"2020-05-23"},{"lineNumber":50,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":51,"author":{"gitId":"-"},"content":"* Items in square brackets are optional.\u003cbr\u003e","lastModifiedDate":"2020-05-23"},{"lineNumber":52,"author":{"gitId":"-"},"content":" e.g `n/NAME [t/TAG]` can be used as `n/John Doe t/friend` or as `n/John Doe`.","lastModifiedDate":"2020-05-23"},{"lineNumber":53,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":54,"author":{"gitId":"-"},"content":"* Items with `…`​ after them can be used multiple times including zero times.\u003cbr\u003e","lastModifiedDate":"2020-05-23"},{"lineNumber":55,"author":{"gitId":"-"},"content":" e.g. `[t/TAG]…​` can be used as ` ` (i.e. 0 times), `t/friend`, `t/friend t/family` etc.","lastModifiedDate":"2020-05-23"},{"lineNumber":56,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":57,"author":{"gitId":"-"},"content":"* Parameters can be in any order.\u003cbr\u003e","lastModifiedDate":"2020-05-23"},{"lineNumber":58,"author":{"gitId":"-"},"content":" e.g. if the command specifies `n/NAME p/PHONE_NUMBER`, `p/PHONE_NUMBER n/NAME` is also acceptable.","lastModifiedDate":"2020-05-23"},{"lineNumber":59,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":60,"author":{"gitId":"-"},"content":"* Extraneous parameters for commands that do not take in parameters (such as `help`, `list`, `exit` and `clear`) will be ignored.\u003cbr\u003e","lastModifiedDate":"2021-02-03"},{"lineNumber":61,"author":{"gitId":"-"},"content":" e.g. if the command specifies `help 123`, it will be interpreted as `help`.","lastModifiedDate":"2021-02-03"},{"lineNumber":62,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2021-02-03"},{"lineNumber":63,"author":{"gitId":"-"},"content":"* 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.","lastModifiedDate":"2023-06-26"},{"lineNumber":64,"author":{"gitId":"CaptainKeqing"},"content":"\u003c/div\u003e","lastModifiedDate":"2024-03-02"},{"lineNumber":65,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":66,"author":{"gitId":"-"},"content":"### Viewing help : `help`","lastModifiedDate":"2020-05-23"},{"lineNumber":67,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":68,"author":{"gitId":"-"},"content":"Shows a message explaning how to access the help page.","lastModifiedDate":"2020-05-23"},{"lineNumber":69,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":70,"author":{"gitId":"-"},"content":"![help message](images/helpMessage.png)","lastModifiedDate":"2020-05-23"},{"lineNumber":71,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":72,"author":{"gitId":"-"},"content":"Format: `help`","lastModifiedDate":"2020-05-23"},{"lineNumber":73,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":74,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":75,"author":{"gitId":"HM33-Stu"},"content":"### Adding an entry: `add`","lastModifiedDate":"2024-03-01"},{"lineNumber":76,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":77,"author":{"gitId":"HM33-Stu"},"content":"Add an internship entry and all the relevant fields","lastModifiedDate":"2024-03-01"},{"lineNumber":78,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":79,"author":{"gitId":"HM33-Stu"},"content":"Format: `add /company COMPANY_NAME /description DESCRIPTION /status STATUS [/pocname NAME_OF_CONTACT] [/email EMAIL_OF_CONTACT] [/number NUMBER_OF_CONTACT] [/location LOCATION_ENUM] [/role ROLE]​`","lastModifiedDate":"2024-03-01"},{"lineNumber":80,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":81,"author":{"gitId":"-"},"content":"Examples:","lastModifiedDate":"2020-05-23"},{"lineNumber":82,"author":{"gitId":"HM33-Stu"},"content":"* `add /company Titktok /email hr@tiktok.com /number 9089030 /location remote /status ongoing /description create new recommendation engine /role Software Intern`","lastModifiedDate":"2024-03-01"},{"lineNumber":83,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":84,"author":{"gitId":"-"},"content":"### Listing all persons : `list`","lastModifiedDate":"2020-05-23"},{"lineNumber":85,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":86,"author":{"gitId":"theman-oj10"},"content":"Shows a list of all internships in the application","lastModifiedDate":"2024-03-02"},{"lineNumber":87,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":88,"author":{"gitId":"-"},"content":"Format: `list`","lastModifiedDate":"2020-05-23"},{"lineNumber":89,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":90,"author":{"gitId":"CaptainKeqing"},"content":"### Viewing an internship entry\u0027s details","lastModifiedDate":"2024-03-02"},{"lineNumber":91,"author":{"gitId":"CaptainKeqing"},"content":"","lastModifiedDate":"2024-03-02"},{"lineNumber":92,"author":{"gitId":"CaptainKeqing"},"content":"This feature is accessible by clicking on an internship entry in the internship list.","lastModifiedDate":"2024-03-02"},{"lineNumber":93,"author":{"gitId":"CaptainKeqing"},"content":"Click the back button to return to the previous view of internship entries.","lastModifiedDate":"2024-03-02"},{"lineNumber":94,"author":{"gitId":"CaptainKeqing"},"content":"","lastModifiedDate":"2024-03-02"},{"lineNumber":95,"author":{"gitId":"CaptainKeqing"},"content":"Shows the full details of an internship entry. This replaces the current view of internship entries.","lastModifiedDate":"2024-03-02"},{"lineNumber":96,"author":{"gitId":"CaptainKeqing"},"content":"","lastModifiedDate":"2024-03-02"},{"lineNumber":97,"author":{"gitId":"CaptainKeqing"},"content":"CLI input will be implemented in a future release.","lastModifiedDate":"2024-03-02"},{"lineNumber":98,"author":{"gitId":"CaptainKeqing"},"content":"","lastModifiedDate":"2024-03-02"},{"lineNumber":99,"author":{"gitId":"-"},"content":"### Editing a person : `edit`","lastModifiedDate":"2020-05-23"},{"lineNumber":100,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":101,"author":{"gitId":"theman-oj10"},"content":"Edits an existing internship entry in the application.","lastModifiedDate":"2024-03-02"},{"lineNumber":102,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":103,"author":{"gitId":"LWS49"},"content":"Format: `edit INDEX [/company COMPANY_NAME] [/pocname NAME_OF_CONTACT] [/email EMAIL_OF_CONTACT] [/number NUMBER_OF_CONTACT] [/location LOCATION_ENUM] [/status STATUS] [/description DESCRIPTION] [/role ROLE] …​`","lastModifiedDate":"2024-03-02"},{"lineNumber":104,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":105,"author":{"gitId":"-"},"content":"* 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, …​","lastModifiedDate":"2020-05-23"},{"lineNumber":106,"author":{"gitId":"LWS49"},"content":"* At least one of the optional fields must be provided. Multiple fields can be edited at once.","lastModifiedDate":"2024-03-02"},{"lineNumber":107,"author":{"gitId":"-"},"content":"* Existing values will be updated to the input values.","lastModifiedDate":"2020-05-23"},{"lineNumber":108,"author":{"gitId":"LWS49"},"content":"* When editing status, only the valid statuses will be accepeted. Not-valid statuses will cause the command to be rejected.","lastModifiedDate":"2024-03-02"},{"lineNumber":109,"author":{"gitId":"LWS49"},"content":"","lastModifiedDate":"2024-03-02"},{"lineNumber":110,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":111,"author":{"gitId":"-"},"content":"Examples:","lastModifiedDate":"2020-05-23"},{"lineNumber":112,"author":{"gitId":"LWS49"},"content":"* `edit 1 /email nussu@u.nus.edu /number 9666 1666` Edits the email and phone number of the 1st person to be `nussu@u.nus.edu` and `9666 1666` respectively.","lastModifiedDate":"2024-03-02"},{"lineNumber":113,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":114,"author":{"gitId":"-"},"content":"### Locating persons by name: `find`","lastModifiedDate":"2020-05-23"},{"lineNumber":115,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":116,"author":{"gitId":"theman-oj10"},"content":"Finds internship entries whose names contain any of the given keywords.","lastModifiedDate":"2024-03-02"},{"lineNumber":117,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":118,"author":{"gitId":"-"},"content":"Format: `find KEYWORD [MORE_KEYWORDS]`","lastModifiedDate":"2020-05-23"},{"lineNumber":119,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":120,"author":{"gitId":"-"},"content":"* The search is case-insensitive. e.g `hans` will match `Hans`","lastModifiedDate":"2020-05-23"},{"lineNumber":121,"author":{"gitId":"-"},"content":"* The order of the keywords does not matter. e.g. `Hans Bo` will match `Bo Hans`","lastModifiedDate":"2020-05-23"},{"lineNumber":122,"author":{"gitId":"-"},"content":"* Only the name is searched.","lastModifiedDate":"2020-05-23"},{"lineNumber":123,"author":{"gitId":"-"},"content":"* Only full words will be matched e.g. `Han` will not match `Hans`","lastModifiedDate":"2020-05-23"},{"lineNumber":124,"author":{"gitId":"-"},"content":"* Persons matching at least one keyword will be returned (i.e. `OR` search).","lastModifiedDate":"2020-05-23"},{"lineNumber":125,"author":{"gitId":"-"},"content":" e.g. `Hans Bo` will return `Hans Gruber`, `Bo Yang`","lastModifiedDate":"2020-05-23"},{"lineNumber":126,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":127,"author":{"gitId":"-"},"content":"Examples:","lastModifiedDate":"2020-05-23"},{"lineNumber":128,"author":{"gitId":"-"},"content":"* `find John` returns `john` and `John Doe`","lastModifiedDate":"2020-05-23"},{"lineNumber":129,"author":{"gitId":"-"},"content":"* `find alex david` returns `Alex Yeoh`, `David Li`\u003cbr\u003e","lastModifiedDate":"2020-05-23"},{"lineNumber":130,"author":{"gitId":"-"},"content":" ![result for \u0027find alex david\u0027](images/findAlexDavidResult.png)","lastModifiedDate":"2020-05-23"},{"lineNumber":131,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":132,"author":{"gitId":"-"},"content":"### Deleting a person : `delete`","lastModifiedDate":"2020-05-23"},{"lineNumber":133,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":134,"author":{"gitId":"HM33-Stu"},"content":"Deletes the internship entry with the corresponding index (based on the displayed list at point of deletion)","lastModifiedDate":"2024-03-01"},{"lineNumber":135,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":136,"author":{"gitId":"-"},"content":"Format: `delete INDEX`","lastModifiedDate":"2020-05-23"},{"lineNumber":137,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":138,"author":{"gitId":"-"},"content":"* Deletes the person at the specified `INDEX`.","lastModifiedDate":"2020-05-23"},{"lineNumber":139,"author":{"gitId":"HM33-Stu"},"content":"* The index refers to the index number shown in the displayed list of internship entries at point of deletion.","lastModifiedDate":"2024-03-01"},{"lineNumber":140,"author":{"gitId":"-"},"content":"* The index **must be a positive integer** 1, 2, 3, …​","lastModifiedDate":"2020-05-23"},{"lineNumber":141,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":142,"author":{"gitId":"-"},"content":"Examples:","lastModifiedDate":"2020-05-23"},{"lineNumber":143,"author":{"gitId":"HM33-Stu"},"content":"* `list` followed by `delete 7` deletes the 7th entry in the internship entries list.","lastModifiedDate":"2024-03-01"},{"lineNumber":144,"author":{"gitId":"HM33-Stu"},"content":"* `find Google` followed by `delete 1` deletes the 1st entry in the results of the `find` command.","lastModifiedDate":"2024-03-01"},{"lineNumber":145,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":146,"author":{"gitId":"-"},"content":"### Clearing all entries : `clear`","lastModifiedDate":"2020-05-23"},{"lineNumber":147,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":148,"author":{"gitId":"theman-oj10"},"content":"Clears all entries from the application.","lastModifiedDate":"2024-03-02"},{"lineNumber":149,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":150,"author":{"gitId":"-"},"content":"Format: `clear`","lastModifiedDate":"2020-05-23"},{"lineNumber":151,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":152,"author":{"gitId":"-"},"content":"### Exiting the program : `exit`","lastModifiedDate":"2020-05-23"},{"lineNumber":153,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":154,"author":{"gitId":"-"},"content":"Exits the program.","lastModifiedDate":"2020-05-23"},{"lineNumber":155,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":156,"author":{"gitId":"-"},"content":"Format: `exit`","lastModifiedDate":"2020-05-23"},{"lineNumber":157,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":158,"author":{"gitId":"-"},"content":"### Saving the data","lastModifiedDate":"2020-05-23"},{"lineNumber":159,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":160,"author":{"gitId":"theman-oj10"},"content":"CareerSync data are saved in the hard disk automatically after any command that changes the data. There is no need to save manually.","lastModifiedDate":"2024-03-02"},{"lineNumber":161,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":162,"author":{"gitId":"-"},"content":"### Editing the data file","lastModifiedDate":"2021-02-04"},{"lineNumber":163,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2021-02-04"},{"lineNumber":164,"author":{"gitId":"theman-oj10"},"content":"CareerSync 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.","lastModifiedDate":"2024-03-02"},{"lineNumber":165,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2021-02-04"},{"lineNumber":166,"author":{"gitId":"CaptainKeqing"},"content":"\u003cdiv markdown\u003d\"span\" class\u003d\"alert alert-warning\"\u003e:exclamation: **Caution:**","lastModifiedDate":"2024-03-02"},{"lineNumber":167,"author":{"gitId":"theman-oj10"},"content":"If your changes to the data file makes its format invalid, CareerSync 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.\u003cbr\u003e","lastModifiedDate":"2024-03-02"},{"lineNumber":168,"author":{"gitId":"theman-oj10"},"content":"Furthermore, certain edits can cause the CareerSync to behave in unexpected ways (e.g., if a value entered is outside of the acceptable range). Therefore, edit the data file only if you are confident that you can update it correctly.","lastModifiedDate":"2024-03-02"},{"lineNumber":169,"author":{"gitId":"CaptainKeqing"},"content":"\u003c/div\u003e","lastModifiedDate":"2024-03-02"},{"lineNumber":170,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2021-02-04"},{"lineNumber":171,"author":{"gitId":"-"},"content":"### Archiving data files `[coming in v2.0]`","lastModifiedDate":"2020-05-23"},{"lineNumber":172,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":173,"author":{"gitId":"-"},"content":"_Details coming soon ..._","lastModifiedDate":"2021-02-04"},{"lineNumber":174,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":175,"author":{"gitId":"-"},"content":"--------------------------------------------------------------------------------------------------------------------","lastModifiedDate":"2020-05-23"},{"lineNumber":176,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":177,"author":{"gitId":"-"},"content":"## FAQ","lastModifiedDate":"2020-05-23"},{"lineNumber":178,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":179,"author":{"gitId":"-"},"content":"**Q**: How do I transfer my data to another Computer?\u003cbr\u003e","lastModifiedDate":"2020-05-23"},{"lineNumber":180,"author":{"gitId":"theman-oj10"},"content":"**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 CareerSync home folder.","lastModifiedDate":"2024-03-02"},{"lineNumber":181,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":182,"author":{"gitId":"-"},"content":"--------------------------------------------------------------------------------------------------------------------","lastModifiedDate":"2020-05-23"},{"lineNumber":183,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":184,"author":{"gitId":"-"},"content":"## Known issues","lastModifiedDate":"2023-09-08"},{"lineNumber":185,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2023-09-08"},{"lineNumber":186,"author":{"gitId":"-"},"content":"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.","lastModifiedDate":"2023-09-08"},{"lineNumber":187,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2023-09-08"},{"lineNumber":188,"author":{"gitId":"-"},"content":"--------------------------------------------------------------------------------------------------------------------","lastModifiedDate":"2023-09-08"},{"lineNumber":189,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2023-09-08"},{"lineNumber":190,"author":{"gitId":"-"},"content":"## Command summary","lastModifiedDate":"2020-05-23"},{"lineNumber":191,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":192,"author":{"gitId":"-"},"content":"Action | Format, Examples","lastModifiedDate":"2020-05-23"},{"lineNumber":193,"author":{"gitId":"CaptainKeqing"},"content":"--------|------------------","lastModifiedDate":"2024-03-02"},{"lineNumber":194,"author":{"gitId":"HM33-Stu"},"content":"**Add** |`add /company COMPANY_NAME /description DESCRIPTION /status STATUS [/pocname NAME_OF_CONTACT] [/email EMAIL_OF_CONTACT] [/number NUMBER_OF_CONTACT] [/location LOCATION_ENUM] [/role ROLE]`","lastModifiedDate":"2024-03-01"},{"lineNumber":195,"author":{"gitId":"-"},"content":"**Clear** | `clear`","lastModifiedDate":"2020-05-23"},{"lineNumber":196,"author":{"gitId":"-"},"content":"**Delete** | `delete INDEX`\u003cbr\u003e e.g., `delete 3`","lastModifiedDate":"2020-05-23"},{"lineNumber":197,"author":{"gitId":"LWS49"},"content":"**Edit** | `edit INDEX [/company COMPANY_NAME] [/pocname NAME_OF_CONTACT] [/email EMAIL_OF_CONTACT] [/number NUMBER_OF_CONTACT] [/location LOCATION_ENUM] [/status STATUS] [/description DESCRIPTION] [/role ROLE] `\u003cbr\u003e e.g.,`edit 1 /email nussu@u.nus.edu /number 9666 1666`","lastModifiedDate":"2024-03-02"},{"lineNumber":198,"author":{"gitId":"-"},"content":"**Find** | `find KEYWORD [MORE_KEYWORDS]`\u003cbr\u003e e.g., `find James Jake`","lastModifiedDate":"2020-05-23"},{"lineNumber":199,"author":{"gitId":"-"},"content":"**List** | `list`","lastModifiedDate":"2020-05-23"},{"lineNumber":200,"author":{"gitId":"-"},"content":"**Help** | `help`","lastModifiedDate":"2020-05-23"}],"authorContributionMap":{"HM33-Stu":11,"LWS49":6,"theman-oj10":10,"-":153,"CaptainKeqing":20}},{"path":"docs/_sass/minima/_base.scss","fileType":"other","lines":[{"lineNumber":1,"author":{"gitId":"-"},"content":"html {","lastModifiedDate":"2020-05-23"},{"lineNumber":2,"author":{"gitId":"-"},"content":" font-size: $base-font-size;","lastModifiedDate":"2020-05-23"},{"lineNumber":3,"author":{"gitId":"-"},"content":"}","lastModifiedDate":"2020-05-23"},{"lineNumber":4,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":5,"author":{"gitId":"-"},"content":"/**","lastModifiedDate":"2020-05-23"},{"lineNumber":6,"author":{"gitId":"-"},"content":" * Reset some basic elements","lastModifiedDate":"2020-05-23"},{"lineNumber":7,"author":{"gitId":"-"},"content":" */","lastModifiedDate":"2020-05-23"},{"lineNumber":8,"author":{"gitId":"-"},"content":"body, h1, h2, h3, h4, h5, h6,","lastModifiedDate":"2020-05-23"},{"lineNumber":9,"author":{"gitId":"-"},"content":"p, blockquote, pre, hr,","lastModifiedDate":"2020-05-23"},{"lineNumber":10,"author":{"gitId":"-"},"content":"dl, dd, ol, ul, figure {","lastModifiedDate":"2020-05-23"},{"lineNumber":11,"author":{"gitId":"-"},"content":" margin: 0;","lastModifiedDate":"2020-05-23"},{"lineNumber":12,"author":{"gitId":"-"},"content":" padding: 0;","lastModifiedDate":"2020-05-23"},{"lineNumber":13,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":14,"author":{"gitId":"-"},"content":"}","lastModifiedDate":"2020-05-23"},{"lineNumber":15,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":16,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":17,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":18,"author":{"gitId":"-"},"content":"/**","lastModifiedDate":"2020-05-23"},{"lineNumber":19,"author":{"gitId":"-"},"content":" * Basic styling","lastModifiedDate":"2020-05-23"},{"lineNumber":20,"author":{"gitId":"-"},"content":" */","lastModifiedDate":"2020-05-23"},{"lineNumber":21,"author":{"gitId":"-"},"content":"body {","lastModifiedDate":"2020-05-23"},{"lineNumber":22,"author":{"gitId":"-"},"content":" font: $base-font-weight #{$base-font-size}/#{$base-line-height} $base-font-family;","lastModifiedDate":"2020-05-23"},{"lineNumber":23,"author":{"gitId":"-"},"content":" color: $text-color;","lastModifiedDate":"2020-05-23"},{"lineNumber":24,"author":{"gitId":"-"},"content":" background-color: $background-color;","lastModifiedDate":"2020-05-23"},{"lineNumber":25,"author":{"gitId":"-"},"content":" -webkit-text-size-adjust: 100%;","lastModifiedDate":"2020-05-23"},{"lineNumber":26,"author":{"gitId":"-"},"content":" -webkit-font-feature-settings: \"kern\" 1;","lastModifiedDate":"2020-05-23"},{"lineNumber":27,"author":{"gitId":"-"},"content":" -moz-font-feature-settings: \"kern\" 1;","lastModifiedDate":"2020-05-23"},{"lineNumber":28,"author":{"gitId":"-"},"content":" -o-font-feature-settings: \"kern\" 1;","lastModifiedDate":"2020-05-23"},{"lineNumber":29,"author":{"gitId":"-"},"content":" font-feature-settings: \"kern\" 1;","lastModifiedDate":"2020-05-23"},{"lineNumber":30,"author":{"gitId":"-"},"content":" font-kerning: normal;","lastModifiedDate":"2020-05-23"},{"lineNumber":31,"author":{"gitId":"-"},"content":" display: flex;","lastModifiedDate":"2020-05-23"},{"lineNumber":32,"author":{"gitId":"-"},"content":" min-height: 100vh;","lastModifiedDate":"2020-05-23"},{"lineNumber":33,"author":{"gitId":"-"},"content":" flex-direction: column;","lastModifiedDate":"2020-05-23"},{"lineNumber":34,"author":{"gitId":"-"},"content":" overflow-wrap: break-word;","lastModifiedDate":"2020-05-23"},{"lineNumber":35,"author":{"gitId":"-"},"content":"}","lastModifiedDate":"2020-05-23"},{"lineNumber":36,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":37,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":38,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":39,"author":{"gitId":"-"},"content":"/**","lastModifiedDate":"2020-05-23"},{"lineNumber":40,"author":{"gitId":"-"},"content":" * Set `margin-bottom` to maintain vertical rhythm","lastModifiedDate":"2020-05-23"},{"lineNumber":41,"author":{"gitId":"-"},"content":" */","lastModifiedDate":"2020-05-23"},{"lineNumber":42,"author":{"gitId":"-"},"content":"h1, h2, h3, h4, h5, h6,","lastModifiedDate":"2020-05-23"},{"lineNumber":43,"author":{"gitId":"-"},"content":"p, blockquote, pre,","lastModifiedDate":"2020-05-23"},{"lineNumber":44,"author":{"gitId":"-"},"content":"ul, ol, dl, figure,","lastModifiedDate":"2020-05-23"},{"lineNumber":45,"author":{"gitId":"-"},"content":"%vertical-rhythm {","lastModifiedDate":"2020-05-23"},{"lineNumber":46,"author":{"gitId":"-"},"content":" margin-bottom: $spacing-unit / 2;","lastModifiedDate":"2020-05-23"},{"lineNumber":47,"author":{"gitId":"-"},"content":"}","lastModifiedDate":"2020-05-23"},{"lineNumber":48,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":49,"author":{"gitId":"-"},"content":"hr {","lastModifiedDate":"2020-05-23"},{"lineNumber":50,"author":{"gitId":"-"},"content":" margin-top: $spacing-unit;","lastModifiedDate":"2020-05-23"},{"lineNumber":51,"author":{"gitId":"-"},"content":" margin-bottom: $spacing-unit;","lastModifiedDate":"2020-05-23"},{"lineNumber":52,"author":{"gitId":"-"},"content":"}","lastModifiedDate":"2020-05-23"},{"lineNumber":53,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":54,"author":{"gitId":"-"},"content":"/**","lastModifiedDate":"2020-05-23"},{"lineNumber":55,"author":{"gitId":"-"},"content":" * `main` element","lastModifiedDate":"2020-05-23"},{"lineNumber":56,"author":{"gitId":"-"},"content":" */","lastModifiedDate":"2020-05-23"},{"lineNumber":57,"author":{"gitId":"-"},"content":"main {","lastModifiedDate":"2020-05-23"},{"lineNumber":58,"author":{"gitId":"-"},"content":" display: block; /* Default value of `display` of `main` element is \u0027inline\u0027 in IE 11. */","lastModifiedDate":"2020-05-23"},{"lineNumber":59,"author":{"gitId":"-"},"content":"}","lastModifiedDate":"2020-05-23"},{"lineNumber":60,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":61,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":62,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":63,"author":{"gitId":"-"},"content":"/**","lastModifiedDate":"2020-05-23"},{"lineNumber":64,"author":{"gitId":"-"},"content":" * Images","lastModifiedDate":"2020-05-23"},{"lineNumber":65,"author":{"gitId":"-"},"content":" */","lastModifiedDate":"2020-05-23"},{"lineNumber":66,"author":{"gitId":"-"},"content":"img {","lastModifiedDate":"2020-05-23"},{"lineNumber":67,"author":{"gitId":"-"},"content":" max-width: 100%;","lastModifiedDate":"2020-05-23"},{"lineNumber":68,"author":{"gitId":"-"},"content":" vertical-align: middle;","lastModifiedDate":"2020-05-23"},{"lineNumber":69,"author":{"gitId":"-"},"content":"}","lastModifiedDate":"2020-05-23"},{"lineNumber":70,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":71,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":72,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":73,"author":{"gitId":"-"},"content":"/**","lastModifiedDate":"2020-05-23"},{"lineNumber":74,"author":{"gitId":"-"},"content":" * Figures","lastModifiedDate":"2020-05-23"},{"lineNumber":75,"author":{"gitId":"-"},"content":" */","lastModifiedDate":"2020-05-23"},{"lineNumber":76,"author":{"gitId":"-"},"content":"figure \u003e img {","lastModifiedDate":"2020-05-23"},{"lineNumber":77,"author":{"gitId":"-"},"content":" display: block;","lastModifiedDate":"2020-05-23"},{"lineNumber":78,"author":{"gitId":"-"},"content":"}","lastModifiedDate":"2020-05-23"},{"lineNumber":79,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":80,"author":{"gitId":"-"},"content":"figcaption {","lastModifiedDate":"2020-05-23"},{"lineNumber":81,"author":{"gitId":"-"},"content":" font-size: $small-font-size;","lastModifiedDate":"2020-05-23"},{"lineNumber":82,"author":{"gitId":"-"},"content":"}","lastModifiedDate":"2020-05-23"},{"lineNumber":83,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":84,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":85,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":86,"author":{"gitId":"-"},"content":"/**","lastModifiedDate":"2020-05-23"},{"lineNumber":87,"author":{"gitId":"-"},"content":" * Lists","lastModifiedDate":"2020-05-23"},{"lineNumber":88,"author":{"gitId":"-"},"content":" */","lastModifiedDate":"2020-05-23"},{"lineNumber":89,"author":{"gitId":"-"},"content":"ul, ol {","lastModifiedDate":"2020-05-23"},{"lineNumber":90,"author":{"gitId":"-"},"content":" margin-left: $spacing-unit;","lastModifiedDate":"2020-05-23"},{"lineNumber":91,"author":{"gitId":"-"},"content":"}","lastModifiedDate":"2020-05-23"},{"lineNumber":92,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":93,"author":{"gitId":"-"},"content":"li {","lastModifiedDate":"2020-05-23"},{"lineNumber":94,"author":{"gitId":"-"},"content":" \u003e ul,","lastModifiedDate":"2020-05-23"},{"lineNumber":95,"author":{"gitId":"-"},"content":" \u003e ol {","lastModifiedDate":"2020-05-23"},{"lineNumber":96,"author":{"gitId":"-"},"content":" margin-bottom: 0;","lastModifiedDate":"2020-05-23"},{"lineNumber":97,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2020-05-23"},{"lineNumber":98,"author":{"gitId":"-"},"content":"}","lastModifiedDate":"2020-05-23"},{"lineNumber":99,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":100,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":101,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":102,"author":{"gitId":"-"},"content":"/**","lastModifiedDate":"2020-05-23"},{"lineNumber":103,"author":{"gitId":"-"},"content":" * Headings","lastModifiedDate":"2020-05-23"},{"lineNumber":104,"author":{"gitId":"-"},"content":" */","lastModifiedDate":"2020-05-23"},{"lineNumber":105,"author":{"gitId":"-"},"content":"h1, h2, h3, h4, h5, h6 {","lastModifiedDate":"2020-05-23"},{"lineNumber":106,"author":{"gitId":"-"},"content":" font-weight: $base-font-weight;","lastModifiedDate":"2020-05-23"},{"lineNumber":107,"author":{"gitId":"-"},"content":"}","lastModifiedDate":"2020-05-23"},{"lineNumber":108,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":109,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":110,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":111,"author":{"gitId":"-"},"content":"/**","lastModifiedDate":"2020-05-23"},{"lineNumber":112,"author":{"gitId":"-"},"content":" * Links","lastModifiedDate":"2020-05-23"},{"lineNumber":113,"author":{"gitId":"-"},"content":" */","lastModifiedDate":"2020-05-23"},{"lineNumber":114,"author":{"gitId":"-"},"content":"a {","lastModifiedDate":"2020-05-23"},{"lineNumber":115,"author":{"gitId":"-"},"content":" color: $link-base-color;","lastModifiedDate":"2020-05-23"},{"lineNumber":116,"author":{"gitId":"-"},"content":" text-decoration: none;","lastModifiedDate":"2020-05-23"},{"lineNumber":117,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":118,"author":{"gitId":"-"},"content":" \u0026:visited {","lastModifiedDate":"2020-05-23"},{"lineNumber":119,"author":{"gitId":"-"},"content":" color: $link-visited-color;","lastModifiedDate":"2020-05-23"},{"lineNumber":120,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2020-05-23"},{"lineNumber":121,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":122,"author":{"gitId":"-"},"content":" \u0026:hover {","lastModifiedDate":"2020-05-23"},{"lineNumber":123,"author":{"gitId":"-"},"content":" color: $text-color;","lastModifiedDate":"2020-05-23"},{"lineNumber":124,"author":{"gitId":"-"},"content":" text-decoration: underline;","lastModifiedDate":"2020-05-23"},{"lineNumber":125,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2020-05-23"},{"lineNumber":126,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":127,"author":{"gitId":"-"},"content":" .social-media-list \u0026:hover {","lastModifiedDate":"2020-05-23"},{"lineNumber":128,"author":{"gitId":"-"},"content":" text-decoration: none;","lastModifiedDate":"2020-05-23"},{"lineNumber":129,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":130,"author":{"gitId":"-"},"content":" .username {","lastModifiedDate":"2020-05-23"},{"lineNumber":131,"author":{"gitId":"-"},"content":" text-decoration: underline;","lastModifiedDate":"2020-05-23"},{"lineNumber":132,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2020-05-23"},{"lineNumber":133,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2020-05-23"},{"lineNumber":134,"author":{"gitId":"-"},"content":"}","lastModifiedDate":"2020-05-23"},{"lineNumber":135,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":136,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":137,"author":{"gitId":"-"},"content":"/**","lastModifiedDate":"2020-05-23"},{"lineNumber":138,"author":{"gitId":"-"},"content":" * Blockquotes","lastModifiedDate":"2020-05-23"},{"lineNumber":139,"author":{"gitId":"-"},"content":" */","lastModifiedDate":"2020-05-23"},{"lineNumber":140,"author":{"gitId":"-"},"content":"blockquote {","lastModifiedDate":"2020-05-23"},{"lineNumber":141,"author":{"gitId":"-"},"content":" color: $brand-color;","lastModifiedDate":"2020-05-23"},{"lineNumber":142,"author":{"gitId":"-"},"content":" border-left: 4px solid $brand-color-light;","lastModifiedDate":"2020-05-23"},{"lineNumber":143,"author":{"gitId":"-"},"content":" padding-left: $spacing-unit / 2;","lastModifiedDate":"2020-05-23"},{"lineNumber":144,"author":{"gitId":"-"},"content":" @include relative-font-size(1.125);","lastModifiedDate":"2020-05-23"},{"lineNumber":145,"author":{"gitId":"-"},"content":" font-style: italic;","lastModifiedDate":"2020-05-23"},{"lineNumber":146,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":147,"author":{"gitId":"-"},"content":" \u003e :last-child {","lastModifiedDate":"2020-05-23"},{"lineNumber":148,"author":{"gitId":"-"},"content":" margin-bottom: 0;","lastModifiedDate":"2020-05-23"},{"lineNumber":149,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2020-05-23"},{"lineNumber":150,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":151,"author":{"gitId":"-"},"content":" i, em {","lastModifiedDate":"2020-05-23"},{"lineNumber":152,"author":{"gitId":"-"},"content":" font-style: normal;","lastModifiedDate":"2020-05-23"},{"lineNumber":153,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2020-05-23"},{"lineNumber":154,"author":{"gitId":"-"},"content":"}","lastModifiedDate":"2020-05-23"},{"lineNumber":155,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":156,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":157,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":158,"author":{"gitId":"-"},"content":"/**","lastModifiedDate":"2020-05-23"},{"lineNumber":159,"author":{"gitId":"-"},"content":" * Code formatting","lastModifiedDate":"2020-05-23"},{"lineNumber":160,"author":{"gitId":"-"},"content":" */","lastModifiedDate":"2020-05-23"},{"lineNumber":161,"author":{"gitId":"-"},"content":"pre,","lastModifiedDate":"2020-05-23"},{"lineNumber":162,"author":{"gitId":"-"},"content":"code {","lastModifiedDate":"2020-05-23"},{"lineNumber":163,"author":{"gitId":"-"},"content":" font-family: $code-font-family;","lastModifiedDate":"2020-05-23"},{"lineNumber":164,"author":{"gitId":"-"},"content":" font-size: 0.9375em;","lastModifiedDate":"2020-05-23"},{"lineNumber":165,"author":{"gitId":"-"},"content":" border: 1px solid $brand-color-light;","lastModifiedDate":"2020-05-23"},{"lineNumber":166,"author":{"gitId":"-"},"content":" border-radius: 3px;","lastModifiedDate":"2020-05-23"},{"lineNumber":167,"author":{"gitId":"-"},"content":" background-color: $code-background-color;","lastModifiedDate":"2020-05-23"},{"lineNumber":168,"author":{"gitId":"-"},"content":"}","lastModifiedDate":"2020-05-23"},{"lineNumber":169,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":170,"author":{"gitId":"-"},"content":"code {","lastModifiedDate":"2020-05-23"},{"lineNumber":171,"author":{"gitId":"-"},"content":" padding: 1px 5px;","lastModifiedDate":"2020-05-23"},{"lineNumber":172,"author":{"gitId":"-"},"content":"}","lastModifiedDate":"2020-05-23"},{"lineNumber":173,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":174,"author":{"gitId":"-"},"content":"pre {","lastModifiedDate":"2020-05-23"},{"lineNumber":175,"author":{"gitId":"-"},"content":" padding: 8px 12px;","lastModifiedDate":"2020-05-23"},{"lineNumber":176,"author":{"gitId":"-"},"content":" overflow-x: auto;","lastModifiedDate":"2020-05-23"},{"lineNumber":177,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":178,"author":{"gitId":"-"},"content":" \u003e code {","lastModifiedDate":"2020-05-23"},{"lineNumber":179,"author":{"gitId":"-"},"content":" border: 0;","lastModifiedDate":"2020-05-23"},{"lineNumber":180,"author":{"gitId":"-"},"content":" padding-right: 0;","lastModifiedDate":"2020-05-23"},{"lineNumber":181,"author":{"gitId":"-"},"content":" padding-left: 0;","lastModifiedDate":"2020-05-23"},{"lineNumber":182,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2020-05-23"},{"lineNumber":183,"author":{"gitId":"-"},"content":"}","lastModifiedDate":"2020-05-23"},{"lineNumber":184,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":185,"author":{"gitId":"-"},"content":".highlight {","lastModifiedDate":"2020-05-23"},{"lineNumber":186,"author":{"gitId":"-"},"content":" border-radius: 3px;","lastModifiedDate":"2020-05-23"},{"lineNumber":187,"author":{"gitId":"-"},"content":" background: $code-background-color;","lastModifiedDate":"2020-05-23"},{"lineNumber":188,"author":{"gitId":"-"},"content":" @extend %vertical-rhythm;","lastModifiedDate":"2020-05-23"},{"lineNumber":189,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":190,"author":{"gitId":"-"},"content":" .highlighter-rouge \u0026 {","lastModifiedDate":"2020-05-23"},{"lineNumber":191,"author":{"gitId":"-"},"content":" background: $code-background-color;","lastModifiedDate":"2020-05-23"},{"lineNumber":192,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2020-05-23"},{"lineNumber":193,"author":{"gitId":"-"},"content":"}","lastModifiedDate":"2020-05-23"},{"lineNumber":194,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":195,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":196,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":197,"author":{"gitId":"-"},"content":"/**","lastModifiedDate":"2020-05-23"},{"lineNumber":198,"author":{"gitId":"-"},"content":" * Wrapper","lastModifiedDate":"2020-05-23"},{"lineNumber":199,"author":{"gitId":"-"},"content":" */","lastModifiedDate":"2020-05-23"},{"lineNumber":200,"author":{"gitId":"-"},"content":".wrapper {","lastModifiedDate":"2020-05-23"},{"lineNumber":201,"author":{"gitId":"-"},"content":" max-width: calc(#{$content-width} - (#{$spacing-unit}));","lastModifiedDate":"2020-05-23"},{"lineNumber":202,"author":{"gitId":"-"},"content":" margin-right: auto;","lastModifiedDate":"2020-05-23"},{"lineNumber":203,"author":{"gitId":"-"},"content":" margin-left: auto;","lastModifiedDate":"2020-05-23"},{"lineNumber":204,"author":{"gitId":"-"},"content":" padding-right: $spacing-unit / 2;","lastModifiedDate":"2020-05-23"},{"lineNumber":205,"author":{"gitId":"-"},"content":" padding-left: $spacing-unit / 2;","lastModifiedDate":"2020-05-23"},{"lineNumber":206,"author":{"gitId":"-"},"content":" @extend %clearfix;","lastModifiedDate":"2020-05-23"},{"lineNumber":207,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":208,"author":{"gitId":"-"},"content":" @media screen and (min-width: $on-large) {","lastModifiedDate":"2020-05-23"},{"lineNumber":209,"author":{"gitId":"-"},"content":" max-width: calc(#{$content-width} - (#{$spacing-unit} * 2));","lastModifiedDate":"2020-05-23"},{"lineNumber":210,"author":{"gitId":"-"},"content":" padding-right: $spacing-unit;","lastModifiedDate":"2020-05-23"},{"lineNumber":211,"author":{"gitId":"-"},"content":" padding-left: $spacing-unit;","lastModifiedDate":"2020-05-23"},{"lineNumber":212,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2020-05-23"},{"lineNumber":213,"author":{"gitId":"-"},"content":"}","lastModifiedDate":"2020-05-23"},{"lineNumber":214,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":215,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":216,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":217,"author":{"gitId":"-"},"content":"/**","lastModifiedDate":"2020-05-23"},{"lineNumber":218,"author":{"gitId":"-"},"content":" * Clearfix","lastModifiedDate":"2020-05-23"},{"lineNumber":219,"author":{"gitId":"-"},"content":" */","lastModifiedDate":"2020-05-23"},{"lineNumber":220,"author":{"gitId":"-"},"content":"%clearfix:after {","lastModifiedDate":"2020-05-23"},{"lineNumber":221,"author":{"gitId":"-"},"content":" content: \"\";","lastModifiedDate":"2020-05-23"},{"lineNumber":222,"author":{"gitId":"-"},"content":" display: table;","lastModifiedDate":"2020-05-23"},{"lineNumber":223,"author":{"gitId":"-"},"content":" clear: both;","lastModifiedDate":"2020-05-23"},{"lineNumber":224,"author":{"gitId":"-"},"content":"}","lastModifiedDate":"2020-05-23"},{"lineNumber":225,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":226,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":227,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":228,"author":{"gitId":"-"},"content":"/**","lastModifiedDate":"2020-05-23"},{"lineNumber":229,"author":{"gitId":"-"},"content":" * Icons","lastModifiedDate":"2020-05-23"},{"lineNumber":230,"author":{"gitId":"-"},"content":" */","lastModifiedDate":"2020-05-23"},{"lineNumber":231,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":232,"author":{"gitId":"-"},"content":".orange {","lastModifiedDate":"2020-05-23"},{"lineNumber":233,"author":{"gitId":"-"},"content":" color: #f66a0a;","lastModifiedDate":"2020-05-23"},{"lineNumber":234,"author":{"gitId":"-"},"content":"}","lastModifiedDate":"2020-05-23"},{"lineNumber":235,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":236,"author":{"gitId":"-"},"content":".grey {","lastModifiedDate":"2020-05-23"},{"lineNumber":237,"author":{"gitId":"-"},"content":" color: #828282;","lastModifiedDate":"2020-05-23"},{"lineNumber":238,"author":{"gitId":"-"},"content":"}","lastModifiedDate":"2020-05-23"},{"lineNumber":239,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":240,"author":{"gitId":"-"},"content":"/**","lastModifiedDate":"2020-05-23"},{"lineNumber":241,"author":{"gitId":"-"},"content":" * Tables","lastModifiedDate":"2020-05-23"},{"lineNumber":242,"author":{"gitId":"-"},"content":" */","lastModifiedDate":"2020-05-23"},{"lineNumber":243,"author":{"gitId":"-"},"content":"table {","lastModifiedDate":"2020-05-23"},{"lineNumber":244,"author":{"gitId":"-"},"content":" margin-bottom: $spacing-unit;","lastModifiedDate":"2020-05-23"},{"lineNumber":245,"author":{"gitId":"-"},"content":" width: 100%;","lastModifiedDate":"2020-05-23"},{"lineNumber":246,"author":{"gitId":"-"},"content":" text-align: $table-text-align;","lastModifiedDate":"2020-05-23"},{"lineNumber":247,"author":{"gitId":"-"},"content":" color: $table-text-color;","lastModifiedDate":"2020-05-23"},{"lineNumber":248,"author":{"gitId":"-"},"content":" border-collapse: collapse;","lastModifiedDate":"2020-05-23"},{"lineNumber":249,"author":{"gitId":"-"},"content":" border: 1px solid $table-border-color;","lastModifiedDate":"2020-05-23"},{"lineNumber":250,"author":{"gitId":"-"},"content":" tr {","lastModifiedDate":"2020-05-23"},{"lineNumber":251,"author":{"gitId":"-"},"content":" \u0026:nth-child(even) {","lastModifiedDate":"2020-05-23"},{"lineNumber":252,"author":{"gitId":"-"},"content":" background-color: $table-zebra-color;","lastModifiedDate":"2020-05-23"},{"lineNumber":253,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2020-05-23"},{"lineNumber":254,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2020-05-23"},{"lineNumber":255,"author":{"gitId":"-"},"content":" th, td {","lastModifiedDate":"2020-05-23"},{"lineNumber":256,"author":{"gitId":"-"},"content":" padding: ($spacing-unit / 3) ($spacing-unit / 2);","lastModifiedDate":"2020-05-23"},{"lineNumber":257,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2020-05-23"},{"lineNumber":258,"author":{"gitId":"-"},"content":" th {","lastModifiedDate":"2020-05-23"},{"lineNumber":259,"author":{"gitId":"-"},"content":" background-color: $table-header-bg-color;","lastModifiedDate":"2020-05-23"},{"lineNumber":260,"author":{"gitId":"-"},"content":" border: 1px solid $table-header-border;","lastModifiedDate":"2020-05-23"},{"lineNumber":261,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2020-05-23"},{"lineNumber":262,"author":{"gitId":"-"},"content":" td {","lastModifiedDate":"2020-05-23"},{"lineNumber":263,"author":{"gitId":"-"},"content":" border: 1px solid $table-border-color;","lastModifiedDate":"2020-05-23"},{"lineNumber":264,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2020-05-23"},{"lineNumber":265,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":266,"author":{"gitId":"-"},"content":" @include media-query($on-laptop) {","lastModifiedDate":"2020-05-23"},{"lineNumber":267,"author":{"gitId":"-"},"content":" display: block;","lastModifiedDate":"2020-05-23"},{"lineNumber":268,"author":{"gitId":"-"},"content":" overflow-x: auto;","lastModifiedDate":"2020-05-23"},{"lineNumber":269,"author":{"gitId":"-"},"content":" -webkit-overflow-scrolling: touch;","lastModifiedDate":"2020-05-23"},{"lineNumber":270,"author":{"gitId":"-"},"content":" -ms-overflow-style: -ms-autohiding-scrollbar;","lastModifiedDate":"2020-05-23"},{"lineNumber":271,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2020-05-23"},{"lineNumber":272,"author":{"gitId":"-"},"content":"}","lastModifiedDate":"2020-05-23"},{"lineNumber":273,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2021-01-11"},{"lineNumber":274,"author":{"gitId":"-"},"content":"@media print {","lastModifiedDate":"2021-01-12"},{"lineNumber":275,"author":{"gitId":"-"},"content":" /**","lastModifiedDate":"2021-01-11"},{"lineNumber":276,"author":{"gitId":"-"},"content":" * Prevents page break from cutting through content when printing","lastModifiedDate":"2021-01-12"},{"lineNumber":277,"author":{"gitId":"-"},"content":" */","lastModifiedDate":"2021-01-11"},{"lineNumber":278,"author":{"gitId":"-"},"content":" body {","lastModifiedDate":"2021-01-11"},{"lineNumber":279,"author":{"gitId":"-"},"content":" display: block;","lastModifiedDate":"2021-01-11"},{"lineNumber":280,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2021-01-11"},{"lineNumber":281,"author":{"gitId":"-"},"content":" /**","lastModifiedDate":"2021-01-12"},{"lineNumber":282,"author":{"gitId":"-"},"content":" * Replaces the top navigation menu with the project name when printing","lastModifiedDate":"2021-01-12"},{"lineNumber":283,"author":{"gitId":"-"},"content":" */","lastModifiedDate":"2021-01-12"},{"lineNumber":284,"author":{"gitId":"-"},"content":" .site-header .wrapper {","lastModifiedDate":"2021-01-12"},{"lineNumber":285,"author":{"gitId":"-"},"content":" display: none;","lastModifiedDate":"2021-01-12"},{"lineNumber":286,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2021-01-12"},{"lineNumber":287,"author":{"gitId":"-"},"content":" .site-header {","lastModifiedDate":"2021-01-12"},{"lineNumber":288,"author":{"gitId":"-"},"content":" text-align: center;","lastModifiedDate":"2021-01-12"},{"lineNumber":289,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2021-01-12"},{"lineNumber":290,"author":{"gitId":"-"},"content":" .site-header:before {","lastModifiedDate":"2021-01-12"},{"lineNumber":291,"author":{"gitId":"jieqiboh"},"content":" content: \"CareerSync\";","lastModifiedDate":"2024-02-29"},{"lineNumber":292,"author":{"gitId":"-"},"content":" font-size: 32px;","lastModifiedDate":"2021-01-12"},{"lineNumber":293,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2021-01-11"},{"lineNumber":294,"author":{"gitId":"-"},"content":"}","lastModifiedDate":"2021-01-12"},{"lineNumber":295,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2021-01-12"}],"authorContributionMap":{"jieqiboh":1,"-":294}},{"path":"docs/_sass/minima/_layout.scss","fileType":"other","lines":[{"lineNumber":1,"author":{"gitId":"jieqiboh"},"content":"/**","lastModifiedDate":"2024-03-02"},{"lineNumber":2,"author":{"gitId":"jieqiboh"},"content":" * Site header","lastModifiedDate":"2024-03-02"},{"lineNumber":3,"author":{"gitId":"jieqiboh"},"content":" */","lastModifiedDate":"2024-03-02"},{"lineNumber":4,"author":{"gitId":"jieqiboh"},"content":".site-header {","lastModifiedDate":"2024-03-02"},{"lineNumber":5,"author":{"gitId":"jieqiboh"},"content":" border-top: 5px solid $brand-color-dark;","lastModifiedDate":"2024-03-02"},{"lineNumber":6,"author":{"gitId":"jieqiboh"},"content":" border-bottom: 1px solid $brand-color-light;","lastModifiedDate":"2024-03-02"},{"lineNumber":7,"author":{"gitId":"jieqiboh"},"content":" min-height: $spacing-unit * 1.865;","lastModifiedDate":"2024-03-02"},{"lineNumber":8,"author":{"gitId":"jieqiboh"},"content":" line-height: $base-line-height * $base-font-size * 2.25;","lastModifiedDate":"2024-03-02"},{"lineNumber":9,"author":{"gitId":"jieqiboh"},"content":"","lastModifiedDate":"2024-03-02"},{"lineNumber":10,"author":{"gitId":"jieqiboh"},"content":" // Positioning context for the mobile navigation icon","lastModifiedDate":"2024-03-02"},{"lineNumber":11,"author":{"gitId":"jieqiboh"},"content":" position: relative;","lastModifiedDate":"2024-03-02"},{"lineNumber":12,"author":{"gitId":"jieqiboh"},"content":"}","lastModifiedDate":"2024-03-02"},{"lineNumber":13,"author":{"gitId":"jieqiboh"},"content":"","lastModifiedDate":"2024-03-02"},{"lineNumber":14,"author":{"gitId":"jieqiboh"},"content":".site-title {","lastModifiedDate":"2024-03-02"},{"lineNumber":15,"author":{"gitId":"jieqiboh"},"content":" @include relative-font-size(1.625);","lastModifiedDate":"2024-03-02"},{"lineNumber":16,"author":{"gitId":"jieqiboh"},"content":" font-weight: 300;","lastModifiedDate":"2024-03-02"},{"lineNumber":17,"author":{"gitId":"jieqiboh"},"content":" letter-spacing: -1px;","lastModifiedDate":"2024-03-02"},{"lineNumber":18,"author":{"gitId":"jieqiboh"},"content":" margin-bottom: 0;","lastModifiedDate":"2024-03-02"},{"lineNumber":19,"author":{"gitId":"jieqiboh"},"content":" float: left;","lastModifiedDate":"2024-03-02"},{"lineNumber":20,"author":{"gitId":"jieqiboh"},"content":"","lastModifiedDate":"2024-03-02"},{"lineNumber":21,"author":{"gitId":"jieqiboh"},"content":" @include media-query($on-palm) {","lastModifiedDate":"2024-03-02"},{"lineNumber":22,"author":{"gitId":"jieqiboh"},"content":" padding-right: 45px;","lastModifiedDate":"2024-03-02"},{"lineNumber":23,"author":{"gitId":"jieqiboh"},"content":" }","lastModifiedDate":"2024-03-02"},{"lineNumber":24,"author":{"gitId":"jieqiboh"},"content":"","lastModifiedDate":"2024-03-02"},{"lineNumber":25,"author":{"gitId":"jieqiboh"},"content":" \u0026,","lastModifiedDate":"2024-03-02"},{"lineNumber":26,"author":{"gitId":"jieqiboh"},"content":" \u0026:visited {","lastModifiedDate":"2024-03-02"},{"lineNumber":27,"author":{"gitId":"jieqiboh"},"content":" color: $brand-color-dark;","lastModifiedDate":"2024-03-02"},{"lineNumber":28,"author":{"gitId":"jieqiboh"},"content":" }","lastModifiedDate":"2024-03-02"},{"lineNumber":29,"author":{"gitId":"jieqiboh"},"content":"}","lastModifiedDate":"2024-03-02"},{"lineNumber":30,"author":{"gitId":"jieqiboh"},"content":"","lastModifiedDate":"2024-03-02"},{"lineNumber":31,"author":{"gitId":"jieqiboh"},"content":".site-nav {","lastModifiedDate":"2024-03-02"},{"lineNumber":32,"author":{"gitId":"jieqiboh"},"content":" position: absolute;","lastModifiedDate":"2024-03-02"},{"lineNumber":33,"author":{"gitId":"jieqiboh"},"content":" top: 9px;","lastModifiedDate":"2024-03-02"},{"lineNumber":34,"author":{"gitId":"jieqiboh"},"content":" right: $spacing-unit / 2;","lastModifiedDate":"2024-03-02"},{"lineNumber":35,"author":{"gitId":"jieqiboh"},"content":" background-color: $background-color;","lastModifiedDate":"2024-03-02"},{"lineNumber":36,"author":{"gitId":"jieqiboh"},"content":" border: 1px solid $brand-color-light;","lastModifiedDate":"2024-03-02"},{"lineNumber":37,"author":{"gitId":"jieqiboh"},"content":" border-radius: 5px;","lastModifiedDate":"2024-03-02"},{"lineNumber":38,"author":{"gitId":"jieqiboh"},"content":" text-align: right;","lastModifiedDate":"2024-03-02"},{"lineNumber":39,"author":{"gitId":"jieqiboh"},"content":"","lastModifiedDate":"2024-03-02"},{"lineNumber":40,"author":{"gitId":"jieqiboh"},"content":" .nav-trigger {","lastModifiedDate":"2024-03-02"},{"lineNumber":41,"author":{"gitId":"jieqiboh"},"content":" display: none;","lastModifiedDate":"2024-03-02"},{"lineNumber":42,"author":{"gitId":"jieqiboh"},"content":" }","lastModifiedDate":"2024-03-02"},{"lineNumber":43,"author":{"gitId":"jieqiboh"},"content":"","lastModifiedDate":"2024-03-02"},{"lineNumber":44,"author":{"gitId":"jieqiboh"},"content":" .menu-icon {","lastModifiedDate":"2024-03-02"},{"lineNumber":45,"author":{"gitId":"jieqiboh"},"content":" float: right;","lastModifiedDate":"2024-03-02"},{"lineNumber":46,"author":{"gitId":"jieqiboh"},"content":" width: 36px;","lastModifiedDate":"2024-03-02"},{"lineNumber":47,"author":{"gitId":"jieqiboh"},"content":" height: 26px;","lastModifiedDate":"2024-03-02"},{"lineNumber":48,"author":{"gitId":"jieqiboh"},"content":" line-height: 0;","lastModifiedDate":"2024-03-02"},{"lineNumber":49,"author":{"gitId":"jieqiboh"},"content":" padding-top: 10px;","lastModifiedDate":"2024-03-02"},{"lineNumber":50,"author":{"gitId":"jieqiboh"},"content":" text-align: center;","lastModifiedDate":"2024-03-02"},{"lineNumber":51,"author":{"gitId":"jieqiboh"},"content":"","lastModifiedDate":"2024-03-02"},{"lineNumber":52,"author":{"gitId":"jieqiboh"},"content":" \u003e svg path {","lastModifiedDate":"2024-03-02"},{"lineNumber":53,"author":{"gitId":"jieqiboh"},"content":" fill: $brand-color-dark;","lastModifiedDate":"2024-03-02"},{"lineNumber":54,"author":{"gitId":"jieqiboh"},"content":" }","lastModifiedDate":"2024-03-02"},{"lineNumber":55,"author":{"gitId":"jieqiboh"},"content":" }","lastModifiedDate":"2024-03-02"},{"lineNumber":56,"author":{"gitId":"jieqiboh"},"content":"","lastModifiedDate":"2024-03-02"},{"lineNumber":57,"author":{"gitId":"jieqiboh"},"content":" label[for\u003d\"nav-trigger\"] {","lastModifiedDate":"2024-03-02"},{"lineNumber":58,"author":{"gitId":"jieqiboh"},"content":" display: block;","lastModifiedDate":"2024-03-02"},{"lineNumber":59,"author":{"gitId":"jieqiboh"},"content":" float: right;","lastModifiedDate":"2024-03-02"},{"lineNumber":60,"author":{"gitId":"jieqiboh"},"content":" width: 36px;","lastModifiedDate":"2024-03-02"},{"lineNumber":61,"author":{"gitId":"jieqiboh"},"content":" height: 36px;","lastModifiedDate":"2024-03-02"},{"lineNumber":62,"author":{"gitId":"jieqiboh"},"content":" z-index: 2;","lastModifiedDate":"2024-03-02"},{"lineNumber":63,"author":{"gitId":"jieqiboh"},"content":" cursor: pointer;","lastModifiedDate":"2024-03-02"},{"lineNumber":64,"author":{"gitId":"jieqiboh"},"content":" }","lastModifiedDate":"2024-03-02"},{"lineNumber":65,"author":{"gitId":"jieqiboh"},"content":"","lastModifiedDate":"2024-03-02"},{"lineNumber":66,"author":{"gitId":"jieqiboh"},"content":" input ~ .trigger {","lastModifiedDate":"2024-03-02"},{"lineNumber":67,"author":{"gitId":"jieqiboh"},"content":" clear: both;","lastModifiedDate":"2024-03-02"},{"lineNumber":68,"author":{"gitId":"jieqiboh"},"content":" display: none;","lastModifiedDate":"2024-03-02"},{"lineNumber":69,"author":{"gitId":"jieqiboh"},"content":" }","lastModifiedDate":"2024-03-02"},{"lineNumber":70,"author":{"gitId":"jieqiboh"},"content":"","lastModifiedDate":"2024-03-02"},{"lineNumber":71,"author":{"gitId":"jieqiboh"},"content":" input:checked ~ .trigger {","lastModifiedDate":"2024-03-02"},{"lineNumber":72,"author":{"gitId":"jieqiboh"},"content":" display: block;","lastModifiedDate":"2024-03-02"},{"lineNumber":73,"author":{"gitId":"jieqiboh"},"content":" padding-bottom: 5px;","lastModifiedDate":"2024-03-02"},{"lineNumber":74,"author":{"gitId":"jieqiboh"},"content":" }","lastModifiedDate":"2024-03-02"},{"lineNumber":75,"author":{"gitId":"jieqiboh"},"content":"","lastModifiedDate":"2024-03-02"},{"lineNumber":76,"author":{"gitId":"jieqiboh"},"content":" .page-link {","lastModifiedDate":"2024-03-02"},{"lineNumber":77,"author":{"gitId":"jieqiboh"},"content":" color: $text-color;","lastModifiedDate":"2024-03-02"},{"lineNumber":78,"author":{"gitId":"jieqiboh"},"content":" line-height: $base-line-height;","lastModifiedDate":"2024-03-02"},{"lineNumber":79,"author":{"gitId":"jieqiboh"},"content":" display: block;","lastModifiedDate":"2024-03-02"},{"lineNumber":80,"author":{"gitId":"jieqiboh"},"content":" padding: 5px 10px;","lastModifiedDate":"2024-03-02"},{"lineNumber":81,"author":{"gitId":"jieqiboh"},"content":"","lastModifiedDate":"2024-03-02"},{"lineNumber":82,"author":{"gitId":"jieqiboh"},"content":" // Gaps between nav items, but not on the last one","lastModifiedDate":"2024-03-02"},{"lineNumber":83,"author":{"gitId":"jieqiboh"},"content":" \u0026:not(:last-child) {","lastModifiedDate":"2024-03-02"},{"lineNumber":84,"author":{"gitId":"jieqiboh"},"content":" margin-right: 0;","lastModifiedDate":"2024-03-02"},{"lineNumber":85,"author":{"gitId":"jieqiboh"},"content":" }","lastModifiedDate":"2024-03-02"},{"lineNumber":86,"author":{"gitId":"jieqiboh"},"content":" margin-left: 20px;","lastModifiedDate":"2024-03-02"},{"lineNumber":87,"author":{"gitId":"jieqiboh"},"content":" }","lastModifiedDate":"2024-03-02"},{"lineNumber":88,"author":{"gitId":"jieqiboh"},"content":"","lastModifiedDate":"2024-03-02"},{"lineNumber":89,"author":{"gitId":"jieqiboh"},"content":" @media screen and (min-width: $on-medium) {","lastModifiedDate":"2024-03-02"},{"lineNumber":90,"author":{"gitId":"jieqiboh"},"content":" position: static;","lastModifiedDate":"2024-03-02"},{"lineNumber":91,"author":{"gitId":"jieqiboh"},"content":" float: right;","lastModifiedDate":"2024-03-02"},{"lineNumber":92,"author":{"gitId":"jieqiboh"},"content":" border: none;","lastModifiedDate":"2024-03-02"},{"lineNumber":93,"author":{"gitId":"jieqiboh"},"content":" background-color: inherit;","lastModifiedDate":"2024-03-02"},{"lineNumber":94,"author":{"gitId":"jieqiboh"},"content":"","lastModifiedDate":"2024-03-02"},{"lineNumber":95,"author":{"gitId":"jieqiboh"},"content":" label[for\u003d\"nav-trigger\"] {","lastModifiedDate":"2024-03-02"},{"lineNumber":96,"author":{"gitId":"jieqiboh"},"content":" display: none;","lastModifiedDate":"2024-03-02"},{"lineNumber":97,"author":{"gitId":"jieqiboh"},"content":" }","lastModifiedDate":"2024-03-02"},{"lineNumber":98,"author":{"gitId":"jieqiboh"},"content":"","lastModifiedDate":"2024-03-02"},{"lineNumber":99,"author":{"gitId":"jieqiboh"},"content":" .menu-icon {","lastModifiedDate":"2024-03-02"},{"lineNumber":100,"author":{"gitId":"jieqiboh"},"content":" display: none;","lastModifiedDate":"2024-03-02"},{"lineNumber":101,"author":{"gitId":"jieqiboh"},"content":" }","lastModifiedDate":"2024-03-02"},{"lineNumber":102,"author":{"gitId":"jieqiboh"},"content":"","lastModifiedDate":"2024-03-02"},{"lineNumber":103,"author":{"gitId":"jieqiboh"},"content":" input ~ .trigger {","lastModifiedDate":"2024-03-02"},{"lineNumber":104,"author":{"gitId":"jieqiboh"},"content":" display: block;","lastModifiedDate":"2024-03-02"},{"lineNumber":105,"author":{"gitId":"jieqiboh"},"content":" }","lastModifiedDate":"2024-03-02"},{"lineNumber":106,"author":{"gitId":"jieqiboh"},"content":"","lastModifiedDate":"2024-03-02"},{"lineNumber":107,"author":{"gitId":"jieqiboh"},"content":" .page-link {","lastModifiedDate":"2024-03-02"},{"lineNumber":108,"author":{"gitId":"jieqiboh"},"content":" display: inline;","lastModifiedDate":"2024-03-02"},{"lineNumber":109,"author":{"gitId":"jieqiboh"},"content":" padding: 0;","lastModifiedDate":"2024-03-02"},{"lineNumber":110,"author":{"gitId":"jieqiboh"},"content":"","lastModifiedDate":"2024-03-02"},{"lineNumber":111,"author":{"gitId":"jieqiboh"},"content":" \u0026:not(:last-child) {","lastModifiedDate":"2024-03-02"},{"lineNumber":112,"author":{"gitId":"jieqiboh"},"content":" margin-right: 20px;","lastModifiedDate":"2024-03-02"},{"lineNumber":113,"author":{"gitId":"jieqiboh"},"content":" }","lastModifiedDate":"2024-03-02"},{"lineNumber":114,"author":{"gitId":"jieqiboh"},"content":" margin-left: auto;","lastModifiedDate":"2024-03-02"},{"lineNumber":115,"author":{"gitId":"jieqiboh"},"content":" }","lastModifiedDate":"2024-03-02"},{"lineNumber":116,"author":{"gitId":"jieqiboh"},"content":" }","lastModifiedDate":"2024-03-02"},{"lineNumber":117,"author":{"gitId":"jieqiboh"},"content":"}","lastModifiedDate":"2024-03-02"},{"lineNumber":118,"author":{"gitId":"jieqiboh"},"content":"","lastModifiedDate":"2024-03-02"},{"lineNumber":119,"author":{"gitId":"jieqiboh"},"content":"","lastModifiedDate":"2024-03-02"},{"lineNumber":120,"author":{"gitId":"jieqiboh"},"content":"","lastModifiedDate":"2024-03-02"},{"lineNumber":121,"author":{"gitId":"jieqiboh"},"content":"/**","lastModifiedDate":"2024-03-02"},{"lineNumber":122,"author":{"gitId":"jieqiboh"},"content":" * Page content","lastModifiedDate":"2024-03-02"},{"lineNumber":123,"author":{"gitId":"jieqiboh"},"content":" */","lastModifiedDate":"2024-03-02"},{"lineNumber":124,"author":{"gitId":"jieqiboh"},"content":".page-content {","lastModifiedDate":"2024-03-02"},{"lineNumber":125,"author":{"gitId":"jieqiboh"},"content":" padding: $spacing-unit 0;","lastModifiedDate":"2024-03-02"},{"lineNumber":126,"author":{"gitId":"jieqiboh"},"content":" flex: 1 0 auto;","lastModifiedDate":"2024-03-02"},{"lineNumber":127,"author":{"gitId":"jieqiboh"},"content":"}","lastModifiedDate":"2024-03-02"},{"lineNumber":128,"author":{"gitId":"jieqiboh"},"content":"","lastModifiedDate":"2024-03-02"},{"lineNumber":129,"author":{"gitId":"jieqiboh"},"content":".page-heading {","lastModifiedDate":"2024-03-02"},{"lineNumber":130,"author":{"gitId":"jieqiboh"},"content":" @include relative-font-size(2);","lastModifiedDate":"2024-03-02"},{"lineNumber":131,"author":{"gitId":"jieqiboh"},"content":"}","lastModifiedDate":"2024-03-02"},{"lineNumber":132,"author":{"gitId":"jieqiboh"},"content":"","lastModifiedDate":"2024-03-02"},{"lineNumber":133,"author":{"gitId":"jieqiboh"},"content":".post-list-heading {","lastModifiedDate":"2024-03-02"},{"lineNumber":134,"author":{"gitId":"jieqiboh"},"content":" @include relative-font-size(1.75);","lastModifiedDate":"2024-03-02"},{"lineNumber":135,"author":{"gitId":"jieqiboh"},"content":"}","lastModifiedDate":"2024-03-02"},{"lineNumber":136,"author":{"gitId":"jieqiboh"},"content":"","lastModifiedDate":"2024-03-02"},{"lineNumber":137,"author":{"gitId":"jieqiboh"},"content":".post-list {","lastModifiedDate":"2024-03-02"},{"lineNumber":138,"author":{"gitId":"jieqiboh"},"content":" margin-left: 0;","lastModifiedDate":"2024-03-02"},{"lineNumber":139,"author":{"gitId":"jieqiboh"},"content":" list-style: none;","lastModifiedDate":"2024-03-02"},{"lineNumber":140,"author":{"gitId":"jieqiboh"},"content":"","lastModifiedDate":"2024-03-02"},{"lineNumber":141,"author":{"gitId":"jieqiboh"},"content":" \u003e li {","lastModifiedDate":"2024-03-02"},{"lineNumber":142,"author":{"gitId":"jieqiboh"},"content":" margin-bottom: $spacing-unit;","lastModifiedDate":"2024-03-02"},{"lineNumber":143,"author":{"gitId":"jieqiboh"},"content":" }","lastModifiedDate":"2024-03-02"},{"lineNumber":144,"author":{"gitId":"jieqiboh"},"content":"}","lastModifiedDate":"2024-03-02"},{"lineNumber":145,"author":{"gitId":"jieqiboh"},"content":"","lastModifiedDate":"2024-03-02"},{"lineNumber":146,"author":{"gitId":"jieqiboh"},"content":".post-meta {","lastModifiedDate":"2024-03-02"},{"lineNumber":147,"author":{"gitId":"jieqiboh"},"content":" font-size: $small-font-size;","lastModifiedDate":"2024-03-02"},{"lineNumber":148,"author":{"gitId":"jieqiboh"},"content":" color: $brand-color;","lastModifiedDate":"2024-03-02"},{"lineNumber":149,"author":{"gitId":"jieqiboh"},"content":"}","lastModifiedDate":"2024-03-02"},{"lineNumber":150,"author":{"gitId":"jieqiboh"},"content":"","lastModifiedDate":"2024-03-02"},{"lineNumber":151,"author":{"gitId":"jieqiboh"},"content":".post-link {","lastModifiedDate":"2024-03-02"},{"lineNumber":152,"author":{"gitId":"jieqiboh"},"content":" display: block;","lastModifiedDate":"2024-03-02"},{"lineNumber":153,"author":{"gitId":"jieqiboh"},"content":" @include relative-font-size(1.5);","lastModifiedDate":"2024-03-02"},{"lineNumber":154,"author":{"gitId":"jieqiboh"},"content":"}","lastModifiedDate":"2024-03-02"},{"lineNumber":155,"author":{"gitId":"jieqiboh"},"content":"","lastModifiedDate":"2024-03-02"},{"lineNumber":156,"author":{"gitId":"jieqiboh"},"content":"","lastModifiedDate":"2024-03-02"},{"lineNumber":157,"author":{"gitId":"jieqiboh"},"content":"","lastModifiedDate":"2024-03-02"},{"lineNumber":158,"author":{"gitId":"jieqiboh"},"content":"/**","lastModifiedDate":"2024-03-02"},{"lineNumber":159,"author":{"gitId":"jieqiboh"},"content":" * Posts","lastModifiedDate":"2024-03-02"},{"lineNumber":160,"author":{"gitId":"jieqiboh"},"content":" */","lastModifiedDate":"2024-03-02"},{"lineNumber":161,"author":{"gitId":"jieqiboh"},"content":".post-header {","lastModifiedDate":"2024-03-02"},{"lineNumber":162,"author":{"gitId":"jieqiboh"},"content":" margin-bottom: $spacing-unit;","lastModifiedDate":"2024-03-02"},{"lineNumber":163,"author":{"gitId":"jieqiboh"},"content":"}","lastModifiedDate":"2024-03-02"},{"lineNumber":164,"author":{"gitId":"jieqiboh"},"content":"","lastModifiedDate":"2024-03-02"},{"lineNumber":165,"author":{"gitId":"jieqiboh"},"content":".post-title,","lastModifiedDate":"2024-03-02"},{"lineNumber":166,"author":{"gitId":"jieqiboh"},"content":".post-content h1 {","lastModifiedDate":"2024-03-02"},{"lineNumber":167,"author":{"gitId":"jieqiboh"},"content":" @include relative-font-size(2.625);","lastModifiedDate":"2024-03-02"},{"lineNumber":168,"author":{"gitId":"jieqiboh"},"content":" letter-spacing: -1px;","lastModifiedDate":"2024-03-02"},{"lineNumber":169,"author":{"gitId":"jieqiboh"},"content":" line-height: 1.15;","lastModifiedDate":"2024-03-02"},{"lineNumber":170,"author":{"gitId":"jieqiboh"},"content":"","lastModifiedDate":"2024-03-02"},{"lineNumber":171,"author":{"gitId":"jieqiboh"},"content":" @media screen and (min-width: $on-large) {","lastModifiedDate":"2024-03-02"},{"lineNumber":172,"author":{"gitId":"jieqiboh"},"content":" @include relative-font-size(2.625);","lastModifiedDate":"2024-03-02"},{"lineNumber":173,"author":{"gitId":"jieqiboh"},"content":" }","lastModifiedDate":"2024-03-02"},{"lineNumber":174,"author":{"gitId":"jieqiboh"},"content":"}","lastModifiedDate":"2024-03-02"},{"lineNumber":175,"author":{"gitId":"jieqiboh"},"content":"","lastModifiedDate":"2024-03-02"},{"lineNumber":176,"author":{"gitId":"jieqiboh"},"content":".post-content {","lastModifiedDate":"2024-03-02"},{"lineNumber":177,"author":{"gitId":"jieqiboh"},"content":" margin-bottom: $spacing-unit;","lastModifiedDate":"2024-03-02"},{"lineNumber":178,"author":{"gitId":"jieqiboh"},"content":"","lastModifiedDate":"2024-03-02"},{"lineNumber":179,"author":{"gitId":"jieqiboh"},"content":" h1, h2, h3 { margin-top: $spacing-unit * 2 }","lastModifiedDate":"2024-03-02"},{"lineNumber":180,"author":{"gitId":"jieqiboh"},"content":" h4, h5, h6 { margin-top: $spacing-unit }","lastModifiedDate":"2024-03-02"},{"lineNumber":181,"author":{"gitId":"jieqiboh"},"content":"","lastModifiedDate":"2024-03-02"},{"lineNumber":182,"author":{"gitId":"jieqiboh"},"content":" h2 {","lastModifiedDate":"2024-03-02"},{"lineNumber":183,"author":{"gitId":"jieqiboh"},"content":" @include relative-font-size(1.75);","lastModifiedDate":"2024-03-02"},{"lineNumber":184,"author":{"gitId":"jieqiboh"},"content":"","lastModifiedDate":"2024-03-02"},{"lineNumber":185,"author":{"gitId":"jieqiboh"},"content":" @media screen and (min-width: $on-large) {","lastModifiedDate":"2024-03-02"},{"lineNumber":186,"author":{"gitId":"jieqiboh"},"content":" @include relative-font-size(2);","lastModifiedDate":"2024-03-02"},{"lineNumber":187,"author":{"gitId":"jieqiboh"},"content":" }","lastModifiedDate":"2024-03-02"},{"lineNumber":188,"author":{"gitId":"jieqiboh"},"content":" }","lastModifiedDate":"2024-03-02"},{"lineNumber":189,"author":{"gitId":"jieqiboh"},"content":"","lastModifiedDate":"2024-03-02"},{"lineNumber":190,"author":{"gitId":"jieqiboh"},"content":" h3 {","lastModifiedDate":"2024-03-02"},{"lineNumber":191,"author":{"gitId":"jieqiboh"},"content":" @include relative-font-size(1.375);","lastModifiedDate":"2024-03-02"},{"lineNumber":192,"author":{"gitId":"jieqiboh"},"content":"","lastModifiedDate":"2024-03-02"},{"lineNumber":193,"author":{"gitId":"jieqiboh"},"content":" @media screen and (min-width: $on-large) {","lastModifiedDate":"2024-03-02"},{"lineNumber":194,"author":{"gitId":"jieqiboh"},"content":" @include relative-font-size(1.625);","lastModifiedDate":"2024-03-02"},{"lineNumber":195,"author":{"gitId":"jieqiboh"},"content":" }","lastModifiedDate":"2024-03-02"},{"lineNumber":196,"author":{"gitId":"jieqiboh"},"content":" }","lastModifiedDate":"2024-03-02"},{"lineNumber":197,"author":{"gitId":"jieqiboh"},"content":"","lastModifiedDate":"2024-03-02"},{"lineNumber":198,"author":{"gitId":"jieqiboh"},"content":" h4 {","lastModifiedDate":"2024-03-02"},{"lineNumber":199,"author":{"gitId":"jieqiboh"},"content":" @include relative-font-size(1.25);","lastModifiedDate":"2024-03-02"},{"lineNumber":200,"author":{"gitId":"jieqiboh"},"content":" }","lastModifiedDate":"2024-03-02"},{"lineNumber":201,"author":{"gitId":"jieqiboh"},"content":"","lastModifiedDate":"2024-03-02"},{"lineNumber":202,"author":{"gitId":"jieqiboh"},"content":" h5 {","lastModifiedDate":"2024-03-02"},{"lineNumber":203,"author":{"gitId":"jieqiboh"},"content":" @include relative-font-size(1.125);","lastModifiedDate":"2024-03-02"},{"lineNumber":204,"author":{"gitId":"jieqiboh"},"content":" }","lastModifiedDate":"2024-03-02"},{"lineNumber":205,"author":{"gitId":"jieqiboh"},"content":" h6 {","lastModifiedDate":"2024-03-02"},{"lineNumber":206,"author":{"gitId":"jieqiboh"},"content":" @include relative-font-size(1.0625);","lastModifiedDate":"2024-03-02"},{"lineNumber":207,"author":{"gitId":"jieqiboh"},"content":" }","lastModifiedDate":"2024-03-02"},{"lineNumber":208,"author":{"gitId":"jieqiboh"},"content":"}","lastModifiedDate":"2024-03-02"},{"lineNumber":209,"author":{"gitId":"jieqiboh"},"content":"","lastModifiedDate":"2024-03-02"},{"lineNumber":210,"author":{"gitId":"jieqiboh"},"content":"","lastModifiedDate":"2024-03-02"},{"lineNumber":211,"author":{"gitId":"jieqiboh"},"content":".social-media-list {","lastModifiedDate":"2024-03-02"},{"lineNumber":212,"author":{"gitId":"jieqiboh"},"content":" display: table;","lastModifiedDate":"2024-03-02"},{"lineNumber":213,"author":{"gitId":"jieqiboh"},"content":" margin: 0 auto;","lastModifiedDate":"2024-03-02"},{"lineNumber":214,"author":{"gitId":"jieqiboh"},"content":" li {","lastModifiedDate":"2024-03-02"},{"lineNumber":215,"author":{"gitId":"jieqiboh"},"content":" float: left;","lastModifiedDate":"2024-03-02"},{"lineNumber":216,"author":{"gitId":"jieqiboh"},"content":" margin: 5px 10px 5px 0;","lastModifiedDate":"2024-03-02"},{"lineNumber":217,"author":{"gitId":"jieqiboh"},"content":" \u0026:last-of-type { margin-right: 0 }","lastModifiedDate":"2024-03-02"},{"lineNumber":218,"author":{"gitId":"jieqiboh"},"content":" a {","lastModifiedDate":"2024-03-02"},{"lineNumber":219,"author":{"gitId":"jieqiboh"},"content":" display: block;","lastModifiedDate":"2024-03-02"},{"lineNumber":220,"author":{"gitId":"jieqiboh"},"content":" padding: $spacing-unit / 4;","lastModifiedDate":"2024-03-02"},{"lineNumber":221,"author":{"gitId":"jieqiboh"},"content":" border: 1px solid $brand-color-light;","lastModifiedDate":"2024-03-02"},{"lineNumber":222,"author":{"gitId":"jieqiboh"},"content":" \u0026:hover { border-color: darken($brand-color-light, 10%) }","lastModifiedDate":"2024-03-02"},{"lineNumber":223,"author":{"gitId":"jieqiboh"},"content":" }","lastModifiedDate":"2024-03-02"},{"lineNumber":224,"author":{"gitId":"jieqiboh"},"content":" }","lastModifiedDate":"2024-03-02"},{"lineNumber":225,"author":{"gitId":"jieqiboh"},"content":"}","lastModifiedDate":"2024-03-02"},{"lineNumber":226,"author":{"gitId":"jieqiboh"},"content":"","lastModifiedDate":"2024-03-02"},{"lineNumber":227,"author":{"gitId":"jieqiboh"},"content":"","lastModifiedDate":"2024-03-02"},{"lineNumber":228,"author":{"gitId":"jieqiboh"},"content":"","lastModifiedDate":"2024-03-02"},{"lineNumber":229,"author":{"gitId":"jieqiboh"},"content":"/**","lastModifiedDate":"2024-03-02"},{"lineNumber":230,"author":{"gitId":"jieqiboh"},"content":" * Pagination navbar","lastModifiedDate":"2024-03-02"},{"lineNumber":231,"author":{"gitId":"jieqiboh"},"content":" */","lastModifiedDate":"2024-03-02"},{"lineNumber":232,"author":{"gitId":"jieqiboh"},"content":".pagination {","lastModifiedDate":"2024-03-02"},{"lineNumber":233,"author":{"gitId":"jieqiboh"},"content":" margin-bottom: $spacing-unit;","lastModifiedDate":"2024-03-02"},{"lineNumber":234,"author":{"gitId":"jieqiboh"},"content":" @extend .social-media-list;","lastModifiedDate":"2024-03-02"},{"lineNumber":235,"author":{"gitId":"jieqiboh"},"content":" li {","lastModifiedDate":"2024-03-02"},{"lineNumber":236,"author":{"gitId":"jieqiboh"},"content":" a, div {","lastModifiedDate":"2024-03-02"},{"lineNumber":237,"author":{"gitId":"jieqiboh"},"content":" min-width: 41px;","lastModifiedDate":"2024-03-02"},{"lineNumber":238,"author":{"gitId":"jieqiboh"},"content":" text-align: center;","lastModifiedDate":"2024-03-02"},{"lineNumber":239,"author":{"gitId":"jieqiboh"},"content":" box-sizing: border-box;","lastModifiedDate":"2024-03-02"},{"lineNumber":240,"author":{"gitId":"jieqiboh"},"content":" }","lastModifiedDate":"2024-03-02"},{"lineNumber":241,"author":{"gitId":"jieqiboh"},"content":" div {","lastModifiedDate":"2024-03-02"},{"lineNumber":242,"author":{"gitId":"jieqiboh"},"content":" display: block;","lastModifiedDate":"2024-03-02"},{"lineNumber":243,"author":{"gitId":"jieqiboh"},"content":" padding: $spacing-unit / 4;","lastModifiedDate":"2024-03-02"},{"lineNumber":244,"author":{"gitId":"jieqiboh"},"content":" border: 1px solid transparent;","lastModifiedDate":"2024-03-02"},{"lineNumber":245,"author":{"gitId":"jieqiboh"},"content":"","lastModifiedDate":"2024-03-02"},{"lineNumber":246,"author":{"gitId":"jieqiboh"},"content":" \u0026.pager-edge {","lastModifiedDate":"2024-03-02"},{"lineNumber":247,"author":{"gitId":"jieqiboh"},"content":" color: darken($brand-color-light, 5%);","lastModifiedDate":"2024-03-02"},{"lineNumber":248,"author":{"gitId":"jieqiboh"},"content":" border: 1px dashed;","lastModifiedDate":"2024-03-02"},{"lineNumber":249,"author":{"gitId":"jieqiboh"},"content":" }","lastModifiedDate":"2024-03-02"},{"lineNumber":250,"author":{"gitId":"jieqiboh"},"content":" }","lastModifiedDate":"2024-03-02"},{"lineNumber":251,"author":{"gitId":"jieqiboh"},"content":" }","lastModifiedDate":"2024-03-02"},{"lineNumber":252,"author":{"gitId":"jieqiboh"},"content":"}","lastModifiedDate":"2024-03-02"},{"lineNumber":253,"author":{"gitId":"jieqiboh"},"content":"","lastModifiedDate":"2024-03-02"},{"lineNumber":254,"author":{"gitId":"jieqiboh"},"content":"","lastModifiedDate":"2024-03-02"},{"lineNumber":255,"author":{"gitId":"jieqiboh"},"content":"","lastModifiedDate":"2024-03-02"},{"lineNumber":256,"author":{"gitId":"jieqiboh"},"content":"/**","lastModifiedDate":"2024-03-02"},{"lineNumber":257,"author":{"gitId":"jieqiboh"},"content":" * Grid helpers","lastModifiedDate":"2024-03-02"},{"lineNumber":258,"author":{"gitId":"jieqiboh"},"content":" */","lastModifiedDate":"2024-03-02"},{"lineNumber":259,"author":{"gitId":"jieqiboh"},"content":"@media screen and (min-width: $on-large) {","lastModifiedDate":"2024-03-02"},{"lineNumber":260,"author":{"gitId":"jieqiboh"},"content":" .one-half {","lastModifiedDate":"2024-03-02"},{"lineNumber":261,"author":{"gitId":"jieqiboh"},"content":" width: calc(50% - (#{$spacing-unit} / 2));","lastModifiedDate":"2024-03-02"},{"lineNumber":262,"author":{"gitId":"jieqiboh"},"content":" }","lastModifiedDate":"2024-03-02"},{"lineNumber":263,"author":{"gitId":"jieqiboh"},"content":"}","lastModifiedDate":"2024-03-02"}],"authorContributionMap":{"jieqiboh":263}},{"path":"docs/_sass/minima/custom-mixins.scss","fileType":"other","lines":[{"lineNumber":1,"author":{"gitId":"jieqiboh"},"content":"@mixin alert-variant($background, $border, $color) {","lastModifiedDate":"2024-03-02"},{"lineNumber":2,"author":{"gitId":"jieqiboh"},"content":" color: $color;","lastModifiedDate":"2024-03-02"},{"lineNumber":3,"author":{"gitId":"jieqiboh"},"content":" @include gradient-bg($background);","lastModifiedDate":"2024-03-02"},{"lineNumber":4,"author":{"gitId":"jieqiboh"},"content":" border-color: $border;","lastModifiedDate":"2024-03-02"},{"lineNumber":5,"author":{"gitId":"jieqiboh"},"content":"","lastModifiedDate":"2024-03-02"},{"lineNumber":6,"author":{"gitId":"jieqiboh"},"content":" .alert-link {","lastModifiedDate":"2024-03-02"},{"lineNumber":7,"author":{"gitId":"jieqiboh"},"content":" color: darken($color, 10%);","lastModifiedDate":"2024-03-02"},{"lineNumber":8,"author":{"gitId":"jieqiboh"},"content":" }","lastModifiedDate":"2024-03-02"},{"lineNumber":9,"author":{"gitId":"jieqiboh"},"content":"}","lastModifiedDate":"2024-03-02"},{"lineNumber":10,"author":{"gitId":"jieqiboh"},"content":"","lastModifiedDate":"2024-03-02"},{"lineNumber":11,"author":{"gitId":"jieqiboh"},"content":"@mixin gradient-bg($color, $foreground: null) {","lastModifiedDate":"2024-03-02"},{"lineNumber":12,"author":{"gitId":"jieqiboh"},"content":" @if $enable-gradients {","lastModifiedDate":"2024-03-02"},{"lineNumber":13,"author":{"gitId":"jieqiboh"},"content":" @if $foreground {","lastModifiedDate":"2024-03-02"},{"lineNumber":14,"author":{"gitId":"jieqiboh"},"content":" background-image: $foreground, linear-gradient(180deg, mix($body-bg, $color, 15%), $color);","lastModifiedDate":"2024-03-02"},{"lineNumber":15,"author":{"gitId":"jieqiboh"},"content":" } @else {","lastModifiedDate":"2024-03-02"},{"lineNumber":16,"author":{"gitId":"jieqiboh"},"content":" background-image: linear-gradient(180deg, mix($body-bg, $color, 15%), $color);","lastModifiedDate":"2024-03-02"},{"lineNumber":17,"author":{"gitId":"jieqiboh"},"content":" }","lastModifiedDate":"2024-03-02"},{"lineNumber":18,"author":{"gitId":"jieqiboh"},"content":" } @else {","lastModifiedDate":"2024-03-02"},{"lineNumber":19,"author":{"gitId":"jieqiboh"},"content":" background-color: $color;","lastModifiedDate":"2024-03-02"},{"lineNumber":20,"author":{"gitId":"jieqiboh"},"content":" }","lastModifiedDate":"2024-03-02"},{"lineNumber":21,"author":{"gitId":"jieqiboh"},"content":"}","lastModifiedDate":"2024-03-02"}],"authorContributionMap":{"jieqiboh":21}},{"path":"docs/_sass/minima/custom-styles.scss","fileType":"other","lines":[{"lineNumber":1,"author":{"gitId":"jieqiboh"},"content":"// Placeholder to allow defining custom styles that override everything else.","lastModifiedDate":"2024-03-02"},{"lineNumber":2,"author":{"gitId":"jieqiboh"},"content":"// (Use `_sass/minima/custom-variables.scss` to override variable defaults)","lastModifiedDate":"2024-03-02"},{"lineNumber":3,"author":{"gitId":"jieqiboh"},"content":"h2, h3, h4, h5, h6 {","lastModifiedDate":"2024-03-02"},{"lineNumber":4,"author":{"gitId":"jieqiboh"},"content":" color: #e46c0a;","lastModifiedDate":"2024-03-02"},{"lineNumber":5,"author":{"gitId":"jieqiboh"},"content":"}","lastModifiedDate":"2024-03-02"},{"lineNumber":6,"author":{"gitId":"jieqiboh"},"content":"","lastModifiedDate":"2024-03-02"},{"lineNumber":7,"author":{"gitId":"jieqiboh"},"content":"// Bootstrap style alerts","lastModifiedDate":"2024-03-02"},{"lineNumber":8,"author":{"gitId":"jieqiboh"},"content":".alert {","lastModifiedDate":"2024-03-02"},{"lineNumber":9,"author":{"gitId":"jieqiboh"},"content":" position: relative;","lastModifiedDate":"2024-03-02"},{"lineNumber":10,"author":{"gitId":"jieqiboh"},"content":" padding: $alert-padding-y $alert-padding-x;","lastModifiedDate":"2024-03-02"},{"lineNumber":11,"author":{"gitId":"jieqiboh"},"content":" margin-bottom: $alert-margin-bottom;","lastModifiedDate":"2024-03-02"},{"lineNumber":12,"author":{"gitId":"jieqiboh"},"content":" border: $alert-border-width solid transparent;","lastModifiedDate":"2024-03-02"},{"lineNumber":13,"author":{"gitId":"jieqiboh"},"content":" border-radius : $alert-border-radius;","lastModifiedDate":"2024-03-02"},{"lineNumber":14,"author":{"gitId":"jieqiboh"},"content":"}","lastModifiedDate":"2024-03-02"},{"lineNumber":15,"author":{"gitId":"jieqiboh"},"content":"","lastModifiedDate":"2024-03-02"},{"lineNumber":16,"author":{"gitId":"jieqiboh"},"content":"// Headings for larger alerts","lastModifiedDate":"2024-03-02"},{"lineNumber":17,"author":{"gitId":"jieqiboh"},"content":".alert-heading {","lastModifiedDate":"2024-03-02"},{"lineNumber":18,"author":{"gitId":"jieqiboh"},"content":" // Specified to prevent conflicts of changing $headings-color","lastModifiedDate":"2024-03-02"},{"lineNumber":19,"author":{"gitId":"jieqiboh"},"content":" color: inherit;","lastModifiedDate":"2024-03-02"},{"lineNumber":20,"author":{"gitId":"jieqiboh"},"content":"}","lastModifiedDate":"2024-03-02"},{"lineNumber":21,"author":{"gitId":"jieqiboh"},"content":"","lastModifiedDate":"2024-03-02"},{"lineNumber":22,"author":{"gitId":"jieqiboh"},"content":"// Provide class for links that match alerts","lastModifiedDate":"2024-03-02"},{"lineNumber":23,"author":{"gitId":"jieqiboh"},"content":".alert-link {","lastModifiedDate":"2024-03-02"},{"lineNumber":24,"author":{"gitId":"jieqiboh"},"content":" font-weight: $alert-link-font-weight;","lastModifiedDate":"2024-03-02"},{"lineNumber":25,"author":{"gitId":"jieqiboh"},"content":"}","lastModifiedDate":"2024-03-02"},{"lineNumber":26,"author":{"gitId":"jieqiboh"},"content":"","lastModifiedDate":"2024-03-02"},{"lineNumber":27,"author":{"gitId":"jieqiboh"},"content":"// Generate contextual modifier classes for colorizing the alert.","lastModifiedDate":"2024-03-02"},{"lineNumber":28,"author":{"gitId":"jieqiboh"},"content":"","lastModifiedDate":"2024-03-02"},{"lineNumber":29,"author":{"gitId":"jieqiboh"},"content":"@each $color, $value in $theme-colors {","lastModifiedDate":"2024-03-02"},{"lineNumber":30,"author":{"gitId":"jieqiboh"},"content":" .alert-#{$color} {","lastModifiedDate":"2024-03-02"},{"lineNumber":31,"author":{"gitId":"jieqiboh"},"content":" @include alert-variant(color-level($value, $alert-bg-level), color-level($value, $alert-border-level), color-level($value, $alert-color-level));","lastModifiedDate":"2024-03-02"},{"lineNumber":32,"author":{"gitId":"jieqiboh"},"content":" }","lastModifiedDate":"2024-03-02"},{"lineNumber":33,"author":{"gitId":"jieqiboh"},"content":"}","lastModifiedDate":"2024-03-02"},{"lineNumber":34,"author":{"gitId":"jieqiboh"},"content":"","lastModifiedDate":"2024-03-02"}],"authorContributionMap":{"jieqiboh":34}},{"path":"docs/_sass/minima/custom-variables.scss","fileType":"other","lines":[{"lineNumber":1,"author":{"gitId":"jieqiboh"},"content":"// Placeholder to allow overriding predefined variables smoothly.","lastModifiedDate":"2024-03-02"},{"lineNumber":2,"author":{"gitId":"jieqiboh"},"content":"","lastModifiedDate":"2024-03-02"},{"lineNumber":3,"author":{"gitId":"jieqiboh"},"content":"//Bootstrap\u0027s default","lastModifiedDate":"2024-03-02"},{"lineNumber":4,"author":{"gitId":"jieqiboh"},"content":"$white: #fff !default;","lastModifiedDate":"2024-03-02"},{"lineNumber":5,"author":{"gitId":"jieqiboh"},"content":"$gray-100: #f8f9fa !default;","lastModifiedDate":"2024-03-02"},{"lineNumber":6,"author":{"gitId":"jieqiboh"},"content":"$gray-200: #e9ecef !default;","lastModifiedDate":"2024-03-02"},{"lineNumber":7,"author":{"gitId":"jieqiboh"},"content":"$gray-300: #dee2e6 !default;","lastModifiedDate":"2024-03-02"},{"lineNumber":8,"author":{"gitId":"jieqiboh"},"content":"$gray-400: #ced4da !default;","lastModifiedDate":"2024-03-02"},{"lineNumber":9,"author":{"gitId":"jieqiboh"},"content":"$gray-500: #adb5bd !default;","lastModifiedDate":"2024-03-02"},{"lineNumber":10,"author":{"gitId":"jieqiboh"},"content":"$gray-600: #6c757d !default;","lastModifiedDate":"2024-03-02"},{"lineNumber":11,"author":{"gitId":"jieqiboh"},"content":"$gray-700: #495057 !default;","lastModifiedDate":"2024-03-02"},{"lineNumber":12,"author":{"gitId":"jieqiboh"},"content":"$gray-800: #343a40 !default;","lastModifiedDate":"2024-03-02"},{"lineNumber":13,"author":{"gitId":"jieqiboh"},"content":"$gray-900: #212529 !default;","lastModifiedDate":"2024-03-02"},{"lineNumber":14,"author":{"gitId":"jieqiboh"},"content":"$black: #000 !default;","lastModifiedDate":"2024-03-02"},{"lineNumber":15,"author":{"gitId":"jieqiboh"},"content":"$blue: #0d6efd !default;","lastModifiedDate":"2024-03-02"},{"lineNumber":16,"author":{"gitId":"jieqiboh"},"content":"$indigo: #6610f2 !default;","lastModifiedDate":"2024-03-02"},{"lineNumber":17,"author":{"gitId":"jieqiboh"},"content":"$purple: #6f42c1 !default;","lastModifiedDate":"2024-03-02"},{"lineNumber":18,"author":{"gitId":"jieqiboh"},"content":"$pink: #d63384 !default;","lastModifiedDate":"2024-03-02"},{"lineNumber":19,"author":{"gitId":"jieqiboh"},"content":"$red: #dc3545 !default;","lastModifiedDate":"2024-03-02"},{"lineNumber":20,"author":{"gitId":"jieqiboh"},"content":"$orange: #fd7e14 !default;","lastModifiedDate":"2024-03-02"},{"lineNumber":21,"author":{"gitId":"jieqiboh"},"content":"$yellow: #ffc107 !default;","lastModifiedDate":"2024-03-02"},{"lineNumber":22,"author":{"gitId":"jieqiboh"},"content":"$green: #28a745 !default;","lastModifiedDate":"2024-03-02"},{"lineNumber":23,"author":{"gitId":"jieqiboh"},"content":"$teal: #20c997 !default;","lastModifiedDate":"2024-03-02"},{"lineNumber":24,"author":{"gitId":"jieqiboh"},"content":"$cyan: #17a2b8 !default;","lastModifiedDate":"2024-03-02"},{"lineNumber":25,"author":{"gitId":"jieqiboh"},"content":"","lastModifiedDate":"2024-03-02"},{"lineNumber":26,"author":{"gitId":"jieqiboh"},"content":"$primary: $blue !default;","lastModifiedDate":"2024-03-02"},{"lineNumber":27,"author":{"gitId":"jieqiboh"},"content":"$secondary: $gray-600 !default;","lastModifiedDate":"2024-03-02"},{"lineNumber":28,"author":{"gitId":"jieqiboh"},"content":"$success: $green !default;","lastModifiedDate":"2024-03-02"},{"lineNumber":29,"author":{"gitId":"jieqiboh"},"content":"$info: $cyan !default;","lastModifiedDate":"2024-03-02"},{"lineNumber":30,"author":{"gitId":"jieqiboh"},"content":"$warning: $yellow !default;","lastModifiedDate":"2024-03-02"},{"lineNumber":31,"author":{"gitId":"jieqiboh"},"content":"$danger: $red !default;","lastModifiedDate":"2024-03-02"},{"lineNumber":32,"author":{"gitId":"jieqiboh"},"content":"$light: $gray-100 !default;","lastModifiedDate":"2024-03-02"},{"lineNumber":33,"author":{"gitId":"jieqiboh"},"content":"$dark: $gray-800 !default;","lastModifiedDate":"2024-03-02"},{"lineNumber":34,"author":{"gitId":"jieqiboh"},"content":"","lastModifiedDate":"2024-03-02"},{"lineNumber":35,"author":{"gitId":"jieqiboh"},"content":"$theme-colors: (","lastModifiedDate":"2024-03-02"},{"lineNumber":36,"author":{"gitId":"jieqiboh"},"content":" \"primary\": $primary,","lastModifiedDate":"2024-03-02"},{"lineNumber":37,"author":{"gitId":"jieqiboh"},"content":" \"secondary\": $secondary,","lastModifiedDate":"2024-03-02"},{"lineNumber":38,"author":{"gitId":"jieqiboh"},"content":" \"success\": $success,","lastModifiedDate":"2024-03-02"},{"lineNumber":39,"author":{"gitId":"jieqiboh"},"content":" \"info\": $info,","lastModifiedDate":"2024-03-02"},{"lineNumber":40,"author":{"gitId":"jieqiboh"},"content":" \"warning\": $warning,","lastModifiedDate":"2024-03-02"},{"lineNumber":41,"author":{"gitId":"jieqiboh"},"content":" \"danger\": $danger,","lastModifiedDate":"2024-03-02"},{"lineNumber":42,"author":{"gitId":"jieqiboh"},"content":" \"light\": $light,","lastModifiedDate":"2024-03-02"},{"lineNumber":43,"author":{"gitId":"jieqiboh"},"content":" \"dark\": $dark","lastModifiedDate":"2024-03-02"},{"lineNumber":44,"author":{"gitId":"jieqiboh"},"content":") !default;","lastModifiedDate":"2024-03-02"},{"lineNumber":45,"author":{"gitId":"jieqiboh"},"content":"","lastModifiedDate":"2024-03-02"},{"lineNumber":46,"author":{"gitId":"jieqiboh"},"content":"$theme-color-interval: 8% !default;","lastModifiedDate":"2024-03-02"},{"lineNumber":47,"author":{"gitId":"jieqiboh"},"content":"","lastModifiedDate":"2024-03-02"},{"lineNumber":48,"author":{"gitId":"jieqiboh"},"content":"$body-bg: $white !default;","lastModifiedDate":"2024-03-02"},{"lineNumber":49,"author":{"gitId":"jieqiboh"},"content":"$body-color: $gray-900 !default;","lastModifiedDate":"2024-03-02"},{"lineNumber":50,"author":{"gitId":"jieqiboh"},"content":"$body-text-align: null !default;","lastModifiedDate":"2024-03-02"},{"lineNumber":51,"author":{"gitId":"jieqiboh"},"content":"","lastModifiedDate":"2024-03-02"},{"lineNumber":52,"author":{"gitId":"jieqiboh"},"content":"$enable-gradients: true;","lastModifiedDate":"2024-03-02"},{"lineNumber":53,"author":{"gitId":"jieqiboh"},"content":"","lastModifiedDate":"2024-03-02"},{"lineNumber":54,"author":{"gitId":"jieqiboh"},"content":"// Define alert colors, border radius, and padding.","lastModifiedDate":"2024-03-02"},{"lineNumber":55,"author":{"gitId":"jieqiboh"},"content":"$border-radius: .25rem !default;","lastModifiedDate":"2024-03-02"},{"lineNumber":56,"author":{"gitId":"jieqiboh"},"content":"$border-width: 1px !default;","lastModifiedDate":"2024-03-02"},{"lineNumber":57,"author":{"gitId":"jieqiboh"},"content":"$font-weight-bold: 700 !default;","lastModifiedDate":"2024-03-02"},{"lineNumber":58,"author":{"gitId":"jieqiboh"},"content":"","lastModifiedDate":"2024-03-02"},{"lineNumber":59,"author":{"gitId":"jieqiboh"},"content":"$alert-padding-y: .75rem !default;","lastModifiedDate":"2024-03-02"},{"lineNumber":60,"author":{"gitId":"jieqiboh"},"content":"$alert-padding-x: 1.25rem !default;","lastModifiedDate":"2024-03-02"},{"lineNumber":61,"author":{"gitId":"jieqiboh"},"content":"$alert-margin-bottom: 1rem !default;","lastModifiedDate":"2024-03-02"},{"lineNumber":62,"author":{"gitId":"jieqiboh"},"content":"$alert-border-radius: $border-radius !default;","lastModifiedDate":"2024-03-02"},{"lineNumber":63,"author":{"gitId":"jieqiboh"},"content":"$alert-link-font-weight: $font-weight-bold !default;","lastModifiedDate":"2024-03-02"},{"lineNumber":64,"author":{"gitId":"jieqiboh"},"content":"$alert-border-width: $border-width !default;","lastModifiedDate":"2024-03-02"},{"lineNumber":65,"author":{"gitId":"jieqiboh"},"content":"","lastModifiedDate":"2024-03-02"},{"lineNumber":66,"author":{"gitId":"jieqiboh"},"content":"$alert-bg-level: -10 !default;","lastModifiedDate":"2024-03-02"},{"lineNumber":67,"author":{"gitId":"jieqiboh"},"content":"$alert-border-level: -9 !default;","lastModifiedDate":"2024-03-02"},{"lineNumber":68,"author":{"gitId":"jieqiboh"},"content":"$alert-color-level: 6 !default;","lastModifiedDate":"2024-03-02"},{"lineNumber":69,"author":{"gitId":"jieqiboh"},"content":"","lastModifiedDate":"2024-03-02"},{"lineNumber":70,"author":{"gitId":"jieqiboh"},"content":"// Request a color level","lastModifiedDate":"2024-03-02"},{"lineNumber":71,"author":{"gitId":"jieqiboh"},"content":"// scss-docs-start color-level","lastModifiedDate":"2024-03-02"},{"lineNumber":72,"author":{"gitId":"jieqiboh"},"content":"@function color-level($color: $primary, $level: 0) {","lastModifiedDate":"2024-03-02"},{"lineNumber":73,"author":{"gitId":"jieqiboh"},"content":" $color-base: if($level \u003e 0, $black, $white);","lastModifiedDate":"2024-03-02"},{"lineNumber":74,"author":{"gitId":"jieqiboh"},"content":" $level: abs($level);","lastModifiedDate":"2024-03-02"},{"lineNumber":75,"author":{"gitId":"jieqiboh"},"content":" @return mix($color-base, $color, $level * $theme-color-interval);","lastModifiedDate":"2024-03-02"},{"lineNumber":76,"author":{"gitId":"jieqiboh"},"content":"}","lastModifiedDate":"2024-03-02"}],"authorContributionMap":{"jieqiboh":76}},{"path":"docs/_sass/minima/initialize.scss","fileType":"other","lines":[{"lineNumber":1,"author":{"gitId":"jieqiboh"},"content":"@charset \"utf-8\";","lastModifiedDate":"2024-03-02"},{"lineNumber":2,"author":{"gitId":"jieqiboh"},"content":"","lastModifiedDate":"2024-03-02"},{"lineNumber":3,"author":{"gitId":"jieqiboh"},"content":"// Define defaults for each variable.","lastModifiedDate":"2024-03-02"},{"lineNumber":4,"author":{"gitId":"jieqiboh"},"content":"","lastModifiedDate":"2024-03-02"},{"lineNumber":5,"author":{"gitId":"jieqiboh"},"content":"$base-font-family: -apple-system, BlinkMacSystemFont, \"Segoe UI\", \"Segoe UI Symbol\", \"Segoe UI Emoji\", \"Apple Color Emoji\", Roboto, Helvetica, Arial, sans-serif !default;","lastModifiedDate":"2024-03-02"},{"lineNumber":6,"author":{"gitId":"jieqiboh"},"content":"$code-font-family: \"Menlo\", \"Inconsolata\", \"Consolas\", \"Roboto Mono\", \"Ubuntu Mono\", \"Liberation Mono\", \"Courier New\", monospace;","lastModifiedDate":"2024-03-02"},{"lineNumber":7,"author":{"gitId":"jieqiboh"},"content":"$base-font-size: 16px !default;","lastModifiedDate":"2024-03-02"},{"lineNumber":8,"author":{"gitId":"jieqiboh"},"content":"$base-font-weight: 400 !default;","lastModifiedDate":"2024-03-02"},{"lineNumber":9,"author":{"gitId":"jieqiboh"},"content":"$small-font-size: $base-font-size * 0.875 !default;","lastModifiedDate":"2024-03-02"},{"lineNumber":10,"author":{"gitId":"jieqiboh"},"content":"$base-line-height: 1.5 !default;","lastModifiedDate":"2024-03-02"},{"lineNumber":11,"author":{"gitId":"jieqiboh"},"content":"","lastModifiedDate":"2024-03-02"},{"lineNumber":12,"author":{"gitId":"jieqiboh"},"content":"$spacing-unit: 30px !default;","lastModifiedDate":"2024-03-02"},{"lineNumber":13,"author":{"gitId":"jieqiboh"},"content":"","lastModifiedDate":"2024-03-02"},{"lineNumber":14,"author":{"gitId":"jieqiboh"},"content":"$table-text-align: left !default;","lastModifiedDate":"2024-03-02"},{"lineNumber":15,"author":{"gitId":"jieqiboh"},"content":"","lastModifiedDate":"2024-03-02"},{"lineNumber":16,"author":{"gitId":"jieqiboh"},"content":"// Width of the content area","lastModifiedDate":"2024-03-02"},{"lineNumber":17,"author":{"gitId":"jieqiboh"},"content":"$content-width: 800px !default;","lastModifiedDate":"2024-03-02"},{"lineNumber":18,"author":{"gitId":"jieqiboh"},"content":"","lastModifiedDate":"2024-03-02"},{"lineNumber":19,"author":{"gitId":"jieqiboh"},"content":"$on-palm: 600px !default;","lastModifiedDate":"2024-03-02"},{"lineNumber":20,"author":{"gitId":"jieqiboh"},"content":"$on-laptop: 800px !default;","lastModifiedDate":"2024-03-02"},{"lineNumber":21,"author":{"gitId":"jieqiboh"},"content":"","lastModifiedDate":"2024-03-02"},{"lineNumber":22,"author":{"gitId":"jieqiboh"},"content":"$on-medium: $on-palm !default;","lastModifiedDate":"2024-03-02"},{"lineNumber":23,"author":{"gitId":"jieqiboh"},"content":"$on-large: $on-laptop !default;","lastModifiedDate":"2024-03-02"},{"lineNumber":24,"author":{"gitId":"jieqiboh"},"content":"","lastModifiedDate":"2024-03-02"},{"lineNumber":25,"author":{"gitId":"jieqiboh"},"content":"// Use media queries like this:","lastModifiedDate":"2024-03-02"},{"lineNumber":26,"author":{"gitId":"jieqiboh"},"content":"// @include media-query($on-palm) {","lastModifiedDate":"2024-03-02"},{"lineNumber":27,"author":{"gitId":"jieqiboh"},"content":"// .wrapper {","lastModifiedDate":"2024-03-02"},{"lineNumber":28,"author":{"gitId":"jieqiboh"},"content":"// padding-right: $spacing-unit / 2;","lastModifiedDate":"2024-03-02"},{"lineNumber":29,"author":{"gitId":"jieqiboh"},"content":"// padding-left: $spacing-unit / 2;","lastModifiedDate":"2024-03-02"},{"lineNumber":30,"author":{"gitId":"jieqiboh"},"content":"// }","lastModifiedDate":"2024-03-02"},{"lineNumber":31,"author":{"gitId":"jieqiboh"},"content":"// }","lastModifiedDate":"2024-03-02"},{"lineNumber":32,"author":{"gitId":"jieqiboh"},"content":"// Notice the following mixin uses max-width, in a deprecated, desktop-first","lastModifiedDate":"2024-03-02"},{"lineNumber":33,"author":{"gitId":"jieqiboh"},"content":"// approach, whereas media queries used elsewhere now use min-width.","lastModifiedDate":"2024-03-02"},{"lineNumber":34,"author":{"gitId":"jieqiboh"},"content":"@mixin media-query($device) {","lastModifiedDate":"2024-03-02"},{"lineNumber":35,"author":{"gitId":"jieqiboh"},"content":" @media screen and (max-width: $device) {","lastModifiedDate":"2024-03-02"},{"lineNumber":36,"author":{"gitId":"jieqiboh"},"content":" @content;","lastModifiedDate":"2024-03-02"},{"lineNumber":37,"author":{"gitId":"jieqiboh"},"content":" }","lastModifiedDate":"2024-03-02"},{"lineNumber":38,"author":{"gitId":"jieqiboh"},"content":"}","lastModifiedDate":"2024-03-02"},{"lineNumber":39,"author":{"gitId":"jieqiboh"},"content":"","lastModifiedDate":"2024-03-02"},{"lineNumber":40,"author":{"gitId":"jieqiboh"},"content":"@mixin relative-font-size($ratio) {","lastModifiedDate":"2024-03-02"},{"lineNumber":41,"author":{"gitId":"jieqiboh"},"content":" font-size: #{$ratio}rem;","lastModifiedDate":"2024-03-02"},{"lineNumber":42,"author":{"gitId":"jieqiboh"},"content":"}","lastModifiedDate":"2024-03-02"},{"lineNumber":43,"author":{"gitId":"jieqiboh"},"content":"","lastModifiedDate":"2024-03-02"},{"lineNumber":44,"author":{"gitId":"jieqiboh"},"content":"// Import pre-styling-overrides hook and style-partials.","lastModifiedDate":"2024-03-02"},{"lineNumber":45,"author":{"gitId":"jieqiboh"},"content":"@import","lastModifiedDate":"2024-03-02"},{"lineNumber":46,"author":{"gitId":"jieqiboh"},"content":" \"minima/custom-variables\", // Hook to override predefined variables.","lastModifiedDate":"2024-03-02"},{"lineNumber":47,"author":{"gitId":"jieqiboh"},"content":" \"minima/custom-mixins\", // Hook to add custom mixins.","lastModifiedDate":"2024-03-02"},{"lineNumber":48,"author":{"gitId":"jieqiboh"},"content":" \"minima/base\", // Defines element resets.","lastModifiedDate":"2024-03-02"},{"lineNumber":49,"author":{"gitId":"jieqiboh"},"content":" \"minima/layout\", // Defines structure and style based on CSS selectors.","lastModifiedDate":"2024-03-02"},{"lineNumber":50,"author":{"gitId":"jieqiboh"},"content":" \"minima/custom-styles\" // Hook to override existing styles.","lastModifiedDate":"2024-03-02"},{"lineNumber":51,"author":{"gitId":"jieqiboh"},"content":";","lastModifiedDate":"2024-03-02"}],"authorContributionMap":{"jieqiboh":51}},{"path":"docs/_sass/minima/skins/classic.scss","fileType":"other","lines":[{"lineNumber":1,"author":{"gitId":"jieqiboh"},"content":"@charset \"utf-8\";","lastModifiedDate":"2024-03-02"},{"lineNumber":2,"author":{"gitId":"jieqiboh"},"content":"","lastModifiedDate":"2024-03-02"},{"lineNumber":3,"author":{"gitId":"jieqiboh"},"content":"$brand-color: #828282 !default;","lastModifiedDate":"2024-03-02"},{"lineNumber":4,"author":{"gitId":"jieqiboh"},"content":"$brand-color-light: lighten($brand-color, 40%) !default;","lastModifiedDate":"2024-03-02"},{"lineNumber":5,"author":{"gitId":"jieqiboh"},"content":"$brand-color-dark: darken($brand-color, 25%) !default;","lastModifiedDate":"2024-03-02"},{"lineNumber":6,"author":{"gitId":"jieqiboh"},"content":"","lastModifiedDate":"2024-03-02"},{"lineNumber":7,"author":{"gitId":"jieqiboh"},"content":"$text-color: #111 !default;","lastModifiedDate":"2024-03-02"},{"lineNumber":8,"author":{"gitId":"jieqiboh"},"content":"$background-color: #fdfdfd !default;","lastModifiedDate":"2024-03-02"},{"lineNumber":9,"author":{"gitId":"jieqiboh"},"content":"$code-background-color: #eef !default;","lastModifiedDate":"2024-03-02"},{"lineNumber":10,"author":{"gitId":"jieqiboh"},"content":"","lastModifiedDate":"2024-03-02"},{"lineNumber":11,"author":{"gitId":"jieqiboh"},"content":"$link-base-color: #2a7ae2 !default;","lastModifiedDate":"2024-03-02"},{"lineNumber":12,"author":{"gitId":"jieqiboh"},"content":"$link-visited-color: darken($link-base-color, 15%) !default;","lastModifiedDate":"2024-03-02"},{"lineNumber":13,"author":{"gitId":"jieqiboh"},"content":"","lastModifiedDate":"2024-03-02"},{"lineNumber":14,"author":{"gitId":"jieqiboh"},"content":"$table-text-color: lighten($text-color, 18%) !default;","lastModifiedDate":"2024-03-02"},{"lineNumber":15,"author":{"gitId":"jieqiboh"},"content":"$table-zebra-color: lighten($brand-color, 46%) !default;","lastModifiedDate":"2024-03-02"},{"lineNumber":16,"author":{"gitId":"jieqiboh"},"content":"$table-header-bg-color: lighten($brand-color, 43%) !default;","lastModifiedDate":"2024-03-02"},{"lineNumber":17,"author":{"gitId":"jieqiboh"},"content":"$table-header-border: lighten($brand-color, 36%) !default;","lastModifiedDate":"2024-03-02"},{"lineNumber":18,"author":{"gitId":"jieqiboh"},"content":"$table-border-color: $brand-color-light !default;","lastModifiedDate":"2024-03-02"},{"lineNumber":19,"author":{"gitId":"jieqiboh"},"content":"","lastModifiedDate":"2024-03-02"},{"lineNumber":20,"author":{"gitId":"jieqiboh"},"content":"","lastModifiedDate":"2024-03-02"},{"lineNumber":21,"author":{"gitId":"jieqiboh"},"content":"// Syntax highlighting styles should be adjusted appropriately for every \"skin\"","lastModifiedDate":"2024-03-02"},{"lineNumber":22,"author":{"gitId":"jieqiboh"},"content":"// ----------------------------------------------------------------------------","lastModifiedDate":"2024-03-02"},{"lineNumber":23,"author":{"gitId":"jieqiboh"},"content":"","lastModifiedDate":"2024-03-02"},{"lineNumber":24,"author":{"gitId":"jieqiboh"},"content":".highlight {","lastModifiedDate":"2024-03-02"},{"lineNumber":25,"author":{"gitId":"jieqiboh"},"content":" .c { color: #998; font-style: italic } // Comment","lastModifiedDate":"2024-03-02"},{"lineNumber":26,"author":{"gitId":"jieqiboh"},"content":" .err { color: #a61717; background-color: #e3d2d2 } // Error","lastModifiedDate":"2024-03-02"},{"lineNumber":27,"author":{"gitId":"jieqiboh"},"content":" .k { font-weight: bold } // Keyword","lastModifiedDate":"2024-03-02"},{"lineNumber":28,"author":{"gitId":"jieqiboh"},"content":" .o { font-weight: bold } // Operator","lastModifiedDate":"2024-03-02"},{"lineNumber":29,"author":{"gitId":"jieqiboh"},"content":" .cm { color: #998; font-style: italic } // Comment.Multiline","lastModifiedDate":"2024-03-02"},{"lineNumber":30,"author":{"gitId":"jieqiboh"},"content":" .cp { color: #999; font-weight: bold } // Comment.Preproc","lastModifiedDate":"2024-03-02"},{"lineNumber":31,"author":{"gitId":"jieqiboh"},"content":" .c1 { color: #998; font-style: italic } // Comment.Single","lastModifiedDate":"2024-03-02"},{"lineNumber":32,"author":{"gitId":"jieqiboh"},"content":" .cs { color: #999; font-weight: bold; font-style: italic } // Comment.Special","lastModifiedDate":"2024-03-02"},{"lineNumber":33,"author":{"gitId":"jieqiboh"},"content":" .gd { color: #000; background-color: #fdd } // Generic.Deleted","lastModifiedDate":"2024-03-02"},{"lineNumber":34,"author":{"gitId":"jieqiboh"},"content":" .gd .x { color: #000; background-color: #faa } // Generic.Deleted.Specific","lastModifiedDate":"2024-03-02"},{"lineNumber":35,"author":{"gitId":"jieqiboh"},"content":" .ge { font-style: italic } // Generic.Emph","lastModifiedDate":"2024-03-02"},{"lineNumber":36,"author":{"gitId":"jieqiboh"},"content":" .gr { color: #a00 } // Generic.Error","lastModifiedDate":"2024-03-02"},{"lineNumber":37,"author":{"gitId":"jieqiboh"},"content":" .gh { color: #999 } // Generic.Heading","lastModifiedDate":"2024-03-02"},{"lineNumber":38,"author":{"gitId":"jieqiboh"},"content":" .gi { color: #000; background-color: #dfd } // Generic.Inserted","lastModifiedDate":"2024-03-02"},{"lineNumber":39,"author":{"gitId":"jieqiboh"},"content":" .gi .x { color: #000; background-color: #afa } // Generic.Inserted.Specific","lastModifiedDate":"2024-03-02"},{"lineNumber":40,"author":{"gitId":"jieqiboh"},"content":" .go { color: #888 } // Generic.Output","lastModifiedDate":"2024-03-02"},{"lineNumber":41,"author":{"gitId":"jieqiboh"},"content":" .gp { color: #555 } // Generic.Prompt","lastModifiedDate":"2024-03-02"},{"lineNumber":42,"author":{"gitId":"jieqiboh"},"content":" .gs { font-weight: bold } // Generic.Strong","lastModifiedDate":"2024-03-02"},{"lineNumber":43,"author":{"gitId":"jieqiboh"},"content":" .gu { color: #aaa } // Generic.Subheading","lastModifiedDate":"2024-03-02"},{"lineNumber":44,"author":{"gitId":"jieqiboh"},"content":" .gt { color: #a00 } // Generic.Traceback","lastModifiedDate":"2024-03-02"},{"lineNumber":45,"author":{"gitId":"jieqiboh"},"content":" .kc { font-weight: bold } // Keyword.Constant","lastModifiedDate":"2024-03-02"},{"lineNumber":46,"author":{"gitId":"jieqiboh"},"content":" .kd { font-weight: bold } // Keyword.Declaration","lastModifiedDate":"2024-03-02"},{"lineNumber":47,"author":{"gitId":"jieqiboh"},"content":" .kp { font-weight: bold } // Keyword.Pseudo","lastModifiedDate":"2024-03-02"},{"lineNumber":48,"author":{"gitId":"jieqiboh"},"content":" .kr { font-weight: bold } // Keyword.Reserved","lastModifiedDate":"2024-03-02"},{"lineNumber":49,"author":{"gitId":"jieqiboh"},"content":" .kt { color: #458; font-weight: bold } // Keyword.Type","lastModifiedDate":"2024-03-02"},{"lineNumber":50,"author":{"gitId":"jieqiboh"},"content":" .m { color: #099 } // Literal.Number","lastModifiedDate":"2024-03-02"},{"lineNumber":51,"author":{"gitId":"jieqiboh"},"content":" .s { color: #d14 } // Literal.String","lastModifiedDate":"2024-03-02"},{"lineNumber":52,"author":{"gitId":"jieqiboh"},"content":" .na { color: #008080 } // Name.Attribute","lastModifiedDate":"2024-03-02"},{"lineNumber":53,"author":{"gitId":"jieqiboh"},"content":" .nb { color: #0086B3 } // Name.Builtin","lastModifiedDate":"2024-03-02"},{"lineNumber":54,"author":{"gitId":"jieqiboh"},"content":" .nc { color: #458; font-weight: bold } // Name.Class","lastModifiedDate":"2024-03-02"},{"lineNumber":55,"author":{"gitId":"jieqiboh"},"content":" .no { color: #008080 } // Name.Constant","lastModifiedDate":"2024-03-02"},{"lineNumber":56,"author":{"gitId":"jieqiboh"},"content":" .ni { color: #800080 } // Name.Entity","lastModifiedDate":"2024-03-02"},{"lineNumber":57,"author":{"gitId":"jieqiboh"},"content":" .ne { color: #900; font-weight: bold } // Name.Exception","lastModifiedDate":"2024-03-02"},{"lineNumber":58,"author":{"gitId":"jieqiboh"},"content":" .nf { color: #900; font-weight: bold } // Name.Function","lastModifiedDate":"2024-03-02"},{"lineNumber":59,"author":{"gitId":"jieqiboh"},"content":" .nn { color: #555 } // Name.Namespace","lastModifiedDate":"2024-03-02"},{"lineNumber":60,"author":{"gitId":"jieqiboh"},"content":" .nt { color: #000080 } // Name.Tag","lastModifiedDate":"2024-03-02"},{"lineNumber":61,"author":{"gitId":"jieqiboh"},"content":" .nv { color: #008080 } // Name.Variable","lastModifiedDate":"2024-03-02"},{"lineNumber":62,"author":{"gitId":"jieqiboh"},"content":" .ow { font-weight: bold } // Operator.Word","lastModifiedDate":"2024-03-02"},{"lineNumber":63,"author":{"gitId":"jieqiboh"},"content":" .w { color: #bbb } // Text.Whitespace","lastModifiedDate":"2024-03-02"},{"lineNumber":64,"author":{"gitId":"jieqiboh"},"content":" .mf { color: #099 } // Literal.Number.Float","lastModifiedDate":"2024-03-02"},{"lineNumber":65,"author":{"gitId":"jieqiboh"},"content":" .mh { color: #099 } // Literal.Number.Hex","lastModifiedDate":"2024-03-02"},{"lineNumber":66,"author":{"gitId":"jieqiboh"},"content":" .mi { color: #099 } // Literal.Number.Integer","lastModifiedDate":"2024-03-02"},{"lineNumber":67,"author":{"gitId":"jieqiboh"},"content":" .mo { color: #099 } // Literal.Number.Oct","lastModifiedDate":"2024-03-02"},{"lineNumber":68,"author":{"gitId":"jieqiboh"},"content":" .sb { color: #d14 } // Literal.String.Backtick","lastModifiedDate":"2024-03-02"},{"lineNumber":69,"author":{"gitId":"jieqiboh"},"content":" .sc { color: #d14 } // Literal.String.Char","lastModifiedDate":"2024-03-02"},{"lineNumber":70,"author":{"gitId":"jieqiboh"},"content":" .sd { color: #d14 } // Literal.String.Doc","lastModifiedDate":"2024-03-02"},{"lineNumber":71,"author":{"gitId":"jieqiboh"},"content":" .s2 { color: #d14 } // Literal.String.Double","lastModifiedDate":"2024-03-02"},{"lineNumber":72,"author":{"gitId":"jieqiboh"},"content":" .se { color: #d14 } // Literal.String.Escape","lastModifiedDate":"2024-03-02"},{"lineNumber":73,"author":{"gitId":"jieqiboh"},"content":" .sh { color: #d14 } // Literal.String.Heredoc","lastModifiedDate":"2024-03-02"},{"lineNumber":74,"author":{"gitId":"jieqiboh"},"content":" .si { color: #d14 } // Literal.String.Interpol","lastModifiedDate":"2024-03-02"},{"lineNumber":75,"author":{"gitId":"jieqiboh"},"content":" .sx { color: #d14 } // Literal.String.Other","lastModifiedDate":"2024-03-02"},{"lineNumber":76,"author":{"gitId":"jieqiboh"},"content":" .sr { color: #009926 } // Literal.String.Regex","lastModifiedDate":"2024-03-02"},{"lineNumber":77,"author":{"gitId":"jieqiboh"},"content":" .s1 { color: #d14 } // Literal.String.Single","lastModifiedDate":"2024-03-02"},{"lineNumber":78,"author":{"gitId":"jieqiboh"},"content":" .ss { color: #990073 } // Literal.String.Symbol","lastModifiedDate":"2024-03-02"},{"lineNumber":79,"author":{"gitId":"jieqiboh"},"content":" .bp { color: #999 } // Name.Builtin.Pseudo","lastModifiedDate":"2024-03-02"},{"lineNumber":80,"author":{"gitId":"jieqiboh"},"content":" .vc { color: #008080 } // Name.Variable.Class","lastModifiedDate":"2024-03-02"},{"lineNumber":81,"author":{"gitId":"jieqiboh"},"content":" .vg { color: #008080 } // Name.Variable.Global","lastModifiedDate":"2024-03-02"},{"lineNumber":82,"author":{"gitId":"jieqiboh"},"content":" .vi { color: #008080 } // Name.Variable.Instance","lastModifiedDate":"2024-03-02"},{"lineNumber":83,"author":{"gitId":"jieqiboh"},"content":" .il { color: #099 } // Literal.Number.Integer.Long","lastModifiedDate":"2024-03-02"},{"lineNumber":84,"author":{"gitId":"jieqiboh"},"content":"}","lastModifiedDate":"2024-03-02"}],"authorContributionMap":{"jieqiboh":84}},{"path":"docs/_sass/minima/skins/solarized-dark.scss","fileType":"other","lines":[{"lineNumber":1,"author":{"gitId":"jieqiboh"},"content":"@charset \"utf-8\";","lastModifiedDate":"2024-03-02"},{"lineNumber":2,"author":{"gitId":"jieqiboh"},"content":"","lastModifiedDate":"2024-03-02"},{"lineNumber":3,"author":{"gitId":"jieqiboh"},"content":"$sol-is-dark: true;","lastModifiedDate":"2024-03-02"},{"lineNumber":4,"author":{"gitId":"jieqiboh"},"content":"@import \"minima/skins/solarized\";","lastModifiedDate":"2024-03-02"}],"authorContributionMap":{"jieqiboh":4}},{"path":"docs/_sass/minima/skins/solarized.scss","fileType":"other","lines":[{"lineNumber":1,"author":{"gitId":"jieqiboh"},"content":"@charset \"utf-8\";","lastModifiedDate":"2024-03-02"},{"lineNumber":2,"author":{"gitId":"jieqiboh"},"content":"","lastModifiedDate":"2024-03-02"},{"lineNumber":3,"author":{"gitId":"jieqiboh"},"content":"// Solarized skin","lastModifiedDate":"2024-03-02"},{"lineNumber":4,"author":{"gitId":"jieqiboh"},"content":"// \u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d","lastModifiedDate":"2024-03-02"},{"lineNumber":5,"author":{"gitId":"jieqiboh"},"content":"// Created by Sander Voerman \u003cmailto:sander@savoerman.nl\u003e using the Solarized","lastModifiedDate":"2024-03-02"},{"lineNumber":6,"author":{"gitId":"jieqiboh"},"content":"// color scheme by Ethan Schoonover \u003chttps://ethanschoonover.com/solarized\u003e.","lastModifiedDate":"2024-03-02"},{"lineNumber":7,"author":{"gitId":"jieqiboh"},"content":"","lastModifiedDate":"2024-03-02"},{"lineNumber":8,"author":{"gitId":"jieqiboh"},"content":"// This style sheet implements two options for the minima.skin setting:","lastModifiedDate":"2024-03-02"},{"lineNumber":9,"author":{"gitId":"jieqiboh"},"content":"// \"solarized\" for light mode and \"solarized-dark\" for dark mode.","lastModifiedDate":"2024-03-02"},{"lineNumber":10,"author":{"gitId":"jieqiboh"},"content":"$sol-is-dark: false !default;","lastModifiedDate":"2024-03-02"},{"lineNumber":11,"author":{"gitId":"jieqiboh"},"content":"","lastModifiedDate":"2024-03-02"},{"lineNumber":12,"author":{"gitId":"jieqiboh"},"content":"","lastModifiedDate":"2024-03-02"},{"lineNumber":13,"author":{"gitId":"jieqiboh"},"content":"// Color scheme","lastModifiedDate":"2024-03-02"},{"lineNumber":14,"author":{"gitId":"jieqiboh"},"content":"// ------------","lastModifiedDate":"2024-03-02"},{"lineNumber":15,"author":{"gitId":"jieqiboh"},"content":"// The inline comments show the canonical L*a*b values for each color.","lastModifiedDate":"2024-03-02"},{"lineNumber":16,"author":{"gitId":"jieqiboh"},"content":"","lastModifiedDate":"2024-03-02"},{"lineNumber":17,"author":{"gitId":"jieqiboh"},"content":"$sol-base03: #002b36; // 15 -12 -12","lastModifiedDate":"2024-03-02"},{"lineNumber":18,"author":{"gitId":"jieqiboh"},"content":"$sol-base02: #073642; // 20 -12 -12","lastModifiedDate":"2024-03-02"},{"lineNumber":19,"author":{"gitId":"jieqiboh"},"content":"$sol-base01: #586e75; // 45 -07 -07","lastModifiedDate":"2024-03-02"},{"lineNumber":20,"author":{"gitId":"jieqiboh"},"content":"$sol-base00: #657b83; // 50 -07 -07","lastModifiedDate":"2024-03-02"},{"lineNumber":21,"author":{"gitId":"jieqiboh"},"content":"$sol-base0: #839496; // 60 -06 -03","lastModifiedDate":"2024-03-02"},{"lineNumber":22,"author":{"gitId":"jieqiboh"},"content":"$sol-base1: #93a1a1; // 65 -05 -02","lastModifiedDate":"2024-03-02"},{"lineNumber":23,"author":{"gitId":"jieqiboh"},"content":"$sol-base2: #eee8d5; // 92 -00 10","lastModifiedDate":"2024-03-02"},{"lineNumber":24,"author":{"gitId":"jieqiboh"},"content":"$sol-base3: #fdf6e3; // 97 00 10","lastModifiedDate":"2024-03-02"},{"lineNumber":25,"author":{"gitId":"jieqiboh"},"content":"$sol-yellow: #b58900; // 60 10 65","lastModifiedDate":"2024-03-02"},{"lineNumber":26,"author":{"gitId":"jieqiboh"},"content":"$sol-orange: #cb4b16; // 50 50 55","lastModifiedDate":"2024-03-02"},{"lineNumber":27,"author":{"gitId":"jieqiboh"},"content":"$sol-red: #dc322f; // 50 65 45","lastModifiedDate":"2024-03-02"},{"lineNumber":28,"author":{"gitId":"jieqiboh"},"content":"$sol-magenta: #d33682; // 50 65 -05","lastModifiedDate":"2024-03-02"},{"lineNumber":29,"author":{"gitId":"jieqiboh"},"content":"$sol-violet: #6c71c4; // 50 15 -45","lastModifiedDate":"2024-03-02"},{"lineNumber":30,"author":{"gitId":"jieqiboh"},"content":"$sol-blue: #268bd2; // 55 -10 -45","lastModifiedDate":"2024-03-02"},{"lineNumber":31,"author":{"gitId":"jieqiboh"},"content":"$sol-cyan: #2aa198; // 60 -35 -05","lastModifiedDate":"2024-03-02"},{"lineNumber":32,"author":{"gitId":"jieqiboh"},"content":"$sol-green: #859900; // 60 -20 65","lastModifiedDate":"2024-03-02"},{"lineNumber":33,"author":{"gitId":"jieqiboh"},"content":"","lastModifiedDate":"2024-03-02"},{"lineNumber":34,"author":{"gitId":"jieqiboh"},"content":"$sol-mono3: $sol-base3;","lastModifiedDate":"2024-03-02"},{"lineNumber":35,"author":{"gitId":"jieqiboh"},"content":"$sol-mono2: $sol-base2;","lastModifiedDate":"2024-03-02"},{"lineNumber":36,"author":{"gitId":"jieqiboh"},"content":"$sol-mono1: $sol-base1;","lastModifiedDate":"2024-03-02"},{"lineNumber":37,"author":{"gitId":"jieqiboh"},"content":"$sol-mono00: $sol-base00;","lastModifiedDate":"2024-03-02"},{"lineNumber":38,"author":{"gitId":"jieqiboh"},"content":"$sol-mono01: $sol-base01;","lastModifiedDate":"2024-03-02"},{"lineNumber":39,"author":{"gitId":"jieqiboh"},"content":"","lastModifiedDate":"2024-03-02"},{"lineNumber":40,"author":{"gitId":"jieqiboh"},"content":"@if $sol-is-dark {","lastModifiedDate":"2024-03-02"},{"lineNumber":41,"author":{"gitId":"jieqiboh"},"content":" $sol-mono3: $sol-base03;","lastModifiedDate":"2024-03-02"},{"lineNumber":42,"author":{"gitId":"jieqiboh"},"content":" $sol-mono2: $sol-base02;","lastModifiedDate":"2024-03-02"},{"lineNumber":43,"author":{"gitId":"jieqiboh"},"content":" $sol-mono1: $sol-base01;","lastModifiedDate":"2024-03-02"},{"lineNumber":44,"author":{"gitId":"jieqiboh"},"content":" $sol-mono00: $sol-base0;","lastModifiedDate":"2024-03-02"},{"lineNumber":45,"author":{"gitId":"jieqiboh"},"content":" $sol-mono01: $sol-base1;","lastModifiedDate":"2024-03-02"},{"lineNumber":46,"author":{"gitId":"jieqiboh"},"content":"}","lastModifiedDate":"2024-03-02"},{"lineNumber":47,"author":{"gitId":"jieqiboh"},"content":"","lastModifiedDate":"2024-03-02"},{"lineNumber":48,"author":{"gitId":"jieqiboh"},"content":"","lastModifiedDate":"2024-03-02"},{"lineNumber":49,"author":{"gitId":"jieqiboh"},"content":"// Minima color variables","lastModifiedDate":"2024-03-02"},{"lineNumber":50,"author":{"gitId":"jieqiboh"},"content":"// ----------------------","lastModifiedDate":"2024-03-02"},{"lineNumber":51,"author":{"gitId":"jieqiboh"},"content":"","lastModifiedDate":"2024-03-02"},{"lineNumber":52,"author":{"gitId":"jieqiboh"},"content":"$brand-color: $sol-mono1 !default;","lastModifiedDate":"2024-03-02"},{"lineNumber":53,"author":{"gitId":"jieqiboh"},"content":"$brand-color-light: mix($sol-mono1, $sol-mono3) !default;","lastModifiedDate":"2024-03-02"},{"lineNumber":54,"author":{"gitId":"jieqiboh"},"content":"$brand-color-dark: $sol-mono00 !default;","lastModifiedDate":"2024-03-02"},{"lineNumber":55,"author":{"gitId":"jieqiboh"},"content":"","lastModifiedDate":"2024-03-02"},{"lineNumber":56,"author":{"gitId":"jieqiboh"},"content":"$text-color: $sol-mono01 !default;","lastModifiedDate":"2024-03-02"},{"lineNumber":57,"author":{"gitId":"jieqiboh"},"content":"$background-color: $sol-mono3 !default;","lastModifiedDate":"2024-03-02"},{"lineNumber":58,"author":{"gitId":"jieqiboh"},"content":"$code-background-color: $sol-mono2 !default;","lastModifiedDate":"2024-03-02"},{"lineNumber":59,"author":{"gitId":"jieqiboh"},"content":"","lastModifiedDate":"2024-03-02"},{"lineNumber":60,"author":{"gitId":"jieqiboh"},"content":"$link-base-color: $sol-blue !default;","lastModifiedDate":"2024-03-02"},{"lineNumber":61,"author":{"gitId":"jieqiboh"},"content":"$link-visited-color: mix($sol-blue, $sol-mono00) !default;","lastModifiedDate":"2024-03-02"},{"lineNumber":62,"author":{"gitId":"jieqiboh"},"content":"","lastModifiedDate":"2024-03-02"},{"lineNumber":63,"author":{"gitId":"jieqiboh"},"content":"$table-text-color: $sol-mono00 !default;","lastModifiedDate":"2024-03-02"},{"lineNumber":64,"author":{"gitId":"jieqiboh"},"content":"$table-zebra-color: mix($sol-mono2, $sol-mono3) !default;","lastModifiedDate":"2024-03-02"},{"lineNumber":65,"author":{"gitId":"jieqiboh"},"content":"$table-header-bg-color: $sol-mono2 !default;","lastModifiedDate":"2024-03-02"},{"lineNumber":66,"author":{"gitId":"jieqiboh"},"content":"$table-header-border: $sol-mono1 !default;","lastModifiedDate":"2024-03-02"},{"lineNumber":67,"author":{"gitId":"jieqiboh"},"content":"$table-border-color: $sol-mono1 !default;","lastModifiedDate":"2024-03-02"},{"lineNumber":68,"author":{"gitId":"jieqiboh"},"content":"","lastModifiedDate":"2024-03-02"},{"lineNumber":69,"author":{"gitId":"jieqiboh"},"content":"","lastModifiedDate":"2024-03-02"},{"lineNumber":70,"author":{"gitId":"jieqiboh"},"content":"// Syntax highlighting styles","lastModifiedDate":"2024-03-02"},{"lineNumber":71,"author":{"gitId":"jieqiboh"},"content":"// --------------------------","lastModifiedDate":"2024-03-02"},{"lineNumber":72,"author":{"gitId":"jieqiboh"},"content":"","lastModifiedDate":"2024-03-02"},{"lineNumber":73,"author":{"gitId":"jieqiboh"},"content":".highlight {","lastModifiedDate":"2024-03-02"},{"lineNumber":74,"author":{"gitId":"jieqiboh"},"content":" .c { color: $sol-mono1; font-style: italic } // Comment","lastModifiedDate":"2024-03-02"},{"lineNumber":75,"author":{"gitId":"jieqiboh"},"content":" .err { color: $sol-red } // Error","lastModifiedDate":"2024-03-02"},{"lineNumber":76,"author":{"gitId":"jieqiboh"},"content":" .k { color: $sol-mono01; font-weight: bold } // Keyword","lastModifiedDate":"2024-03-02"},{"lineNumber":77,"author":{"gitId":"jieqiboh"},"content":" .o { color: $sol-mono01; font-weight: bold } // Operator","lastModifiedDate":"2024-03-02"},{"lineNumber":78,"author":{"gitId":"jieqiboh"},"content":" .cm { color: $sol-mono1; font-style: italic } // Comment.Multiline","lastModifiedDate":"2024-03-02"},{"lineNumber":79,"author":{"gitId":"jieqiboh"},"content":" .cp { color: $sol-mono1; font-weight: bold } // Comment.Preproc","lastModifiedDate":"2024-03-02"},{"lineNumber":80,"author":{"gitId":"jieqiboh"},"content":" .c1 { color: $sol-mono1; font-style: italic } // Comment.Single","lastModifiedDate":"2024-03-02"},{"lineNumber":81,"author":{"gitId":"jieqiboh"},"content":" .cs { color: $sol-mono1; font-weight: bold; font-style: italic } // Comment.Special","lastModifiedDate":"2024-03-02"},{"lineNumber":82,"author":{"gitId":"jieqiboh"},"content":" .gd { color: $sol-red } // Generic.Deleted","lastModifiedDate":"2024-03-02"},{"lineNumber":83,"author":{"gitId":"jieqiboh"},"content":" .gd .x { color: $sol-red } // Generic.Deleted.Specific","lastModifiedDate":"2024-03-02"},{"lineNumber":84,"author":{"gitId":"jieqiboh"},"content":" .ge { color: $sol-mono00; font-style: italic } // Generic.Emph","lastModifiedDate":"2024-03-02"},{"lineNumber":85,"author":{"gitId":"jieqiboh"},"content":" .gr { color: $sol-red } // Generic.Error","lastModifiedDate":"2024-03-02"},{"lineNumber":86,"author":{"gitId":"jieqiboh"},"content":" .gh { color: $sol-mono1 } // Generic.Heading","lastModifiedDate":"2024-03-02"},{"lineNumber":87,"author":{"gitId":"jieqiboh"},"content":" .gi { color: $sol-green } // Generic.Inserted","lastModifiedDate":"2024-03-02"},{"lineNumber":88,"author":{"gitId":"jieqiboh"},"content":" .gi .x { color: $sol-green } // Generic.Inserted.Specific","lastModifiedDate":"2024-03-02"},{"lineNumber":89,"author":{"gitId":"jieqiboh"},"content":" .go { color: $sol-mono00 } // Generic.Output","lastModifiedDate":"2024-03-02"},{"lineNumber":90,"author":{"gitId":"jieqiboh"},"content":" .gp { color: $sol-mono00 } // Generic.Prompt","lastModifiedDate":"2024-03-02"},{"lineNumber":91,"author":{"gitId":"jieqiboh"},"content":" .gs { color: $sol-mono01; font-weight: bold } // Generic.Strong","lastModifiedDate":"2024-03-02"},{"lineNumber":92,"author":{"gitId":"jieqiboh"},"content":" .gu { color: $sol-mono1 } // Generic.Subheading","lastModifiedDate":"2024-03-02"},{"lineNumber":93,"author":{"gitId":"jieqiboh"},"content":" .gt { color: $sol-red } // Generic.Traceback","lastModifiedDate":"2024-03-02"},{"lineNumber":94,"author":{"gitId":"jieqiboh"},"content":" .kc { color: $sol-mono01; font-weight: bold } // Keyword.Constant","lastModifiedDate":"2024-03-02"},{"lineNumber":95,"author":{"gitId":"jieqiboh"},"content":" .kd { color: $sol-mono01; font-weight: bold } // Keyword.Declaration","lastModifiedDate":"2024-03-02"},{"lineNumber":96,"author":{"gitId":"jieqiboh"},"content":" .kp { color: $sol-mono01; font-weight: bold } // Keyword.Pseudo","lastModifiedDate":"2024-03-02"},{"lineNumber":97,"author":{"gitId":"jieqiboh"},"content":" .kr { color: $sol-mono01; font-weight: bold } // Keyword.Reserved","lastModifiedDate":"2024-03-02"},{"lineNumber":98,"author":{"gitId":"jieqiboh"},"content":" .kt { color: $sol-violet; font-weight: bold } // Keyword.Type","lastModifiedDate":"2024-03-02"},{"lineNumber":99,"author":{"gitId":"jieqiboh"},"content":" .m { color: $sol-cyan } // Literal.Number","lastModifiedDate":"2024-03-02"},{"lineNumber":100,"author":{"gitId":"jieqiboh"},"content":" .s { color: $sol-magenta } // Literal.String","lastModifiedDate":"2024-03-02"},{"lineNumber":101,"author":{"gitId":"jieqiboh"},"content":" .na { color: $sol-cyan } // Name.Attribute","lastModifiedDate":"2024-03-02"},{"lineNumber":102,"author":{"gitId":"jieqiboh"},"content":" .nb { color: $sol-blue } // Name.Builtin","lastModifiedDate":"2024-03-02"},{"lineNumber":103,"author":{"gitId":"jieqiboh"},"content":" .nc { color: $sol-violet; font-weight: bold } // Name.Class","lastModifiedDate":"2024-03-02"},{"lineNumber":104,"author":{"gitId":"jieqiboh"},"content":" .no { color: $sol-cyan } // Name.Constant","lastModifiedDate":"2024-03-02"},{"lineNumber":105,"author":{"gitId":"jieqiboh"},"content":" .ni { color: $sol-violet } // Name.Entity","lastModifiedDate":"2024-03-02"},{"lineNumber":106,"author":{"gitId":"jieqiboh"},"content":" .ne { color: $sol-violet; font-weight: bold } // Name.Exception","lastModifiedDate":"2024-03-02"},{"lineNumber":107,"author":{"gitId":"jieqiboh"},"content":" .nf { color: $sol-blue; font-weight: bold } // Name.Function","lastModifiedDate":"2024-03-02"},{"lineNumber":108,"author":{"gitId":"jieqiboh"},"content":" .nn { color: $sol-mono00 } // Name.Namespace","lastModifiedDate":"2024-03-02"},{"lineNumber":109,"author":{"gitId":"jieqiboh"},"content":" .nt { color: $sol-blue } // Name.Tag","lastModifiedDate":"2024-03-02"},{"lineNumber":110,"author":{"gitId":"jieqiboh"},"content":" .nv { color: $sol-cyan } // Name.Variable","lastModifiedDate":"2024-03-02"},{"lineNumber":111,"author":{"gitId":"jieqiboh"},"content":" .ow { color: $sol-mono01; font-weight: bold } // Operator.Word","lastModifiedDate":"2024-03-02"},{"lineNumber":112,"author":{"gitId":"jieqiboh"},"content":" .w { color: $sol-mono1 } // Text.Whitespace","lastModifiedDate":"2024-03-02"},{"lineNumber":113,"author":{"gitId":"jieqiboh"},"content":" .mf { color: $sol-cyan } // Literal.Number.Float","lastModifiedDate":"2024-03-02"},{"lineNumber":114,"author":{"gitId":"jieqiboh"},"content":" .mh { color: $sol-cyan } // Literal.Number.Hex","lastModifiedDate":"2024-03-02"},{"lineNumber":115,"author":{"gitId":"jieqiboh"},"content":" .mi { color: $sol-cyan } // Literal.Number.Integer","lastModifiedDate":"2024-03-02"},{"lineNumber":116,"author":{"gitId":"jieqiboh"},"content":" .mo { color: $sol-cyan } // Literal.Number.Oct","lastModifiedDate":"2024-03-02"},{"lineNumber":117,"author":{"gitId":"jieqiboh"},"content":" .sb { color: $sol-magenta } // Literal.String.Backtick","lastModifiedDate":"2024-03-02"},{"lineNumber":118,"author":{"gitId":"jieqiboh"},"content":" .sc { color: $sol-magenta } // Literal.String.Char","lastModifiedDate":"2024-03-02"},{"lineNumber":119,"author":{"gitId":"jieqiboh"},"content":" .sd { color: $sol-magenta } // Literal.String.Doc","lastModifiedDate":"2024-03-02"},{"lineNumber":120,"author":{"gitId":"jieqiboh"},"content":" .s2 { color: $sol-magenta } // Literal.String.Double","lastModifiedDate":"2024-03-02"},{"lineNumber":121,"author":{"gitId":"jieqiboh"},"content":" .se { color: $sol-magenta } // Literal.String.Escape","lastModifiedDate":"2024-03-02"},{"lineNumber":122,"author":{"gitId":"jieqiboh"},"content":" .sh { color: $sol-magenta } // Literal.String.Heredoc","lastModifiedDate":"2024-03-02"},{"lineNumber":123,"author":{"gitId":"jieqiboh"},"content":" .si { color: $sol-magenta } // Literal.String.Interpol","lastModifiedDate":"2024-03-02"},{"lineNumber":124,"author":{"gitId":"jieqiboh"},"content":" .sx { color: $sol-magenta } // Literal.String.Other","lastModifiedDate":"2024-03-02"},{"lineNumber":125,"author":{"gitId":"jieqiboh"},"content":" .sr { color: $sol-green } // Literal.String.Regex","lastModifiedDate":"2024-03-02"},{"lineNumber":126,"author":{"gitId":"jieqiboh"},"content":" .s1 { color: $sol-magenta } // Literal.String.Single","lastModifiedDate":"2024-03-02"},{"lineNumber":127,"author":{"gitId":"jieqiboh"},"content":" .ss { color: $sol-magenta } // Literal.String.Symbol","lastModifiedDate":"2024-03-02"},{"lineNumber":128,"author":{"gitId":"jieqiboh"},"content":" .bp { color: $sol-mono1 } // Name.Builtin.Pseudo","lastModifiedDate":"2024-03-02"},{"lineNumber":129,"author":{"gitId":"jieqiboh"},"content":" .vc { color: $sol-cyan } // Name.Variable.Class","lastModifiedDate":"2024-03-02"},{"lineNumber":130,"author":{"gitId":"jieqiboh"},"content":" .vg { color: $sol-cyan } // Name.Variable.Global","lastModifiedDate":"2024-03-02"},{"lineNumber":131,"author":{"gitId":"jieqiboh"},"content":" .vi { color: $sol-cyan } // Name.Variable.Instance","lastModifiedDate":"2024-03-02"},{"lineNumber":132,"author":{"gitId":"jieqiboh"},"content":" .il { color: $sol-cyan } // Literal.Number.Integer.Long","lastModifiedDate":"2024-03-02"},{"lineNumber":133,"author":{"gitId":"jieqiboh"},"content":"}","lastModifiedDate":"2024-03-02"}],"authorContributionMap":{"jieqiboh":133}},{"path":"docs/assets/css/style.scss","fileType":"other","lines":[{"lineNumber":1,"author":{"gitId":"jieqiboh"},"content":"---","lastModifiedDate":"2024-03-02"},{"lineNumber":2,"author":{"gitId":"jieqiboh"},"content":"# Only the main Sass file needs front matter (the dashes are enough)","lastModifiedDate":"2024-03-02"},{"lineNumber":3,"author":{"gitId":"jieqiboh"},"content":"---","lastModifiedDate":"2024-03-02"},{"lineNumber":4,"author":{"gitId":"jieqiboh"},"content":"","lastModifiedDate":"2024-03-02"},{"lineNumber":5,"author":{"gitId":"jieqiboh"},"content":"@import","lastModifiedDate":"2024-03-02"},{"lineNumber":6,"author":{"gitId":"jieqiboh"},"content":" \"minima/skins/{{ site.minima.skin | default: \u0027classic\u0027 }}\",","lastModifiedDate":"2024-03-02"},{"lineNumber":7,"author":{"gitId":"jieqiboh"},"content":" \"minima/initialize\";","lastModifiedDate":"2024-03-02"},{"lineNumber":8,"author":{"gitId":"jieqiboh"},"content":"","lastModifiedDate":"2024-03-02"},{"lineNumber":9,"author":{"gitId":"jieqiboh"},"content":".icon {","lastModifiedDate":"2024-03-02"},{"lineNumber":10,"author":{"gitId":"jieqiboh"},"content":" height: 21px;","lastModifiedDate":"2024-03-02"},{"lineNumber":11,"author":{"gitId":"jieqiboh"},"content":" width: 21px","lastModifiedDate":"2024-03-02"},{"lineNumber":12,"author":{"gitId":"jieqiboh"},"content":"}","lastModifiedDate":"2024-03-02"}],"authorContributionMap":{"jieqiboh":12}},{"path":"docs/index.md","fileType":"docs","lines":[{"lineNumber":1,"author":{"gitId":"-"},"content":"---","lastModifiedDate":"2020-05-23"},{"lineNumber":2,"author":{"gitId":"jieqiboh"},"content":"layout: page","lastModifiedDate":"2024-03-02"},{"lineNumber":3,"author":{"gitId":"jieqiboh"},"content":"title: AddressBook Level-3","lastModifiedDate":"2024-03-02"},{"lineNumber":4,"author":{"gitId":"-"},"content":"---","lastModifiedDate":"2020-05-23"},{"lineNumber":5,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":6,"author":{"gitId":"-"},"content":"[![CI Status](https://github.com/se-edu/addressbook-level3/workflows/Java%20CI/badge.svg)](https://github.com/se-edu/addressbook-level3/actions)","lastModifiedDate":"2020-05-23"},{"lineNumber":7,"author":{"gitId":"-"},"content":"[![codecov](https://codecov.io/gh/se-edu/addressbook-level3/branch/master/graph/badge.svg)](https://codecov.io/gh/se-edu/addressbook-level3)","lastModifiedDate":"2020-08-07"},{"lineNumber":8,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":9,"author":{"gitId":"-"},"content":"![Ui](images/Ui.png)","lastModifiedDate":"2020-05-23"},{"lineNumber":10,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":11,"author":{"gitId":"-"},"content":"**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).","lastModifiedDate":"2020-05-23"},{"lineNumber":12,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":13,"author":{"gitId":"-"},"content":"* If you are interested in using AddressBook, head over to the [_Quick Start_ section of the **User Guide**](UserGuide.html#quick-start).","lastModifiedDate":"2020-05-23"},{"lineNumber":14,"author":{"gitId":"-"},"content":"* If you are interested about developing AddressBook, the [**Developer Guide**](DeveloperGuide.html) is a good place to start.","lastModifiedDate":"2020-05-23"},{"lineNumber":15,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":16,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":17,"author":{"gitId":"-"},"content":"**Acknowledgements**","lastModifiedDate":"2020-05-23"},{"lineNumber":18,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":19,"author":{"gitId":"-"},"content":"* Libraries used: [JavaFX](https://openjfx.io/), [Jackson](https://github.com/FasterXML/jackson), [JUnit5](https://github.com/junit-team/junit5)","lastModifiedDate":"2020-05-23"}],"authorContributionMap":{"jieqiboh":2,"-":17}},{"path":"docs/team/captainkeqing.md","fileType":"docs","lines":[{"lineNumber":1,"author":{"gitId":"CaptainKeqing"},"content":"---","lastModifiedDate":"2024-03-02"},{"lineNumber":2,"author":{"gitId":"CaptainKeqing"},"content":"layout: page","lastModifiedDate":"2024-03-02"},{"lineNumber":3,"author":{"gitId":"CaptainKeqing"},"content":"title: CaptainKeqing\u0027s Project Portfolio Page","lastModifiedDate":"2024-03-02"},{"lineNumber":4,"author":{"gitId":"CaptainKeqing"},"content":"---","lastModifiedDate":"2024-03-02"},{"lineNumber":5,"author":{"gitId":"CaptainKeqing"},"content":"","lastModifiedDate":"2024-03-02"},{"lineNumber":6,"author":{"gitId":"CaptainKeqing"},"content":"### Project: CareerSync","lastModifiedDate":"2024-03-02"},{"lineNumber":7,"author":{"gitId":"CaptainKeqing"},"content":"","lastModifiedDate":"2024-03-02"},{"lineNumber":8,"author":{"gitId":"CaptainKeqing"},"content":"Given below are my contributions to the project.","lastModifiedDate":"2024-03-02"}],"authorContributionMap":{"CaptainKeqing":8}},{"path":"docs/team/hm33-stu.md","fileType":"docs","lines":[{"lineNumber":1,"author":{"gitId":"HM33-Stu"},"content":"---","lastModifiedDate":"2024-03-01"},{"lineNumber":2,"author":{"gitId":"HM33-Stu"},"content":" layout: default.md","lastModifiedDate":"2024-03-01"},{"lineNumber":3,"author":{"gitId":"HM33-Stu"},"content":" title: \"HM33-Stu\u0027s Project Portfolio Page\"","lastModifiedDate":"2024-03-01"},{"lineNumber":4,"author":{"gitId":"HM33-Stu"},"content":"---","lastModifiedDate":"2024-03-01"},{"lineNumber":5,"author":{"gitId":"HM33-Stu"},"content":"","lastModifiedDate":"2024-03-01"},{"lineNumber":6,"author":{"gitId":"HM33-Stu"},"content":"### Project: CareerSync","lastModifiedDate":"2024-03-01"},{"lineNumber":7,"author":{"gitId":"HM33-Stu"},"content":"","lastModifiedDate":"2024-03-01"},{"lineNumber":8,"author":{"gitId":"HM33-Stu"},"content":"Given below are my contributions to the project.","lastModifiedDate":"2024-03-01"}],"authorContributionMap":{"HM33-Stu":8}},{"path":"docs/team/jieqiboh.md","fileType":"docs","lines":[{"lineNumber":1,"author":{"gitId":"-"},"content":"---","lastModifiedDate":"2020-05-23"},{"lineNumber":2,"author":{"gitId":"-"},"content":"layout: page","lastModifiedDate":"2020-05-23"},{"lineNumber":3,"author":{"gitId":"jieqiboh"},"content":"title: Boh Jie Qi\u0027s Project Portfolio Page","lastModifiedDate":"2024-02-29"},{"lineNumber":4,"author":{"gitId":"-"},"content":"---","lastModifiedDate":"2020-05-23"},{"lineNumber":5,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":6,"author":{"gitId":"-"},"content":"### Project: AddressBook Level 3","lastModifiedDate":"2021-07-30"},{"lineNumber":7,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":8,"author":{"gitId":"-"},"content":"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.","lastModifiedDate":"2020-05-23"},{"lineNumber":9,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":10,"author":{"gitId":"-"},"content":"Given below are my contributions to the project.","lastModifiedDate":"2020-05-23"},{"lineNumber":11,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":12,"author":{"gitId":"-"},"content":"* **New Feature**: Added the ability to undo/redo previous commands.","lastModifiedDate":"2020-05-23"},{"lineNumber":13,"author":{"gitId":"-"},"content":" * 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.","lastModifiedDate":"2020-05-23"},{"lineNumber":14,"author":{"gitId":"-"},"content":" * 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.","lastModifiedDate":"2020-05-23"},{"lineNumber":15,"author":{"gitId":"-"},"content":" * 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.","lastModifiedDate":"2020-05-23"},{"lineNumber":16,"author":{"gitId":"-"},"content":" * 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}*","lastModifiedDate":"2020-05-23"},{"lineNumber":17,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":18,"author":{"gitId":"-"},"content":"* **New Feature**: Added a history command that allows the user to navigate to previous commands using up/down keys.","lastModifiedDate":"2020-05-23"},{"lineNumber":19,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":20,"author":{"gitId":"-"},"content":"* **Code contributed**: [RepoSense link]()","lastModifiedDate":"2020-05-23"},{"lineNumber":21,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":22,"author":{"gitId":"-"},"content":"* **Project management**:","lastModifiedDate":"2020-05-23"},{"lineNumber":23,"author":{"gitId":"-"},"content":" * Managed releases `v1.3` - `v1.5rc` (3 releases) on GitHub","lastModifiedDate":"2020-05-23"},{"lineNumber":24,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":25,"author":{"gitId":"-"},"content":"* **Enhancements to existing features**:","lastModifiedDate":"2020-05-23"},{"lineNumber":26,"author":{"gitId":"-"},"content":" * Updated the GUI color scheme (Pull requests [\\#33](), [\\#34]())","lastModifiedDate":"2020-05-23"},{"lineNumber":27,"author":{"gitId":"-"},"content":" * Wrote additional tests for existing features to increase coverage from 88% to 92% (Pull requests [\\#36](), [\\#38]())","lastModifiedDate":"2020-05-23"},{"lineNumber":28,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":29,"author":{"gitId":"-"},"content":"* **Documentation**:","lastModifiedDate":"2020-05-23"},{"lineNumber":30,"author":{"gitId":"-"},"content":" * User Guide:","lastModifiedDate":"2020-05-23"},{"lineNumber":31,"author":{"gitId":"-"},"content":" * Added documentation for the features `delete` and `find` [\\#72]()","lastModifiedDate":"2020-05-23"},{"lineNumber":32,"author":{"gitId":"-"},"content":" * Did cosmetic tweaks to existing documentation of features `clear`, `exit`: [\\#74]()","lastModifiedDate":"2020-05-23"},{"lineNumber":33,"author":{"gitId":"-"},"content":" * Developer Guide:","lastModifiedDate":"2020-05-23"},{"lineNumber":34,"author":{"gitId":"-"},"content":" * Added implementation details of the `delete` feature.","lastModifiedDate":"2020-05-23"},{"lineNumber":35,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":36,"author":{"gitId":"-"},"content":"* **Community**:","lastModifiedDate":"2020-05-23"},{"lineNumber":37,"author":{"gitId":"-"},"content":" * PRs reviewed (with non-trivial review comments): [\\#12](), [\\#32](), [\\#19](), [\\#42]()","lastModifiedDate":"2020-05-23"},{"lineNumber":38,"author":{"gitId":"-"},"content":" * Contributed to forum discussions (examples: [1](), [2](), [3](), [4]())","lastModifiedDate":"2020-05-23"},{"lineNumber":39,"author":{"gitId":"-"},"content":" * Reported bugs and suggestions for other teams in the class (examples: [1](), [2](), [3]())","lastModifiedDate":"2020-05-23"},{"lineNumber":40,"author":{"gitId":"-"},"content":" * Some parts of the history feature I added was adopted by several other class mates ([1](), [2]())","lastModifiedDate":"2020-05-23"},{"lineNumber":41,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":42,"author":{"gitId":"-"},"content":"* **Tools**:","lastModifiedDate":"2020-05-23"},{"lineNumber":43,"author":{"gitId":"-"},"content":" * Integrated a third party library (Natty) to the project ([\\#42]())","lastModifiedDate":"2020-05-23"},{"lineNumber":44,"author":{"gitId":"-"},"content":" * Integrated a new Github plugin (CircleCI) to the team repo","lastModifiedDate":"2020-05-23"},{"lineNumber":45,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":46,"author":{"gitId":"-"},"content":"* _{you can add/remove categories in the list above}_","lastModifiedDate":"2020-05-23"}],"authorContributionMap":{"jieqiboh":1,"-":45}},{"path":"docs/team/lws49.md","fileType":"docs","lines":[{"lineNumber":1,"author":{"gitId":"LWS49"},"content":"---","lastModifiedDate":"2024-03-02"},{"lineNumber":2,"author":{"gitId":"LWS49"},"content":"layout: page","lastModifiedDate":"2024-03-02"},{"lineNumber":3,"author":{"gitId":"LWS49"},"content":"title: LWS49\u0027s Project Portfolio Page","lastModifiedDate":"2024-03-02"},{"lineNumber":4,"author":{"gitId":"LWS49"},"content":"---","lastModifiedDate":"2024-03-02"},{"lineNumber":5,"author":{"gitId":"LWS49"},"content":"","lastModifiedDate":"2024-03-02"},{"lineNumber":6,"author":{"gitId":"LWS49"},"content":"### Project: CareerSync","lastModifiedDate":"2024-03-02"},{"lineNumber":7,"author":{"gitId":"LWS49"},"content":"","lastModifiedDate":"2024-03-02"},{"lineNumber":8,"author":{"gitId":"LWS49"},"content":"Given below are my contributions to the project.","lastModifiedDate":"2024-03-02"}],"authorContributionMap":{"LWS49":8}},{"path":"docs/team/theman-oj10.md","fileType":"docs","lines":[{"lineNumber":1,"author":{"gitId":"theman-oj10"},"content":"---","lastModifiedDate":"2024-03-02"},{"lineNumber":2,"author":{"gitId":"theman-oj10"},"content":"layout: page","lastModifiedDate":"2024-03-02"},{"lineNumber":3,"author":{"gitId":"theman-oj10"},"content":"title: Manoj\u0027s Project Portfolio Page","lastModifiedDate":"2024-03-02"},{"lineNumber":4,"author":{"gitId":"theman-oj10"},"content":"---","lastModifiedDate":"2024-03-02"},{"lineNumber":5,"author":{"gitId":"theman-oj10"},"content":"","lastModifiedDate":"2024-03-02"},{"lineNumber":6,"author":{"gitId":"theman-oj10"},"content":"### Project: CareerSync","lastModifiedDate":"2024-03-02"},{"lineNumber":7,"author":{"gitId":"theman-oj10"},"content":"","lastModifiedDate":"2024-03-02"},{"lineNumber":8,"author":{"gitId":"theman-oj10"},"content":"Given below are my contributions to the project.","lastModifiedDate":"2024-03-02"}],"authorContributionMap":{"theman-oj10":8}},{"path":"docs/tutorials/AddRemark.md","fileType":"docs","lines":[{"lineNumber":1,"author":{"gitId":"-"},"content":"---","lastModifiedDate":"2020-07-29"},{"lineNumber":2,"author":{"gitId":"jieqiboh"},"content":"layout: page","lastModifiedDate":"2024-03-02"},{"lineNumber":3,"author":{"gitId":"-"},"content":"title: \"Tutorial: Adding a command\"","lastModifiedDate":"2020-07-29"},{"lineNumber":4,"author":{"gitId":"-"},"content":"---","lastModifiedDate":"2020-07-29"},{"lineNumber":5,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-07-29"},{"lineNumber":6,"author":{"gitId":"-"},"content":"Let\u0027s walk you through the implementation of a new command — `remark`.","lastModifiedDate":"2020-07-29"},{"lineNumber":7,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-07-29"},{"lineNumber":8,"author":{"gitId":"-"},"content":"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:","lastModifiedDate":"2020-07-29"},{"lineNumber":9,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-07-29"},{"lineNumber":10,"author":{"gitId":"-"},"content":"`remark INDEX r/REMARK` (e.g., `remark 2 r/Likes baseball`)","lastModifiedDate":"2020-07-29"},{"lineNumber":11,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-07-29"},{"lineNumber":12,"author":{"gitId":"-"},"content":"We’ll assume that you have already set up the development environment as outlined in the Developer’s Guide.","lastModifiedDate":"2020-07-29"},{"lineNumber":13,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-07-29"},{"lineNumber":14,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-07-29"},{"lineNumber":15,"author":{"gitId":"-"},"content":"## Create a new `remark` command","lastModifiedDate":"2020-07-29"},{"lineNumber":16,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-07-29"},{"lineNumber":17,"author":{"gitId":"-"},"content":"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`.","lastModifiedDate":"2020-07-29"},{"lineNumber":18,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-07-29"},{"lineNumber":19,"author":{"gitId":"-"},"content":"Let’s start by creating a new `RemarkCommand` class in the `src/main/java/seedu/address/logic/command` directory.","lastModifiedDate":"2020-07-29"},{"lineNumber":20,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-07-29"},{"lineNumber":21,"author":{"gitId":"-"},"content":"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.","lastModifiedDate":"2020-07-29"},{"lineNumber":22,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-07-29"},{"lineNumber":23,"author":{"gitId":"-"},"content":"**`RemarkCommand.java`:**","lastModifiedDate":"2020-07-29"},{"lineNumber":24,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-07-29"},{"lineNumber":25,"author":{"gitId":"-"},"content":"``` java","lastModifiedDate":"2020-07-29"},{"lineNumber":26,"author":{"gitId":"-"},"content":"package seedu.address.logic.commands;","lastModifiedDate":"2020-07-29"},{"lineNumber":27,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-07-29"},{"lineNumber":28,"author":{"gitId":"-"},"content":"import seedu.address.model.Model;","lastModifiedDate":"2020-07-29"},{"lineNumber":29,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-07-29"},{"lineNumber":30,"author":{"gitId":"-"},"content":"/**","lastModifiedDate":"2020-07-29"},{"lineNumber":31,"author":{"gitId":"-"},"content":" * Changes the remark of an existing person in the address book.","lastModifiedDate":"2020-07-29"},{"lineNumber":32,"author":{"gitId":"-"},"content":" */","lastModifiedDate":"2020-07-29"},{"lineNumber":33,"author":{"gitId":"-"},"content":"public class RemarkCommand extends Command {","lastModifiedDate":"2020-07-29"},{"lineNumber":34,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-07-29"},{"lineNumber":35,"author":{"gitId":"-"},"content":" public static final String COMMAND_WORD \u003d \"remark\";","lastModifiedDate":"2020-07-29"},{"lineNumber":36,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-07-29"},{"lineNumber":37,"author":{"gitId":"-"},"content":" @Override","lastModifiedDate":"2020-07-29"},{"lineNumber":38,"author":{"gitId":"-"},"content":" public CommandResult execute(Model model) {","lastModifiedDate":"2020-07-29"},{"lineNumber":39,"author":{"gitId":"-"},"content":" return new CommandResult(\"Hello from remark\");","lastModifiedDate":"2020-07-29"},{"lineNumber":40,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2020-07-29"},{"lineNumber":41,"author":{"gitId":"-"},"content":"}","lastModifiedDate":"2020-07-29"},{"lineNumber":42,"author":{"gitId":"-"},"content":"```","lastModifiedDate":"2020-07-29"},{"lineNumber":43,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-07-29"},{"lineNumber":44,"author":{"gitId":"-"},"content":"### Hook `RemarkCommand` into the application","lastModifiedDate":"2020-07-29"},{"lineNumber":45,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-07-29"},{"lineNumber":46,"author":{"gitId":"-"},"content":"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`.","lastModifiedDate":"2020-07-29"},{"lineNumber":47,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-07-29"},{"lineNumber":48,"author":{"gitId":"-"},"content":"You can refer to the changes in this [diff](https://github.com/se-edu/addressbook-level3/commit/35eb7286f18a029d39cb7a29df8f172a001e4fd8#diff-399c284cb892c20b7c04a69116fcff6ccc0666c5230a1db8e4a9145def8fa4ee).","lastModifiedDate":"2022-01-02"},{"lineNumber":49,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-07-29"},{"lineNumber":50,"author":{"gitId":"-"},"content":"### Run the application","lastModifiedDate":"2020-07-29"},{"lineNumber":51,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-07-29"},{"lineNumber":52,"author":{"gitId":"-"},"content":"Run `Main#main` and try out your new `RemarkCommand`. If everything went well, you should see something like this:","lastModifiedDate":"2020-07-29"},{"lineNumber":53,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-07-29"},{"lineNumber":54,"author":{"gitId":"-"},"content":"![Output displayed](../images/add-remark/RemarkHello.png)","lastModifiedDate":"2020-07-29"},{"lineNumber":55,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-07-29"},{"lineNumber":56,"author":{"gitId":"-"},"content":"## Change `RemarkCommand` to throw an exception","lastModifiedDate":"2020-07-29"},{"lineNumber":57,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-07-29"},{"lineNumber":58,"author":{"gitId":"-"},"content":"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.","lastModifiedDate":"2020-12-12"},{"lineNumber":59,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-07-29"},{"lineNumber":60,"author":{"gitId":"jieqiboh"},"content":"![The relationship between RemarkCommand and Command](../images/add-remark/RemarkCommandClass.png)","lastModifiedDate":"2024-03-02"},{"lineNumber":61,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-07-29"},{"lineNumber":62,"author":{"gitId":"-"},"content":"Following the convention in other commands, we add relevant messages as constants and use them.","lastModifiedDate":"2020-07-29"},{"lineNumber":63,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-07-29"},{"lineNumber":64,"author":{"gitId":"-"},"content":"**`RemarkCommand.java`:**","lastModifiedDate":"2020-07-29"},{"lineNumber":65,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-07-29"},{"lineNumber":66,"author":{"gitId":"-"},"content":"``` java","lastModifiedDate":"2020-07-29"},{"lineNumber":67,"author":{"gitId":"-"},"content":" public static final String MESSAGE_USAGE \u003d COMMAND_WORD","lastModifiedDate":"2021-08-01"},{"lineNumber":68,"author":{"gitId":"-"},"content":" + \": Edits the remark of the person identified \"","lastModifiedDate":"2021-08-01"},{"lineNumber":69,"author":{"gitId":"-"},"content":" + \"by the index number used in the last person listing. \"","lastModifiedDate":"2020-07-29"},{"lineNumber":70,"author":{"gitId":"-"},"content":" + \"Existing remark will be overwritten by the input.\\n\"","lastModifiedDate":"2020-07-29"},{"lineNumber":71,"author":{"gitId":"-"},"content":" + \"Parameters: INDEX (must be a positive integer) \"","lastModifiedDate":"2020-07-29"},{"lineNumber":72,"author":{"gitId":"-"},"content":" + \"r/ [REMARK]\\n\"","lastModifiedDate":"2020-07-29"},{"lineNumber":73,"author":{"gitId":"-"},"content":" + \"Example: \" + COMMAND_WORD + \" 1 \"","lastModifiedDate":"2020-07-29"},{"lineNumber":74,"author":{"gitId":"-"},"content":" + \"r/ Likes to swim.\";","lastModifiedDate":"2020-07-29"},{"lineNumber":75,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-07-29"},{"lineNumber":76,"author":{"gitId":"-"},"content":" public static final String MESSAGE_NOT_IMPLEMENTED_YET \u003d","lastModifiedDate":"2021-08-01"},{"lineNumber":77,"author":{"gitId":"-"},"content":" \"Remark command not implemented yet\";","lastModifiedDate":"2021-08-01"},{"lineNumber":78,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-07-29"},{"lineNumber":79,"author":{"gitId":"-"},"content":" @Override","lastModifiedDate":"2020-07-29"},{"lineNumber":80,"author":{"gitId":"-"},"content":" public CommandResult execute(Model model) throws CommandException {","lastModifiedDate":"2020-07-29"},{"lineNumber":81,"author":{"gitId":"-"},"content":" throw new CommandException(MESSAGE_NOT_IMPLEMENTED_YET);","lastModifiedDate":"2020-07-29"},{"lineNumber":82,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2020-07-29"},{"lineNumber":83,"author":{"gitId":"-"},"content":"```","lastModifiedDate":"2020-07-29"},{"lineNumber":84,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-07-29"},{"lineNumber":85,"author":{"gitId":"-"},"content":"## Enhancing `RemarkCommand`","lastModifiedDate":"2020-07-29"},{"lineNumber":86,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-07-29"},{"lineNumber":87,"author":{"gitId":"-"},"content":"Let’s change `RemarkCommand` to parse input from the user.","lastModifiedDate":"2020-07-29"},{"lineNumber":88,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-07-29"},{"lineNumber":89,"author":{"gitId":"-"},"content":"### Make the command accept parameters","lastModifiedDate":"2020-07-29"},{"lineNumber":90,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-07-29"},{"lineNumber":91,"author":{"gitId":"-"},"content":"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.","lastModifiedDate":"2020-07-29"},{"lineNumber":92,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-07-29"},{"lineNumber":93,"author":{"gitId":"-"},"content":"``` java","lastModifiedDate":"2020-07-29"},{"lineNumber":94,"author":{"gitId":"-"},"content":"import static seedu.address.commons.util.CollectionUtil.requireAllNonNull;","lastModifiedDate":"2020-07-29"},{"lineNumber":95,"author":{"gitId":"-"},"content":"//...","lastModifiedDate":"2020-07-29"},{"lineNumber":96,"author":{"gitId":"-"},"content":"public class RemarkCommand extends Command {","lastModifiedDate":"2020-07-29"},{"lineNumber":97,"author":{"gitId":"-"},"content":" //...","lastModifiedDate":"2020-07-29"},{"lineNumber":98,"author":{"gitId":"-"},"content":" public static final String MESSAGE_ARGUMENTS \u003d \"Index: %1$d, Remark: %2$s\";","lastModifiedDate":"2020-07-29"},{"lineNumber":99,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-07-29"},{"lineNumber":100,"author":{"gitId":"-"},"content":" private final Index index;","lastModifiedDate":"2020-07-29"},{"lineNumber":101,"author":{"gitId":"-"},"content":" private final String remark;","lastModifiedDate":"2020-07-29"},{"lineNumber":102,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-07-29"},{"lineNumber":103,"author":{"gitId":"-"},"content":" /**","lastModifiedDate":"2020-07-29"},{"lineNumber":104,"author":{"gitId":"-"},"content":" * @param index of the person in the filtered person list to edit the remark","lastModifiedDate":"2020-07-29"},{"lineNumber":105,"author":{"gitId":"-"},"content":" * @param remark of the person to be updated to","lastModifiedDate":"2020-07-29"},{"lineNumber":106,"author":{"gitId":"-"},"content":" */","lastModifiedDate":"2020-07-29"},{"lineNumber":107,"author":{"gitId":"-"},"content":" public RemarkCommand(Index index, String remark) {","lastModifiedDate":"2020-07-29"},{"lineNumber":108,"author":{"gitId":"-"},"content":" requireAllNonNull(index, remark);","lastModifiedDate":"2020-07-29"},{"lineNumber":109,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-07-29"},{"lineNumber":110,"author":{"gitId":"-"},"content":" this.index \u003d index;","lastModifiedDate":"2020-07-29"},{"lineNumber":111,"author":{"gitId":"-"},"content":" this.remark \u003d remark;","lastModifiedDate":"2020-07-29"},{"lineNumber":112,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2020-07-29"},{"lineNumber":113,"author":{"gitId":"-"},"content":" @Override","lastModifiedDate":"2020-07-29"},{"lineNumber":114,"author":{"gitId":"-"},"content":" public CommandResult execute(Model model) throws CommandException {","lastModifiedDate":"2020-07-29"},{"lineNumber":115,"author":{"gitId":"-"},"content":" throw new CommandException(","lastModifiedDate":"2021-08-01"},{"lineNumber":116,"author":{"gitId":"-"},"content":" String.format(MESSAGE_ARGUMENTS, index.getOneBased(), remark));","lastModifiedDate":"2021-08-01"},{"lineNumber":117,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2020-07-29"},{"lineNumber":118,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-07-29"},{"lineNumber":119,"author":{"gitId":"-"},"content":" @Override","lastModifiedDate":"2020-07-29"},{"lineNumber":120,"author":{"gitId":"-"},"content":" public boolean equals(Object other) {","lastModifiedDate":"2020-07-29"},{"lineNumber":121,"author":{"gitId":"-"},"content":" if (other \u003d\u003d this) {","lastModifiedDate":"2020-07-29"},{"lineNumber":122,"author":{"gitId":"-"},"content":" return true;","lastModifiedDate":"2020-07-29"},{"lineNumber":123,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2020-07-29"},{"lineNumber":124,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-07-29"},{"lineNumber":125,"author":{"gitId":"-"},"content":" // instanceof handles nulls","lastModifiedDate":"2020-07-29"},{"lineNumber":126,"author":{"gitId":"-"},"content":" if (!(other instanceof RemarkCommand)) {","lastModifiedDate":"2020-07-29"},{"lineNumber":127,"author":{"gitId":"-"},"content":" return false;","lastModifiedDate":"2020-07-29"},{"lineNumber":128,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2020-07-29"},{"lineNumber":129,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-07-29"},{"lineNumber":130,"author":{"gitId":"-"},"content":" RemarkCommand e \u003d (RemarkCommand) other;","lastModifiedDate":"2020-07-29"},{"lineNumber":131,"author":{"gitId":"-"},"content":" return index.equals(e.index)","lastModifiedDate":"2020-07-29"},{"lineNumber":132,"author":{"gitId":"-"},"content":" \u0026\u0026 remark.equals(e.remark);","lastModifiedDate":"2020-07-29"},{"lineNumber":133,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2020-07-29"},{"lineNumber":134,"author":{"gitId":"-"},"content":"}","lastModifiedDate":"2020-07-29"},{"lineNumber":135,"author":{"gitId":"-"},"content":"```","lastModifiedDate":"2020-07-29"},{"lineNumber":136,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-07-29"},{"lineNumber":137,"author":{"gitId":"-"},"content":"Your code should look something like [this](https://github.com/se-edu/addressbook-level3/commit/dc6d5139d08f6403da0ec624ea32bd79a2ae0cbf#diff-a8e35af8f9c251525063fae36c9852922a7e7195763018eacec60f3a4d87c594) after you are done.","lastModifiedDate":"2022-01-02"},{"lineNumber":138,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-07-29"},{"lineNumber":139,"author":{"gitId":"-"},"content":"### Parse user input","lastModifiedDate":"2020-07-29"},{"lineNumber":140,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-07-29"},{"lineNumber":141,"author":{"gitId":"-"},"content":"Now let’s move on to writing a parser that will extract the index and remark from the input provided by the user.","lastModifiedDate":"2020-07-29"},{"lineNumber":142,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-07-29"},{"lineNumber":143,"author":{"gitId":"-"},"content":"Create a `RemarkCommandParser` class in the `seedu.address.logic.parser` package. The class must extend the `Parser` interface.","lastModifiedDate":"2020-07-29"},{"lineNumber":144,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-07-29"},{"lineNumber":145,"author":{"gitId":"jieqiboh"},"content":"![The relationship between Parser and RemarkCommandParser](../images/add-remark/RemarkCommandParserClass.png)","lastModifiedDate":"2024-03-02"},{"lineNumber":146,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-07-29"},{"lineNumber":147,"author":{"gitId":"-"},"content":"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.","lastModifiedDate":"2020-07-29"},{"lineNumber":148,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-07-29"},{"lineNumber":149,"author":{"gitId":"-"},"content":"**`ArgumentTokenizer.java`:**","lastModifiedDate":"2020-07-29"},{"lineNumber":150,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-07-29"},{"lineNumber":151,"author":{"gitId":"-"},"content":"``` java","lastModifiedDate":"2020-07-29"},{"lineNumber":152,"author":{"gitId":"-"},"content":"/**","lastModifiedDate":"2020-07-29"},{"lineNumber":153,"author":{"gitId":"-"},"content":" * Tokenizes an arguments string and returns an {@code ArgumentMultimap}","lastModifiedDate":"2020-07-29"},{"lineNumber":154,"author":{"gitId":"-"},"content":" * object that maps prefixes to their respective argument values. Only the","lastModifiedDate":"2020-07-29"},{"lineNumber":155,"author":{"gitId":"-"},"content":" * given prefixes will be recognized in the arguments string.","lastModifiedDate":"2020-07-29"},{"lineNumber":156,"author":{"gitId":"-"},"content":" *","lastModifiedDate":"2020-07-29"},{"lineNumber":157,"author":{"gitId":"-"},"content":" * @param argsString Arguments string of the form:","lastModifiedDate":"2020-07-29"},{"lineNumber":158,"author":{"gitId":"-"},"content":" * {@code preamble \u003cprefix\u003evalue \u003cprefix\u003evalue ...}","lastModifiedDate":"2020-07-29"},{"lineNumber":159,"author":{"gitId":"-"},"content":" * @param prefixes Prefixes to tokenize the arguments string with","lastModifiedDate":"2020-07-29"},{"lineNumber":160,"author":{"gitId":"-"},"content":" * @return ArgumentMultimap object that maps prefixes to their","lastModifiedDate":"2020-07-29"},{"lineNumber":161,"author":{"gitId":"-"},"content":" * arguments","lastModifiedDate":"2020-07-29"},{"lineNumber":162,"author":{"gitId":"-"},"content":" */","lastModifiedDate":"2020-07-29"},{"lineNumber":163,"author":{"gitId":"-"},"content":"```","lastModifiedDate":"2020-07-29"},{"lineNumber":164,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-07-29"},{"lineNumber":165,"author":{"gitId":"-"},"content":"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` :","lastModifiedDate":"2020-07-29"},{"lineNumber":166,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-07-29"},{"lineNumber":167,"author":{"gitId":"-"},"content":"**`ArgumentMultimap.java`:**","lastModifiedDate":"2020-07-29"},{"lineNumber":168,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-07-29"},{"lineNumber":169,"author":{"gitId":"-"},"content":"``` java","lastModifiedDate":"2020-07-29"},{"lineNumber":170,"author":{"gitId":"-"},"content":"/**","lastModifiedDate":"2020-07-29"},{"lineNumber":171,"author":{"gitId":"-"},"content":" * Returns the last value of {@code prefix}.","lastModifiedDate":"2020-07-29"},{"lineNumber":172,"author":{"gitId":"-"},"content":" */","lastModifiedDate":"2020-07-29"},{"lineNumber":173,"author":{"gitId":"-"},"content":"public Optional\u003cString\u003e getValue(Prefix prefix) {","lastModifiedDate":"2020-07-29"},{"lineNumber":174,"author":{"gitId":"-"},"content":" List\u003cString\u003e values \u003d getAllValues(prefix);","lastModifiedDate":"2020-07-29"},{"lineNumber":175,"author":{"gitId":"-"},"content":" return values.isEmpty() ? Optional.empty() :","lastModifiedDate":"2020-07-29"},{"lineNumber":176,"author":{"gitId":"-"},"content":" Optional.of(values.get(values.size() - 1));","lastModifiedDate":"2020-07-29"},{"lineNumber":177,"author":{"gitId":"-"},"content":"}","lastModifiedDate":"2020-07-29"},{"lineNumber":178,"author":{"gitId":"-"},"content":"```","lastModifiedDate":"2020-07-29"},{"lineNumber":179,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-07-29"},{"lineNumber":180,"author":{"gitId":"-"},"content":"This appears to be what we need to get a String of the remark. But what about the Index? Let\u0027s take a quick peek at existing `Command` that uses an index to see how it is done.","lastModifiedDate":"2020-07-29"},{"lineNumber":181,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-07-29"},{"lineNumber":182,"author":{"gitId":"-"},"content":"**`DeleteCommandParser.java`:**","lastModifiedDate":"2020-07-29"},{"lineNumber":183,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-07-29"},{"lineNumber":184,"author":{"gitId":"-"},"content":"``` java","lastModifiedDate":"2020-07-29"},{"lineNumber":185,"author":{"gitId":"-"},"content":"Index index \u003d ParserUtil.parseIndex(args);","lastModifiedDate":"2020-07-29"},{"lineNumber":186,"author":{"gitId":"-"},"content":"return new DeleteCommand(index);","lastModifiedDate":"2020-07-29"},{"lineNumber":187,"author":{"gitId":"-"},"content":"```","lastModifiedDate":"2020-07-29"},{"lineNumber":188,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-07-29"},{"lineNumber":189,"author":{"gitId":"-"},"content":"There appears to be another utility class that obtains an `Index` from the input provided by the user.","lastModifiedDate":"2020-07-29"},{"lineNumber":190,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-07-29"},{"lineNumber":191,"author":{"gitId":"-"},"content":"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.","lastModifiedDate":"2020-07-29"},{"lineNumber":192,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-07-29"},{"lineNumber":193,"author":{"gitId":"-"},"content":"**`RemarkCommandParser.java`:**","lastModifiedDate":"2020-07-29"},{"lineNumber":194,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-07-29"},{"lineNumber":195,"author":{"gitId":"-"},"content":"``` java","lastModifiedDate":"2020-07-29"},{"lineNumber":196,"author":{"gitId":"-"},"content":"public RemarkCommand parse(String args) throws ParseException {","lastModifiedDate":"2020-07-29"},{"lineNumber":197,"author":{"gitId":"-"},"content":" requireNonNull(args);","lastModifiedDate":"2020-07-29"},{"lineNumber":198,"author":{"gitId":"-"},"content":" ArgumentMultimap argMultimap \u003d ArgumentTokenizer.tokenize(args,","lastModifiedDate":"2020-07-29"},{"lineNumber":199,"author":{"gitId":"-"},"content":" PREFIX_REMARK);","lastModifiedDate":"2020-07-29"},{"lineNumber":200,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-07-29"},{"lineNumber":201,"author":{"gitId":"-"},"content":" Index index;","lastModifiedDate":"2020-07-29"},{"lineNumber":202,"author":{"gitId":"-"},"content":" try {","lastModifiedDate":"2020-07-29"},{"lineNumber":203,"author":{"gitId":"-"},"content":" index \u003d ParserUtil.parseIndex(argMultimap.getPreamble());","lastModifiedDate":"2020-07-29"},{"lineNumber":204,"author":{"gitId":"-"},"content":" } catch (IllegalValueException ive) {","lastModifiedDate":"2020-07-29"},{"lineNumber":205,"author":{"gitId":"-"},"content":" throw new ParseException(String.format(MESSAGE_INVALID_COMMAND_FORMAT,","lastModifiedDate":"2020-07-29"},{"lineNumber":206,"author":{"gitId":"-"},"content":" RemarkCommand.MESSAGE_USAGE), ive);","lastModifiedDate":"2020-07-29"},{"lineNumber":207,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2020-07-29"},{"lineNumber":208,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-07-29"},{"lineNumber":209,"author":{"gitId":"-"},"content":" String remark \u003d argMultimap.getValue(PREFIX_REMARK).orElse(\"\");","lastModifiedDate":"2020-07-29"},{"lineNumber":210,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-07-29"},{"lineNumber":211,"author":{"gitId":"-"},"content":" return new RemarkCommand(index, remark);","lastModifiedDate":"2020-07-29"},{"lineNumber":212,"author":{"gitId":"-"},"content":"}","lastModifiedDate":"2020-07-29"},{"lineNumber":213,"author":{"gitId":"-"},"content":"```","lastModifiedDate":"2020-07-29"},{"lineNumber":214,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-07-29"},{"lineNumber":215,"author":{"gitId":"jieqiboh"},"content":"\u003cdiv markdown\u003d\"span\" class\u003d\"alert alert-primary\"\u003e","lastModifiedDate":"2024-03-02"},{"lineNumber":216,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-07-29"},{"lineNumber":217,"author":{"gitId":"jieqiboh"},"content":":information_source: Don’t forget to update `AddressBookParser` to use our new `RemarkCommandParser`!","lastModifiedDate":"2024-03-02"},{"lineNumber":218,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-07-29"},{"lineNumber":219,"author":{"gitId":"jieqiboh"},"content":"\u003c/div\u003e","lastModifiedDate":"2024-03-02"},{"lineNumber":220,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-07-29"},{"lineNumber":221,"author":{"gitId":"-"},"content":"If you are stuck, check out the sample","lastModifiedDate":"2020-07-29"},{"lineNumber":222,"author":{"gitId":"-"},"content":"[here](https://github.com/se-edu/addressbook-level3/commit/dc6d5139d08f6403da0ec624ea32bd79a2ae0cbf#diff-8bf239e8e9529369b577701303ddd96af93178b4ed6735f91c2d8488b20c6b4a).","lastModifiedDate":"2022-01-02"},{"lineNumber":223,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-07-29"},{"lineNumber":224,"author":{"gitId":"-"},"content":"## Add `Remark` to the model","lastModifiedDate":"2020-07-29"},{"lineNumber":225,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-07-29"},{"lineNumber":226,"author":{"gitId":"-"},"content":"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.","lastModifiedDate":"2020-07-29"},{"lineNumber":227,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-07-29"},{"lineNumber":228,"author":{"gitId":"-"},"content":"### Add a new `Remark` class","lastModifiedDate":"2020-07-29"},{"lineNumber":229,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-07-29"},{"lineNumber":230,"author":{"gitId":"-"},"content":"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.","lastModifiedDate":"2020-07-29"},{"lineNumber":231,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-07-29"},{"lineNumber":232,"author":{"gitId":"-"},"content":"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","lastModifiedDate":"2022-01-02"},{"lineNumber":233,"author":{"gitId":"-"},"content":"validation.","lastModifiedDate":"2020-07-29"},{"lineNumber":234,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-07-29"},{"lineNumber":235,"author":{"gitId":"-"},"content":"### Make use of `Remark`","lastModifiedDate":"2020-07-29"},{"lineNumber":236,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-07-29"},{"lineNumber":237,"author":{"gitId":"-"},"content":"Let’s change `RemarkCommand` and `RemarkCommandParser` to use the new `Remark` class instead of plain `String`. These should be relatively simple changes.","lastModifiedDate":"2020-07-29"},{"lineNumber":238,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-07-29"},{"lineNumber":239,"author":{"gitId":"-"},"content":"## Add a placeholder element for remark to the UI","lastModifiedDate":"2020-07-29"},{"lineNumber":240,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-07-29"},{"lineNumber":241,"author":{"gitId":"-"},"content":"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.","lastModifiedDate":"2020-07-29"},{"lineNumber":242,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-07-29"},{"lineNumber":243,"author":{"gitId":"-"},"content":"Simply add the following to [`seedu.address.ui.PersonCard`](https://github.com/se-edu/addressbook-level3/commit/850b78879582f38accb05dd20c245963c65ea599#diff-639834f1e05afe2276a86372adf0fe5f69314642c2d93cfa543d614ce5a76688).","lastModifiedDate":"2022-01-02"},{"lineNumber":244,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-07-29"},{"lineNumber":245,"author":{"gitId":"-"},"content":"**`PersonCard.java`:**","lastModifiedDate":"2020-07-29"},{"lineNumber":246,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-07-29"},{"lineNumber":247,"author":{"gitId":"-"},"content":"``` java","lastModifiedDate":"2020-07-29"},{"lineNumber":248,"author":{"gitId":"-"},"content":"@FXML","lastModifiedDate":"2020-07-29"},{"lineNumber":249,"author":{"gitId":"-"},"content":"private Label remark;","lastModifiedDate":"2020-07-29"},{"lineNumber":250,"author":{"gitId":"-"},"content":"```","lastModifiedDate":"2020-07-29"},{"lineNumber":251,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-07-29"},{"lineNumber":252,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-07-29"},{"lineNumber":253,"author":{"gitId":"-"},"content":"`@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.","lastModifiedDate":"2020-07-29"},{"lineNumber":254,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-07-29"},{"lineNumber":255,"author":{"gitId":"-"},"content":"Then insert the following into [`main/resources/view/PersonListCard.fxml`](https://github.com/se-edu/addressbook-level3/commit/850b78879582f38accb05dd20c245963c65ea599#diff-d44c4f51c24f6253c277a2bb9bc440b8064d9c15ad7cb7ceda280bca032efce9).","lastModifiedDate":"2022-01-02"},{"lineNumber":256,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-07-29"},{"lineNumber":257,"author":{"gitId":"-"},"content":"**`PersonListCard.fxml`:**","lastModifiedDate":"2020-07-29"},{"lineNumber":258,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-07-29"},{"lineNumber":259,"author":{"gitId":"-"},"content":"``` xml","lastModifiedDate":"2020-07-29"},{"lineNumber":260,"author":{"gitId":"-"},"content":"\u003cLabel fx:id\u003d\"remark\" styleClass\u003d\"cell_small_label\" text\u003d\"\\$remark\" /\u003e","lastModifiedDate":"2020-07-29"},{"lineNumber":261,"author":{"gitId":"-"},"content":"```","lastModifiedDate":"2020-07-29"},{"lineNumber":262,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-07-29"},{"lineNumber":263,"author":{"gitId":"-"},"content":"That’s it! Fire up the application again and you should see something like this:","lastModifiedDate":"2020-07-29"},{"lineNumber":264,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-07-29"},{"lineNumber":265,"author":{"gitId":"-"},"content":"![$remark shows up in each entry](../images/add-remark/$Remark.png)","lastModifiedDate":"2020-07-29"},{"lineNumber":266,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-07-29"},{"lineNumber":267,"author":{"gitId":"-"},"content":"## Modify `Person` to support a `Remark` field","lastModifiedDate":"2020-07-29"},{"lineNumber":268,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-07-29"},{"lineNumber":269,"author":{"gitId":"-"},"content":"Since `PersonCard` displays data from a `Person`, we need to update `Person` to get our `Remark` displayed!","lastModifiedDate":"2020-07-29"},{"lineNumber":270,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-07-29"},{"lineNumber":271,"author":{"gitId":"-"},"content":"### Modify `Person`","lastModifiedDate":"2020-07-29"},{"lineNumber":272,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-07-29"},{"lineNumber":273,"author":{"gitId":"-"},"content":"We change the constructor of `Person` to take a `Remark`. We will also need to define new fields and accessors accordingly to store our new addition.","lastModifiedDate":"2020-07-29"},{"lineNumber":274,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-07-29"},{"lineNumber":275,"author":{"gitId":"-"},"content":"### Update other usages of `Person`","lastModifiedDate":"2020-07-29"},{"lineNumber":276,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-07-29"},{"lineNumber":277,"author":{"gitId":"-"},"content":"Unfortunately, a change to `Person` will cause other commands to break, you will have to modify these commands to use the updated `Person`!","lastModifiedDate":"2020-07-29"},{"lineNumber":278,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-07-29"},{"lineNumber":279,"author":{"gitId":"jieqiboh"},"content":"\u003cdiv markdown\u003d\"span\" class\u003d\"alert alert-primary\"\u003e","lastModifiedDate":"2024-03-02"},{"lineNumber":280,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-07-29"},{"lineNumber":281,"author":{"gitId":"jieqiboh"},"content":":bulb: Use the `Find Usages` feature in IntelliJ IDEA on the `Person` class to find these commands.","lastModifiedDate":"2024-03-02"},{"lineNumber":282,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-07-29"},{"lineNumber":283,"author":{"gitId":"jieqiboh"},"content":"\u003c/div\u003e","lastModifiedDate":"2024-03-02"},{"lineNumber":284,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-07-29"},{"lineNumber":285,"author":{"gitId":"-"},"content":"Refer to [this commit](https://github.com/se-edu/addressbook-level3/commit/ce998c37e65b92d35c91d28c7822cd139c2c0a5c) and check that you have got everything in order!","lastModifiedDate":"2020-07-29"},{"lineNumber":286,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-07-29"},{"lineNumber":287,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-07-29"},{"lineNumber":288,"author":{"gitId":"-"},"content":"## Updating Storage","lastModifiedDate":"2020-07-29"},{"lineNumber":289,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-07-29"},{"lineNumber":290,"author":{"gitId":"-"},"content":"AddressBook stores data by serializing `JsonAdaptedPerson` into `json` with the help of an external library — Jackson. Let’s update `JsonAdaptedPerson` to work with our new `Person`!","lastModifiedDate":"2020-07-29"},{"lineNumber":291,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-07-29"},{"lineNumber":292,"author":{"gitId":"-"},"content":"While the changes to code may be minimal, the test data will have to be updated as well.","lastModifiedDate":"2020-07-29"},{"lineNumber":293,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-07-29"},{"lineNumber":294,"author":{"gitId":"jieqiboh"},"content":"\u003cdiv markdown\u003d\"span\" class\u003d\"alert alert-warning\"\u003e","lastModifiedDate":"2024-03-02"},{"lineNumber":295,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-07-29"},{"lineNumber":296,"author":{"gitId":"jieqiboh"},"content":":exclamation: You must delete AddressBook’s storage file located at `/data/addressbook.json` before running it! Not doing so will cause AddressBook to default to an empty address book!","lastModifiedDate":"2024-03-02"},{"lineNumber":297,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-07-29"},{"lineNumber":298,"author":{"gitId":"jieqiboh"},"content":"\u003c/div\u003e","lastModifiedDate":"2024-03-02"},{"lineNumber":299,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-07-29"},{"lineNumber":300,"author":{"gitId":"-"},"content":"Check out [this commit](https://github.com/se-edu/addressbook-level3/commit/556cbd0e03ff224d7a68afba171ad2eb0ce56bbf)","lastModifiedDate":"2020-07-29"},{"lineNumber":301,"author":{"gitId":"-"},"content":"to see what the changes entail.","lastModifiedDate":"2020-07-29"},{"lineNumber":302,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-07-29"},{"lineNumber":303,"author":{"gitId":"-"},"content":"## Finalizing the UI","lastModifiedDate":"2020-07-29"},{"lineNumber":304,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-07-29"},{"lineNumber":305,"author":{"gitId":"-"},"content":"Now that we have finalized the `Person` class and its dependencies, we can now bind the `Remark` field to the UI.","lastModifiedDate":"2020-07-29"},{"lineNumber":306,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-07-29"},{"lineNumber":307,"author":{"gitId":"-"},"content":"Just add [this one line of code!](https://github.com/se-edu/addressbook-level3/commit/5b98fee11b6b3f5749b6b943c4f3bd3aa049b692)","lastModifiedDate":"2020-07-29"},{"lineNumber":308,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-07-29"},{"lineNumber":309,"author":{"gitId":"-"},"content":"**`PersonCard.java`:**","lastModifiedDate":"2020-07-29"},{"lineNumber":310,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-07-29"},{"lineNumber":311,"author":{"gitId":"-"},"content":"``` java","lastModifiedDate":"2020-07-29"},{"lineNumber":312,"author":{"gitId":"-"},"content":"public PersonCard(Person person, int displayedIndex) {","lastModifiedDate":"2020-07-29"},{"lineNumber":313,"author":{"gitId":"-"},"content":" //...","lastModifiedDate":"2020-07-29"},{"lineNumber":314,"author":{"gitId":"-"},"content":" remark.setText(person.getRemark().value);","lastModifiedDate":"2020-07-29"},{"lineNumber":315,"author":{"gitId":"-"},"content":"}","lastModifiedDate":"2020-07-29"},{"lineNumber":316,"author":{"gitId":"-"},"content":"```","lastModifiedDate":"2020-07-29"},{"lineNumber":317,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-07-29"},{"lineNumber":318,"author":{"gitId":"-"},"content":"![The remark label is bound properly!](../images/add-remark/RemarkBound.png)","lastModifiedDate":"2020-07-29"},{"lineNumber":319,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-07-29"},{"lineNumber":320,"author":{"gitId":"-"},"content":"## Putting everything together","lastModifiedDate":"2020-07-29"},{"lineNumber":321,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-07-29"},{"lineNumber":322,"author":{"gitId":"-"},"content":"After the previous step, we notice a peculiar regression — we went from displaying something to nothing at all. However, this is expected behavior as we are yet to update the `RemarkCommand` to make use of the code we\u0027ve been adding in the last few steps.","lastModifiedDate":"2020-07-29"},{"lineNumber":323,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-07-29"},{"lineNumber":324,"author":{"gitId":"-"},"content":"### Update `RemarkCommand` and `RemarkCommandParser`","lastModifiedDate":"2020-07-29"},{"lineNumber":325,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-07-29"},{"lineNumber":326,"author":{"gitId":"-"},"content":"In this last step, we modify `RemarkCommand#execute()` to change the `Remark` of a `Person`. Since all fields in a `Person` are immutable, we create a new instance of a `Person` with the values that we want and","lastModifiedDate":"2020-07-29"},{"lineNumber":327,"author":{"gitId":"-"},"content":"save it with `Model#setPerson()`.","lastModifiedDate":"2020-07-29"},{"lineNumber":328,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-07-29"},{"lineNumber":329,"author":{"gitId":"-"},"content":"**`RemarkCommand.java`:**","lastModifiedDate":"2020-07-29"},{"lineNumber":330,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-07-29"},{"lineNumber":331,"author":{"gitId":"-"},"content":"``` java","lastModifiedDate":"2020-07-29"},{"lineNumber":332,"author":{"gitId":"-"},"content":"//...","lastModifiedDate":"2020-07-29"},{"lineNumber":333,"author":{"gitId":"-"},"content":" public static final String MESSAGE_ADD_REMARK_SUCCESS \u003d \"Added remark to Person: %1$s\";","lastModifiedDate":"2020-07-29"},{"lineNumber":334,"author":{"gitId":"-"},"content":" public static final String MESSAGE_DELETE_REMARK_SUCCESS \u003d \"Removed remark from Person: %1$s\";","lastModifiedDate":"2020-07-29"},{"lineNumber":335,"author":{"gitId":"-"},"content":"//...","lastModifiedDate":"2020-07-29"},{"lineNumber":336,"author":{"gitId":"-"},"content":" @Override","lastModifiedDate":"2020-07-29"},{"lineNumber":337,"author":{"gitId":"-"},"content":" public CommandResult execute(Model model) throws CommandException {","lastModifiedDate":"2020-07-29"},{"lineNumber":338,"author":{"gitId":"-"},"content":" List\u003cPerson\u003e lastShownList \u003d model.getFilteredPersonList();","lastModifiedDate":"2020-07-29"},{"lineNumber":339,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-07-29"},{"lineNumber":340,"author":{"gitId":"-"},"content":" if (index.getZeroBased() \u003e\u003d lastShownList.size()) {","lastModifiedDate":"2020-07-29"},{"lineNumber":341,"author":{"gitId":"-"},"content":" throw new CommandException(Messages.MESSAGE_INVALID_PERSON_DISPLAYED_INDEX);","lastModifiedDate":"2020-07-29"},{"lineNumber":342,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2020-07-29"},{"lineNumber":343,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-07-29"},{"lineNumber":344,"author":{"gitId":"-"},"content":" Person personToEdit \u003d lastShownList.get(index.getZeroBased());","lastModifiedDate":"2020-07-29"},{"lineNumber":345,"author":{"gitId":"-"},"content":" Person editedPerson \u003d new Person(","lastModifiedDate":"2021-08-01"},{"lineNumber":346,"author":{"gitId":"-"},"content":" personToEdit.getName(), personToEdit.getPhone(), personToEdit.getEmail(),","lastModifiedDate":"2021-08-01"},{"lineNumber":347,"author":{"gitId":"-"},"content":" personToEdit.getAddress(), remark, personToEdit.getTags());","lastModifiedDate":"2020-07-29"},{"lineNumber":348,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-07-29"},{"lineNumber":349,"author":{"gitId":"-"},"content":" model.setPerson(personToEdit, editedPerson);","lastModifiedDate":"2020-07-29"},{"lineNumber":350,"author":{"gitId":"-"},"content":" model.updateFilteredPersonList(PREDICATE_SHOW_ALL_PERSONS);","lastModifiedDate":"2020-07-29"},{"lineNumber":351,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-07-29"},{"lineNumber":352,"author":{"gitId":"-"},"content":" return new CommandResult(generateSuccessMessage(editedPerson));","lastModifiedDate":"2020-07-29"},{"lineNumber":353,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2020-07-29"},{"lineNumber":354,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-07-29"},{"lineNumber":355,"author":{"gitId":"-"},"content":" /**","lastModifiedDate":"2020-07-29"},{"lineNumber":356,"author":{"gitId":"-"},"content":" * Generates a command execution success message based on whether","lastModifiedDate":"2021-08-01"},{"lineNumber":357,"author":{"gitId":"-"},"content":" * the remark is added to or removed from","lastModifiedDate":"2021-08-01"},{"lineNumber":358,"author":{"gitId":"-"},"content":" * {@code personToEdit}.","lastModifiedDate":"2020-07-29"},{"lineNumber":359,"author":{"gitId":"-"},"content":" */","lastModifiedDate":"2020-07-29"},{"lineNumber":360,"author":{"gitId":"-"},"content":" private String generateSuccessMessage(Person personToEdit) {","lastModifiedDate":"2020-07-29"},{"lineNumber":361,"author":{"gitId":"-"},"content":" String message \u003d !remark.value.isEmpty() ? MESSAGE_ADD_REMARK_SUCCESS : MESSAGE_DELETE_REMARK_SUCCESS;","lastModifiedDate":"2020-07-29"},{"lineNumber":362,"author":{"gitId":"-"},"content":" return String.format(message, personToEdit);","lastModifiedDate":"2020-07-29"},{"lineNumber":363,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2020-07-29"},{"lineNumber":364,"author":{"gitId":"-"},"content":"```","lastModifiedDate":"2020-07-29"},{"lineNumber":365,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-07-29"},{"lineNumber":366,"author":{"gitId":"-"},"content":"![Congratulations!](../images/add-remark/RemarkComplete.png)","lastModifiedDate":"2020-07-29"},{"lineNumber":367,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-07-29"},{"lineNumber":368,"author":{"gitId":"-"},"content":"## Writing tests","lastModifiedDate":"2020-07-29"},{"lineNumber":369,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-07-29"},{"lineNumber":370,"author":{"gitId":"-"},"content":"Tests are crucial to ensuring that bugs don’t slip into the codebase unnoticed. This is especially true for large code bases where a change might lead to unintended behavior.","lastModifiedDate":"2020-07-29"},{"lineNumber":371,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-07-29"},{"lineNumber":372,"author":{"gitId":"-"},"content":"Let’s verify the correctness of our code by writing some tests!","lastModifiedDate":"2020-07-29"},{"lineNumber":373,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-07-29"},{"lineNumber":374,"author":{"gitId":"-"},"content":"Of course you can simply add the test cases manually, like you\u0027ve been doing all along this tutorial. The result would be like the test cases in [here](https://github.com/se-edu/addressbook-level3/commit/fac8f3fd855d55831ca0cc73313b5943d49d4d6e#diff-ff58f7c10338b34f76645df49b71ecb2bafaf7611b20e7ff59ebc98475538a01). Alternatively, you can get the help of IntelliJ to generate the skeletons of the test cases, as explained in the next section.","lastModifiedDate":"2022-01-02"},{"lineNumber":375,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2021-08-01"},{"lineNumber":376,"author":{"gitId":"-"},"content":"### Automatically generating tests","lastModifiedDate":"2020-07-29"},{"lineNumber":377,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-07-29"},{"lineNumber":378,"author":{"gitId":"-"},"content":"The goal is to write effective and efficient tests to ensure that `RemarkCommand#execute()` behaves as expected.","lastModifiedDate":"2020-07-29"},{"lineNumber":379,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-07-29"},{"lineNumber":380,"author":{"gitId":"-"},"content":"The convention for test names is `methodName_testScenario_expectedResult`. An example would be","lastModifiedDate":"2020-07-29"},{"lineNumber":381,"author":{"gitId":"-"},"content":"`execute_filteredList_success`.","lastModifiedDate":"2020-07-29"},{"lineNumber":382,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-07-29"},{"lineNumber":383,"author":{"gitId":"-"},"content":"Let’s create a test for `RemarkCommand#execute()` to test that adding a remark works. On `IntelliJ IDEA` you can bring up the context menu and choose to `Go To` \\\u003e `Test` or use the appropriate keyboard shortcut.","lastModifiedDate":"2020-07-29"},{"lineNumber":384,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-07-29"},{"lineNumber":385,"author":{"gitId":"-"},"content":"![Using the context menu to jump to tests](../images/add-remark/ContextMenu.png)","lastModifiedDate":"2020-07-29"},{"lineNumber":386,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-07-29"},{"lineNumber":387,"author":{"gitId":"-"},"content":"Then, create a test for the `execute` method.","lastModifiedDate":"2020-07-29"},{"lineNumber":388,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-07-29"},{"lineNumber":389,"author":{"gitId":"-"},"content":"![Creating a test for `execute`.](../images/add-remark/CreateTest.png)","lastModifiedDate":"2020-07-29"},{"lineNumber":390,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-07-29"},{"lineNumber":391,"author":{"gitId":"-"},"content":"Following convention, let’s change the name of the generated method to `execute_addRemarkUnfilteredList_success`.","lastModifiedDate":"2020-07-29"},{"lineNumber":392,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-07-29"},{"lineNumber":393,"author":{"gitId":"-"},"content":"Let’s use the utility functions provided in `CommandTestUtil`. The functions ensure that commands produce the expected `CommandResult` and output the correct message. In this case, `CommandTestUtil#assertCommandSuccess` is the best fit as we are testing that a `RemarkCommand` will successfully add a `Remark`.","lastModifiedDate":"2020-07-29"},{"lineNumber":394,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-07-29"},{"lineNumber":395,"author":{"gitId":"-"},"content":"You should end up with a test that looks something like [this](https://github.com/se-edu/addressbook-level3/commit/fac8f3fd855d55831ca0cc73313b5943d49d4d6e#diff-ff58f7c10338b34f76645df49b71ecb2bafaf7611b20e7ff59ebc98475538a01R36-R49).","lastModifiedDate":"2022-01-02"},{"lineNumber":396,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-07-29"},{"lineNumber":397,"author":{"gitId":"-"},"content":"## Conclusion","lastModifiedDate":"2020-07-29"},{"lineNumber":398,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-07-29"},{"lineNumber":399,"author":{"gitId":"-"},"content":"This concludes the tutorial for adding a new `Command` to AddressBook.","lastModifiedDate":"2020-07-29"}],"authorContributionMap":{"jieqiboh":12,"-":387}},{"path":"docs/tutorials/RemovingFields.md","fileType":"docs","lines":[{"lineNumber":1,"author":{"gitId":"-"},"content":"---","lastModifiedDate":"2020-05-23"},{"lineNumber":2,"author":{"gitId":"jieqiboh"},"content":"layout: page","lastModifiedDate":"2024-03-02"},{"lineNumber":3,"author":{"gitId":"-"},"content":"title: \"Tutorial: Removing Fields\"","lastModifiedDate":"2020-05-23"},{"lineNumber":4,"author":{"gitId":"-"},"content":"---","lastModifiedDate":"2020-05-23"},{"lineNumber":5,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":6,"author":{"gitId":"-"},"content":"\u003e Perfection is achieved, not when there is nothing more to add, but when there is nothing left to take away.","lastModifiedDate":"2020-05-23"},{"lineNumber":7,"author":{"gitId":"-"},"content":"\u003e","lastModifiedDate":"2020-05-23"},{"lineNumber":8,"author":{"gitId":"-"},"content":"\u003e — Antoine de Saint-Exupery","lastModifiedDate":"2020-05-23"},{"lineNumber":9,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":10,"author":{"gitId":"-"},"content":"When working on an existing code base, you will most likely find that some features that are no longer necessary.","lastModifiedDate":"2021-08-01"},{"lineNumber":11,"author":{"gitId":"-"},"content":"This tutorial aims to give you some practice on such a code \u0027removal\u0027 activity by removing the `address` field from `Person` class.","lastModifiedDate":"2021-08-01"},{"lineNumber":12,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2021-08-01"},{"lineNumber":13,"author":{"gitId":"jieqiboh"},"content":"\u003cdiv markdown\u003d\"span\" class\u003d\"alert alert-success\"\u003e","lastModifiedDate":"2024-03-02"},{"lineNumber":14,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2021-08-01"},{"lineNumber":15,"author":{"gitId":"-"},"content":"**If you have done the [Add `remark` command tutorial](AddRemark.html) already**, you should know where the code had to be updated to add the field `remark`. From that experience, you can deduce where the code needs to be changed to _remove_ that field too. The removing of the `address` field can be done similarly.","lastModifiedDate":"2021-08-01"},{"lineNumber":16,"author":{"gitId":"-"},"content":"\u003cbr\u003e","lastModifiedDate":"2021-08-01"},{"lineNumber":17,"author":{"gitId":"-"},"content":"\u003cbr\u003e","lastModifiedDate":"2021-08-01"},{"lineNumber":18,"author":{"gitId":"-"},"content":"However, if you have no such prior knowledge, removing a field can take a quite a bit of detective work. This tutorial takes you through that process. **At least have a read even if you don\u0027t actually do the steps yourself.**","lastModifiedDate":"2021-08-01"},{"lineNumber":19,"author":{"gitId":"jieqiboh"},"content":"\u003c/div\u003e","lastModifiedDate":"2024-03-02"},{"lineNumber":20,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":21,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":22,"author":{"gitId":"jieqiboh"},"content":"* Table of Contents","lastModifiedDate":"2024-03-02"},{"lineNumber":23,"author":{"gitId":"jieqiboh"},"content":"{:toc}","lastModifiedDate":"2024-03-02"},{"lineNumber":24,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":25,"author":{"gitId":"-"},"content":"## Safely deleting `Address`","lastModifiedDate":"2020-05-23"},{"lineNumber":26,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":27,"author":{"gitId":"-"},"content":"IntelliJ IDEA provides a refactoring tool that can identify *most* parts of a removal easily. Let’s try to use it as much as we can.","lastModifiedDate":"2021-08-01"},{"lineNumber":28,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":29,"author":{"gitId":"-"},"content":"### Assisted refactoring","lastModifiedDate":"2020-05-23"},{"lineNumber":30,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":31,"author":{"gitId":"-"},"content":"The `address` field in `Person` is actually an instance of the `seedu.address.model.person.Address` class. Since removing the `Address` class will break the application, we start by identifying `Address`\u0027s usages. This allows us to see code that depends on `Address` to function properly and edit them on a case-by-case basis. Right-click the `Address` class and select `Refactor` \\\u003e `Safe Delete` through the menu.","lastModifiedDate":"2020-05-23"},{"lineNumber":32,"author":{"gitId":"-"},"content":"* :bulb: To make things simpler, you can unselect the options `Search in comments and strings` and `Search for text occurrences`","lastModifiedDate":"2021-08-01"},{"lineNumber":33,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":34,"author":{"gitId":"-"},"content":"![Usages detected](../images/remove/UnsafeDelete.png)","lastModifiedDate":"2020-05-23"},{"lineNumber":35,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":36,"author":{"gitId":"-"},"content":"Choose to `View Usages` and you should be presented with a list of `Safe Delete Conflicts`. These conflicts describe locations in which the `Address` class is used.","lastModifiedDate":"2020-05-23"},{"lineNumber":37,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":38,"author":{"gitId":"-"},"content":"![List of conflicts](../images/remove/SafeDeleteConflicts.png)","lastModifiedDate":"2020-05-23"},{"lineNumber":39,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":40,"author":{"gitId":"-"},"content":"Remove usages of `Address` by performing `Safe Delete`s on each entry i.e., double-click on the entry (which takes you to the code in concern, right-click on that entity, and choose `Refactor` -\u003e `Safe delete` as before). You will need to exercise discretion when removing usages of `Address`. Functions like `ParserUtil#parseAddress()` can be safely removed but its usages must be removed as well. Other usages like in `EditPersonDescriptor` may require more careful inspection.","lastModifiedDate":"2021-08-01"},{"lineNumber":41,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":42,"author":{"gitId":"-"},"content":"Let’s try removing references to `Address` in `EditPersonDescriptor`.","lastModifiedDate":"2020-05-23"},{"lineNumber":43,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":44,"author":{"gitId":"-"},"content":"1. Safe delete the field `address` in `EditPersonDescriptor`.","lastModifiedDate":"2020-05-23"},{"lineNumber":45,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":46,"author":{"gitId":"-"},"content":"1. Select `Yes` when prompted to remove getters and setters.","lastModifiedDate":"2020-05-23"},{"lineNumber":47,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":48,"author":{"gitId":"-"},"content":"1. Select `View Usages` again.\u003cbr\u003e","lastModifiedDate":"2020-05-23"},{"lineNumber":49,"author":{"gitId":"-"},"content":" ![UnsafeDeleteOnField](../images/remove/UnsafeDeleteOnField.png)","lastModifiedDate":"2020-05-23"},{"lineNumber":50,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":51,"author":{"gitId":"-"},"content":"1. Remove the usages of `address` and select `Do refactor` when you are done.","lastModifiedDate":"2020-05-23"},{"lineNumber":52,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":53,"author":{"gitId":"jieqiboh"},"content":" \u003cdiv markdown\u003d\"span\" class\u003d\"alert alert-primary\"\u003e","lastModifiedDate":"2024-03-02"},{"lineNumber":54,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":55,"author":{"gitId":"jieqiboh"},"content":" :bulb: **Tip:** Removing usages may result in errors. Exercise discretion and fix them. For example, removing the `address` field from the `Person` class will require you to modify its constructor.","lastModifiedDate":"2024-03-02"},{"lineNumber":56,"author":{"gitId":"jieqiboh"},"content":" \u003c/div\u003e","lastModifiedDate":"2024-03-02"},{"lineNumber":57,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":58,"author":{"gitId":"-"},"content":"1. Repeat the steps for the remaining usages of `Address`","lastModifiedDate":"2020-05-23"},{"lineNumber":59,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":60,"author":{"gitId":"-"},"content":"After you are done, verify that the application still works by compiling and running it again.","lastModifiedDate":"2020-05-23"},{"lineNumber":61,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":62,"author":{"gitId":"-"},"content":"### Manual refactoring","lastModifiedDate":"2020-05-23"},{"lineNumber":63,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":64,"author":{"gitId":"-"},"content":"Unfortunately, there are usages of `Address` that IntelliJ IDEA cannot identify. You can find them by searching for instances of the word `address` in your code (`Edit` \\\u003e `Find` \\\u003e `Find in path`).","lastModifiedDate":"2020-05-23"},{"lineNumber":65,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":66,"author":{"gitId":"-"},"content":"Places of interest to look out for would be resources used by the application. `main/resources` contains images and `fxml` files used by the application and `test/resources` contains test data. For example, there is a `$address` in each `PersonCard` that has not been removed nor identified.","lastModifiedDate":"2020-05-23"},{"lineNumber":67,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":68,"author":{"gitId":"-"},"content":"![$address](../images/remove/$address.png)","lastModifiedDate":"2020-05-23"},{"lineNumber":69,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":70,"author":{"gitId":"-"},"content":"A quick look at the `PersonCard` class and its `fxml` file quickly reveals why it slipped past the automated refactoring.","lastModifiedDate":"2020-05-23"},{"lineNumber":71,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":72,"author":{"gitId":"-"},"content":"**`PersonCard.java`**","lastModifiedDate":"2020-05-23"},{"lineNumber":73,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":74,"author":{"gitId":"-"},"content":"``` java","lastModifiedDate":"2020-05-23"},{"lineNumber":75,"author":{"gitId":"-"},"content":"...","lastModifiedDate":"2020-05-23"},{"lineNumber":76,"author":{"gitId":"-"},"content":"@FXML","lastModifiedDate":"2020-05-23"},{"lineNumber":77,"author":{"gitId":"-"},"content":"private Label address;","lastModifiedDate":"2020-05-23"},{"lineNumber":78,"author":{"gitId":"-"},"content":"...","lastModifiedDate":"2020-05-23"},{"lineNumber":79,"author":{"gitId":"-"},"content":"```","lastModifiedDate":"2020-05-23"},{"lineNumber":80,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":81,"author":{"gitId":"-"},"content":"**`PersonCard.fxml`**","lastModifiedDate":"2020-05-23"},{"lineNumber":82,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":83,"author":{"gitId":"-"},"content":"``` xml","lastModifiedDate":"2020-05-23"},{"lineNumber":84,"author":{"gitId":"-"},"content":"...","lastModifiedDate":"2020-05-23"},{"lineNumber":85,"author":{"gitId":"-"},"content":"\u003cLabel fx:id\u003d\"phone\" styleClass\u003d\"cell_small_label\" text\u003d\"\\$phone\" /\u003e","lastModifiedDate":"2020-05-23"},{"lineNumber":86,"author":{"gitId":"-"},"content":"\u003cLabel fx:id\u003d\"address\" styleClass\u003d\"cell_small_label\" text\u003d\"\\$address\" /\u003e","lastModifiedDate":"2020-05-23"},{"lineNumber":87,"author":{"gitId":"-"},"content":"\u003cLabel fx:id\u003d\"email\" styleClass\u003d\"cell_small_label\" text\u003d\"\\$email\" /\u003e","lastModifiedDate":"2020-05-23"},{"lineNumber":88,"author":{"gitId":"-"},"content":"...","lastModifiedDate":"2020-05-23"},{"lineNumber":89,"author":{"gitId":"-"},"content":"```","lastModifiedDate":"2020-05-23"},{"lineNumber":90,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":91,"author":{"gitId":"-"},"content":"After removing the `Label`, we can proceed to formally test our code. If everything went well, you should have most of your tests pass. Fix any remaining errors until the tests all pass.","lastModifiedDate":"2020-05-23"},{"lineNumber":92,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":93,"author":{"gitId":"-"},"content":"## Tidying up","lastModifiedDate":"2020-05-23"},{"lineNumber":94,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":95,"author":{"gitId":"-"},"content":"At this point, your application is working as intended and all your tests are passing. What’s left to do is to clean up references to `Address` in test data and documentation.","lastModifiedDate":"2020-05-23"},{"lineNumber":96,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":97,"author":{"gitId":"-"},"content":"In `src/test/data/`, data meant for testing purposes are stored. While keeping the `address` field in the json files does not cause the tests to fail, it is not good practice to let cruft from old features accumulate.","lastModifiedDate":"2020-05-23"},{"lineNumber":98,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":99,"author":{"gitId":"-"},"content":"**`invalidPersonAddressBook.json`:**","lastModifiedDate":"2020-05-23"},{"lineNumber":100,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":101,"author":{"gitId":"-"},"content":"```json","lastModifiedDate":"2020-05-23"},{"lineNumber":102,"author":{"gitId":"-"},"content":"{","lastModifiedDate":"2020-05-23"},{"lineNumber":103,"author":{"gitId":"-"},"content":" \"persons\": [ {","lastModifiedDate":"2020-05-23"},{"lineNumber":104,"author":{"gitId":"-"},"content":" \"name\": \"Person with invalid name field: Ha!ns Mu@ster\",","lastModifiedDate":"2020-05-23"},{"lineNumber":105,"author":{"gitId":"-"},"content":" \"phone\": \"9482424\",","lastModifiedDate":"2020-05-23"},{"lineNumber":106,"author":{"gitId":"-"},"content":" \"email\": \"hans@example.com\",","lastModifiedDate":"2020-05-23"},{"lineNumber":107,"author":{"gitId":"-"},"content":" \"address\": \"4th street\"","lastModifiedDate":"2020-05-23"},{"lineNumber":108,"author":{"gitId":"-"},"content":" } ]","lastModifiedDate":"2020-05-23"},{"lineNumber":109,"author":{"gitId":"-"},"content":"}","lastModifiedDate":"2020-05-23"},{"lineNumber":110,"author":{"gitId":"-"},"content":"```","lastModifiedDate":"2020-05-23"},{"lineNumber":111,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":112,"author":{"gitId":"-"},"content":"You can go through each individual `json` file and manually remove the `address` field.","lastModifiedDate":"2020-05-23"}],"authorContributionMap":{"jieqiboh":8,"-":104}},{"path":"docs/tutorials/TracingCode.md","fileType":"docs","lines":[{"lineNumber":1,"author":{"gitId":"-"},"content":"---","lastModifiedDate":"2020-05-23"},{"lineNumber":2,"author":{"gitId":"jieqiboh"},"content":"layout: page","lastModifiedDate":"2024-03-02"},{"lineNumber":3,"author":{"gitId":"-"},"content":"title: \"Tutorial: Tracing code\"","lastModifiedDate":"2020-05-23"},{"lineNumber":4,"author":{"gitId":"-"},"content":"---","lastModifiedDate":"2020-05-23"},{"lineNumber":5,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":6,"author":{"gitId":"-"},"content":"\u003e Indeed, the ratio of time spent reading versus writing is well over 10 to 1. We are constantly reading old code as part of the effort to write new code. …​\\[Therefore,\\] making it easy to read makes it easier to write.","lastModifiedDate":"2020-05-23"},{"lineNumber":7,"author":{"gitId":"-"},"content":"\u003e","lastModifiedDate":"2020-05-23"},{"lineNumber":8,"author":{"gitId":"-"},"content":"\u003e — Robert C. Martin Clean Code: A Handbook of Agile Software Craftsmanship","lastModifiedDate":"2020-05-23"},{"lineNumber":9,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":10,"author":{"gitId":"-"},"content":"When trying to understand an unfamiliar code base, one common strategy used is to trace some representative execution path through the code base. One easy way to trace an execution path is to use a debugger to step through the code. In this tutorial, you will be using the IntelliJ IDEA’s debugger to trace the execution path of a specific user command.","lastModifiedDate":"2020-05-23"},{"lineNumber":11,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":12,"author":{"gitId":"jieqiboh"},"content":"* Table of Contents","lastModifiedDate":"2024-03-02"},{"lineNumber":13,"author":{"gitId":"jieqiboh"},"content":"{:toc}","lastModifiedDate":"2024-03-02"},{"lineNumber":14,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":15,"author":{"gitId":"-"},"content":"## Before we start","lastModifiedDate":"2020-05-23"},{"lineNumber":16,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":17,"author":{"gitId":"-"},"content":"Before we jump into the code, it is useful to get an idea of the overall structure and the high-level behavior of the application. This is provided in the \u0027Architecture\u0027 section of the developer guide. In particular, the architecture diagram (reproduced below), tells us that the App consists of several components.","lastModifiedDate":"2020-05-23"},{"lineNumber":18,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":19,"author":{"gitId":"jieqiboh"},"content":"![ArchitectureDiagram](../images/ArchitectureDiagram.png)","lastModifiedDate":"2024-03-02"},{"lineNumber":20,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":21,"author":{"gitId":"-"},"content":"It also has a sequence diagram (reproduced below) that tells us how a command propagates through the App.","lastModifiedDate":"2020-05-23"},{"lineNumber":22,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":23,"author":{"gitId":"jieqiboh"},"content":"\u003cimg src\u003d\"../images/ArchitectureSequenceDiagram.png\" width\u003d\"550\" /\u003e","lastModifiedDate":"2024-03-02"},{"lineNumber":24,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":25,"author":{"gitId":"-"},"content":"Note how the diagram shows only the execution flows _between_ the main components. That is, it does not show details of the execution path *inside* each component. By hiding those details, the diagram aims to inform the reader about the overall execution path of a command without overwhelming the reader with too much details. In this tutorial, you aim to find those omitted details so that you get a more in-depth understanding of how the code works.","lastModifiedDate":"2021-07-31"},{"lineNumber":26,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":27,"author":{"gitId":"-"},"content":"Before we proceed, ensure that you have done the following:","lastModifiedDate":"2020-05-23"},{"lineNumber":28,"author":{"gitId":"-"},"content":"1. Read the [*Architecture* section of the DG](../DeveloperGuide.md#architecture)","lastModifiedDate":"2020-05-23"},{"lineNumber":29,"author":{"gitId":"-"},"content":"1. Set up the project in Intellij IDEA","lastModifiedDate":"2020-05-23"},{"lineNumber":30,"author":{"gitId":"-"},"content":"1. Learn basic debugging features of Intellij IDEA","lastModifiedDate":"2020-05-23"},{"lineNumber":31,"author":{"gitId":"-"},"content":" * If you are using a different IDE, we\u0027ll leave it to you to figure out the equivalent feature to use in your IDE.","lastModifiedDate":"2021-07-31"},{"lineNumber":32,"author":{"gitId":"-"},"content":" * If you are not using an IDE, we\u0027ll let you figure out how to achieve the same using your coding toolchain.","lastModifiedDate":"2021-07-31"},{"lineNumber":33,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":34,"author":{"gitId":"-"},"content":"## Setting a breakpoint","lastModifiedDate":"2020-05-23"},{"lineNumber":35,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":36,"author":{"gitId":"-"},"content":"As you know, the first step of debugging is to put in a breakpoint where you want the debugger to pause the execution. For example, if you are trying to understand how the App starts up, you would put a breakpoint in the first statement of the `main` method.","lastModifiedDate":"2021-07-31"},{"lineNumber":37,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":38,"author":{"gitId":"-"},"content":"In our case, we would want to begin the tracing at the very point where the App start processing user input (i.e., somewhere in the UI component), and then trace through how the execution proceeds through the UI component. However, the execution path through a GUI is often somewhat obscure due to various *event-driven mechanisms* used by GUI frameworks, which happens to be the case here too. Therefore, let us put the breakpoint where the `UI` transfers control to the `Logic` component.","lastModifiedDate":"2021-07-31"},{"lineNumber":39,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":40,"author":{"gitId":"jieqiboh"},"content":"\u003cimg src\u003d\"../images/ArchitectureSequenceDiagram.png\" width\u003d\"550\" /\u003e","lastModifiedDate":"2024-03-02"},{"lineNumber":41,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2021-07-31"},{"lineNumber":42,"author":{"gitId":"-"},"content":"According to the sequence diagram you saw earlier (and repeated above for reference), the `UI` component yields control to the `Logic` component through a method named `execute`. Searching through the code base for an `execute()` method that belongs to the `Logic` component yields a promising candidate in `seedu.address.logic.Logic`.","lastModifiedDate":"2021-07-31"},{"lineNumber":43,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2021-07-31"},{"lineNumber":44,"author":{"gitId":"-"},"content":"\u003cimg src\u003d\"../images/tracing/searchResultsForExecuteMethod.png\" /\u003e","lastModifiedDate":"2021-07-31"},{"lineNumber":45,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2021-07-31"},{"lineNumber":46,"author":{"gitId":"jieqiboh"},"content":"\u003cdiv markdown\u003d\"span\" class\u003d\"alert alert-primary\"\u003e","lastModifiedDate":"2024-03-02"},{"lineNumber":47,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2021-07-31"},{"lineNumber":48,"author":{"gitId":"jieqiboh"},"content":":bulb: **Intellij Tip:** The [\u0027**Search Everywhere**\u0027 feature](https://www.jetbrains.com/help/idea/searching-everywhere.html) can be used here. In particular, the \u0027**Find Symbol**\u0027 (\u0027Symbol\u0027 here refers to methods, variables, classes etc.) variant of that feature is quite useful here as we are looking for a _method_ named `execute`, not simply the text `execute`.","lastModifiedDate":"2024-03-02"},{"lineNumber":49,"author":{"gitId":"jieqiboh"},"content":"\u003c/div\u003e","lastModifiedDate":"2024-03-02"},{"lineNumber":50,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2021-07-31"},{"lineNumber":51,"author":{"gitId":"-"},"content":"A quick look at the `seedu.address.logic.Logic` (an extract given below) confirms that this indeed might be what we’re looking for.","lastModifiedDate":"2021-07-31"},{"lineNumber":52,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2021-07-31"},{"lineNumber":53,"author":{"gitId":"-"},"content":"```java","lastModifiedDate":"2021-07-31"},{"lineNumber":54,"author":{"gitId":"-"},"content":"public interface Logic {","lastModifiedDate":"2021-07-31"},{"lineNumber":55,"author":{"gitId":"-"},"content":" /**","lastModifiedDate":"2021-07-31"},{"lineNumber":56,"author":{"gitId":"-"},"content":" * Executes the command and returns the result.","lastModifiedDate":"2021-07-31"},{"lineNumber":57,"author":{"gitId":"-"},"content":" * @param commandText The command as entered by the user.","lastModifiedDate":"2021-07-31"},{"lineNumber":58,"author":{"gitId":"-"},"content":" * @return the result of the command execution.","lastModifiedDate":"2021-07-31"},{"lineNumber":59,"author":{"gitId":"-"},"content":" * @throws CommandException If an error occurs during command execution.","lastModifiedDate":"2021-07-31"},{"lineNumber":60,"author":{"gitId":"-"},"content":" * @throws ParseException If an error occurs during parsing.","lastModifiedDate":"2021-07-31"},{"lineNumber":61,"author":{"gitId":"-"},"content":" */","lastModifiedDate":"2021-07-31"},{"lineNumber":62,"author":{"gitId":"-"},"content":" CommandResult execute(String commandText) throws CommandException, ParseException;","lastModifiedDate":"2021-07-31"},{"lineNumber":63,"author":{"gitId":"-"},"content":"...","lastModifiedDate":"2021-07-31"},{"lineNumber":64,"author":{"gitId":"-"},"content":"}","lastModifiedDate":"2021-07-31"},{"lineNumber":65,"author":{"gitId":"-"},"content":"```","lastModifiedDate":"2021-07-31"},{"lineNumber":66,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2021-07-31"},{"lineNumber":67,"author":{"gitId":"-"},"content":"But apparently, this is an interface, not a concrete implementation.","lastModifiedDate":"2021-07-31"},{"lineNumber":68,"author":{"gitId":"-"},"content":"That should be fine because the [Architecture section of the Developer Guide](../DeveloperGuide.html#architecture) tells us that components interact through interfaces. Here\u0027s the relevant diagram:","lastModifiedDate":"2021-07-31"},{"lineNumber":69,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2021-07-31"},{"lineNumber":70,"author":{"gitId":"jieqiboh"},"content":"\u003cimg src\u003d\"../images/ComponentManagers.png\" width\u003d\"300\" /\u003e","lastModifiedDate":"2024-03-02"},{"lineNumber":71,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2021-07-31"},{"lineNumber":72,"author":{"gitId":"-"},"content":"Next, let\u0027s find out which statement(s) in the `UI` code is calling this method, thus transferring control from the `UI` to the `Logic`.","lastModifiedDate":"2021-07-31"},{"lineNumber":73,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2021-07-31"},{"lineNumber":74,"author":{"gitId":"jieqiboh"},"content":"\u003cdiv markdown\u003d\"span\" class\u003d\"alert alert-primary\"\u003e","lastModifiedDate":"2024-03-02"},{"lineNumber":75,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2021-07-31"},{"lineNumber":76,"author":{"gitId":"jieqiboh"},"content":":bulb: **Intellij Tip:** The [\u0027**Find Usages**\u0027 feature](https://www.jetbrains.com/help/idea/find-highlight-usages.html#find-usages) can find from which parts of the code a class/method/variable is being used.","lastModifiedDate":"2024-03-02"},{"lineNumber":77,"author":{"gitId":"jieqiboh"},"content":"\u003c/div\u003e","lastModifiedDate":"2024-03-02"},{"lineNumber":78,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":79,"author":{"gitId":"-"},"content":"![`Find Usages` tool window. `Edit` \\\u003e `Find` \\\u003e `Find Usages`.](../images/tracing/FindUsages.png)","lastModifiedDate":"2020-05-23"},{"lineNumber":80,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":81,"author":{"gitId":"-"},"content":"Bingo\\! `MainWindow#executeCommand()` seems to be exactly what we’re looking for\\!","lastModifiedDate":"2020-05-23"},{"lineNumber":82,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":83,"author":{"gitId":"-"},"content":"Now let’s set the breakpoint. First, double-click the item to reach the corresponding code. Once there, click on the left gutter to set a breakpoint, as shown below.","lastModifiedDate":"2020-05-23"},{"lineNumber":84,"author":{"gitId":"-"},"content":" ![LeftGutter](../images/tracing/LeftGutter.png)","lastModifiedDate":"2020-05-23"},{"lineNumber":85,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":86,"author":{"gitId":"-"},"content":"## Tracing the execution path","lastModifiedDate":"2020-05-23"},{"lineNumber":87,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":88,"author":{"gitId":"-"},"content":"Recall from the User Guide that the `edit` command has the format: `edit INDEX [n/NAME] [p/PHONE] [e/EMAIL] [a/ADDRESS] [t/TAG]…​` For this tutorial we will be issuing the command `edit 1 n/Alice Yeoh`.","lastModifiedDate":"2020-05-23"},{"lineNumber":89,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":90,"author":{"gitId":"jieqiboh"},"content":"\u003cdiv markdown\u003d\"span\" class\u003d\"alert alert-primary\"\u003e","lastModifiedDate":"2024-03-02"},{"lineNumber":91,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":92,"author":{"gitId":"jieqiboh"},"content":":bulb: **Tip:** Over the course of the debugging session, you will encounter every major component in the application. Try to keep track of what happens inside the component and where the execution transfers to another component.","lastModifiedDate":"2024-03-02"},{"lineNumber":93,"author":{"gitId":"jieqiboh"},"content":"\u003c/div\u003e","lastModifiedDate":"2024-03-02"},{"lineNumber":94,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":95,"author":{"gitId":"-"},"content":"1. To start the debugging session, simply `Run` \\\u003e `Debug Main`","lastModifiedDate":"2020-05-23"},{"lineNumber":96,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":97,"author":{"gitId":"-"},"content":"1. When the GUI appears, enter `edit 1 n/Alice Yeoh` into the command box and press `Enter`.","lastModifiedDate":"2021-07-31"},{"lineNumber":98,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":99,"author":{"gitId":"-"},"content":"1. The Debugger tool window should show up and show something like this:\u003cbr\u003e","lastModifiedDate":"2021-07-31"},{"lineNumber":100,"author":{"gitId":"-"},"content":" ![DebuggerStep1](../images/tracing/DebuggerStep1.png)","lastModifiedDate":"2020-05-23"},{"lineNumber":101,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":102,"author":{"gitId":"-"},"content":"1. Use the _Show execution point_ feature to jump to the line of code that we stopped at:\u003cbr\u003e","lastModifiedDate":"2021-07-31"},{"lineNumber":103,"author":{"gitId":"-"},"content":" ![ShowExecutionPoint](../images/tracing/ShowExecutionPoint.png)\u003cbr\u003e","lastModifiedDate":"2021-07-31"},{"lineNumber":104,"author":{"gitId":"-"},"content":" `CommandResult commandResult \u003d logic.execute(commandText);` is the line that you end up at (i.e., the place where we put the breakpoint).","lastModifiedDate":"2021-07-31"},{"lineNumber":105,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":106,"author":{"gitId":"-"},"content":"1. We are interested in the `logic.execute(commandText)` portion of that line so let’s _Step in_ into that method call:\u003cbr\u003e","lastModifiedDate":"2021-07-31"},{"lineNumber":107,"author":{"gitId":"-"},"content":" ![StepInto](../images/tracing/StepInto.png)","lastModifiedDate":"2020-05-23"},{"lineNumber":108,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":109,"author":{"gitId":"-"},"content":"1. We end up in `LogicManager#execute()` (not `Logic#execute` -- but this is expected because we know the `execute()` method in the `Logic` interface is actually implemented by the `LogicManager` class). Let’s take a look at the body of the method. Given below is the same code, with additional explanatory comments.","lastModifiedDate":"2021-07-31"},{"lineNumber":110,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":111,"author":{"gitId":"-"},"content":" **LogicManager\\#execute().**","lastModifiedDate":"2020-05-23"},{"lineNumber":112,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":113,"author":{"gitId":"-"},"content":" ``` java","lastModifiedDate":"2020-05-23"},{"lineNumber":114,"author":{"gitId":"-"},"content":" @Override","lastModifiedDate":"2020-05-23"},{"lineNumber":115,"author":{"gitId":"-"},"content":" public CommandResult execute(String commandText)","lastModifiedDate":"2020-05-23"},{"lineNumber":116,"author":{"gitId":"-"},"content":" throws CommandException, ParseException {","lastModifiedDate":"2020-05-23"},{"lineNumber":117,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":118,"author":{"gitId":"-"},"content":" //Logging, safe to ignore","lastModifiedDate":"2020-05-23"},{"lineNumber":119,"author":{"gitId":"-"},"content":" logger.info(\"----------------[USER COMMAND][\" + commandText + \"]\");","lastModifiedDate":"2020-05-23"},{"lineNumber":120,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":121,"author":{"gitId":"-"},"content":" CommandResult commandResult;","lastModifiedDate":"2020-05-23"},{"lineNumber":122,"author":{"gitId":"-"},"content":" //Parse user input from String to a Command","lastModifiedDate":"2020-05-23"},{"lineNumber":123,"author":{"gitId":"-"},"content":" Command command \u003d addressBookParser.parseCommand(commandText);","lastModifiedDate":"2020-05-23"},{"lineNumber":124,"author":{"gitId":"-"},"content":" //Executes the Command and stores the result","lastModifiedDate":"2020-05-23"},{"lineNumber":125,"author":{"gitId":"-"},"content":" commandResult \u003d command.execute(model);","lastModifiedDate":"2020-05-23"},{"lineNumber":126,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":127,"author":{"gitId":"-"},"content":" try {","lastModifiedDate":"2020-05-23"},{"lineNumber":128,"author":{"gitId":"-"},"content":" //We can deduce that the previous line of code modifies model in some way","lastModifiedDate":"2020-05-23"},{"lineNumber":129,"author":{"gitId":"-"},"content":" // since it\u0027s being stored here.","lastModifiedDate":"2020-05-23"},{"lineNumber":130,"author":{"gitId":"-"},"content":" storage.saveAddressBook(model.getAddressBook());","lastModifiedDate":"2020-05-23"},{"lineNumber":131,"author":{"gitId":"-"},"content":" } catch (IOException ioe) {","lastModifiedDate":"2020-05-23"},{"lineNumber":132,"author":{"gitId":"-"},"content":" throw new CommandException(FILE_OPS_ERROR_MESSAGE + ioe, ioe);","lastModifiedDate":"2020-05-23"},{"lineNumber":133,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2020-05-23"},{"lineNumber":134,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":135,"author":{"gitId":"-"},"content":" return commandResult;","lastModifiedDate":"2020-05-23"},{"lineNumber":136,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2020-05-23"},{"lineNumber":137,"author":{"gitId":"-"},"content":" ```","lastModifiedDate":"2020-05-23"},{"lineNumber":138,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":139,"author":{"gitId":"-"},"content":"1. `LogicManager#execute()` appears to delegate most of the heavy lifting to other components. Let’s take a closer look at each one.","lastModifiedDate":"2020-05-23"},{"lineNumber":140,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":141,"author":{"gitId":"-"},"content":"1. _Step over_ the logging code since it is of no interest to us now.","lastModifiedDate":"2021-07-31"},{"lineNumber":142,"author":{"gitId":"-"},"content":" ![StepOver](../images/tracing/StepOver.png)","lastModifiedDate":"2021-07-31"},{"lineNumber":143,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":144,"author":{"gitId":"-"},"content":"1. _Step into_ the line where user input in parsed from a String to a Command, which should bring you to the `AddressBookParser#parseCommand()` method (partial code given below):","lastModifiedDate":"2021-07-31"},{"lineNumber":145,"author":{"gitId":"-"},"content":" ``` java","lastModifiedDate":"2020-05-23"},{"lineNumber":146,"author":{"gitId":"-"},"content":" public Command parseCommand(String userInput) throws ParseException {","lastModifiedDate":"2020-05-23"},{"lineNumber":147,"author":{"gitId":"-"},"content":" ...","lastModifiedDate":"2020-05-23"},{"lineNumber":148,"author":{"gitId":"-"},"content":" final String commandWord \u003d matcher.group(\"commandWord\");","lastModifiedDate":"2020-05-23"},{"lineNumber":149,"author":{"gitId":"-"},"content":" final String arguments \u003d matcher.group(\"arguments\");","lastModifiedDate":"2020-05-23"},{"lineNumber":150,"author":{"gitId":"-"},"content":" ...","lastModifiedDate":"2020-05-23"},{"lineNumber":151,"author":{"gitId":"-"},"content":" ```","lastModifiedDate":"2020-05-23"},{"lineNumber":152,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":153,"author":{"gitId":"-"},"content":"1. _Step over_ the statements in that method until you reach the `switch` statement. The \u0027Variables\u0027 window now shows the value of both `commandWord` and `arguments`:\u003cbr\u003e","lastModifiedDate":"2021-07-31"},{"lineNumber":154,"author":{"gitId":"-"},"content":" ![Variables](../images/tracing/Variables.png)","lastModifiedDate":"2020-05-23"},{"lineNumber":155,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":156,"author":{"gitId":"-"},"content":"1. We see that the value of `commandWord` is now `edit` but `arguments` is still not processed in any meaningful way.","lastModifiedDate":"2020-05-23"},{"lineNumber":157,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":158,"author":{"gitId":"-"},"content":"1. Stepping through the `switch` block, we end up at a call to `EditCommandParser().parse()` as expected (because the command we typed is an edit command).","lastModifiedDate":"2021-07-31"},{"lineNumber":159,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":160,"author":{"gitId":"-"},"content":" ``` java","lastModifiedDate":"2020-05-23"},{"lineNumber":161,"author":{"gitId":"-"},"content":" ...","lastModifiedDate":"2020-05-23"},{"lineNumber":162,"author":{"gitId":"-"},"content":" case EditCommand.COMMAND_WORD:","lastModifiedDate":"2020-05-23"},{"lineNumber":163,"author":{"gitId":"-"},"content":" return new EditCommandParser().parse(arguments);","lastModifiedDate":"2020-05-23"},{"lineNumber":164,"author":{"gitId":"-"},"content":" ...","lastModifiedDate":"2020-05-23"},{"lineNumber":165,"author":{"gitId":"-"},"content":" ```","lastModifiedDate":"2020-05-23"},{"lineNumber":166,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":167,"author":{"gitId":"-"},"content":"1. Let’s see what `EditCommandParser#parse()` does by stepping into it. You might have to click the \u0027step into\u0027 button multiple times here because there are two method calls in that statement: `EditCommandParser()` and `parse()`.","lastModifiedDate":"2021-07-31"},{"lineNumber":168,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":169,"author":{"gitId":"jieqiboh"},"content":" \u003cdiv markdown\u003d\"span\" class\u003d\"alert alert-primary\"\u003e:bulb: **Intellij Tip:** Sometimes, you might end up stepping into functions that are not of interest. Simply use the `step out` button to get out of them!","lastModifiedDate":"2024-03-02"},{"lineNumber":170,"author":{"gitId":"jieqiboh"},"content":" \u003c/div\u003e","lastModifiedDate":"2024-03-02"},{"lineNumber":171,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":172,"author":{"gitId":"-"},"content":"1. Stepping through the method shows that it calls `ArgumentTokenizer#tokenize()` and `ParserUtil#parseIndex()` to obtain the arguments and index required.","lastModifiedDate":"2021-07-31"},{"lineNumber":173,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2021-07-31"},{"lineNumber":174,"author":{"gitId":"-"},"content":"1. The rest of the method seems to exhaustively check for the existence of each possible parameter of the `edit` command and store any possible changes in an `EditPersonDescriptor`. Recall that we can verify the contents of `editPersonDesciptor` through the \u0027Variables\u0027 window.\u003cbr\u003e","lastModifiedDate":"2021-07-31"},{"lineNumber":175,"author":{"gitId":"-"},"content":" ![EditCommand](../images/tracing/EditCommand.png)","lastModifiedDate":"2020-05-23"},{"lineNumber":176,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":177,"author":{"gitId":"-"},"content":"1. As you just traced through some code involved in parsing a command, you can take a look at this class diagram to see where the various parsing-related classes you encountered fit into the design of the `Logic` component.","lastModifiedDate":"2021-07-31"},{"lineNumber":178,"author":{"gitId":"jieqiboh"},"content":" \u003cimg src\u003d\"../images/ParserClasses.png\" width\u003d\"600\"/\u003e","lastModifiedDate":"2024-03-02"},{"lineNumber":179,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2021-07-31"},{"lineNumber":180,"author":{"gitId":"-"},"content":"1. Let’s continue stepping through until we return to `LogicManager#execute()`.","lastModifiedDate":"2020-05-23"},{"lineNumber":181,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":182,"author":{"gitId":"-"},"content":" The sequence diagram below shows the details of the execution path through the Logic component. Does the execution path you traced in the code so far match the diagram?\u003cbr\u003e","lastModifiedDate":"2021-07-31"},{"lineNumber":183,"author":{"gitId":"jieqiboh"},"content":" ![Tracing an `edit` command through the Logic component](../images/tracing/LogicSequenceDiagram.png)","lastModifiedDate":"2024-03-02"},{"lineNumber":184,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":185,"author":{"gitId":"-"},"content":"1. Now, step over until you read the statement that calls the `execute()` method of the `EditCommand` object received, and step into that `execute()` method (partial code given below):","lastModifiedDate":"2021-07-31"},{"lineNumber":186,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":187,"author":{"gitId":"-"},"content":" **`EditCommand#execute()`:**","lastModifiedDate":"2021-07-31"},{"lineNumber":188,"author":{"gitId":"-"},"content":" ``` java","lastModifiedDate":"2020-05-23"},{"lineNumber":189,"author":{"gitId":"-"},"content":" @Override","lastModifiedDate":"2020-05-23"},{"lineNumber":190,"author":{"gitId":"-"},"content":" public CommandResult execute(Model model) throws CommandException {","lastModifiedDate":"2020-05-23"},{"lineNumber":191,"author":{"gitId":"-"},"content":" ...","lastModifiedDate":"2020-05-23"},{"lineNumber":192,"author":{"gitId":"-"},"content":" Person personToEdit \u003d lastShownList.get(index.getZeroBased());","lastModifiedDate":"2020-05-23"},{"lineNumber":193,"author":{"gitId":"-"},"content":" Person editedPerson \u003d createEditedPerson(personToEdit, editPersonDescriptor);","lastModifiedDate":"2020-05-23"},{"lineNumber":194,"author":{"gitId":"-"},"content":" if (!personToEdit.isSamePerson(editedPerson) \u0026\u0026 model.hasPerson(editedPerson)) {","lastModifiedDate":"2020-05-23"},{"lineNumber":195,"author":{"gitId":"-"},"content":" throw new CommandException(MESSAGE_DUPLICATE_PERSON);","lastModifiedDate":"2020-05-23"},{"lineNumber":196,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2020-05-23"},{"lineNumber":197,"author":{"gitId":"-"},"content":" model.setPerson(personToEdit, editedPerson);","lastModifiedDate":"2020-05-23"},{"lineNumber":198,"author":{"gitId":"-"},"content":" model.updateFilteredPersonList(PREDICATE_SHOW_ALL_PERSONS);","lastModifiedDate":"2020-05-23"},{"lineNumber":199,"author":{"gitId":"-"},"content":" return new CommandResult(String.format(MESSAGE_EDIT_PERSON_SUCCESS, editedPerson));","lastModifiedDate":"2020-05-23"},{"lineNumber":200,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2020-05-23"},{"lineNumber":201,"author":{"gitId":"-"},"content":" ```","lastModifiedDate":"2020-05-23"},{"lineNumber":202,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":203,"author":{"gitId":"-"},"content":"1. As suspected, `command#execute()` does indeed make changes to the `model` object. Specifically,","lastModifiedDate":"2021-07-31"},{"lineNumber":204,"author":{"gitId":"-"},"content":" * it uses the `setPerson()` method (defined in the interface `Model` and implemented in `ModelManager` as per the usual pattern) to update the person data.","lastModifiedDate":"2021-07-31"},{"lineNumber":205,"author":{"gitId":"-"},"content":" * it uses the `updateFilteredPersonList` method to ask the `Model` to populate the \u0027filtered list\u0027 with _all_ persons.\u003cbr\u003e","lastModifiedDate":"2021-07-31"},{"lineNumber":206,"author":{"gitId":"-"},"content":" FYI, The \u0027filtered list\u0027 is the list of persons resulting from the most recent operation that will be shown to the user immediately after. For the `edit` command, we populate it with all the persons so that the user can see the edited person along with all other persons. If this was a `find` command, we would be setting that list to contain the search results instead.\u003cbr\u003e","lastModifiedDate":"2021-07-31"},{"lineNumber":207,"author":{"gitId":"-"},"content":" To provide some context, given below is the class diagram of the `Model` component. See if you can figure out where the \u0027filtered list\u0027 of persons is being tracked.","lastModifiedDate":"2021-07-31"},{"lineNumber":208,"author":{"gitId":"jieqiboh"},"content":" \u003cimg src\u003d\"../images/ModelClassDiagram.png\" width\u003d\"450\" /\u003e\u003cbr\u003e","lastModifiedDate":"2024-03-02"},{"lineNumber":209,"author":{"gitId":"-"},"content":" * :bulb: This may be a good time to read through the [`Model` component section of the DG](../DeveloperGuide.html#model-component)","lastModifiedDate":"2021-07-31"},{"lineNumber":210,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":211,"author":{"gitId":"-"},"content":"1. As you step through the rest of the statements in the `EditCommand#execute()` method, you\u0027ll see that it creates a `CommandResult` object (containing information about the result of the execution) and returns it.\u003cbr\u003e","lastModifiedDate":"2021-07-31"},{"lineNumber":212,"author":{"gitId":"-"},"content":" Advancing the debugger by one more step should take you back to the middle of the `LogicManager#execute()` method.\u003cbr\u003e","lastModifiedDate":"2021-07-31"},{"lineNumber":213,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":214,"author":{"gitId":"-"},"content":"1. Given that you have already seen quite a few classes in the `Logic` component in action, see if you can identify in this partial class diagram some of the classes you\u0027ve encountered so far, and see how they fit into the class structure of the `Logic` component:","lastModifiedDate":"2021-07-31"},{"lineNumber":215,"author":{"gitId":"jieqiboh"},"content":" \u003cimg src\u003d\"../images/LogicClassDiagram.png\" width\u003d\"550\"/\u003e","lastModifiedDate":"2024-03-02"},{"lineNumber":216,"author":{"gitId":"-"},"content":" * :bulb: This may be a good time to read through the [`Logic` component section of the DG](../DeveloperGuide.html#logic-component)","lastModifiedDate":"2021-07-31"},{"lineNumber":217,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":218,"author":{"gitId":"-"},"content":"1. Similar to before, you can step over/into statements in the `LogicManager#execute()` method to examine how the control is transferred to the `Storage` component and what happens inside that component.","lastModifiedDate":"2021-07-31"},{"lineNumber":219,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2021-07-31"},{"lineNumber":220,"author":{"gitId":"jieqiboh"},"content":" \u003cdiv markdown\u003d\"span\" class\u003d\"alert alert-primary\"\u003e:bulb: **Intellij Tip:** When trying to step into a statement such as `storage.saveAddressBook(model.getAddressBook())` which contains multiple method calls, Intellij will let you choose (by clicking) which one you want to step into.","lastModifiedDate":"2024-03-02"},{"lineNumber":221,"author":{"gitId":"jieqiboh"},"content":" \u003c/div\u003e","lastModifiedDate":"2024-03-02"},{"lineNumber":222,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":223,"author":{"gitId":"-"},"content":"1. As you step through the code inside the `Storage` component, you will eventually arrive at the `JsonAddressBook#saveAddressBook()` method which calls the `JsonSerializableAddressBook` constructor, to create an object that can be _serialized_ (i.e., stored in storage medium) in JSON format. That constructor is given below (with added line breaks for easier readability):","lastModifiedDate":"2021-07-31"},{"lineNumber":224,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2021-07-31"},{"lineNumber":225,"author":{"gitId":"-"},"content":" **`JsonSerializableAddressBook` constructor:**","lastModifiedDate":"2021-07-31"},{"lineNumber":226,"author":{"gitId":"-"},"content":" ``` java","lastModifiedDate":"2020-05-23"},{"lineNumber":227,"author":{"gitId":"-"},"content":" /**","lastModifiedDate":"2020-05-23"},{"lineNumber":228,"author":{"gitId":"-"},"content":" * Converts a given {@code ReadOnlyAddressBook} into this class for Jackson use.","lastModifiedDate":"2020-05-23"},{"lineNumber":229,"author":{"gitId":"-"},"content":" *","lastModifiedDate":"2020-05-23"},{"lineNumber":230,"author":{"gitId":"-"},"content":" * @param source future changes to this will not affect the created","lastModifiedDate":"2020-05-23"},{"lineNumber":231,"author":{"gitId":"-"},"content":" * {@code JsonSerializableAddressBook}.","lastModifiedDate":"2020-05-23"},{"lineNumber":232,"author":{"gitId":"-"},"content":" */","lastModifiedDate":"2020-05-23"},{"lineNumber":233,"author":{"gitId":"-"},"content":" public JsonSerializableAddressBook(ReadOnlyAddressBook source) {","lastModifiedDate":"2020-05-23"},{"lineNumber":234,"author":{"gitId":"-"},"content":" persons.addAll(","lastModifiedDate":"2020-05-23"},{"lineNumber":235,"author":{"gitId":"-"},"content":" source.getPersonList()","lastModifiedDate":"2020-05-23"},{"lineNumber":236,"author":{"gitId":"-"},"content":" .stream()","lastModifiedDate":"2020-05-23"},{"lineNumber":237,"author":{"gitId":"-"},"content":" .map(JsonAdaptedPerson::new)","lastModifiedDate":"2020-05-23"},{"lineNumber":238,"author":{"gitId":"-"},"content":" .collect(Collectors.toList()));","lastModifiedDate":"2020-05-23"},{"lineNumber":239,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2020-05-23"},{"lineNumber":240,"author":{"gitId":"-"},"content":" ```","lastModifiedDate":"2020-05-23"},{"lineNumber":241,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":242,"author":{"gitId":"-"},"content":"1. It appears that a `JsonAdaptedPerson` is created for each `Person` and then added to the `JsonSerializableAddressBook`.","lastModifiedDate":"2020-05-23"},{"lineNumber":243,"author":{"gitId":"-"},"content":" This is because regular Java objects need to go through an _adaptation_ for them to be suitable to be saved in JSON format.","lastModifiedDate":"2021-07-31"},{"lineNumber":244,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":245,"author":{"gitId":"-"},"content":"1. While you are stepping through the classes in the `Storage` component, here is the component\u0027s class diagram to help you understand how those classes fit into the structure of the component.\u003cbr\u003e","lastModifiedDate":"2021-07-31"},{"lineNumber":246,"author":{"gitId":"jieqiboh"},"content":" \u003cimg src\u003d\"../images/StorageClassDiagram.png\" width\u003d\"550\" /\u003e","lastModifiedDate":"2024-03-02"},{"lineNumber":247,"author":{"gitId":"-"},"content":" * :bulb: This may be a good time to read through the [`Storage` component section of the DG](../DeveloperGuide.html#storage-component)","lastModifiedDate":"2021-07-31"},{"lineNumber":248,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":249,"author":{"gitId":"-"},"content":"1. We can continue to step through until you reach the end of the `LogicManager#execute()` method and return to the `MainWindow#executeCommand()` method (the place where we put the original breakpoint).","lastModifiedDate":"2021-07-31"},{"lineNumber":250,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":251,"author":{"gitId":"-"},"content":"1. Stepping into `resultDisplay.setFeedbackToUser(commandResult.getFeedbackToUser());`, we end up in:","lastModifiedDate":"2021-07-31"},{"lineNumber":252,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":253,"author":{"gitId":"-"},"content":" **`ResultDisplay#setFeedbackToUser()`**","lastModifiedDate":"2021-07-31"},{"lineNumber":254,"author":{"gitId":"-"},"content":" ``` java","lastModifiedDate":"2020-05-23"},{"lineNumber":255,"author":{"gitId":"-"},"content":" public void setFeedbackToUser(String feedbackToUser) {","lastModifiedDate":"2020-05-23"},{"lineNumber":256,"author":{"gitId":"-"},"content":" requireNonNull(feedbackToUser);","lastModifiedDate":"2020-05-23"},{"lineNumber":257,"author":{"gitId":"-"},"content":" resultDisplay.setText(feedbackToUser);","lastModifiedDate":"2020-05-23"},{"lineNumber":258,"author":{"gitId":"-"},"content":" }","lastModifiedDate":"2020-05-23"},{"lineNumber":259,"author":{"gitId":"-"},"content":" ```","lastModifiedDate":"2020-05-23"},{"lineNumber":260,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":261,"author":{"gitId":"-"},"content":"1. Finally, you can step through until you reach the end of`MainWindow#executeCommand()`.\u003cbr\u003e","lastModifiedDate":"2021-07-31"},{"lineNumber":262,"author":{"gitId":"-"},"content":" :bulb: This may be a good time to read through the [`UI` component section of the DG](../DeveloperGuide.html#ui-component)","lastModifiedDate":"2021-07-31"},{"lineNumber":263,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2021-07-31"},{"lineNumber":264,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":265,"author":{"gitId":"-"},"content":"## Conclusion","lastModifiedDate":"2020-05-23"},{"lineNumber":266,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":267,"author":{"gitId":"-"},"content":"In this tutorial, we traced a valid edit command from raw user input to the result being displayed to the user. From this tutorial, you learned more about how the various components work together to produce a response to a user command.","lastModifiedDate":"2021-07-31"},{"lineNumber":268,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":269,"author":{"gitId":"-"},"content":"Here are some quick questions you can try to answer based on your execution path tracing. In some cases, you can do further tracing for the given commands to find exactly what happens.","lastModifiedDate":"2021-07-31"},{"lineNumber":270,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":271,"author":{"gitId":"-"},"content":"1. In this tutorial, we traced the \"happy path\" (i.e., no errors). What","lastModifiedDate":"2020-05-23"},{"lineNumber":272,"author":{"gitId":"-"},"content":" do you think will happen if we traced the following commands","lastModifiedDate":"2020-05-23"},{"lineNumber":273,"author":{"gitId":"-"},"content":" instead? What exceptions do you think will be thrown (if any), where","lastModifiedDate":"2020-05-23"},{"lineNumber":274,"author":{"gitId":"-"},"content":" will the exceptions be thrown and where will they be handled?","lastModifiedDate":"2020-05-23"},{"lineNumber":275,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":276,"author":{"gitId":"-"},"content":" 1. `redit 1 n/Alice Yu`","lastModifiedDate":"2020-05-23"},{"lineNumber":277,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":278,"author":{"gitId":"-"},"content":" 2. `edit 0 n/Alice Yu`","lastModifiedDate":"2020-05-23"},{"lineNumber":279,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":280,"author":{"gitId":"-"},"content":" 3. `edit 1 n/Alex Yeoh`","lastModifiedDate":"2020-05-23"},{"lineNumber":281,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":282,"author":{"gitId":"-"},"content":" 4. `edit 1`","lastModifiedDate":"2020-05-23"},{"lineNumber":283,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":284,"author":{"gitId":"-"},"content":" 5. `edit 1 n/アリス ユー`","lastModifiedDate":"2020-05-23"},{"lineNumber":285,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":286,"author":{"gitId":"-"},"content":" 6. `edit 1 t/one t/two t/three t/one`","lastModifiedDate":"2020-05-23"},{"lineNumber":287,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":288,"author":{"gitId":"-"},"content":"2. What components will you have to modify to perform the following","lastModifiedDate":"2020-05-23"},{"lineNumber":289,"author":{"gitId":"-"},"content":" enhancements to the application?","lastModifiedDate":"2020-05-23"},{"lineNumber":290,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":291,"author":{"gitId":"-"},"content":" 1. Make command words case-insensitive","lastModifiedDate":"2020-05-23"},{"lineNumber":292,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":293,"author":{"gitId":"-"},"content":" 2. Allow `delete` to remove more than one index at a time","lastModifiedDate":"2020-05-23"},{"lineNumber":294,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":295,"author":{"gitId":"-"},"content":" 3. Save the address book in the CSV format instead","lastModifiedDate":"2020-05-23"},{"lineNumber":296,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":297,"author":{"gitId":"-"},"content":" 4. Add a new command","lastModifiedDate":"2020-05-23"},{"lineNumber":298,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":299,"author":{"gitId":"-"},"content":" 5. Add a new field to `Person`","lastModifiedDate":"2020-05-23"},{"lineNumber":300,"author":{"gitId":"-"},"content":"","lastModifiedDate":"2020-05-23"},{"lineNumber":301,"author":{"gitId":"-"},"content":" 6. Add a new entity to the address book","lastModifiedDate":"2020-05-23"}],"authorContributionMap":{"jieqiboh":25,"-":276}},{"path":"src/main/java/seedu/address/model/internship/ApplicationStatus.java","fileType":"functional-code","lines":[{"lineNumber":1,"author":{"gitId":"jieqiboh"},"content":"package seedu.address.model.internship;","lastModifiedDate":"2024-03-06"},{"lineNumber":2,"author":{"gitId":"jieqiboh"},"content":"","lastModifiedDate":"2024-03-06"},{"lineNumber":3,"author":{"gitId":"jieqiboh"},"content":"import static java.util.Objects.requireNonNull;","lastModifiedDate":"2024-03-06"},{"lineNumber":4,"author":{"gitId":"jieqiboh"},"content":"","lastModifiedDate":"2024-03-06"},{"lineNumber":5,"author":{"gitId":"jieqiboh"},"content":"/**","lastModifiedDate":"2024-03-06"},{"lineNumber":6,"author":{"gitId":"jieqiboh"},"content":" * Represents an Internship\u0027s application status in the internship book.","lastModifiedDate":"2024-03-06"},{"lineNumber":7,"author":{"gitId":"jieqiboh"},"content":" */","lastModifiedDate":"2024-03-06"},{"lineNumber":8,"author":{"gitId":"jieqiboh"},"content":"public class ApplicationStatus {","lastModifiedDate":"2024-03-06"},{"lineNumber":9,"author":{"gitId":"jieqiboh"},"content":" /**","lastModifiedDate":"2024-03-06"},{"lineNumber":10,"author":{"gitId":"jieqiboh"},"content":" * Enum of statuses","lastModifiedDate":"2024-03-06"},{"lineNumber":11,"author":{"gitId":"jieqiboh"},"content":" */","lastModifiedDate":"2024-03-06"},{"lineNumber":12,"author":{"gitId":"jieqiboh"},"content":" public enum StatusEnum {","lastModifiedDate":"2024-03-06"},{"lineNumber":13,"author":{"gitId":"jieqiboh"},"content":" TO_APPLY,","lastModifiedDate":"2024-03-06"},{"lineNumber":14,"author":{"gitId":"jieqiboh"},"content":" PENDING,","lastModifiedDate":"2024-03-06"},{"lineNumber":15,"author":{"gitId":"jieqiboh"},"content":" REJECTED,","lastModifiedDate":"2024-03-06"},{"lineNumber":16,"author":{"gitId":"jieqiboh"},"content":" ACCEPTED,","lastModifiedDate":"2024-03-06"},{"lineNumber":17,"author":{"gitId":"jieqiboh"},"content":" ONGOING","lastModifiedDate":"2024-03-06"},{"lineNumber":18,"author":{"gitId":"jieqiboh"},"content":" }","lastModifiedDate":"2024-03-06"},{"lineNumber":19,"author":{"gitId":"jieqiboh"},"content":"","lastModifiedDate":"2024-03-06"},{"lineNumber":20,"author":{"gitId":"jieqiboh"},"content":" public final StatusEnum applicationStatus;","lastModifiedDate":"2024-03-06"},{"lineNumber":21,"author":{"gitId":"jieqiboh"},"content":"","lastModifiedDate":"2024-03-06"},{"lineNumber":22,"author":{"gitId":"jieqiboh"},"content":" /**","lastModifiedDate":"2024-03-06"},{"lineNumber":23,"author":{"gitId":"jieqiboh"},"content":" * Constructs a {@code ApplicationStatus}.","lastModifiedDate":"2024-03-06"},{"lineNumber":24,"author":{"gitId":"jieqiboh"},"content":" *","lastModifiedDate":"2024-03-06"},{"lineNumber":25,"author":{"gitId":"jieqiboh"},"content":" * @param applicationStatus A valid applicationStatus.","lastModifiedDate":"2024-03-06"},{"lineNumber":26,"author":{"gitId":"jieqiboh"},"content":" */","lastModifiedDate":"2024-03-06"},{"lineNumber":27,"author":{"gitId":"jieqiboh"},"content":" public ApplicationStatus(StatusEnum applicationStatus) {","lastModifiedDate":"2024-03-06"},{"lineNumber":28,"author":{"gitId":"jieqiboh"},"content":" requireNonNull(applicationStatus);","lastModifiedDate":"2024-03-06"},{"lineNumber":29,"author":{"gitId":"jieqiboh"},"content":" this.applicationStatus \u003d applicationStatus;","lastModifiedDate":"2024-03-06"},{"lineNumber":30,"author":{"gitId":"jieqiboh"},"content":" }","lastModifiedDate":"2024-03-06"},{"lineNumber":31,"author":{"gitId":"jieqiboh"},"content":"","lastModifiedDate":"2024-03-06"},{"lineNumber":32,"author":{"gitId":"jieqiboh"},"content":" @Override","lastModifiedDate":"2024-03-06"},{"lineNumber":33,"author":{"gitId":"jieqiboh"},"content":" public String toString() {","lastModifiedDate":"2024-03-06"},{"lineNumber":34,"author":{"gitId":"jieqiboh"},"content":" switch (applicationStatus) {","lastModifiedDate":"2024-03-06"},{"lineNumber":35,"author":{"gitId":"jieqiboh"},"content":" case TO_APPLY:","lastModifiedDate":"2024-03-06"},{"lineNumber":36,"author":{"gitId":"jieqiboh"},"content":" return \"To Apply\";","lastModifiedDate":"2024-03-06"},{"lineNumber":37,"author":{"gitId":"jieqiboh"},"content":" case PENDING:","lastModifiedDate":"2024-03-06"},{"lineNumber":38,"author":{"gitId":"jieqiboh"},"content":" return \"Pending\";","lastModifiedDate":"2024-03-06"},{"lineNumber":39,"author":{"gitId":"jieqiboh"},"content":" case REJECTED:","lastModifiedDate":"2024-03-06"},{"lineNumber":40,"author":{"gitId":"jieqiboh"},"content":" return \"Rejected\";","lastModifiedDate":"2024-03-06"},{"lineNumber":41,"author":{"gitId":"jieqiboh"},"content":" case ACCEPTED:","lastModifiedDate":"2024-03-06"},{"lineNumber":42,"author":{"gitId":"jieqiboh"},"content":" return \"Accepted\";","lastModifiedDate":"2024-03-06"},{"lineNumber":43,"author":{"gitId":"jieqiboh"},"content":" case ONGOING:","lastModifiedDate":"2024-03-06"},{"lineNumber":44,"author":{"gitId":"jieqiboh"},"content":" return \"Ongoing\";","lastModifiedDate":"2024-03-06"},{"lineNumber":45,"author":{"gitId":"jieqiboh"},"content":" default:","lastModifiedDate":"2024-03-06"},{"lineNumber":46,"author":{"gitId":"jieqiboh"},"content":" throw new IllegalArgumentException(\"Unexpected application status: \" + applicationStatus);","lastModifiedDate":"2024-03-06"},{"lineNumber":47,"author":{"gitId":"jieqiboh"},"content":" }","lastModifiedDate":"2024-03-06"},{"lineNumber":48,"author":{"gitId":"jieqiboh"},"content":" }","lastModifiedDate":"2024-03-06"},{"lineNumber":49,"author":{"gitId":"jieqiboh"},"content":"","lastModifiedDate":"2024-03-06"},{"lineNumber":50,"author":{"gitId":"jieqiboh"},"content":"","lastModifiedDate":"2024-03-06"},{"lineNumber":51,"author":{"gitId":"jieqiboh"},"content":" @Override","lastModifiedDate":"2024-03-06"},{"lineNumber":52,"author":{"gitId":"jieqiboh"},"content":" public int hashCode() {","lastModifiedDate":"2024-03-06"},{"lineNumber":53,"author":{"gitId":"jieqiboh"},"content":" return applicationStatus.hashCode();","lastModifiedDate":"2024-03-06"},{"lineNumber":54,"author":{"gitId":"jieqiboh"},"content":" }","lastModifiedDate":"2024-03-06"},{"lineNumber":55,"author":{"gitId":"jieqiboh"},"content":"}","lastModifiedDate":"2024-03-06"}],"authorContributionMap":{"jieqiboh":55}},{"path":"src/main/java/seedu/address/model/internship/CompanyName.java","fileType":"functional-code","lines":[{"lineNumber":1,"author":{"gitId":"jieqiboh"},"content":"package seedu.address.model.internship;","lastModifiedDate":"2024-03-06"},{"lineNumber":2,"author":{"gitId":"jieqiboh"},"content":"","lastModifiedDate":"2024-03-06"},{"lineNumber":3,"author":{"gitId":"jieqiboh"},"content":"import static java.util.Objects.requireNonNull;","lastModifiedDate":"2024-03-06"},{"lineNumber":4,"author":{"gitId":"jieqiboh"},"content":"import static seedu.address.commons.util.AppUtil.checkArgument;","lastModifiedDate":"2024-03-06"},{"lineNumber":5,"author":{"gitId":"jieqiboh"},"content":"","lastModifiedDate":"2024-03-06"},{"lineNumber":6,"author":{"gitId":"jieqiboh"},"content":"/**","lastModifiedDate":"2024-03-06"},{"lineNumber":7,"author":{"gitId":"jieqiboh"},"content":" * Represents a Company\u0027s name in the address book.","lastModifiedDate":"2024-03-06"},{"lineNumber":8,"author":{"gitId":"jieqiboh"},"content":" * Guarantees: immutable; is valid as declared in {@link #isValidContactName(String)}","lastModifiedDate":"2024-03-06"},{"lineNumber":9,"author":{"gitId":"jieqiboh"},"content":" */","lastModifiedDate":"2024-03-06"},{"lineNumber":10,"author":{"gitId":"jieqiboh"},"content":"public class CompanyName {","lastModifiedDate":"2024-03-06"},{"lineNumber":11,"author":{"gitId":"jieqiboh"},"content":" public static final String MESSAGE_CONSTRAINTS \u003d","lastModifiedDate":"2024-03-06"},{"lineNumber":12,"author":{"gitId":"jieqiboh"},"content":" \"Names should only contain alphanumeric characters and spaces, and it should not be blank\";","lastModifiedDate":"2024-03-06"},{"lineNumber":13,"author":{"gitId":"jieqiboh"},"content":"","lastModifiedDate":"2024-03-06"},{"lineNumber":14,"author":{"gitId":"jieqiboh"},"content":" /*","lastModifiedDate":"2024-03-06"},{"lineNumber":15,"author":{"gitId":"jieqiboh"},"content":" * Matches an arbitrarily long string of alphanumeric characters","lastModifiedDate":"2024-03-06"},{"lineNumber":16,"author":{"gitId":"jieqiboh"},"content":" */","lastModifiedDate":"2024-03-06"},{"lineNumber":17,"author":{"gitId":"jieqiboh"},"content":" public static final String VALIDATION_REGEX \u003d \"^\\\\p{Alnum}+$\";","lastModifiedDate":"2024-03-06"},{"lineNumber":18,"author":{"gitId":"jieqiboh"},"content":"","lastModifiedDate":"2024-03-06"},{"lineNumber":19,"author":{"gitId":"jieqiboh"},"content":" public final String companyName;","lastModifiedDate":"2024-03-06"},{"lineNumber":20,"author":{"gitId":"jieqiboh"},"content":"","lastModifiedDate":"2024-03-06"},{"lineNumber":21,"author":{"gitId":"jieqiboh"},"content":" /**","lastModifiedDate":"2024-03-06"},{"lineNumber":22,"author":{"gitId":"jieqiboh"},"content":" * Constructs a {@code CompanyName}.","lastModifiedDate":"2024-03-06"},{"lineNumber":23,"author":{"gitId":"jieqiboh"},"content":" *","lastModifiedDate":"2024-03-06"},{"lineNumber":24,"author":{"gitId":"jieqiboh"},"content":" * @param companyName A valid companyName.","lastModifiedDate":"2024-03-06"},{"lineNumber":25,"author":{"gitId":"jieqiboh"},"content":" */","lastModifiedDate":"2024-03-06"},{"lineNumber":26,"author":{"gitId":"jieqiboh"},"content":" public CompanyName(String companyName) {","lastModifiedDate":"2024-03-06"},{"lineNumber":27,"author":{"gitId":"jieqiboh"},"content":" requireNonNull(companyName);","lastModifiedDate":"2024-03-06"},{"lineNumber":28,"author":{"gitId":"jieqiboh"},"content":" checkArgument(isValidContactName(companyName), MESSAGE_CONSTRAINTS);","lastModifiedDate":"2024-03-06"},{"lineNumber":29,"author":{"gitId":"jieqiboh"},"content":" this.companyName \u003d companyName;","lastModifiedDate":"2024-03-06"},{"lineNumber":30,"author":{"gitId":"jieqiboh"},"content":" }","lastModifiedDate":"2024-03-06"},{"lineNumber":31,"author":{"gitId":"jieqiboh"},"content":"","lastModifiedDate":"2024-03-06"},{"lineNumber":32,"author":{"gitId":"jieqiboh"},"content":" /**","lastModifiedDate":"2024-03-06"},{"lineNumber":33,"author":{"gitId":"jieqiboh"},"content":" * Returns true if a given string is a valid companyName.","lastModifiedDate":"2024-03-06"},{"lineNumber":34,"author":{"gitId":"jieqiboh"},"content":" */","lastModifiedDate":"2024-03-06"},{"lineNumber":35,"author":{"gitId":"jieqiboh"},"content":" public static boolean isValidContactName(String test) {","lastModifiedDate":"2024-03-06"},{"lineNumber":36,"author":{"gitId":"jieqiboh"},"content":" return test.matches(VALIDATION_REGEX);","lastModifiedDate":"2024-03-06"},{"lineNumber":37,"author":{"gitId":"jieqiboh"},"content":" }","lastModifiedDate":"2024-03-06"},{"lineNumber":38,"author":{"gitId":"jieqiboh"},"content":"","lastModifiedDate":"2024-03-06"},{"lineNumber":39,"author":{"gitId":"jieqiboh"},"content":"","lastModifiedDate":"2024-03-06"},{"lineNumber":40,"author":{"gitId":"jieqiboh"},"content":" @Override","lastModifiedDate":"2024-03-06"},{"lineNumber":41,"author":{"gitId":"jieqiboh"},"content":" public String toString() {","lastModifiedDate":"2024-03-06"},{"lineNumber":42,"author":{"gitId":"jieqiboh"},"content":" return companyName;","lastModifiedDate":"2024-03-06"},{"lineNumber":43,"author":{"gitId":"jieqiboh"},"content":" }","lastModifiedDate":"2024-03-06"},{"lineNumber":44,"author":{"gitId":"jieqiboh"},"content":"","lastModifiedDate":"2024-03-06"},{"lineNumber":45,"author":{"gitId":"jieqiboh"},"content":" @Override","lastModifiedDate":"2024-03-06"},{"lineNumber":46,"author":{"gitId":"jieqiboh"},"content":" public boolean equals(Object other) {","lastModifiedDate":"2024-03-06"},{"lineNumber":47,"author":{"gitId":"jieqiboh"},"content":" if (other \u003d\u003d this) {","lastModifiedDate":"2024-03-06"},{"lineNumber":48,"author":{"gitId":"jieqiboh"},"content":" return true;","lastModifiedDate":"2024-03-06"},{"lineNumber":49,"author":{"gitId":"jieqiboh"},"content":" }","lastModifiedDate":"2024-03-06"},{"lineNumber":50,"author":{"gitId":"jieqiboh"},"content":"","lastModifiedDate":"2024-03-06"},{"lineNumber":51,"author":{"gitId":"jieqiboh"},"content":" // instanceof handles nulls","lastModifiedDate":"2024-03-06"},{"lineNumber":52,"author":{"gitId":"jieqiboh"},"content":" if (!(other instanceof CompanyName)) {","lastModifiedDate":"2024-03-06"},{"lineNumber":53,"author":{"gitId":"jieqiboh"},"content":" return false;","lastModifiedDate":"2024-03-06"},{"lineNumber":54,"author":{"gitId":"jieqiboh"},"content":" }","lastModifiedDate":"2024-03-06"},{"lineNumber":55,"author":{"gitId":"jieqiboh"},"content":"","lastModifiedDate":"2024-03-06"},{"lineNumber":56,"author":{"gitId":"jieqiboh"},"content":" CompanyName otherName \u003d (CompanyName) other;","lastModifiedDate":"2024-03-06"},{"lineNumber":57,"author":{"gitId":"jieqiboh"},"content":" return companyName.equals(otherName.companyName);","lastModifiedDate":"2024-03-06"},{"lineNumber":58,"author":{"gitId":"jieqiboh"},"content":" }","lastModifiedDate":"2024-03-06"},{"lineNumber":59,"author":{"gitId":"jieqiboh"},"content":"","lastModifiedDate":"2024-03-06"},{"lineNumber":60,"author":{"gitId":"jieqiboh"},"content":" @Override","lastModifiedDate":"2024-03-06"},{"lineNumber":61,"author":{"gitId":"jieqiboh"},"content":" public int hashCode() {","lastModifiedDate":"2024-03-06"},{"lineNumber":62,"author":{"gitId":"jieqiboh"},"content":" return companyName.hashCode();","lastModifiedDate":"2024-03-06"},{"lineNumber":63,"author":{"gitId":"jieqiboh"},"content":" }","lastModifiedDate":"2024-03-06"},{"lineNumber":64,"author":{"gitId":"jieqiboh"},"content":"}","lastModifiedDate":"2024-03-06"}],"authorContributionMap":{"jieqiboh":64}},{"path":"src/main/java/seedu/address/model/internship/ContactEmail.java","fileType":"functional-code","lines":[{"lineNumber":1,"author":{"gitId":"jieqiboh"},"content":"package seedu.address.model.internship;","lastModifiedDate":"2024-03-06"},{"lineNumber":2,"author":{"gitId":"jieqiboh"},"content":"","lastModifiedDate":"2024-03-06"},{"lineNumber":3,"author":{"gitId":"jieqiboh"},"content":"import static java.util.Objects.requireNonNull;","lastModifiedDate":"2024-03-06"},{"lineNumber":4,"author":{"gitId":"jieqiboh"},"content":"import static seedu.address.commons.util.AppUtil.checkArgument;","lastModifiedDate":"2024-03-06"},{"lineNumber":5,"author":{"gitId":"jieqiboh"},"content":"","lastModifiedDate":"2024-03-06"},{"lineNumber":6,"author":{"gitId":"jieqiboh"},"content":"/**","lastModifiedDate":"2024-03-06"},{"lineNumber":7,"author":{"gitId":"jieqiboh"},"content":" * Represents an Internship Contact\u0027s email in the internship book.","lastModifiedDate":"2024-03-06"},{"lineNumber":8,"author":{"gitId":"jieqiboh"},"content":" */","lastModifiedDate":"2024-03-06"},{"lineNumber":9,"author":{"gitId":"jieqiboh"},"content":"public class ContactEmail {","lastModifiedDate":"2024-03-06"},{"lineNumber":10,"author":{"gitId":"jieqiboh"},"content":"","lastModifiedDate":"2024-03-06"},{"lineNumber":11,"author":{"gitId":"jieqiboh"},"content":" private static final String SPECIAL_CHARACTERS \u003d \"+_.-\";","lastModifiedDate":"2024-03-06"},{"lineNumber":12,"author":{"gitId":"jieqiboh"},"content":" public static final String MESSAGE_CONSTRAINTS \u003d \"Emails should be of the format local-part@domain \"","lastModifiedDate":"2024-03-06"},{"lineNumber":13,"author":{"gitId":"jieqiboh"},"content":" + \"and adhere to the following constraints:\\n\"","lastModifiedDate":"2024-03-06"},{"lineNumber":14,"author":{"gitId":"jieqiboh"},"content":" + \"1. The local-part should only contain alphanumeric characters and these special characters, excluding \"","lastModifiedDate":"2024-03-06"},{"lineNumber":15,"author":{"gitId":"jieqiboh"},"content":" + \"the parentheses, (\" + SPECIAL_CHARACTERS + \"). The local-part may not start or end with any special \"","lastModifiedDate":"2024-03-06"},{"lineNumber":16,"author":{"gitId":"jieqiboh"},"content":" + \"characters.\\n\"","lastModifiedDate":"2024-03-06"},{"lineNumber":17,"author":{"gitId":"jieqiboh"},"content":" + \"2. This is followed by a \u0027@\u0027 and then a domain name. The domain name is made up of domain labels \"","lastModifiedDate":"2024-03-06"},{"lineNumber":18,"author":{"gitId":"jieqiboh"},"content":" + \"separated by periods.\\n\"","lastModifiedDate":"2024-03-06"},{"lineNumber":19,"author":{"gitId":"jieqiboh"},"content":" + \"The domain name must:\\n\"","lastModifiedDate":"2024-03-06"},{"lineNumber":20,"author":{"gitId":"jieqiboh"},"content":" + \" - end with a domain label at least 2 characters long\\n\"","lastModifiedDate":"2024-03-06"},{"lineNumber":21,"author":{"gitId":"jieqiboh"},"content":" + \" - have each domain label start and end with alphanumeric characters\\n\"","lastModifiedDate":"2024-03-06"},{"lineNumber":22,"author":{"gitId":"jieqiboh"},"content":" + \" - have each domain label consist of alphanumeric characters, separated only by hyphens, if any.\";","lastModifiedDate":"2024-03-06"},{"lineNumber":23,"author":{"gitId":"jieqiboh"},"content":" // alphanumeric and special characters","lastModifiedDate":"2024-03-06"},{"lineNumber":24,"author":{"gitId":"jieqiboh"},"content":" private static final String ALPHANUMERIC_NO_UNDERSCORE \u003d \"[^\\\\W_]+\"; // alphanumeric characters except underscore","lastModifiedDate":"2024-03-06"},{"lineNumber":25,"author":{"gitId":"jieqiboh"},"content":" private static final String LOCAL_PART_REGEX \u003d \"^\" + ALPHANUMERIC_NO_UNDERSCORE + \"([\" + SPECIAL_CHARACTERS + \"]\"","lastModifiedDate":"2024-03-06"},{"lineNumber":26,"author":{"gitId":"jieqiboh"},"content":" + ALPHANUMERIC_NO_UNDERSCORE + \")*\";","lastModifiedDate":"2024-03-06"},{"lineNumber":27,"author":{"gitId":"jieqiboh"},"content":" private static final String DOMAIN_PART_REGEX \u003d ALPHANUMERIC_NO_UNDERSCORE","lastModifiedDate":"2024-03-06"},{"lineNumber":28,"author":{"gitId":"jieqiboh"},"content":" + \"(-\" + ALPHANUMERIC_NO_UNDERSCORE + \")*\";","lastModifiedDate":"2024-03-06"},{"lineNumber":29,"author":{"gitId":"jieqiboh"},"content":" private static final String DOMAIN_LAST_PART_REGEX \u003d \"(\" + DOMAIN_PART_REGEX + \"){2,}$\"; // At least two chars","lastModifiedDate":"2024-03-06"},{"lineNumber":30,"author":{"gitId":"jieqiboh"},"content":" private static final String DOMAIN_REGEX \u003d \"(\" + DOMAIN_PART_REGEX + \"\\\\.)*\" + DOMAIN_LAST_PART_REGEX;","lastModifiedDate":"2024-03-06"},{"lineNumber":31,"author":{"gitId":"jieqiboh"},"content":" public static final String VALIDATION_REGEX \u003d LOCAL_PART_REGEX + \"@\" + DOMAIN_REGEX;","lastModifiedDate":"2024-03-06"},{"lineNumber":32,"author":{"gitId":"jieqiboh"},"content":"","lastModifiedDate":"2024-03-06"},{"lineNumber":33,"author":{"gitId":"jieqiboh"},"content":" public final String value;","lastModifiedDate":"2024-03-06"},{"lineNumber":34,"author":{"gitId":"jieqiboh"},"content":"","lastModifiedDate":"2024-03-06"},{"lineNumber":35,"author":{"gitId":"jieqiboh"},"content":" /**","lastModifiedDate":"2024-03-06"},{"lineNumber":36,"author":{"gitId":"jieqiboh"},"content":" * Constructs an {@code ContactEmail}.","lastModifiedDate":"2024-03-06"},{"lineNumber":37,"author":{"gitId":"jieqiboh"},"content":" *","lastModifiedDate":"2024-03-06"},{"lineNumber":38,"author":{"gitId":"jieqiboh"},"content":" * @param contactEmail A valid contactEmail address.","lastModifiedDate":"2024-03-06"},{"lineNumber":39,"author":{"gitId":"jieqiboh"},"content":" */","lastModifiedDate":"2024-03-06"},{"lineNumber":40,"author":{"gitId":"jieqiboh"},"content":" public ContactEmail(String contactEmail) {","lastModifiedDate":"2024-03-06"},{"lineNumber":41,"author":{"gitId":"jieqiboh"},"content":" requireNonNull(contactEmail);","lastModifiedDate":"2024-03-06"},{"lineNumber":42,"author":{"gitId":"jieqiboh"},"content":" checkArgument(isValidEmail(contactEmail), MESSAGE_CONSTRAINTS);","lastModifiedDate":"2024-03-06"},{"lineNumber":43,"author":{"gitId":"jieqiboh"},"content":" value \u003d contactEmail;","lastModifiedDate":"2024-03-06"},{"lineNumber":44,"author":{"gitId":"jieqiboh"},"content":" }","lastModifiedDate":"2024-03-06"},{"lineNumber":45,"author":{"gitId":"jieqiboh"},"content":"","lastModifiedDate":"2024-03-06"},{"lineNumber":46,"author":{"gitId":"jieqiboh"},"content":" /**","lastModifiedDate":"2024-03-06"},{"lineNumber":47,"author":{"gitId":"jieqiboh"},"content":" * Returns if a given string is a valid contactEmail.","lastModifiedDate":"2024-03-06"},{"lineNumber":48,"author":{"gitId":"jieqiboh"},"content":" */","lastModifiedDate":"2024-03-06"},{"lineNumber":49,"author":{"gitId":"jieqiboh"},"content":" public static boolean isValidEmail(String test) {","lastModifiedDate":"2024-03-06"},{"lineNumber":50,"author":{"gitId":"jieqiboh"},"content":" return test.matches(VALIDATION_REGEX);","lastModifiedDate":"2024-03-06"},{"lineNumber":51,"author":{"gitId":"jieqiboh"},"content":" }","lastModifiedDate":"2024-03-06"},{"lineNumber":52,"author":{"gitId":"jieqiboh"},"content":"","lastModifiedDate":"2024-03-06"},{"lineNumber":53,"author":{"gitId":"jieqiboh"},"content":" @Override","lastModifiedDate":"2024-03-06"},{"lineNumber":54,"author":{"gitId":"jieqiboh"},"content":" public String toString() {","lastModifiedDate":"2024-03-06"},{"lineNumber":55,"author":{"gitId":"jieqiboh"},"content":" return value;","lastModifiedDate":"2024-03-06"},{"lineNumber":56,"author":{"gitId":"jieqiboh"},"content":" }","lastModifiedDate":"2024-03-06"},{"lineNumber":57,"author":{"gitId":"jieqiboh"},"content":"","lastModifiedDate":"2024-03-06"},{"lineNumber":58,"author":{"gitId":"jieqiboh"},"content":" @Override","lastModifiedDate":"2024-03-06"},{"lineNumber":59,"author":{"gitId":"jieqiboh"},"content":" public boolean equals(Object other) {","lastModifiedDate":"2024-03-06"},{"lineNumber":60,"author":{"gitId":"jieqiboh"},"content":" if (other \u003d\u003d this) {","lastModifiedDate":"2024-03-06"},{"lineNumber":61,"author":{"gitId":"jieqiboh"},"content":" return true;","lastModifiedDate":"2024-03-06"},{"lineNumber":62,"author":{"gitId":"jieqiboh"},"content":" }","lastModifiedDate":"2024-03-06"},{"lineNumber":63,"author":{"gitId":"jieqiboh"},"content":"","lastModifiedDate":"2024-03-06"},{"lineNumber":64,"author":{"gitId":"jieqiboh"},"content":" // instanceof handles nulls","lastModifiedDate":"2024-03-06"},{"lineNumber":65,"author":{"gitId":"jieqiboh"},"content":" if (!(other instanceof ContactEmail)) {","lastModifiedDate":"2024-03-06"},{"lineNumber":66,"author":{"gitId":"jieqiboh"},"content":" return false;","lastModifiedDate":"2024-03-06"},{"lineNumber":67,"author":{"gitId":"jieqiboh"},"content":" }","lastModifiedDate":"2024-03-06"},{"lineNumber":68,"author":{"gitId":"jieqiboh"},"content":"","lastModifiedDate":"2024-03-06"},{"lineNumber":69,"author":{"gitId":"jieqiboh"},"content":" ContactEmail otherEmail \u003d (ContactEmail) other;","lastModifiedDate":"2024-03-06"},{"lineNumber":70,"author":{"gitId":"jieqiboh"},"content":" return value.equals(otherEmail.value);","lastModifiedDate":"2024-03-06"},{"lineNumber":71,"author":{"gitId":"jieqiboh"},"content":" }","lastModifiedDate":"2024-03-06"},{"lineNumber":72,"author":{"gitId":"jieqiboh"},"content":"","lastModifiedDate":"2024-03-06"},{"lineNumber":73,"author":{"gitId":"jieqiboh"},"content":" @Override","lastModifiedDate":"2024-03-06"},{"lineNumber":74,"author":{"gitId":"jieqiboh"},"content":" public int hashCode() {","lastModifiedDate":"2024-03-06"},{"lineNumber":75,"author":{"gitId":"jieqiboh"},"content":" return value.hashCode();","lastModifiedDate":"2024-03-06"},{"lineNumber":76,"author":{"gitId":"jieqiboh"},"content":" }","lastModifiedDate":"2024-03-06"},{"lineNumber":77,"author":{"gitId":"jieqiboh"},"content":"}","lastModifiedDate":"2024-03-06"}],"authorContributionMap":{"jieqiboh":77}},{"path":"src/main/java/seedu/address/model/internship/ContactName.java","fileType":"functional-code","lines":[{"lineNumber":1,"author":{"gitId":"jieqiboh"},"content":"package seedu.address.model.internship;","lastModifiedDate":"2024-03-06"},{"lineNumber":2,"author":{"gitId":"jieqiboh"},"content":"","lastModifiedDate":"2024-03-06"},{"lineNumber":3,"author":{"gitId":"jieqiboh"},"content":"import static java.util.Objects.requireNonNull;","lastModifiedDate":"2024-03-06"},{"lineNumber":4,"author":{"gitId":"jieqiboh"},"content":"import static seedu.address.commons.util.AppUtil.checkArgument;","lastModifiedDate":"2024-03-06"},{"lineNumber":5,"author":{"gitId":"jieqiboh"},"content":"","lastModifiedDate":"2024-03-06"},{"lineNumber":6,"author":{"gitId":"jieqiboh"},"content":"/**","lastModifiedDate":"2024-03-06"},{"lineNumber":7,"author":{"gitId":"jieqiboh"},"content":" * Represents a Company Contact\u0027s name in the address book.","lastModifiedDate":"2024-03-06"},{"lineNumber":8,"author":{"gitId":"jieqiboh"},"content":" * Guarantees: immutable; is valid as declared in {@link #isValidContactName(String)}","lastModifiedDate":"2024-03-06"},{"lineNumber":9,"author":{"gitId":"jieqiboh"},"content":" */","lastModifiedDate":"2024-03-06"},{"lineNumber":10,"author":{"gitId":"jieqiboh"},"content":"public class ContactName {","lastModifiedDate":"2024-03-06"},{"lineNumber":11,"author":{"gitId":"jieqiboh"},"content":"","lastModifiedDate":"2024-03-06"},{"lineNumber":12,"author":{"gitId":"jieqiboh"},"content":" public static final String MESSAGE_CONSTRAINTS \u003d","lastModifiedDate":"2024-03-06"},{"lineNumber":13,"author":{"gitId":"jieqiboh"},"content":" \"Names should only contain alphanumeric characters and spaces, and it should not be blank\";","lastModifiedDate":"2024-03-06"},{"lineNumber":14,"author":{"gitId":"jieqiboh"},"content":"","lastModifiedDate":"2024-03-06"},{"lineNumber":15,"author":{"gitId":"jieqiboh"},"content":" /*","lastModifiedDate":"2024-03-06"},{"lineNumber":16,"author":{"gitId":"jieqiboh"},"content":" * The first character of the address must not be a whitespace,","lastModifiedDate":"2024-03-06"},{"lineNumber":17,"author":{"gitId":"jieqiboh"},"content":" * otherwise \" \" (a blank string) becomes a valid input.","lastModifiedDate":"2024-03-06"},{"lineNumber":18,"author":{"gitId":"jieqiboh"},"content":" */","lastModifiedDate":"2024-03-06"},{"lineNumber":19,"author":{"gitId":"jieqiboh"},"content":" public static final String VALIDATION_REGEX \u003d \"[\\\\p{Alnum}][\\\\p{Alnum} ]*\";","lastModifiedDate":"2024-03-06"},{"lineNumber":20,"author":{"gitId":"jieqiboh"},"content":"","lastModifiedDate":"2024-03-06"},{"lineNumber":21,"author":{"gitId":"jieqiboh"},"content":" public final String contactName;","lastModifiedDate":"2024-03-06"},{"lineNumber":22,"author":{"gitId":"jieqiboh"},"content":"","lastModifiedDate":"2024-03-06"},{"lineNumber":23,"author":{"gitId":"jieqiboh"},"content":" /**","lastModifiedDate":"2024-03-06"},{"lineNumber":24,"author":{"gitId":"jieqiboh"},"content":" * Constructs a {@code ContactName}.","lastModifiedDate":"2024-03-06"},{"lineNumber":25,"author":{"gitId":"jieqiboh"},"content":" *","lastModifiedDate":"2024-03-06"},{"lineNumber":26,"author":{"gitId":"jieqiboh"},"content":" * @param contactName A valid contactName.","lastModifiedDate":"2024-03-06"},{"lineNumber":27,"author":{"gitId":"jieqiboh"},"content":" */","lastModifiedDate":"2024-03-06"},{"lineNumber":28,"author":{"gitId":"jieqiboh"},"content":" public ContactName(String contactName) {","lastModifiedDate":"2024-03-06"},{"lineNumber":29,"author":{"gitId":"jieqiboh"},"content":" requireNonNull(contactName);","lastModifiedDate":"2024-03-06"},{"lineNumber":30,"author":{"gitId":"jieqiboh"},"content":" checkArgument(isValidContactName(contactName), MESSAGE_CONSTRAINTS);","lastModifiedDate":"2024-03-06"},{"lineNumber":31,"author":{"gitId":"jieqiboh"},"content":" this.contactName \u003d contactName;","lastModifiedDate":"2024-03-06"},{"lineNumber":32,"author":{"gitId":"jieqiboh"},"content":" }","lastModifiedDate":"2024-03-06"},{"lineNumber":33,"author":{"gitId":"jieqiboh"},"content":"","lastModifiedDate":"2024-03-06"},{"lineNumber":34,"author":{"gitId":"jieqiboh"},"content":" /**","lastModifiedDate":"2024-03-06"},{"lineNumber":35,"author":{"gitId":"jieqiboh"},"content":" * Returns true if a given string is a valid contactName.","lastModifiedDate":"2024-03-06"},{"lineNumber":36,"author":{"gitId":"jieqiboh"},"content":" */","lastModifiedDate":"2024-03-06"},{"lineNumber":37,"author":{"gitId":"jieqiboh"},"content":" public static boolean isValidContactName(String test) {","lastModifiedDate":"2024-03-06"},{"lineNumber":38,"author":{"gitId":"jieqiboh"},"content":" return test.matches(VALIDATION_REGEX);","lastModifiedDate":"2024-03-06"},{"lineNumber":39,"author":{"gitId":"jieqiboh"},"content":" }","lastModifiedDate":"2024-03-06"},{"lineNumber":40,"author":{"gitId":"jieqiboh"},"content":"","lastModifiedDate":"2024-03-06"},{"lineNumber":41,"author":{"gitId":"jieqiboh"},"content":"","lastModifiedDate":"2024-03-06"},{"lineNumber":42,"author":{"gitId":"jieqiboh"},"content":" @Override","lastModifiedDate":"2024-03-06"},{"lineNumber":43,"author":{"gitId":"jieqiboh"},"content":" public String toString() {","lastModifiedDate":"2024-03-06"},{"lineNumber":44,"author":{"gitId":"jieqiboh"},"content":" return contactName;","lastModifiedDate":"2024-03-06"},{"lineNumber":45,"author":{"gitId":"jieqiboh"},"content":" }","lastModifiedDate":"2024-03-06"},{"lineNumber":46,"author":{"gitId":"jieqiboh"},"content":"","lastModifiedDate":"2024-03-06"},{"lineNumber":47,"author":{"gitId":"jieqiboh"},"content":" @Override","lastModifiedDate":"2024-03-06"},{"lineNumber":48,"author":{"gitId":"jieqiboh"},"content":" public boolean equals(Object other) {","lastModifiedDate":"2024-03-06"},{"lineNumber":49,"author":{"gitId":"jieqiboh"},"content":" if (other \u003d\u003d this) {","lastModifiedDate":"2024-03-06"},{"lineNumber":50,"author":{"gitId":"jieqiboh"},"content":" return true;","lastModifiedDate":"2024-03-06"},{"lineNumber":51,"author":{"gitId":"jieqiboh"},"content":" }","lastModifiedDate":"2024-03-06"},{"lineNumber":52,"author":{"gitId":"jieqiboh"},"content":"","lastModifiedDate":"2024-03-06"},{"lineNumber":53,"author":{"gitId":"jieqiboh"},"content":" // instanceof handles nulls","lastModifiedDate":"2024-03-06"},{"lineNumber":54,"author":{"gitId":"jieqiboh"},"content":" if (!(other instanceof ContactName)) {","lastModifiedDate":"2024-03-06"},{"lineNumber":55,"author":{"gitId":"jieqiboh"},"content":" return false;","lastModifiedDate":"2024-03-06"},{"lineNumber":56,"author":{"gitId":"jieqiboh"},"content":" }","lastModifiedDate":"2024-03-06"},{"lineNumber":57,"author":{"gitId":"jieqiboh"},"content":"","lastModifiedDate":"2024-03-06"},{"lineNumber":58,"author":{"gitId":"jieqiboh"},"content":" ContactName otherName \u003d (ContactName) other;","lastModifiedDate":"2024-03-06"},{"lineNumber":59,"author":{"gitId":"jieqiboh"},"content":" return contactName.equals(otherName.contactName);","lastModifiedDate":"2024-03-06"},{"lineNumber":60,"author":{"gitId":"jieqiboh"},"content":" }","lastModifiedDate":"2024-03-06"},{"lineNumber":61,"author":{"gitId":"jieqiboh"},"content":"","lastModifiedDate":"2024-03-06"},{"lineNumber":62,"author":{"gitId":"jieqiboh"},"content":" @Override","lastModifiedDate":"2024-03-06"},{"lineNumber":63,"author":{"gitId":"jieqiboh"},"content":" public int hashCode() {","lastModifiedDate":"2024-03-06"},{"lineNumber":64,"author":{"gitId":"jieqiboh"},"content":" return contactName.hashCode();","lastModifiedDate":"2024-03-06"},{"lineNumber":65,"author":{"gitId":"jieqiboh"},"content":" }","lastModifiedDate":"2024-03-06"},{"lineNumber":66,"author":{"gitId":"jieqiboh"},"content":"}","lastModifiedDate":"2024-03-06"}],"authorContributionMap":{"jieqiboh":66}},{"path":"src/main/java/seedu/address/model/internship/ContactNumber.java","fileType":"functional-code","lines":[{"lineNumber":1,"author":{"gitId":"jieqiboh"},"content":"package seedu.address.model.internship;","lastModifiedDate":"2024-03-06"},{"lineNumber":2,"author":{"gitId":"jieqiboh"},"content":"","lastModifiedDate":"2024-03-06"},{"lineNumber":3,"author":{"gitId":"jieqiboh"},"content":"import static java.util.Objects.requireNonNull;","lastModifiedDate":"2024-03-06"},{"lineNumber":4,"author":{"gitId":"jieqiboh"},"content":"import static seedu.address.commons.util.AppUtil.checkArgument;","lastModifiedDate":"2024-03-06"},{"lineNumber":5,"author":{"gitId":"jieqiboh"},"content":"","lastModifiedDate":"2024-03-06"},{"lineNumber":6,"author":{"gitId":"jieqiboh"},"content":"/**","lastModifiedDate":"2024-03-06"},{"lineNumber":7,"author":{"gitId":"jieqiboh"},"content":" * Represents an Internship Contact\u0027s contactNumber in the internship book.","lastModifiedDate":"2024-03-06"},{"lineNumber":8,"author":{"gitId":"jieqiboh"},"content":" * Guarantees: immutable; is valid as declared in {@link #isValidContactNumber(String)}","lastModifiedDate":"2024-03-06"},{"lineNumber":9,"author":{"gitId":"jieqiboh"},"content":" */","lastModifiedDate":"2024-03-06"},{"lineNumber":10,"author":{"gitId":"jieqiboh"},"content":"","lastModifiedDate":"2024-03-06"},{"lineNumber":11,"author":{"gitId":"jieqiboh"},"content":"public class ContactNumber {","lastModifiedDate":"2024-03-06"},{"lineNumber":12,"author":{"gitId":"jieqiboh"},"content":" public static final String MESSAGE_CONSTRAINTS \u003d","lastModifiedDate":"2024-03-06"},{"lineNumber":13,"author":{"gitId":"jieqiboh"},"content":" \"ContactNumber should only contain numbers, and it should be at least 3 digits long\";","lastModifiedDate":"2024-03-06"},{"lineNumber":14,"author":{"gitId":"jieqiboh"},"content":" public static final String VALIDATION_REGEX \u003d \"\\\\d{3,}\";","lastModifiedDate":"2024-03-06"},{"lineNumber":15,"author":{"gitId":"jieqiboh"},"content":" public final String value;","lastModifiedDate":"2024-03-06"},{"lineNumber":16,"author":{"gitId":"jieqiboh"},"content":"","lastModifiedDate":"2024-03-06"},{"lineNumber":17,"author":{"gitId":"jieqiboh"},"content":" /**","lastModifiedDate":"2024-03-06"},{"lineNumber":18,"author":{"gitId":"jieqiboh"},"content":" * Constructs a {@code ContactNumber}.","lastModifiedDate":"2024-03-06"},{"lineNumber":19,"author":{"gitId":"jieqiboh"},"content":" *","lastModifiedDate":"2024-03-06"},{"lineNumber":20,"author":{"gitId":"jieqiboh"},"content":" * @param contactNumber A valid contactNumber.","lastModifiedDate":"2024-03-06"},{"lineNumber":21,"author":{"gitId":"jieqiboh"},"content":" */","lastModifiedDate":"2024-03-06"},{"lineNumber":22,"author":{"gitId":"jieqiboh"},"content":" public ContactNumber(String contactNumber) {","lastModifiedDate":"2024-03-06"},{"lineNumber":23,"author":{"gitId":"jieqiboh"},"content":" requireNonNull(contactNumber);","lastModifiedDate":"2024-03-06"},{"lineNumber":24,"author":{"gitId":"jieqiboh"},"content":" checkArgument(isValidContactNumber(contactNumber), MESSAGE_CONSTRAINTS);","lastModifiedDate":"2024-03-06"},{"lineNumber":25,"author":{"gitId":"jieqiboh"},"content":" value \u003d contactNumber;","lastModifiedDate":"2024-03-06"},{"lineNumber":26,"author":{"gitId":"jieqiboh"},"content":" }","lastModifiedDate":"2024-03-06"},{"lineNumber":27,"author":{"gitId":"jieqiboh"},"content":"","lastModifiedDate":"2024-03-06"},{"lineNumber":28,"author":{"gitId":"jieqiboh"},"content":" /**","lastModifiedDate":"2024-03-06"},{"lineNumber":29,"author":{"gitId":"jieqiboh"},"content":" * Returns true if a given string is a valid contactNumber.","lastModifiedDate":"2024-03-06"},{"lineNumber":30,"author":{"gitId":"jieqiboh"},"content":" */","lastModifiedDate":"2024-03-06"},{"lineNumber":31,"author":{"gitId":"jieqiboh"},"content":" public static boolean isValidContactNumber(String test) {","lastModifiedDate":"2024-03-06"},{"lineNumber":32,"author":{"gitId":"jieqiboh"},"content":" return test.matches(VALIDATION_REGEX);","lastModifiedDate":"2024-03-06"},{"lineNumber":33,"author":{"gitId":"jieqiboh"},"content":" }","lastModifiedDate":"2024-03-06"},{"lineNumber":34,"author":{"gitId":"jieqiboh"},"content":"","lastModifiedDate":"2024-03-06"},{"lineNumber":35,"author":{"gitId":"jieqiboh"},"content":" @Override","lastModifiedDate":"2024-03-06"},{"lineNumber":36,"author":{"gitId":"jieqiboh"},"content":" public String toString() {","lastModifiedDate":"2024-03-06"},{"lineNumber":37,"author":{"gitId":"jieqiboh"},"content":" return value;","lastModifiedDate":"2024-03-06"},{"lineNumber":38,"author":{"gitId":"jieqiboh"},"content":" }","lastModifiedDate":"2024-03-06"},{"lineNumber":39,"author":{"gitId":"jieqiboh"},"content":"","lastModifiedDate":"2024-03-06"},{"lineNumber":40,"author":{"gitId":"jieqiboh"},"content":" @Override","lastModifiedDate":"2024-03-06"},{"lineNumber":41,"author":{"gitId":"jieqiboh"},"content":" public boolean equals(Object other) {","lastModifiedDate":"2024-03-06"},{"lineNumber":42,"author":{"gitId":"jieqiboh"},"content":" if (other \u003d\u003d this) {","lastModifiedDate":"2024-03-06"},{"lineNumber":43,"author":{"gitId":"jieqiboh"},"content":" return true;","lastModifiedDate":"2024-03-06"},{"lineNumber":44,"author":{"gitId":"jieqiboh"},"content":" }","lastModifiedDate":"2024-03-06"},{"lineNumber":45,"author":{"gitId":"jieqiboh"},"content":"","lastModifiedDate":"2024-03-06"},{"lineNumber":46,"author":{"gitId":"jieqiboh"},"content":" // instanceof handles nulls","lastModifiedDate":"2024-03-06"},{"lineNumber":47,"author":{"gitId":"jieqiboh"},"content":" if (!(other instanceof seedu.address.model.internship.ContactNumber)) {","lastModifiedDate":"2024-03-06"},{"lineNumber":48,"author":{"gitId":"jieqiboh"},"content":" return false;","lastModifiedDate":"2024-03-06"},{"lineNumber":49,"author":{"gitId":"jieqiboh"},"content":" }","lastModifiedDate":"2024-03-06"},{"lineNumber":50,"author":{"gitId":"jieqiboh"},"content":"","lastModifiedDate":"2024-03-06"},{"lineNumber":51,"author":{"gitId":"jieqiboh"},"content":" seedu.address.model.internship.ContactNumber otherContactNumber \u003d","lastModifiedDate":"2024-03-06"},{"lineNumber":52,"author":{"gitId":"jieqiboh"},"content":" (seedu.address.model.internship.ContactNumber) other;","lastModifiedDate":"2024-03-06"},{"lineNumber":53,"author":{"gitId":"jieqiboh"},"content":" return value.equals(otherContactNumber.value);","lastModifiedDate":"2024-03-06"},{"lineNumber":54,"author":{"gitId":"jieqiboh"},"content":" }","lastModifiedDate":"2024-03-06"},{"lineNumber":55,"author":{"gitId":"jieqiboh"},"content":"","lastModifiedDate":"2024-03-06"},{"lineNumber":56,"author":{"gitId":"jieqiboh"},"content":" @Override","lastModifiedDate":"2024-03-06"},{"lineNumber":57,"author":{"gitId":"jieqiboh"},"content":" public int hashCode() {","lastModifiedDate":"2024-03-06"},{"lineNumber":58,"author":{"gitId":"jieqiboh"},"content":" return value.hashCode();","lastModifiedDate":"2024-03-06"},{"lineNumber":59,"author":{"gitId":"jieqiboh"},"content":" }","lastModifiedDate":"2024-03-06"},{"lineNumber":60,"author":{"gitId":"jieqiboh"},"content":"}","lastModifiedDate":"2024-03-06"},{"lineNumber":61,"author":{"gitId":"jieqiboh"},"content":"","lastModifiedDate":"2024-03-06"}],"authorContributionMap":{"jieqiboh":61}},{"path":"src/main/java/seedu/address/model/internship/Description.java","fileType":"functional-code","lines":[{"lineNumber":1,"author":{"gitId":"jieqiboh"},"content":"package seedu.address.model.internship;","lastModifiedDate":"2024-03-06"},{"lineNumber":2,"author":{"gitId":"jieqiboh"},"content":"","lastModifiedDate":"2024-03-06"},{"lineNumber":3,"author":{"gitId":"jieqiboh"},"content":"import static java.util.Objects.requireNonNull;","lastModifiedDate":"2024-03-06"},{"lineNumber":4,"author":{"gitId":"jieqiboh"},"content":"","lastModifiedDate":"2024-03-06"},{"lineNumber":5,"author":{"gitId":"jieqiboh"},"content":"/**","lastModifiedDate":"2024-03-06"},{"lineNumber":6,"author":{"gitId":"jieqiboh"},"content":" * Represents an Internship\u0027s description in the internship book.","lastModifiedDate":"2024-03-06"},{"lineNumber":7,"author":{"gitId":"jieqiboh"},"content":" */","lastModifiedDate":"2024-03-06"},{"lineNumber":8,"author":{"gitId":"jieqiboh"},"content":"public class Description {","lastModifiedDate":"2024-03-06"},{"lineNumber":9,"author":{"gitId":"jieqiboh"},"content":"","lastModifiedDate":"2024-03-06"},{"lineNumber":10,"author":{"gitId":"jieqiboh"},"content":" public final String description;","lastModifiedDate":"2024-03-06"},{"lineNumber":11,"author":{"gitId":"jieqiboh"},"content":"","lastModifiedDate":"2024-03-06"},{"lineNumber":12,"author":{"gitId":"jieqiboh"},"content":" /**","lastModifiedDate":"2024-03-06"},{"lineNumber":13,"author":{"gitId":"jieqiboh"},"content":" * Constructs a {@code Description}.","lastModifiedDate":"2024-03-06"},{"lineNumber":14,"author":{"gitId":"jieqiboh"},"content":" *","lastModifiedDate":"2024-03-06"},{"lineNumber":15,"author":{"gitId":"jieqiboh"},"content":" * @param description A valid description.","lastModifiedDate":"2024-03-06"},{"lineNumber":16,"author":{"gitId":"jieqiboh"},"content":" */","lastModifiedDate":"2024-03-06"},{"lineNumber":17,"author":{"gitId":"jieqiboh"},"content":" public Description(String description) {","lastModifiedDate":"2024-03-06"},{"lineNumber":18,"author":{"gitId":"jieqiboh"},"content":" requireNonNull(description);","lastModifiedDate":"2024-03-06"},{"lineNumber":19,"author":{"gitId":"jieqiboh"},"content":" this.description \u003d description;","lastModifiedDate":"2024-03-06"},{"lineNumber":20,"author":{"gitId":"jieqiboh"},"content":" }","lastModifiedDate":"2024-03-06"},{"lineNumber":21,"author":{"gitId":"jieqiboh"},"content":"","lastModifiedDate":"2024-03-06"},{"lineNumber":22,"author":{"gitId":"jieqiboh"},"content":" @Override","lastModifiedDate":"2024-03-06"},{"lineNumber":23,"author":{"gitId":"jieqiboh"},"content":" public String toString() {","lastModifiedDate":"2024-03-06"},{"lineNumber":24,"author":{"gitId":"jieqiboh"},"content":" return description;","lastModifiedDate":"2024-03-06"},{"lineNumber":25,"author":{"gitId":"jieqiboh"},"content":" }","lastModifiedDate":"2024-03-06"},{"lineNumber":26,"author":{"gitId":"jieqiboh"},"content":"","lastModifiedDate":"2024-03-06"},{"lineNumber":27,"author":{"gitId":"jieqiboh"},"content":" @Override","lastModifiedDate":"2024-03-06"},{"lineNumber":28,"author":{"gitId":"jieqiboh"},"content":" public boolean equals(Object other) {","lastModifiedDate":"2024-03-06"},{"lineNumber":29,"author":{"gitId":"jieqiboh"},"content":" if (other \u003d\u003d this) {","lastModifiedDate":"2024-03-06"},{"lineNumber":30,"author":{"gitId":"jieqiboh"},"content":" return true;","lastModifiedDate":"2024-03-06"},{"lineNumber":31,"author":{"gitId":"jieqiboh"},"content":" }","lastModifiedDate":"2024-03-06"},{"lineNumber":32,"author":{"gitId":"jieqiboh"},"content":"","lastModifiedDate":"2024-03-06"},{"lineNumber":33,"author":{"gitId":"jieqiboh"},"content":" // instanceof handles nulls","lastModifiedDate":"2024-03-06"},{"lineNumber":34,"author":{"gitId":"jieqiboh"},"content":" if (!(other instanceof Description)) {","lastModifiedDate":"2024-03-06"},{"lineNumber":35,"author":{"gitId":"jieqiboh"},"content":" return false;","lastModifiedDate":"2024-03-06"},{"lineNumber":36,"author":{"gitId":"jieqiboh"},"content":" }","lastModifiedDate":"2024-03-06"},{"lineNumber":37,"author":{"gitId":"jieqiboh"},"content":"","lastModifiedDate":"2024-03-06"},{"lineNumber":38,"author":{"gitId":"jieqiboh"},"content":" Description otherName \u003d (Description) other;","lastModifiedDate":"2024-03-06"},{"lineNumber":39,"author":{"gitId":"jieqiboh"},"content":" return description.equals(otherName.description);","lastModifiedDate":"2024-03-06"},{"lineNumber":40,"author":{"gitId":"jieqiboh"},"content":" }","lastModifiedDate":"2024-03-06"},{"lineNumber":41,"author":{"gitId":"jieqiboh"},"content":"","lastModifiedDate":"2024-03-06"},{"lineNumber":42,"author":{"gitId":"jieqiboh"},"content":" @Override","lastModifiedDate":"2024-03-06"},{"lineNumber":43,"author":{"gitId":"jieqiboh"},"content":" public int hashCode() {","lastModifiedDate":"2024-03-06"},{"lineNumber":44,"author":{"gitId":"jieqiboh"},"content":" return description.hashCode();","lastModifiedDate":"2024-03-06"},{"lineNumber":45,"author":{"gitId":"jieqiboh"},"content":" }","lastModifiedDate":"2024-03-06"},{"lineNumber":46,"author":{"gitId":"jieqiboh"},"content":"}","lastModifiedDate":"2024-03-06"}],"authorContributionMap":{"jieqiboh":46}},{"path":"src/main/java/seedu/address/model/internship/Internship.java","fileType":"functional-code","lines":[{"lineNumber":1,"author":{"gitId":"jieqiboh"},"content":"package seedu.address.model.internship;","lastModifiedDate":"2024-03-06"},{"lineNumber":2,"author":{"gitId":"jieqiboh"},"content":"","lastModifiedDate":"2024-03-06"},{"lineNumber":3,"author":{"gitId":"jieqiboh"},"content":"import static seedu.address.commons.util.CollectionUtil.requireAllNonNull;","lastModifiedDate":"2024-03-06"},{"lineNumber":4,"author":{"gitId":"jieqiboh"},"content":"","lastModifiedDate":"2024-03-06"},{"lineNumber":5,"author":{"gitId":"jieqiboh"},"content":"import java.util.Objects;","lastModifiedDate":"2024-03-06"},{"lineNumber":6,"author":{"gitId":"jieqiboh"},"content":"","lastModifiedDate":"2024-03-06"},{"lineNumber":7,"author":{"gitId":"jieqiboh"},"content":"import seedu.address.commons.util.ToStringBuilder;","lastModifiedDate":"2024-03-06"},{"lineNumber":8,"author":{"gitId":"jieqiboh"},"content":"","lastModifiedDate":"2024-03-06"},{"lineNumber":9,"author":{"gitId":"jieqiboh"},"content":"/**","lastModifiedDate":"2024-03-06"},{"lineNumber":10,"author":{"gitId":"jieqiboh"},"content":" * Represents an Internship in the internship book.","lastModifiedDate":"2024-03-06"},{"lineNumber":11,"author":{"gitId":"jieqiboh"},"content":" * Guarantees: details are present and not null, field values are validated, immutable.","lastModifiedDate":"2024-03-06"},{"lineNumber":12,"author":{"gitId":"jieqiboh"},"content":" */","lastModifiedDate":"2024-03-06"},{"lineNumber":13,"author":{"gitId":"jieqiboh"},"content":"public class Internship {","lastModifiedDate":"2024-03-06"},{"lineNumber":14,"author":{"gitId":"jieqiboh"},"content":" // Identity fields","lastModifiedDate":"2024-03-06"},{"lineNumber":15,"author":{"gitId":"jieqiboh"},"content":" private final CompanyName companyName;","lastModifiedDate":"2024-03-06"},{"lineNumber":16,"author":{"gitId":"jieqiboh"},"content":" private final Location location;","lastModifiedDate":"2024-03-06"},{"lineNumber":17,"author":{"gitId":"jieqiboh"},"content":" private final Description description;","lastModifiedDate":"2024-03-06"},{"lineNumber":18,"author":{"gitId":"jieqiboh"},"content":" private final Role role;","lastModifiedDate":"2024-03-06"},{"lineNumber":19,"author":{"gitId":"jieqiboh"},"content":"","lastModifiedDate":"2024-03-06"},{"lineNumber":20,"author":{"gitId":"jieqiboh"},"content":" // Data fields","lastModifiedDate":"2024-03-06"},{"lineNumber":21,"author":{"gitId":"jieqiboh"},"content":" private final ContactName contactName;","lastModifiedDate":"2024-03-06"},{"lineNumber":22,"author":{"gitId":"jieqiboh"},"content":" private final ContactEmail contactEmail;","lastModifiedDate":"2024-03-06"},{"lineNumber":23,"author":{"gitId":"jieqiboh"},"content":" private final ContactNumber contactNumber;","lastModifiedDate":"2024-03-06"},{"lineNumber":24,"author":{"gitId":"jieqiboh"},"content":" private final ApplicationStatus applicationStatus;","lastModifiedDate":"2024-03-06"},{"lineNumber":25,"author":{"gitId":"jieqiboh"},"content":" /**","lastModifiedDate":"2024-03-06"},{"lineNumber":26,"author":{"gitId":"jieqiboh"},"content":" * Every field must be present and not null.","lastModifiedDate":"2024-03-06"},{"lineNumber":27,"author":{"gitId":"jieqiboh"},"content":" */","lastModifiedDate":"2024-03-06"},{"lineNumber":28,"author":{"gitId":"jieqiboh"},"content":" public Internship(CompanyName companyName, ContactName contactName, ContactEmail contactEmail,","lastModifiedDate":"2024-03-06"},{"lineNumber":29,"author":{"gitId":"jieqiboh"},"content":" ContactNumber contactNumber, Location location, ApplicationStatus applicationStatus,","lastModifiedDate":"2024-03-06"},{"lineNumber":30,"author":{"gitId":"jieqiboh"},"content":" Description description, Role role) {","lastModifiedDate":"2024-03-06"},{"lineNumber":31,"author":{"gitId":"jieqiboh"},"content":" requireAllNonNull(companyName, contactName, contactEmail, contactNumber, location, applicationStatus,","lastModifiedDate":"2024-03-06"},{"lineNumber":32,"author":{"gitId":"jieqiboh"},"content":" description, role);","lastModifiedDate":"2024-03-06"},{"lineNumber":33,"author":{"gitId":"jieqiboh"},"content":" this.companyName \u003d companyName;","lastModifiedDate":"2024-03-06"},{"lineNumber":34,"author":{"gitId":"jieqiboh"},"content":" this.contactName \u003d contactName;","lastModifiedDate":"2024-03-06"},{"lineNumber":35,"author":{"gitId":"jieqiboh"},"content":" this.contactEmail \u003d contactEmail;","lastModifiedDate":"2024-03-06"},{"lineNumber":36,"author":{"gitId":"jieqiboh"},"content":" this.contactNumber \u003d contactNumber;","lastModifiedDate":"2024-03-06"},{"lineNumber":37,"author":{"gitId":"jieqiboh"},"content":" this.location \u003d location;","lastModifiedDate":"2024-03-06"},{"lineNumber":38,"author":{"gitId":"jieqiboh"},"content":" this.applicationStatus \u003d applicationStatus;","lastModifiedDate":"2024-03-06"},{"lineNumber":39,"author":{"gitId":"jieqiboh"},"content":" this.description \u003d description;","lastModifiedDate":"2024-03-06"},{"lineNumber":40,"author":{"gitId":"jieqiboh"},"content":" this.role \u003d role;","lastModifiedDate":"2024-03-06"},{"lineNumber":41,"author":{"gitId":"jieqiboh"},"content":" }","lastModifiedDate":"2024-03-06"},{"lineNumber":42,"author":{"gitId":"jieqiboh"},"content":"","lastModifiedDate":"2024-03-06"},{"lineNumber":43,"author":{"gitId":"jieqiboh"},"content":" public CompanyName getCompanyName() {","lastModifiedDate":"2024-03-06"},{"lineNumber":44,"author":{"gitId":"jieqiboh"},"content":" return companyName;","lastModifiedDate":"2024-03-06"},{"lineNumber":45,"author":{"gitId":"jieqiboh"},"content":" }","lastModifiedDate":"2024-03-06"},{"lineNumber":46,"author":{"gitId":"jieqiboh"},"content":"","lastModifiedDate":"2024-03-06"},{"lineNumber":47,"author":{"gitId":"jieqiboh"},"content":" public ContactName getContactName() {","lastModifiedDate":"2024-03-06"},{"lineNumber":48,"author":{"gitId":"jieqiboh"},"content":" return contactName;","lastModifiedDate":"2024-03-06"},{"lineNumber":49,"author":{"gitId":"jieqiboh"},"content":" }","lastModifiedDate":"2024-03-06"},{"lineNumber":50,"author":{"gitId":"jieqiboh"},"content":"","lastModifiedDate":"2024-03-06"},{"lineNumber":51,"author":{"gitId":"jieqiboh"},"content":" public ContactEmail getContactEmail() {","lastModifiedDate":"2024-03-06"},{"lineNumber":52,"author":{"gitId":"jieqiboh"},"content":" return contactEmail;","lastModifiedDate":"2024-03-06"},{"lineNumber":53,"author":{"gitId":"jieqiboh"},"content":" }","lastModifiedDate":"2024-03-06"},{"lineNumber":54,"author":{"gitId":"jieqiboh"},"content":"","lastModifiedDate":"2024-03-06"},{"lineNumber":55,"author":{"gitId":"jieqiboh"},"content":" public ContactNumber getContactNumber() {","lastModifiedDate":"2024-03-06"},{"lineNumber":56,"author":{"gitId":"jieqiboh"},"content":" return contactNumber;","lastModifiedDate":"2024-03-06"},{"lineNumber":57,"author":{"gitId":"jieqiboh"},"content":" }","lastModifiedDate":"2024-03-06"},{"lineNumber":58,"author":{"gitId":"jieqiboh"},"content":"","lastModifiedDate":"2024-03-06"},{"lineNumber":59,"author":{"gitId":"jieqiboh"},"content":" public Location getLocation() {","lastModifiedDate":"2024-03-06"},{"lineNumber":60,"author":{"gitId":"jieqiboh"},"content":" return location;","lastModifiedDate":"2024-03-06"},{"lineNumber":61,"author":{"gitId":"jieqiboh"},"content":" }","lastModifiedDate":"2024-03-06"},{"lineNumber":62,"author":{"gitId":"jieqiboh"},"content":"","lastModifiedDate":"2024-03-06"},{"lineNumber":63,"author":{"gitId":"jieqiboh"},"content":" public ApplicationStatus getApplicationStatus() {","lastModifiedDate":"2024-03-06"},{"lineNumber":64,"author":{"gitId":"jieqiboh"},"content":" return applicationStatus;","lastModifiedDate":"2024-03-06"},{"lineNumber":65,"author":{"gitId":"jieqiboh"},"content":" }","lastModifiedDate":"2024-03-06"},{"lineNumber":66,"author":{"gitId":"jieqiboh"},"content":"","lastModifiedDate":"2024-03-06"},{"lineNumber":67,"author":{"gitId":"jieqiboh"},"content":" public Description getDescription() {","lastModifiedDate":"2024-03-06"},{"lineNumber":68,"author":{"gitId":"jieqiboh"},"content":" return description;","lastModifiedDate":"2024-03-06"},{"lineNumber":69,"author":{"gitId":"jieqiboh"},"content":" }","lastModifiedDate":"2024-03-06"},{"lineNumber":70,"author":{"gitId":"jieqiboh"},"content":"","lastModifiedDate":"2024-03-06"},{"lineNumber":71,"author":{"gitId":"jieqiboh"},"content":" public Role getRole() {","lastModifiedDate":"2024-03-06"},{"lineNumber":72,"author":{"gitId":"jieqiboh"},"content":" return role;","lastModifiedDate":"2024-03-06"},{"lineNumber":73,"author":{"gitId":"jieqiboh"},"content":" }","lastModifiedDate":"2024-03-06"},{"lineNumber":74,"author":{"gitId":"jieqiboh"},"content":"","lastModifiedDate":"2024-03-06"},{"lineNumber":75,"author":{"gitId":"jieqiboh"},"content":" /**","lastModifiedDate":"2024-03-06"},{"lineNumber":76,"author":{"gitId":"jieqiboh"},"content":" * Returns true if both internships have the same name.","lastModifiedDate":"2024-03-06"},{"lineNumber":77,"author":{"gitId":"jieqiboh"},"content":" * This defines a weaker notion of equality between two internships.","lastModifiedDate":"2024-03-06"},{"lineNumber":78,"author":{"gitId":"jieqiboh"},"content":" */","lastModifiedDate":"2024-03-06"},{"lineNumber":79,"author":{"gitId":"jieqiboh"},"content":" public boolean isSameInternship(Internship otherInternship) {","lastModifiedDate":"2024-03-06"},{"lineNumber":80,"author":{"gitId":"jieqiboh"},"content":" if (otherInternship \u003d\u003d this) {","lastModifiedDate":"2024-03-06"},{"lineNumber":81,"author":{"gitId":"jieqiboh"},"content":" return true;","lastModifiedDate":"2024-03-06"},{"lineNumber":82,"author":{"gitId":"jieqiboh"},"content":" }","lastModifiedDate":"2024-03-06"},{"lineNumber":83,"author":{"gitId":"jieqiboh"},"content":"","lastModifiedDate":"2024-03-06"},{"lineNumber":84,"author":{"gitId":"jieqiboh"},"content":" return otherInternship !\u003d null","lastModifiedDate":"2024-03-06"},{"lineNumber":85,"author":{"gitId":"jieqiboh"},"content":" \u0026\u0026 otherInternship.getCompanyName().equals(getCompanyName());","lastModifiedDate":"2024-03-06"},{"lineNumber":86,"author":{"gitId":"jieqiboh"},"content":" }","lastModifiedDate":"2024-03-06"},{"lineNumber":87,"author":{"gitId":"jieqiboh"},"content":"","lastModifiedDate":"2024-03-06"},{"lineNumber":88,"author":{"gitId":"jieqiboh"},"content":" /**","lastModifiedDate":"2024-03-06"},{"lineNumber":89,"author":{"gitId":"jieqiboh"},"content":" * Returns true if both internships have the same identity and data fields.","lastModifiedDate":"2024-03-06"},{"lineNumber":90,"author":{"gitId":"jieqiboh"},"content":" * This defines a stronger notion of equality between two internships.","lastModifiedDate":"2024-03-06"},{"lineNumber":91,"author":{"gitId":"jieqiboh"},"content":" */","lastModifiedDate":"2024-03-06"},{"lineNumber":92,"author":{"gitId":"jieqiboh"},"content":" @Override","lastModifiedDate":"2024-03-06"},{"lineNumber":93,"author":{"gitId":"jieqiboh"},"content":" public boolean equals(Object other) {","lastModifiedDate":"2024-03-06"},{"lineNumber":94,"author":{"gitId":"jieqiboh"},"content":" if (other \u003d\u003d this) {","lastModifiedDate":"2024-03-06"},{"lineNumber":95,"author":{"gitId":"jieqiboh"},"content":" return true;","lastModifiedDate":"2024-03-06"},{"lineNumber":96,"author":{"gitId":"jieqiboh"},"content":" }","lastModifiedDate":"2024-03-06"},{"lineNumber":97,"author":{"gitId":"jieqiboh"},"content":"","lastModifiedDate":"2024-03-06"},{"lineNumber":98,"author":{"gitId":"jieqiboh"},"content":" // instanceof handles nulls","lastModifiedDate":"2024-03-06"},{"lineNumber":99,"author":{"gitId":"jieqiboh"},"content":" if (!(other instanceof Internship)) {","lastModifiedDate":"2024-03-06"},{"lineNumber":100,"author":{"gitId":"jieqiboh"},"content":" return false;","lastModifiedDate":"2024-03-06"},{"lineNumber":101,"author":{"gitId":"jieqiboh"},"content":" }","lastModifiedDate":"2024-03-06"},{"lineNumber":102,"author":{"gitId":"jieqiboh"},"content":"","lastModifiedDate":"2024-03-06"},{"lineNumber":103,"author":{"gitId":"jieqiboh"},"content":" Internship otherInternship \u003d (Internship) other;","lastModifiedDate":"2024-03-06"},{"lineNumber":104,"author":{"gitId":"jieqiboh"},"content":" return companyName.equals(otherInternship.companyName)","lastModifiedDate":"2024-03-06"},{"lineNumber":105,"author":{"gitId":"jieqiboh"},"content":" \u0026\u0026 location.equals(otherInternship.location)","lastModifiedDate":"2024-03-06"},{"lineNumber":106,"author":{"gitId":"jieqiboh"},"content":" \u0026\u0026 role.equals(otherInternship.role)","lastModifiedDate":"2024-03-06"},{"lineNumber":107,"author":{"gitId":"jieqiboh"},"content":" \u0026\u0026 description.equals(otherInternship.description);","lastModifiedDate":"2024-03-06"},{"lineNumber":108,"author":{"gitId":"jieqiboh"},"content":" }","lastModifiedDate":"2024-03-06"},{"lineNumber":109,"author":{"gitId":"jieqiboh"},"content":"","lastModifiedDate":"2024-03-06"},{"lineNumber":110,"author":{"gitId":"jieqiboh"},"content":" @Override","lastModifiedDate":"2024-03-06"},{"lineNumber":111,"author":{"gitId":"jieqiboh"},"content":" public int hashCode() {","lastModifiedDate":"2024-03-06"},{"lineNumber":112,"author":{"gitId":"jieqiboh"},"content":" // use this method for custom fields hashing instead of implementing your own","lastModifiedDate":"2024-03-06"},{"lineNumber":113,"author":{"gitId":"jieqiboh"},"content":" return Objects.hash(companyName, location, role, description);","lastModifiedDate":"2024-03-06"},{"lineNumber":114,"author":{"gitId":"jieqiboh"},"content":" }","lastModifiedDate":"2024-03-06"},{"lineNumber":115,"author":{"gitId":"jieqiboh"},"content":"","lastModifiedDate":"2024-03-06"},{"lineNumber":116,"author":{"gitId":"jieqiboh"},"content":" @Override","lastModifiedDate":"2024-03-06"},{"lineNumber":117,"author":{"gitId":"jieqiboh"},"content":" public String toString() {","lastModifiedDate":"2024-03-06"},{"lineNumber":118,"author":{"gitId":"jieqiboh"},"content":" return new ToStringBuilder(this)","lastModifiedDate":"2024-03-06"},{"lineNumber":119,"author":{"gitId":"jieqiboh"},"content":" .add(\"companyName\", companyName)","lastModifiedDate":"2024-03-06"},{"lineNumber":120,"author":{"gitId":"jieqiboh"},"content":" .add(\"contactName\", contactName)","lastModifiedDate":"2024-03-06"},{"lineNumber":121,"author":{"gitId":"jieqiboh"},"content":" .add(\"contactEmail\", contactEmail)","lastModifiedDate":"2024-03-06"},{"lineNumber":122,"author":{"gitId":"jieqiboh"},"content":" .add(\"contactNumber\", contactNumber)","lastModifiedDate":"2024-03-06"},{"lineNumber":123,"author":{"gitId":"jieqiboh"},"content":" .add(\"location\", location)","lastModifiedDate":"2024-03-06"},{"lineNumber":124,"author":{"gitId":"jieqiboh"},"content":" .add(\"applicationStatus\", applicationStatus)","lastModifiedDate":"2024-03-06"},{"lineNumber":125,"author":{"gitId":"jieqiboh"},"content":" .add(\"description\", description)","lastModifiedDate":"2024-03-06"},{"lineNumber":126,"author":{"gitId":"jieqiboh"},"content":" .add(\"role\", role)","lastModifiedDate":"2024-03-06"},{"lineNumber":127,"author":{"gitId":"jieqiboh"},"content":" .toString();","lastModifiedDate":"2024-03-06"},{"lineNumber":128,"author":{"gitId":"jieqiboh"},"content":" }","lastModifiedDate":"2024-03-06"},{"lineNumber":129,"author":{"gitId":"jieqiboh"},"content":"}","lastModifiedDate":"2024-03-06"}],"authorContributionMap":{"jieqiboh":129}},{"path":"src/main/java/seedu/address/model/internship/Location.java","fileType":"functional-code","lines":[{"lineNumber":1,"author":{"gitId":"jieqiboh"},"content":"package seedu.address.model.internship;","lastModifiedDate":"2024-03-06"},{"lineNumber":2,"author":{"gitId":"jieqiboh"},"content":"","lastModifiedDate":"2024-03-06"},{"lineNumber":3,"author":{"gitId":"jieqiboh"},"content":"import static java.util.Objects.requireNonNull;","lastModifiedDate":"2024-03-06"},{"lineNumber":4,"author":{"gitId":"jieqiboh"},"content":"","lastModifiedDate":"2024-03-06"},{"lineNumber":5,"author":{"gitId":"jieqiboh"},"content":"/**","lastModifiedDate":"2024-03-06"},{"lineNumber":6,"author":{"gitId":"jieqiboh"},"content":" * Represents an Internship\u0027s location in the internship book.","lastModifiedDate":"2024-03-06"},{"lineNumber":7,"author":{"gitId":"jieqiboh"},"content":" */","lastModifiedDate":"2024-03-06"},{"lineNumber":8,"author":{"gitId":"jieqiboh"},"content":"public class Location {","lastModifiedDate":"2024-03-06"},{"lineNumber":9,"author":{"gitId":"jieqiboh"},"content":" /**","lastModifiedDate":"2024-03-06"},{"lineNumber":10,"author":{"gitId":"jieqiboh"},"content":" * Enum of locations","lastModifiedDate":"2024-03-06"},{"lineNumber":11,"author":{"gitId":"jieqiboh"},"content":" */","lastModifiedDate":"2024-03-06"},{"lineNumber":12,"author":{"gitId":"jieqiboh"},"content":" public enum LocationEnum {","lastModifiedDate":"2024-03-06"},{"lineNumber":13,"author":{"gitId":"jieqiboh"},"content":" LOCAL,","lastModifiedDate":"2024-03-06"},{"lineNumber":14,"author":{"gitId":"jieqiboh"},"content":" OVERSEAS,","lastModifiedDate":"2024-03-06"},{"lineNumber":15,"author":{"gitId":"jieqiboh"},"content":" REMOTE","lastModifiedDate":"2024-03-06"},{"lineNumber":16,"author":{"gitId":"jieqiboh"},"content":" }","lastModifiedDate":"2024-03-06"},{"lineNumber":17,"author":{"gitId":"jieqiboh"},"content":"","lastModifiedDate":"2024-03-06"},{"lineNumber":18,"author":{"gitId":"jieqiboh"},"content":" public final LocationEnum location;","lastModifiedDate":"2024-03-06"},{"lineNumber":19,"author":{"gitId":"jieqiboh"},"content":"","lastModifiedDate":"2024-03-06"},{"lineNumber":20,"author":{"gitId":"jieqiboh"},"content":" /**","lastModifiedDate":"2024-03-06"},{"lineNumber":21,"author":{"gitId":"jieqiboh"},"content":" * Constructs a {@code ApplicationStatus}.","lastModifiedDate":"2024-03-06"},{"lineNumber":22,"author":{"gitId":"jieqiboh"},"content":" *","lastModifiedDate":"2024-03-06"},{"lineNumber":23,"author":{"gitId":"jieqiboh"},"content":" * @param location A valid location.","lastModifiedDate":"2024-03-06"},{"lineNumber":24,"author":{"gitId":"jieqiboh"},"content":" */","lastModifiedDate":"2024-03-06"},{"lineNumber":25,"author":{"gitId":"jieqiboh"},"content":" public Location(LocationEnum location) {","lastModifiedDate":"2024-03-06"},{"lineNumber":26,"author":{"gitId":"jieqiboh"},"content":" requireNonNull(location);","lastModifiedDate":"2024-03-06"},{"lineNumber":27,"author":{"gitId":"jieqiboh"},"content":" this.location \u003d location;","lastModifiedDate":"2024-03-06"},{"lineNumber":28,"author":{"gitId":"jieqiboh"},"content":" }","lastModifiedDate":"2024-03-06"},{"lineNumber":29,"author":{"gitId":"jieqiboh"},"content":"","lastModifiedDate":"2024-03-06"},{"lineNumber":30,"author":{"gitId":"jieqiboh"},"content":" @Override","lastModifiedDate":"2024-03-06"},{"lineNumber":31,"author":{"gitId":"jieqiboh"},"content":" public String toString() {","lastModifiedDate":"2024-03-06"},{"lineNumber":32,"author":{"gitId":"jieqiboh"},"content":" switch (location) {","lastModifiedDate":"2024-03-06"},{"lineNumber":33,"author":{"gitId":"jieqiboh"},"content":" case LOCAL:","lastModifiedDate":"2024-03-06"},{"lineNumber":34,"author":{"gitId":"jieqiboh"},"content":" return \"Local\";","lastModifiedDate":"2024-03-06"},{"lineNumber":35,"author":{"gitId":"jieqiboh"},"content":" case OVERSEAS:","lastModifiedDate":"2024-03-06"},{"lineNumber":36,"author":{"gitId":"jieqiboh"},"content":" return \"Overseas\";","lastModifiedDate":"2024-03-06"},{"lineNumber":37,"author":{"gitId":"jieqiboh"},"content":" case REMOTE:","lastModifiedDate":"2024-03-06"},{"lineNumber":38,"author":{"gitId":"jieqiboh"},"content":" return \"Remote\";","lastModifiedDate":"2024-03-06"},{"lineNumber":39,"author":{"gitId":"jieqiboh"},"content":" default:","lastModifiedDate":"2024-03-06"},{"lineNumber":40,"author":{"gitId":"jieqiboh"},"content":" throw new IllegalArgumentException(\"Unexpected location: \" + location);","lastModifiedDate":"2024-03-06"},{"lineNumber":41,"author":{"gitId":"jieqiboh"},"content":" }","lastModifiedDate":"2024-03-06"},{"lineNumber":42,"author":{"gitId":"jieqiboh"},"content":" }","lastModifiedDate":"2024-03-06"},{"lineNumber":43,"author":{"gitId":"jieqiboh"},"content":"","lastModifiedDate":"2024-03-06"},{"lineNumber":44,"author":{"gitId":"jieqiboh"},"content":"","lastModifiedDate":"2024-03-06"},{"lineNumber":45,"author":{"gitId":"jieqiboh"},"content":"","lastModifiedDate":"2024-03-06"},{"lineNumber":46,"author":{"gitId":"jieqiboh"},"content":" @Override","lastModifiedDate":"2024-03-06"},{"lineNumber":47,"author":{"gitId":"jieqiboh"},"content":" public int hashCode() {","lastModifiedDate":"2024-03-06"},{"lineNumber":48,"author":{"gitId":"jieqiboh"},"content":" return location.hashCode();","lastModifiedDate":"2024-03-06"},{"lineNumber":49,"author":{"gitId":"jieqiboh"},"content":" }","lastModifiedDate":"2024-03-06"},{"lineNumber":50,"author":{"gitId":"jieqiboh"},"content":"","lastModifiedDate":"2024-03-06"},{"lineNumber":51,"author":{"gitId":"jieqiboh"},"content":"}","lastModifiedDate":"2024-03-06"}],"authorContributionMap":{"jieqiboh":51}},{"path":"src/main/java/seedu/address/model/internship/Role.java","fileType":"functional-code","lines":[{"lineNumber":1,"author":{"gitId":"jieqiboh"},"content":"package seedu.address.model.internship;","lastModifiedDate":"2024-03-06"},{"lineNumber":2,"author":{"gitId":"jieqiboh"},"content":"","lastModifiedDate":"2024-03-06"},{"lineNumber":3,"author":{"gitId":"jieqiboh"},"content":"import static java.util.Objects.requireNonNull;","lastModifiedDate":"2024-03-06"},{"lineNumber":4,"author":{"gitId":"jieqiboh"},"content":"","lastModifiedDate":"2024-03-06"},{"lineNumber":5,"author":{"gitId":"jieqiboh"},"content":"/**","lastModifiedDate":"2024-03-06"},{"lineNumber":6,"author":{"gitId":"jieqiboh"},"content":" * Represent\u0027s an internship\u0027s role in the internship book","lastModifiedDate":"2024-03-06"},{"lineNumber":7,"author":{"gitId":"jieqiboh"},"content":" */","lastModifiedDate":"2024-03-06"},{"lineNumber":8,"author":{"gitId":"jieqiboh"},"content":"public class Role {","lastModifiedDate":"2024-03-06"},{"lineNumber":9,"author":{"gitId":"jieqiboh"},"content":"","lastModifiedDate":"2024-03-06"},{"lineNumber":10,"author":{"gitId":"jieqiboh"},"content":" public final String role;","lastModifiedDate":"2024-03-06"},{"lineNumber":11,"author":{"gitId":"jieqiboh"},"content":"","lastModifiedDate":"2024-03-06"},{"lineNumber":12,"author":{"gitId":"jieqiboh"},"content":" /**","lastModifiedDate":"2024-03-06"},{"lineNumber":13,"author":{"gitId":"jieqiboh"},"content":" * Constructs a {@code Role}.","lastModifiedDate":"2024-03-06"},{"lineNumber":14,"author":{"gitId":"jieqiboh"},"content":" *","lastModifiedDate":"2024-03-06"},{"lineNumber":15,"author":{"gitId":"jieqiboh"},"content":" * @param role A valid role.","lastModifiedDate":"2024-03-06"},{"lineNumber":16,"author":{"gitId":"jieqiboh"},"content":" */","lastModifiedDate":"2024-03-06"},{"lineNumber":17,"author":{"gitId":"jieqiboh"},"content":" public Role(String role) {","lastModifiedDate":"2024-03-06"},{"lineNumber":18,"author":{"gitId":"jieqiboh"},"content":" requireNonNull(role);","lastModifiedDate":"2024-03-06"},{"lineNumber":19,"author":{"gitId":"jieqiboh"},"content":" this.role \u003d role;","lastModifiedDate":"2024-03-06"},{"lineNumber":20,"author":{"gitId":"jieqiboh"},"content":" }","lastModifiedDate":"2024-03-06"},{"lineNumber":21,"author":{"gitId":"jieqiboh"},"content":"","lastModifiedDate":"2024-03-06"},{"lineNumber":22,"author":{"gitId":"jieqiboh"},"content":" @Override","lastModifiedDate":"2024-03-06"},{"lineNumber":23,"author":{"gitId":"jieqiboh"},"content":" public String toString() {","lastModifiedDate":"2024-03-06"},{"lineNumber":24,"author":{"gitId":"jieqiboh"},"content":" return role;","lastModifiedDate":"2024-03-06"},{"lineNumber":25,"author":{"gitId":"jieqiboh"},"content":" }","lastModifiedDate":"2024-03-06"},{"lineNumber":26,"author":{"gitId":"jieqiboh"},"content":"","lastModifiedDate":"2024-03-06"},{"lineNumber":27,"author":{"gitId":"jieqiboh"},"content":" @Override","lastModifiedDate":"2024-03-06"},{"lineNumber":28,"author":{"gitId":"jieqiboh"},"content":" public boolean equals(Object other) {","lastModifiedDate":"2024-03-06"},{"lineNumber":29,"author":{"gitId":"jieqiboh"},"content":" if (other \u003d\u003d this) {","lastModifiedDate":"2024-03-06"},{"lineNumber":30,"author":{"gitId":"jieqiboh"},"content":" return true;","lastModifiedDate":"2024-03-06"},{"lineNumber":31,"author":{"gitId":"jieqiboh"},"content":" }","lastModifiedDate":"2024-03-06"},{"lineNumber":32,"author":{"gitId":"jieqiboh"},"content":"","lastModifiedDate":"2024-03-06"},{"lineNumber":33,"author":{"gitId":"jieqiboh"},"content":" // instanceof handles nulls","lastModifiedDate":"2024-03-06"},{"lineNumber":34,"author":{"gitId":"jieqiboh"},"content":" if (!(other instanceof Role)) {","lastModifiedDate":"2024-03-06"},{"lineNumber":35,"author":{"gitId":"jieqiboh"},"content":" return false;","lastModifiedDate":"2024-03-06"},{"lineNumber":36,"author":{"gitId":"jieqiboh"},"content":" }","lastModifiedDate":"2024-03-06"},{"lineNumber":37,"author":{"gitId":"jieqiboh"},"content":"","lastModifiedDate":"2024-03-06"},{"lineNumber":38,"author":{"gitId":"jieqiboh"},"content":" Role otherName \u003d (Role) other;","lastModifiedDate":"2024-03-06"},{"lineNumber":39,"author":{"gitId":"jieqiboh"},"content":" return role.equals(otherName.role);","lastModifiedDate":"2024-03-06"},{"lineNumber":40,"author":{"gitId":"jieqiboh"},"content":" }","lastModifiedDate":"2024-03-06"},{"lineNumber":41,"author":{"gitId":"jieqiboh"},"content":"","lastModifiedDate":"2024-03-06"},{"lineNumber":42,"author":{"gitId":"jieqiboh"},"content":" @Override","lastModifiedDate":"2024-03-06"},{"lineNumber":43,"author":{"gitId":"jieqiboh"},"content":" public int hashCode() {","lastModifiedDate":"2024-03-06"},{"lineNumber":44,"author":{"gitId":"jieqiboh"},"content":" return role.hashCode();","lastModifiedDate":"2024-03-06"},{"lineNumber":45,"author":{"gitId":"jieqiboh"},"content":" }","lastModifiedDate":"2024-03-06"},{"lineNumber":46,"author":{"gitId":"jieqiboh"},"content":"}","lastModifiedDate":"2024-03-06"}],"authorContributionMap":{"jieqiboh":46}},{"path":"src/main/java/seedu/address/model/internship/exceptions/DuplicateInternshipException.java","fileType":"functional-code","lines":[{"lineNumber":1,"author":{"gitId":"jieqiboh"},"content":"package seedu.address.model.internship.exceptions;","lastModifiedDate":"2024-03-06"},{"lineNumber":2,"author":{"gitId":"jieqiboh"},"content":"","lastModifiedDate":"2024-03-06"},{"lineNumber":3,"author":{"gitId":"jieqiboh"},"content":"/**","lastModifiedDate":"2024-03-06"},{"lineNumber":4,"author":{"gitId":"jieqiboh"},"content":" * Signals that the operation will result in duplicate Internship (Internships are considered duplicates if they","lastModifiedDate":"2024-03-06"},{"lineNumber":5,"author":{"gitId":"jieqiboh"},"content":" * have the same identity).","lastModifiedDate":"2024-03-06"},{"lineNumber":6,"author":{"gitId":"jieqiboh"},"content":" */","lastModifiedDate":"2024-03-06"},{"lineNumber":7,"author":{"gitId":"jieqiboh"},"content":"public class DuplicateInternshipException extends RuntimeException {","lastModifiedDate":"2024-03-06"},{"lineNumber":8,"author":{"gitId":"jieqiboh"},"content":" public DuplicateInternshipException() {","lastModifiedDate":"2024-03-06"},{"lineNumber":9,"author":{"gitId":"jieqiboh"},"content":" super(\"Operation would result in duplicate persons\");","lastModifiedDate":"2024-03-06"},{"lineNumber":10,"author":{"gitId":"jieqiboh"},"content":" }","lastModifiedDate":"2024-03-06"},{"lineNumber":11,"author":{"gitId":"jieqiboh"},"content":"}","lastModifiedDate":"2024-03-06"}],"authorContributionMap":{"jieqiboh":11}},{"path":"src/main/java/seedu/address/model/internship/exceptions/InternshipNotFoundException.java","fileType":"functional-code","lines":[{"lineNumber":1,"author":{"gitId":"jieqiboh"},"content":"package seedu.address.model.internship.exceptions;","lastModifiedDate":"2024-03-06"},{"lineNumber":2,"author":{"gitId":"jieqiboh"},"content":"","lastModifiedDate":"2024-03-06"},{"lineNumber":3,"author":{"gitId":"jieqiboh"},"content":"/**","lastModifiedDate":"2024-03-06"},{"lineNumber":4,"author":{"gitId":"jieqiboh"},"content":" * Signals that the operation is unable to find the specified internship.","lastModifiedDate":"2024-03-06"},{"lineNumber":5,"author":{"gitId":"jieqiboh"},"content":" */","lastModifiedDate":"2024-03-06"},{"lineNumber":6,"author":{"gitId":"jieqiboh"},"content":"public class InternshipNotFoundException extends RuntimeException {}","lastModifiedDate":"2024-03-06"}],"authorContributionMap":{"jieqiboh":6}}] diff --git a/AY2324S2-CS2103T-W11-1_tp_master/commits.json b/AY2324S2-CS2103T-W11-1_tp_master/commits.json index 9c84e629..c9d30a8f 100644 --- a/AY2324S2-CS2103T-W11-1_tp_master/commits.json +++ b/AY2324S2-CS2103T-W11-1_tp_master/commits.json @@ -1 +1 @@ -{"authorDailyContributionsMap":{"jieqiboh":[{"date":"2024-02-29","commitResults":[{"hash":"147f8bd94f4e6e739f4d5fb4394bee05a53c8f4d","isMergeCommit":false,"messageTitle":"Update AboutUs for Boh Jie Qi","messageBody":"","fileTypesAndContributionMap":{"docs":{"insertions":10,"deletions":11}}}]},{"date":"2024-03-02","commitResults":[{"hash":"e6b5d1cca4ef66a56753ec05069bd970e195e6aa","isMergeCommit":false,"messageTitle":"Revert \"Add some non-functional requirements to the developers guide\"","messageBody":"","fileTypesAndContributionMap":{"docs":{"insertions":1,"deletions":5}}},{"hash":"51ad45e27eca66e8e736ae715427b60e4ee96956","isMergeCommit":false,"messageTitle":"Revert \"Add Donovan\u0027s information to AboutUs.md page\"","messageBody":"","fileTypesAndContributionMap":{"other":{"insertions":0,"deletions":170},"docs":{"insertions":193,"deletions":320}}},{"hash":"334acec660182075322fd74bf721537e94a51c46","isMergeCommit":true,"messageTitle":"Merge pull request #52 from AY2324S2-CS2103T-W11-1/revert-45-AddNFRToDG","messageBody":"Revert \"Add some non-functional requirements to the developers guide\"","fileTypesAndContributionMap":{}},{"hash":"6af83905a10571194c63ea3b601be1ca442b1fbf","isMergeCommit":false,"messageTitle":"Revert \"Add detailed view feature to user guide\"","messageBody":"","fileTypesAndContributionMap":{"docs":{"insertions":0,"deletions":9}}},{"hash":"c1d151799c80160da3b96471a7601d735ac426c8","isMergeCommit":true,"messageTitle":"Merge pull request #53 from AY2324S2-CS2103T-W11-1/revert-46-AddDetailedViewFeatureToUG","messageBody":"Revert \"Add detailed view feature to user guide\"","fileTypesAndContributionMap":{}},{"hash":"3faa8d9776cc7bdddb35241d09dbc8a57320a97e","isMergeCommit":true,"messageTitle":"Merge pull request #54 from AY2324S2-CS2103T-W11-1/revert-47-AddInfoToAboutUs","messageBody":"Revert \"Add Donovan\u0027s information to AboutUs.md page\"","fileTypesAndContributionMap":{}},{"hash":"3a8dd5382f82a8ba7f66094be07b8605356e89a0","isMergeCommit":true,"messageTitle":"Merge pull request #57 from CaptainKeqing/AddDetailedViewFeatureToUG","messageBody":"Add detailed view feature to User Guide","fileTypesAndContributionMap":{}},{"hash":"b7305c678f7ec67d836e6c7fa5c979e0bbe9187c","isMergeCommit":true,"messageTitle":"Merge branch \u0027master\u0027 into Update-AboutUs-JieQi","messageBody":"","fileTypesAndContributionMap":{}}]},{"date":"2024-03-05","commitResults":[{"hash":"f7b88491ee82544cfd8bc626202197214a5022c9","isMergeCommit":true,"messageTitle":"Merge pull request #71 from LWS49/update-glossary-in-DG","messageBody":"added Glossary for DG","fileTypesAndContributionMap":{}},{"hash":"3da1ec69aa41b3295271e4cc9d8f9f13fbfc9e6f","isMergeCommit":false,"messageTitle":"Add CI Badge","messageBody":"","fileTypesAndContributionMap":{"docs":{"insertions":1,"deletions":1}}},{"hash":"3bdb00d39a7bee1de00a0b48dd8d5f970aa484a8","isMergeCommit":false,"messageTitle":"Fix CI Badge Typo in README","messageBody":"","fileTypesAndContributionMap":{"docs":{"insertions":1,"deletions":1}}}]},{"date":"2024-03-06","commitResults":[{"hash":"e5c5c35dc6434c7e5fb0e5eb1da1aeee21b7982f","isMergeCommit":false,"messageTitle":"Add Internship class and its basic fields","messageBody":"","fileTypesAndContributionMap":{"functional-code":{"insertions":592,"deletions":0}}},{"hash":"7e07c732d0d10b6f2175dc50eda4846f5e9c8f0f","isMergeCommit":false,"messageTitle":"Add Javadocs and fixed styling issues","messageBody":"","fileTypesAndContributionMap":{"functional-code":{"insertions":49,"deletions":29}}}]}],"HM33-Stu":[{"date":"2024-03-01","commitResults":[{"hash":"1dfe5a875eb1ac16d6d2c461b007f2ed451c44bf","isMergeCommit":true,"messageTitle":"Merge pull request #47 from CaptainKeqing/AddInfoToAboutUs","messageBody":"Add Donovan\u0027s information to AboutUs.md page","fileTypesAndContributionMap":{}},{"hash":"3b565d7a0f0592919a5122f24e6cbf9ed09252f7","isMergeCommit":true,"messageTitle":"Merge pull request #46 from CaptainKeqing/AddDetailedViewFeatureToUG","messageBody":"Add detailed view feature to user guide","fileTypesAndContributionMap":{}},{"hash":"70f2e06a5844712b7d18176f35e33db0446773ff","isMergeCommit":true,"messageTitle":"Merge pull request #45 from CaptainKeqing/AddNFRToDG","messageBody":"Add some non-functional requirements to the developers guide","fileTypesAndContributionMap":{}},{"hash":"8c1ebc21de5a22752fae34eee06ab6e126ace2b9","isMergeCommit":false,"messageTitle":"Update Hari\u0027s info, photo and contribution document to AboutUs","messageBody":"","fileTypesAndContributionMap":{"docs":{"insertions":18,"deletions":11}}},{"hash":"91ab84fa37bb1ce6548b74479787946aeab6852a","isMergeCommit":false,"messageTitle":"Update AboutUs to resolve image issues","messageBody":"","fileTypesAndContributionMap":{"docs":{"insertions":1,"deletions":1}}},{"hash":"7543b354f93176e03aab7b4fc357e598cbe24514","isMergeCommit":false,"messageTitle":"Amend Add and Delete details in the User Guide","messageBody":"","fileTypesAndContributionMap":{"docs":{"insertions":21,"deletions":17}}}]},{"date":"2024-03-02","commitResults":[{"hash":"feb7e06ef2ba9df639d5d058f7afcf6b0212090d","isMergeCommit":false,"messageTitle":"Add Use Cases and Stories To DG","messageBody":"","fileTypesAndContributionMap":{"docs":{"insertions":173,"deletions":24}}},{"hash":"e01435f5aa3cea71f1ec37a3715532d252c894e4","isMergeCommit":false,"messageTitle":"Update AboutUs.md","messageBody":"","fileTypesAndContributionMap":{"docs":{"insertions":1,"deletions":1}}},{"hash":"d73b262cdc9338a7cb39691299951d342ada901e","isMergeCommit":false,"messageTitle":"Rename HM33-Stu.md to hm33-stu.md","messageBody":"","fileTypesAndContributionMap":{"docs":{"insertions":0,"deletions":0}}},{"hash":"6c3d376a11470265999c222ea627b2611fc8b9bb","isMergeCommit":false,"messageTitle":"Update AboutUs.md","messageBody":"","fileTypesAndContributionMap":{"docs":{"insertions":2,"deletions":2}}},{"hash":"396abd9e49cccded4afd5f9491e0a739702aef30","isMergeCommit":true,"messageTitle":"Merge branch \u0027AY2324S2-CS2103T-W11-1:master\u0027 into AddUseCasesToDG","messageBody":"","fileTypesAndContributionMap":{}},{"hash":"7651a1dee8d79b9abcd0a217f0cfc48a46218e04","isMergeCommit":true,"messageTitle":"Merge branch \u0027master\u0027 into AmendAddAndDeleteFeatureInUG","messageBody":"","fileTypesAndContributionMap":{}},{"hash":"8dc9d50af0c97b931b0ccf93e80ec626bf286a65","isMergeCommit":true,"messageTitle":"Merge pull request #62 from jieqiboh/Update-AboutUs-JieQi","messageBody":"Add JieQi\u0027s Information to AboutUs.md","fileTypesAndContributionMap":{}},{"hash":"975c26c5efca96aa21b30e146df97b5b48386d52","isMergeCommit":false,"messageTitle":"Rename LWS49.md to lws49.md","messageBody":"","fileTypesAndContributionMap":{"docs":{"insertions":0,"deletions":0}}},{"hash":"a240f75c84684efc22ad959998e8b38e94e4e349","isMergeCommit":false,"messageTitle":"Update AboutUs.md","messageBody":"","fileTypesAndContributionMap":{"docs":{"insertions":1,"deletions":1}}},{"hash":"fcc59b85a88ead1d76237ac00498bfff5ffa10d3","isMergeCommit":false,"messageTitle":"Update AboutUs.md","messageBody":"","fileTypesAndContributionMap":{"docs":{"insertions":1,"deletions":1}}},{"hash":"ca3d52201a95aa7f0359e6731f5ea5fdae20a610","isMergeCommit":false,"messageTitle":"Update AboutUs.md","messageBody":"","fileTypesAndContributionMap":{"docs":{"insertions":2,"deletions":1}}},{"hash":"9ff0bd19fc3acad17a1504d2c16f0bc25d7badf9","isMergeCommit":true,"messageTitle":"Merge pull request #64 from LWS49/addWeiShengtoAboutUs","messageBody":"add Wei Sheng in AboutUs","fileTypesAndContributionMap":{}}]}],"LWS49":[{"date":"2024-03-02","commitResults":[{"hash":"e0dfe098e701efd2384527a36839a5448ae0dda2","isMergeCommit":true,"messageTitle":"Merge pull request #56 from CaptainKeqing/AddDonovanToAboutUs","messageBody":"Add Donovan\u0027s info to AboutUs.md","fileTypesAndContributionMap":{}},{"hash":"f7a40d4ab96fccfad99be89c49321ec4eda371de","isMergeCommit":false,"messageTitle":"add Wei Sheng in AboutUs","messageBody":"","fileTypesAndContributionMap":{"docs":{"insertions":12,"deletions":5}}},{"hash":"247c7c1ee1f0adbb035c9347d2ecf644c51ae31e","isMergeCommit":false,"messageTitle":"add edit to User Guide","messageBody":"","fileTypesAndContributionMap":{"docs":{"insertions":6,"deletions":8}}},{"hash":"7d66ac9b88950c33811f77e347be14e08cc86543","isMergeCommit":true,"messageTitle":"Merge branch \u0027master\u0027 into addEditToDG","messageBody":"","fileTypesAndContributionMap":{}},{"hash":"7da06ed18aae86d2e01a18fd6d2935e9e7d7bed0","isMergeCommit":true,"messageTitle":"Merge branch \u0027master\u0027 into addWeiShengtoAboutUs","messageBody":"","fileTypesAndContributionMap":{}},{"hash":"13a69643cb1112fd47c1cf97ec8093a93154c9e1","isMergeCommit":false,"messageTitle":"switch lws49 to lower case","messageBody":"","fileTypesAndContributionMap":{"docs":{"insertions":2,"deletions":2}}},{"hash":"c9b9b85ddea33ae388ca6127cf9d4bf478f005f9","isMergeCommit":true,"messageTitle":"resolve merge conflict","messageBody":"","fileTypesAndContributionMap":{}},{"hash":"1ba6dd3fbb58e6f2410f56859a383a9dd218619a","isMergeCommit":true,"messageTitle":"Merge pull request #67 from theman-oj10/master","messageBody":"Update About me and UserGuide","fileTypesAndContributionMap":{}}]},{"date":"2024-03-04","commitResults":[{"hash":"28d9446a8ffb79ed473b2853517690357e5dfec2","isMergeCommit":false,"messageTitle":"added Glossary for DG","messageBody":"","fileTypesAndContributionMap":{"docs":{"insertions":4,"deletions":1}}},{"hash":"1c66844f034551a05e6fbde0fc8aa5717b90dbce","isMergeCommit":false,"messageTitle":"added Glossary for DG","messageBody":"","fileTypesAndContributionMap":{"docs":{"insertions":1,"deletions":1}}}]}],"theman-oj10":[{"date":"2024-03-02","commitResults":[{"hash":"0ab40778b566594cb320c101e9f7d2e2ada8e013","isMergeCommit":true,"messageTitle":"Merge pull request #58 from CaptainKeqing/AddNFRToDG","messageBody":"Add some non-functional requirements to Developer\u0027s Guide","fileTypesAndContributionMap":{}},{"hash":"9cbbf16385fe3aa3cb81551f69d4724feeea4431","isMergeCommit":false,"messageTitle":"Update About me and UserGuide","messageBody":"","fileTypesAndContributionMap":{"docs":{"insertions":23,"deletions":16}}}]},{"date":"2024-03-07","commitResults":[{"hash":"36c3bf8f3799b18bcdcc35c36fe9a0ad6f92f559","isMergeCommit":true,"messageTitle":"Merge pull request #74 from jieqiboh/Add-Skeletal-Internship","messageBody":"Add skeletal internship","fileTypesAndContributionMap":{}}]}],"CaptainKeqing":[{"date":"2024-03-01","commitResults":[{"hash":"311bc16eb0a8c0e86385091721332ae0d7809c78","isMergeCommit":true,"messageTitle":"Sync with team repo master","messageBody":"","fileTypesAndContributionMap":{}},{"hash":"eba4f964e44e36219ce3fcb4f1aa215b2b71b957","isMergeCommit":false,"messageTitle":"Update Donovan\u0027s info on AboutUs page","messageBody":"","fileTypesAndContributionMap":{"docs":{"insertions":15,"deletions":9}}},{"hash":"179c60565bff15d95db6710f2f72b0beea49816c","isMergeCommit":false,"messageTitle":"Add detailed view feature to UG","messageBody":"","fileTypesAndContributionMap":{"docs":{"insertions":9,"deletions":0}}},{"hash":"ee33402e78b725faa8e9f346b15b64bfa52e2aef","isMergeCommit":false,"messageTitle":"Add some non-functional requirements to Developer\u0027s Guide","messageBody":"","fileTypesAndContributionMap":{"docs":{"insertions":5,"deletions":1}}}]},{"date":"2024-03-02","commitResults":[{"hash":"68a002e78ec8e8fdb711a19b5a8e87a67a43da7e","isMergeCommit":false,"messageTitle":"Add Donovan\u0027s info to AboutUs.md","messageBody":"","fileTypesAndContributionMap":{"docs":{"insertions":13,"deletions":5}}},{"hash":"5729b68e59333c39188f5ef6c01e5931d0e9dc9c","isMergeCommit":false,"messageTitle":"Add detailed view feature to User Guide","messageBody":"","fileTypesAndContributionMap":{"docs":{"insertions":44,"deletions":29}}},{"hash":"6726574612d1e3fa7b0d4781a736639de31936e7","isMergeCommit":false,"messageTitle":"Add newline to EOF for UserGuide.md","messageBody":"","fileTypesAndContributionMap":{"docs":{"insertions":1,"deletions":1}}},{"hash":"2c5806b8efd469e82d947041264a74d61e60f131","isMergeCommit":false,"messageTitle":"Add newline to EOF for captainkeqing.md","messageBody":"","fileTypesAndContributionMap":{"docs":{"insertions":1,"deletions":1}}},{"hash":"a55599566ec7aa7bb3f2e1f96b9d2a03893bf2ff","isMergeCommit":false,"messageTitle":"Add some non-functional requirements to Developer\u0027s Guide","messageBody":"","fileTypesAndContributionMap":{"docs":{"insertions":86,"deletions":68}}},{"hash":"c1fb6a50ec79d8e493c0b0dda524a7c70c623d2c","isMergeCommit":false,"messageTitle":"Fix old version of md not matching Jekyll","messageBody":"","fileTypesAndContributionMap":{"docs":{"insertions":51,"deletions":65}}},{"hash":"a8b4bc6fbe760c34572c4ce7c8d512da678a2129","isMergeCommit":false,"messageTitle":"Fix old version of md not matching Jekyll","messageBody":"","fileTypesAndContributionMap":{"docs":{"insertions":23,"deletions":29}}},{"hash":"0a6a1f9472751e7d0817f6ce1a7a03604ee066dd","isMergeCommit":true,"messageTitle":"Merge branch \u0027master\u0027 into AddInfoToAboutUs","messageBody":"","fileTypesAndContributionMap":{}},{"hash":"9fa42afc6dea7311b048d860ed099d1be5c175f7","isMergeCommit":true,"messageTitle":"Merge pull request #49 from HM33-Stu/AddInfoToAboutUs","messageBody":"Add Hari\u0027s information to AboutUs.md page","fileTypesAndContributionMap":{}},{"hash":"9dfd12d07af38016792fad0ab1788e1b85635776","isMergeCommit":true,"messageTitle":"Merge pull request #51 from HM33-Stu/AddUseCasesToDG","messageBody":"Add Use Cases (and Stories) To DG","fileTypesAndContributionMap":{}},{"hash":"2dba60f6e1198052f2a74b3391b9e2adcd41ff2a","isMergeCommit":true,"messageTitle":"Merge pull request #50 from HM33-Stu/AmendAddAndDeleteFeatureInUG","messageBody":"Amend Add and Delete details in the User Guide","fileTypesAndContributionMap":{}},{"hash":"9ed484d58160592c5d6a01b746ff2ca6dd92648b","isMergeCommit":true,"messageTitle":"Merge pull request #65 from LWS49/addEditToDG","messageBody":"add edit to User Guide","fileTypesAndContributionMap":{}}]}]},"authorFileTypeContributionMap":{"jieqiboh":{"docs":95,"functional-code":612,"test-code":0,"other":679},"HM33-Stu":{"docs":200,"functional-code":0,"test-code":0},"LWS49":{"docs":25,"functional-code":0,"test-code":0},"theman-oj10":{"docs":23,"functional-code":0,"test-code":0},"CaptainKeqing":{"docs":28,"functional-code":0,"test-code":0}},"authorContributionVariance":{"jieqiboh":56996.965,"HM33-Stu":3092.9236,"LWS49":82.0,"theman-oj10":100.882675,"CaptainKeqing":11468.384},"authorDisplayNameMap":{"jieqiboh":"CS2103T-W11-1 BOH ..E QI","HM33-Stu":"CS2103T-W11-1 HARI..OHAN","LWS49":"CS2103T-W11-1 LOW ..HENG","theman-oj10":"CS2103T-W11-1 RAJE..NDER","CaptainKeqing":"CS2103T-W11-1 LOH ..OVAN"}} +{"authorDailyContributionsMap":{"jieqiboh":[{"date":"2024-02-29","commitResults":[{"hash":"147f8bd94f4e6e739f4d5fb4394bee05a53c8f4d","isMergeCommit":false,"messageTitle":"Update AboutUs for Boh Jie Qi","messageBody":"","fileTypesAndContributionMap":{"docs":{"insertions":10,"deletions":11}}}]},{"date":"2024-03-02","commitResults":[{"hash":"e6b5d1cca4ef66a56753ec05069bd970e195e6aa","isMergeCommit":false,"messageTitle":"Revert \"Add some non-functional requirements to the developers guide\"","messageBody":"","fileTypesAndContributionMap":{"docs":{"insertions":1,"deletions":5}}},{"hash":"51ad45e27eca66e8e736ae715427b60e4ee96956","isMergeCommit":false,"messageTitle":"Revert \"Add Donovan\u0027s information to AboutUs.md page\"","messageBody":"","fileTypesAndContributionMap":{"other":{"insertions":0,"deletions":170},"docs":{"insertions":193,"deletions":320}}},{"hash":"334acec660182075322fd74bf721537e94a51c46","isMergeCommit":true,"messageTitle":"Merge pull request #52 from AY2324S2-CS2103T-W11-1/revert-45-AddNFRToDG","messageBody":"Revert \"Add some non-functional requirements to the developers guide\"","fileTypesAndContributionMap":{}},{"hash":"6af83905a10571194c63ea3b601be1ca442b1fbf","isMergeCommit":false,"messageTitle":"Revert \"Add detailed view feature to user guide\"","messageBody":"","fileTypesAndContributionMap":{"docs":{"insertions":0,"deletions":9}}},{"hash":"c1d151799c80160da3b96471a7601d735ac426c8","isMergeCommit":true,"messageTitle":"Merge pull request #53 from AY2324S2-CS2103T-W11-1/revert-46-AddDetailedViewFeatureToUG","messageBody":"Revert \"Add detailed view feature to user guide\"","fileTypesAndContributionMap":{}},{"hash":"3faa8d9776cc7bdddb35241d09dbc8a57320a97e","isMergeCommit":true,"messageTitle":"Merge pull request #54 from AY2324S2-CS2103T-W11-1/revert-47-AddInfoToAboutUs","messageBody":"Revert \"Add Donovan\u0027s information to AboutUs.md page\"","fileTypesAndContributionMap":{}},{"hash":"3a8dd5382f82a8ba7f66094be07b8605356e89a0","isMergeCommit":true,"messageTitle":"Merge pull request #57 from CaptainKeqing/AddDetailedViewFeatureToUG","messageBody":"Add detailed view feature to User Guide","fileTypesAndContributionMap":{}},{"hash":"b7305c678f7ec67d836e6c7fa5c979e0bbe9187c","isMergeCommit":true,"messageTitle":"Merge branch \u0027master\u0027 into Update-AboutUs-JieQi","messageBody":"","fileTypesAndContributionMap":{}}]},{"date":"2024-03-05","commitResults":[{"hash":"f7b88491ee82544cfd8bc626202197214a5022c9","isMergeCommit":true,"messageTitle":"Merge pull request #71 from LWS49/update-glossary-in-DG","messageBody":"added Glossary for DG","fileTypesAndContributionMap":{}},{"hash":"3da1ec69aa41b3295271e4cc9d8f9f13fbfc9e6f","isMergeCommit":false,"messageTitle":"Add CI Badge","messageBody":"","fileTypesAndContributionMap":{"docs":{"insertions":1,"deletions":1}}},{"hash":"3bdb00d39a7bee1de00a0b48dd8d5f970aa484a8","isMergeCommit":false,"messageTitle":"Fix CI Badge Typo in README","messageBody":"","fileTypesAndContributionMap":{"docs":{"insertions":1,"deletions":1}}}]},{"date":"2024-03-06","commitResults":[{"hash":"e5c5c35dc6434c7e5fb0e5eb1da1aeee21b7982f","isMergeCommit":false,"messageTitle":"Add Internship class and its basic fields","messageBody":"","fileTypesAndContributionMap":{"functional-code":{"insertions":592,"deletions":0}}},{"hash":"7e07c732d0d10b6f2175dc50eda4846f5e9c8f0f","isMergeCommit":false,"messageTitle":"Add Javadocs and fixed styling issues","messageBody":"","fileTypesAndContributionMap":{"functional-code":{"insertions":49,"deletions":29}}}]},{"date":"2024-03-08","commitResults":[{"hash":"3ba8b5e7eba6359de02db9b8c1bf3f84f7ad1106","isMergeCommit":false,"messageTitle":"Add newline to EOF for formatting","messageBody":"","fileTypesAndContributionMap":{"docs":{"insertions":7,"deletions":7}}}]}],"HM33-Stu":[{"date":"2024-03-01","commitResults":[{"hash":"1dfe5a875eb1ac16d6d2c461b007f2ed451c44bf","isMergeCommit":true,"messageTitle":"Merge pull request #47 from CaptainKeqing/AddInfoToAboutUs","messageBody":"Add Donovan\u0027s information to AboutUs.md page","fileTypesAndContributionMap":{}},{"hash":"3b565d7a0f0592919a5122f24e6cbf9ed09252f7","isMergeCommit":true,"messageTitle":"Merge pull request #46 from CaptainKeqing/AddDetailedViewFeatureToUG","messageBody":"Add detailed view feature to user guide","fileTypesAndContributionMap":{}},{"hash":"70f2e06a5844712b7d18176f35e33db0446773ff","isMergeCommit":true,"messageTitle":"Merge pull request #45 from CaptainKeqing/AddNFRToDG","messageBody":"Add some non-functional requirements to the developers guide","fileTypesAndContributionMap":{}},{"hash":"8c1ebc21de5a22752fae34eee06ab6e126ace2b9","isMergeCommit":false,"messageTitle":"Update Hari\u0027s info, photo and contribution document to AboutUs","messageBody":"","fileTypesAndContributionMap":{"docs":{"insertions":18,"deletions":11}}},{"hash":"91ab84fa37bb1ce6548b74479787946aeab6852a","isMergeCommit":false,"messageTitle":"Update AboutUs to resolve image issues","messageBody":"","fileTypesAndContributionMap":{"docs":{"insertions":1,"deletions":1}}},{"hash":"7543b354f93176e03aab7b4fc357e598cbe24514","isMergeCommit":false,"messageTitle":"Amend Add and Delete details in the User Guide","messageBody":"","fileTypesAndContributionMap":{"docs":{"insertions":21,"deletions":17}}}]},{"date":"2024-03-02","commitResults":[{"hash":"feb7e06ef2ba9df639d5d058f7afcf6b0212090d","isMergeCommit":false,"messageTitle":"Add Use Cases and Stories To DG","messageBody":"","fileTypesAndContributionMap":{"docs":{"insertions":173,"deletions":24}}},{"hash":"e01435f5aa3cea71f1ec37a3715532d252c894e4","isMergeCommit":false,"messageTitle":"Update AboutUs.md","messageBody":"","fileTypesAndContributionMap":{"docs":{"insertions":1,"deletions":1}}},{"hash":"d73b262cdc9338a7cb39691299951d342ada901e","isMergeCommit":false,"messageTitle":"Rename HM33-Stu.md to hm33-stu.md","messageBody":"","fileTypesAndContributionMap":{"docs":{"insertions":0,"deletions":0}}},{"hash":"6c3d376a11470265999c222ea627b2611fc8b9bb","isMergeCommit":false,"messageTitle":"Update AboutUs.md","messageBody":"","fileTypesAndContributionMap":{"docs":{"insertions":2,"deletions":2}}},{"hash":"396abd9e49cccded4afd5f9491e0a739702aef30","isMergeCommit":true,"messageTitle":"Merge branch \u0027AY2324S2-CS2103T-W11-1:master\u0027 into AddUseCasesToDG","messageBody":"","fileTypesAndContributionMap":{}},{"hash":"7651a1dee8d79b9abcd0a217f0cfc48a46218e04","isMergeCommit":true,"messageTitle":"Merge branch \u0027master\u0027 into AmendAddAndDeleteFeatureInUG","messageBody":"","fileTypesAndContributionMap":{}},{"hash":"8dc9d50af0c97b931b0ccf93e80ec626bf286a65","isMergeCommit":true,"messageTitle":"Merge pull request #62 from jieqiboh/Update-AboutUs-JieQi","messageBody":"Add JieQi\u0027s Information to AboutUs.md","fileTypesAndContributionMap":{}},{"hash":"975c26c5efca96aa21b30e146df97b5b48386d52","isMergeCommit":false,"messageTitle":"Rename LWS49.md to lws49.md","messageBody":"","fileTypesAndContributionMap":{"docs":{"insertions":0,"deletions":0}}},{"hash":"a240f75c84684efc22ad959998e8b38e94e4e349","isMergeCommit":false,"messageTitle":"Update AboutUs.md","messageBody":"","fileTypesAndContributionMap":{"docs":{"insertions":1,"deletions":1}}},{"hash":"fcc59b85a88ead1d76237ac00498bfff5ffa10d3","isMergeCommit":false,"messageTitle":"Update AboutUs.md","messageBody":"","fileTypesAndContributionMap":{"docs":{"insertions":1,"deletions":1}}},{"hash":"ca3d52201a95aa7f0359e6731f5ea5fdae20a610","isMergeCommit":false,"messageTitle":"Update AboutUs.md","messageBody":"","fileTypesAndContributionMap":{"docs":{"insertions":2,"deletions":1}}},{"hash":"9ff0bd19fc3acad17a1504d2c16f0bc25d7badf9","isMergeCommit":true,"messageTitle":"Merge pull request #64 from LWS49/addWeiShengtoAboutUs","messageBody":"add Wei Sheng in AboutUs","fileTypesAndContributionMap":{}}]},{"date":"2024-03-08","commitResults":[{"hash":"783415f4998ca374a626a792cf7ba11c1d8bbaf1","isMergeCommit":true,"messageTitle":"Merge pull request #77 from jieqiboh/Add-Test-Data","messageBody":"Add placeholder test data","fileTypesAndContributionMap":{}}]}],"LWS49":[{"date":"2024-03-02","commitResults":[{"hash":"e0dfe098e701efd2384527a36839a5448ae0dda2","isMergeCommit":true,"messageTitle":"Merge pull request #56 from CaptainKeqing/AddDonovanToAboutUs","messageBody":"Add Donovan\u0027s info to AboutUs.md","fileTypesAndContributionMap":{}},{"hash":"f7a40d4ab96fccfad99be89c49321ec4eda371de","isMergeCommit":false,"messageTitle":"add Wei Sheng in AboutUs","messageBody":"","fileTypesAndContributionMap":{"docs":{"insertions":12,"deletions":5}}},{"hash":"247c7c1ee1f0adbb035c9347d2ecf644c51ae31e","isMergeCommit":false,"messageTitle":"add edit to User Guide","messageBody":"","fileTypesAndContributionMap":{"docs":{"insertions":6,"deletions":8}}},{"hash":"7d66ac9b88950c33811f77e347be14e08cc86543","isMergeCommit":true,"messageTitle":"Merge branch \u0027master\u0027 into addEditToDG","messageBody":"","fileTypesAndContributionMap":{}},{"hash":"7da06ed18aae86d2e01a18fd6d2935e9e7d7bed0","isMergeCommit":true,"messageTitle":"Merge branch \u0027master\u0027 into addWeiShengtoAboutUs","messageBody":"","fileTypesAndContributionMap":{}},{"hash":"13a69643cb1112fd47c1cf97ec8093a93154c9e1","isMergeCommit":false,"messageTitle":"switch lws49 to lower case","messageBody":"","fileTypesAndContributionMap":{"docs":{"insertions":2,"deletions":2}}},{"hash":"c9b9b85ddea33ae388ca6127cf9d4bf478f005f9","isMergeCommit":true,"messageTitle":"resolve merge conflict","messageBody":"","fileTypesAndContributionMap":{}},{"hash":"1ba6dd3fbb58e6f2410f56859a383a9dd218619a","isMergeCommit":true,"messageTitle":"Merge pull request #67 from theman-oj10/master","messageBody":"Update About me and UserGuide","fileTypesAndContributionMap":{}}]},{"date":"2024-03-04","commitResults":[{"hash":"28d9446a8ffb79ed473b2853517690357e5dfec2","isMergeCommit":false,"messageTitle":"added Glossary for DG","messageBody":"","fileTypesAndContributionMap":{"docs":{"insertions":4,"deletions":1}}},{"hash":"1c66844f034551a05e6fbde0fc8aa5717b90dbce","isMergeCommit":false,"messageTitle":"added Glossary for DG","messageBody":"","fileTypesAndContributionMap":{"docs":{"insertions":1,"deletions":1}}}]}],"theman-oj10":[{"date":"2024-03-02","commitResults":[{"hash":"0ab40778b566594cb320c101e9f7d2e2ada8e013","isMergeCommit":true,"messageTitle":"Merge pull request #58 from CaptainKeqing/AddNFRToDG","messageBody":"Add some non-functional requirements to Developer\u0027s Guide","fileTypesAndContributionMap":{}},{"hash":"9cbbf16385fe3aa3cb81551f69d4724feeea4431","isMergeCommit":false,"messageTitle":"Update About me and UserGuide","messageBody":"","fileTypesAndContributionMap":{"docs":{"insertions":23,"deletions":16}}}]},{"date":"2024-03-07","commitResults":[{"hash":"36c3bf8f3799b18bcdcc35c36fe9a0ad6f92f559","isMergeCommit":true,"messageTitle":"Merge pull request #74 from jieqiboh/Add-Skeletal-Internship","messageBody":"Add skeletal internship","fileTypesAndContributionMap":{}}]}],"CaptainKeqing":[{"date":"2024-03-01","commitResults":[{"hash":"311bc16eb0a8c0e86385091721332ae0d7809c78","isMergeCommit":true,"messageTitle":"Sync with team repo master","messageBody":"","fileTypesAndContributionMap":{}},{"hash":"eba4f964e44e36219ce3fcb4f1aa215b2b71b957","isMergeCommit":false,"messageTitle":"Update Donovan\u0027s info on AboutUs page","messageBody":"","fileTypesAndContributionMap":{"docs":{"insertions":15,"deletions":9}}},{"hash":"179c60565bff15d95db6710f2f72b0beea49816c","isMergeCommit":false,"messageTitle":"Add detailed view feature to UG","messageBody":"","fileTypesAndContributionMap":{"docs":{"insertions":9,"deletions":0}}},{"hash":"ee33402e78b725faa8e9f346b15b64bfa52e2aef","isMergeCommit":false,"messageTitle":"Add some non-functional requirements to Developer\u0027s Guide","messageBody":"","fileTypesAndContributionMap":{"docs":{"insertions":5,"deletions":1}}}]},{"date":"2024-03-02","commitResults":[{"hash":"68a002e78ec8e8fdb711a19b5a8e87a67a43da7e","isMergeCommit":false,"messageTitle":"Add Donovan\u0027s info to AboutUs.md","messageBody":"","fileTypesAndContributionMap":{"docs":{"insertions":13,"deletions":5}}},{"hash":"5729b68e59333c39188f5ef6c01e5931d0e9dc9c","isMergeCommit":false,"messageTitle":"Add detailed view feature to User Guide","messageBody":"","fileTypesAndContributionMap":{"docs":{"insertions":44,"deletions":29}}},{"hash":"6726574612d1e3fa7b0d4781a736639de31936e7","isMergeCommit":false,"messageTitle":"Add newline to EOF for UserGuide.md","messageBody":"","fileTypesAndContributionMap":{"docs":{"insertions":1,"deletions":1}}},{"hash":"2c5806b8efd469e82d947041264a74d61e60f131","isMergeCommit":false,"messageTitle":"Add newline to EOF for captainkeqing.md","messageBody":"","fileTypesAndContributionMap":{"docs":{"insertions":1,"deletions":1}}},{"hash":"a55599566ec7aa7bb3f2e1f96b9d2a03893bf2ff","isMergeCommit":false,"messageTitle":"Add some non-functional requirements to Developer\u0027s Guide","messageBody":"","fileTypesAndContributionMap":{"docs":{"insertions":86,"deletions":68}}},{"hash":"c1fb6a50ec79d8e493c0b0dda524a7c70c623d2c","isMergeCommit":false,"messageTitle":"Fix old version of md not matching Jekyll","messageBody":"","fileTypesAndContributionMap":{"docs":{"insertions":51,"deletions":65}}},{"hash":"a8b4bc6fbe760c34572c4ce7c8d512da678a2129","isMergeCommit":false,"messageTitle":"Fix old version of md not matching Jekyll","messageBody":"","fileTypesAndContributionMap":{"docs":{"insertions":23,"deletions":29}}},{"hash":"0a6a1f9472751e7d0817f6ce1a7a03604ee066dd","isMergeCommit":true,"messageTitle":"Merge branch \u0027master\u0027 into AddInfoToAboutUs","messageBody":"","fileTypesAndContributionMap":{}},{"hash":"9fa42afc6dea7311b048d860ed099d1be5c175f7","isMergeCommit":true,"messageTitle":"Merge pull request #49 from HM33-Stu/AddInfoToAboutUs","messageBody":"Add Hari\u0027s information to AboutUs.md page","fileTypesAndContributionMap":{}},{"hash":"9dfd12d07af38016792fad0ab1788e1b85635776","isMergeCommit":true,"messageTitle":"Merge pull request #51 from HM33-Stu/AddUseCasesToDG","messageBody":"Add Use Cases (and Stories) To DG","fileTypesAndContributionMap":{}},{"hash":"2dba60f6e1198052f2a74b3391b9e2adcd41ff2a","isMergeCommit":true,"messageTitle":"Merge pull request #50 from HM33-Stu/AmendAddAndDeleteFeatureInUG","messageBody":"Amend Add and Delete details in the User Guide","fileTypesAndContributionMap":{}},{"hash":"9ed484d58160592c5d6a01b746ff2ca6dd92648b","isMergeCommit":true,"messageTitle":"Merge pull request #65 from LWS49/addEditToDG","messageBody":"add edit to User Guide","fileTypesAndContributionMap":{}}]}]},"authorFileTypeContributionMap":{"jieqiboh":{"docs":95,"functional-code":612,"test-code":0,"other":679},"HM33-Stu":{"docs":200,"functional-code":0,"test-code":0},"LWS49":{"docs":25,"functional-code":0,"test-code":0},"theman-oj10":{"docs":23,"functional-code":0,"test-code":0},"CaptainKeqing":{"docs":28,"functional-code":0,"test-code":0}},"authorContributionVariance":{"jieqiboh":53652.027,"HM33-Stu":2911.4402,"LWS49":77.09333,"theman-oj10":94.640015,"CaptainKeqing":10769.839},"authorDisplayNameMap":{"jieqiboh":"CS2103T-W11-1 BOH ..E QI","HM33-Stu":"CS2103T-W11-1 HARI..OHAN","LWS49":"CS2103T-W11-1 LOW ..HENG","theman-oj10":"CS2103T-W11-1 RAJE..NDER","CaptainKeqing":"CS2103T-W11-1 LOH ..OVAN"}} diff --git a/archive.zip b/archive.zip index be2f7c59..2dc892af 100644 Binary files a/archive.zip and b/archive.zip differ diff --git a/reposense-logs/reposense.log.0 b/reposense-logs/reposense.log.0 index 9edb050c..d6928d00 100644 --- a/reposense-logs/reposense.log.0 +++ b/reposense-logs/reposense.log.0 @@ -1,42 +1,42 @@ -Mar 08, 2024 4:11:09 AM reposense.system.LogsManager addFileHandler +Mar 08, 2024 9:41:33 AM reposense.system.LogsManager addFileHandler INFO: Log temp folder has been successfully created -Mar 08, 2024 4:11:09 AM reposense.parser.CsvParser validateHeader +Mar 08, 2024 9:41:33 AM reposense.parser.CsvParser validateHeader INFO: Parsed header of CSV file, repo-config.csv, and recognized columns: Ignore Standalone Config, Repository's Location, Branch, Shallow Cloning, File formats, Ignore Glob List, Ignore Authors List, Find Previous Authors, Ignore Commits List -Mar 08, 2024 4:11:09 AM reposense.parser.RepoConfigCsvParser matchValueAndKeyword +Mar 08, 2024 9:41:33 AM reposense.parser.RepoConfigCsvParser matchValueAndKeyword WARNING: Ignoring unknown value 02a7620d1ed1d78c4ed314a67cf8c359a5a97dc5;ca7ce2d5c002a436dfccc9621a3de79fb140f5c5;92f90c348b0741617ace600a4e405bbe681dd795;d2fecfe583c1c351929ad4e6afc900bcc96f45d8;7e6624f484ea788645ed2d42d34fed57a06976a6;b524367f655bd758f95a7ac73e32c35b3d0219c5;66dcd0ed0a3f94a90b339936a8421aa03eb959e0;2c111e93c9140e523e532aba953f58457561867d;beae79deffcbbdef42f3222a0d937ff4f3961f40;f539c5095bde90a01fd591b0ad5c1d633f3c07b3;ce0abf71c5163b5c97539a960017c1cb7f524243;6376848908a5ab36696cc3b233ab1d4050a1a375;21de2ce55fcc9ffe1f188da7c67b05cbbcfef840;72cbb26bf7d664fdc845206ba97c62d5dc4b4c2b;a69eccecfb02e23360f2286bf626c5ddb08dc62d;360564cb5892ae1c758678718ae0b6ce27a0c8e3 in yes column. -Mar 08, 2024 4:11:09 AM reposense.parser.CsvParser validateHeader +Mar 08, 2024 9:41:33 AM reposense.parser.CsvParser validateHeader INFO: Parsed header of CSV file, author-config.csv, and recognized columns: Author's Emails, Repository's Location, Author's GitHub ID, Branch, Author's Display Name, Ignore Glob List, Author's Git Author Name -Mar 08, 2024 4:11:09 AM reposense.model.AuthorConfiguration checkDuplicateAliases +Mar 08, 2024 9:41:33 AM reposense.model.AuthorConfiguration checkDuplicateAliases WARNING: Duplicate alias guohuang found. The alias will belong to the last author - guohuang88 -Mar 08, 2024 4:11:09 AM reposense.model.AuthorConfiguration checkDuplicateAliases +Mar 08, 2024 9:41:33 AM reposense.model.AuthorConfiguration checkDuplicateAliases WARNING: Duplicate alias amanzainal found. The alias will belong to the last author - amanzainal -Mar 08, 2024 4:11:09 AM reposense.model.AuthorConfiguration checkDuplicateAliases +Mar 08, 2024 9:41:33 AM reposense.model.AuthorConfiguration checkDuplicateAliases WARNING: Duplicate alias shuyuan found. The alias will belong to the last author - legionlegion -Mar 08, 2024 4:11:09 AM reposense.model.AuthorConfiguration checkDuplicateAliases +Mar 08, 2024 9:41:33 AM reposense.model.AuthorConfiguration checkDuplicateAliases WARNING: Duplicate alias alphajae11 found. The alias will belong to the last author - alphajae11 -Mar 08, 2024 4:11:09 AM reposense.model.AuthorConfiguration checkDuplicateAliases +Mar 08, 2024 9:41:33 AM reposense.model.AuthorConfiguration checkDuplicateAliases WARNING: Duplicate alias jayne1010 found. The alias will belong to the last author - Jayne1010 -Mar 08, 2024 4:11:09 AM reposense.model.AuthorConfiguration checkDuplicateAliases +Mar 08, 2024 9:41:33 AM reposense.model.AuthorConfiguration checkDuplicateAliases WARNING: Duplicate alias miffi found. The alias will belong to the last author - miffi -Mar 08, 2024 4:11:09 AM reposense.model.AuthorConfiguration checkDuplicateAliases +Mar 08, 2024 9:41:33 AM reposense.model.AuthorConfiguration checkDuplicateAliases WARNING: Duplicate alias windofbitter found. The alias will belong to the last author - Windofbitter -Mar 08, 2024 4:11:09 AM reposense.model.AuthorConfiguration checkDuplicateAliases +Mar 08, 2024 9:41:33 AM reposense.model.AuthorConfiguration checkDuplicateAliases WARNING: Duplicate alias guohuang found. The alias will belong to the last author - guohuang88 -Mar 08, 2024 4:11:09 AM reposense.model.AuthorConfiguration checkDuplicateAliases +Mar 08, 2024 9:41:33 AM reposense.model.AuthorConfiguration checkDuplicateAliases WARNING: Duplicate alias amanzainal found. The alias will belong to the last author - amanzainal -Mar 08, 2024 4:11:09 AM reposense.model.AuthorConfiguration checkDuplicateAliases +Mar 08, 2024 9:41:33 AM reposense.model.AuthorConfiguration checkDuplicateAliases WARNING: Duplicate alias shuyuan found. The alias will belong to the last author - legionlegion -Mar 08, 2024 4:11:09 AM reposense.model.AuthorConfiguration checkDuplicateAliases +Mar 08, 2024 9:41:33 AM reposense.model.AuthorConfiguration checkDuplicateAliases WARNING: Duplicate alias alphajae11 found. The alias will belong to the last author - alphajae11 -Mar 08, 2024 4:11:09 AM reposense.model.AuthorConfiguration checkDuplicateAliases +Mar 08, 2024 9:41:33 AM reposense.model.AuthorConfiguration checkDuplicateAliases WARNING: Duplicate alias windofbitter found. The alias will belong to the last author - Windofbitter -Mar 08, 2024 4:11:09 AM reposense.model.AuthorConfiguration checkDuplicateAliases +Mar 08, 2024 9:41:33 AM reposense.model.AuthorConfiguration checkDuplicateAliases WARNING: Duplicate alias jayne1010 found. The alias will belong to the last author - Jayne1010 -Mar 08, 2024 4:11:09 AM reposense.model.AuthorConfiguration checkDuplicateAliases +Mar 08, 2024 9:41:33 AM reposense.model.AuthorConfiguration checkDuplicateAliases WARNING: Duplicate alias miffi found. The alias will belong to the last author - miffi -Mar 08, 2024 4:11:09 AM reposense.parser.CsvParser validateHeader +Mar 08, 2024 9:41:33 AM reposense.parser.CsvParser validateHeader INFO: Parsed header of CSV file, group-config.csv, and recognized columns: Globs, Repository's Location, Group Name -Mar 08, 2024 4:11:09 AM reposense.git.GitConfig getGlobalGitLfsConfig +Mar 08, 2024 9:41:33 AM reposense.git.GitConfig getGlobalGitLfsConfig WARNING: Could not get global git lfs config java.lang.RuntimeException: reposense.system.CommandRunnerProcessException: Error returned from command git config --global --list on path . : fatal: unable to read config file '/home/runner/.gitconfig': No such file or directory @@ -52,1663 +52,1663 @@ fatal: unable to read config file '/home/runner/.gitconfig': No such file or dir at reposense.system.CommandRunner.runCommand(CommandRunner.java:21) ... 3 more -Mar 08, 2024 4:11:09 AM reposense.report.RepoCloner spawnCloneProcess +Mar 08, 2024 9:41:33 AM reposense.report.RepoCloner spawnCloneProcess INFO: Cloning in parallel from https://github.com/AY2324S2-CS2103-F15-2/tp.git... -Mar 08, 2024 4:11:09 AM reposense.report.RepoCloner spawnCloneProcess +Mar 08, 2024 9:41:33 AM reposense.report.RepoCloner spawnCloneProcess INFO: Cloning in parallel from https://github.com/AY2324S2-CS2103T-T16-1/tp.git... -Mar 08, 2024 4:11:09 AM reposense.report.RepoCloner spawnCloneProcess +Mar 08, 2024 9:41:33 AM reposense.report.RepoCloner spawnCloneProcess INFO: Cloning in parallel from https://github.com/AY2324S2-CS2103T-W10-4/tp.git... -Mar 08, 2024 4:11:09 AM reposense.report.RepoCloner spawnCloneProcess +Mar 08, 2024 9:41:33 AM reposense.report.RepoCloner spawnCloneProcess INFO: Cloning in parallel from https://github.com/AY2324S2-CS2103T-F13-3/tp.git... -Mar 08, 2024 4:11:09 AM reposense.report.RepoCloner waitForCloneProcess -INFO: Waiting for cloning of https://github.com/AY2324S2-CS2103T-F13-3/tp.git to complete... -Mar 08, 2024 4:11:09 AM reposense.report.RepoCloner waitForCloneProcess -INFO: Waiting for cloning of https://github.com/AY2324S2-CS2103T-T16-1/tp.git to complete... -Mar 08, 2024 4:11:09 AM reposense.report.RepoCloner waitForCloneProcess +Mar 08, 2024 9:41:33 AM reposense.report.RepoCloner waitForCloneProcess INFO: Waiting for cloning of https://github.com/AY2324S2-CS2103-F15-2/tp.git to complete... -Mar 08, 2024 4:11:09 AM reposense.report.RepoCloner waitForCloneProcess +Mar 08, 2024 9:41:33 AM reposense.report.RepoCloner waitForCloneProcess +INFO: Waiting for cloning of https://github.com/AY2324S2-CS2103T-F13-3/tp.git to complete... +Mar 08, 2024 9:41:33 AM reposense.report.RepoCloner waitForCloneProcess INFO: Waiting for cloning of https://github.com/AY2324S2-CS2103T-W10-4/tp.git to complete... -Mar 08, 2024 4:11:10 AM reposense.report.RepoCloner waitForCloneProcess +Mar 08, 2024 9:41:33 AM reposense.report.RepoCloner waitForCloneProcess +INFO: Waiting for cloning of https://github.com/AY2324S2-CS2103T-T16-1/tp.git to complete... +Mar 08, 2024 9:41:35 AM reposense.report.RepoCloner waitForCloneProcess INFO: Cloning of https://github.com/AY2324S2-CS2103-F15-2/tp.git completed! -Mar 08, 2024 4:11:10 AM reposense.report.RepoCloner spawnCloneProcess +Mar 08, 2024 9:41:35 AM reposense.report.RepoCloner spawnCloneProcess INFO: Cloning in parallel from https://github.com/AY2324S2-CS2103T-F10-3/tp.git... -Mar 08, 2024 4:11:10 AM reposense.report.ReportGenerator analyzeRepos +Mar 08, 2024 9:41:35 AM reposense.report.ReportGenerator analyzeRepos INFO: [1/92] Analyzing https://github.com/AY2324S2-CS2103-F15-2/tp.git (master)... -Mar 08, 2024 4:11:10 AM reposense.report.RepoCloner waitForCloneProcess +Mar 08, 2024 9:41:35 AM reposense.report.RepoCloner waitForCloneProcess INFO: Waiting for cloning of https://github.com/AY2324S2-CS2103T-F10-3/tp.git to complete... -Mar 08, 2024 4:11:10 AM reposense.report.ReportGenerator updateRepoConfig -INFO: https://github.com/AY2324S2-CS2103-F15-2/tp.git (master) does not contain a standalone config file. -Mar 08, 2024 4:11:10 AM reposense.authorship.FileInfoExtractor extractTextFileInfos -INFO: Extracting relevant file info from https://github.com/AY2324S2-CS2103-F15-2/tp.git (master)... -Mar 08, 2024 4:11:11 AM reposense.report.RepoCloner waitForCloneProcess -INFO: Cloning of https://github.com/AY2324S2-CS2103T-F13-3/tp.git completed! -Mar 08, 2024 4:11:11 AM reposense.report.RepoCloner spawnCloneProcess +Mar 08, 2024 9:41:35 AM reposense.report.RepoCloner waitForCloneProcess +INFO: Cloning of https://github.com/AY2324S2-CS2103T-T16-1/tp.git completed! +Mar 08, 2024 9:41:35 AM reposense.report.RepoCloner spawnCloneProcess INFO: Cloning in parallel from https://github.com/AY2324S2-CS2103T-W13-4/tp.git... -Mar 08, 2024 4:11:11 AM reposense.report.ReportGenerator analyzeRepos -INFO: [2/92] Analyzing https://github.com/AY2324S2-CS2103T-F13-3/tp.git (master)... -Mar 08, 2024 4:11:11 AM reposense.report.RepoCloner waitForCloneProcess +Mar 08, 2024 9:41:35 AM reposense.report.ReportGenerator analyzeRepos +INFO: [2/92] Analyzing https://github.com/AY2324S2-CS2103T-T16-1/tp.git (master)... +Mar 08, 2024 9:41:35 AM reposense.report.RepoCloner waitForCloneProcess INFO: Waiting for cloning of https://github.com/AY2324S2-CS2103T-W13-4/tp.git to complete... -Mar 08, 2024 4:11:11 AM reposense.commits.CommitInfoExtractor extractCommitInfos -INFO: Extracting commits info for https://github.com/AY2324S2-CS2103-F15-2/tp.git (master)... -Mar 08, 2024 4:11:11 AM reposense.report.RepoCloner waitForCloneProcess -INFO: Cloning of https://github.com/AY2324S2-CS2103T-W10-4/tp.git completed! -Mar 08, 2024 4:11:11 AM reposense.report.ReportGenerator analyzeRepos -INFO: [3/92] Analyzing https://github.com/AY2324S2-CS2103T-W10-4/tp.git (master)... -Mar 08, 2024 4:11:11 AM reposense.report.RepoCloner spawnCloneProcess +Mar 08, 2024 9:41:35 AM reposense.report.RepoCloner waitForCloneProcess +INFO: Cloning of https://github.com/AY2324S2-CS2103T-F13-3/tp.git completed! +Mar 08, 2024 9:41:35 AM reposense.report.ReportGenerator analyzeRepos +INFO: [3/92] Analyzing https://github.com/AY2324S2-CS2103T-F13-3/tp.git (master)... +Mar 08, 2024 9:41:35 AM reposense.report.RepoCloner spawnCloneProcess INFO: Cloning in parallel from https://github.com/AY2324S2-CS2103T-F10-2/tp.git... -Mar 08, 2024 4:11:11 AM reposense.report.ReportGenerator updateRepoConfig -INFO: https://github.com/AY2324S2-CS2103T-F13-3/tp.git (master) does not contain a standalone config file. -Mar 08, 2024 4:11:11 AM reposense.authorship.FileInfoExtractor extractTextFileInfos -INFO: Extracting relevant file info from https://github.com/AY2324S2-CS2103T-F13-3/tp.git (master)... -Mar 08, 2024 4:11:11 AM reposense.report.RepoCloner waitForCloneProcess +Mar 08, 2024 9:41:35 AM reposense.report.RepoCloner waitForCloneProcess INFO: Waiting for cloning of https://github.com/AY2324S2-CS2103T-F10-2/tp.git to complete... -Mar 08, 2024 4:11:11 AM reposense.report.RepoCloner waitForCloneProcess -INFO: Cloning of https://github.com/AY2324S2-CS2103T-T16-1/tp.git completed! -Mar 08, 2024 4:11:11 AM reposense.commits.CommitInfoAnalyzer analyzeCommits -INFO: Analyzing commits info for https://github.com/AY2324S2-CS2103-F15-2/tp.git (master)... -Mar 08, 2024 4:11:11 AM reposense.report.ReportGenerator updateRepoConfig -INFO: https://github.com/AY2324S2-CS2103T-W10-4/tp.git (master) does not contain a standalone config file. -Mar 08, 2024 4:11:11 AM reposense.authorship.FileInfoExtractor extractTextFileInfos -INFO: Extracting relevant file info from https://github.com/AY2324S2-CS2103T-W10-4/tp.git (master)... -Mar 08, 2024 4:11:11 AM reposense.report.ReportGenerator analyzeRepo -INFO: Analysis of https://github.com/AY2324S2-CS2103-F15-2/tp.git (master) completed! -Mar 08, 2024 4:11:11 AM reposense.report.RepoCloner spawnCloneProcess +Mar 08, 2024 9:41:35 AM reposense.report.RepoCloner waitForCloneProcess +INFO: Cloning of https://github.com/AY2324S2-CS2103T-W10-4/tp.git completed! +Mar 08, 2024 9:41:35 AM reposense.report.ReportGenerator updateRepoConfig +INFO: https://github.com/AY2324S2-CS2103-F15-2/tp.git (master) does not contain a standalone config file. +Mar 08, 2024 9:41:35 AM reposense.authorship.FileInfoExtractor extractTextFileInfos +INFO: Extracting relevant file info from https://github.com/AY2324S2-CS2103-F15-2/tp.git (master)... +Mar 08, 2024 9:41:35 AM reposense.report.RepoCloner spawnCloneProcess INFO: Cloning in parallel from https://github.com/AY2324S2-CS2103-F15-3/tp.git... -Mar 08, 2024 4:11:11 AM reposense.report.ReportGenerator analyzeRepos -INFO: [4/92] Analyzing https://github.com/AY2324S2-CS2103T-T16-1/tp.git (master)... -Mar 08, 2024 4:11:11 AM reposense.report.RepoCloner waitForCloneProcess +Mar 08, 2024 9:41:35 AM reposense.report.ReportGenerator analyzeRepos +INFO: [4/92] Analyzing https://github.com/AY2324S2-CS2103T-W10-4/tp.git (master)... +Mar 08, 2024 9:41:35 AM reposense.report.RepoCloner waitForCloneProcess INFO: Waiting for cloning of https://github.com/AY2324S2-CS2103-F15-3/tp.git to complete... -Mar 08, 2024 4:11:11 AM reposense.report.ReportGenerator updateRepoConfig +Mar 08, 2024 9:41:35 AM reposense.report.ReportGenerator updateRepoConfig INFO: https://github.com/AY2324S2-CS2103T-T16-1/tp.git (master) does not contain a standalone config file. -Mar 08, 2024 4:11:11 AM reposense.authorship.FileInfoExtractor extractTextFileInfos +Mar 08, 2024 9:41:35 AM reposense.authorship.FileInfoExtractor extractTextFileInfos INFO: Extracting relevant file info from https://github.com/AY2324S2-CS2103T-T16-1/tp.git (master)... -Mar 08, 2024 4:11:11 AM reposense.commits.CommitInfoExtractor extractCommitInfos +Mar 08, 2024 9:41:35 AM reposense.report.ReportGenerator updateRepoConfig +INFO: https://github.com/AY2324S2-CS2103T-F13-3/tp.git (master) does not contain a standalone config file. +Mar 08, 2024 9:41:35 AM reposense.authorship.FileInfoExtractor extractTextFileInfos +INFO: Extracting relevant file info from https://github.com/AY2324S2-CS2103T-F13-3/tp.git (master)... +Mar 08, 2024 9:41:35 AM reposense.report.ReportGenerator updateRepoConfig +INFO: https://github.com/AY2324S2-CS2103T-W10-4/tp.git (master) does not contain a standalone config file. +Mar 08, 2024 9:41:35 AM reposense.authorship.FileInfoExtractor extractTextFileInfos +INFO: Extracting relevant file info from https://github.com/AY2324S2-CS2103T-W10-4/tp.git (master)... +Mar 08, 2024 9:41:35 AM reposense.commits.CommitInfoExtractor extractCommitInfos +INFO: Extracting commits info for https://github.com/AY2324S2-CS2103-F15-2/tp.git (master)... +Mar 08, 2024 9:41:35 AM reposense.commits.CommitInfoAnalyzer analyzeCommits +INFO: Analyzing commits info for https://github.com/AY2324S2-CS2103-F15-2/tp.git (master)... +Mar 08, 2024 9:41:35 AM reposense.report.ReportGenerator analyzeRepo +INFO: Analysis of https://github.com/AY2324S2-CS2103-F15-2/tp.git (master) completed! +Mar 08, 2024 9:41:35 AM reposense.commits.CommitInfoExtractor extractCommitInfos INFO: Extracting commits info for https://github.com/AY2324S2-CS2103T-F13-3/tp.git (master)... -Mar 08, 2024 4:11:12 AM reposense.commits.CommitInfoExtractor extractCommitInfos +Mar 08, 2024 9:41:36 AM reposense.commits.CommitInfoExtractor extractCommitInfos +INFO: Extracting commits info for https://github.com/AY2324S2-CS2103T-T16-1/tp.git (master)... +Mar 08, 2024 9:41:36 AM reposense.commits.CommitInfoExtractor extractCommitInfos INFO: Extracting commits info for https://github.com/AY2324S2-CS2103T-W10-4/tp.git (master)... -Mar 08, 2024 4:11:12 AM reposense.commits.CommitInfoAnalyzer analyzeCommits +Mar 08, 2024 9:41:36 AM reposense.commits.CommitInfoAnalyzer analyzeCommits INFO: Analyzing commits info for https://github.com/AY2324S2-CS2103T-F13-3/tp.git (master)... -Mar 08, 2024 4:11:12 AM reposense.commits.CommitInfoAnalyzer analyzeCommits +Mar 08, 2024 9:41:36 AM reposense.commits.CommitInfoAnalyzer analyzeCommits +INFO: Analyzing commits info for https://github.com/AY2324S2-CS2103T-T16-1/tp.git (master)... +Mar 08, 2024 9:41:36 AM reposense.commits.CommitInfoAnalyzer analyzeCommits INFO: Analyzing commits info for https://github.com/AY2324S2-CS2103T-W10-4/tp.git (master)... -Mar 08, 2024 4:11:12 AM reposense.report.ReportGenerator analyzeRepo +Mar 08, 2024 9:41:36 AM reposense.report.ReportGenerator analyzeRepo INFO: Analysis of https://github.com/AY2324S2-CS2103T-F13-3/tp.git (master) completed! -Mar 08, 2024 4:11:12 AM reposense.commits.CommitInfoExtractor extractCommitInfos -INFO: Extracting commits info for https://github.com/AY2324S2-CS2103T-T16-1/tp.git (master)... -Mar 08, 2024 4:11:12 AM reposense.report.ReportGenerator analyzeRepo +Mar 08, 2024 9:41:36 AM reposense.report.ReportGenerator analyzeRepo +INFO: Analysis of https://github.com/AY2324S2-CS2103T-T16-1/tp.git (master) completed! +Mar 08, 2024 9:41:36 AM reposense.report.ReportGenerator analyzeRepo INFO: Analysis of https://github.com/AY2324S2-CS2103T-W10-4/tp.git (master) completed! -Mar 08, 2024 4:11:12 AM reposense.report.RepoCloner waitForCloneProcess +Mar 08, 2024 9:41:36 AM reposense.report.RepoCloner waitForCloneProcess INFO: Cloning of https://github.com/AY2324S2-CS2103-F15-3/tp.git completed! -Mar 08, 2024 4:11:12 AM reposense.report.RepoCloner waitForCloneProcess -INFO: Cloning of https://github.com/AY2324S2-CS2103T-F10-3/tp.git completed! -Mar 08, 2024 4:11:12 AM reposense.report.RepoCloner spawnCloneProcess +Mar 08, 2024 9:41:36 AM reposense.report.RepoCloner spawnCloneProcess INFO: Cloning in parallel from https://github.com/AY2324S2-CS2103-F15-1/tp.git... -Mar 08, 2024 4:11:12 AM reposense.report.ReportGenerator analyzeRepos +Mar 08, 2024 9:41:36 AM reposense.report.ReportGenerator analyzeRepos INFO: [5/92] Analyzing https://github.com/AY2324S2-CS2103-F15-3/tp.git (master)... -Mar 08, 2024 4:11:12 AM reposense.report.ReportGenerator analyzeRepos -INFO: [6/92] Analyzing https://github.com/AY2324S2-CS2103T-F10-3/tp.git (master)... -Mar 08, 2024 4:11:12 AM reposense.report.RepoCloner spawnCloneProcess -INFO: Cloning in parallel from https://github.com/AY2324S2-CS2103T-T16-2/tp.git... -Mar 08, 2024 4:11:12 AM reposense.commits.CommitInfoAnalyzer analyzeCommits -INFO: Analyzing commits info for https://github.com/AY2324S2-CS2103T-T16-1/tp.git (master)... -Mar 08, 2024 4:11:12 AM reposense.report.RepoCloner waitForCloneProcess -INFO: Waiting for cloning of https://github.com/AY2324S2-CS2103T-T16-2/tp.git to complete... -Mar 08, 2024 4:11:12 AM reposense.report.ReportGenerator analyzeRepo -INFO: Analysis of https://github.com/AY2324S2-CS2103T-T16-1/tp.git (master) completed! -Mar 08, 2024 4:11:12 AM reposense.report.RepoCloner waitForCloneProcess +Mar 08, 2024 9:41:36 AM reposense.report.RepoCloner waitForCloneProcess INFO: Waiting for cloning of https://github.com/AY2324S2-CS2103-F15-1/tp.git to complete... -Mar 08, 2024 4:11:12 AM reposense.report.RepoCloner waitForCloneProcess -INFO: Cloning of https://github.com/AY2324S2-CS2103T-W13-4/tp.git completed! -Mar 08, 2024 4:11:12 AM reposense.report.ReportGenerator updateRepoConfig -INFO: https://github.com/AY2324S2-CS2103T-F10-3/tp.git (master) does not contain a standalone config file. -Mar 08, 2024 4:11:12 AM reposense.authorship.FileInfoExtractor extractTextFileInfos -INFO: Extracting relevant file info from https://github.com/AY2324S2-CS2103T-F10-3/tp.git (master)... -Mar 08, 2024 4:11:12 AM reposense.report.RepoCloner spawnCloneProcess -INFO: Cloning in parallel from https://github.com/AY2324S2-CS2103T-T10-1/tp.git... -Mar 08, 2024 4:11:12 AM reposense.report.ReportGenerator analyzeRepos -INFO: [7/92] Analyzing https://github.com/AY2324S2-CS2103T-W13-4/tp.git (master)... -Mar 08, 2024 4:11:12 AM reposense.report.ReportGenerator updateRepoConfig +Mar 08, 2024 9:41:36 AM reposense.report.ReportGenerator updateRepoConfig INFO: https://github.com/AY2324S2-CS2103-F15-3/tp.git (master) does not contain a standalone config file. -Mar 08, 2024 4:11:12 AM reposense.authorship.FileInfoExtractor extractTextFileInfos +Mar 08, 2024 9:41:36 AM reposense.authorship.FileInfoExtractor extractTextFileInfos INFO: Extracting relevant file info from https://github.com/AY2324S2-CS2103-F15-3/tp.git (master)... -Mar 08, 2024 4:11:12 AM reposense.report.RepoCloner waitForCloneProcess -INFO: Waiting for cloning of https://github.com/AY2324S2-CS2103T-T10-1/tp.git to complete... -Mar 08, 2024 4:11:12 AM reposense.report.ReportGenerator updateRepoConfig +Mar 08, 2024 9:41:36 AM reposense.report.RepoCloner waitForCloneProcess +INFO: Cloning of https://github.com/AY2324S2-CS2103T-W13-4/tp.git completed! +Mar 08, 2024 9:41:36 AM reposense.report.RepoCloner spawnCloneProcess +INFO: Cloning in parallel from https://github.com/AY2324S2-CS2103T-T16-2/tp.git... +Mar 08, 2024 9:41:36 AM reposense.report.ReportGenerator analyzeRepos +INFO: [6/92] Analyzing https://github.com/AY2324S2-CS2103T-W13-4/tp.git (master)... +Mar 08, 2024 9:41:36 AM reposense.report.RepoCloner waitForCloneProcess +INFO: Waiting for cloning of https://github.com/AY2324S2-CS2103T-T16-2/tp.git to complete... +Mar 08, 2024 9:41:36 AM reposense.report.ReportGenerator updateRepoConfig INFO: https://github.com/AY2324S2-CS2103T-W13-4/tp.git (master) does not contain a standalone config file. -Mar 08, 2024 4:11:12 AM reposense.authorship.FileInfoExtractor extractTextFileInfos +Mar 08, 2024 9:41:36 AM reposense.authorship.FileInfoExtractor extractTextFileInfos INFO: Extracting relevant file info from https://github.com/AY2324S2-CS2103T-W13-4/tp.git (master)... -Mar 08, 2024 4:11:13 AM reposense.report.RepoCloner waitForCloneProcess +Mar 08, 2024 9:41:36 AM reposense.report.RepoCloner waitForCloneProcess INFO: Cloning of https://github.com/AY2324S2-CS2103T-F10-2/tp.git completed! -Mar 08, 2024 4:11:13 AM reposense.report.ReportGenerator analyzeRepos -INFO: [8/92] Analyzing https://github.com/AY2324S2-CS2103T-F10-2/tp.git (master)... -Mar 08, 2024 4:11:13 AM reposense.report.RepoCloner spawnCloneProcess +Mar 08, 2024 9:41:36 AM reposense.report.RepoCloner waitForCloneProcess +INFO: Cloning of https://github.com/AY2324S2-CS2103T-F10-3/tp.git completed! +Mar 08, 2024 9:41:36 AM reposense.report.RepoCloner spawnCloneProcess +INFO: Cloning in parallel from https://github.com/AY2324S2-CS2103T-T10-1/tp.git... +Mar 08, 2024 9:41:36 AM reposense.report.ReportGenerator analyzeRepos +INFO: [7/92] Analyzing https://github.com/AY2324S2-CS2103T-F10-3/tp.git (master)... +Mar 08, 2024 9:41:37 AM reposense.report.RepoCloner spawnCloneProcess INFO: Cloning in parallel from https://github.com/AY2324S2-CS2103T-F13-2/tp.git... -Mar 08, 2024 4:11:13 AM reposense.report.RepoCloner waitForCloneProcess +Mar 08, 2024 9:41:37 AM reposense.report.ReportGenerator analyzeRepos +INFO: [8/92] Analyzing https://github.com/AY2324S2-CS2103T-F10-2/tp.git (master)... +Mar 08, 2024 9:41:37 AM reposense.report.RepoCloner waitForCloneProcess INFO: Waiting for cloning of https://github.com/AY2324S2-CS2103T-F13-2/tp.git to complete... -Mar 08, 2024 4:11:13 AM reposense.commits.CommitInfoExtractor extractCommitInfos -INFO: Extracting commits info for https://github.com/AY2324S2-CS2103T-F10-3/tp.git (master)... -Mar 08, 2024 4:11:13 AM reposense.commits.CommitInfoExtractor extractCommitInfos -INFO: Extracting commits info for https://github.com/AY2324S2-CS2103T-W13-4/tp.git (master)... -Mar 08, 2024 4:11:13 AM reposense.report.ReportGenerator updateRepoConfig +Mar 08, 2024 9:41:37 AM reposense.report.ReportGenerator updateRepoConfig +INFO: https://github.com/AY2324S2-CS2103T-F10-3/tp.git (master) does not contain a standalone config file. +Mar 08, 2024 9:41:37 AM reposense.authorship.FileInfoExtractor extractTextFileInfos +INFO: Extracting relevant file info from https://github.com/AY2324S2-CS2103T-F10-3/tp.git (master)... +Mar 08, 2024 9:41:37 AM reposense.report.RepoCloner waitForCloneProcess +INFO: Waiting for cloning of https://github.com/AY2324S2-CS2103T-T10-1/tp.git to complete... +Mar 08, 2024 9:41:37 AM reposense.report.ReportGenerator updateRepoConfig INFO: https://github.com/AY2324S2-CS2103T-F10-2/tp.git (master) does not contain a standalone config file. -Mar 08, 2024 4:11:13 AM reposense.authorship.FileInfoExtractor extractTextFileInfos +Mar 08, 2024 9:41:37 AM reposense.authorship.FileInfoExtractor extractTextFileInfos INFO: Extracting relevant file info from https://github.com/AY2324S2-CS2103T-F10-2/tp.git (master)... -Mar 08, 2024 4:11:13 AM reposense.commits.CommitInfoExtractor extractCommitInfos +Mar 08, 2024 9:41:37 AM reposense.commits.CommitInfoExtractor extractCommitInfos INFO: Extracting commits info for https://github.com/AY2324S2-CS2103-F15-3/tp.git (master)... -Mar 08, 2024 4:11:13 AM reposense.commits.CommitInfoAnalyzer analyzeCommits -INFO: Analyzing commits info for https://github.com/AY2324S2-CS2103T-F10-3/tp.git (master)... -Mar 08, 2024 4:11:13 AM reposense.report.ReportGenerator analyzeRepo -INFO: Analysis of https://github.com/AY2324S2-CS2103T-F10-3/tp.git (master) completed! -Mar 08, 2024 4:11:13 AM reposense.commits.CommitInfoAnalyzer analyzeCommits -INFO: Analyzing commits info for https://github.com/AY2324S2-CS2103T-W13-4/tp.git (master)... -Mar 08, 2024 4:11:13 AM reposense.commits.CommitInfoAnalyzer analyzeCommits +Mar 08, 2024 9:41:37 AM reposense.commits.CommitInfoExtractor extractCommitInfos +INFO: Extracting commits info for https://github.com/AY2324S2-CS2103T-W13-4/tp.git (master)... +Mar 08, 2024 9:41:37 AM reposense.commits.CommitInfoAnalyzer analyzeCommits INFO: Analyzing commits info for https://github.com/AY2324S2-CS2103-F15-3/tp.git (master)... -Mar 08, 2024 4:11:13 AM reposense.report.ReportGenerator analyzeRepo +Mar 08, 2024 9:41:37 AM reposense.report.ReportGenerator analyzeRepo INFO: Analysis of https://github.com/AY2324S2-CS2103-F15-3/tp.git (master) completed! -Mar 08, 2024 4:11:13 AM reposense.report.ReportGenerator analyzeRepo +Mar 08, 2024 9:41:37 AM reposense.commits.CommitInfoAnalyzer analyzeCommits +INFO: Analyzing commits info for https://github.com/AY2324S2-CS2103T-W13-4/tp.git (master)... +Mar 08, 2024 9:41:37 AM reposense.report.ReportGenerator analyzeRepo INFO: Analysis of https://github.com/AY2324S2-CS2103T-W13-4/tp.git (master) completed! -Mar 08, 2024 4:11:14 AM reposense.report.RepoCloner waitForCloneProcess -INFO: Cloning of https://github.com/AY2324S2-CS2103T-T16-2/tp.git completed! -Mar 08, 2024 4:11:14 AM reposense.report.RepoCloner spawnCloneProcess +Mar 08, 2024 9:41:37 AM reposense.commits.CommitInfoExtractor extractCommitInfos +INFO: Extracting commits info for https://github.com/AY2324S2-CS2103T-F10-3/tp.git (master)... +Mar 08, 2024 9:41:38 AM reposense.report.RepoCloner waitForCloneProcess +INFO: Cloning of https://github.com/AY2324S2-CS2103-F15-1/tp.git completed! +Mar 08, 2024 9:41:38 AM reposense.report.RepoCloner spawnCloneProcess INFO: Cloning in parallel from https://github.com/AY2324S2-CS2103T-F13-4/tp.git... -Mar 08, 2024 4:11:14 AM reposense.report.ReportGenerator analyzeRepos -INFO: [9/92] Analyzing https://github.com/AY2324S2-CS2103T-T16-2/tp.git (master)... -Mar 08, 2024 4:11:14 AM reposense.report.RepoCloner waitForCloneProcess +Mar 08, 2024 9:41:38 AM reposense.report.ReportGenerator analyzeRepos +INFO: [9/92] Analyzing https://github.com/AY2324S2-CS2103-F15-1/tp.git (master)... +Mar 08, 2024 9:41:38 AM reposense.commits.CommitInfoAnalyzer analyzeCommits +INFO: Analyzing commits info for https://github.com/AY2324S2-CS2103T-F10-3/tp.git (master)... +Mar 08, 2024 9:41:38 AM reposense.report.ReportGenerator analyzeRepo +INFO: Analysis of https://github.com/AY2324S2-CS2103T-F10-3/tp.git (master) completed! +Mar 08, 2024 9:41:38 AM reposense.report.RepoCloner waitForCloneProcess +INFO: Cloning of https://github.com/AY2324S2-CS2103T-T16-2/tp.git completed! +Mar 08, 2024 9:41:38 AM reposense.report.RepoCloner waitForCloneProcess INFO: Waiting for cloning of https://github.com/AY2324S2-CS2103T-F13-4/tp.git to complete... -Mar 08, 2024 4:11:14 AM reposense.report.RepoCloner waitForCloneProcess -INFO: Cloning of https://github.com/AY2324S2-CS2103-F15-1/tp.git completed! -Mar 08, 2024 4:11:14 AM reposense.report.ReportGenerator analyzeRepos -INFO: [10/92] Analyzing https://github.com/AY2324S2-CS2103-F15-1/tp.git (master)... -Mar 08, 2024 4:11:14 AM reposense.report.RepoCloner spawnCloneProcess +Mar 08, 2024 9:41:38 AM reposense.report.ReportGenerator analyzeRepos +INFO: [10/92] Analyzing https://github.com/AY2324S2-CS2103T-T16-2/tp.git (master)... +Mar 08, 2024 9:41:38 AM reposense.report.RepoCloner spawnCloneProcess INFO: Cloning in parallel from https://github.com/AY2324S2-CS2103T-W10-3/tp.git... -Mar 08, 2024 4:11:14 AM reposense.report.RepoCloner waitForCloneProcess +Mar 08, 2024 9:41:38 AM reposense.report.RepoCloner waitForCloneProcess INFO: Waiting for cloning of https://github.com/AY2324S2-CS2103T-W10-3/tp.git to complete... -Mar 08, 2024 4:11:14 AM reposense.report.ReportGenerator updateRepoConfig -INFO: https://github.com/AY2324S2-CS2103T-T16-2/tp.git (master) does not contain a standalone config file. -Mar 08, 2024 4:11:14 AM reposense.authorship.FileInfoExtractor extractTextFileInfos -INFO: Extracting relevant file info from https://github.com/AY2324S2-CS2103T-T16-2/tp.git (master)... -Mar 08, 2024 4:11:14 AM reposense.report.ReportGenerator updateRepoConfig +Mar 08, 2024 9:41:38 AM reposense.report.ReportGenerator updateRepoConfig INFO: https://github.com/AY2324S2-CS2103-F15-1/tp.git (master) does not contain a standalone config file. -Mar 08, 2024 4:11:14 AM reposense.authorship.FileInfoExtractor extractTextFileInfos +Mar 08, 2024 9:41:38 AM reposense.authorship.FileInfoExtractor extractTextFileInfos INFO: Extracting relevant file info from https://github.com/AY2324S2-CS2103-F15-1/tp.git (master)... -Mar 08, 2024 4:11:14 AM reposense.commits.CommitInfoExtractor extractCommitInfos -INFO: Extracting commits info for https://github.com/AY2324S2-CS2103T-T16-2/tp.git (master)... -Mar 08, 2024 4:11:14 AM reposense.commits.CommitInfoExtractor extractCommitInfos +Mar 08, 2024 9:41:38 AM reposense.commits.CommitInfoExtractor extractCommitInfos INFO: Extracting commits info for https://github.com/AY2324S2-CS2103T-F10-2/tp.git (master)... -Mar 08, 2024 4:11:14 AM reposense.commits.CommitInfoAnalyzer analyzeCommits -INFO: Analyzing commits info for https://github.com/AY2324S2-CS2103T-T16-2/tp.git (master)... -Mar 08, 2024 4:11:14 AM reposense.report.ReportGenerator analyzeRepo -INFO: Analysis of https://github.com/AY2324S2-CS2103T-T16-2/tp.git (master) completed! -Mar 08, 2024 4:11:14 AM reposense.commits.CommitInfoAnalyzer analyzeCommits +Mar 08, 2024 9:41:38 AM reposense.report.ReportGenerator updateRepoConfig +INFO: https://github.com/AY2324S2-CS2103T-T16-2/tp.git (master) does not contain a standalone config file. +Mar 08, 2024 9:41:38 AM reposense.authorship.FileInfoExtractor extractTextFileInfos +INFO: Extracting relevant file info from https://github.com/AY2324S2-CS2103T-T16-2/tp.git (master)... +Mar 08, 2024 9:41:38 AM reposense.commits.CommitInfoExtractor extractCommitInfos +INFO: Extracting commits info for https://github.com/AY2324S2-CS2103T-T16-2/tp.git (master)... +Mar 08, 2024 9:41:38 AM reposense.commits.CommitInfoAnalyzer analyzeCommits INFO: Analyzing commits info for https://github.com/AY2324S2-CS2103T-F10-2/tp.git (master)... -Mar 08, 2024 4:11:14 AM reposense.report.ReportGenerator analyzeRepo -INFO: Analysis of https://github.com/AY2324S2-CS2103T-F10-2/tp.git (master) completed! -Mar 08, 2024 4:11:14 AM reposense.commits.CommitInfoExtractor extractCommitInfos -INFO: Extracting commits info for https://github.com/AY2324S2-CS2103-F15-1/tp.git (master)... -Mar 08, 2024 4:11:15 AM reposense.report.RepoCloner waitForCloneProcess +Mar 08, 2024 9:41:38 AM reposense.report.RepoCloner waitForCloneProcess INFO: Cloning of https://github.com/AY2324S2-CS2103T-F13-2/tp.git completed! -Mar 08, 2024 4:11:15 AM reposense.report.RepoCloner spawnCloneProcess +Mar 08, 2024 9:41:38 AM reposense.report.ReportGenerator analyzeRepo +INFO: Analysis of https://github.com/AY2324S2-CS2103T-F10-2/tp.git (master) completed! +Mar 08, 2024 9:41:38 AM reposense.report.RepoCloner spawnCloneProcess INFO: Cloning in parallel from https://github.com/AY2324S2-CS2103T-T13-2/tp.git... -Mar 08, 2024 4:11:15 AM reposense.report.ReportGenerator analyzeRepos +Mar 08, 2024 9:41:38 AM reposense.report.ReportGenerator analyzeRepos INFO: [11/92] Analyzing https://github.com/AY2324S2-CS2103T-F13-2/tp.git (master)... -Mar 08, 2024 4:11:15 AM reposense.report.RepoCloner waitForCloneProcess +Mar 08, 2024 9:41:38 AM reposense.report.RepoCloner waitForCloneProcess INFO: Waiting for cloning of https://github.com/AY2324S2-CS2103T-T13-2/tp.git to complete... -Mar 08, 2024 4:11:15 AM reposense.commits.CommitInfoAnalyzer analyzeCommits -INFO: Analyzing commits info for https://github.com/AY2324S2-CS2103-F15-1/tp.git (master)... -Mar 08, 2024 4:11:15 AM reposense.report.ReportGenerator analyzeRepo -INFO: Analysis of https://github.com/AY2324S2-CS2103-F15-1/tp.git (master) completed! -Mar 08, 2024 4:11:15 AM reposense.report.ReportGenerator updateRepoConfig +Mar 08, 2024 9:41:38 AM reposense.commits.CommitInfoAnalyzer analyzeCommits +INFO: Analyzing commits info for https://github.com/AY2324S2-CS2103T-T16-2/tp.git (master)... +Mar 08, 2024 9:41:38 AM reposense.report.ReportGenerator analyzeRepo +INFO: Analysis of https://github.com/AY2324S2-CS2103T-T16-2/tp.git (master) completed! +Mar 08, 2024 9:41:38 AM reposense.report.ReportGenerator updateRepoConfig INFO: https://github.com/AY2324S2-CS2103T-F13-2/tp.git (master) does not contain a standalone config file. -Mar 08, 2024 4:11:15 AM reposense.authorship.FileInfoExtractor extractTextFileInfos +Mar 08, 2024 9:41:38 AM reposense.authorship.FileInfoExtractor extractTextFileInfos INFO: Extracting relevant file info from https://github.com/AY2324S2-CS2103T-F13-2/tp.git (master)... -Mar 08, 2024 4:11:15 AM reposense.report.RepoCloner waitForCloneProcess +Mar 08, 2024 9:41:39 AM reposense.commits.CommitInfoExtractor extractCommitInfos +INFO: Extracting commits info for https://github.com/AY2324S2-CS2103-F15-1/tp.git (master)... +Mar 08, 2024 9:41:39 AM reposense.commits.CommitInfoAnalyzer analyzeCommits +INFO: Analyzing commits info for https://github.com/AY2324S2-CS2103-F15-1/tp.git (master)... +Mar 08, 2024 9:41:39 AM reposense.report.ReportGenerator analyzeRepo +INFO: Analysis of https://github.com/AY2324S2-CS2103-F15-1/tp.git (master) completed! +Mar 08, 2024 9:41:39 AM reposense.report.RepoCloner waitForCloneProcess INFO: Cloning of https://github.com/AY2324S2-CS2103T-T10-1/tp.git completed! -Mar 08, 2024 4:11:15 AM reposense.report.RepoCloner spawnCloneProcess +Mar 08, 2024 9:41:39 AM reposense.commits.CommitInfoExtractor extractCommitInfos +INFO: Extracting commits info for https://github.com/AY2324S2-CS2103T-F13-2/tp.git (master)... +Mar 08, 2024 9:41:39 AM reposense.report.RepoCloner spawnCloneProcess INFO: Cloning in parallel from https://github.com/AY2324S2-CS2103T-T13-1/tp.git... -Mar 08, 2024 4:11:15 AM reposense.report.ReportGenerator analyzeRepos +Mar 08, 2024 9:41:39 AM reposense.report.ReportGenerator analyzeRepos INFO: [12/92] Analyzing https://github.com/AY2324S2-CS2103T-T10-1/tp.git (master)... -Mar 08, 2024 4:11:15 AM reposense.report.RepoCloner waitForCloneProcess -INFO: Waiting for cloning of https://github.com/AY2324S2-CS2103T-T13-1/tp.git to complete... -Mar 08, 2024 4:11:15 AM reposense.report.RepoCloner waitForCloneProcess +Mar 08, 2024 9:41:39 AM reposense.report.RepoCloner waitForCloneProcess INFO: Cloning of https://github.com/AY2324S2-CS2103T-F13-4/tp.git completed! -Mar 08, 2024 4:11:15 AM reposense.report.ReportGenerator analyzeRepos +Mar 08, 2024 9:41:39 AM reposense.report.RepoCloner waitForCloneProcess +INFO: Waiting for cloning of https://github.com/AY2324S2-CS2103T-T13-1/tp.git to complete... +Mar 08, 2024 9:41:39 AM reposense.report.ReportGenerator analyzeRepos INFO: [13/92] Analyzing https://github.com/AY2324S2-CS2103T-F13-4/tp.git (master)... -Mar 08, 2024 4:11:15 AM reposense.report.RepoCloner spawnCloneProcess +Mar 08, 2024 9:41:39 AM reposense.report.RepoCloner spawnCloneProcess INFO: Cloning in parallel from https://github.com/AY2324S2-CS2103T-T10-2/tp.git... -Mar 08, 2024 4:11:15 AM reposense.report.RepoCloner waitForCloneProcess +Mar 08, 2024 9:41:39 AM reposense.report.RepoCloner waitForCloneProcess INFO: Waiting for cloning of https://github.com/AY2324S2-CS2103T-T10-2/tp.git to complete... -Mar 08, 2024 4:11:15 AM reposense.report.ReportGenerator updateRepoConfig +Mar 08, 2024 9:41:39 AM reposense.report.ReportGenerator updateRepoConfig INFO: https://github.com/AY2324S2-CS2103T-F13-4/tp.git (master) does not contain a standalone config file. -Mar 08, 2024 4:11:15 AM reposense.authorship.FileInfoExtractor extractTextFileInfos +Mar 08, 2024 9:41:39 AM reposense.authorship.FileInfoExtractor extractTextFileInfos INFO: Extracting relevant file info from https://github.com/AY2324S2-CS2103T-F13-4/tp.git (master)... -Mar 08, 2024 4:11:15 AM reposense.report.ReportGenerator updateRepoConfig +Mar 08, 2024 9:41:39 AM reposense.commits.CommitInfoAnalyzer analyzeCommits +INFO: Analyzing commits info for https://github.com/AY2324S2-CS2103T-F13-2/tp.git (master)... +Mar 08, 2024 9:41:39 AM reposense.report.ReportGenerator analyzeRepo +INFO: Analysis of https://github.com/AY2324S2-CS2103T-F13-2/tp.git (master) completed! +Mar 08, 2024 9:41:39 AM reposense.report.ReportGenerator updateRepoConfig INFO: https://github.com/AY2324S2-CS2103T-T10-1/tp.git (master) does not contain a standalone config file. -Mar 08, 2024 4:11:15 AM reposense.authorship.FileInfoExtractor extractTextFileInfos +Mar 08, 2024 9:41:39 AM reposense.authorship.FileInfoExtractor extractTextFileInfos INFO: Extracting relevant file info from https://github.com/AY2324S2-CS2103T-T10-1/tp.git (master)... -Mar 08, 2024 4:11:15 AM reposense.report.RepoCloner waitForCloneProcess +Mar 08, 2024 9:41:39 AM reposense.report.RepoCloner waitForCloneProcess INFO: Cloning of https://github.com/AY2324S2-CS2103T-W10-3/tp.git completed! -Mar 08, 2024 4:11:15 AM reposense.report.RepoCloner spawnCloneProcess +Mar 08, 2024 9:41:39 AM reposense.report.RepoCloner spawnCloneProcess INFO: Cloning in parallel from https://github.com/AY2324S2-CS2103T-F13-1/tp.git... -Mar 08, 2024 4:11:15 AM reposense.report.ReportGenerator analyzeRepos +Mar 08, 2024 9:41:39 AM reposense.report.ReportGenerator analyzeRepos INFO: [14/92] Analyzing https://github.com/AY2324S2-CS2103T-W10-3/tp.git (master)... -Mar 08, 2024 4:11:15 AM reposense.report.RepoCloner waitForCloneProcess -INFO: Waiting for cloning of https://github.com/AY2324S2-CS2103T-F13-1/tp.git to complete... -Mar 08, 2024 4:11:15 AM reposense.commits.CommitInfoExtractor extractCommitInfos -INFO: Extracting commits info for https://github.com/AY2324S2-CS2103T-F13-2/tp.git (master)... -Mar 08, 2024 4:11:15 AM reposense.commits.CommitInfoExtractor extractCommitInfos +Mar 08, 2024 9:41:39 AM reposense.commits.CommitInfoExtractor extractCommitInfos INFO: Extracting commits info for https://github.com/AY2324S2-CS2103T-F13-4/tp.git (master)... -Mar 08, 2024 4:11:15 AM reposense.report.ReportGenerator updateRepoConfig -INFO: https://github.com/AY2324S2-CS2103T-W10-3/tp.git (master) does not contain a standalone config file. -Mar 08, 2024 4:11:15 AM reposense.authorship.FileInfoExtractor extractTextFileInfos -INFO: Extracting relevant file info from https://github.com/AY2324S2-CS2103T-W10-3/tp.git (master)... -Mar 08, 2024 4:11:15 AM reposense.commits.CommitInfoAnalyzer analyzeCommits -INFO: Analyzing commits info for https://github.com/AY2324S2-CS2103T-F13-2/tp.git (master)... -Mar 08, 2024 4:11:15 AM reposense.report.ReportGenerator analyzeRepo -INFO: Analysis of https://github.com/AY2324S2-CS2103T-F13-2/tp.git (master) completed! -Mar 08, 2024 4:11:16 AM reposense.commits.CommitInfoAnalyzer analyzeCommits +Mar 08, 2024 9:41:39 AM reposense.report.RepoCloner waitForCloneProcess +INFO: Waiting for cloning of https://github.com/AY2324S2-CS2103T-F13-1/tp.git to complete... +Mar 08, 2024 9:41:40 AM reposense.commits.CommitInfoAnalyzer analyzeCommits INFO: Analyzing commits info for https://github.com/AY2324S2-CS2103T-F13-4/tp.git (master)... -Mar 08, 2024 4:11:16 AM reposense.report.ReportGenerator analyzeRepo +Mar 08, 2024 9:41:40 AM reposense.report.ReportGenerator analyzeRepo INFO: Analysis of https://github.com/AY2324S2-CS2103T-F13-4/tp.git (master) completed! -Mar 08, 2024 4:11:16 AM reposense.commits.CommitInfoExtractor extractCommitInfos -INFO: Extracting commits info for https://github.com/AY2324S2-CS2103T-W10-3/tp.git (master)... -Mar 08, 2024 4:11:16 AM reposense.commits.CommitInfoAnalyzer analyzeCommits -INFO: Analyzing commits info for https://github.com/AY2324S2-CS2103T-W10-3/tp.git (master)... -Mar 08, 2024 4:11:16 AM reposense.report.ReportGenerator analyzeRepo -INFO: Analysis of https://github.com/AY2324S2-CS2103T-W10-3/tp.git (master) completed! -Mar 08, 2024 4:11:16 AM reposense.report.RepoCloner waitForCloneProcess -INFO: Cloning of https://github.com/AY2324S2-CS2103T-T13-1/tp.git completed! -Mar 08, 2024 4:11:16 AM reposense.report.RepoCloner waitForCloneProcess +Mar 08, 2024 9:41:40 AM reposense.report.ReportGenerator updateRepoConfig +INFO: https://github.com/AY2324S2-CS2103T-W10-3/tp.git (master) does not contain a standalone config file. +Mar 08, 2024 9:41:40 AM reposense.authorship.FileInfoExtractor extractTextFileInfos +INFO: Extracting relevant file info from https://github.com/AY2324S2-CS2103T-W10-3/tp.git (master)... +Mar 08, 2024 9:41:40 AM reposense.report.RepoCloner waitForCloneProcess INFO: Cloning of https://github.com/AY2324S2-CS2103T-T13-2/tp.git completed! -Mar 08, 2024 4:11:16 AM reposense.report.ReportGenerator analyzeRepos -INFO: [15/92] Analyzing https://github.com/AY2324S2-CS2103T-T13-1/tp.git (master)... -Mar 08, 2024 4:11:16 AM reposense.report.RepoCloner spawnCloneProcess +Mar 08, 2024 9:41:40 AM reposense.report.ReportGenerator analyzeRepos +INFO: [15/92] Analyzing https://github.com/AY2324S2-CS2103T-T13-2/tp.git (master)... +Mar 08, 2024 9:41:40 AM reposense.report.RepoCloner spawnCloneProcess INFO: Cloning in parallel from https://github.com/AY2324S2-CS2103-F15-4/tp.git... -Mar 08, 2024 4:11:16 AM reposense.report.RepoCloner spawnCloneProcess -INFO: Cloning in parallel from https://github.com/AY2324S2-CS2103T-W13-3/tp.git... -Mar 08, 2024 4:11:16 AM reposense.report.ReportGenerator analyzeRepos -INFO: [16/92] Analyzing https://github.com/AY2324S2-CS2103T-T13-2/tp.git (master)... -Mar 08, 2024 4:11:16 AM reposense.report.RepoCloner waitForCloneProcess +Mar 08, 2024 9:41:40 AM reposense.report.RepoCloner waitForCloneProcess INFO: Waiting for cloning of https://github.com/AY2324S2-CS2103-F15-4/tp.git to complete... -Mar 08, 2024 4:11:16 AM reposense.report.RepoCloner waitForCloneProcess -INFO: Waiting for cloning of https://github.com/AY2324S2-CS2103T-W13-3/tp.git to complete... -Mar 08, 2024 4:11:16 AM reposense.report.ReportGenerator updateRepoConfig -INFO: https://github.com/AY2324S2-CS2103T-T13-1/tp.git (master) does not contain a standalone config file. -Mar 08, 2024 4:11:16 AM reposense.authorship.FileInfoExtractor extractTextFileInfos -INFO: Extracting relevant file info from https://github.com/AY2324S2-CS2103T-T13-1/tp.git (master)... -Mar 08, 2024 4:11:16 AM reposense.report.ReportGenerator updateRepoConfig +Mar 08, 2024 9:41:40 AM reposense.report.ReportGenerator updateRepoConfig INFO: https://github.com/AY2324S2-CS2103T-T13-2/tp.git (master) does not contain a standalone config file. -Mar 08, 2024 4:11:16 AM reposense.authorship.FileInfoExtractor extractTextFileInfos +Mar 08, 2024 9:41:40 AM reposense.authorship.FileInfoExtractor extractTextFileInfos INFO: Extracting relevant file info from https://github.com/AY2324S2-CS2103T-T13-2/tp.git (master)... -Mar 08, 2024 4:11:17 AM reposense.commits.CommitInfoExtractor extractCommitInfos +Mar 08, 2024 9:41:40 AM reposense.commits.CommitInfoExtractor extractCommitInfos +INFO: Extracting commits info for https://github.com/AY2324S2-CS2103T-W10-3/tp.git (master)... +Mar 08, 2024 9:41:41 AM reposense.report.RepoCloner waitForCloneProcess +INFO: Cloning of https://github.com/AY2324S2-CS2103T-T13-1/tp.git completed! +Mar 08, 2024 9:41:41 AM reposense.report.ReportGenerator analyzeRepos +INFO: [16/92] Analyzing https://github.com/AY2324S2-CS2103T-T13-1/tp.git (master)... +Mar 08, 2024 9:41:41 AM reposense.report.RepoCloner spawnCloneProcess +INFO: Cloning in parallel from https://github.com/AY2324S2-CS2103T-W13-3/tp.git... +Mar 08, 2024 9:41:41 AM reposense.commits.CommitInfoExtractor extractCommitInfos INFO: Extracting commits info for https://github.com/AY2324S2-CS2103T-T10-1/tp.git (master)... -Mar 08, 2024 4:11:17 AM reposense.report.RepoCloner waitForCloneProcess +Mar 08, 2024 9:41:41 AM reposense.report.RepoCloner waitForCloneProcess +INFO: Waiting for cloning of https://github.com/AY2324S2-CS2103T-W13-3/tp.git to complete... +Mar 08, 2024 9:41:41 AM reposense.commits.CommitInfoAnalyzer analyzeCommits +INFO: Analyzing commits info for https://github.com/AY2324S2-CS2103T-W10-3/tp.git (master)... +Mar 08, 2024 9:41:41 AM reposense.report.ReportGenerator analyzeRepo +INFO: Analysis of https://github.com/AY2324S2-CS2103T-W10-3/tp.git (master) completed! +Mar 08, 2024 9:41:41 AM reposense.report.RepoCloner waitForCloneProcess INFO: Cloning of https://github.com/AY2324S2-CS2103T-T10-2/tp.git completed! -Mar 08, 2024 4:11:17 AM reposense.report.ReportGenerator analyzeRepos -INFO: [17/92] Analyzing https://github.com/AY2324S2-CS2103T-T10-2/tp.git (master)... -Mar 08, 2024 4:11:17 AM reposense.report.RepoCloner spawnCloneProcess +Mar 08, 2024 9:41:41 AM reposense.report.RepoCloner spawnCloneProcess INFO: Cloning in parallel from https://github.com/AY2324S2-CS2103T-W13-2/tp.git... -Mar 08, 2024 4:11:17 AM reposense.report.RepoCloner waitForCloneProcess +Mar 08, 2024 9:41:41 AM reposense.report.RepoCloner waitForCloneProcess INFO: Waiting for cloning of https://github.com/AY2324S2-CS2103T-W13-2/tp.git to complete... -Mar 08, 2024 4:11:17 AM reposense.report.RepoCloner waitForCloneProcess -INFO: Cloning of https://github.com/AY2324S2-CS2103T-F13-1/tp.git completed! -Mar 08, 2024 4:11:17 AM reposense.commits.CommitInfoExtractor extractCommitInfos -INFO: Extracting commits info for https://github.com/AY2324S2-CS2103T-T13-1/tp.git (master)... -Mar 08, 2024 4:11:17 AM reposense.report.ReportGenerator updateRepoConfig +Mar 08, 2024 9:41:41 AM reposense.report.ReportGenerator updateRepoConfig +INFO: https://github.com/AY2324S2-CS2103T-T13-1/tp.git (master) does not contain a standalone config file. +Mar 08, 2024 9:41:41 AM reposense.authorship.FileInfoExtractor extractTextFileInfos +INFO: Extracting relevant file info from https://github.com/AY2324S2-CS2103T-T13-1/tp.git (master)... +Mar 08, 2024 9:41:41 AM reposense.report.ReportGenerator analyzeRepos +INFO: [17/92] Analyzing https://github.com/AY2324S2-CS2103T-T10-2/tp.git (master)... +Mar 08, 2024 9:41:41 AM reposense.report.ReportGenerator updateRepoConfig INFO: https://github.com/AY2324S2-CS2103T-T10-2/tp.git (master) does not contain a standalone config file. -Mar 08, 2024 4:11:17 AM reposense.authorship.FileInfoExtractor extractTextFileInfos +Mar 08, 2024 9:41:41 AM reposense.authorship.FileInfoExtractor extractTextFileInfos INFO: Extracting relevant file info from https://github.com/AY2324S2-CS2103T-T10-2/tp.git (master)... -Mar 08, 2024 4:11:17 AM reposense.report.RepoCloner spawnCloneProcess +Mar 08, 2024 9:41:41 AM reposense.commits.CommitInfoAnalyzer analyzeCommits +INFO: Analyzing commits info for https://github.com/AY2324S2-CS2103T-T10-1/tp.git (master)... +Mar 08, 2024 9:41:41 AM reposense.report.ReportGenerator analyzeRepo +INFO: Analysis of https://github.com/AY2324S2-CS2103T-T10-1/tp.git (master) completed! +Mar 08, 2024 9:41:41 AM reposense.commits.CommitInfoExtractor extractCommitInfos +INFO: Extracting commits info for https://github.com/AY2324S2-CS2103T-T13-2/tp.git (master)... +Mar 08, 2024 9:41:41 AM reposense.commits.CommitInfoExtractor extractCommitInfos +INFO: Extracting commits info for https://github.com/AY2324S2-CS2103T-T13-1/tp.git (master)... +Mar 08, 2024 9:41:41 AM reposense.report.RepoCloner waitForCloneProcess +INFO: Cloning of https://github.com/AY2324S2-CS2103T-F13-1/tp.git completed! +Mar 08, 2024 9:41:41 AM reposense.report.ReportGenerator analyzeRepos +INFO: [18/92] Analyzing https://github.com/AY2324S2-CS2103T-F13-1/tp.git (master)... +Mar 08, 2024 9:41:41 AM reposense.report.RepoCloner spawnCloneProcess INFO: Cloning in parallel from https://github.com/AY2324S2-CS2103T-T16-4/tp.git... -Mar 08, 2024 4:11:17 AM reposense.report.RepoCloner waitForCloneProcess +Mar 08, 2024 9:41:41 AM reposense.report.RepoCloner waitForCloneProcess INFO: Waiting for cloning of https://github.com/AY2324S2-CS2103T-T16-4/tp.git to complete... -Mar 08, 2024 4:11:17 AM reposense.commits.CommitInfoAnalyzer analyzeCommits +Mar 08, 2024 9:41:41 AM reposense.commits.CommitInfoAnalyzer analyzeCommits +INFO: Analyzing commits info for https://github.com/AY2324S2-CS2103T-T13-2/tp.git (master)... +Mar 08, 2024 9:41:41 AM reposense.report.ReportGenerator analyzeRepo +INFO: Analysis of https://github.com/AY2324S2-CS2103T-T13-2/tp.git (master) completed! +Mar 08, 2024 9:41:41 AM reposense.commits.CommitInfoExtractor extractCommitInfos +INFO: Extracting commits info for https://github.com/AY2324S2-CS2103T-T10-2/tp.git (master)... +Mar 08, 2024 9:41:41 AM reposense.commits.CommitInfoAnalyzer analyzeCommits INFO: Analyzing commits info for https://github.com/AY2324S2-CS2103T-T13-1/tp.git (master)... -Mar 08, 2024 4:11:17 AM reposense.report.ReportGenerator analyzeRepo +Mar 08, 2024 9:41:41 AM reposense.report.ReportGenerator analyzeRepo INFO: Analysis of https://github.com/AY2324S2-CS2103T-T13-1/tp.git (master) completed! -Mar 08, 2024 4:11:17 AM reposense.report.ReportGenerator analyzeRepos -INFO: [18/92] Analyzing https://github.com/AY2324S2-CS2103T-F13-1/tp.git (master)... -Mar 08, 2024 4:11:17 AM reposense.commits.CommitInfoAnalyzer analyzeCommits -INFO: Analyzing commits info for https://github.com/AY2324S2-CS2103T-T10-1/tp.git (master)... -Mar 08, 2024 4:11:17 AM reposense.report.ReportGenerator updateRepoConfig +Mar 08, 2024 9:41:42 AM reposense.report.ReportGenerator updateRepoConfig INFO: https://github.com/AY2324S2-CS2103T-F13-1/tp.git (master) does not contain a standalone config file. -Mar 08, 2024 4:11:17 AM reposense.authorship.FileInfoExtractor extractTextFileInfos +Mar 08, 2024 9:41:42 AM reposense.authorship.FileInfoExtractor extractTextFileInfos INFO: Extracting relevant file info from https://github.com/AY2324S2-CS2103T-F13-1/tp.git (master)... -Mar 08, 2024 4:11:17 AM reposense.commits.CommitInfoExtractor extractCommitInfos -INFO: Extracting commits info for https://github.com/AY2324S2-CS2103T-T10-2/tp.git (master)... -Mar 08, 2024 4:11:17 AM reposense.report.ReportGenerator analyzeRepo -INFO: Analysis of https://github.com/AY2324S2-CS2103T-T10-1/tp.git (master) completed! -Mar 08, 2024 4:11:17 AM reposense.commits.CommitInfoExtractor extractCommitInfos -INFO: Extracting commits info for https://github.com/AY2324S2-CS2103T-T13-2/tp.git (master)... -Mar 08, 2024 4:11:17 AM reposense.commits.CommitInfoAnalyzer analyzeCommits +Mar 08, 2024 9:41:42 AM reposense.commits.CommitInfoAnalyzer analyzeCommits INFO: Analyzing commits info for https://github.com/AY2324S2-CS2103T-T10-2/tp.git (master)... -Mar 08, 2024 4:11:17 AM reposense.report.ReportGenerator analyzeRepo +Mar 08, 2024 9:41:42 AM reposense.report.ReportGenerator analyzeRepo INFO: Analysis of https://github.com/AY2324S2-CS2103T-T10-2/tp.git (master) completed! -Mar 08, 2024 4:11:17 AM reposense.commits.CommitInfoAnalyzer analyzeCommits -INFO: Analyzing commits info for https://github.com/AY2324S2-CS2103T-T13-2/tp.git (master)... -Mar 08, 2024 4:11:17 AM reposense.report.ReportGenerator analyzeRepo -INFO: Analysis of https://github.com/AY2324S2-CS2103T-T13-2/tp.git (master) completed! -Mar 08, 2024 4:11:18 AM reposense.report.RepoCloner waitForCloneProcess +Mar 08, 2024 9:41:42 AM reposense.report.RepoCloner waitForCloneProcess INFO: Cloning of https://github.com/AY2324S2-CS2103-F15-4/tp.git completed! -Mar 08, 2024 4:11:18 AM reposense.report.RepoCloner waitForCloneProcess -INFO: Cloning of https://github.com/AY2324S2-CS2103T-W13-2/tp.git completed! -Mar 08, 2024 4:11:18 AM reposense.report.RepoCloner spawnCloneProcess -INFO: Cloning in parallel from https://github.com/AY2324S2-CS2103T-W10-1/tp.git... -Mar 08, 2024 4:11:18 AM reposense.report.ReportGenerator analyzeRepos +Mar 08, 2024 9:41:42 AM reposense.report.ReportGenerator analyzeRepos INFO: [19/92] Analyzing https://github.com/AY2324S2-CS2103-F15-4/tp.git (master)... -Mar 08, 2024 4:11:18 AM reposense.report.ReportGenerator analyzeRepos +Mar 08, 2024 9:41:42 AM reposense.report.RepoCloner spawnCloneProcess +INFO: Cloning in parallel from https://github.com/AY2324S2-CS2103T-W10-1/tp.git... +Mar 08, 2024 9:41:42 AM reposense.report.RepoCloner waitForCloneProcess +INFO: Waiting for cloning of https://github.com/AY2324S2-CS2103T-W10-1/tp.git to complete... +Mar 08, 2024 9:41:42 AM reposense.report.RepoCloner waitForCloneProcess +INFO: Cloning of https://github.com/AY2324S2-CS2103T-W13-2/tp.git completed! +Mar 08, 2024 9:41:42 AM reposense.report.ReportGenerator analyzeRepos INFO: [20/92] Analyzing https://github.com/AY2324S2-CS2103T-W13-2/tp.git (master)... -Mar 08, 2024 4:11:18 AM reposense.report.RepoCloner spawnCloneProcess +Mar 08, 2024 9:41:42 AM reposense.report.RepoCloner spawnCloneProcess INFO: Cloning in parallel from https://github.com/AY2324S2-CS2103T-T13-3/tp.git... -Mar 08, 2024 4:11:18 AM reposense.report.RepoCloner waitForCloneProcess -INFO: Waiting for cloning of https://github.com/AY2324S2-CS2103T-W10-1/tp.git to complete... -Mar 08, 2024 4:11:18 AM reposense.report.RepoCloner waitForCloneProcess +Mar 08, 2024 9:41:42 AM reposense.report.RepoCloner waitForCloneProcess INFO: Waiting for cloning of https://github.com/AY2324S2-CS2103T-T13-3/tp.git to complete... -Mar 08, 2024 4:11:18 AM reposense.report.ReportGenerator updateRepoConfig +Mar 08, 2024 9:41:42 AM reposense.report.ReportGenerator updateRepoConfig INFO: https://github.com/AY2324S2-CS2103-F15-4/tp.git (master) does not contain a standalone config file. -Mar 08, 2024 4:11:18 AM reposense.authorship.FileInfoExtractor extractTextFileInfos +Mar 08, 2024 9:41:42 AM reposense.authorship.FileInfoExtractor extractTextFileInfos INFO: Extracting relevant file info from https://github.com/AY2324S2-CS2103-F15-4/tp.git (master)... -Mar 08, 2024 4:11:18 AM reposense.report.RepoCloner waitForCloneProcess -INFO: Cloning of https://github.com/AY2324S2-CS2103T-W13-3/tp.git completed! -Mar 08, 2024 4:11:18 AM reposense.report.RepoCloner spawnCloneProcess -INFO: Cloning in parallel from https://github.com/AY2324S2-CS2103T-T13-4/tp.git... -Mar 08, 2024 4:11:18 AM reposense.report.ReportGenerator analyzeRepos -INFO: [21/92] Analyzing https://github.com/AY2324S2-CS2103T-W13-3/tp.git (master)... -Mar 08, 2024 4:11:18 AM reposense.report.ReportGenerator updateRepoConfig +Mar 08, 2024 9:41:42 AM reposense.report.ReportGenerator updateRepoConfig INFO: https://github.com/AY2324S2-CS2103T-W13-2/tp.git (master) does not contain a standalone config file. -Mar 08, 2024 4:11:18 AM reposense.authorship.FileInfoExtractor extractTextFileInfos +Mar 08, 2024 9:41:42 AM reposense.authorship.FileInfoExtractor extractTextFileInfos INFO: Extracting relevant file info from https://github.com/AY2324S2-CS2103T-W13-2/tp.git (master)... -Mar 08, 2024 4:11:18 AM reposense.report.RepoCloner waitForCloneProcess +Mar 08, 2024 9:41:42 AM reposense.report.RepoCloner waitForCloneProcess +INFO: Cloning of https://github.com/AY2324S2-CS2103T-W13-3/tp.git completed! +Mar 08, 2024 9:41:42 AM reposense.report.ReportGenerator analyzeRepos +INFO: [21/92] Analyzing https://github.com/AY2324S2-CS2103T-W13-3/tp.git (master)... +Mar 08, 2024 9:41:42 AM reposense.report.RepoCloner spawnCloneProcess +INFO: Cloning in parallel from https://github.com/AY2324S2-CS2103T-T13-4/tp.git... +Mar 08, 2024 9:41:42 AM reposense.report.RepoCloner waitForCloneProcess INFO: Waiting for cloning of https://github.com/AY2324S2-CS2103T-T13-4/tp.git to complete... -Mar 08, 2024 4:11:18 AM reposense.report.ReportGenerator updateRepoConfig +Mar 08, 2024 9:41:42 AM reposense.report.ReportGenerator updateRepoConfig INFO: https://github.com/AY2324S2-CS2103T-W13-3/tp.git (master) does not contain a standalone config file. -Mar 08, 2024 4:11:18 AM reposense.authorship.FileInfoExtractor extractTextFileInfos +Mar 08, 2024 9:41:42 AM reposense.authorship.FileInfoExtractor extractTextFileInfos INFO: Extracting relevant file info from https://github.com/AY2324S2-CS2103T-W13-3/tp.git (master)... -Mar 08, 2024 4:11:18 AM reposense.report.RepoCloner waitForCloneProcess -INFO: Cloning of https://github.com/AY2324S2-CS2103T-T16-4/tp.git completed! -Mar 08, 2024 4:11:18 AM reposense.report.RepoCloner spawnCloneProcess -INFO: Cloning in parallel from https://github.com/AY2324S2-CS2103T-W10-2/tp.git... -Mar 08, 2024 4:11:18 AM reposense.report.RepoCloner waitForCloneProcess -INFO: Waiting for cloning of https://github.com/AY2324S2-CS2103T-W10-2/tp.git to complete... -Mar 08, 2024 4:11:18 AM reposense.commits.CommitInfoExtractor extractCommitInfos +Mar 08, 2024 9:41:42 AM reposense.commits.CommitInfoExtractor extractCommitInfos INFO: Extracting commits info for https://github.com/AY2324S2-CS2103T-W13-2/tp.git (master)... -Mar 08, 2024 4:11:19 AM reposense.commits.CommitInfoExtractor extractCommitInfos +Mar 08, 2024 9:41:43 AM reposense.commits.CommitInfoExtractor extractCommitInfos INFO: Extracting commits info for https://github.com/AY2324S2-CS2103-F15-4/tp.git (master)... -Mar 08, 2024 4:11:19 AM reposense.commits.CommitInfoAnalyzer analyzeCommits +Mar 08, 2024 9:41:43 AM reposense.commits.CommitInfoAnalyzer analyzeCommits INFO: Analyzing commits info for https://github.com/AY2324S2-CS2103T-W13-2/tp.git (master)... -Mar 08, 2024 4:11:19 AM reposense.report.ReportGenerator analyzeRepo +Mar 08, 2024 9:41:43 AM reposense.report.ReportGenerator analyzeRepo INFO: Analysis of https://github.com/AY2324S2-CS2103T-W13-2/tp.git (master) completed! -Mar 08, 2024 4:11:19 AM reposense.report.ReportGenerator analyzeRepos +Mar 08, 2024 9:41:43 AM reposense.report.RepoCloner waitForCloneProcess +INFO: Cloning of https://github.com/AY2324S2-CS2103T-T16-4/tp.git completed! +Mar 08, 2024 9:41:43 AM reposense.commits.CommitInfoAnalyzer analyzeCommits +INFO: Analyzing commits info for https://github.com/AY2324S2-CS2103-F15-4/tp.git (master)... +Mar 08, 2024 9:41:43 AM reposense.report.ReportGenerator analyzeRepo +INFO: Analysis of https://github.com/AY2324S2-CS2103-F15-4/tp.git (master) completed! +Mar 08, 2024 9:41:43 AM reposense.report.ReportGenerator analyzeRepos INFO: [22/92] Analyzing https://github.com/AY2324S2-CS2103T-T16-4/tp.git (master)... -Mar 08, 2024 4:11:19 AM reposense.report.ReportGenerator updateRepoConfig +Mar 08, 2024 9:41:43 AM reposense.report.RepoCloner spawnCloneProcess +INFO: Cloning in parallel from https://github.com/AY2324S2-CS2103T-W10-2/tp.git... +Mar 08, 2024 9:41:43 AM reposense.report.RepoCloner waitForCloneProcess +INFO: Waiting for cloning of https://github.com/AY2324S2-CS2103T-W10-2/tp.git to complete... +Mar 08, 2024 9:41:43 AM reposense.report.ReportGenerator updateRepoConfig INFO: https://github.com/AY2324S2-CS2103T-T16-4/tp.git (master) does not contain a standalone config file. -Mar 08, 2024 4:11:19 AM reposense.authorship.FileInfoExtractor extractTextFileInfos +Mar 08, 2024 9:41:43 AM reposense.authorship.FileInfoExtractor extractTextFileInfos INFO: Extracting relevant file info from https://github.com/AY2324S2-CS2103T-T16-4/tp.git (master)... -Mar 08, 2024 4:11:19 AM reposense.commits.CommitInfoAnalyzer analyzeCommits -INFO: Analyzing commits info for https://github.com/AY2324S2-CS2103-F15-4/tp.git (master)... -Mar 08, 2024 4:11:19 AM reposense.report.ReportGenerator analyzeRepo -INFO: Analysis of https://github.com/AY2324S2-CS2103-F15-4/tp.git (master) completed! -Mar 08, 2024 4:11:19 AM reposense.report.RepoCloner waitForCloneProcess -INFO: Cloning of https://github.com/AY2324S2-CS2103T-T13-4/tp.git completed! -Mar 08, 2024 4:11:19 AM reposense.report.RepoCloner waitForCloneProcess +Mar 08, 2024 9:41:43 AM reposense.commits.CommitInfoExtractor extractCommitInfos +INFO: Extracting commits info for https://github.com/AY2324S2-CS2103T-T16-4/tp.git (master)... +Mar 08, 2024 9:41:43 AM reposense.report.RepoCloner waitForCloneProcess +INFO: Cloning of https://github.com/AY2324S2-CS2103T-W10-1/tp.git completed! +Mar 08, 2024 9:41:44 AM reposense.report.ReportGenerator analyzeRepos +INFO: [23/92] Analyzing https://github.com/AY2324S2-CS2103T-W10-1/tp.git (master)... +Mar 08, 2024 9:41:44 AM reposense.commits.CommitInfoAnalyzer analyzeCommits +INFO: Analyzing commits info for https://github.com/AY2324S2-CS2103T-T16-4/tp.git (master)... +Mar 08, 2024 9:41:44 AM reposense.report.RepoCloner waitForCloneProcess INFO: Cloning of https://github.com/AY2324S2-CS2103T-T13-3/tp.git completed! -Mar 08, 2024 4:11:19 AM reposense.report.RepoCloner spawnCloneProcess +Mar 08, 2024 9:41:44 AM reposense.report.RepoCloner spawnCloneProcess INFO: Cloning in parallel from https://github.com/AY2324S2-CS2103T-F10-1/tp.git... -Mar 08, 2024 4:11:19 AM reposense.report.ReportGenerator analyzeRepos -INFO: [23/92] Analyzing https://github.com/AY2324S2-CS2103T-T13-3/tp.git (master)... -Mar 08, 2024 4:11:19 AM reposense.report.RepoCloner spawnCloneProcess +Mar 08, 2024 9:41:44 AM reposense.report.ReportGenerator analyzeRepo +INFO: Analysis of https://github.com/AY2324S2-CS2103T-T16-4/tp.git (master) completed! +Mar 08, 2024 9:41:44 AM reposense.report.RepoCloner spawnCloneProcess INFO: Cloning in parallel from https://github.com/AY2324S2-CS2103T-F10-4/tp.git... -Mar 08, 2024 4:11:19 AM reposense.report.RepoCloner waitForCloneProcess -INFO: Cloning of https://github.com/AY2324S2-CS2103T-W10-2/tp.git completed! -Mar 08, 2024 4:11:19 AM reposense.report.RepoCloner waitForCloneProcess -INFO: Waiting for cloning of https://github.com/AY2324S2-CS2103T-F10-4/tp.git to complete... -Mar 08, 2024 4:11:19 AM reposense.report.RepoCloner waitForCloneProcess +Mar 08, 2024 9:41:44 AM reposense.report.ReportGenerator analyzeRepos +INFO: [24/92] Analyzing https://github.com/AY2324S2-CS2103T-T13-3/tp.git (master)... +Mar 08, 2024 9:41:44 AM reposense.report.RepoCloner waitForCloneProcess INFO: Waiting for cloning of https://github.com/AY2324S2-CS2103T-F10-1/tp.git to complete... -Mar 08, 2024 4:11:19 AM reposense.commits.CommitInfoExtractor extractCommitInfos -INFO: Extracting commits info for https://github.com/AY2324S2-CS2103T-T16-4/tp.git (master)... -Mar 08, 2024 4:11:19 AM reposense.report.RepoCloner waitForCloneProcess -INFO: Cloning of https://github.com/AY2324S2-CS2103T-W10-1/tp.git completed! -Mar 08, 2024 4:11:19 AM reposense.report.RepoCloner spawnCloneProcess +Mar 08, 2024 9:41:44 AM reposense.report.RepoCloner waitForCloneProcess +INFO: Waiting for cloning of https://github.com/AY2324S2-CS2103T-F10-4/tp.git to complete... +Mar 08, 2024 9:41:44 AM reposense.report.ReportGenerator updateRepoConfig +INFO: https://github.com/AY2324S2-CS2103T-W10-1/tp.git (master) does not contain a standalone config file. +Mar 08, 2024 9:41:44 AM reposense.authorship.FileInfoExtractor extractTextFileInfos +INFO: Extracting relevant file info from https://github.com/AY2324S2-CS2103T-W10-1/tp.git (master)... +Mar 08, 2024 9:41:44 AM reposense.report.RepoCloner waitForCloneProcess +INFO: Cloning of https://github.com/AY2324S2-CS2103T-T13-4/tp.git completed! +Mar 08, 2024 9:41:44 AM reposense.report.RepoCloner spawnCloneProcess INFO: Cloning in parallel from https://github.com/AY2324S2-CS2103T-T16-3/tp.git... -Mar 08, 2024 4:11:19 AM reposense.report.RepoCloner spawnCloneProcess -INFO: Cloning in parallel from https://github.com/AY2324S2-CS2103-F09-3/tp.git... -Mar 08, 2024 4:11:20 AM reposense.report.ReportGenerator updateRepoConfig +Mar 08, 2024 9:41:44 AM reposense.report.ReportGenerator updateRepoConfig INFO: https://github.com/AY2324S2-CS2103T-T13-3/tp.git (master) does not contain a standalone config file. -Mar 08, 2024 4:11:20 AM reposense.authorship.FileInfoExtractor extractTextFileInfos +Mar 08, 2024 9:41:44 AM reposense.authorship.FileInfoExtractor extractTextFileInfos INFO: Extracting relevant file info from https://github.com/AY2324S2-CS2103T-T13-3/tp.git (master)... -Mar 08, 2024 4:11:20 AM reposense.report.RepoCloner waitForCloneProcess +Mar 08, 2024 9:41:44 AM reposense.report.RepoCloner waitForCloneProcess INFO: Waiting for cloning of https://github.com/AY2324S2-CS2103T-T16-3/tp.git to complete... -Mar 08, 2024 4:11:20 AM reposense.report.RepoCloner waitForCloneProcess -INFO: Waiting for cloning of https://github.com/AY2324S2-CS2103-F09-3/tp.git to complete... -Mar 08, 2024 4:11:20 AM reposense.commits.CommitInfoExtractor extractCommitInfos +Mar 08, 2024 9:41:44 AM reposense.commits.CommitInfoExtractor extractCommitInfos INFO: Extracting commits info for https://github.com/AY2324S2-CS2103T-W13-3/tp.git (master)... -Mar 08, 2024 4:11:20 AM reposense.commits.CommitInfoAnalyzer analyzeCommits -INFO: Analyzing commits info for https://github.com/AY2324S2-CS2103T-T16-4/tp.git (master)... -Mar 08, 2024 4:11:20 AM reposense.report.ReportGenerator analyzeRepo -INFO: Analysis of https://github.com/AY2324S2-CS2103T-T16-4/tp.git (master) completed! -Mar 08, 2024 4:11:20 AM reposense.report.ReportGenerator analyzeRepos -INFO: [24/92] Analyzing https://github.com/AY2324S2-CS2103T-T13-4/tp.git (master)... -Mar 08, 2024 4:11:20 AM reposense.commits.CommitInfoAnalyzer analyzeCommits +Mar 08, 2024 9:41:44 AM reposense.commits.CommitInfoAnalyzer analyzeCommits INFO: Analyzing commits info for https://github.com/AY2324S2-CS2103T-W13-3/tp.git (master)... -Mar 08, 2024 4:11:20 AM reposense.report.ReportGenerator analyzeRepo +Mar 08, 2024 9:41:44 AM reposense.report.ReportGenerator analyzeRepo INFO: Analysis of https://github.com/AY2324S2-CS2103T-W13-3/tp.git (master) completed! -Mar 08, 2024 4:11:20 AM reposense.report.ReportGenerator analyzeRepos -INFO: [25/92] Analyzing https://github.com/AY2324S2-CS2103T-W10-2/tp.git (master)... -Mar 08, 2024 4:11:20 AM reposense.report.ReportGenerator updateRepoConfig +Mar 08, 2024 9:41:44 AM reposense.report.RepoCloner waitForCloneProcess +INFO: Cloning of https://github.com/AY2324S2-CS2103T-W10-2/tp.git completed! +Mar 08, 2024 9:41:44 AM reposense.report.ReportGenerator analyzeRepos +INFO: [25/92] Analyzing https://github.com/AY2324S2-CS2103T-T13-4/tp.git (master)... +Mar 08, 2024 9:41:44 AM reposense.report.RepoCloner spawnCloneProcess +INFO: Cloning in parallel from https://github.com/AY2324S2-CS2103-F09-3/tp.git... +Mar 08, 2024 9:41:44 AM reposense.report.RepoCloner waitForCloneProcess +INFO: Waiting for cloning of https://github.com/AY2324S2-CS2103-F09-3/tp.git to complete... +Mar 08, 2024 9:41:44 AM reposense.commits.CommitInfoExtractor extractCommitInfos +INFO: Extracting commits info for https://github.com/AY2324S2-CS2103T-T13-3/tp.git (master)... +Mar 08, 2024 9:41:44 AM reposense.report.ReportGenerator updateRepoConfig INFO: https://github.com/AY2324S2-CS2103T-T13-4/tp.git (master) does not contain a standalone config file. -Mar 08, 2024 4:11:20 AM reposense.authorship.FileInfoExtractor extractTextFileInfos +Mar 08, 2024 9:41:44 AM reposense.authorship.FileInfoExtractor extractTextFileInfos INFO: Extracting relevant file info from https://github.com/AY2324S2-CS2103T-T13-4/tp.git (master)... -Mar 08, 2024 4:11:20 AM reposense.commits.CommitInfoExtractor extractCommitInfos -INFO: Extracting commits info for https://github.com/AY2324S2-CS2103T-T13-3/tp.git (master)... -Mar 08, 2024 4:11:20 AM reposense.report.ReportGenerator updateRepoConfig -INFO: https://github.com/AY2324S2-CS2103T-W10-2/tp.git (master) does not contain a standalone config file. -Mar 08, 2024 4:11:20 AM reposense.authorship.FileInfoExtractor extractTextFileInfos -INFO: Extracting relevant file info from https://github.com/AY2324S2-CS2103T-W10-2/tp.git (master)... -Mar 08, 2024 4:11:20 AM reposense.commits.CommitInfoExtractor extractCommitInfos +Mar 08, 2024 9:41:44 AM reposense.commits.CommitInfoExtractor extractCommitInfos INFO: Extracting commits info for https://github.com/AY2324S2-CS2103T-F13-1/tp.git (master)... -Mar 08, 2024 4:11:20 AM reposense.commits.CommitInfoAnalyzer analyzeCommits +Mar 08, 2024 9:41:44 AM reposense.commits.CommitInfoExtractor extractCommitInfos +INFO: Extracting commits info for https://github.com/AY2324S2-CS2103T-W10-1/tp.git (master)... +Mar 08, 2024 9:41:45 AM reposense.commits.CommitInfoAnalyzer analyzeCommits INFO: Analyzing commits info for https://github.com/AY2324S2-CS2103T-T13-3/tp.git (master)... -Mar 08, 2024 4:11:20 AM reposense.report.ReportGenerator analyzeRepo +Mar 08, 2024 9:41:45 AM reposense.report.ReportGenerator analyzeRepo INFO: Analysis of https://github.com/AY2324S2-CS2103T-T13-3/tp.git (master) completed! -Mar 08, 2024 4:11:20 AM reposense.report.ReportGenerator analyzeRepos -INFO: [26/92] Analyzing https://github.com/AY2324S2-CS2103T-W10-1/tp.git (master)... -Mar 08, 2024 4:11:20 AM reposense.commits.CommitInfoAnalyzer analyzeCommits +Mar 08, 2024 9:41:45 AM reposense.report.ReportGenerator analyzeRepos +INFO: [26/92] Analyzing https://github.com/AY2324S2-CS2103T-W10-2/tp.git (master)... +Mar 08, 2024 9:41:45 AM reposense.commits.CommitInfoAnalyzer analyzeCommits INFO: Analyzing commits info for https://github.com/AY2324S2-CS2103T-F13-1/tp.git (master)... -Mar 08, 2024 4:11:20 AM reposense.report.ReportGenerator analyzeRepo +Mar 08, 2024 9:41:45 AM reposense.report.ReportGenerator analyzeRepo INFO: Analysis of https://github.com/AY2324S2-CS2103T-F13-1/tp.git (master) completed! -Mar 08, 2024 4:11:20 AM reposense.report.ReportGenerator updateRepoConfig -INFO: https://github.com/AY2324S2-CS2103T-W10-1/tp.git (master) does not contain a standalone config file. -Mar 08, 2024 4:11:20 AM reposense.authorship.FileInfoExtractor extractTextFileInfos -INFO: Extracting relevant file info from https://github.com/AY2324S2-CS2103T-W10-1/tp.git (master)... -Mar 08, 2024 4:11:20 AM reposense.commits.CommitInfoExtractor extractCommitInfos -INFO: Extracting commits info for https://github.com/AY2324S2-CS2103T-T13-4/tp.git (master)... -Mar 08, 2024 4:11:20 AM reposense.commits.CommitInfoAnalyzer analyzeCommits -INFO: Analyzing commits info for https://github.com/AY2324S2-CS2103T-T13-4/tp.git (master)... -Mar 08, 2024 4:11:20 AM reposense.report.ReportGenerator analyzeRepo -INFO: Analysis of https://github.com/AY2324S2-CS2103T-T13-4/tp.git (master) completed! -Mar 08, 2024 4:11:21 AM reposense.commits.CommitInfoExtractor extractCommitInfos -INFO: Extracting commits info for https://github.com/AY2324S2-CS2103T-W10-2/tp.git (master)... -Mar 08, 2024 4:11:21 AM reposense.report.RepoCloner waitForCloneProcess +Mar 08, 2024 9:41:45 AM reposense.report.RepoCloner waitForCloneProcess INFO: Cloning of https://github.com/AY2324S2-CS2103T-F10-1/tp.git completed! -Mar 08, 2024 4:11:21 AM reposense.report.RepoCloner spawnCloneProcess -INFO: Cloning in parallel from https://github.com/AY2324S2-CS2103T-T10-3/tp.git... -Mar 08, 2024 4:11:21 AM reposense.report.ReportGenerator analyzeRepos +Mar 08, 2024 9:41:45 AM reposense.report.ReportGenerator updateRepoConfig +INFO: https://github.com/AY2324S2-CS2103T-W10-2/tp.git (master) does not contain a standalone config file. +Mar 08, 2024 9:41:45 AM reposense.authorship.FileInfoExtractor extractTextFileInfos +INFO: Extracting relevant file info from https://github.com/AY2324S2-CS2103T-W10-2/tp.git (master)... +Mar 08, 2024 9:41:45 AM reposense.commits.CommitInfoAnalyzer analyzeCommits +INFO: Analyzing commits info for https://github.com/AY2324S2-CS2103T-W10-1/tp.git (master)... +Mar 08, 2024 9:41:45 AM reposense.report.ReportGenerator analyzeRepo +INFO: Analysis of https://github.com/AY2324S2-CS2103T-W10-1/tp.git (master) completed! +Mar 08, 2024 9:41:45 AM reposense.report.ReportGenerator analyzeRepos INFO: [27/92] Analyzing https://github.com/AY2324S2-CS2103T-F10-1/tp.git (master)... -Mar 08, 2024 4:11:21 AM reposense.report.RepoCloner waitForCloneProcess +Mar 08, 2024 9:41:45 AM reposense.report.RepoCloner spawnCloneProcess +INFO: Cloning in parallel from https://github.com/AY2324S2-CS2103T-T10-3/tp.git... +Mar 08, 2024 9:41:45 AM reposense.report.RepoCloner waitForCloneProcess INFO: Waiting for cloning of https://github.com/AY2324S2-CS2103T-T10-3/tp.git to complete... -Mar 08, 2024 4:11:21 AM reposense.report.RepoCloner waitForCloneProcess -INFO: Cloning of https://github.com/AY2324S2-CS2103T-F10-4/tp.git completed! -Mar 08, 2024 4:11:21 AM reposense.report.ReportGenerator updateRepoConfig +Mar 08, 2024 9:41:45 AM reposense.report.ReportGenerator updateRepoConfig INFO: https://github.com/AY2324S2-CS2103T-F10-1/tp.git (master) does not contain a standalone config file. -Mar 08, 2024 4:11:21 AM reposense.authorship.FileInfoExtractor extractTextFileInfos +Mar 08, 2024 9:41:45 AM reposense.authorship.FileInfoExtractor extractTextFileInfos INFO: Extracting relevant file info from https://github.com/AY2324S2-CS2103T-F10-1/tp.git (master)... -Mar 08, 2024 4:11:21 AM reposense.commits.CommitInfoAnalyzer analyzeCommits -INFO: Analyzing commits info for https://github.com/AY2324S2-CS2103T-W10-2/tp.git (master)... -Mar 08, 2024 4:11:21 AM reposense.report.ReportGenerator analyzeRepo -INFO: Analysis of https://github.com/AY2324S2-CS2103T-W10-2/tp.git (master) completed! -Mar 08, 2024 4:11:21 AM reposense.report.ReportGenerator analyzeRepos +Mar 08, 2024 9:41:45 AM reposense.report.RepoCloner waitForCloneProcess +INFO: Cloning of https://github.com/AY2324S2-CS2103T-F10-4/tp.git completed! +Mar 08, 2024 9:41:45 AM reposense.report.ReportGenerator analyzeRepos INFO: [28/92] Analyzing https://github.com/AY2324S2-CS2103T-F10-4/tp.git (master)... -Mar 08, 2024 4:11:21 AM reposense.report.RepoCloner spawnCloneProcess +Mar 08, 2024 9:41:45 AM reposense.report.RepoCloner spawnCloneProcess INFO: Cloning in parallel from https://github.com/AY2324S2-CS2103-F09-1/tp.git... -Mar 08, 2024 4:11:21 AM reposense.report.RepoCloner waitForCloneProcess +Mar 08, 2024 9:41:45 AM reposense.report.RepoCloner waitForCloneProcess INFO: Waiting for cloning of https://github.com/AY2324S2-CS2103-F09-1/tp.git to complete... -Mar 08, 2024 4:11:21 AM reposense.report.ReportGenerator updateRepoConfig +Mar 08, 2024 9:41:45 AM reposense.commits.CommitInfoExtractor extractCommitInfos +INFO: Extracting commits info for https://github.com/AY2324S2-CS2103T-T13-4/tp.git (master)... +Mar 08, 2024 9:41:45 AM reposense.report.ReportGenerator updateRepoConfig INFO: https://github.com/AY2324S2-CS2103T-F10-4/tp.git (master) does not contain a standalone config file. -Mar 08, 2024 4:11:21 AM reposense.authorship.FileInfoExtractor extractTextFileInfos +Mar 08, 2024 9:41:45 AM reposense.authorship.FileInfoExtractor extractTextFileInfos INFO: Extracting relevant file info from https://github.com/AY2324S2-CS2103T-F10-4/tp.git (master)... -Mar 08, 2024 4:11:21 AM reposense.commits.CommitInfoExtractor extractCommitInfos -INFO: Extracting commits info for https://github.com/AY2324S2-CS2103T-W10-1/tp.git (master)... -Mar 08, 2024 4:11:21 AM reposense.report.RepoCloner waitForCloneProcess +Mar 08, 2024 9:41:45 AM reposense.commits.CommitInfoAnalyzer analyzeCommits +INFO: Analyzing commits info for https://github.com/AY2324S2-CS2103T-T13-4/tp.git (master)... +Mar 08, 2024 9:41:45 AM reposense.report.ReportGenerator analyzeRepo +INFO: Analysis of https://github.com/AY2324S2-CS2103T-T13-4/tp.git (master) completed! +Mar 08, 2024 9:41:45 AM reposense.report.RepoCloner waitForCloneProcess INFO: Cloning of https://github.com/AY2324S2-CS2103T-T16-3/tp.git completed! -Mar 08, 2024 4:11:21 AM reposense.report.RepoCloner waitForCloneProcess -INFO: Cloning of https://github.com/AY2324S2-CS2103-F09-3/tp.git completed! -Mar 08, 2024 4:11:21 AM reposense.commits.CommitInfoExtractor extractCommitInfos -INFO: Extracting commits info for https://github.com/AY2324S2-CS2103T-F10-1/tp.git (master)... -Mar 08, 2024 4:11:21 AM reposense.report.ReportGenerator analyzeRepos -INFO: [29/92] Analyzing https://github.com/AY2324S2-CS2103T-T16-3/tp.git (master)... -Mar 08, 2024 4:11:21 AM reposense.report.RepoCloner spawnCloneProcess +Mar 08, 2024 9:41:45 AM reposense.report.RepoCloner spawnCloneProcess INFO: Cloning in parallel from https://github.com/AY2324S2-CS2103-F09-4/tp.git... -Mar 08, 2024 4:11:21 AM reposense.report.RepoCloner waitForCloneProcess +Mar 08, 2024 9:41:45 AM reposense.report.ReportGenerator analyzeRepos +INFO: [29/92] Analyzing https://github.com/AY2324S2-CS2103T-T16-3/tp.git (master)... +Mar 08, 2024 9:41:45 AM reposense.report.RepoCloner waitForCloneProcess INFO: Waiting for cloning of https://github.com/AY2324S2-CS2103-F09-4/tp.git to complete... -Mar 08, 2024 4:11:21 AM reposense.report.RepoCloner spawnCloneProcess -INFO: Cloning in parallel from https://github.com/AY2324S2-CS2103-F09-2/tp.git... -Mar 08, 2024 4:11:21 AM reposense.commits.CommitInfoAnalyzer analyzeCommits -INFO: Analyzing commits info for https://github.com/AY2324S2-CS2103T-W10-1/tp.git (master)... -Mar 08, 2024 4:11:21 AM reposense.report.ReportGenerator analyzeRepo -INFO: Analysis of https://github.com/AY2324S2-CS2103T-W10-1/tp.git (master) completed! -Mar 08, 2024 4:11:21 AM reposense.report.ReportGenerator analyzeRepos -INFO: [30/92] Analyzing https://github.com/AY2324S2-CS2103-F09-3/tp.git (master)... -Mar 08, 2024 4:11:21 AM reposense.report.RepoCloner waitForCloneProcess -INFO: Waiting for cloning of https://github.com/AY2324S2-CS2103-F09-2/tp.git to complete... -Mar 08, 2024 4:11:21 AM reposense.report.ReportGenerator updateRepoConfig +Mar 08, 2024 9:41:45 AM reposense.commits.CommitInfoExtractor extractCommitInfos +INFO: Extracting commits info for https://github.com/AY2324S2-CS2103T-F10-1/tp.git (master)... +Mar 08, 2024 9:41:45 AM reposense.report.ReportGenerator updateRepoConfig INFO: https://github.com/AY2324S2-CS2103T-T16-3/tp.git (master) does not contain a standalone config file. -Mar 08, 2024 4:11:21 AM reposense.authorship.FileInfoExtractor extractTextFileInfos +Mar 08, 2024 9:41:45 AM reposense.authorship.FileInfoExtractor extractTextFileInfos INFO: Extracting relevant file info from https://github.com/AY2324S2-CS2103T-T16-3/tp.git (master)... -Mar 08, 2024 4:11:21 AM reposense.report.ReportGenerator updateRepoConfig -INFO: https://github.com/AY2324S2-CS2103-F09-3/tp.git (master) does not contain a standalone config file. -Mar 08, 2024 4:11:21 AM reposense.authorship.FileInfoExtractor extractTextFileInfos -INFO: Extracting relevant file info from https://github.com/AY2324S2-CS2103-F09-3/tp.git (master)... -Mar 08, 2024 4:11:21 AM reposense.commits.CommitInfoAnalyzer analyzeCommits +Mar 08, 2024 9:41:46 AM reposense.commits.CommitInfoExtractor extractCommitInfos +INFO: Extracting commits info for https://github.com/AY2324S2-CS2103T-W10-2/tp.git (master)... +Mar 08, 2024 9:41:46 AM reposense.commits.CommitInfoAnalyzer analyzeCommits INFO: Analyzing commits info for https://github.com/AY2324S2-CS2103T-F10-1/tp.git (master)... -Mar 08, 2024 4:11:21 AM reposense.report.ReportGenerator analyzeRepo +Mar 08, 2024 9:41:46 AM reposense.report.RepoCloner waitForCloneProcess +INFO: Cloning of https://github.com/AY2324S2-CS2103-F09-3/tp.git completed! +Mar 08, 2024 9:41:46 AM reposense.report.ReportGenerator analyzeRepo INFO: Analysis of https://github.com/AY2324S2-CS2103T-F10-1/tp.git (master) completed! -Mar 08, 2024 4:11:22 AM reposense.commits.CommitInfoExtractor extractCommitInfos +Mar 08, 2024 9:41:46 AM reposense.commits.CommitInfoExtractor extractCommitInfos INFO: Extracting commits info for https://github.com/AY2324S2-CS2103T-F10-4/tp.git (master)... -Mar 08, 2024 4:11:22 AM reposense.commits.CommitInfoExtractor extractCommitInfos +Mar 08, 2024 9:41:46 AM reposense.report.RepoCloner spawnCloneProcess +INFO: Cloning in parallel from https://github.com/AY2324S2-CS2103-F09-2/tp.git... +Mar 08, 2024 9:41:46 AM reposense.report.ReportGenerator analyzeRepos +INFO: [30/92] Analyzing https://github.com/AY2324S2-CS2103-F09-3/tp.git (master)... +Mar 08, 2024 9:41:46 AM reposense.report.RepoCloner waitForCloneProcess +INFO: Waiting for cloning of https://github.com/AY2324S2-CS2103-F09-2/tp.git to complete... +Mar 08, 2024 9:41:46 AM reposense.report.ReportGenerator updateRepoConfig +INFO: https://github.com/AY2324S2-CS2103-F09-3/tp.git (master) does not contain a standalone config file. +Mar 08, 2024 9:41:46 AM reposense.authorship.FileInfoExtractor extractTextFileInfos +INFO: Extracting relevant file info from https://github.com/AY2324S2-CS2103-F09-3/tp.git (master)... +Mar 08, 2024 9:41:46 AM reposense.commits.CommitInfoAnalyzer analyzeCommits +INFO: Analyzing commits info for https://github.com/AY2324S2-CS2103T-W10-2/tp.git (master)... +Mar 08, 2024 9:41:46 AM reposense.report.ReportGenerator analyzeRepo +INFO: Analysis of https://github.com/AY2324S2-CS2103T-W10-2/tp.git (master) completed! +Mar 08, 2024 9:41:46 AM reposense.commits.CommitInfoExtractor extractCommitInfos INFO: Extracting commits info for https://github.com/AY2324S2-CS2103T-T16-3/tp.git (master)... -Mar 08, 2024 4:11:22 AM reposense.commits.CommitInfoAnalyzer analyzeCommits +Mar 08, 2024 9:41:46 AM reposense.commits.CommitInfoAnalyzer analyzeCommits INFO: Analyzing commits info for https://github.com/AY2324S2-CS2103T-F10-4/tp.git (master)... -Mar 08, 2024 4:11:22 AM reposense.report.ReportGenerator analyzeRepo +Mar 08, 2024 9:41:46 AM reposense.report.ReportGenerator analyzeRepo INFO: Analysis of https://github.com/AY2324S2-CS2103T-F10-4/tp.git (master) completed! -Mar 08, 2024 4:11:22 AM reposense.commits.CommitInfoExtractor extractCommitInfos -INFO: Extracting commits info for https://github.com/AY2324S2-CS2103-F09-3/tp.git (master)... -Mar 08, 2024 4:11:22 AM reposense.commits.CommitInfoAnalyzer analyzeCommits +Mar 08, 2024 9:41:46 AM reposense.commits.CommitInfoAnalyzer analyzeCommits INFO: Analyzing commits info for https://github.com/AY2324S2-CS2103T-T16-3/tp.git (master)... -Mar 08, 2024 4:11:22 AM reposense.report.ReportGenerator analyzeRepo +Mar 08, 2024 9:41:46 AM reposense.report.ReportGenerator analyzeRepo INFO: Analysis of https://github.com/AY2324S2-CS2103T-T16-3/tp.git (master) completed! -Mar 08, 2024 4:11:22 AM reposense.commits.CommitInfoAnalyzer analyzeCommits -INFO: Analyzing commits info for https://github.com/AY2324S2-CS2103-F09-3/tp.git (master)... -Mar 08, 2024 4:11:22 AM reposense.report.RepoCloner waitForCloneProcess +Mar 08, 2024 9:41:46 AM reposense.report.RepoCloner waitForCloneProcess INFO: Cloning of https://github.com/AY2324S2-CS2103T-T10-3/tp.git completed! -Mar 08, 2024 4:11:22 AM reposense.report.ReportGenerator analyzeRepo -INFO: Analysis of https://github.com/AY2324S2-CS2103-F09-3/tp.git (master) completed! -Mar 08, 2024 4:11:22 AM reposense.report.ReportGenerator analyzeRepos -INFO: [31/92] Analyzing https://github.com/AY2324S2-CS2103T-T10-3/tp.git (master)... -Mar 08, 2024 4:11:22 AM reposense.report.RepoCloner spawnCloneProcess +Mar 08, 2024 9:41:46 AM reposense.report.RepoCloner spawnCloneProcess INFO: Cloning in parallel from https://github.com/AY2324S2-CS2103T-T09-4/tp.git... -Mar 08, 2024 4:11:22 AM reposense.report.RepoCloner waitForCloneProcess +Mar 08, 2024 9:41:46 AM reposense.report.ReportGenerator analyzeRepos +INFO: [31/92] Analyzing https://github.com/AY2324S2-CS2103T-T10-3/tp.git (master)... +Mar 08, 2024 9:41:46 AM reposense.report.RepoCloner waitForCloneProcess INFO: Waiting for cloning of https://github.com/AY2324S2-CS2103T-T09-4/tp.git to complete... -Mar 08, 2024 4:11:22 AM reposense.report.ReportGenerator updateRepoConfig +Mar 08, 2024 9:41:46 AM reposense.report.ReportGenerator updateRepoConfig INFO: https://github.com/AY2324S2-CS2103T-T10-3/tp.git (master) does not contain a standalone config file. -Mar 08, 2024 4:11:22 AM reposense.authorship.FileInfoExtractor extractTextFileInfos +Mar 08, 2024 9:41:46 AM reposense.authorship.FileInfoExtractor extractTextFileInfos INFO: Extracting relevant file info from https://github.com/AY2324S2-CS2103T-T10-3/tp.git (master)... -Mar 08, 2024 4:11:23 AM reposense.report.RepoCloner waitForCloneProcess +Mar 08, 2024 9:41:46 AM reposense.commits.CommitInfoExtractor extractCommitInfos +INFO: Extracting commits info for https://github.com/AY2324S2-CS2103-F09-3/tp.git (master)... +Mar 08, 2024 9:41:47 AM reposense.report.RepoCloner waitForCloneProcess INFO: Cloning of https://github.com/AY2324S2-CS2103-F09-4/tp.git completed! -Mar 08, 2024 4:11:23 AM reposense.commits.CommitInfoExtractor extractCommitInfos -INFO: Extracting commits info for https://github.com/AY2324S2-CS2103T-T10-3/tp.git (master)... -Mar 08, 2024 4:11:23 AM reposense.report.RepoCloner spawnCloneProcess -INFO: Cloning in parallel from https://github.com/AY2324S2-CS2103-F08-4/tp.git... -Mar 08, 2024 4:11:23 AM reposense.report.ReportGenerator analyzeRepos +Mar 08, 2024 9:41:47 AM reposense.commits.CommitInfoAnalyzer analyzeCommits +INFO: Analyzing commits info for https://github.com/AY2324S2-CS2103-F09-3/tp.git (master)... +Mar 08, 2024 9:41:47 AM reposense.report.ReportGenerator analyzeRepos INFO: [32/92] Analyzing https://github.com/AY2324S2-CS2103-F09-4/tp.git (master)... -Mar 08, 2024 4:11:23 AM reposense.report.RepoCloner waitForCloneProcess -INFO: Cloning of https://github.com/AY2324S2-CS2103-F09-1/tp.git completed! -Mar 08, 2024 4:11:23 AM reposense.report.RepoCloner waitForCloneProcess +Mar 08, 2024 9:41:47 AM reposense.report.RepoCloner spawnCloneProcess +INFO: Cloning in parallel from https://github.com/AY2324S2-CS2103-F08-4/tp.git... +Mar 08, 2024 9:41:47 AM reposense.report.ReportGenerator analyzeRepo +INFO: Analysis of https://github.com/AY2324S2-CS2103-F09-3/tp.git (master) completed! +Mar 08, 2024 9:41:47 AM reposense.report.RepoCloner waitForCloneProcess INFO: Waiting for cloning of https://github.com/AY2324S2-CS2103-F08-4/tp.git to complete... -Mar 08, 2024 4:11:23 AM reposense.report.ReportGenerator analyzeRepos -INFO: [33/92] Analyzing https://github.com/AY2324S2-CS2103-F09-1/tp.git (master)... -Mar 08, 2024 4:11:23 AM reposense.report.RepoCloner spawnCloneProcess +Mar 08, 2024 9:41:47 AM reposense.commits.CommitInfoExtractor extractCommitInfos +INFO: Extracting commits info for https://github.com/AY2324S2-CS2103T-T10-3/tp.git (master)... +Mar 08, 2024 9:41:47 AM reposense.report.RepoCloner waitForCloneProcess +INFO: Cloning of https://github.com/AY2324S2-CS2103-F09-1/tp.git completed! +Mar 08, 2024 9:41:47 AM reposense.report.RepoCloner spawnCloneProcess INFO: Cloning in parallel from https://github.com/AY2324S2-CS2103T-T09-3/tp.git... -Mar 08, 2024 4:11:23 AM reposense.report.RepoCloner waitForCloneProcess +Mar 08, 2024 9:41:47 AM reposense.report.ReportGenerator analyzeRepos +INFO: [33/92] Analyzing https://github.com/AY2324S2-CS2103-F09-1/tp.git (master)... +Mar 08, 2024 9:41:47 AM reposense.report.RepoCloner waitForCloneProcess INFO: Waiting for cloning of https://github.com/AY2324S2-CS2103T-T09-3/tp.git to complete... -Mar 08, 2024 4:11:23 AM reposense.report.RepoCloner waitForCloneProcess -INFO: Cloning of https://github.com/AY2324S2-CS2103-F09-2/tp.git completed! -Mar 08, 2024 4:11:23 AM reposense.report.ReportGenerator updateRepoConfig +Mar 08, 2024 9:41:47 AM reposense.report.ReportGenerator updateRepoConfig INFO: https://github.com/AY2324S2-CS2103-F09-4/tp.git (master) does not contain a standalone config file. -Mar 08, 2024 4:11:23 AM reposense.authorship.FileInfoExtractor extractTextFileInfos +Mar 08, 2024 9:41:47 AM reposense.authorship.FileInfoExtractor extractTextFileInfos INFO: Extracting relevant file info from https://github.com/AY2324S2-CS2103-F09-4/tp.git (master)... -Mar 08, 2024 4:11:23 AM reposense.report.ReportGenerator analyzeRepos -INFO: [34/92] Analyzing https://github.com/AY2324S2-CS2103-F09-2/tp.git (master)... -Mar 08, 2024 4:11:23 AM reposense.report.RepoCloner spawnCloneProcess -INFO: Cloning in parallel from https://github.com/AY2324S2-CS2103T-T12-4/tp.git... -Mar 08, 2024 4:11:23 AM reposense.report.ReportGenerator updateRepoConfig +Mar 08, 2024 9:41:47 AM reposense.commits.CommitInfoAnalyzer analyzeCommits +INFO: Analyzing commits info for https://github.com/AY2324S2-CS2103T-T10-3/tp.git (master)... +Mar 08, 2024 9:41:47 AM reposense.report.ReportGenerator updateRepoConfig INFO: https://github.com/AY2324S2-CS2103-F09-1/tp.git (master) does not contain a standalone config file. -Mar 08, 2024 4:11:23 AM reposense.authorship.FileInfoExtractor extractTextFileInfos +Mar 08, 2024 9:41:47 AM reposense.authorship.FileInfoExtractor extractTextFileInfos INFO: Extracting relevant file info from https://github.com/AY2324S2-CS2103-F09-1/tp.git (master)... -Mar 08, 2024 4:11:23 AM reposense.report.RepoCloner waitForCloneProcess -INFO: Waiting for cloning of https://github.com/AY2324S2-CS2103T-T12-4/tp.git to complete... -Mar 08, 2024 4:11:23 AM reposense.commits.CommitInfoAnalyzer analyzeCommits -INFO: Analyzing commits info for https://github.com/AY2324S2-CS2103T-T10-3/tp.git (master)... -Mar 08, 2024 4:11:23 AM reposense.report.ReportGenerator analyzeRepo +Mar 08, 2024 9:41:47 AM reposense.report.ReportGenerator analyzeRepo INFO: Analysis of https://github.com/AY2324S2-CS2103T-T10-3/tp.git (master) completed! -Mar 08, 2024 4:11:23 AM reposense.report.ReportGenerator updateRepoConfig +Mar 08, 2024 9:41:47 AM reposense.report.RepoCloner waitForCloneProcess +INFO: Cloning of https://github.com/AY2324S2-CS2103-F09-2/tp.git completed! +Mar 08, 2024 9:41:47 AM reposense.report.RepoCloner spawnCloneProcess +INFO: Cloning in parallel from https://github.com/AY2324S2-CS2103T-T12-4/tp.git... +Mar 08, 2024 9:41:47 AM reposense.report.ReportGenerator analyzeRepos +INFO: [34/92] Analyzing https://github.com/AY2324S2-CS2103-F09-2/tp.git (master)... +Mar 08, 2024 9:41:47 AM reposense.report.RepoCloner waitForCloneProcess +INFO: Waiting for cloning of https://github.com/AY2324S2-CS2103T-T12-4/tp.git to complete... +Mar 08, 2024 9:41:48 AM reposense.commits.CommitInfoExtractor extractCommitInfos +INFO: Extracting commits info for https://github.com/AY2324S2-CS2103-F09-1/tp.git (master)... +Mar 08, 2024 9:41:48 AM reposense.report.ReportGenerator updateRepoConfig INFO: https://github.com/AY2324S2-CS2103-F09-2/tp.git (master) does not contain a standalone config file. -Mar 08, 2024 4:11:23 AM reposense.authorship.FileInfoExtractor extractTextFileInfos +Mar 08, 2024 9:41:48 AM reposense.authorship.FileInfoExtractor extractTextFileInfos INFO: Extracting relevant file info from https://github.com/AY2324S2-CS2103-F09-2/tp.git (master)... -Mar 08, 2024 4:11:23 AM reposense.commits.CommitInfoExtractor extractCommitInfos -INFO: Extracting commits info for https://github.com/AY2324S2-CS2103-F09-1/tp.git (master)... -Mar 08, 2024 4:11:23 AM reposense.commits.CommitInfoAnalyzer analyzeCommits +Mar 08, 2024 9:41:48 AM reposense.commits.CommitInfoAnalyzer analyzeCommits INFO: Analyzing commits info for https://github.com/AY2324S2-CS2103-F09-1/tp.git (master)... -Mar 08, 2024 4:11:23 AM reposense.report.ReportGenerator analyzeRepo +Mar 08, 2024 9:41:48 AM reposense.report.ReportGenerator analyzeRepo INFO: Analysis of https://github.com/AY2324S2-CS2103-F09-1/tp.git (master) completed! -Mar 08, 2024 4:11:24 AM reposense.commits.CommitInfoExtractor extractCommitInfos +Mar 08, 2024 9:41:48 AM reposense.commits.CommitInfoExtractor extractCommitInfos INFO: Extracting commits info for https://github.com/AY2324S2-CS2103-F09-2/tp.git (master)... -Mar 08, 2024 4:11:24 AM reposense.commits.CommitInfoAnalyzer analyzeCommits -INFO: Analyzing commits info for https://github.com/AY2324S2-CS2103-F09-2/tp.git (master)... -Mar 08, 2024 4:11:24 AM reposense.report.ReportGenerator analyzeRepo -INFO: Analysis of https://github.com/AY2324S2-CS2103-F09-2/tp.git (master) completed! -Mar 08, 2024 4:11:24 AM reposense.report.RepoCloner waitForCloneProcess +Mar 08, 2024 9:41:48 AM reposense.report.RepoCloner waitForCloneProcess INFO: Cloning of https://github.com/AY2324S2-CS2103T-T09-4/tp.git completed! -Mar 08, 2024 4:11:24 AM reposense.report.ReportGenerator analyzeRepos -INFO: [35/92] Analyzing https://github.com/AY2324S2-CS2103T-T09-4/tp.git (master)... -Mar 08, 2024 4:11:24 AM reposense.report.RepoCloner spawnCloneProcess +Mar 08, 2024 9:41:48 AM reposense.report.RepoCloner spawnCloneProcess INFO: Cloning in parallel from https://github.com/AY2324S2-CS2103-F08-2/tp.git... -Mar 08, 2024 4:11:24 AM reposense.report.RepoCloner waitForCloneProcess +Mar 08, 2024 9:41:48 AM reposense.report.ReportGenerator analyzeRepos +INFO: [35/92] Analyzing https://github.com/AY2324S2-CS2103T-T09-4/tp.git (master)... +Mar 08, 2024 9:41:48 AM reposense.report.RepoCloner waitForCloneProcess INFO: Cloning of https://github.com/AY2324S2-CS2103-F08-4/tp.git completed! -Mar 08, 2024 4:11:24 AM reposense.report.RepoCloner waitForCloneProcess +Mar 08, 2024 9:41:48 AM reposense.report.RepoCloner waitForCloneProcess INFO: Waiting for cloning of https://github.com/AY2324S2-CS2103-F08-2/tp.git to complete... -Mar 08, 2024 4:11:24 AM reposense.report.RepoCloner spawnCloneProcess -INFO: Cloning in parallel from https://github.com/AY2324S2-CS2103T-W11-1/tp.git... -Mar 08, 2024 4:11:24 AM reposense.report.ReportGenerator analyzeRepos +Mar 08, 2024 9:41:48 AM reposense.report.ReportGenerator analyzeRepos INFO: [36/92] Analyzing https://github.com/AY2324S2-CS2103-F08-4/tp.git (master)... -Mar 08, 2024 4:11:24 AM reposense.report.RepoCloner waitForCloneProcess +Mar 08, 2024 9:41:48 AM reposense.report.RepoCloner spawnCloneProcess +INFO: Cloning in parallel from https://github.com/AY2324S2-CS2103T-W11-1/tp.git... +Mar 08, 2024 9:41:48 AM reposense.report.RepoCloner waitForCloneProcess INFO: Waiting for cloning of https://github.com/AY2324S2-CS2103T-W11-1/tp.git to complete... -Mar 08, 2024 4:11:24 AM reposense.report.RepoCloner waitForCloneProcess -INFO: Cloning of https://github.com/AY2324S2-CS2103T-T12-4/tp.git completed! -Mar 08, 2024 4:11:24 AM reposense.report.ReportGenerator updateRepoConfig -INFO: https://github.com/AY2324S2-CS2103-F08-4/tp.git (master) does not contain a standalone config file. -Mar 08, 2024 4:11:24 AM reposense.authorship.FileInfoExtractor extractTextFileInfos -INFO: Extracting relevant file info from https://github.com/AY2324S2-CS2103-F08-4/tp.git (master)... -Mar 08, 2024 4:11:24 AM reposense.report.ReportGenerator analyzeRepos -INFO: [37/92] Analyzing https://github.com/AY2324S2-CS2103T-T12-4/tp.git (master)... -Mar 08, 2024 4:11:24 AM reposense.report.RepoCloner spawnCloneProcess -INFO: Cloning in parallel from https://github.com/AY2324S2-CS2103T-W11-3/tp.git... -Mar 08, 2024 4:11:24 AM reposense.report.ReportGenerator updateRepoConfig +Mar 08, 2024 9:41:48 AM reposense.report.ReportGenerator updateRepoConfig INFO: https://github.com/AY2324S2-CS2103T-T09-4/tp.git (master) does not contain a standalone config file. -Mar 08, 2024 4:11:24 AM reposense.authorship.FileInfoExtractor extractTextFileInfos +Mar 08, 2024 9:41:48 AM reposense.authorship.FileInfoExtractor extractTextFileInfos INFO: Extracting relevant file info from https://github.com/AY2324S2-CS2103T-T09-4/tp.git (master)... -Mar 08, 2024 4:11:24 AM reposense.report.RepoCloner waitForCloneProcess -INFO: Waiting for cloning of https://github.com/AY2324S2-CS2103T-W11-3/tp.git to complete... -Mar 08, 2024 4:11:24 AM reposense.report.ReportGenerator updateRepoConfig -INFO: https://github.com/AY2324S2-CS2103T-T12-4/tp.git (master) does not contain a standalone config file. -Mar 08, 2024 4:11:24 AM reposense.authorship.FileInfoExtractor extractTextFileInfos -INFO: Extracting relevant file info from https://github.com/AY2324S2-CS2103T-T12-4/tp.git (master)... -Mar 08, 2024 4:11:24 AM reposense.commits.CommitInfoExtractor extractCommitInfos -INFO: Extracting commits info for https://github.com/AY2324S2-CS2103-F08-4/tp.git (master)... -Mar 08, 2024 4:11:25 AM reposense.commits.CommitInfoAnalyzer analyzeCommits -INFO: Analyzing commits info for https://github.com/AY2324S2-CS2103-F08-4/tp.git (master)... -Mar 08, 2024 4:11:25 AM reposense.report.ReportGenerator analyzeRepo -INFO: Analysis of https://github.com/AY2324S2-CS2103-F08-4/tp.git (master) completed! -Mar 08, 2024 4:11:25 AM reposense.commits.CommitInfoExtractor extractCommitInfos +Mar 08, 2024 9:41:48 AM reposense.report.ReportGenerator updateRepoConfig +INFO: https://github.com/AY2324S2-CS2103-F08-4/tp.git (master) does not contain a standalone config file. +Mar 08, 2024 9:41:48 AM reposense.authorship.FileInfoExtractor extractTextFileInfos +INFO: Extracting relevant file info from https://github.com/AY2324S2-CS2103-F08-4/tp.git (master)... +Mar 08, 2024 9:41:49 AM reposense.commits.CommitInfoAnalyzer analyzeCommits +INFO: Analyzing commits info for https://github.com/AY2324S2-CS2103-F09-2/tp.git (master)... +Mar 08, 2024 9:41:49 AM reposense.report.ReportGenerator analyzeRepo +INFO: Analysis of https://github.com/AY2324S2-CS2103-F09-2/tp.git (master) completed! +Mar 08, 2024 9:41:49 AM reposense.commits.CommitInfoExtractor extractCommitInfos INFO: Extracting commits info for https://github.com/AY2324S2-CS2103-F09-4/tp.git (master)... -Mar 08, 2024 4:11:25 AM reposense.commits.CommitInfoExtractor extractCommitInfos +Mar 08, 2024 9:41:49 AM reposense.commits.CommitInfoExtractor extractCommitInfos INFO: Extracting commits info for https://github.com/AY2324S2-CS2103T-T09-4/tp.git (master)... -Mar 08, 2024 4:11:25 AM reposense.commits.CommitInfoExtractor extractCommitInfos -INFO: Extracting commits info for https://github.com/AY2324S2-CS2103T-T12-4/tp.git (master)... -Mar 08, 2024 4:11:25 AM reposense.commits.CommitInfoAnalyzer analyzeCommits +Mar 08, 2024 9:41:49 AM reposense.commits.CommitInfoAnalyzer analyzeCommits INFO: Analyzing commits info for https://github.com/AY2324S2-CS2103-F09-4/tp.git (master)... -Mar 08, 2024 4:11:25 AM reposense.report.ReportGenerator analyzeRepo +Mar 08, 2024 9:41:49 AM reposense.report.ReportGenerator analyzeRepo INFO: Analysis of https://github.com/AY2324S2-CS2103-F09-4/tp.git (master) completed! -Mar 08, 2024 4:11:25 AM reposense.commits.CommitInfoAnalyzer analyzeCommits +Mar 08, 2024 9:41:49 AM reposense.commits.CommitInfoExtractor extractCommitInfos +INFO: Extracting commits info for https://github.com/AY2324S2-CS2103-F08-4/tp.git (master)... +Mar 08, 2024 9:41:49 AM reposense.commits.CommitInfoAnalyzer analyzeCommits INFO: Analyzing commits info for https://github.com/AY2324S2-CS2103T-T09-4/tp.git (master)... -Mar 08, 2024 4:11:25 AM reposense.report.ReportGenerator analyzeRepo +Mar 08, 2024 9:41:49 AM reposense.report.ReportGenerator analyzeRepo INFO: Analysis of https://github.com/AY2324S2-CS2103T-T09-4/tp.git (master) completed! -Mar 08, 2024 4:11:25 AM reposense.commits.CommitInfoAnalyzer analyzeCommits -INFO: Analyzing commits info for https://github.com/AY2324S2-CS2103T-T12-4/tp.git (master)... -Mar 08, 2024 4:11:25 AM reposense.report.RepoCloner waitForCloneProcess -INFO: Cloning of https://github.com/AY2324S2-CS2103T-W11-1/tp.git completed! -Mar 08, 2024 4:11:25 AM reposense.report.ReportGenerator analyzeRepo -INFO: Analysis of https://github.com/AY2324S2-CS2103T-T12-4/tp.git (master) completed! -Mar 08, 2024 4:11:25 AM reposense.report.ReportGenerator analyzeRepos -INFO: [38/92] Analyzing https://github.com/AY2324S2-CS2103T-W11-1/tp.git (master)... -Mar 08, 2024 4:11:25 AM reposense.report.RepoCloner spawnCloneProcess +Mar 08, 2024 9:41:49 AM reposense.report.RepoCloner waitForCloneProcess +INFO: Cloning of https://github.com/AY2324S2-CS2103T-T12-4/tp.git completed! +Mar 08, 2024 9:41:49 AM reposense.report.RepoCloner spawnCloneProcess +INFO: Cloning in parallel from https://github.com/AY2324S2-CS2103T-W11-3/tp.git... +Mar 08, 2024 9:41:49 AM reposense.report.ReportGenerator analyzeRepos +INFO: [37/92] Analyzing https://github.com/AY2324S2-CS2103T-T12-4/tp.git (master)... +Mar 08, 2024 9:41:49 AM reposense.commits.CommitInfoAnalyzer analyzeCommits +INFO: Analyzing commits info for https://github.com/AY2324S2-CS2103-F08-4/tp.git (master)... +Mar 08, 2024 9:41:49 AM reposense.report.ReportGenerator analyzeRepo +INFO: Analysis of https://github.com/AY2324S2-CS2103-F08-4/tp.git (master) completed! +Mar 08, 2024 9:41:49 AM reposense.report.RepoCloner waitForCloneProcess +INFO: Waiting for cloning of https://github.com/AY2324S2-CS2103T-W11-3/tp.git to complete... +Mar 08, 2024 9:41:49 AM reposense.report.ReportGenerator updateRepoConfig +INFO: https://github.com/AY2324S2-CS2103T-T12-4/tp.git (master) does not contain a standalone config file. +Mar 08, 2024 9:41:49 AM reposense.authorship.FileInfoExtractor extractTextFileInfos +INFO: Extracting relevant file info from https://github.com/AY2324S2-CS2103T-T12-4/tp.git (master)... +Mar 08, 2024 9:41:50 AM reposense.report.RepoCloner waitForCloneProcess +INFO: Cloning of https://github.com/AY2324S2-CS2103T-T09-3/tp.git completed! +Mar 08, 2024 9:41:50 AM reposense.report.ReportGenerator analyzeRepos +INFO: [38/92] Analyzing https://github.com/AY2324S2-CS2103T-T09-3/tp.git (master)... +Mar 08, 2024 9:41:50 AM reposense.report.RepoCloner spawnCloneProcess INFO: Cloning in parallel from https://github.com/AY2324S2-CS2103T-W09-3/tp.git... -Mar 08, 2024 4:11:25 AM reposense.report.RepoCloner waitForCloneProcess -INFO: Cloning of https://github.com/AY2324S2-CS2103T-W11-3/tp.git completed! -Mar 08, 2024 4:11:25 AM reposense.report.RepoCloner waitForCloneProcess +Mar 08, 2024 9:41:50 AM reposense.report.RepoCloner waitForCloneProcess INFO: Waiting for cloning of https://github.com/AY2324S2-CS2103T-W09-3/tp.git to complete... -Mar 08, 2024 4:11:25 AM reposense.report.ReportGenerator analyzeRepos -INFO: [39/92] Analyzing https://github.com/AY2324S2-CS2103T-W11-3/tp.git (master)... -Mar 08, 2024 4:11:25 AM reposense.report.RepoCloner spawnCloneProcess +Mar 08, 2024 9:41:50 AM reposense.report.RepoCloner waitForCloneProcess +INFO: Cloning of https://github.com/AY2324S2-CS2103-F08-2/tp.git completed! +Mar 08, 2024 9:41:50 AM reposense.report.ReportGenerator analyzeRepos +INFO: [39/92] Analyzing https://github.com/AY2324S2-CS2103-F08-2/tp.git (master)... +Mar 08, 2024 9:41:50 AM reposense.report.RepoCloner spawnCloneProcess INFO: Cloning in parallel from https://github.com/AY2324S2-CS2103T-F14-1/tp.git... -Mar 08, 2024 4:11:25 AM reposense.report.RepoCloner waitForCloneProcess +Mar 08, 2024 9:41:50 AM reposense.report.RepoCloner waitForCloneProcess INFO: Waiting for cloning of https://github.com/AY2324S2-CS2103T-F14-1/tp.git to complete... -Mar 08, 2024 4:11:25 AM reposense.report.ReportGenerator updateRepoConfig -INFO: https://github.com/AY2324S2-CS2103T-W11-1/tp.git (master) does not contain a standalone config file. -Mar 08, 2024 4:11:25 AM reposense.authorship.FileInfoExtractor extractTextFileInfos -INFO: Extracting relevant file info from https://github.com/AY2324S2-CS2103T-W11-1/tp.git (master)... -Mar 08, 2024 4:11:25 AM reposense.report.ReportGenerator updateRepoConfig -INFO: https://github.com/AY2324S2-CS2103T-W11-3/tp.git (master) does not contain a standalone config file. -Mar 08, 2024 4:11:25 AM reposense.authorship.FileInfoExtractor extractTextFileInfos -INFO: Extracting relevant file info from https://github.com/AY2324S2-CS2103T-W11-3/tp.git (master)... -Mar 08, 2024 4:11:26 AM reposense.commits.CommitInfoExtractor extractCommitInfos -INFO: Extracting commits info for https://github.com/AY2324S2-CS2103T-W11-3/tp.git (master)... -Mar 08, 2024 4:11:26 AM reposense.report.RepoCloner waitForCloneProcess -INFO: Cloning of https://github.com/AY2324S2-CS2103T-T09-3/tp.git completed! -Mar 08, 2024 4:11:26 AM reposense.report.RepoCloner waitForCloneProcess -INFO: Cloning of https://github.com/AY2324S2-CS2103-F08-2/tp.git completed! -Mar 08, 2024 4:11:26 AM reposense.commits.CommitInfoAnalyzer analyzeCommits -INFO: Analyzing commits info for https://github.com/AY2324S2-CS2103T-W11-3/tp.git (master)... -Mar 08, 2024 4:11:26 AM reposense.report.ReportGenerator analyzeRepo -INFO: Analysis of https://github.com/AY2324S2-CS2103T-W11-3/tp.git (master) completed! -Mar 08, 2024 4:11:26 AM reposense.report.ReportGenerator analyzeRepos -INFO: [40/92] Analyzing https://github.com/AY2324S2-CS2103-F08-2/tp.git (master)... -Mar 08, 2024 4:11:26 AM reposense.report.RepoCloner spawnCloneProcess +Mar 08, 2024 9:41:50 AM reposense.commits.CommitInfoExtractor extractCommitInfos +INFO: Extracting commits info for https://github.com/AY2324S2-CS2103T-T12-4/tp.git (master)... +Mar 08, 2024 9:41:50 AM reposense.report.RepoCloner waitForCloneProcess +INFO: Cloning of https://github.com/AY2324S2-CS2103T-W11-1/tp.git completed! +Mar 08, 2024 9:41:50 AM reposense.report.ReportGenerator analyzeRepos +INFO: [40/92] Analyzing https://github.com/AY2324S2-CS2103T-W11-1/tp.git (master)... +Mar 08, 2024 9:41:50 AM reposense.report.RepoCloner spawnCloneProcess INFO: Cloning in parallel from https://github.com/AY2324S2-CS2103T-T12-2/tp.git... -Mar 08, 2024 4:11:26 AM reposense.report.ReportGenerator analyzeRepos -INFO: [41/92] Analyzing https://github.com/AY2324S2-CS2103T-T09-3/tp.git (master)... -Mar 08, 2024 4:11:26 AM reposense.report.RepoCloner spawnCloneProcess -INFO: Cloning in parallel from https://github.com/AY2324S2-CS2103T-F14-3/tp.git... -Mar 08, 2024 4:11:26 AM reposense.report.RepoCloner waitForCloneProcess +Mar 08, 2024 9:41:50 AM reposense.report.RepoCloner waitForCloneProcess INFO: Waiting for cloning of https://github.com/AY2324S2-CS2103T-T12-2/tp.git to complete... -Mar 08, 2024 4:11:26 AM reposense.report.RepoCloner waitForCloneProcess -INFO: Waiting for cloning of https://github.com/AY2324S2-CS2103T-F14-3/tp.git to complete... -Mar 08, 2024 4:11:26 AM reposense.report.ReportGenerator updateRepoConfig -INFO: https://github.com/AY2324S2-CS2103-F08-2/tp.git (master) does not contain a standalone config file. -Mar 08, 2024 4:11:26 AM reposense.authorship.FileInfoExtractor extractTextFileInfos -INFO: Extracting relevant file info from https://github.com/AY2324S2-CS2103-F08-2/tp.git (master)... -Mar 08, 2024 4:11:26 AM reposense.report.ReportGenerator updateRepoConfig +Mar 08, 2024 9:41:50 AM reposense.report.ReportGenerator updateRepoConfig INFO: https://github.com/AY2324S2-CS2103T-T09-3/tp.git (master) does not contain a standalone config file. -Mar 08, 2024 4:11:26 AM reposense.authorship.FileInfoExtractor extractTextFileInfos +Mar 08, 2024 9:41:50 AM reposense.authorship.FileInfoExtractor extractTextFileInfos INFO: Extracting relevant file info from https://github.com/AY2324S2-CS2103T-T09-3/tp.git (master)... -Mar 08, 2024 4:11:27 AM reposense.commits.CommitInfoExtractor extractCommitInfos +Mar 08, 2024 9:41:50 AM reposense.report.ReportGenerator updateRepoConfig +INFO: https://github.com/AY2324S2-CS2103-F08-2/tp.git (master) does not contain a standalone config file. +Mar 08, 2024 9:41:50 AM reposense.authorship.FileInfoExtractor extractTextFileInfos +INFO: Extracting relevant file info from https://github.com/AY2324S2-CS2103-F08-2/tp.git (master)... +Mar 08, 2024 9:41:50 AM reposense.report.ReportGenerator updateRepoConfig +INFO: https://github.com/AY2324S2-CS2103T-W11-1/tp.git (master) does not contain a standalone config file. +Mar 08, 2024 9:41:50 AM reposense.authorship.FileInfoExtractor extractTextFileInfos +INFO: Extracting relevant file info from https://github.com/AY2324S2-CS2103T-W11-1/tp.git (master)... +Mar 08, 2024 9:41:50 AM reposense.commits.CommitInfoAnalyzer analyzeCommits +INFO: Analyzing commits info for https://github.com/AY2324S2-CS2103T-T12-4/tp.git (master)... +Mar 08, 2024 9:41:50 AM reposense.report.ReportGenerator analyzeRepo +INFO: Analysis of https://github.com/AY2324S2-CS2103T-T12-4/tp.git (master) completed! +Mar 08, 2024 9:41:50 AM reposense.report.RepoCloner waitForCloneProcess +INFO: Cloning of https://github.com/AY2324S2-CS2103T-W11-3/tp.git completed! +Mar 08, 2024 9:41:50 AM reposense.report.ReportGenerator analyzeRepos +INFO: [41/92] Analyzing https://github.com/AY2324S2-CS2103T-W11-3/tp.git (master)... +Mar 08, 2024 9:41:50 AM reposense.report.RepoCloner spawnCloneProcess +INFO: Cloning in parallel from https://github.com/AY2324S2-CS2103T-F14-3/tp.git... +Mar 08, 2024 9:41:51 AM reposense.report.RepoCloner waitForCloneProcess +INFO: Waiting for cloning of https://github.com/AY2324S2-CS2103T-F14-3/tp.git to complete... +Mar 08, 2024 9:41:51 AM reposense.report.ReportGenerator updateRepoConfig +INFO: https://github.com/AY2324S2-CS2103T-W11-3/tp.git (master) does not contain a standalone config file. +Mar 08, 2024 9:41:51 AM reposense.authorship.FileInfoExtractor extractTextFileInfos +INFO: Extracting relevant file info from https://github.com/AY2324S2-CS2103T-W11-3/tp.git (master)... +Mar 08, 2024 9:41:51 AM reposense.commits.CommitInfoExtractor extractCommitInfos INFO: Extracting commits info for https://github.com/AY2324S2-CS2103-F08-2/tp.git (master)... -Mar 08, 2024 4:11:27 AM reposense.report.RepoCloner waitForCloneProcess +Mar 08, 2024 9:41:51 AM reposense.commits.CommitInfoAnalyzer analyzeCommits +INFO: Analyzing commits info for https://github.com/AY2324S2-CS2103-F08-2/tp.git (master)... +Mar 08, 2024 9:41:51 AM reposense.report.ReportGenerator analyzeRepo +INFO: Analysis of https://github.com/AY2324S2-CS2103-F08-2/tp.git (master) completed! +Mar 08, 2024 9:41:51 AM reposense.report.RepoCloner waitForCloneProcess INFO: Cloning of https://github.com/AY2324S2-CS2103T-W09-3/tp.git completed! -Mar 08, 2024 4:11:27 AM reposense.report.ReportGenerator analyzeRepos -INFO: [42/92] Analyzing https://github.com/AY2324S2-CS2103T-W09-3/tp.git (master)... -Mar 08, 2024 4:11:27 AM reposense.report.RepoCloner spawnCloneProcess +Mar 08, 2024 9:41:51 AM reposense.report.RepoCloner spawnCloneProcess INFO: Cloning in parallel from https://github.com/AY2324S2-CS2103T-W09-1/tp.git... -Mar 08, 2024 4:11:27 AM reposense.report.RepoCloner waitForCloneProcess -INFO: Cloning of https://github.com/AY2324S2-CS2103T-F14-1/tp.git completed! -Mar 08, 2024 4:11:27 AM reposense.report.RepoCloner waitForCloneProcess +Mar 08, 2024 9:41:51 AM reposense.report.ReportGenerator analyzeRepos +INFO: [42/92] Analyzing https://github.com/AY2324S2-CS2103T-W09-3/tp.git (master)... +Mar 08, 2024 9:41:51 AM reposense.report.RepoCloner waitForCloneProcess INFO: Waiting for cloning of https://github.com/AY2324S2-CS2103T-W09-1/tp.git to complete... -Mar 08, 2024 4:11:27 AM reposense.commits.CommitInfoExtractor extractCommitInfos -INFO: Extracting commits info for https://github.com/AY2324S2-CS2103T-W11-1/tp.git (master)... -Mar 08, 2024 4:11:27 AM reposense.report.RepoCloner spawnCloneProcess -INFO: Cloning in parallel from https://github.com/AY2324S2-CS2103T-T17-4/tp.git... -Mar 08, 2024 4:11:27 AM reposense.report.RepoCloner waitForCloneProcess -INFO: Waiting for cloning of https://github.com/AY2324S2-CS2103T-T17-4/tp.git to complete... -Mar 08, 2024 4:11:27 AM reposense.report.ReportGenerator updateRepoConfig +Mar 08, 2024 9:41:51 AM reposense.report.ReportGenerator updateRepoConfig INFO: https://github.com/AY2324S2-CS2103T-W09-3/tp.git (master) does not contain a standalone config file. -Mar 08, 2024 4:11:27 AM reposense.authorship.FileInfoExtractor extractTextFileInfos +Mar 08, 2024 9:41:51 AM reposense.authorship.FileInfoExtractor extractTextFileInfos INFO: Extracting relevant file info from https://github.com/AY2324S2-CS2103T-W09-3/tp.git (master)... -Mar 08, 2024 4:11:27 AM reposense.commits.CommitInfoAnalyzer analyzeCommits -INFO: Analyzing commits info for https://github.com/AY2324S2-CS2103-F08-2/tp.git (master)... -Mar 08, 2024 4:11:27 AM reposense.report.ReportGenerator analyzeRepo -INFO: Analysis of https://github.com/AY2324S2-CS2103-F08-2/tp.git (master) completed! -Mar 08, 2024 4:11:27 AM reposense.report.ReportGenerator analyzeRepos +Mar 08, 2024 9:41:51 AM reposense.commits.CommitInfoExtractor extractCommitInfos +INFO: Extracting commits info for https://github.com/AY2324S2-CS2103T-W11-3/tp.git (master)... +Mar 08, 2024 9:41:52 AM reposense.commits.CommitInfoAnalyzer analyzeCommits +INFO: Analyzing commits info for https://github.com/AY2324S2-CS2103T-W11-3/tp.git (master)... +Mar 08, 2024 9:41:52 AM reposense.report.ReportGenerator analyzeRepo +INFO: Analysis of https://github.com/AY2324S2-CS2103T-W11-3/tp.git (master) completed! +Mar 08, 2024 9:41:52 AM reposense.report.RepoCloner waitForCloneProcess +INFO: Cloning of https://github.com/AY2324S2-CS2103T-F14-1/tp.git completed! +Mar 08, 2024 9:41:52 AM reposense.report.ReportGenerator analyzeRepos INFO: [43/92] Analyzing https://github.com/AY2324S2-CS2103T-F14-1/tp.git (master)... -Mar 08, 2024 4:11:27 AM reposense.commits.CommitInfoAnalyzer analyzeCommits -INFO: Analyzing commits info for https://github.com/AY2324S2-CS2103T-W11-1/tp.git (master)... -Mar 08, 2024 4:11:27 AM reposense.report.ReportGenerator analyzeRepo -INFO: Analysis of https://github.com/AY2324S2-CS2103T-W11-1/tp.git (master) completed! -Mar 08, 2024 4:11:27 AM reposense.report.ReportGenerator updateRepoConfig +Mar 08, 2024 9:41:52 AM reposense.report.RepoCloner spawnCloneProcess +INFO: Cloning in parallel from https://github.com/AY2324S2-CS2103T-T17-4/tp.git... +Mar 08, 2024 9:41:52 AM reposense.report.RepoCloner waitForCloneProcess +INFO: Waiting for cloning of https://github.com/AY2324S2-CS2103T-T17-4/tp.git to complete... +Mar 08, 2024 9:41:52 AM reposense.report.ReportGenerator updateRepoConfig INFO: https://github.com/AY2324S2-CS2103T-F14-1/tp.git (master) does not contain a standalone config file. -Mar 08, 2024 4:11:27 AM reposense.authorship.FileInfoExtractor extractTextFileInfos +Mar 08, 2024 9:41:52 AM reposense.authorship.FileInfoExtractor extractTextFileInfos INFO: Extracting relevant file info from https://github.com/AY2324S2-CS2103T-F14-1/tp.git (master)... -Mar 08, 2024 4:11:27 AM reposense.report.RepoCloner waitForCloneProcess +Mar 08, 2024 9:41:52 AM reposense.commits.CommitInfoExtractor extractCommitInfos +INFO: Extracting commits info for https://github.com/AY2324S2-CS2103T-W09-3/tp.git (master)... +Mar 08, 2024 9:41:52 AM reposense.report.RepoCloner waitForCloneProcess INFO: Cloning of https://github.com/AY2324S2-CS2103T-T12-2/tp.git completed! -Mar 08, 2024 4:11:27 AM reposense.report.ReportGenerator analyzeRepos -INFO: [44/92] Analyzing https://github.com/AY2324S2-CS2103T-T12-2/tp.git (master)... -Mar 08, 2024 4:11:27 AM reposense.report.RepoCloner spawnCloneProcess +Mar 08, 2024 9:41:52 AM reposense.report.RepoCloner spawnCloneProcess INFO: Cloning in parallel from https://github.com/AY2324S2-CS2103T-T11-2/tp.git... -Mar 08, 2024 4:11:27 AM reposense.report.RepoCloner waitForCloneProcess +Mar 08, 2024 9:41:52 AM reposense.report.RepoCloner waitForCloneProcess INFO: Waiting for cloning of https://github.com/AY2324S2-CS2103T-T11-2/tp.git to complete... -Mar 08, 2024 4:11:28 AM reposense.commits.CommitInfoExtractor extractCommitInfos -INFO: Extracting commits info for https://github.com/AY2324S2-CS2103T-T09-3/tp.git (master)... -Mar 08, 2024 4:11:28 AM reposense.commits.CommitInfoExtractor extractCommitInfos -INFO: Extracting commits info for https://github.com/AY2324S2-CS2103T-W09-3/tp.git (master)... -Mar 08, 2024 4:11:28 AM reposense.report.ReportGenerator updateRepoConfig -INFO: https://github.com/AY2324S2-CS2103T-T12-2/tp.git (master) does not contain a standalone config file. -Mar 08, 2024 4:11:28 AM reposense.authorship.FileInfoExtractor extractTextFileInfos -INFO: Extracting relevant file info from https://github.com/AY2324S2-CS2103T-T12-2/tp.git (master)... -Mar 08, 2024 4:11:28 AM reposense.commits.CommitInfoAnalyzer analyzeCommits +Mar 08, 2024 9:41:52 AM reposense.commits.CommitInfoAnalyzer analyzeCommits INFO: Analyzing commits info for https://github.com/AY2324S2-CS2103T-W09-3/tp.git (master)... -Mar 08, 2024 4:11:28 AM reposense.report.ReportGenerator analyzeRepo +Mar 08, 2024 9:41:52 AM reposense.report.ReportGenerator analyzeRepo INFO: Analysis of https://github.com/AY2324S2-CS2103T-W09-3/tp.git (master) completed! -Mar 08, 2024 4:11:28 AM reposense.commits.CommitInfoAnalyzer analyzeCommits -INFO: Analyzing commits info for https://github.com/AY2324S2-CS2103T-T09-3/tp.git (master)... -Mar 08, 2024 4:11:28 AM reposense.report.ReportGenerator analyzeRepo -INFO: Analysis of https://github.com/AY2324S2-CS2103T-T09-3/tp.git (master) completed! -Mar 08, 2024 4:11:28 AM reposense.report.RepoCloner waitForCloneProcess +Mar 08, 2024 9:41:52 AM reposense.report.ReportGenerator analyzeRepos +INFO: [44/92] Analyzing https://github.com/AY2324S2-CS2103T-T12-2/tp.git (master)... +Mar 08, 2024 9:41:52 AM reposense.report.ReportGenerator updateRepoConfig +INFO: https://github.com/AY2324S2-CS2103T-T12-2/tp.git (master) does not contain a standalone config file. +Mar 08, 2024 9:41:52 AM reposense.authorship.FileInfoExtractor extractTextFileInfos +INFO: Extracting relevant file info from https://github.com/AY2324S2-CS2103T-T12-2/tp.git (master)... +Mar 08, 2024 9:41:53 AM reposense.report.RepoCloner waitForCloneProcess INFO: Cloning of https://github.com/AY2324S2-CS2103T-W09-1/tp.git completed! -Mar 08, 2024 4:11:28 AM reposense.report.ReportGenerator analyzeRepos -INFO: [45/92] Analyzing https://github.com/AY2324S2-CS2103T-W09-1/tp.git (master)... -Mar 08, 2024 4:11:28 AM reposense.report.RepoCloner spawnCloneProcess +Mar 08, 2024 9:41:53 AM reposense.commits.CommitInfoExtractor extractCommitInfos +INFO: Extracting commits info for https://github.com/AY2324S2-CS2103T-T09-3/tp.git (master)... +Mar 08, 2024 9:41:53 AM reposense.report.RepoCloner spawnCloneProcess INFO: Cloning in parallel from https://github.com/AY2324S2-CS2103T-T11-4/tp.git... -Mar 08, 2024 4:11:28 AM reposense.report.RepoCloner waitForCloneProcess -INFO: Cloning of https://github.com/AY2324S2-CS2103T-F14-3/tp.git completed! -Mar 08, 2024 4:11:28 AM reposense.report.RepoCloner waitForCloneProcess +Mar 08, 2024 9:41:53 AM reposense.commits.CommitInfoExtractor extractCommitInfos +INFO: Extracting commits info for https://github.com/AY2324S2-CS2103T-W11-1/tp.git (master)... +Mar 08, 2024 9:41:53 AM reposense.report.RepoCloner waitForCloneProcess INFO: Waiting for cloning of https://github.com/AY2324S2-CS2103T-T11-4/tp.git to complete... -Mar 08, 2024 4:11:28 AM reposense.report.RepoCloner spawnCloneProcess +Mar 08, 2024 9:41:53 AM reposense.commits.CommitInfoAnalyzer analyzeCommits +INFO: Analyzing commits info for https://github.com/AY2324S2-CS2103T-W11-1/tp.git (master)... +Mar 08, 2024 9:41:53 AM reposense.report.ReportGenerator analyzeRepo +INFO: Analysis of https://github.com/AY2324S2-CS2103T-W11-1/tp.git (master) completed! +Mar 08, 2024 9:41:53 AM reposense.report.ReportGenerator analyzeRepos +INFO: [45/92] Analyzing https://github.com/AY2324S2-CS2103T-W09-1/tp.git (master)... +Mar 08, 2024 9:41:53 AM reposense.report.RepoCloner waitForCloneProcess +INFO: Cloning of https://github.com/AY2324S2-CS2103T-T17-4/tp.git completed! +Mar 08, 2024 9:41:53 AM reposense.report.RepoCloner spawnCloneProcess INFO: Cloning in parallel from https://github.com/AY2324S2-CS2103T-T17-2/tp.git... -Mar 08, 2024 4:11:28 AM reposense.report.ReportGenerator analyzeRepos -INFO: [46/92] Analyzing https://github.com/AY2324S2-CS2103T-F14-3/tp.git (master)... -Mar 08, 2024 4:11:28 AM reposense.report.RepoCloner waitForCloneProcess +Mar 08, 2024 9:41:53 AM reposense.report.RepoCloner waitForCloneProcess INFO: Waiting for cloning of https://github.com/AY2324S2-CS2103T-T17-2/tp.git to complete... -Mar 08, 2024 4:11:28 AM reposense.report.ReportGenerator updateRepoConfig +Mar 08, 2024 9:41:53 AM reposense.report.RepoCloner waitForCloneProcess +INFO: Cloning of https://github.com/AY2324S2-CS2103T-F14-3/tp.git completed! +Mar 08, 2024 9:41:53 AM reposense.report.ReportGenerator updateRepoConfig INFO: https://github.com/AY2324S2-CS2103T-W09-1/tp.git (master) does not contain a standalone config file. -Mar 08, 2024 4:11:28 AM reposense.authorship.FileInfoExtractor extractTextFileInfos +Mar 08, 2024 9:41:53 AM reposense.authorship.FileInfoExtractor extractTextFileInfos INFO: Extracting relevant file info from https://github.com/AY2324S2-CS2103T-W09-1/tp.git (master)... -Mar 08, 2024 4:11:28 AM reposense.report.RepoCloner waitForCloneProcess -INFO: Cloning of https://github.com/AY2324S2-CS2103T-T17-4/tp.git completed! -Mar 08, 2024 4:11:28 AM reposense.report.RepoCloner spawnCloneProcess +Mar 08, 2024 9:41:53 AM reposense.report.RepoCloner spawnCloneProcess INFO: Cloning in parallel from https://github.com/AY2324S2-CS2103T-T08-3/tp.git... -Mar 08, 2024 4:11:28 AM reposense.report.RepoCloner waitForCloneProcess +Mar 08, 2024 9:41:53 AM reposense.report.RepoCloner waitForCloneProcess INFO: Waiting for cloning of https://github.com/AY2324S2-CS2103T-T08-3/tp.git to complete... -Mar 08, 2024 4:11:28 AM reposense.report.ReportGenerator updateRepoConfig -INFO: https://github.com/AY2324S2-CS2103T-F14-3/tp.git (master) does not contain a standalone config file. -Mar 08, 2024 4:11:28 AM reposense.authorship.FileInfoExtractor extractTextFileInfos -INFO: Extracting relevant file info from https://github.com/AY2324S2-CS2103T-F14-3/tp.git (master)... -Mar 08, 2024 4:11:29 AM reposense.report.RepoCloner waitForCloneProcess +Mar 08, 2024 9:41:53 AM reposense.commits.CommitInfoAnalyzer analyzeCommits +INFO: Analyzing commits info for https://github.com/AY2324S2-CS2103T-T09-3/tp.git (master)... +Mar 08, 2024 9:41:53 AM reposense.report.ReportGenerator analyzeRepo +INFO: Analysis of https://github.com/AY2324S2-CS2103T-T09-3/tp.git (master) completed! +Mar 08, 2024 9:41:53 AM reposense.report.ReportGenerator analyzeRepos +INFO: [46/92] Analyzing https://github.com/AY2324S2-CS2103T-T17-4/tp.git (master)... +Mar 08, 2024 9:41:53 AM reposense.report.RepoCloner waitForCloneProcess INFO: Cloning of https://github.com/AY2324S2-CS2103T-T11-2/tp.git completed! -Mar 08, 2024 4:11:29 AM reposense.report.RepoCloner spawnCloneProcess +Mar 08, 2024 9:41:53 AM reposense.report.RepoCloner spawnCloneProcess INFO: Cloning in parallel from https://github.com/AY2324S2-CS2103T-T08-1/tp.git... -Mar 08, 2024 4:11:29 AM reposense.report.RepoCloner waitForCloneProcess +Mar 08, 2024 9:41:53 AM reposense.report.ReportGenerator updateRepoConfig +INFO: https://github.com/AY2324S2-CS2103T-T17-4/tp.git (master) does not contain a standalone config file. +Mar 08, 2024 9:41:53 AM reposense.authorship.FileInfoExtractor extractTextFileInfos +INFO: Extracting relevant file info from https://github.com/AY2324S2-CS2103T-T17-4/tp.git (master)... +Mar 08, 2024 9:41:53 AM reposense.report.RepoCloner waitForCloneProcess INFO: Waiting for cloning of https://github.com/AY2324S2-CS2103T-T08-1/tp.git to complete... -Mar 08, 2024 4:11:29 AM reposense.commits.CommitInfoExtractor extractCommitInfos +Mar 08, 2024 9:41:54 AM reposense.commits.CommitInfoExtractor extractCommitInfos INFO: Extracting commits info for https://github.com/AY2324S2-CS2103T-T12-2/tp.git (master)... -Mar 08, 2024 4:11:29 AM reposense.commits.CommitInfoExtractor extractCommitInfos +Mar 08, 2024 9:41:54 AM reposense.commits.CommitInfoExtractor extractCommitInfos INFO: Extracting commits info for https://github.com/AY2324S2-CS2103T-W09-1/tp.git (master)... -Mar 08, 2024 4:11:29 AM reposense.commits.CommitInfoAnalyzer analyzeCommits +Mar 08, 2024 9:41:54 AM reposense.commits.CommitInfoExtractor extractCommitInfos +INFO: Extracting commits info for https://github.com/AY2324S2-CS2103T-T17-4/tp.git (master)... +Mar 08, 2024 9:41:54 AM reposense.commits.CommitInfoAnalyzer analyzeCommits INFO: Analyzing commits info for https://github.com/AY2324S2-CS2103T-T12-2/tp.git (master)... -Mar 08, 2024 4:11:29 AM reposense.report.ReportGenerator analyzeRepo +Mar 08, 2024 9:41:54 AM reposense.report.ReportGenerator analyzeRepo INFO: Analysis of https://github.com/AY2324S2-CS2103T-T12-2/tp.git (master) completed! -Mar 08, 2024 4:11:29 AM reposense.report.ReportGenerator analyzeRepos -INFO: [47/92] Analyzing https://github.com/AY2324S2-CS2103T-T17-4/tp.git (master)... -Mar 08, 2024 4:11:29 AM reposense.commits.CommitInfoAnalyzer analyzeCommits +Mar 08, 2024 9:41:54 AM reposense.commits.CommitInfoAnalyzer analyzeCommits INFO: Analyzing commits info for https://github.com/AY2324S2-CS2103T-W09-1/tp.git (master)... -Mar 08, 2024 4:11:29 AM reposense.report.ReportGenerator analyzeRepo +Mar 08, 2024 9:41:54 AM reposense.report.ReportGenerator analyzeRepo INFO: Analysis of https://github.com/AY2324S2-CS2103T-W09-1/tp.git (master) completed! -Mar 08, 2024 4:11:29 AM reposense.report.ReportGenerator analyzeRepos +Mar 08, 2024 9:41:54 AM reposense.report.ReportGenerator analyzeRepos +INFO: [47/92] Analyzing https://github.com/AY2324S2-CS2103T-F14-3/tp.git (master)... +Mar 08, 2024 9:41:54 AM reposense.report.RepoCloner waitForCloneProcess +INFO: Cloning of https://github.com/AY2324S2-CS2103T-T11-4/tp.git completed! +Mar 08, 2024 9:41:54 AM reposense.report.ReportGenerator analyzeRepos INFO: [48/92] Analyzing https://github.com/AY2324S2-CS2103T-T11-2/tp.git (master)... -Mar 08, 2024 4:11:29 AM reposense.report.ReportGenerator updateRepoConfig -INFO: https://github.com/AY2324S2-CS2103T-T17-4/tp.git (master) does not contain a standalone config file. -Mar 08, 2024 4:11:29 AM reposense.authorship.FileInfoExtractor extractTextFileInfos -INFO: Extracting relevant file info from https://github.com/AY2324S2-CS2103T-T17-4/tp.git (master)... -Mar 08, 2024 4:11:29 AM reposense.report.ReportGenerator updateRepoConfig +Mar 08, 2024 9:41:54 AM reposense.report.RepoCloner spawnCloneProcess +INFO: Cloning in parallel from https://github.com/AY2324S2-CS2103T-F12-4/tp.git... +Mar 08, 2024 9:41:54 AM reposense.report.RepoCloner waitForCloneProcess +INFO: Waiting for cloning of https://github.com/AY2324S2-CS2103T-F12-4/tp.git to complete... +Mar 08, 2024 9:41:54 AM reposense.report.ReportGenerator updateRepoConfig +INFO: https://github.com/AY2324S2-CS2103T-F14-3/tp.git (master) does not contain a standalone config file. +Mar 08, 2024 9:41:54 AM reposense.authorship.FileInfoExtractor extractTextFileInfos +INFO: Extracting relevant file info from https://github.com/AY2324S2-CS2103T-F14-3/tp.git (master)... +Mar 08, 2024 9:41:54 AM reposense.report.ReportGenerator updateRepoConfig INFO: https://github.com/AY2324S2-CS2103T-T11-2/tp.git (master) does not contain a standalone config file. -Mar 08, 2024 4:11:29 AM reposense.authorship.FileInfoExtractor extractTextFileInfos +Mar 08, 2024 9:41:54 AM reposense.authorship.FileInfoExtractor extractTextFileInfos INFO: Extracting relevant file info from https://github.com/AY2324S2-CS2103T-T11-2/tp.git (master)... -Mar 08, 2024 4:11:29 AM reposense.commits.CommitInfoExtractor extractCommitInfos -INFO: Extracting commits info for https://github.com/AY2324S2-CS2103T-F14-3/tp.git (master)... -Mar 08, 2024 4:11:30 AM reposense.report.RepoCloner waitForCloneProcess +Mar 08, 2024 9:41:54 AM reposense.commits.CommitInfoAnalyzer analyzeCommits +INFO: Analyzing commits info for https://github.com/AY2324S2-CS2103T-T17-4/tp.git (master)... +Mar 08, 2024 9:41:54 AM reposense.report.ReportGenerator analyzeRepo +INFO: Analysis of https://github.com/AY2324S2-CS2103T-T17-4/tp.git (master) completed! +Mar 08, 2024 9:41:54 AM reposense.report.ReportGenerator analyzeRepos +INFO: [49/92] Analyzing https://github.com/AY2324S2-CS2103T-T11-4/tp.git (master)... +Mar 08, 2024 9:41:54 AM reposense.report.ReportGenerator updateRepoConfig +INFO: https://github.com/AY2324S2-CS2103T-T11-4/tp.git (master) does not contain a standalone config file. +Mar 08, 2024 9:41:54 AM reposense.authorship.FileInfoExtractor extractTextFileInfos +INFO: Extracting relevant file info from https://github.com/AY2324S2-CS2103T-T11-4/tp.git (master)... +Mar 08, 2024 9:41:55 AM reposense.report.RepoCloner waitForCloneProcess INFO: Cloning of https://github.com/AY2324S2-CS2103T-T08-3/tp.git completed! -Mar 08, 2024 4:11:30 AM reposense.report.RepoCloner spawnCloneProcess -INFO: Cloning in parallel from https://github.com/AY2324S2-CS2103T-F12-4/tp.git... -Mar 08, 2024 4:11:30 AM reposense.commits.CommitInfoExtractor extractCommitInfos -INFO: Extracting commits info for https://github.com/AY2324S2-CS2103T-T11-2/tp.git (master)... -Mar 08, 2024 4:11:30 AM reposense.commits.CommitInfoExtractor extractCommitInfos -INFO: Extracting commits info for https://github.com/AY2324S2-CS2103T-T17-4/tp.git (master)... -Mar 08, 2024 4:11:30 AM reposense.commits.CommitInfoAnalyzer analyzeCommits -INFO: Analyzing commits info for https://github.com/AY2324S2-CS2103T-F14-3/tp.git (master)... -Mar 08, 2024 4:11:30 AM reposense.report.ReportGenerator analyzeRepo -INFO: Analysis of https://github.com/AY2324S2-CS2103T-F14-3/tp.git (master) completed! -Mar 08, 2024 4:11:30 AM reposense.report.RepoCloner waitForCloneProcess -INFO: Waiting for cloning of https://github.com/AY2324S2-CS2103T-F12-4/tp.git to complete... -Mar 08, 2024 4:11:30 AM reposense.report.ReportGenerator analyzeRepos -INFO: [49/92] Analyzing https://github.com/AY2324S2-CS2103T-T08-3/tp.git (master)... -Mar 08, 2024 4:11:30 AM reposense.report.RepoCloner waitForCloneProcess -INFO: Cloning of https://github.com/AY2324S2-CS2103T-T11-4/tp.git completed! -Mar 08, 2024 4:11:30 AM reposense.report.RepoCloner spawnCloneProcess +Mar 08, 2024 9:41:55 AM reposense.report.RepoCloner spawnCloneProcess INFO: Cloning in parallel from https://github.com/AY2324S2-CS2103T-T14-1/tp.git... -Mar 08, 2024 4:11:30 AM reposense.commits.CommitInfoAnalyzer analyzeCommits -INFO: Analyzing commits info for https://github.com/AY2324S2-CS2103T-T11-2/tp.git (master)... -Mar 08, 2024 4:11:30 AM reposense.report.RepoCloner waitForCloneProcess -INFO: Cloning of https://github.com/AY2324S2-CS2103T-T08-1/tp.git completed! -Mar 08, 2024 4:11:30 AM reposense.report.ReportGenerator analyzeRepo -INFO: Analysis of https://github.com/AY2324S2-CS2103T-T11-2/tp.git (master) completed! -Mar 08, 2024 4:11:30 AM reposense.report.RepoCloner waitForCloneProcess +Mar 08, 2024 9:41:55 AM reposense.report.RepoCloner waitForCloneProcess INFO: Waiting for cloning of https://github.com/AY2324S2-CS2103T-T14-1/tp.git to complete... -Mar 08, 2024 4:11:30 AM reposense.report.RepoCloner spawnCloneProcess +Mar 08, 2024 9:41:55 AM reposense.report.RepoCloner waitForCloneProcess +INFO: Cloning of https://github.com/AY2324S2-CS2103T-T08-1/tp.git completed! +Mar 08, 2024 9:41:55 AM reposense.report.RepoCloner spawnCloneProcess INFO: Cloning in parallel from https://github.com/AY2324S2-CS2103T-F12-2/tp.git... -Mar 08, 2024 4:11:30 AM reposense.commits.CommitInfoAnalyzer analyzeCommits -INFO: Analyzing commits info for https://github.com/AY2324S2-CS2103T-T17-4/tp.git (master)... -Mar 08, 2024 4:11:30 AM reposense.report.ReportGenerator analyzeRepo -INFO: Analysis of https://github.com/AY2324S2-CS2103T-T17-4/tp.git (master) completed! -Mar 08, 2024 4:11:30 AM reposense.report.ReportGenerator updateRepoConfig +Mar 08, 2024 9:41:55 AM reposense.report.RepoCloner waitForCloneProcess +INFO: Waiting for cloning of https://github.com/AY2324S2-CS2103T-F12-2/tp.git to complete... +Mar 08, 2024 9:41:55 AM reposense.report.RepoCloner waitForCloneProcess +INFO: Cloning of https://github.com/AY2324S2-CS2103T-T17-2/tp.git completed! +Mar 08, 2024 9:41:55 AM reposense.commits.CommitInfoExtractor extractCommitInfos +INFO: Extracting commits info for https://github.com/AY2324S2-CS2103T-T11-2/tp.git (master)... +Mar 08, 2024 9:41:55 AM reposense.report.RepoCloner spawnCloneProcess +INFO: Cloning in parallel from https://github.com/AY2324S2-CS2103T-W08-4/tp.git... +Mar 08, 2024 9:41:55 AM reposense.report.RepoCloner waitForCloneProcess +INFO: Waiting for cloning of https://github.com/AY2324S2-CS2103T-W08-4/tp.git to complete... +Mar 08, 2024 9:41:55 AM reposense.commits.CommitInfoAnalyzer analyzeCommits +INFO: Analyzing commits info for https://github.com/AY2324S2-CS2103T-T11-2/tp.git (master)... +Mar 08, 2024 9:41:55 AM reposense.report.ReportGenerator analyzeRepo +INFO: Analysis of https://github.com/AY2324S2-CS2103T-T11-2/tp.git (master) completed! +Mar 08, 2024 9:41:55 AM reposense.commits.CommitInfoExtractor extractCommitInfos +INFO: Extracting commits info for https://github.com/AY2324S2-CS2103T-T11-4/tp.git (master)... +Mar 08, 2024 9:41:55 AM reposense.report.ReportGenerator analyzeRepos +INFO: [50/92] Analyzing https://github.com/AY2324S2-CS2103T-T08-3/tp.git (master)... +Mar 08, 2024 9:41:55 AM reposense.report.ReportGenerator updateRepoConfig INFO: https://github.com/AY2324S2-CS2103T-T08-3/tp.git (master) does not contain a standalone config file. -Mar 08, 2024 4:11:30 AM reposense.authorship.FileInfoExtractor extractTextFileInfos +Mar 08, 2024 9:41:55 AM reposense.authorship.FileInfoExtractor extractTextFileInfos INFO: Extracting relevant file info from https://github.com/AY2324S2-CS2103T-T08-3/tp.git (master)... -Mar 08, 2024 4:11:30 AM reposense.report.ReportGenerator analyzeRepos -INFO: [50/92] Analyzing https://github.com/AY2324S2-CS2103T-T11-4/tp.git (master)... -Mar 08, 2024 4:11:30 AM reposense.report.ReportGenerator analyzeRepos +Mar 08, 2024 9:41:55 AM reposense.report.RepoCloner waitForCloneProcess +INFO: Cloning of https://github.com/AY2324S2-CS2103T-F12-4/tp.git completed! +Mar 08, 2024 9:41:55 AM reposense.commits.CommitInfoExtractor extractCommitInfos +INFO: Extracting commits info for https://github.com/AY2324S2-CS2103T-F14-1/tp.git (master)... +Mar 08, 2024 9:41:55 AM reposense.commits.CommitInfoAnalyzer analyzeCommits +INFO: Analyzing commits info for https://github.com/AY2324S2-CS2103T-T11-4/tp.git (master)... +Mar 08, 2024 9:41:55 AM reposense.report.ReportGenerator analyzeRepo +INFO: Analysis of https://github.com/AY2324S2-CS2103T-T11-4/tp.git (master) completed! +Mar 08, 2024 9:41:55 AM reposense.report.RepoCloner spawnCloneProcess +INFO: Cloning in parallel from https://github.com/AY2324S2-CS2103T-W12-2/tp.git... +Mar 08, 2024 9:41:55 AM reposense.report.ReportGenerator analyzeRepos INFO: [51/92] Analyzing https://github.com/AY2324S2-CS2103T-T08-1/tp.git (master)... -Mar 08, 2024 4:11:30 AM reposense.report.RepoCloner waitForCloneProcess -INFO: Waiting for cloning of https://github.com/AY2324S2-CS2103T-F12-2/tp.git to complete... -Mar 08, 2024 4:11:30 AM reposense.report.RepoCloner waitForCloneProcess -INFO: Cloning of https://github.com/AY2324S2-CS2103T-T17-2/tp.git completed! -Mar 08, 2024 4:11:30 AM reposense.report.ReportGenerator updateRepoConfig +Mar 08, 2024 9:41:55 AM reposense.report.RepoCloner waitForCloneProcess +INFO: Waiting for cloning of https://github.com/AY2324S2-CS2103T-W12-2/tp.git to complete... +Mar 08, 2024 9:41:55 AM reposense.commits.CommitInfoExtractor extractCommitInfos +INFO: Extracting commits info for https://github.com/AY2324S2-CS2103T-F14-3/tp.git (master)... +Mar 08, 2024 9:41:56 AM reposense.report.ReportGenerator updateRepoConfig INFO: https://github.com/AY2324S2-CS2103T-T08-1/tp.git (master) does not contain a standalone config file. -Mar 08, 2024 4:11:30 AM reposense.authorship.FileInfoExtractor extractTextFileInfos +Mar 08, 2024 9:41:56 AM reposense.authorship.FileInfoExtractor extractTextFileInfos INFO: Extracting relevant file info from https://github.com/AY2324S2-CS2103T-T08-1/tp.git (master)... -Mar 08, 2024 4:11:30 AM reposense.report.RepoCloner spawnCloneProcess -INFO: Cloning in parallel from https://github.com/AY2324S2-CS2103T-W08-4/tp.git... -Mar 08, 2024 4:11:30 AM reposense.report.ReportGenerator updateRepoConfig -INFO: https://github.com/AY2324S2-CS2103T-T11-4/tp.git (master) does not contain a standalone config file. -Mar 08, 2024 4:11:30 AM reposense.authorship.FileInfoExtractor extractTextFileInfos -INFO: Extracting relevant file info from https://github.com/AY2324S2-CS2103T-T11-4/tp.git (master)... -Mar 08, 2024 4:11:30 AM reposense.report.RepoCloner waitForCloneProcess -INFO: Waiting for cloning of https://github.com/AY2324S2-CS2103T-W08-4/tp.git to complete... -Mar 08, 2024 4:11:30 AM reposense.commits.CommitInfoExtractor extractCommitInfos +Mar 08, 2024 9:41:56 AM reposense.commits.CommitInfoAnalyzer analyzeCommits +INFO: Analyzing commits info for https://github.com/AY2324S2-CS2103T-F14-3/tp.git (master)... +Mar 08, 2024 9:41:56 AM reposense.report.ReportGenerator analyzeRepo +INFO: Analysis of https://github.com/AY2324S2-CS2103T-F14-3/tp.git (master) completed! +Mar 08, 2024 9:41:56 AM reposense.commits.CommitInfoAnalyzer analyzeCommits +INFO: Analyzing commits info for https://github.com/AY2324S2-CS2103T-F14-1/tp.git (master)... +Mar 08, 2024 9:41:56 AM reposense.report.ReportGenerator analyzeRepo +INFO: Analysis of https://github.com/AY2324S2-CS2103T-F14-1/tp.git (master) completed! +Mar 08, 2024 9:41:56 AM reposense.report.ReportGenerator analyzeRepos +INFO: [52/92] Analyzing https://github.com/AY2324S2-CS2103T-T17-2/tp.git (master)... +Mar 08, 2024 9:41:56 AM reposense.report.ReportGenerator analyzeRepos +INFO: [53/92] Analyzing https://github.com/AY2324S2-CS2103T-F12-4/tp.git (master)... +Mar 08, 2024 9:41:56 AM reposense.commits.CommitInfoExtractor extractCommitInfos INFO: Extracting commits info for https://github.com/AY2324S2-CS2103T-T08-3/tp.git (master)... -Mar 08, 2024 4:11:31 AM reposense.commits.CommitInfoExtractor extractCommitInfos +Mar 08, 2024 9:41:56 AM reposense.report.ReportGenerator updateRepoConfig +INFO: https://github.com/AY2324S2-CS2103T-T17-2/tp.git (master) does not contain a standalone config file. +Mar 08, 2024 9:41:56 AM reposense.authorship.FileInfoExtractor extractTextFileInfos +INFO: Extracting relevant file info from https://github.com/AY2324S2-CS2103T-T17-2/tp.git (master)... +Mar 08, 2024 9:41:56 AM reposense.report.ReportGenerator updateRepoConfig +INFO: https://github.com/AY2324S2-CS2103T-F12-4/tp.git (master) does not contain a standalone config file. +Mar 08, 2024 9:41:56 AM reposense.authorship.FileInfoExtractor extractTextFileInfos +INFO: Extracting relevant file info from https://github.com/AY2324S2-CS2103T-F12-4/tp.git (master)... +Mar 08, 2024 9:41:56 AM reposense.commits.CommitInfoExtractor extractCommitInfos INFO: Extracting commits info for https://github.com/AY2324S2-CS2103T-T08-1/tp.git (master)... -Mar 08, 2024 4:11:31 AM reposense.commits.CommitInfoAnalyzer analyzeCommits +Mar 08, 2024 9:41:56 AM reposense.commits.CommitInfoAnalyzer analyzeCommits INFO: Analyzing commits info for https://github.com/AY2324S2-CS2103T-T08-3/tp.git (master)... -Mar 08, 2024 4:11:31 AM reposense.report.ReportGenerator analyzeRepo +Mar 08, 2024 9:41:56 AM reposense.report.ReportGenerator analyzeRepo INFO: Analysis of https://github.com/AY2324S2-CS2103T-T08-3/tp.git (master) completed! -Mar 08, 2024 4:11:31 AM reposense.report.ReportGenerator analyzeRepos -INFO: [52/92] Analyzing https://github.com/AY2324S2-CS2103T-T17-2/tp.git (master)... -Mar 08, 2024 4:11:31 AM reposense.commits.CommitInfoAnalyzer analyzeCommits +Mar 08, 2024 9:41:56 AM reposense.report.RepoCloner waitForCloneProcess +INFO: Cloning of https://github.com/AY2324S2-CS2103T-F12-2/tp.git completed! +Mar 08, 2024 9:41:56 AM reposense.commits.CommitInfoAnalyzer analyzeCommits INFO: Analyzing commits info for https://github.com/AY2324S2-CS2103T-T08-1/tp.git (master)... -Mar 08, 2024 4:11:31 AM reposense.report.ReportGenerator analyzeRepo +Mar 08, 2024 9:41:56 AM reposense.report.ReportGenerator analyzeRepo INFO: Analysis of https://github.com/AY2324S2-CS2103T-T08-1/tp.git (master) completed! -Mar 08, 2024 4:11:31 AM reposense.commits.CommitInfoExtractor extractCommitInfos -INFO: Extracting commits info for https://github.com/AY2324S2-CS2103T-T11-4/tp.git (master)... -Mar 08, 2024 4:11:31 AM reposense.report.ReportGenerator updateRepoConfig -INFO: https://github.com/AY2324S2-CS2103T-T17-2/tp.git (master) does not contain a standalone config file. -Mar 08, 2024 4:11:31 AM reposense.authorship.FileInfoExtractor extractTextFileInfos -INFO: Extracting relevant file info from https://github.com/AY2324S2-CS2103T-T17-2/tp.git (master)... -Mar 08, 2024 4:11:31 AM reposense.commits.CommitInfoExtractor extractCommitInfos -INFO: Extracting commits info for https://github.com/AY2324S2-CS2103T-F14-1/tp.git (master)... -Mar 08, 2024 4:11:31 AM reposense.report.RepoCloner waitForCloneProcess -INFO: Cloning of https://github.com/AY2324S2-CS2103T-F12-4/tp.git completed! -Mar 08, 2024 4:11:31 AM reposense.report.RepoCloner spawnCloneProcess -INFO: Cloning in parallel from https://github.com/AY2324S2-CS2103T-W12-2/tp.git... -Mar 08, 2024 4:11:31 AM reposense.report.ReportGenerator analyzeRepos -INFO: [53/92] Analyzing https://github.com/AY2324S2-CS2103T-F12-4/tp.git (master)... -Mar 08, 2024 4:11:31 AM reposense.report.RepoCloner waitForCloneProcess -INFO: Waiting for cloning of https://github.com/AY2324S2-CS2103T-W12-2/tp.git to complete... -Mar 08, 2024 4:11:31 AM reposense.report.ReportGenerator updateRepoConfig -INFO: https://github.com/AY2324S2-CS2103T-F12-4/tp.git (master) does not contain a standalone config file. -Mar 08, 2024 4:11:31 AM reposense.authorship.FileInfoExtractor extractTextFileInfos -INFO: Extracting relevant file info from https://github.com/AY2324S2-CS2103T-F12-4/tp.git (master)... -Mar 08, 2024 4:11:31 AM reposense.commits.CommitInfoAnalyzer analyzeCommits -INFO: Analyzing commits info for https://github.com/AY2324S2-CS2103T-T11-4/tp.git (master)... -Mar 08, 2024 4:11:31 AM reposense.report.ReportGenerator analyzeRepo -INFO: Analysis of https://github.com/AY2324S2-CS2103T-T11-4/tp.git (master) completed! -Mar 08, 2024 4:11:31 AM reposense.commits.CommitInfoAnalyzer analyzeCommits -INFO: Analyzing commits info for https://github.com/AY2324S2-CS2103T-F14-1/tp.git (master)... -Mar 08, 2024 4:11:31 AM reposense.report.ReportGenerator analyzeRepo -INFO: Analysis of https://github.com/AY2324S2-CS2103T-F14-1/tp.git (master) completed! -Mar 08, 2024 4:11:31 AM reposense.report.RepoCloner waitForCloneProcess -INFO: Cloning of https://github.com/AY2324S2-CS2103T-W08-4/tp.git completed! -Mar 08, 2024 4:11:31 AM reposense.report.ReportGenerator analyzeRepos -INFO: [54/92] Analyzing https://github.com/AY2324S2-CS2103T-W08-4/tp.git (master)... -Mar 08, 2024 4:11:31 AM reposense.report.RepoCloner spawnCloneProcess +Mar 08, 2024 9:41:56 AM reposense.report.ReportGenerator analyzeRepos +INFO: [54/92] Analyzing https://github.com/AY2324S2-CS2103T-F12-2/tp.git (master)... +Mar 08, 2024 9:41:56 AM reposense.report.RepoCloner spawnCloneProcess INFO: Cloning in parallel from https://github.com/AY2324S2-CS2103T-W08-3/tp.git... -Mar 08, 2024 4:11:31 AM reposense.report.RepoCloner waitForCloneProcess -INFO: Cloning of https://github.com/AY2324S2-CS2103T-F12-2/tp.git completed! -Mar 08, 2024 4:11:31 AM reposense.report.RepoCloner waitForCloneProcess +Mar 08, 2024 9:41:56 AM reposense.report.RepoCloner waitForCloneProcess INFO: Waiting for cloning of https://github.com/AY2324S2-CS2103T-W08-3/tp.git to complete... -Mar 08, 2024 4:11:31 AM reposense.report.ReportGenerator analyzeRepos -INFO: [55/92] Analyzing https://github.com/AY2324S2-CS2103T-F12-2/tp.git (master)... -Mar 08, 2024 4:11:31 AM reposense.report.RepoCloner spawnCloneProcess +Mar 08, 2024 9:41:56 AM reposense.report.RepoCloner waitForCloneProcess +INFO: Cloning of https://github.com/AY2324S2-CS2103T-W08-4/tp.git completed! +Mar 08, 2024 9:41:56 AM reposense.report.ReportGenerator updateRepoConfig +INFO: https://github.com/AY2324S2-CS2103T-F12-2/tp.git (master) does not contain a standalone config file. +Mar 08, 2024 9:41:56 AM reposense.authorship.FileInfoExtractor extractTextFileInfos +INFO: Extracting relevant file info from https://github.com/AY2324S2-CS2103T-F12-2/tp.git (master)... +Mar 08, 2024 9:41:56 AM reposense.commits.CommitInfoExtractor extractCommitInfos +INFO: Extracting commits info for https://github.com/AY2324S2-CS2103T-F12-4/tp.git (master)... +Mar 08, 2024 9:41:57 AM reposense.report.ReportGenerator analyzeRepos +INFO: [55/92] Analyzing https://github.com/AY2324S2-CS2103T-W08-4/tp.git (master)... +Mar 08, 2024 9:41:57 AM reposense.report.RepoCloner spawnCloneProcess INFO: Cloning in parallel from https://github.com/AY2324S2-CS2103T-W12-1/tp.git... -Mar 08, 2024 4:11:32 AM reposense.report.RepoCloner waitForCloneProcess +Mar 08, 2024 9:41:57 AM reposense.report.RepoCloner waitForCloneProcess INFO: Waiting for cloning of https://github.com/AY2324S2-CS2103T-W12-1/tp.git to complete... -Mar 08, 2024 4:11:32 AM reposense.commits.CommitInfoExtractor extractCommitInfos -INFO: Extracting commits info for https://github.com/AY2324S2-CS2103T-F12-4/tp.git (master)... -Mar 08, 2024 4:11:32 AM reposense.commits.CommitInfoExtractor extractCommitInfos +Mar 08, 2024 9:41:57 AM reposense.commits.CommitInfoExtractor extractCommitInfos INFO: Extracting commits info for https://github.com/AY2324S2-CS2103T-T17-2/tp.git (master)... -Mar 08, 2024 4:11:32 AM reposense.report.ReportGenerator updateRepoConfig -INFO: https://github.com/AY2324S2-CS2103T-W08-4/tp.git (master) does not contain a standalone config file. -Mar 08, 2024 4:11:32 AM reposense.authorship.FileInfoExtractor extractTextFileInfos -INFO: Extracting relevant file info from https://github.com/AY2324S2-CS2103T-W08-4/tp.git (master)... -Mar 08, 2024 4:11:32 AM reposense.report.ReportGenerator updateRepoConfig -INFO: https://github.com/AY2324S2-CS2103T-F12-2/tp.git (master) does not contain a standalone config file. -Mar 08, 2024 4:11:32 AM reposense.authorship.FileInfoExtractor extractTextFileInfos -INFO: Extracting relevant file info from https://github.com/AY2324S2-CS2103T-F12-2/tp.git (master)... -Mar 08, 2024 4:11:32 AM reposense.commits.CommitInfoAnalyzer analyzeCommits +Mar 08, 2024 9:41:57 AM reposense.commits.CommitInfoAnalyzer analyzeCommits INFO: Analyzing commits info for https://github.com/AY2324S2-CS2103T-F12-4/tp.git (master)... -Mar 08, 2024 4:11:32 AM reposense.report.ReportGenerator analyzeRepo +Mar 08, 2024 9:41:57 AM reposense.report.ReportGenerator analyzeRepo INFO: Analysis of https://github.com/AY2324S2-CS2103T-F12-4/tp.git (master) completed! -Mar 08, 2024 4:11:32 AM reposense.commits.CommitInfoAnalyzer analyzeCommits -INFO: Analyzing commits info for https://github.com/AY2324S2-CS2103T-T17-2/tp.git (master)... -Mar 08, 2024 4:11:32 AM reposense.report.ReportGenerator analyzeRepo -INFO: Analysis of https://github.com/AY2324S2-CS2103T-T17-2/tp.git (master) completed! -Mar 08, 2024 4:11:32 AM reposense.report.RepoCloner waitForCloneProcess +Mar 08, 2024 9:41:57 AM reposense.report.RepoCloner waitForCloneProcess INFO: Cloning of https://github.com/AY2324S2-CS2103T-T14-1/tp.git completed! -Mar 08, 2024 4:11:32 AM reposense.report.ReportGenerator analyzeRepos -INFO: [56/92] Analyzing https://github.com/AY2324S2-CS2103T-T14-1/tp.git (master)... -Mar 08, 2024 4:11:32 AM reposense.report.RepoCloner spawnCloneProcess +Mar 08, 2024 9:41:57 AM reposense.report.ReportGenerator updateRepoConfig +INFO: https://github.com/AY2324S2-CS2103T-W08-4/tp.git (master) does not contain a standalone config file. +Mar 08, 2024 9:41:57 AM reposense.authorship.FileInfoExtractor extractTextFileInfos +INFO: Extracting relevant file info from https://github.com/AY2324S2-CS2103T-W08-4/tp.git (master)... +Mar 08, 2024 9:41:57 AM reposense.report.RepoCloner spawnCloneProcess INFO: Cloning in parallel from https://github.com/AY2324S2-CS2103T-F11-4/tp.git... -Mar 08, 2024 4:11:32 AM reposense.commits.CommitInfoExtractor extractCommitInfos -INFO: Extracting commits info for https://github.com/AY2324S2-CS2103T-F12-2/tp.git (master)... -Mar 08, 2024 4:11:32 AM reposense.report.RepoCloner waitForCloneProcess +Mar 08, 2024 9:41:57 AM reposense.report.ReportGenerator analyzeRepos +INFO: [56/92] Analyzing https://github.com/AY2324S2-CS2103T-T14-1/tp.git (master)... +Mar 08, 2024 9:41:57 AM reposense.report.RepoCloner waitForCloneProcess INFO: Waiting for cloning of https://github.com/AY2324S2-CS2103T-F11-4/tp.git to complete... -Mar 08, 2024 4:11:32 AM reposense.commits.CommitInfoExtractor extractCommitInfos -INFO: Extracting commits info for https://github.com/AY2324S2-CS2103T-W08-4/tp.git (master)... -Mar 08, 2024 4:11:32 AM reposense.report.RepoCloner waitForCloneProcess +Mar 08, 2024 9:41:57 AM reposense.commits.CommitInfoExtractor extractCommitInfos +INFO: Extracting commits info for https://github.com/AY2324S2-CS2103T-F12-2/tp.git (master)... +Mar 08, 2024 9:41:57 AM reposense.report.RepoCloner waitForCloneProcess INFO: Cloning of https://github.com/AY2324S2-CS2103T-W12-2/tp.git completed! -Mar 08, 2024 4:11:32 AM reposense.report.RepoCloner spawnCloneProcess +Mar 08, 2024 9:41:57 AM reposense.report.RepoCloner spawnCloneProcess INFO: Cloning in parallel from https://github.com/AY2324S2-CS2103T-F14-4/tp.git... -Mar 08, 2024 4:11:32 AM reposense.report.ReportGenerator analyzeRepos -INFO: [57/92] Analyzing https://github.com/AY2324S2-CS2103T-W12-2/tp.git (master)... -Mar 08, 2024 4:11:32 AM reposense.report.RepoCloner waitForCloneProcess -INFO: Waiting for cloning of https://github.com/AY2324S2-CS2103T-F14-4/tp.git to complete... -Mar 08, 2024 4:11:32 AM reposense.report.ReportGenerator updateRepoConfig +Mar 08, 2024 9:41:57 AM reposense.report.ReportGenerator updateRepoConfig INFO: https://github.com/AY2324S2-CS2103T-T14-1/tp.git (master) does not contain a standalone config file. -Mar 08, 2024 4:11:32 AM reposense.authorship.FileInfoExtractor extractTextFileInfos +Mar 08, 2024 9:41:57 AM reposense.authorship.FileInfoExtractor extractTextFileInfos INFO: Extracting relevant file info from https://github.com/AY2324S2-CS2103T-T14-1/tp.git (master)... -Mar 08, 2024 4:11:32 AM reposense.report.ReportGenerator updateRepoConfig -INFO: https://github.com/AY2324S2-CS2103T-W12-2/tp.git (master) does not contain a standalone config file. -Mar 08, 2024 4:11:32 AM reposense.authorship.FileInfoExtractor extractTextFileInfos -INFO: Extracting relevant file info from https://github.com/AY2324S2-CS2103T-W12-2/tp.git (master)... -Mar 08, 2024 4:11:32 AM reposense.commits.CommitInfoAnalyzer analyzeCommits +Mar 08, 2024 9:41:57 AM reposense.report.RepoCloner waitForCloneProcess +INFO: Waiting for cloning of https://github.com/AY2324S2-CS2103T-F14-4/tp.git to complete... +Mar 08, 2024 9:41:57 AM reposense.commits.CommitInfoAnalyzer analyzeCommits +INFO: Analyzing commits info for https://github.com/AY2324S2-CS2103T-T17-2/tp.git (master)... +Mar 08, 2024 9:41:57 AM reposense.report.ReportGenerator analyzeRepo +INFO: Analysis of https://github.com/AY2324S2-CS2103T-T17-2/tp.git (master) completed! +Mar 08, 2024 9:41:57 AM reposense.report.ReportGenerator analyzeRepos +INFO: [57/92] Analyzing https://github.com/AY2324S2-CS2103T-W12-2/tp.git (master)... +Mar 08, 2024 9:41:57 AM reposense.commits.CommitInfoAnalyzer analyzeCommits INFO: Analyzing commits info for https://github.com/AY2324S2-CS2103T-F12-2/tp.git (master)... -Mar 08, 2024 4:11:32 AM reposense.report.ReportGenerator analyzeRepo +Mar 08, 2024 9:41:57 AM reposense.report.ReportGenerator analyzeRepo INFO: Analysis of https://github.com/AY2324S2-CS2103T-F12-2/tp.git (master) completed! -Mar 08, 2024 4:11:32 AM reposense.commits.CommitInfoAnalyzer analyzeCommits +Mar 08, 2024 9:41:57 AM reposense.report.ReportGenerator updateRepoConfig +INFO: https://github.com/AY2324S2-CS2103T-W12-2/tp.git (master) does not contain a standalone config file. +Mar 08, 2024 9:41:57 AM reposense.authorship.FileInfoExtractor extractTextFileInfos +INFO: Extracting relevant file info from https://github.com/AY2324S2-CS2103T-W12-2/tp.git (master)... +Mar 08, 2024 9:41:57 AM reposense.commits.CommitInfoExtractor extractCommitInfos +INFO: Extracting commits info for https://github.com/AY2324S2-CS2103T-W08-4/tp.git (master)... +Mar 08, 2024 9:41:58 AM reposense.commits.CommitInfoAnalyzer analyzeCommits INFO: Analyzing commits info for https://github.com/AY2324S2-CS2103T-W08-4/tp.git (master)... -Mar 08, 2024 4:11:32 AM reposense.report.ReportGenerator analyzeRepo +Mar 08, 2024 9:41:58 AM reposense.report.ReportGenerator analyzeRepo INFO: Analysis of https://github.com/AY2324S2-CS2103T-W08-4/tp.git (master) completed! -Mar 08, 2024 4:11:33 AM reposense.commits.CommitInfoExtractor extractCommitInfos +Mar 08, 2024 9:41:58 AM reposense.commits.CommitInfoExtractor extractCommitInfos +INFO: Extracting commits info for https://github.com/AY2324S2-CS2103T-T14-1/tp.git (master)... +Mar 08, 2024 9:41:58 AM reposense.commits.CommitInfoExtractor extractCommitInfos INFO: Extracting commits info for https://github.com/AY2324S2-CS2103T-W12-2/tp.git (master)... -Mar 08, 2024 4:11:33 AM reposense.report.RepoCloner waitForCloneProcess +Mar 08, 2024 9:41:58 AM reposense.report.RepoCloner waitForCloneProcess INFO: Cloning of https://github.com/AY2324S2-CS2103T-W08-3/tp.git completed! -Mar 08, 2024 4:11:33 AM reposense.report.ReportGenerator analyzeRepos +Mar 08, 2024 9:41:58 AM reposense.report.ReportGenerator analyzeRepos INFO: [58/92] Analyzing https://github.com/AY2324S2-CS2103T-W08-3/tp.git (master)... -Mar 08, 2024 4:11:33 AM reposense.report.RepoCloner spawnCloneProcess +Mar 08, 2024 9:41:58 AM reposense.report.RepoCloner spawnCloneProcess INFO: Cloning in parallel from https://github.com/AY2324S2-CS2103T-W08-2/tp.git... -Mar 08, 2024 4:11:33 AM reposense.report.RepoCloner waitForCloneProcess +Mar 08, 2024 9:41:58 AM reposense.report.RepoCloner waitForCloneProcess INFO: Waiting for cloning of https://github.com/AY2324S2-CS2103T-W08-2/tp.git to complete... -Mar 08, 2024 4:11:33 AM reposense.commits.CommitInfoAnalyzer analyzeCommits -INFO: Analyzing commits info for https://github.com/AY2324S2-CS2103T-W12-2/tp.git (master)... -Mar 08, 2024 4:11:33 AM reposense.report.ReportGenerator analyzeRepo -INFO: Analysis of https://github.com/AY2324S2-CS2103T-W12-2/tp.git (master) completed! -Mar 08, 2024 4:11:33 AM reposense.report.ReportGenerator updateRepoConfig +Mar 08, 2024 9:41:58 AM reposense.report.ReportGenerator updateRepoConfig INFO: https://github.com/AY2324S2-CS2103T-W08-3/tp.git (master) does not contain a standalone config file. -Mar 08, 2024 4:11:33 AM reposense.authorship.FileInfoExtractor extractTextFileInfos +Mar 08, 2024 9:41:58 AM reposense.authorship.FileInfoExtractor extractTextFileInfos INFO: Extracting relevant file info from https://github.com/AY2324S2-CS2103T-W08-3/tp.git (master)... -Mar 08, 2024 4:11:33 AM reposense.commits.CommitInfoExtractor extractCommitInfos -INFO: Extracting commits info for https://github.com/AY2324S2-CS2103T-T14-1/tp.git (master)... -Mar 08, 2024 4:11:33 AM reposense.report.RepoCloner waitForCloneProcess -INFO: Cloning of https://github.com/AY2324S2-CS2103T-W12-1/tp.git completed! -Mar 08, 2024 4:11:33 AM reposense.commits.CommitInfoAnalyzer analyzeCommits +Mar 08, 2024 9:41:58 AM reposense.commits.CommitInfoAnalyzer analyzeCommits INFO: Analyzing commits info for https://github.com/AY2324S2-CS2103T-T14-1/tp.git (master)... -Mar 08, 2024 4:11:33 AM reposense.report.ReportGenerator analyzeRepo +Mar 08, 2024 9:41:58 AM reposense.report.ReportGenerator analyzeRepo INFO: Analysis of https://github.com/AY2324S2-CS2103T-T14-1/tp.git (master) completed! -Mar 08, 2024 4:11:33 AM reposense.report.ReportGenerator analyzeRepos +Mar 08, 2024 9:41:58 AM reposense.commits.CommitInfoAnalyzer analyzeCommits +INFO: Analyzing commits info for https://github.com/AY2324S2-CS2103T-W12-2/tp.git (master)... +Mar 08, 2024 9:41:58 AM reposense.report.ReportGenerator analyzeRepo +INFO: Analysis of https://github.com/AY2324S2-CS2103T-W12-2/tp.git (master) completed! +Mar 08, 2024 9:41:58 AM reposense.report.RepoCloner waitForCloneProcess +INFO: Cloning of https://github.com/AY2324S2-CS2103T-W12-1/tp.git completed! +Mar 08, 2024 9:41:58 AM reposense.report.ReportGenerator analyzeRepos INFO: [59/92] Analyzing https://github.com/AY2324S2-CS2103T-W12-1/tp.git (master)... -Mar 08, 2024 4:11:33 AM reposense.report.RepoCloner spawnCloneProcess +Mar 08, 2024 9:41:58 AM reposense.report.RepoCloner spawnCloneProcess INFO: Cloning in parallel from https://github.com/AY2324S2-CS2103T-F11-3/tp.git... -Mar 08, 2024 4:11:33 AM reposense.report.RepoCloner waitForCloneProcess +Mar 08, 2024 9:41:58 AM reposense.report.RepoCloner waitForCloneProcess INFO: Waiting for cloning of https://github.com/AY2324S2-CS2103T-F11-3/tp.git to complete... -Mar 08, 2024 4:11:33 AM reposense.report.ReportGenerator updateRepoConfig +Mar 08, 2024 9:41:58 AM reposense.commits.CommitInfoExtractor extractCommitInfos +INFO: Extracting commits info for https://github.com/AY2324S2-CS2103T-W08-3/tp.git (master)... +Mar 08, 2024 9:41:58 AM reposense.report.ReportGenerator updateRepoConfig INFO: https://github.com/AY2324S2-CS2103T-W12-1/tp.git (master) does not contain a standalone config file. -Mar 08, 2024 4:11:33 AM reposense.authorship.FileInfoExtractor extractTextFileInfos +Mar 08, 2024 9:41:58 AM reposense.authorship.FileInfoExtractor extractTextFileInfos INFO: Extracting relevant file info from https://github.com/AY2324S2-CS2103T-W12-1/tp.git (master)... -Mar 08, 2024 4:11:33 AM reposense.commits.CommitInfoExtractor extractCommitInfos -INFO: Extracting commits info for https://github.com/AY2324S2-CS2103T-W08-3/tp.git (master)... -Mar 08, 2024 4:11:33 AM reposense.commits.CommitInfoAnalyzer analyzeCommits -INFO: Analyzing commits info for https://github.com/AY2324S2-CS2103T-W08-3/tp.git (master)... -Mar 08, 2024 4:11:33 AM reposense.report.ReportGenerator analyzeRepo -INFO: Analysis of https://github.com/AY2324S2-CS2103T-W08-3/tp.git (master) completed! -Mar 08, 2024 4:11:33 AM reposense.report.RepoCloner waitForCloneProcess +Mar 08, 2024 9:41:58 AM reposense.report.RepoCloner waitForCloneProcess INFO: Cloning of https://github.com/AY2324S2-CS2103T-F11-4/tp.git completed! -Mar 08, 2024 4:11:34 AM reposense.report.RepoCloner spawnCloneProcess +Mar 08, 2024 9:41:58 AM reposense.report.RepoCloner spawnCloneProcess INFO: Cloning in parallel from https://github.com/AY2324S2-CS2103T-T15-2/tp.git... -Mar 08, 2024 4:11:34 AM reposense.report.ReportGenerator analyzeRepos +Mar 08, 2024 9:41:58 AM reposense.report.ReportGenerator analyzeRepos INFO: [60/92] Analyzing https://github.com/AY2324S2-CS2103T-F11-4/tp.git (master)... -Mar 08, 2024 4:11:34 AM reposense.report.RepoCloner waitForCloneProcess +Mar 08, 2024 9:41:58 AM reposense.report.RepoCloner waitForCloneProcess INFO: Waiting for cloning of https://github.com/AY2324S2-CS2103T-T15-2/tp.git to complete... -Mar 08, 2024 4:11:34 AM reposense.report.ReportGenerator updateRepoConfig +Mar 08, 2024 9:41:58 AM reposense.commits.CommitInfoAnalyzer analyzeCommits +INFO: Analyzing commits info for https://github.com/AY2324S2-CS2103T-W08-3/tp.git (master)... +Mar 08, 2024 9:41:58 AM reposense.report.ReportGenerator analyzeRepo +INFO: Analysis of https://github.com/AY2324S2-CS2103T-W08-3/tp.git (master) completed! +Mar 08, 2024 9:41:58 AM reposense.report.RepoCloner waitForCloneProcess +INFO: Cloning of https://github.com/AY2324S2-CS2103T-F14-4/tp.git completed! +Mar 08, 2024 9:41:58 AM reposense.report.ReportGenerator updateRepoConfig INFO: https://github.com/AY2324S2-CS2103T-F11-4/tp.git (master) does not contain a standalone config file. -Mar 08, 2024 4:11:34 AM reposense.authorship.FileInfoExtractor extractTextFileInfos +Mar 08, 2024 9:41:58 AM reposense.authorship.FileInfoExtractor extractTextFileInfos INFO: Extracting relevant file info from https://github.com/AY2324S2-CS2103T-F11-4/tp.git (master)... -Mar 08, 2024 4:11:34 AM reposense.commits.CommitInfoExtractor extractCommitInfos -INFO: Extracting commits info for https://github.com/AY2324S2-CS2103T-W12-1/tp.git (master)... -Mar 08, 2024 4:11:34 AM reposense.report.RepoCloner waitForCloneProcess -INFO: Cloning of https://github.com/AY2324S2-CS2103T-F14-4/tp.git completed! -Mar 08, 2024 4:11:34 AM reposense.report.RepoCloner spawnCloneProcess -INFO: Cloning in parallel from https://github.com/AY2324S2-CS2103-T14-1/tp.git... -Mar 08, 2024 4:11:34 AM reposense.report.ReportGenerator analyzeRepos +Mar 08, 2024 9:41:58 AM reposense.report.ReportGenerator analyzeRepos INFO: [61/92] Analyzing https://github.com/AY2324S2-CS2103T-F14-4/tp.git (master)... -Mar 08, 2024 4:11:34 AM reposense.commits.CommitInfoAnalyzer analyzeCommits +Mar 08, 2024 9:41:58 AM reposense.report.RepoCloner spawnCloneProcess +INFO: Cloning in parallel from https://github.com/AY2324S2-CS2103-T14-1/tp.git... +Mar 08, 2024 9:41:58 AM reposense.report.RepoCloner waitForCloneProcess +INFO: Waiting for cloning of https://github.com/AY2324S2-CS2103-T14-1/tp.git to complete... +Mar 08, 2024 9:41:59 AM reposense.report.ReportGenerator updateRepoConfig +INFO: https://github.com/AY2324S2-CS2103T-F14-4/tp.git (master) does not contain a standalone config file. +Mar 08, 2024 9:41:59 AM reposense.authorship.FileInfoExtractor extractTextFileInfos +INFO: Extracting relevant file info from https://github.com/AY2324S2-CS2103T-F14-4/tp.git (master)... +Mar 08, 2024 9:41:59 AM reposense.commits.CommitInfoExtractor extractCommitInfos +INFO: Extracting commits info for https://github.com/AY2324S2-CS2103T-W12-1/tp.git (master)... +Mar 08, 2024 9:41:59 AM reposense.commits.CommitInfoAnalyzer analyzeCommits INFO: Analyzing commits info for https://github.com/AY2324S2-CS2103T-W12-1/tp.git (master)... -Mar 08, 2024 4:11:34 AM reposense.report.ReportGenerator analyzeRepo +Mar 08, 2024 9:41:59 AM reposense.report.ReportGenerator analyzeRepo INFO: Analysis of https://github.com/AY2324S2-CS2103T-W12-1/tp.git (master) completed! -Mar 08, 2024 4:11:34 AM reposense.report.RepoCloner waitForCloneProcess -INFO: Waiting for cloning of https://github.com/AY2324S2-CS2103-T14-1/tp.git to complete... -Mar 08, 2024 4:11:34 AM reposense.report.RepoCloner waitForCloneProcess +Mar 08, 2024 9:41:59 AM reposense.commits.CommitInfoExtractor extractCommitInfos +INFO: Extracting commits info for https://github.com/AY2324S2-CS2103T-F11-4/tp.git (master)... +Mar 08, 2024 9:41:59 AM reposense.report.RepoCloner waitForCloneProcess INFO: Cloning of https://github.com/AY2324S2-CS2103T-W08-2/tp.git completed! -Mar 08, 2024 4:11:34 AM reposense.report.ReportGenerator analyzeRepos +Mar 08, 2024 9:41:59 AM reposense.report.ReportGenerator analyzeRepos INFO: [62/92] Analyzing https://github.com/AY2324S2-CS2103T-W08-2/tp.git (master)... -Mar 08, 2024 4:11:34 AM reposense.report.RepoCloner spawnCloneProcess +Mar 08, 2024 9:41:59 AM reposense.report.RepoCloner spawnCloneProcess INFO: Cloning in parallel from https://github.com/AY2324S2-CS2103T-F11-2/tp.git... -Mar 08, 2024 4:11:34 AM reposense.report.ReportGenerator updateRepoConfig -INFO: https://github.com/AY2324S2-CS2103T-F14-4/tp.git (master) does not contain a standalone config file. -Mar 08, 2024 4:11:34 AM reposense.authorship.FileInfoExtractor extractTextFileInfos -INFO: Extracting relevant file info from https://github.com/AY2324S2-CS2103T-F14-4/tp.git (master)... -Mar 08, 2024 4:11:34 AM reposense.report.RepoCloner waitForCloneProcess +Mar 08, 2024 9:41:59 AM reposense.commits.CommitInfoExtractor extractCommitInfos +INFO: Extracting commits info for https://github.com/AY2324S2-CS2103T-F14-4/tp.git (master)... +Mar 08, 2024 9:41:59 AM reposense.report.RepoCloner waitForCloneProcess INFO: Waiting for cloning of https://github.com/AY2324S2-CS2103T-F11-2/tp.git to complete... -Mar 08, 2024 4:11:34 AM reposense.commits.CommitInfoExtractor extractCommitInfos -INFO: Extracting commits info for https://github.com/AY2324S2-CS2103T-F11-4/tp.git (master)... -Mar 08, 2024 4:11:34 AM reposense.report.ReportGenerator updateRepoConfig -INFO: https://github.com/AY2324S2-CS2103T-W08-2/tp.git (master) does not contain a standalone config file. -Mar 08, 2024 4:11:34 AM reposense.authorship.FileInfoExtractor extractTextFileInfos -INFO: Extracting relevant file info from https://github.com/AY2324S2-CS2103T-W08-2/tp.git (master)... -Mar 08, 2024 4:11:34 AM reposense.commits.CommitInfoAnalyzer analyzeCommits +Mar 08, 2024 9:41:59 AM reposense.commits.CommitInfoAnalyzer analyzeCommits INFO: Analyzing commits info for https://github.com/AY2324S2-CS2103T-F11-4/tp.git (master)... -Mar 08, 2024 4:11:34 AM reposense.report.ReportGenerator analyzeRepo +Mar 08, 2024 9:41:59 AM reposense.report.ReportGenerator analyzeRepo INFO: Analysis of https://github.com/AY2324S2-CS2103T-F11-4/tp.git (master) completed! -Mar 08, 2024 4:11:34 AM reposense.commits.CommitInfoExtractor extractCommitInfos -INFO: Extracting commits info for https://github.com/AY2324S2-CS2103T-F14-4/tp.git (master)... -Mar 08, 2024 4:11:35 AM reposense.commits.CommitInfoAnalyzer analyzeCommits +Mar 08, 2024 9:41:59 AM reposense.report.ReportGenerator updateRepoConfig +INFO: https://github.com/AY2324S2-CS2103T-W08-2/tp.git (master) does not contain a standalone config file. +Mar 08, 2024 9:41:59 AM reposense.authorship.FileInfoExtractor extractTextFileInfos +INFO: Extracting relevant file info from https://github.com/AY2324S2-CS2103T-W08-2/tp.git (master)... +Mar 08, 2024 9:41:59 AM reposense.commits.CommitInfoAnalyzer analyzeCommits INFO: Analyzing commits info for https://github.com/AY2324S2-CS2103T-F14-4/tp.git (master)... -Mar 08, 2024 4:11:35 AM reposense.report.ReportGenerator analyzeRepo +Mar 08, 2024 9:41:59 AM reposense.report.ReportGenerator analyzeRepo INFO: Analysis of https://github.com/AY2324S2-CS2103T-F14-4/tp.git (master) completed! -Mar 08, 2024 4:11:35 AM reposense.commits.CommitInfoExtractor extractCommitInfos -INFO: Extracting commits info for https://github.com/AY2324S2-CS2103T-W08-2/tp.git (master)... -Mar 08, 2024 4:11:35 AM reposense.commits.CommitInfoAnalyzer analyzeCommits -INFO: Analyzing commits info for https://github.com/AY2324S2-CS2103T-W08-2/tp.git (master)... -Mar 08, 2024 4:11:35 AM reposense.report.ReportGenerator analyzeRepo -INFO: Analysis of https://github.com/AY2324S2-CS2103T-W08-2/tp.git (master) completed! -Mar 08, 2024 4:11:35 AM reposense.report.RepoCloner waitForCloneProcess +Mar 08, 2024 9:42:00 AM reposense.report.RepoCloner waitForCloneProcess INFO: Cloning of https://github.com/AY2324S2-CS2103T-F11-3/tp.git completed! -Mar 08, 2024 4:11:35 AM reposense.report.ReportGenerator analyzeRepos +Mar 08, 2024 9:42:00 AM reposense.report.ReportGenerator analyzeRepos INFO: [63/92] Analyzing https://github.com/AY2324S2-CS2103T-F11-3/tp.git (master)... -Mar 08, 2024 4:11:35 AM reposense.report.RepoCloner spawnCloneProcess +Mar 08, 2024 9:42:00 AM reposense.report.RepoCloner spawnCloneProcess INFO: Cloning in parallel from https://github.com/AY2324S2-CS2103T-F11-1/tp.git... -Mar 08, 2024 4:11:35 AM reposense.report.RepoCloner waitForCloneProcess +Mar 08, 2024 9:42:00 AM reposense.report.RepoCloner waitForCloneProcess INFO: Waiting for cloning of https://github.com/AY2324S2-CS2103T-F11-1/tp.git to complete... -Mar 08, 2024 4:11:35 AM reposense.report.RepoCloner waitForCloneProcess +Mar 08, 2024 9:42:00 AM reposense.report.ReportGenerator updateRepoConfig +INFO: https://github.com/AY2324S2-CS2103T-F11-3/tp.git (master) does not contain a standalone config file. +Mar 08, 2024 9:42:00 AM reposense.authorship.FileInfoExtractor extractTextFileInfos +INFO: Extracting relevant file info from https://github.com/AY2324S2-CS2103T-F11-3/tp.git (master)... +Mar 08, 2024 9:42:00 AM reposense.report.RepoCloner waitForCloneProcess INFO: Cloning of https://github.com/AY2324S2-CS2103T-T15-2/tp.git completed! -Mar 08, 2024 4:11:35 AM reposense.report.ReportGenerator analyzeRepos +Mar 08, 2024 9:42:00 AM reposense.report.ReportGenerator analyzeRepos INFO: [64/92] Analyzing https://github.com/AY2324S2-CS2103T-T15-2/tp.git (master)... -Mar 08, 2024 4:11:35 AM reposense.report.RepoCloner spawnCloneProcess +Mar 08, 2024 9:42:00 AM reposense.report.RepoCloner spawnCloneProcess INFO: Cloning in parallel from https://github.com/AY2324S2-CS2103T-T15-3/tp.git... -Mar 08, 2024 4:11:35 AM reposense.report.RepoCloner waitForCloneProcess +Mar 08, 2024 9:42:00 AM reposense.report.RepoCloner waitForCloneProcess INFO: Waiting for cloning of https://github.com/AY2324S2-CS2103T-T15-3/tp.git to complete... -Mar 08, 2024 4:11:35 AM reposense.report.ReportGenerator updateRepoConfig -INFO: https://github.com/AY2324S2-CS2103T-F11-3/tp.git (master) does not contain a standalone config file. -Mar 08, 2024 4:11:35 AM reposense.authorship.FileInfoExtractor extractTextFileInfos -INFO: Extracting relevant file info from https://github.com/AY2324S2-CS2103T-F11-3/tp.git (master)... -Mar 08, 2024 4:11:35 AM reposense.report.ReportGenerator updateRepoConfig +Mar 08, 2024 9:42:00 AM reposense.report.ReportGenerator updateRepoConfig INFO: https://github.com/AY2324S2-CS2103T-T15-2/tp.git (master) does not contain a standalone config file. -Mar 08, 2024 4:11:35 AM reposense.authorship.FileInfoExtractor extractTextFileInfos +Mar 08, 2024 9:42:00 AM reposense.authorship.FileInfoExtractor extractTextFileInfos INFO: Extracting relevant file info from https://github.com/AY2324S2-CS2103T-T15-2/tp.git (master)... -Mar 08, 2024 4:11:36 AM reposense.report.RepoCloner waitForCloneProcess -INFO: Cloning of https://github.com/AY2324S2-CS2103T-F11-2/tp.git completed! -Mar 08, 2024 4:11:36 AM reposense.commits.CommitInfoExtractor extractCommitInfos -INFO: Extracting commits info for https://github.com/AY2324S2-CS2103T-T15-2/tp.git (master)... -Mar 08, 2024 4:11:36 AM reposense.report.ReportGenerator analyzeRepos -INFO: [65/92] Analyzing https://github.com/AY2324S2-CS2103T-F11-2/tp.git (master)... -Mar 08, 2024 4:11:36 AM reposense.report.RepoCloner spawnCloneProcess -INFO: Cloning in parallel from https://github.com/AY2324S2-CS2103T-T15-1/tp.git... -Mar 08, 2024 4:11:36 AM reposense.report.RepoCloner waitForCloneProcess +Mar 08, 2024 9:42:00 AM reposense.report.RepoCloner waitForCloneProcess INFO: Cloning of https://github.com/AY2324S2-CS2103-T14-1/tp.git completed! -Mar 08, 2024 4:11:36 AM reposense.report.ReportGenerator analyzeRepos -INFO: [66/92] Analyzing https://github.com/AY2324S2-CS2103-T14-1/tp.git (master)... -Mar 08, 2024 4:11:36 AM reposense.report.RepoCloner spawnCloneProcess -INFO: Cloning in parallel from https://github.com/AY2324S2-CS2103T-T09-1/tp.git... -Mar 08, 2024 4:11:36 AM reposense.report.RepoCloner waitForCloneProcess +Mar 08, 2024 9:42:00 AM reposense.report.RepoCloner spawnCloneProcess +INFO: Cloning in parallel from https://github.com/AY2324S2-CS2103T-T15-1/tp.git... +Mar 08, 2024 9:42:00 AM reposense.report.ReportGenerator analyzeRepos +INFO: [65/92] Analyzing https://github.com/AY2324S2-CS2103-T14-1/tp.git (master)... +Mar 08, 2024 9:42:00 AM reposense.commits.CommitInfoExtractor extractCommitInfos +INFO: Extracting commits info for https://github.com/AY2324S2-CS2103T-W08-2/tp.git (master)... +Mar 08, 2024 9:42:00 AM reposense.report.RepoCloner waitForCloneProcess INFO: Waiting for cloning of https://github.com/AY2324S2-CS2103T-T15-1/tp.git to complete... -Mar 08, 2024 4:11:36 AM reposense.report.RepoCloner waitForCloneProcess -INFO: Waiting for cloning of https://github.com/AY2324S2-CS2103T-T09-1/tp.git to complete... -Mar 08, 2024 4:11:36 AM reposense.commits.CommitInfoAnalyzer analyzeCommits -INFO: Analyzing commits info for https://github.com/AY2324S2-CS2103T-T15-2/tp.git (master)... -Mar 08, 2024 4:11:36 AM reposense.report.ReportGenerator updateRepoConfig +Mar 08, 2024 9:42:01 AM reposense.report.ReportGenerator updateRepoConfig INFO: https://github.com/AY2324S2-CS2103-T14-1/tp.git (master) does not contain a standalone config file. -Mar 08, 2024 4:11:36 AM reposense.authorship.FileInfoExtractor extractTextFileInfos +Mar 08, 2024 9:42:01 AM reposense.authorship.FileInfoExtractor extractTextFileInfos INFO: Extracting relevant file info from https://github.com/AY2324S2-CS2103-T14-1/tp.git (master)... -Mar 08, 2024 4:11:36 AM reposense.report.ReportGenerator analyzeRepo -INFO: Analysis of https://github.com/AY2324S2-CS2103T-T15-2/tp.git (master) completed! -Mar 08, 2024 4:11:36 AM reposense.report.ReportGenerator updateRepoConfig +Mar 08, 2024 9:42:01 AM reposense.commits.CommitInfoAnalyzer analyzeCommits +INFO: Analyzing commits info for https://github.com/AY2324S2-CS2103T-W08-2/tp.git (master)... +Mar 08, 2024 9:42:01 AM reposense.report.ReportGenerator analyzeRepo +INFO: Analysis of https://github.com/AY2324S2-CS2103T-W08-2/tp.git (master) completed! +Mar 08, 2024 9:42:01 AM reposense.report.RepoCloner waitForCloneProcess +INFO: Cloning of https://github.com/AY2324S2-CS2103T-F11-2/tp.git completed! +Mar 08, 2024 9:42:01 AM reposense.report.RepoCloner spawnCloneProcess +INFO: Cloning in parallel from https://github.com/AY2324S2-CS2103T-T09-1/tp.git... +Mar 08, 2024 9:42:01 AM reposense.report.RepoCloner waitForCloneProcess +INFO: Waiting for cloning of https://github.com/AY2324S2-CS2103T-T09-1/tp.git to complete... +Mar 08, 2024 9:42:01 AM reposense.report.ReportGenerator analyzeRepos +INFO: [66/92] Analyzing https://github.com/AY2324S2-CS2103T-F11-2/tp.git (master)... +Mar 08, 2024 9:42:01 AM reposense.commits.CommitInfoExtractor extractCommitInfos +INFO: Extracting commits info for https://github.com/AY2324S2-CS2103T-T15-2/tp.git (master)... +Mar 08, 2024 9:42:01 AM reposense.report.ReportGenerator updateRepoConfig INFO: https://github.com/AY2324S2-CS2103T-F11-2/tp.git (master) does not contain a standalone config file. -Mar 08, 2024 4:11:36 AM reposense.authorship.FileInfoExtractor extractTextFileInfos +Mar 08, 2024 9:42:01 AM reposense.authorship.FileInfoExtractor extractTextFileInfos INFO: Extracting relevant file info from https://github.com/AY2324S2-CS2103T-F11-2/tp.git (master)... -Mar 08, 2024 4:11:37 AM reposense.report.RepoCloner waitForCloneProcess +Mar 08, 2024 9:42:02 AM reposense.commits.CommitInfoAnalyzer analyzeCommits +INFO: Analyzing commits info for https://github.com/AY2324S2-CS2103T-T15-2/tp.git (master)... +Mar 08, 2024 9:42:02 AM reposense.report.ReportGenerator analyzeRepo +INFO: Analysis of https://github.com/AY2324S2-CS2103T-T15-2/tp.git (master) completed! +Mar 08, 2024 9:42:02 AM reposense.report.RepoCloner waitForCloneProcess +INFO: Cloning of https://github.com/AY2324S2-CS2103T-T15-3/tp.git completed! +Mar 08, 2024 9:42:02 AM reposense.report.RepoCloner waitForCloneProcess INFO: Cloning of https://github.com/AY2324S2-CS2103T-F11-1/tp.git completed! -Mar 08, 2024 4:11:37 AM reposense.report.ReportGenerator analyzeRepos -INFO: [67/92] Analyzing https://github.com/AY2324S2-CS2103T-F11-1/tp.git (master)... -Mar 08, 2024 4:11:37 AM reposense.report.RepoCloner spawnCloneProcess +Mar 08, 2024 9:42:02 AM reposense.report.RepoCloner spawnCloneProcess INFO: Cloning in parallel from https://github.com/AY2324S2-CS2103T-W12-4/tp.git... -Mar 08, 2024 4:11:37 AM reposense.report.RepoCloner waitForCloneProcess -INFO: Waiting for cloning of https://github.com/AY2324S2-CS2103T-W12-4/tp.git to complete... -Mar 08, 2024 4:11:37 AM reposense.report.ReportGenerator updateRepoConfig -INFO: https://github.com/AY2324S2-CS2103T-F11-1/tp.git (master) does not contain a standalone config file. -Mar 08, 2024 4:11:37 AM reposense.authorship.FileInfoExtractor extractTextFileInfos -INFO: Extracting relevant file info from https://github.com/AY2324S2-CS2103T-F11-1/tp.git (master)... -Mar 08, 2024 4:11:37 AM reposense.report.RepoCloner waitForCloneProcess -INFO: Cloning of https://github.com/AY2324S2-CS2103T-T15-3/tp.git completed! -Mar 08, 2024 4:11:37 AM reposense.report.RepoCloner spawnCloneProcess +Mar 08, 2024 9:42:02 AM reposense.report.ReportGenerator analyzeRepos +INFO: [67/92] Analyzing https://github.com/AY2324S2-CS2103T-T15-3/tp.git (master)... +Mar 08, 2024 9:42:02 AM reposense.report.RepoCloner spawnCloneProcess INFO: Cloning in parallel from https://github.com/AY2324S2-CS2103T-W12-3/tp.git... -Mar 08, 2024 4:11:37 AM reposense.report.RepoCloner waitForCloneProcess -INFO: Cloning of https://github.com/AY2324S2-CS2103T-T09-1/tp.git completed! -Mar 08, 2024 4:11:37 AM reposense.report.RepoCloner waitForCloneProcess +Mar 08, 2024 9:42:02 AM reposense.report.RepoCloner waitForCloneProcess +INFO: Waiting for cloning of https://github.com/AY2324S2-CS2103T-W12-4/tp.git to complete... +Mar 08, 2024 9:42:02 AM reposense.report.RepoCloner waitForCloneProcess INFO: Waiting for cloning of https://github.com/AY2324S2-CS2103T-W12-3/tp.git to complete... -Mar 08, 2024 4:11:37 AM reposense.report.RepoCloner spawnCloneProcess +Mar 08, 2024 9:42:02 AM reposense.report.ReportGenerator updateRepoConfig +INFO: https://github.com/AY2324S2-CS2103T-T15-3/tp.git (master) does not contain a standalone config file. +Mar 08, 2024 9:42:02 AM reposense.authorship.FileInfoExtractor extractTextFileInfos +INFO: Extracting relevant file info from https://github.com/AY2324S2-CS2103T-T15-3/tp.git (master)... +Mar 08, 2024 9:42:02 AM reposense.report.RepoCloner waitForCloneProcess +INFO: Cloning of https://github.com/AY2324S2-CS2103T-T15-1/tp.git completed! +Mar 08, 2024 9:42:02 AM reposense.report.RepoCloner spawnCloneProcess INFO: Cloning in parallel from https://github.com/AY2324S2-CS2103T-T09-2/tp.git... -Mar 08, 2024 4:11:37 AM reposense.report.RepoCloner waitForCloneProcess +Mar 08, 2024 9:42:02 AM reposense.report.RepoCloner waitForCloneProcess INFO: Waiting for cloning of https://github.com/AY2324S2-CS2103T-T09-2/tp.git to complete... -Mar 08, 2024 4:11:37 AM reposense.commits.CommitInfoExtractor extractCommitInfos -INFO: Extracting commits info for https://github.com/AY2324S2-CS2103T-F11-2/tp.git (master)... -Mar 08, 2024 4:11:38 AM reposense.commits.CommitInfoAnalyzer analyzeCommits -INFO: Analyzing commits info for https://github.com/AY2324S2-CS2103T-F11-2/tp.git (master)... -Mar 08, 2024 4:11:38 AM reposense.report.ReportGenerator analyzeRepo -INFO: Analysis of https://github.com/AY2324S2-CS2103T-F11-2/tp.git (master) completed! -Mar 08, 2024 4:11:38 AM reposense.report.ReportGenerator analyzeRepos -INFO: [68/92] Analyzing https://github.com/AY2324S2-CS2103T-T15-3/tp.git (master)... -Mar 08, 2024 4:11:38 AM reposense.report.RepoCloner waitForCloneProcess -INFO: Cloning of https://github.com/AY2324S2-CS2103T-T15-1/tp.git completed! -Mar 08, 2024 4:11:38 AM reposense.report.RepoCloner spawnCloneProcess +Mar 08, 2024 9:42:02 AM reposense.report.RepoCloner waitForCloneProcess +INFO: Cloning of https://github.com/AY2324S2-CS2103T-T09-1/tp.git completed! +Mar 08, 2024 9:42:02 AM reposense.report.RepoCloner spawnCloneProcess INFO: Cloning in parallel from https://github.com/AY2324S2-CS2103T-T15-4/tp.git... -Mar 08, 2024 4:11:38 AM reposense.report.RepoCloner waitForCloneProcess +Mar 08, 2024 9:42:02 AM reposense.commits.CommitInfoExtractor extractCommitInfos +INFO: Extracting commits info for https://github.com/AY2324S2-CS2103T-T15-3/tp.git (master)... +Mar 08, 2024 9:42:02 AM reposense.report.RepoCloner waitForCloneProcess INFO: Waiting for cloning of https://github.com/AY2324S2-CS2103T-T15-4/tp.git to complete... -Mar 08, 2024 4:11:38 AM reposense.report.ReportGenerator updateRepoConfig -INFO: https://github.com/AY2324S2-CS2103T-T15-3/tp.git (master) does not contain a standalone config file. -Mar 08, 2024 4:11:38 AM reposense.authorship.FileInfoExtractor extractTextFileInfos -INFO: Extracting relevant file info from https://github.com/AY2324S2-CS2103T-T15-3/tp.git (master)... -Mar 08, 2024 4:11:38 AM reposense.commits.CommitInfoExtractor extractCommitInfos +Mar 08, 2024 9:42:02 AM reposense.commits.CommitInfoExtractor extractCommitInfos +INFO: Extracting commits info for https://github.com/AY2324S2-CS2103T-F11-2/tp.git (master)... +Mar 08, 2024 9:42:03 AM reposense.commits.CommitInfoAnalyzer analyzeCommits +INFO: Analyzing commits info for https://github.com/AY2324S2-CS2103T-T15-3/tp.git (master)... +Mar 08, 2024 9:42:03 AM reposense.report.ReportGenerator analyzeRepo +INFO: Analysis of https://github.com/AY2324S2-CS2103T-T15-3/tp.git (master) completed! +Mar 08, 2024 9:42:03 AM reposense.report.ReportGenerator analyzeRepos +INFO: [68/92] Analyzing https://github.com/AY2324S2-CS2103T-F11-1/tp.git (master)... +Mar 08, 2024 9:42:03 AM reposense.commits.CommitInfoExtractor extractCommitInfos INFO: Extracting commits info for https://github.com/AY2324S2-CS2103T-F11-3/tp.git (master)... -Mar 08, 2024 4:11:38 AM reposense.commits.CommitInfoExtractor extractCommitInfos -INFO: Extracting commits info for https://github.com/AY2324S2-CS2103T-F11-1/tp.git (master)... -Mar 08, 2024 4:11:38 AM reposense.commits.CommitInfoAnalyzer analyzeCommits +Mar 08, 2024 9:42:03 AM reposense.commits.CommitInfoAnalyzer analyzeCommits +INFO: Analyzing commits info for https://github.com/AY2324S2-CS2103T-F11-2/tp.git (master)... +Mar 08, 2024 9:42:03 AM reposense.report.ReportGenerator analyzeRepo +INFO: Analysis of https://github.com/AY2324S2-CS2103T-F11-2/tp.git (master) completed! +Mar 08, 2024 9:42:03 AM reposense.report.ReportGenerator updateRepoConfig +INFO: https://github.com/AY2324S2-CS2103T-F11-1/tp.git (master) does not contain a standalone config file. +Mar 08, 2024 9:42:03 AM reposense.authorship.FileInfoExtractor extractTextFileInfos +INFO: Extracting relevant file info from https://github.com/AY2324S2-CS2103T-F11-1/tp.git (master)... +Mar 08, 2024 9:42:03 AM reposense.report.ReportGenerator analyzeRepos +INFO: [69/92] Analyzing https://github.com/AY2324S2-CS2103T-T15-1/tp.git (master)... +Mar 08, 2024 9:42:03 AM reposense.commits.CommitInfoAnalyzer analyzeCommits INFO: Analyzing commits info for https://github.com/AY2324S2-CS2103T-F11-3/tp.git (master)... -Mar 08, 2024 4:11:38 AM reposense.report.ReportGenerator analyzeRepo +Mar 08, 2024 9:42:03 AM reposense.report.ReportGenerator analyzeRepo INFO: Analysis of https://github.com/AY2324S2-CS2103T-F11-3/tp.git (master) completed! -Mar 08, 2024 4:11:38 AM reposense.report.ReportGenerator analyzeRepos -INFO: [69/92] Analyzing https://github.com/AY2324S2-CS2103T-T09-1/tp.git (master)... -Mar 08, 2024 4:11:38 AM reposense.commits.CommitInfoAnalyzer analyzeCommits -INFO: Analyzing commits info for https://github.com/AY2324S2-CS2103T-F11-1/tp.git (master)... -Mar 08, 2024 4:11:38 AM reposense.report.ReportGenerator analyzeRepo -INFO: Analysis of https://github.com/AY2324S2-CS2103T-F11-1/tp.git (master) completed! -Mar 08, 2024 4:11:38 AM reposense.report.ReportGenerator analyzeRepos -INFO: [70/92] Analyzing https://github.com/AY2324S2-CS2103T-T15-1/tp.git (master)... -Mar 08, 2024 4:11:38 AM reposense.report.RepoCloner waitForCloneProcess -INFO: Cloning of https://github.com/AY2324S2-CS2103T-W12-4/tp.git completed! -Mar 08, 2024 4:11:38 AM reposense.report.ReportGenerator updateRepoConfig +Mar 08, 2024 9:42:03 AM reposense.report.ReportGenerator analyzeRepos +INFO: [70/92] Analyzing https://github.com/AY2324S2-CS2103T-T09-1/tp.git (master)... +Mar 08, 2024 9:42:03 AM reposense.report.ReportGenerator updateRepoConfig +INFO: https://github.com/AY2324S2-CS2103T-T15-1/tp.git (master) does not contain a standalone config file. +Mar 08, 2024 9:42:03 AM reposense.authorship.FileInfoExtractor extractTextFileInfos +INFO: Extracting relevant file info from https://github.com/AY2324S2-CS2103T-T15-1/tp.git (master)... +Mar 08, 2024 9:42:03 AM reposense.report.ReportGenerator updateRepoConfig INFO: https://github.com/AY2324S2-CS2103T-T09-1/tp.git (master) does not contain a standalone config file. -Mar 08, 2024 4:11:38 AM reposense.authorship.FileInfoExtractor extractTextFileInfos +Mar 08, 2024 9:42:03 AM reposense.authorship.FileInfoExtractor extractTextFileInfos INFO: Extracting relevant file info from https://github.com/AY2324S2-CS2103T-T09-1/tp.git (master)... -Mar 08, 2024 4:11:38 AM reposense.report.RepoCloner spawnCloneProcess +Mar 08, 2024 9:42:04 AM reposense.report.RepoCloner waitForCloneProcess +INFO: Cloning of https://github.com/AY2324S2-CS2103T-W12-4/tp.git completed! +Mar 08, 2024 9:42:04 AM reposense.report.RepoCloner spawnCloneProcess INFO: Cloning in parallel from https://github.com/AY2324S2-CS2103-F08-3/tp.git... -Mar 08, 2024 4:11:38 AM reposense.commits.CommitInfoExtractor extractCommitInfos -INFO: Extracting commits info for https://github.com/AY2324S2-CS2103T-T15-3/tp.git (master)... -Mar 08, 2024 4:11:39 AM reposense.report.RepoCloner waitForCloneProcess -INFO: Waiting for cloning of https://github.com/AY2324S2-CS2103-F08-3/tp.git to complete... -Mar 08, 2024 4:11:39 AM reposense.report.ReportGenerator updateRepoConfig -INFO: https://github.com/AY2324S2-CS2103T-T15-1/tp.git (master) does not contain a standalone config file. -Mar 08, 2024 4:11:39 AM reposense.authorship.FileInfoExtractor extractTextFileInfos -INFO: Extracting relevant file info from https://github.com/AY2324S2-CS2103T-T15-1/tp.git (master)... -Mar 08, 2024 4:11:39 AM reposense.commits.CommitInfoAnalyzer analyzeCommits -INFO: Analyzing commits info for https://github.com/AY2324S2-CS2103T-T15-3/tp.git (master)... -Mar 08, 2024 4:11:39 AM reposense.report.ReportGenerator analyzeRepo -INFO: Analysis of https://github.com/AY2324S2-CS2103T-T15-3/tp.git (master) completed! -Mar 08, 2024 4:11:39 AM reposense.report.ReportGenerator analyzeRepos -INFO: [71/92] Analyzing https://github.com/AY2324S2-CS2103T-W12-4/tp.git (master)... -Mar 08, 2024 4:11:39 AM reposense.report.RepoCloner waitForCloneProcess +Mar 08, 2024 9:42:04 AM reposense.report.RepoCloner waitForCloneProcess INFO: Cloning of https://github.com/AY2324S2-CS2103T-T09-2/tp.git completed! -Mar 08, 2024 4:11:39 AM reposense.report.RepoCloner spawnCloneProcess +Mar 08, 2024 9:42:04 AM reposense.report.RepoCloner waitForCloneProcess +INFO: Waiting for cloning of https://github.com/AY2324S2-CS2103-F08-3/tp.git to complete... +Mar 08, 2024 9:42:04 AM reposense.report.RepoCloner spawnCloneProcess INFO: Cloning in parallel from https://github.com/AY2324S2-CS2103-F08-1/tp.git... -Mar 08, 2024 4:11:39 AM reposense.report.ReportGenerator updateRepoConfig -INFO: https://github.com/AY2324S2-CS2103T-W12-4/tp.git (master) does not contain a standalone config file. -Mar 08, 2024 4:11:39 AM reposense.authorship.FileInfoExtractor extractTextFileInfos -INFO: Extracting relevant file info from https://github.com/AY2324S2-CS2103T-W12-4/tp.git (master)... -Mar 08, 2024 4:11:39 AM reposense.report.RepoCloner waitForCloneProcess +Mar 08, 2024 9:42:04 AM reposense.report.RepoCloner waitForCloneProcess INFO: Waiting for cloning of https://github.com/AY2324S2-CS2103-F08-1/tp.git to complete... -Mar 08, 2024 4:11:39 AM reposense.report.RepoCloner waitForCloneProcess -INFO: Cloning of https://github.com/AY2324S2-CS2103T-W12-3/tp.git completed! -Mar 08, 2024 4:11:39 AM reposense.report.RepoCloner spawnCloneProcess -INFO: Cloning in parallel from https://github.com/AY2324S2-CS2103T-W08-1/tp.git... -Mar 08, 2024 4:11:39 AM reposense.report.RepoCloner waitForCloneProcess -INFO: Waiting for cloning of https://github.com/AY2324S2-CS2103T-W08-1/tp.git to complete... -Mar 08, 2024 4:11:39 AM reposense.commits.CommitInfoExtractor extractCommitInfos -INFO: Extracting commits info for https://github.com/AY2324S2-CS2103T-T09-1/tp.git (master)... -Mar 08, 2024 4:11:39 AM reposense.commits.CommitInfoExtractor extractCommitInfos +Mar 08, 2024 9:42:04 AM reposense.commits.CommitInfoExtractor extractCommitInfos INFO: Extracting commits info for https://github.com/AY2324S2-CS2103T-T15-1/tp.git (master)... -Mar 08, 2024 4:11:39 AM reposense.report.RepoCloner waitForCloneProcess +Mar 08, 2024 9:42:04 AM reposense.report.RepoCloner waitForCloneProcess INFO: Cloning of https://github.com/AY2324S2-CS2103T-T15-4/tp.git completed! -Mar 08, 2024 4:11:39 AM reposense.report.RepoCloner spawnCloneProcess +Mar 08, 2024 9:42:04 AM reposense.commits.CommitInfoExtractor extractCommitInfos +INFO: Extracting commits info for https://github.com/AY2324S2-CS2103T-F11-1/tp.git (master)... +Mar 08, 2024 9:42:04 AM reposense.report.RepoCloner spawnCloneProcess +INFO: Cloning in parallel from https://github.com/AY2324S2-CS2103T-W08-1/tp.git... +Mar 08, 2024 9:42:04 AM reposense.report.RepoCloner waitForCloneProcess +INFO: Cloning of https://github.com/AY2324S2-CS2103T-W12-3/tp.git completed! +Mar 08, 2024 9:42:04 AM reposense.report.RepoCloner waitForCloneProcess +INFO: Waiting for cloning of https://github.com/AY2324S2-CS2103T-W08-1/tp.git to complete... +Mar 08, 2024 9:42:04 AM reposense.report.RepoCloner spawnCloneProcess INFO: Cloning in parallel from https://github.com/AY2324S2-CS2103T-T12-1/tp.git... -Mar 08, 2024 4:11:39 AM reposense.report.RepoCloner waitForCloneProcess +Mar 08, 2024 9:42:04 AM reposense.commits.CommitInfoExtractor extractCommitInfos +INFO: Extracting commits info for https://github.com/AY2324S2-CS2103T-T09-1/tp.git (master)... +Mar 08, 2024 9:42:04 AM reposense.report.RepoCloner waitForCloneProcess INFO: Waiting for cloning of https://github.com/AY2324S2-CS2103T-T12-1/tp.git to complete... -Mar 08, 2024 4:11:39 AM reposense.commits.CommitInfoAnalyzer analyzeCommits -INFO: Analyzing commits info for https://github.com/AY2324S2-CS2103T-T09-1/tp.git (master)... -Mar 08, 2024 4:11:39 AM reposense.report.ReportGenerator analyzeRepo -INFO: Analysis of https://github.com/AY2324S2-CS2103T-T09-1/tp.git (master) completed! -Mar 08, 2024 4:11:39 AM reposense.report.ReportGenerator analyzeRepos -INFO: [72/92] Analyzing https://github.com/AY2324S2-CS2103T-T09-2/tp.git (master)... -Mar 08, 2024 4:11:39 AM reposense.commits.CommitInfoAnalyzer analyzeCommits +Mar 08, 2024 9:42:04 AM reposense.commits.CommitInfoAnalyzer analyzeCommits INFO: Analyzing commits info for https://github.com/AY2324S2-CS2103T-T15-1/tp.git (master)... -Mar 08, 2024 4:11:39 AM reposense.report.ReportGenerator analyzeRepo +Mar 08, 2024 9:42:04 AM reposense.report.ReportGenerator analyzeRepo INFO: Analysis of https://github.com/AY2324S2-CS2103T-T15-1/tp.git (master) completed! -Mar 08, 2024 4:11:39 AM reposense.report.ReportGenerator analyzeRepos -INFO: [73/92] Analyzing https://github.com/AY2324S2-CS2103T-W12-3/tp.git (master)... -Mar 08, 2024 4:11:40 AM reposense.report.ReportGenerator updateRepoConfig +Mar 08, 2024 9:42:04 AM reposense.commits.CommitInfoAnalyzer analyzeCommits +INFO: Analyzing commits info for https://github.com/AY2324S2-CS2103T-F11-1/tp.git (master)... +Mar 08, 2024 9:42:04 AM reposense.report.ReportGenerator analyzeRepo +INFO: Analysis of https://github.com/AY2324S2-CS2103T-F11-1/tp.git (master) completed! +Mar 08, 2024 9:42:04 AM reposense.report.ReportGenerator analyzeRepos +INFO: [71/92] Analyzing https://github.com/AY2324S2-CS2103T-W12-4/tp.git (master)... +Mar 08, 2024 9:42:04 AM reposense.commits.CommitInfoAnalyzer analyzeCommits +INFO: Analyzing commits info for https://github.com/AY2324S2-CS2103T-T09-1/tp.git (master)... +Mar 08, 2024 9:42:04 AM reposense.report.ReportGenerator analyzeRepos +INFO: [72/92] Analyzing https://github.com/AY2324S2-CS2103T-T09-2/tp.git (master)... +Mar 08, 2024 9:42:04 AM reposense.report.ReportGenerator analyzeRepo +INFO: Analysis of https://github.com/AY2324S2-CS2103T-T09-1/tp.git (master) completed! +Mar 08, 2024 9:42:04 AM reposense.report.ReportGenerator analyzeRepos +INFO: [73/92] Analyzing https://github.com/AY2324S2-CS2103T-T15-4/tp.git (master)... +Mar 08, 2024 9:42:04 AM reposense.report.ReportGenerator updateRepoConfig +INFO: https://github.com/AY2324S2-CS2103T-W12-4/tp.git (master) does not contain a standalone config file. +Mar 08, 2024 9:42:04 AM reposense.authorship.FileInfoExtractor extractTextFileInfos +INFO: Extracting relevant file info from https://github.com/AY2324S2-CS2103T-W12-4/tp.git (master)... +Mar 08, 2024 9:42:04 AM reposense.report.ReportGenerator updateRepoConfig INFO: https://github.com/AY2324S2-CS2103T-T09-2/tp.git (master) does not contain a standalone config file. -Mar 08, 2024 4:11:40 AM reposense.authorship.FileInfoExtractor extractTextFileInfos +Mar 08, 2024 9:42:04 AM reposense.authorship.FileInfoExtractor extractTextFileInfos INFO: Extracting relevant file info from https://github.com/AY2324S2-CS2103T-T09-2/tp.git (master)... -Mar 08, 2024 4:11:40 AM reposense.commits.CommitInfoExtractor extractCommitInfos -INFO: Extracting commits info for https://github.com/AY2324S2-CS2103T-W12-4/tp.git (master)... -Mar 08, 2024 4:11:40 AM reposense.report.ReportGenerator updateRepoConfig -INFO: https://github.com/AY2324S2-CS2103T-W12-3/tp.git (master) does not contain a standalone config file. -Mar 08, 2024 4:11:40 AM reposense.authorship.FileInfoExtractor extractTextFileInfos -INFO: Extracting relevant file info from https://github.com/AY2324S2-CS2103T-W12-3/tp.git (master)... -Mar 08, 2024 4:11:40 AM reposense.commits.CommitInfoAnalyzer analyzeCommits -INFO: Analyzing commits info for https://github.com/AY2324S2-CS2103T-W12-4/tp.git (master)... -Mar 08, 2024 4:11:40 AM reposense.report.ReportGenerator analyzeRepo -INFO: Analysis of https://github.com/AY2324S2-CS2103T-W12-4/tp.git (master) completed! -Mar 08, 2024 4:11:40 AM reposense.report.RepoCloner waitForCloneProcess -INFO: Cloning of https://github.com/AY2324S2-CS2103-F08-3/tp.git completed! -Mar 08, 2024 4:11:40 AM reposense.report.RepoCloner spawnCloneProcess -INFO: Cloning in parallel from https://github.com/AY2324S2-CS2103T-W11-2/tp.git... -Mar 08, 2024 4:11:40 AM reposense.report.ReportGenerator analyzeRepos -INFO: [74/92] Analyzing https://github.com/AY2324S2-CS2103T-T15-4/tp.git (master)... -Mar 08, 2024 4:11:40 AM reposense.report.RepoCloner waitForCloneProcess -INFO: Waiting for cloning of https://github.com/AY2324S2-CS2103T-W11-2/tp.git to complete... -Mar 08, 2024 4:11:40 AM reposense.report.ReportGenerator updateRepoConfig +Mar 08, 2024 9:42:04 AM reposense.report.ReportGenerator updateRepoConfig INFO: https://github.com/AY2324S2-CS2103T-T15-4/tp.git (master) does not contain a standalone config file. -Mar 08, 2024 4:11:40 AM reposense.authorship.FileInfoExtractor extractTextFileInfos +Mar 08, 2024 9:42:04 AM reposense.authorship.FileInfoExtractor extractTextFileInfos INFO: Extracting relevant file info from https://github.com/AY2324S2-CS2103T-T15-4/tp.git (master)... -Mar 08, 2024 4:11:40 AM reposense.commits.CommitInfoExtractor extractCommitInfos +Mar 08, 2024 9:42:05 AM reposense.report.RepoCloner waitForCloneProcess +INFO: Cloning of https://github.com/AY2324S2-CS2103-F08-3/tp.git completed! +Mar 08, 2024 9:42:05 AM reposense.report.RepoCloner spawnCloneProcess +INFO: Cloning in parallel from https://github.com/AY2324S2-CS2103T-W11-2/tp.git... +Mar 08, 2024 9:42:05 AM reposense.commits.CommitInfoExtractor extractCommitInfos INFO: Extracting commits info for https://github.com/AY2324S2-CS2103T-T09-2/tp.git (master)... -Mar 08, 2024 4:11:40 AM reposense.report.RepoCloner waitForCloneProcess +Mar 08, 2024 9:42:05 AM reposense.report.RepoCloner waitForCloneProcess +INFO: Waiting for cloning of https://github.com/AY2324S2-CS2103T-W11-2/tp.git to complete... +Mar 08, 2024 9:42:05 AM reposense.commits.CommitInfoExtractor extractCommitInfos +INFO: Extracting commits info for https://github.com/AY2324S2-CS2103T-W12-4/tp.git (master)... +Mar 08, 2024 9:42:05 AM reposense.commits.CommitInfoAnalyzer analyzeCommits +INFO: Analyzing commits info for https://github.com/AY2324S2-CS2103T-T09-2/tp.git (master)... +Mar 08, 2024 9:42:05 AM reposense.report.ReportGenerator analyzeRepo +INFO: Analysis of https://github.com/AY2324S2-CS2103T-T09-2/tp.git (master) completed! +Mar 08, 2024 9:42:05 AM reposense.report.RepoCloner waitForCloneProcess INFO: Cloning of https://github.com/AY2324S2-CS2103-F08-1/tp.git completed! -Mar 08, 2024 4:11:40 AM reposense.report.RepoCloner spawnCloneProcess +Mar 08, 2024 9:42:05 AM reposense.report.ReportGenerator analyzeRepos +INFO: [74/92] Analyzing https://github.com/AY2324S2-CS2103T-W12-3/tp.git (master)... +Mar 08, 2024 9:42:05 AM reposense.report.RepoCloner spawnCloneProcess INFO: Cloning in parallel from https://github.com/AY2324S2-CS2103T-W09-2/tp.git... -Mar 08, 2024 4:11:40 AM reposense.report.RepoCloner waitForCloneProcess +Mar 08, 2024 9:42:05 AM reposense.report.RepoCloner waitForCloneProcess INFO: Waiting for cloning of https://github.com/AY2324S2-CS2103T-W09-2/tp.git to complete... -Mar 08, 2024 4:11:40 AM reposense.commits.CommitInfoAnalyzer analyzeCommits -INFO: Analyzing commits info for https://github.com/AY2324S2-CS2103T-T09-2/tp.git (master)... -Mar 08, 2024 4:11:40 AM reposense.report.ReportGenerator analyzeRepo -INFO: Analysis of https://github.com/AY2324S2-CS2103T-T09-2/tp.git (master) completed! -Mar 08, 2024 4:11:40 AM reposense.report.ReportGenerator analyzeRepos -INFO: [75/92] Analyzing https://github.com/AY2324S2-CS2103-F08-3/tp.git (master)... -Mar 08, 2024 4:11:41 AM reposense.report.RepoCloner waitForCloneProcess +Mar 08, 2024 9:42:05 AM reposense.report.RepoCloner waitForCloneProcess INFO: Cloning of https://github.com/AY2324S2-CS2103T-W08-1/tp.git completed! -Mar 08, 2024 4:11:41 AM reposense.report.RepoCloner spawnCloneProcess +Mar 08, 2024 9:42:05 AM reposense.commits.CommitInfoExtractor extractCommitInfos +INFO: Extracting commits info for https://github.com/AY2324S2-CS2103T-T15-4/tp.git (master)... +Mar 08, 2024 9:42:05 AM reposense.report.RepoCloner spawnCloneProcess INFO: Cloning in parallel from https://github.com/AY2324S2-CS2103T-W09-4/tp.git... -Mar 08, 2024 4:11:41 AM reposense.report.RepoCloner waitForCloneProcess +Mar 08, 2024 9:42:05 AM reposense.commits.CommitInfoAnalyzer analyzeCommits +INFO: Analyzing commits info for https://github.com/AY2324S2-CS2103T-W12-4/tp.git (master)... +Mar 08, 2024 9:42:05 AM reposense.report.ReportGenerator analyzeRepo +INFO: Analysis of https://github.com/AY2324S2-CS2103T-W12-4/tp.git (master) completed! +Mar 08, 2024 9:42:05 AM reposense.report.ReportGenerator updateRepoConfig +INFO: https://github.com/AY2324S2-CS2103T-W12-3/tp.git (master) does not contain a standalone config file. +Mar 08, 2024 9:42:05 AM reposense.authorship.FileInfoExtractor extractTextFileInfos +INFO: Extracting relevant file info from https://github.com/AY2324S2-CS2103T-W12-3/tp.git (master)... +Mar 08, 2024 9:42:05 AM reposense.report.ReportGenerator analyzeRepos +INFO: [75/92] Analyzing https://github.com/AY2324S2-CS2103-F08-3/tp.git (master)... +Mar 08, 2024 9:42:05 AM reposense.report.RepoCloner waitForCloneProcess INFO: Waiting for cloning of https://github.com/AY2324S2-CS2103T-W09-4/tp.git to complete... -Mar 08, 2024 4:11:41 AM reposense.report.ReportGenerator updateRepoConfig +Mar 08, 2024 9:42:06 AM reposense.report.ReportGenerator updateRepoConfig INFO: https://github.com/AY2324S2-CS2103-F08-3/tp.git (master) does not contain a standalone config file. -Mar 08, 2024 4:11:41 AM reposense.authorship.FileInfoExtractor extractTextFileInfos +Mar 08, 2024 9:42:06 AM reposense.authorship.FileInfoExtractor extractTextFileInfos INFO: Extracting relevant file info from https://github.com/AY2324S2-CS2103-F08-3/tp.git (master)... -Mar 08, 2024 4:11:41 AM reposense.report.RepoCloner waitForCloneProcess +Mar 08, 2024 9:42:06 AM reposense.commits.CommitInfoAnalyzer analyzeCommits +INFO: Analyzing commits info for https://github.com/AY2324S2-CS2103T-T15-4/tp.git (master)... +Mar 08, 2024 9:42:06 AM reposense.report.ReportGenerator analyzeRepo +INFO: Analysis of https://github.com/AY2324S2-CS2103T-T15-4/tp.git (master) completed! +Mar 08, 2024 9:42:06 AM reposense.report.ReportGenerator analyzeRepos +INFO: [76/92] Analyzing https://github.com/AY2324S2-CS2103-F08-1/tp.git (master)... +Mar 08, 2024 9:42:06 AM reposense.report.RepoCloner waitForCloneProcess INFO: Cloning of https://github.com/AY2324S2-CS2103T-T12-1/tp.git completed! -Mar 08, 2024 4:11:41 AM reposense.report.RepoCloner spawnCloneProcess +Mar 08, 2024 9:42:06 AM reposense.report.RepoCloner spawnCloneProcess INFO: Cloning in parallel from https://github.com/AY2324S2-CS2103T-T12-3/tp.git... -Mar 08, 2024 4:11:41 AM reposense.report.RepoCloner waitForCloneProcess +Mar 08, 2024 9:42:06 AM reposense.report.ReportGenerator updateRepoConfig +INFO: https://github.com/AY2324S2-CS2103-F08-1/tp.git (master) does not contain a standalone config file. +Mar 08, 2024 9:42:06 AM reposense.authorship.FileInfoExtractor extractTextFileInfos +INFO: Extracting relevant file info from https://github.com/AY2324S2-CS2103-F08-1/tp.git (master)... +Mar 08, 2024 9:42:06 AM reposense.report.RepoCloner waitForCloneProcess INFO: Waiting for cloning of https://github.com/AY2324S2-CS2103T-T12-3/tp.git to complete... -Mar 08, 2024 4:11:41 AM reposense.commits.CommitInfoExtractor extractCommitInfos -INFO: Extracting commits info for https://github.com/AY2324S2-CS2103T-T15-4/tp.git (master)... -Mar 08, 2024 4:11:41 AM reposense.report.RepoCloner waitForCloneProcess +Mar 08, 2024 9:42:07 AM reposense.report.RepoCloner waitForCloneProcess INFO: Cloning of https://github.com/AY2324S2-CS2103T-W11-2/tp.git completed! -Mar 08, 2024 4:11:41 AM reposense.commits.CommitInfoAnalyzer analyzeCommits -INFO: Analyzing commits info for https://github.com/AY2324S2-CS2103T-T15-4/tp.git (master)... -Mar 08, 2024 4:11:41 AM reposense.report.ReportGenerator analyzeRepo -INFO: Analysis of https://github.com/AY2324S2-CS2103T-T15-4/tp.git (master) completed! -Mar 08, 2024 4:11:41 AM reposense.report.RepoCloner spawnCloneProcess +Mar 08, 2024 9:42:07 AM reposense.commits.CommitInfoExtractor extractCommitInfos +INFO: Extracting commits info for https://github.com/AY2324S2-CS2103-F08-3/tp.git (master)... +Mar 08, 2024 9:42:07 AM reposense.report.RepoCloner spawnCloneProcess INFO: Cloning in parallel from https://github.com/AY2324S2-CS2103T-F14-2/tp.git... -Mar 08, 2024 4:11:41 AM reposense.report.RepoCloner waitForCloneProcess +Mar 08, 2024 9:42:07 AM reposense.report.RepoCloner waitForCloneProcess INFO: Waiting for cloning of https://github.com/AY2324S2-CS2103T-F14-2/tp.git to complete... -Mar 08, 2024 4:11:41 AM reposense.report.ReportGenerator analyzeRepos -INFO: [76/92] Analyzing https://github.com/AY2324S2-CS2103-F08-1/tp.git (master)... -Mar 08, 2024 4:11:41 AM reposense.commits.CommitInfoExtractor extractCommitInfos -INFO: Extracting commits info for https://github.com/AY2324S2-CS2103-F08-3/tp.git (master)... -Mar 08, 2024 4:11:42 AM reposense.report.ReportGenerator updateRepoConfig -INFO: https://github.com/AY2324S2-CS2103-F08-1/tp.git (master) does not contain a standalone config file. -Mar 08, 2024 4:11:42 AM reposense.authorship.FileInfoExtractor extractTextFileInfos -INFO: Extracting relevant file info from https://github.com/AY2324S2-CS2103-F08-1/tp.git (master)... -Mar 08, 2024 4:11:42 AM reposense.commits.CommitInfoAnalyzer analyzeCommits -INFO: Analyzing commits info for https://github.com/AY2324S2-CS2103-F08-3/tp.git (master)... -Mar 08, 2024 4:11:42 AM reposense.report.ReportGenerator analyzeRepo -INFO: Analysis of https://github.com/AY2324S2-CS2103-F08-3/tp.git (master) completed! -Mar 08, 2024 4:11:42 AM reposense.report.ReportGenerator analyzeRepos -INFO: [77/92] Analyzing https://github.com/AY2324S2-CS2103T-W08-1/tp.git (master)... -Mar 08, 2024 4:11:42 AM reposense.report.RepoCloner waitForCloneProcess +Mar 08, 2024 9:42:07 AM reposense.report.RepoCloner waitForCloneProcess INFO: Cloning of https://github.com/AY2324S2-CS2103T-W09-2/tp.git completed! -Mar 08, 2024 4:11:42 AM reposense.report.RepoCloner spawnCloneProcess +Mar 08, 2024 9:42:07 AM reposense.report.RepoCloner spawnCloneProcess INFO: Cloning in parallel from https://github.com/AY2324S2-CS2103T-T11-3/tp.git... -Mar 08, 2024 4:11:42 AM reposense.report.RepoCloner waitForCloneProcess +Mar 08, 2024 9:42:07 AM reposense.report.RepoCloner waitForCloneProcess INFO: Waiting for cloning of https://github.com/AY2324S2-CS2103T-T11-3/tp.git to complete... -Mar 08, 2024 4:11:42 AM reposense.report.ReportGenerator updateRepoConfig +Mar 08, 2024 9:42:07 AM reposense.commits.CommitInfoAnalyzer analyzeCommits +INFO: Analyzing commits info for https://github.com/AY2324S2-CS2103-F08-3/tp.git (master)... +Mar 08, 2024 9:42:07 AM reposense.report.ReportGenerator analyzeRepo +INFO: Analysis of https://github.com/AY2324S2-CS2103-F08-3/tp.git (master) completed! +Mar 08, 2024 9:42:07 AM reposense.report.ReportGenerator analyzeRepos +INFO: [77/92] Analyzing https://github.com/AY2324S2-CS2103T-W08-1/tp.git (master)... +Mar 08, 2024 9:42:07 AM reposense.report.RepoCloner waitForCloneProcess +INFO: Cloning of https://github.com/AY2324S2-CS2103T-W09-4/tp.git completed! +Mar 08, 2024 9:42:07 AM reposense.report.ReportGenerator updateRepoConfig INFO: https://github.com/AY2324S2-CS2103T-W08-1/tp.git (master) does not contain a standalone config file. -Mar 08, 2024 4:11:42 AM reposense.authorship.FileInfoExtractor extractTextFileInfos +Mar 08, 2024 9:42:07 AM reposense.authorship.FileInfoExtractor extractTextFileInfos INFO: Extracting relevant file info from https://github.com/AY2324S2-CS2103T-W08-1/tp.git (master)... -Mar 08, 2024 4:11:42 AM reposense.report.RepoCloner waitForCloneProcess -INFO: Cloning of https://github.com/AY2324S2-CS2103T-W09-4/tp.git completed! -Mar 08, 2024 4:11:42 AM reposense.report.RepoCloner spawnCloneProcess +Mar 08, 2024 9:42:07 AM reposense.report.RepoCloner spawnCloneProcess INFO: Cloning in parallel from https://github.com/AY2324S2-CS2103T-F12-1/tp.git... -Mar 08, 2024 4:11:42 AM reposense.report.RepoCloner waitForCloneProcess +Mar 08, 2024 9:42:07 AM reposense.commits.CommitInfoExtractor extractCommitInfos +INFO: Extracting commits info for https://github.com/AY2324S2-CS2103-F08-1/tp.git (master)... +Mar 08, 2024 9:42:07 AM reposense.report.RepoCloner waitForCloneProcess INFO: Waiting for cloning of https://github.com/AY2324S2-CS2103T-F12-1/tp.git to complete... -Mar 08, 2024 4:11:42 AM reposense.report.RepoCloner waitForCloneProcess +Mar 08, 2024 9:42:07 AM reposense.report.RepoCloner waitForCloneProcess INFO: Cloning of https://github.com/AY2324S2-CS2103T-T12-3/tp.git completed! -Mar 08, 2024 4:11:43 AM reposense.report.RepoCloner spawnCloneProcess +Mar 08, 2024 9:42:07 AM reposense.report.RepoCloner spawnCloneProcess INFO: Cloning in parallel from https://github.com/AY2324S2-CS2103T-T17-3/tp.git... -Mar 08, 2024 4:11:43 AM reposense.report.RepoCloner waitForCloneProcess +Mar 08, 2024 9:42:08 AM reposense.report.RepoCloner waitForCloneProcess INFO: Waiting for cloning of https://github.com/AY2324S2-CS2103T-T17-3/tp.git to complete... -Mar 08, 2024 4:11:43 AM reposense.commits.CommitInfoExtractor extractCommitInfos -INFO: Extracting commits info for https://github.com/AY2324S2-CS2103-F08-1/tp.git (master)... -Mar 08, 2024 4:11:43 AM reposense.commits.CommitInfoExtractor extractCommitInfos -INFO: Extracting commits info for https://github.com/AY2324S2-CS2103T-W12-3/tp.git (master)... -Mar 08, 2024 4:11:43 AM reposense.commits.CommitInfoExtractor extractCommitInfos +Mar 08, 2024 9:42:08 AM reposense.commits.CommitInfoAnalyzer analyzeCommits +INFO: Analyzing commits info for https://github.com/AY2324S2-CS2103-F08-1/tp.git (master)... +Mar 08, 2024 9:42:08 AM reposense.report.ReportGenerator analyzeRepo +INFO: Analysis of https://github.com/AY2324S2-CS2103-F08-1/tp.git (master) completed! +Mar 08, 2024 9:42:08 AM reposense.report.ReportGenerator analyzeRepos +INFO: [78/92] Analyzing https://github.com/AY2324S2-CS2103T-T12-1/tp.git (master)... +Mar 08, 2024 9:42:08 AM reposense.report.ReportGenerator updateRepoConfig +INFO: https://github.com/AY2324S2-CS2103T-T12-1/tp.git (master) does not contain a standalone config file. +Mar 08, 2024 9:42:08 AM reposense.authorship.FileInfoExtractor extractTextFileInfos +INFO: Extracting relevant file info from https://github.com/AY2324S2-CS2103T-T12-1/tp.git (master)... +Mar 08, 2024 9:42:08 AM reposense.commits.CommitInfoExtractor extractCommitInfos INFO: Extracting commits info for https://github.com/AY2324S2-CS2103T-W08-1/tp.git (master)... -Mar 08, 2024 4:11:43 AM reposense.report.RepoCloner waitForCloneProcess +Mar 08, 2024 9:42:08 AM reposense.report.RepoCloner waitForCloneProcess INFO: Cloning of https://github.com/AY2324S2-CS2103T-F14-2/tp.git completed! -Mar 08, 2024 4:11:43 AM reposense.report.RepoCloner spawnCloneProcess +Mar 08, 2024 9:42:08 AM reposense.report.RepoCloner spawnCloneProcess INFO: Cloning in parallel from https://github.com/AY2324S2-CS2103T-T14-2/tp.git... -Mar 08, 2024 4:11:43 AM reposense.report.RepoCloner waitForCloneProcess +Mar 08, 2024 9:42:08 AM reposense.commits.CommitInfoExtractor extractCommitInfos +INFO: Extracting commits info for https://github.com/AY2324S2-CS2103T-T12-1/tp.git (master)... +Mar 08, 2024 9:42:08 AM reposense.report.RepoCloner waitForCloneProcess INFO: Waiting for cloning of https://github.com/AY2324S2-CS2103T-T14-2/tp.git to complete... -Mar 08, 2024 4:11:43 AM reposense.commits.CommitInfoAnalyzer analyzeCommits +Mar 08, 2024 9:42:08 AM reposense.commits.CommitInfoAnalyzer analyzeCommits INFO: Analyzing commits info for https://github.com/AY2324S2-CS2103T-W08-1/tp.git (master)... -Mar 08, 2024 4:11:43 AM reposense.commits.CommitInfoAnalyzer analyzeCommits -INFO: Analyzing commits info for https://github.com/AY2324S2-CS2103-F08-1/tp.git (master)... -Mar 08, 2024 4:11:43 AM reposense.report.ReportGenerator analyzeRepo -INFO: Analysis of https://github.com/AY2324S2-CS2103-F08-1/tp.git (master) completed! -Mar 08, 2024 4:11:43 AM reposense.report.ReportGenerator analyzeRepo +Mar 08, 2024 9:42:08 AM reposense.report.ReportGenerator analyzeRepo INFO: Analysis of https://github.com/AY2324S2-CS2103T-W08-1/tp.git (master) completed! -Mar 08, 2024 4:11:43 AM reposense.commits.CommitInfoAnalyzer analyzeCommits -INFO: Analyzing commits info for https://github.com/AY2324S2-CS2103T-W12-3/tp.git (master)... -Mar 08, 2024 4:11:43 AM reposense.report.ReportGenerator analyzeRepos -INFO: [78/92] Analyzing https://github.com/AY2324S2-CS2103T-T12-1/tp.git (master)... -Mar 08, 2024 4:11:43 AM reposense.report.ReportGenerator analyzeRepos +Mar 08, 2024 9:42:08 AM reposense.report.ReportGenerator analyzeRepos INFO: [79/92] Analyzing https://github.com/AY2324S2-CS2103T-W11-2/tp.git (master)... -Mar 08, 2024 4:11:43 AM reposense.report.ReportGenerator analyzeRepo -INFO: Analysis of https://github.com/AY2324S2-CS2103T-W12-3/tp.git (master) completed! -Mar 08, 2024 4:11:44 AM reposense.report.ReportGenerator analyzeRepos -INFO: [80/92] Analyzing https://github.com/AY2324S2-CS2103T-W09-2/tp.git (master)... -Mar 08, 2024 4:11:44 AM reposense.report.RepoCloner waitForCloneProcess -INFO: Cloning of https://github.com/AY2324S2-CS2103T-T11-3/tp.git completed! -Mar 08, 2024 4:11:44 AM reposense.report.ReportGenerator updateRepoConfig +Mar 08, 2024 9:42:09 AM reposense.report.RepoCloner waitForCloneProcess +INFO: Cloning of https://github.com/AY2324S2-CS2103T-F12-1/tp.git completed! +Mar 08, 2024 9:42:09 AM reposense.commits.CommitInfoAnalyzer analyzeCommits +INFO: Analyzing commits info for https://github.com/AY2324S2-CS2103T-T12-1/tp.git (master)... +Mar 08, 2024 9:42:09 AM reposense.report.ReportGenerator analyzeRepo +INFO: Analysis of https://github.com/AY2324S2-CS2103T-T12-1/tp.git (master) completed! +Mar 08, 2024 9:42:09 AM reposense.report.RepoCloner spawnCloneProcess +INFO: Cloning in parallel from https://github.com/AY2324S2-CS2103T-T08-2/tp.git... +Mar 08, 2024 9:42:09 AM reposense.report.ReportGenerator updateRepoConfig INFO: https://github.com/AY2324S2-CS2103T-W11-2/tp.git (master) does not contain a standalone config file. -Mar 08, 2024 4:11:44 AM reposense.authorship.FileInfoExtractor extractTextFileInfos +Mar 08, 2024 9:42:09 AM reposense.authorship.FileInfoExtractor extractTextFileInfos INFO: Extracting relevant file info from https://github.com/AY2324S2-CS2103T-W11-2/tp.git (master)... -Mar 08, 2024 4:11:44 AM reposense.report.RepoCloner spawnCloneProcess -INFO: Cloning in parallel from https://github.com/AY2324S2-CS2103T-T08-2/tp.git... -Mar 08, 2024 4:11:44 AM reposense.report.ReportGenerator updateRepoConfig -INFO: https://github.com/AY2324S2-CS2103T-T12-1/tp.git (master) does not contain a standalone config file. -Mar 08, 2024 4:11:44 AM reposense.authorship.FileInfoExtractor extractTextFileInfos -INFO: Extracting relevant file info from https://github.com/AY2324S2-CS2103T-T12-1/tp.git (master)... -Mar 08, 2024 4:11:44 AM reposense.report.ReportGenerator updateRepoConfig -INFO: https://github.com/AY2324S2-CS2103T-W09-2/tp.git (master) does not contain a standalone config file. -Mar 08, 2024 4:11:44 AM reposense.authorship.FileInfoExtractor extractTextFileInfos -INFO: Extracting relevant file info from https://github.com/AY2324S2-CS2103T-W09-2/tp.git (master)... -Mar 08, 2024 4:11:44 AM reposense.report.RepoCloner waitForCloneProcess +Mar 08, 2024 9:42:09 AM reposense.report.ReportGenerator analyzeRepos +INFO: [80/92] Analyzing https://github.com/AY2324S2-CS2103T-W09-2/tp.git (master)... +Mar 08, 2024 9:42:09 AM reposense.report.RepoCloner waitForCloneProcess INFO: Waiting for cloning of https://github.com/AY2324S2-CS2103T-T08-2/tp.git to complete... -Mar 08, 2024 4:11:44 AM reposense.report.RepoCloner waitForCloneProcess -INFO: Cloning of https://github.com/AY2324S2-CS2103T-T17-3/tp.git completed! -Mar 08, 2024 4:11:44 AM reposense.report.RepoCloner spawnCloneProcess +Mar 08, 2024 9:42:09 AM reposense.report.RepoCloner waitForCloneProcess +INFO: Cloning of https://github.com/AY2324S2-CS2103T-T11-3/tp.git completed! +Mar 08, 2024 9:42:09 AM reposense.report.RepoCloner spawnCloneProcess INFO: Cloning in parallel from https://github.com/AY2324S2-CS2103T-T17-1/tp.git... -Mar 08, 2024 4:11:44 AM reposense.report.RepoCloner waitForCloneProcess -INFO: Cloning of https://github.com/AY2324S2-CS2103T-F12-1/tp.git completed! -Mar 08, 2024 4:11:44 AM reposense.report.RepoCloner waitForCloneProcess +Mar 08, 2024 9:42:09 AM reposense.report.RepoCloner waitForCloneProcess INFO: Waiting for cloning of https://github.com/AY2324S2-CS2103T-T17-1/tp.git to complete... -Mar 08, 2024 4:11:44 AM reposense.report.RepoCloner spawnCloneProcess +Mar 08, 2024 9:42:09 AM reposense.report.ReportGenerator updateRepoConfig +INFO: https://github.com/AY2324S2-CS2103T-W09-2/tp.git (master) does not contain a standalone config file. +Mar 08, 2024 9:42:09 AM reposense.authorship.FileInfoExtractor extractTextFileInfos +INFO: Extracting relevant file info from https://github.com/AY2324S2-CS2103T-W09-2/tp.git (master)... +Mar 08, 2024 9:42:09 AM reposense.commits.CommitInfoExtractor extractCommitInfos +INFO: Extracting commits info for https://github.com/AY2324S2-CS2103T-W12-3/tp.git (master)... +Mar 08, 2024 9:42:09 AM reposense.report.RepoCloner waitForCloneProcess +INFO: Cloning of https://github.com/AY2324S2-CS2103T-T17-3/tp.git completed! +Mar 08, 2024 9:42:09 AM reposense.report.RepoCloner spawnCloneProcess INFO: Cloning in parallel from https://github.com/AY2324S2-CS2103T-W13-1/tp.git... -Mar 08, 2024 4:11:44 AM reposense.report.RepoCloner waitForCloneProcess +Mar 08, 2024 9:42:09 AM reposense.report.RepoCloner waitForCloneProcess INFO: Waiting for cloning of https://github.com/AY2324S2-CS2103T-W13-1/tp.git to complete... -Mar 08, 2024 4:11:44 AM reposense.commits.CommitInfoExtractor extractCommitInfos -INFO: Extracting commits info for https://github.com/AY2324S2-CS2103T-T12-1/tp.git (master)... -Mar 08, 2024 4:11:44 AM reposense.commits.CommitInfoAnalyzer analyzeCommits -INFO: Analyzing commits info for https://github.com/AY2324S2-CS2103T-T12-1/tp.git (master)... -Mar 08, 2024 4:11:44 AM reposense.report.ReportGenerator analyzeRepo -INFO: Analysis of https://github.com/AY2324S2-CS2103T-T12-1/tp.git (master) completed! -Mar 08, 2024 4:11:44 AM reposense.report.ReportGenerator analyzeRepos +Mar 08, 2024 9:42:09 AM reposense.commits.CommitInfoAnalyzer analyzeCommits +INFO: Analyzing commits info for https://github.com/AY2324S2-CS2103T-W12-3/tp.git (master)... +Mar 08, 2024 9:42:09 AM reposense.report.ReportGenerator analyzeRepo +INFO: Analysis of https://github.com/AY2324S2-CS2103T-W12-3/tp.git (master) completed! +Mar 08, 2024 9:42:09 AM reposense.report.ReportGenerator analyzeRepos INFO: [81/92] Analyzing https://github.com/AY2324S2-CS2103T-W09-4/tp.git (master)... -Mar 08, 2024 4:11:45 AM reposense.report.ReportGenerator updateRepoConfig +Mar 08, 2024 9:42:09 AM reposense.report.ReportGenerator updateRepoConfig INFO: https://github.com/AY2324S2-CS2103T-W09-4/tp.git (master) does not contain a standalone config file. -Mar 08, 2024 4:11:45 AM reposense.authorship.FileInfoExtractor extractTextFileInfos +Mar 08, 2024 9:42:09 AM reposense.authorship.FileInfoExtractor extractTextFileInfos INFO: Extracting relevant file info from https://github.com/AY2324S2-CS2103T-W09-4/tp.git (master)... -Mar 08, 2024 4:11:45 AM reposense.report.RepoCloner waitForCloneProcess +Mar 08, 2024 9:42:10 AM reposense.report.RepoCloner waitForCloneProcess +INFO: Cloning of https://github.com/AY2324S2-CS2103T-T08-2/tp.git completed! +Mar 08, 2024 9:42:10 AM reposense.report.RepoCloner waitForCloneProcess INFO: Cloning of https://github.com/AY2324S2-CS2103T-T14-2/tp.git completed! -Mar 08, 2024 4:11:45 AM reposense.report.RepoCloner spawnCloneProcess +Mar 08, 2024 9:42:10 AM reposense.report.RepoCloner spawnCloneProcess INFO: Cloning in parallel from https://github.com/AY2324S2-CS2103T-F12-3/tp.git... -Mar 08, 2024 4:11:45 AM reposense.report.RepoCloner waitForCloneProcess +Mar 08, 2024 9:42:10 AM reposense.report.RepoCloner waitForCloneProcess INFO: Waiting for cloning of https://github.com/AY2324S2-CS2103T-F12-3/tp.git to complete... -Mar 08, 2024 4:11:45 AM reposense.report.RepoCloner waitForCloneProcess -INFO: Cloning of https://github.com/AY2324S2-CS2103T-T08-2/tp.git completed! -Mar 08, 2024 4:11:45 AM reposense.report.RepoCloner spawnCloneProcess +Mar 08, 2024 9:42:10 AM reposense.report.RepoCloner spawnCloneProcess INFO: Cloning in parallel from https://github.com/AY2324S2-CS2103T-T11-1/tp.git... -Mar 08, 2024 4:11:45 AM reposense.report.RepoCloner waitForCloneProcess +Mar 08, 2024 9:42:10 AM reposense.report.RepoCloner waitForCloneProcess INFO: Waiting for cloning of https://github.com/AY2324S2-CS2103T-T11-1/tp.git to complete... -Mar 08, 2024 4:11:45 AM reposense.report.RepoCloner waitForCloneProcess -INFO: Cloning of https://github.com/AY2324S2-CS2103T-W13-1/tp.git completed! -Mar 08, 2024 4:11:45 AM reposense.commits.CommitInfoExtractor extractCommitInfos -INFO: Extracting commits info for https://github.com/AY2324S2-CS2103T-W11-2/tp.git (master)... -Mar 08, 2024 4:11:45 AM reposense.report.RepoCloner waitForCloneProcess +Mar 08, 2024 9:42:10 AM reposense.report.RepoCloner waitForCloneProcess INFO: Cloning of https://github.com/AY2324S2-CS2103T-T17-1/tp.git completed! -Mar 08, 2024 4:11:45 AM reposense.commits.CommitInfoExtractor extractCommitInfos +Mar 08, 2024 9:42:10 AM reposense.commits.CommitInfoExtractor extractCommitInfos +INFO: Extracting commits info for https://github.com/AY2324S2-CS2103T-W11-2/tp.git (master)... +Mar 08, 2024 9:42:10 AM reposense.commits.CommitInfoExtractor extractCommitInfos INFO: Extracting commits info for https://github.com/AY2324S2-CS2103T-W09-4/tp.git (master)... -Mar 08, 2024 4:11:46 AM reposense.commits.CommitInfoAnalyzer analyzeCommits +Mar 08, 2024 9:42:10 AM reposense.report.RepoCloner waitForCloneProcess +INFO: Cloning of https://github.com/AY2324S2-CS2103T-W13-1/tp.git completed! +Mar 08, 2024 9:42:10 AM reposense.commits.CommitInfoAnalyzer analyzeCommits INFO: Analyzing commits info for https://github.com/AY2324S2-CS2103T-W11-2/tp.git (master)... -Mar 08, 2024 4:11:46 AM reposense.report.ReportGenerator analyzeRepo +Mar 08, 2024 9:42:10 AM reposense.report.ReportGenerator analyzeRepo INFO: Analysis of https://github.com/AY2324S2-CS2103T-W11-2/tp.git (master) completed! -Mar 08, 2024 4:11:46 AM reposense.commits.CommitInfoExtractor extractCommitInfos -INFO: Extracting commits info for https://github.com/AY2324S2-CS2103T-W09-2/tp.git (master)... -Mar 08, 2024 4:11:46 AM reposense.report.ReportGenerator analyzeRepos +Mar 08, 2024 9:42:10 AM reposense.report.ReportGenerator analyzeRepos INFO: [82/92] Analyzing https://github.com/AY2324S2-CS2103T-T12-3/tp.git (master)... -Mar 08, 2024 4:11:46 AM reposense.commits.CommitInfoAnalyzer analyzeCommits -INFO: Analyzing commits info for https://github.com/AY2324S2-CS2103T-W09-4/tp.git (master)... -Mar 08, 2024 4:11:46 AM reposense.report.ReportGenerator analyzeRepo -INFO: Analysis of https://github.com/AY2324S2-CS2103T-W09-4/tp.git (master) completed! -Mar 08, 2024 4:11:46 AM reposense.report.ReportGenerator updateRepoConfig +Mar 08, 2024 9:42:10 AM reposense.report.ReportGenerator updateRepoConfig INFO: https://github.com/AY2324S2-CS2103T-T12-3/tp.git (master) does not contain a standalone config file. -Mar 08, 2024 4:11:46 AM reposense.authorship.FileInfoExtractor extractTextFileInfos +Mar 08, 2024 9:42:10 AM reposense.authorship.FileInfoExtractor extractTextFileInfos INFO: Extracting relevant file info from https://github.com/AY2324S2-CS2103T-T12-3/tp.git (master)... -Mar 08, 2024 4:11:46 AM reposense.report.ReportGenerator analyzeRepos +Mar 08, 2024 9:42:10 AM reposense.commits.CommitInfoAnalyzer analyzeCommits +INFO: Analyzing commits info for https://github.com/AY2324S2-CS2103T-W09-4/tp.git (master)... +Mar 08, 2024 9:42:10 AM reposense.report.ReportGenerator analyzeRepo +INFO: Analysis of https://github.com/AY2324S2-CS2103T-W09-4/tp.git (master) completed! +Mar 08, 2024 9:42:11 AM reposense.report.ReportGenerator analyzeRepos INFO: [83/92] Analyzing https://github.com/AY2324S2-CS2103T-F14-2/tp.git (master)... -Mar 08, 2024 4:11:46 AM reposense.commits.CommitInfoAnalyzer analyzeCommits +Mar 08, 2024 9:42:11 AM reposense.commits.CommitInfoExtractor extractCommitInfos +INFO: Extracting commits info for https://github.com/AY2324S2-CS2103-T14-1/tp.git (master)... +Mar 08, 2024 9:42:11 AM reposense.report.ReportGenerator updateRepoConfig +INFO: https://github.com/AY2324S2-CS2103T-F14-2/tp.git (master) does not contain a standalone config file. +Mar 08, 2024 9:42:11 AM reposense.authorship.FileInfoExtractor extractTextFileInfos +INFO: Extracting relevant file info from https://github.com/AY2324S2-CS2103T-F14-2/tp.git (master)... +Mar 08, 2024 9:42:11 AM reposense.commits.CommitInfoExtractor extractCommitInfos +INFO: Extracting commits info for https://github.com/AY2324S2-CS2103T-W09-2/tp.git (master)... +Mar 08, 2024 9:42:11 AM reposense.commits.CommitInfoExtractor extractCommitInfos +INFO: Extracting commits info for https://github.com/AY2324S2-CS2103T-T12-3/tp.git (master)... +Mar 08, 2024 9:42:11 AM reposense.commits.CommitInfoAnalyzer analyzeCommits +INFO: Analyzing commits info for https://github.com/AY2324S2-CS2103-T14-1/tp.git (master)... +Mar 08, 2024 9:42:11 AM reposense.report.ReportGenerator analyzeRepo +INFO: Analysis of https://github.com/AY2324S2-CS2103-T14-1/tp.git (master) completed! +Mar 08, 2024 9:42:11 AM reposense.commits.CommitInfoAnalyzer analyzeCommits +INFO: Analyzing commits info for https://github.com/AY2324S2-CS2103T-T12-3/tp.git (master)... +Mar 08, 2024 9:42:11 AM reposense.report.ReportGenerator analyzeRepo +INFO: Analysis of https://github.com/AY2324S2-CS2103T-T12-3/tp.git (master) completed! +Mar 08, 2024 9:42:11 AM reposense.report.ReportGenerator analyzeRepos +INFO: [84/92] Analyzing https://github.com/AY2324S2-CS2103T-F12-1/tp.git (master)... +Mar 08, 2024 9:42:11 AM reposense.commits.CommitInfoAnalyzer analyzeCommits INFO: Analyzing commits info for https://github.com/AY2324S2-CS2103T-W09-2/tp.git (master)... -Mar 08, 2024 4:11:46 AM reposense.report.ReportGenerator analyzeRepo +Mar 08, 2024 9:42:11 AM reposense.report.RepoCloner waitForCloneProcess +INFO: Cloning of https://github.com/AY2324S2-CS2103T-T11-1/tp.git completed! +Mar 08, 2024 9:42:11 AM reposense.report.ReportGenerator analyzeRepo INFO: Analysis of https://github.com/AY2324S2-CS2103T-W09-2/tp.git (master) completed! -Mar 08, 2024 4:11:46 AM reposense.report.ReportGenerator analyzeRepos -INFO: [84/92] Analyzing https://github.com/AY2324S2-CS2103T-T11-3/tp.git (master)... -Mar 08, 2024 4:11:46 AM reposense.commits.CommitInfoExtractor extractCommitInfos -INFO: Extracting commits info for https://github.com/AY2324S2-CS2103T-T12-3/tp.git (master)... -Mar 08, 2024 4:11:46 AM reposense.report.RepoCloner waitForCloneProcess +Mar 08, 2024 9:42:11 AM reposense.report.RepoCloner waitForCloneProcess INFO: Cloning of https://github.com/AY2324S2-CS2103T-F12-3/tp.git completed! -Mar 08, 2024 4:11:46 AM reposense.report.ReportGenerator updateRepoConfig -INFO: https://github.com/AY2324S2-CS2103T-F14-2/tp.git (master) does not contain a standalone config file. -Mar 08, 2024 4:11:46 AM reposense.authorship.FileInfoExtractor extractTextFileInfos -INFO: Extracting relevant file info from https://github.com/AY2324S2-CS2103T-F14-2/tp.git (master)... -Mar 08, 2024 4:11:46 AM reposense.report.ReportGenerator updateRepoConfig +Mar 08, 2024 9:42:11 AM reposense.report.ReportGenerator analyzeRepos +INFO: [85/92] Analyzing https://github.com/AY2324S2-CS2103T-T11-3/tp.git (master)... +Mar 08, 2024 9:42:11 AM reposense.report.ReportGenerator analyzeRepos +INFO: [86/92] Analyzing https://github.com/AY2324S2-CS2103T-T17-3/tp.git (master)... +Mar 08, 2024 9:42:11 AM reposense.report.ReportGenerator updateRepoConfig +INFO: https://github.com/AY2324S2-CS2103T-F12-1/tp.git (master) does not contain a standalone config file. +Mar 08, 2024 9:42:11 AM reposense.authorship.FileInfoExtractor extractTextFileInfos +INFO: Extracting relevant file info from https://github.com/AY2324S2-CS2103T-F12-1/tp.git (master)... +Mar 08, 2024 9:42:11 AM reposense.report.ReportGenerator updateRepoConfig INFO: https://github.com/AY2324S2-CS2103T-T11-3/tp.git (master) does not contain a standalone config file. -Mar 08, 2024 4:11:46 AM reposense.authorship.FileInfoExtractor extractTextFileInfos +Mar 08, 2024 9:42:11 AM reposense.authorship.FileInfoExtractor extractTextFileInfos INFO: Extracting relevant file info from https://github.com/AY2324S2-CS2103T-T11-3/tp.git (master)... -Mar 08, 2024 4:11:46 AM reposense.commits.CommitInfoAnalyzer analyzeCommits -INFO: Analyzing commits info for https://github.com/AY2324S2-CS2103T-T12-3/tp.git (master)... -Mar 08, 2024 4:11:46 AM reposense.report.ReportGenerator analyzeRepo -INFO: Analysis of https://github.com/AY2324S2-CS2103T-T12-3/tp.git (master) completed! -Mar 08, 2024 4:11:46 AM reposense.report.ReportGenerator analyzeRepos -INFO: [85/92] Analyzing https://github.com/AY2324S2-CS2103T-T17-3/tp.git (master)... -Mar 08, 2024 4:11:46 AM reposense.commits.CommitInfoExtractor extractCommitInfos -INFO: Extracting commits info for https://github.com/AY2324S2-CS2103-T14-1/tp.git (master)... -Mar 08, 2024 4:11:46 AM reposense.report.ReportGenerator updateRepoConfig +Mar 08, 2024 9:42:11 AM reposense.report.ReportGenerator updateRepoConfig INFO: https://github.com/AY2324S2-CS2103T-T17-3/tp.git (master) does not contain a standalone config file. -Mar 08, 2024 4:11:46 AM reposense.authorship.FileInfoExtractor extractTextFileInfos +Mar 08, 2024 9:42:11 AM reposense.authorship.FileInfoExtractor extractTextFileInfos INFO: Extracting relevant file info from https://github.com/AY2324S2-CS2103T-T17-3/tp.git (master)... -Mar 08, 2024 4:11:46 AM reposense.report.RepoCloner waitForCloneProcess -INFO: Cloning of https://github.com/AY2324S2-CS2103T-T11-1/tp.git completed! -Mar 08, 2024 4:11:46 AM reposense.commits.CommitInfoExtractor extractCommitInfos -INFO: Extracting commits info for https://github.com/AY2324S2-CS2103T-T11-3/tp.git (master)... -Mar 08, 2024 4:11:46 AM reposense.commits.CommitInfoAnalyzer analyzeCommits -INFO: Analyzing commits info for https://github.com/AY2324S2-CS2103-T14-1/tp.git (master)... -Mar 08, 2024 4:11:46 AM reposense.commits.CommitInfoExtractor extractCommitInfos +Mar 08, 2024 9:42:11 AM reposense.commits.CommitInfoExtractor extractCommitInfos INFO: Extracting commits info for https://github.com/AY2324S2-CS2103T-F14-2/tp.git (master)... -Mar 08, 2024 4:11:46 AM reposense.report.ReportGenerator analyzeRepo -INFO: Analysis of https://github.com/AY2324S2-CS2103-T14-1/tp.git (master) completed! -Mar 08, 2024 4:11:46 AM reposense.commits.CommitInfoAnalyzer analyzeCommits -INFO: Analyzing commits info for https://github.com/AY2324S2-CS2103T-T11-3/tp.git (master)... -Mar 08, 2024 4:11:46 AM reposense.report.ReportGenerator analyzeRepo -INFO: Analysis of https://github.com/AY2324S2-CS2103T-T11-3/tp.git (master) completed! -Mar 08, 2024 4:11:46 AM reposense.commits.CommitInfoExtractor extractCommitInfos -INFO: Extracting commits info for https://github.com/AY2324S2-CS2103T-T17-3/tp.git (master)... -Mar 08, 2024 4:11:46 AM reposense.report.ReportGenerator analyzeRepos -INFO: [86/92] Analyzing https://github.com/AY2324S2-CS2103T-F12-1/tp.git (master)... -Mar 08, 2024 4:11:46 AM reposense.report.ReportGenerator analyzeRepos -INFO: [87/92] Analyzing https://github.com/AY2324S2-CS2103T-T14-2/tp.git (master)... -Mar 08, 2024 4:11:46 AM reposense.commits.CommitInfoAnalyzer analyzeCommits +Mar 08, 2024 9:42:11 AM reposense.commits.CommitInfoExtractor extractCommitInfos +INFO: Extracting commits info for https://github.com/AY2324S2-CS2103T-F12-1/tp.git (master)... +Mar 08, 2024 9:42:11 AM reposense.commits.CommitInfoAnalyzer analyzeCommits INFO: Analyzing commits info for https://github.com/AY2324S2-CS2103T-F14-2/tp.git (master)... -Mar 08, 2024 4:11:46 AM reposense.report.ReportGenerator analyzeRepo +Mar 08, 2024 9:42:11 AM reposense.report.ReportGenerator analyzeRepo INFO: Analysis of https://github.com/AY2324S2-CS2103T-F14-2/tp.git (master) completed! -Mar 08, 2024 4:11:46 AM reposense.commits.CommitInfoAnalyzer analyzeCommits -INFO: Analyzing commits info for https://github.com/AY2324S2-CS2103T-T17-3/tp.git (master)... -Mar 08, 2024 4:11:46 AM reposense.report.ReportGenerator analyzeRepo -INFO: Analysis of https://github.com/AY2324S2-CS2103T-T17-3/tp.git (master) completed! -Mar 08, 2024 4:11:46 AM reposense.report.ReportGenerator updateRepoConfig -INFO: https://github.com/AY2324S2-CS2103T-F12-1/tp.git (master) does not contain a standalone config file. -Mar 08, 2024 4:11:46 AM reposense.authorship.FileInfoExtractor extractTextFileInfos -INFO: Extracting relevant file info from https://github.com/AY2324S2-CS2103T-F12-1/tp.git (master)... -Mar 08, 2024 4:11:46 AM reposense.report.ReportGenerator analyzeRepos -INFO: [88/92] Analyzing https://github.com/AY2324S2-CS2103T-T08-2/tp.git (master)... -Mar 08, 2024 4:11:46 AM reposense.report.ReportGenerator updateRepoConfig -INFO: https://github.com/AY2324S2-CS2103T-T14-2/tp.git (master) does not contain a standalone config file. -Mar 08, 2024 4:11:46 AM reposense.authorship.FileInfoExtractor extractTextFileInfos -INFO: Extracting relevant file info from https://github.com/AY2324S2-CS2103T-T14-2/tp.git (master)... -Mar 08, 2024 4:11:46 AM reposense.report.ReportGenerator analyzeRepos -INFO: [89/92] Analyzing https://github.com/AY2324S2-CS2103T-W13-1/tp.git (master)... -Mar 08, 2024 4:11:46 AM reposense.report.ReportGenerator updateRepoConfig +Mar 08, 2024 9:42:11 AM reposense.report.ReportGenerator analyzeRepos +INFO: [87/92] Analyzing https://github.com/AY2324S2-CS2103T-T08-2/tp.git (master)... +Mar 08, 2024 9:42:11 AM reposense.commits.CommitInfoAnalyzer analyzeCommits +INFO: Analyzing commits info for https://github.com/AY2324S2-CS2103T-F12-1/tp.git (master)... +Mar 08, 2024 9:42:11 AM reposense.report.ReportGenerator analyzeRepo +INFO: Analysis of https://github.com/AY2324S2-CS2103T-F12-1/tp.git (master) completed! +Mar 08, 2024 9:42:11 AM reposense.report.ReportGenerator analyzeRepos +INFO: [88/92] Analyzing https://github.com/AY2324S2-CS2103T-T14-2/tp.git (master)... +Mar 08, 2024 9:42:11 AM reposense.commits.CommitInfoExtractor extractCommitInfos +INFO: Extracting commits info for https://github.com/AY2324S2-CS2103T-T17-3/tp.git (master)... +Mar 08, 2024 9:42:11 AM reposense.commits.CommitInfoExtractor extractCommitInfos +INFO: Extracting commits info for https://github.com/AY2324S2-CS2103T-T11-3/tp.git (master)... +Mar 08, 2024 9:42:11 AM reposense.report.ReportGenerator updateRepoConfig INFO: https://github.com/AY2324S2-CS2103T-T08-2/tp.git (master) does not contain a standalone config file. -Mar 08, 2024 4:11:46 AM reposense.authorship.FileInfoExtractor extractTextFileInfos +Mar 08, 2024 9:42:11 AM reposense.authorship.FileInfoExtractor extractTextFileInfos INFO: Extracting relevant file info from https://github.com/AY2324S2-CS2103T-T08-2/tp.git (master)... -Mar 08, 2024 4:11:47 AM reposense.report.ReportGenerator updateRepoConfig +Mar 08, 2024 9:42:11 AM reposense.report.ReportGenerator updateRepoConfig +INFO: https://github.com/AY2324S2-CS2103T-T14-2/tp.git (master) does not contain a standalone config file. +Mar 08, 2024 9:42:11 AM reposense.authorship.FileInfoExtractor extractTextFileInfos +INFO: Extracting relevant file info from https://github.com/AY2324S2-CS2103T-T14-2/tp.git (master)... +Mar 08, 2024 9:42:11 AM reposense.commits.CommitInfoAnalyzer analyzeCommits +INFO: Analyzing commits info for https://github.com/AY2324S2-CS2103T-T17-3/tp.git (master)... +Mar 08, 2024 9:42:11 AM reposense.report.ReportGenerator analyzeRepo +INFO: Analysis of https://github.com/AY2324S2-CS2103T-T17-3/tp.git (master) completed! +Mar 08, 2024 9:42:11 AM reposense.commits.CommitInfoAnalyzer analyzeCommits +INFO: Analyzing commits info for https://github.com/AY2324S2-CS2103T-T11-3/tp.git (master)... +Mar 08, 2024 9:42:11 AM reposense.report.ReportGenerator analyzeRepo +INFO: Analysis of https://github.com/AY2324S2-CS2103T-T11-3/tp.git (master) completed! +Mar 08, 2024 9:42:11 AM reposense.report.ReportGenerator analyzeRepos +INFO: [89/92] Analyzing https://github.com/AY2324S2-CS2103T-T17-1/tp.git (master)... +Mar 08, 2024 9:42:11 AM reposense.report.ReportGenerator analyzeRepos +INFO: [90/92] Analyzing https://github.com/AY2324S2-CS2103T-W13-1/tp.git (master)... +Mar 08, 2024 9:42:11 AM reposense.report.ReportGenerator updateRepoConfig +INFO: https://github.com/AY2324S2-CS2103T-T17-1/tp.git (master) does not contain a standalone config file. +Mar 08, 2024 9:42:11 AM reposense.authorship.FileInfoExtractor extractTextFileInfos +INFO: Extracting relevant file info from https://github.com/AY2324S2-CS2103T-T17-1/tp.git (master)... +Mar 08, 2024 9:42:11 AM reposense.report.ReportGenerator updateRepoConfig INFO: https://github.com/AY2324S2-CS2103T-W13-1/tp.git (master) does not contain a standalone config file. -Mar 08, 2024 4:11:47 AM reposense.authorship.FileInfoExtractor extractTextFileInfos +Mar 08, 2024 9:42:11 AM reposense.authorship.FileInfoExtractor extractTextFileInfos INFO: Extracting relevant file info from https://github.com/AY2324S2-CS2103T-W13-1/tp.git (master)... -Mar 08, 2024 4:11:47 AM reposense.commits.CommitInfoExtractor extractCommitInfos -INFO: Extracting commits info for https://github.com/AY2324S2-CS2103T-F12-1/tp.git (master)... -Mar 08, 2024 4:11:47 AM reposense.commits.CommitInfoAnalyzer analyzeCommits -INFO: Analyzing commits info for https://github.com/AY2324S2-CS2103T-F12-1/tp.git (master)... -Mar 08, 2024 4:11:47 AM reposense.report.ReportGenerator analyzeRepo -INFO: Analysis of https://github.com/AY2324S2-CS2103T-F12-1/tp.git (master) completed! -Mar 08, 2024 4:11:47 AM reposense.commits.CommitInfoExtractor extractCommitInfos +Mar 08, 2024 9:42:12 AM reposense.commits.CommitInfoExtractor extractCommitInfos INFO: Extracting commits info for https://github.com/AY2324S2-CS2103T-T14-2/tp.git (master)... -Mar 08, 2024 4:11:47 AM reposense.commits.CommitInfoExtractor extractCommitInfos -INFO: Extracting commits info for https://github.com/AY2324S2-CS2103T-W13-1/tp.git (master)... -Mar 08, 2024 4:11:47 AM reposense.report.ReportGenerator analyzeRepos -INFO: [90/92] Analyzing https://github.com/AY2324S2-CS2103T-T17-1/tp.git (master)... -Mar 08, 2024 4:11:47 AM reposense.commits.CommitInfoAnalyzer analyzeCommits +Mar 08, 2024 9:42:12 AM reposense.commits.CommitInfoExtractor extractCommitInfos +INFO: Extracting commits info for https://github.com/AY2324S2-CS2103T-T08-2/tp.git (master)... +Mar 08, 2024 9:42:12 AM reposense.commits.CommitInfoExtractor extractCommitInfos +INFO: Extracting commits info for https://github.com/AY2324S2-CS2103T-T17-1/tp.git (master)... +Mar 08, 2024 9:42:12 AM reposense.commits.CommitInfoAnalyzer analyzeCommits INFO: Analyzing commits info for https://github.com/AY2324S2-CS2103T-T14-2/tp.git (master)... -Mar 08, 2024 4:11:47 AM reposense.report.ReportGenerator analyzeRepo +Mar 08, 2024 9:42:12 AM reposense.report.ReportGenerator analyzeRepo INFO: Analysis of https://github.com/AY2324S2-CS2103T-T14-2/tp.git (master) completed! -Mar 08, 2024 4:11:47 AM reposense.commits.CommitInfoAnalyzer analyzeCommits -INFO: Analyzing commits info for https://github.com/AY2324S2-CS2103T-W13-1/tp.git (master)... -Mar 08, 2024 4:11:47 AM reposense.report.ReportGenerator analyzeRepo -INFO: Analysis of https://github.com/AY2324S2-CS2103T-W13-1/tp.git (master) completed! -Mar 08, 2024 4:11:47 AM reposense.commits.CommitInfoExtractor extractCommitInfos -INFO: Extracting commits info for https://github.com/AY2324S2-CS2103T-T08-2/tp.git (master)... -Mar 08, 2024 4:11:47 AM reposense.report.ReportGenerator updateRepoConfig -INFO: https://github.com/AY2324S2-CS2103T-T17-1/tp.git (master) does not contain a standalone config file. -Mar 08, 2024 4:11:47 AM reposense.authorship.FileInfoExtractor extractTextFileInfos -INFO: Extracting relevant file info from https://github.com/AY2324S2-CS2103T-T17-1/tp.git (master)... -Mar 08, 2024 4:11:47 AM reposense.report.ReportGenerator analyzeRepos -INFO: [91/92] Analyzing https://github.com/AY2324S2-CS2103T-F12-3/tp.git (master)... -Mar 08, 2024 4:11:47 AM reposense.report.ReportGenerator analyzeRepos -INFO: [92/92] Analyzing https://github.com/AY2324S2-CS2103T-T11-1/tp.git (master)... -Mar 08, 2024 4:11:47 AM reposense.commits.CommitInfoAnalyzer analyzeCommits +Mar 08, 2024 9:42:12 AM reposense.report.ReportGenerator analyzeRepos +INFO: [91/92] Analyzing https://github.com/AY2324S2-CS2103T-T11-1/tp.git (master)... +Mar 08, 2024 9:42:12 AM reposense.commits.CommitInfoAnalyzer analyzeCommits +INFO: Analyzing commits info for https://github.com/AY2324S2-CS2103T-T17-1/tp.git (master)... +Mar 08, 2024 9:42:12 AM reposense.commits.CommitInfoAnalyzer analyzeCommits INFO: Analyzing commits info for https://github.com/AY2324S2-CS2103T-T08-2/tp.git (master)... -Mar 08, 2024 4:11:47 AM reposense.report.ReportGenerator analyzeRepo +Mar 08, 2024 9:42:12 AM reposense.report.ReportGenerator analyzeRepo +INFO: Analysis of https://github.com/AY2324S2-CS2103T-T17-1/tp.git (master) completed! +Mar 08, 2024 9:42:12 AM reposense.report.ReportGenerator analyzeRepo INFO: Analysis of https://github.com/AY2324S2-CS2103T-T08-2/tp.git (master) completed! -Mar 08, 2024 4:11:47 AM reposense.report.ReportGenerator updateRepoConfig -INFO: https://github.com/AY2324S2-CS2103T-F12-3/tp.git (master) does not contain a standalone config file. -Mar 08, 2024 4:11:47 AM reposense.authorship.FileInfoExtractor extractTextFileInfos -INFO: Extracting relevant file info from https://github.com/AY2324S2-CS2103T-F12-3/tp.git (master)... -Mar 08, 2024 4:11:47 AM reposense.report.ReportGenerator updateRepoConfig +Mar 08, 2024 9:42:12 AM reposense.commits.CommitInfoExtractor extractCommitInfos +INFO: Extracting commits info for https://github.com/AY2324S2-CS2103T-W13-1/tp.git (master)... +Mar 08, 2024 9:42:12 AM reposense.report.ReportGenerator analyzeRepos +INFO: [92/92] Analyzing https://github.com/AY2324S2-CS2103T-F12-3/tp.git (master)... +Mar 08, 2024 9:42:12 AM reposense.commits.CommitInfoAnalyzer analyzeCommits +INFO: Analyzing commits info for https://github.com/AY2324S2-CS2103T-W13-1/tp.git (master)... +Mar 08, 2024 9:42:12 AM reposense.report.ReportGenerator analyzeRepo +INFO: Analysis of https://github.com/AY2324S2-CS2103T-W13-1/tp.git (master) completed! +Mar 08, 2024 9:42:12 AM reposense.report.ReportGenerator updateRepoConfig INFO: https://github.com/AY2324S2-CS2103T-T11-1/tp.git (master) does not contain a standalone config file. -Mar 08, 2024 4:11:47 AM reposense.authorship.FileInfoExtractor extractTextFileInfos +Mar 08, 2024 9:42:12 AM reposense.authorship.FileInfoExtractor extractTextFileInfos INFO: Extracting relevant file info from https://github.com/AY2324S2-CS2103T-T11-1/tp.git (master)... -Mar 08, 2024 4:11:47 AM reposense.commits.CommitInfoExtractor extractCommitInfos -INFO: Extracting commits info for https://github.com/AY2324S2-CS2103T-T17-1/tp.git (master)... -Mar 08, 2024 4:11:47 AM reposense.commits.CommitInfoAnalyzer analyzeCommits -INFO: Analyzing commits info for https://github.com/AY2324S2-CS2103T-T17-1/tp.git (master)... -Mar 08, 2024 4:11:47 AM reposense.report.ReportGenerator analyzeRepo -INFO: Analysis of https://github.com/AY2324S2-CS2103T-T17-1/tp.git (master) completed! -Mar 08, 2024 4:11:47 AM reposense.commits.CommitInfoExtractor extractCommitInfos +Mar 08, 2024 9:42:12 AM reposense.report.ReportGenerator updateRepoConfig +INFO: https://github.com/AY2324S2-CS2103T-F12-3/tp.git (master) does not contain a standalone config file. +Mar 08, 2024 9:42:12 AM reposense.authorship.FileInfoExtractor extractTextFileInfos +INFO: Extracting relevant file info from https://github.com/AY2324S2-CS2103T-F12-3/tp.git (master)... +Mar 08, 2024 9:42:12 AM reposense.commits.CommitInfoExtractor extractCommitInfos INFO: Extracting commits info for https://github.com/AY2324S2-CS2103T-F12-3/tp.git (master)... -Mar 08, 2024 4:11:47 AM reposense.commits.CommitInfoExtractor extractCommitInfos +Mar 08, 2024 9:42:12 AM reposense.commits.CommitInfoExtractor extractCommitInfos INFO: Extracting commits info for https://github.com/AY2324S2-CS2103T-T11-1/tp.git (master)... -Mar 08, 2024 4:11:47 AM reposense.commits.CommitInfoAnalyzer analyzeCommits +Mar 08, 2024 9:42:12 AM reposense.commits.CommitInfoAnalyzer analyzeCommits INFO: Analyzing commits info for https://github.com/AY2324S2-CS2103T-F12-3/tp.git (master)... -Mar 08, 2024 4:11:47 AM reposense.report.ReportGenerator analyzeRepo +Mar 08, 2024 9:42:12 AM reposense.report.ReportGenerator analyzeRepo INFO: Analysis of https://github.com/AY2324S2-CS2103T-F12-3/tp.git (master) completed! -Mar 08, 2024 4:11:47 AM reposense.commits.CommitInfoAnalyzer analyzeCommits +Mar 08, 2024 9:42:12 AM reposense.commits.CommitInfoAnalyzer analyzeCommits INFO: Analyzing commits info for https://github.com/AY2324S2-CS2103T-T11-1/tp.git (master)... -Mar 08, 2024 4:11:47 AM reposense.report.ReportGenerator analyzeRepo +Mar 08, 2024 9:42:12 AM reposense.report.ReportGenerator analyzeRepo INFO: Analysis of https://github.com/AY2324S2-CS2103T-T11-1/tp.git (master) completed! -Mar 08, 2024 4:11:47 AM reposense.report.ReportGenerator generateReposReport +Mar 08, 2024 9:42:12 AM reposense.report.ReportGenerator generateReposReport INFO: The report is generated at /home/runner/work/tp-dashboard/tp-dashboard/reposense-report -Mar 08, 2024 4:11:47 AM reposense.RepoSense main -INFO: Elapsed processing time: 38.55 second(s) +Mar 08, 2024 9:42:12 AM reposense.RepoSense main +INFO: Elapsed processing time: 39.47 second(s) diff --git a/summary.json b/summary.json index a7c200a3..1d02dce0 100644 --- a/summary.json +++ b/summary.json @@ -1 +1 @@ -{"repoSenseVersion":"bbb2f694a7","reportGeneratedTime":"Fri Mar 8 12:11:09 2024 UTC+08:00","reportGenerationTime":" 38.23 second(s)","zoneId":"UTC+08:00","reportTitle":"CS2103 tP Code Dashboard","repos":[{"location":{"location":"https://github.com/AY2324S2-CS2103-T14-1/tp.git","repoName":"tp","organization":"AY2324S2-CS2103-T14-1","domainName":"github"},"branch":"master","displayName":"AY2324S2-CS2103-T14-1/tp[master]","outputFolderName":"AY2324S2-CS2103-T14-1_tp_master"},{"location":{"location":"https://github.com/AY2324S2-CS2103-F15-2/tp.git","repoName":"tp","organization":"AY2324S2-CS2103-F15-2","domainName":"github"},"branch":"master","displayName":"AY2324S2-CS2103-F15-2/tp[master]","outputFolderName":"AY2324S2-CS2103-F15-2_tp_master"},{"location":{"location":"https://github.com/AY2324S2-CS2103-F15-3/tp.git","repoName":"tp","organization":"AY2324S2-CS2103-F15-3","domainName":"github"},"branch":"master","displayName":"AY2324S2-CS2103-F15-3/tp[master]","outputFolderName":"AY2324S2-CS2103-F15-3_tp_master"},{"location":{"location":"https://github.com/AY2324S2-CS2103-F09-4/tp.git","repoName":"tp","organization":"AY2324S2-CS2103-F09-4","domainName":"github"},"branch":"master","displayName":"AY2324S2-CS2103-F09-4/tp[master]","outputFolderName":"AY2324S2-CS2103-F09-4_tp_master"},{"location":{"location":"https://github.com/AY2324S2-CS2103-F15-4/tp.git","repoName":"tp","organization":"AY2324S2-CS2103-F15-4","domainName":"github"},"branch":"master","displayName":"AY2324S2-CS2103-F15-4/tp[master]","outputFolderName":"AY2324S2-CS2103-F15-4_tp_master"},{"location":{"location":"https://github.com/AY2324S2-CS2103-F15-1/tp.git","repoName":"tp","organization":"AY2324S2-CS2103-F15-1","domainName":"github"},"branch":"master","displayName":"AY2324S2-CS2103-F15-1/tp[master]","outputFolderName":"AY2324S2-CS2103-F15-1_tp_master"},{"location":{"location":"https://github.com/AY2324S2-CS2103-F08-3/tp.git","repoName":"tp","organization":"AY2324S2-CS2103-F08-3","domainName":"github"},"branch":"master","displayName":"AY2324S2-CS2103-F08-3/tp[master]","outputFolderName":"AY2324S2-CS2103-F08-3_tp_master"},{"location":{"location":"https://github.com/AY2324S2-CS2103-F09-2/tp.git","repoName":"tp","organization":"AY2324S2-CS2103-F09-2","domainName":"github"},"branch":"master","displayName":"AY2324S2-CS2103-F09-2/tp[master]","outputFolderName":"AY2324S2-CS2103-F09-2_tp_master"},{"location":{"location":"https://github.com/AY2324S2-CS2103-F09-1/tp.git","repoName":"tp","organization":"AY2324S2-CS2103-F09-1","domainName":"github"},"branch":"master","displayName":"AY2324S2-CS2103-F09-1/tp[master]","outputFolderName":"AY2324S2-CS2103-F09-1_tp_master"},{"location":{"location":"https://github.com/AY2324S2-CS2103-F08-2/tp.git","repoName":"tp","organization":"AY2324S2-CS2103-F08-2","domainName":"github"},"branch":"master","displayName":"AY2324S2-CS2103-F08-2/tp[master]","outputFolderName":"AY2324S2-CS2103-F08-2_tp_master"},{"location":{"location":"https://github.com/AY2324S2-CS2103-F08-1/tp.git","repoName":"tp","organization":"AY2324S2-CS2103-F08-1","domainName":"github"},"branch":"master","displayName":"AY2324S2-CS2103-F08-1/tp[master]","outputFolderName":"AY2324S2-CS2103-F08-1_tp_master"},{"location":{"location":"https://github.com/AY2324S2-CS2103-F09-3/tp.git","repoName":"tp","organization":"AY2324S2-CS2103-F09-3","domainName":"github"},"branch":"master","displayName":"AY2324S2-CS2103-F09-3/tp[master]","outputFolderName":"AY2324S2-CS2103-F09-3_tp_master"},{"location":{"location":"https://github.com/AY2324S2-CS2103-F08-4/tp.git","repoName":"tp","organization":"AY2324S2-CS2103-F08-4","domainName":"github"},"branch":"master","displayName":"AY2324S2-CS2103-F08-4/tp[master]","outputFolderName":"AY2324S2-CS2103-F08-4_tp_master"},{"location":{"location":"https://github.com/AY2324S2-CS2103T-W08-1/tp.git","repoName":"tp","organization":"AY2324S2-CS2103T-W08-1","domainName":"github"},"branch":"master","displayName":"AY2324S2-CS2103T-W08-1/tp[master]","outputFolderName":"AY2324S2-CS2103T-W08-1_tp_master"},{"location":{"location":"https://github.com/AY2324S2-CS2103T-T13-2/tp.git","repoName":"tp","organization":"AY2324S2-CS2103T-T13-2","domainName":"github"},"branch":"master","displayName":"AY2324S2-CS2103T-T13-2/tp[master]","outputFolderName":"AY2324S2-CS2103T-T13-2_tp_master"},{"location":{"location":"https://github.com/AY2324S2-CS2103T-T11-3/tp.git","repoName":"tp","organization":"AY2324S2-CS2103T-T11-3","domainName":"github"},"branch":"master","displayName":"AY2324S2-CS2103T-T11-3/tp[master]","outputFolderName":"AY2324S2-CS2103T-T11-3_tp_master"},{"location":{"location":"https://github.com/AY2324S2-CS2103T-T17-4/tp.git","repoName":"tp","organization":"AY2324S2-CS2103T-T17-4","domainName":"github"},"branch":"master","displayName":"AY2324S2-CS2103T-T17-4/tp[master]","outputFolderName":"AY2324S2-CS2103T-T17-4_tp_master"},{"location":{"location":"https://github.com/AY2324S2-CS2103T-W12-4/tp.git","repoName":"tp","organization":"AY2324S2-CS2103T-W12-4","domainName":"github"},"branch":"master","displayName":"AY2324S2-CS2103T-W12-4/tp[master]","outputFolderName":"AY2324S2-CS2103T-W12-4_tp_master"},{"location":{"location":"https://github.com/AY2324S2-CS2103T-T12-1/tp.git","repoName":"tp","organization":"AY2324S2-CS2103T-T12-1","domainName":"github"},"branch":"master","displayName":"AY2324S2-CS2103T-T12-1/tp[master]","outputFolderName":"AY2324S2-CS2103T-T12-1_tp_master"},{"location":{"location":"https://github.com/AY2324S2-CS2103T-T10-2/tp.git","repoName":"tp","organization":"AY2324S2-CS2103T-T10-2","domainName":"github"},"branch":"master","displayName":"AY2324S2-CS2103T-T10-2/tp[master]","outputFolderName":"AY2324S2-CS2103T-T10-2_tp_master"},{"location":{"location":"https://github.com/AY2324S2-CS2103T-F10-1/tp.git","repoName":"tp","organization":"AY2324S2-CS2103T-F10-1","domainName":"github"},"branch":"master","displayName":"AY2324S2-CS2103T-F10-1/tp[master]","outputFolderName":"AY2324S2-CS2103T-F10-1_tp_master"},{"location":{"location":"https://github.com/AY2324S2-CS2103T-W13-1/tp.git","repoName":"tp","organization":"AY2324S2-CS2103T-W13-1","domainName":"github"},"branch":"master","displayName":"AY2324S2-CS2103T-W13-1/tp[master]","outputFolderName":"AY2324S2-CS2103T-W13-1_tp_master"},{"location":{"location":"https://github.com/AY2324S2-CS2103T-T09-4/tp.git","repoName":"tp","organization":"AY2324S2-CS2103T-T09-4","domainName":"github"},"branch":"master","displayName":"AY2324S2-CS2103T-T09-4/tp[master]","outputFolderName":"AY2324S2-CS2103T-T09-4_tp_master"},{"location":{"location":"https://github.com/AY2324S2-CS2103T-T14-2/tp.git","repoName":"tp","organization":"AY2324S2-CS2103T-T14-2","domainName":"github"},"branch":"master","displayName":"AY2324S2-CS2103T-T14-2/tp[master]","outputFolderName":"AY2324S2-CS2103T-T14-2_tp_master"},{"location":{"location":"https://github.com/AY2324S2-CS2103T-T16-2/tp.git","repoName":"tp","organization":"AY2324S2-CS2103T-T16-2","domainName":"github"},"branch":"master","displayName":"AY2324S2-CS2103T-T16-2/tp[master]","outputFolderName":"AY2324S2-CS2103T-T16-2_tp_master"},{"location":{"location":"https://github.com/AY2324S2-CS2103T-T10-3/tp.git","repoName":"tp","organization":"AY2324S2-CS2103T-T10-3","domainName":"github"},"branch":"master","displayName":"AY2324S2-CS2103T-T10-3/tp[master]","outputFolderName":"AY2324S2-CS2103T-T10-3_tp_master"},{"location":{"location":"https://github.com/AY2324S2-CS2103T-T17-2/tp.git","repoName":"tp","organization":"AY2324S2-CS2103T-T17-2","domainName":"github"},"branch":"master","displayName":"AY2324S2-CS2103T-T17-2/tp[master]","outputFolderName":"AY2324S2-CS2103T-T17-2_tp_master"},{"location":{"location":"https://github.com/AY2324S2-CS2103T-F13-1/tp.git","repoName":"tp","organization":"AY2324S2-CS2103T-F13-1","domainName":"github"},"branch":"master","displayName":"AY2324S2-CS2103T-F13-1/tp[master]","outputFolderName":"AY2324S2-CS2103T-F13-1_tp_master"},{"location":{"location":"https://github.com/AY2324S2-CS2103T-F14-1/tp.git","repoName":"tp","organization":"AY2324S2-CS2103T-F14-1","domainName":"github"},"branch":"master","displayName":"AY2324S2-CS2103T-F14-1/tp[master]","outputFolderName":"AY2324S2-CS2103T-F14-1_tp_master"},{"location":{"location":"https://github.com/AY2324S2-CS2103T-T11-2/tp.git","repoName":"tp","organization":"AY2324S2-CS2103T-T11-2","domainName":"github"},"branch":"master","displayName":"AY2324S2-CS2103T-T11-2/tp[master]","outputFolderName":"AY2324S2-CS2103T-T11-2_tp_master"},{"location":{"location":"https://github.com/AY2324S2-CS2103T-F11-2/tp.git","repoName":"tp","organization":"AY2324S2-CS2103T-F11-2","domainName":"github"},"branch":"master","displayName":"AY2324S2-CS2103T-F11-2/tp[master]","outputFolderName":"AY2324S2-CS2103T-F11-2_tp_master"},{"location":{"location":"https://github.com/AY2324S2-CS2103T-T08-3/tp.git","repoName":"tp","organization":"AY2324S2-CS2103T-T08-3","domainName":"github"},"branch":"master","displayName":"AY2324S2-CS2103T-T08-3/tp[master]","outputFolderName":"AY2324S2-CS2103T-T08-3_tp_master"},{"location":{"location":"https://github.com/AY2324S2-CS2103T-W12-3/tp.git","repoName":"tp","organization":"AY2324S2-CS2103T-W12-3","domainName":"github"},"branch":"master","displayName":"AY2324S2-CS2103T-W12-3/tp[master]","outputFolderName":"AY2324S2-CS2103T-W12-3_tp_master"},{"location":{"location":"https://github.com/AY2324S2-CS2103T-W08-3/tp.git","repoName":"tp","organization":"AY2324S2-CS2103T-W08-3","domainName":"github"},"branch":"master","displayName":"AY2324S2-CS2103T-W08-3/tp[master]","outputFolderName":"AY2324S2-CS2103T-W08-3_tp_master"},{"location":{"location":"https://github.com/AY2324S2-CS2103T-W10-2/tp.git","repoName":"tp","organization":"AY2324S2-CS2103T-W10-2","domainName":"github"},"branch":"master","displayName":"AY2324S2-CS2103T-W10-2/tp[master]","outputFolderName":"AY2324S2-CS2103T-W10-2_tp_master"},{"location":{"location":"https://github.com/AY2324S2-CS2103T-F12-4/tp.git","repoName":"tp","organization":"AY2324S2-CS2103T-F12-4","domainName":"github"},"branch":"master","displayName":"AY2324S2-CS2103T-F12-4/tp[master]","outputFolderName":"AY2324S2-CS2103T-F12-4_tp_master"},{"location":{"location":"https://github.com/AY2324S2-CS2103T-W11-2/tp.git","repoName":"tp","organization":"AY2324S2-CS2103T-W11-2","domainName":"github"},"branch":"master","displayName":"AY2324S2-CS2103T-W11-2/tp[master]","outputFolderName":"AY2324S2-CS2103T-W11-2_tp_master"},{"location":{"location":"https://github.com/AY2324S2-CS2103T-W08-4/tp.git","repoName":"tp","organization":"AY2324S2-CS2103T-W08-4","domainName":"github"},"branch":"master","displayName":"AY2324S2-CS2103T-W08-4/tp[master]","outputFolderName":"AY2324S2-CS2103T-W08-4_tp_master"},{"location":{"location":"https://github.com/AY2324S2-CS2103T-T09-1/tp.git","repoName":"tp","organization":"AY2324S2-CS2103T-T09-1","domainName":"github"},"branch":"master","displayName":"AY2324S2-CS2103T-T09-1/tp[master]","outputFolderName":"AY2324S2-CS2103T-T09-1_tp_master"},{"location":{"location":"https://github.com/AY2324S2-CS2103T-W11-3/tp.git","repoName":"tp","organization":"AY2324S2-CS2103T-W11-3","domainName":"github"},"branch":"master","displayName":"AY2324S2-CS2103T-W11-3/tp[master]","outputFolderName":"AY2324S2-CS2103T-W11-3_tp_master"},{"location":{"location":"https://github.com/AY2324S2-CS2103T-W11-1/tp.git","repoName":"tp","organization":"AY2324S2-CS2103T-W11-1","domainName":"github"},"branch":"master","displayName":"AY2324S2-CS2103T-W11-1/tp[master]","outputFolderName":"AY2324S2-CS2103T-W11-1_tp_master"},{"location":{"location":"https://github.com/AY2324S2-CS2103T-T12-2/tp.git","repoName":"tp","organization":"AY2324S2-CS2103T-T12-2","domainName":"github"},"branch":"master","displayName":"AY2324S2-CS2103T-T12-2/tp[master]","outputFolderName":"AY2324S2-CS2103T-T12-2_tp_master"},{"location":{"location":"https://github.com/AY2324S2-CS2103T-F11-3/tp.git","repoName":"tp","organization":"AY2324S2-CS2103T-F11-3","domainName":"github"},"branch":"master","displayName":"AY2324S2-CS2103T-F11-3/tp[master]","outputFolderName":"AY2324S2-CS2103T-F11-3_tp_master"},{"location":{"location":"https://github.com/AY2324S2-CS2103T-T11-4/tp.git","repoName":"tp","organization":"AY2324S2-CS2103T-T11-4","domainName":"github"},"branch":"master","displayName":"AY2324S2-CS2103T-T11-4/tp[master]","outputFolderName":"AY2324S2-CS2103T-T11-4_tp_master"},{"location":{"location":"https://github.com/AY2324S2-CS2103T-T10-1/tp.git","repoName":"tp","organization":"AY2324S2-CS2103T-T10-1","domainName":"github"},"branch":"master","displayName":"AY2324S2-CS2103T-T10-1/tp[master]","outputFolderName":"AY2324S2-CS2103T-T10-1_tp_master"},{"location":{"location":"https://github.com/AY2324S2-CS2103T-F14-3/tp.git","repoName":"tp","organization":"AY2324S2-CS2103T-F14-3","domainName":"github"},"branch":"master","displayName":"AY2324S2-CS2103T-F14-3/tp[master]","outputFolderName":"AY2324S2-CS2103T-F14-3_tp_master"},{"location":{"location":"https://github.com/AY2324S2-CS2103T-T08-1/tp.git","repoName":"tp","organization":"AY2324S2-CS2103T-T08-1","domainName":"github"},"branch":"master","displayName":"AY2324S2-CS2103T-T08-1/tp[master]","outputFolderName":"AY2324S2-CS2103T-T08-1_tp_master"},{"location":{"location":"https://github.com/AY2324S2-CS2103T-W09-3/tp.git","repoName":"tp","organization":"AY2324S2-CS2103T-W09-3","domainName":"github"},"branch":"master","displayName":"AY2324S2-CS2103T-W09-3/tp[master]","outputFolderName":"AY2324S2-CS2103T-W09-3_tp_master"},{"location":{"location":"https://github.com/AY2324S2-CS2103T-T11-1/tp.git","repoName":"tp","organization":"AY2324S2-CS2103T-T11-1","domainName":"github"},"branch":"master","displayName":"AY2324S2-CS2103T-T11-1/tp[master]","outputFolderName":"AY2324S2-CS2103T-T11-1_tp_master"},{"location":{"location":"https://github.com/AY2324S2-CS2103T-W10-1/tp.git","repoName":"tp","organization":"AY2324S2-CS2103T-W10-1","domainName":"github"},"branch":"master","displayName":"AY2324S2-CS2103T-W10-1/tp[master]","outputFolderName":"AY2324S2-CS2103T-W10-1_tp_master"},{"location":{"location":"https://github.com/AY2324S2-CS2103T-F10-3/tp.git","repoName":"tp","organization":"AY2324S2-CS2103T-F10-3","domainName":"github"},"branch":"master","displayName":"AY2324S2-CS2103T-F10-3/tp[master]","outputFolderName":"AY2324S2-CS2103T-F10-3_tp_master"},{"location":{"location":"https://github.com/AY2324S2-CS2103T-T13-1/tp.git","repoName":"tp","organization":"AY2324S2-CS2103T-T13-1","domainName":"github"},"branch":"master","displayName":"AY2324S2-CS2103T-T13-1/tp[master]","outputFolderName":"AY2324S2-CS2103T-T13-1_tp_master"},{"location":{"location":"https://github.com/AY2324S2-CS2103T-T13-3/tp.git","repoName":"tp","organization":"AY2324S2-CS2103T-T13-3","domainName":"github"},"branch":"master","displayName":"AY2324S2-CS2103T-T13-3/tp[master]","outputFolderName":"AY2324S2-CS2103T-T13-3_tp_master"},{"location":{"location":"https://github.com/AY2324S2-CS2103T-F13-2/tp.git","repoName":"tp","organization":"AY2324S2-CS2103T-F13-2","domainName":"github"},"branch":"master","displayName":"AY2324S2-CS2103T-F13-2/tp[master]","outputFolderName":"AY2324S2-CS2103T-F13-2_tp_master"},{"location":{"location":"https://github.com/AY2324S2-CS2103T-T12-4/tp.git","repoName":"tp","organization":"AY2324S2-CS2103T-T12-4","domainName":"github"},"branch":"master","displayName":"AY2324S2-CS2103T-T12-4/tp[master]","outputFolderName":"AY2324S2-CS2103T-T12-4_tp_master"},{"location":{"location":"https://github.com/AY2324S2-CS2103T-T08-2/tp.git","repoName":"tp","organization":"AY2324S2-CS2103T-T08-2","domainName":"github"},"branch":"master","displayName":"AY2324S2-CS2103T-T08-2/tp[master]","outputFolderName":"AY2324S2-CS2103T-T08-2_tp_master"},{"location":{"location":"https://github.com/AY2324S2-CS2103T-T12-3/tp.git","repoName":"tp","organization":"AY2324S2-CS2103T-T12-3","domainName":"github"},"branch":"master","displayName":"AY2324S2-CS2103T-T12-3/tp[master]","outputFolderName":"AY2324S2-CS2103T-T12-3_tp_master"},{"location":{"location":"https://github.com/AY2324S2-CS2103T-T09-3/tp.git","repoName":"tp","organization":"AY2324S2-CS2103T-T09-3","domainName":"github"},"branch":"master","displayName":"AY2324S2-CS2103T-T09-3/tp[master]","outputFolderName":"AY2324S2-CS2103T-T09-3_tp_master"},{"location":{"location":"https://github.com/AY2324S2-CS2103T-W12-1/tp.git","repoName":"tp","organization":"AY2324S2-CS2103T-W12-1","domainName":"github"},"branch":"master","displayName":"AY2324S2-CS2103T-W12-1/tp[master]","outputFolderName":"AY2324S2-CS2103T-W12-1_tp_master"},{"location":{"location":"https://github.com/AY2324S2-CS2103T-F10-4/tp.git","repoName":"tp","organization":"AY2324S2-CS2103T-F10-4","domainName":"github"},"branch":"master","displayName":"AY2324S2-CS2103T-F10-4/tp[master]","outputFolderName":"AY2324S2-CS2103T-F10-4_tp_master"},{"location":{"location":"https://github.com/AY2324S2-CS2103T-F13-4/tp.git","repoName":"tp","organization":"AY2324S2-CS2103T-F13-4","domainName":"github"},"branch":"master","displayName":"AY2324S2-CS2103T-F13-4/tp[master]","outputFolderName":"AY2324S2-CS2103T-F13-4_tp_master"},{"location":{"location":"https://github.com/AY2324S2-CS2103T-T15-4/tp.git","repoName":"tp","organization":"AY2324S2-CS2103T-T15-4","domainName":"github"},"branch":"master","displayName":"AY2324S2-CS2103T-T15-4/tp[master]","outputFolderName":"AY2324S2-CS2103T-T15-4_tp_master"},{"location":{"location":"https://github.com/AY2324S2-CS2103T-T13-4/tp.git","repoName":"tp","organization":"AY2324S2-CS2103T-T13-4","domainName":"github"},"branch":"master","displayName":"AY2324S2-CS2103T-T13-4/tp[master]","outputFolderName":"AY2324S2-CS2103T-T13-4_tp_master"},{"location":{"location":"https://github.com/AY2324S2-CS2103T-F11-1/tp.git","repoName":"tp","organization":"AY2324S2-CS2103T-F11-1","domainName":"github"},"branch":"master","displayName":"AY2324S2-CS2103T-F11-1/tp[master]","outputFolderName":"AY2324S2-CS2103T-F11-1_tp_master"},{"location":{"location":"https://github.com/AY2324S2-CS2103T-W09-2/tp.git","repoName":"tp","organization":"AY2324S2-CS2103T-W09-2","domainName":"github"},"branch":"master","displayName":"AY2324S2-CS2103T-W09-2/tp[master]","outputFolderName":"AY2324S2-CS2103T-W09-2_tp_master"},{"location":{"location":"https://github.com/AY2324S2-CS2103T-F12-1/tp.git","repoName":"tp","organization":"AY2324S2-CS2103T-F12-1","domainName":"github"},"branch":"master","displayName":"AY2324S2-CS2103T-F12-1/tp[master]","outputFolderName":"AY2324S2-CS2103T-F12-1_tp_master"},{"location":{"location":"https://github.com/AY2324S2-CS2103T-T17-1/tp.git","repoName":"tp","organization":"AY2324S2-CS2103T-T17-1","domainName":"github"},"branch":"master","displayName":"AY2324S2-CS2103T-T17-1/tp[master]","outputFolderName":"AY2324S2-CS2103T-T17-1_tp_master"},{"location":{"location":"https://github.com/AY2324S2-CS2103T-T15-3/tp.git","repoName":"tp","organization":"AY2324S2-CS2103T-T15-3","domainName":"github"},"branch":"master","displayName":"AY2324S2-CS2103T-T15-3/tp[master]","outputFolderName":"AY2324S2-CS2103T-T15-3_tp_master"},{"location":{"location":"https://github.com/AY2324S2-CS2103T-T16-3/tp.git","repoName":"tp","organization":"AY2324S2-CS2103T-T16-3","domainName":"github"},"branch":"master","displayName":"AY2324S2-CS2103T-T16-3/tp[master]","outputFolderName":"AY2324S2-CS2103T-T16-3_tp_master"},{"location":{"location":"https://github.com/AY2324S2-CS2103T-W13-3/tp.git","repoName":"tp","organization":"AY2324S2-CS2103T-W13-3","domainName":"github"},"branch":"master","displayName":"AY2324S2-CS2103T-W13-3/tp[master]","outputFolderName":"AY2324S2-CS2103T-W13-3_tp_master"},{"location":{"location":"https://github.com/AY2324S2-CS2103T-W10-3/tp.git","repoName":"tp","organization":"AY2324S2-CS2103T-W10-3","domainName":"github"},"branch":"master","displayName":"AY2324S2-CS2103T-W10-3/tp[master]","outputFolderName":"AY2324S2-CS2103T-W10-3_tp_master"},{"location":{"location":"https://github.com/AY2324S2-CS2103T-T15-2/tp.git","repoName":"tp","organization":"AY2324S2-CS2103T-T15-2","domainName":"github"},"branch":"master","displayName":"AY2324S2-CS2103T-T15-2/tp[master]","outputFolderName":"AY2324S2-CS2103T-T15-2_tp_master"},{"location":{"location":"https://github.com/AY2324S2-CS2103T-W12-2/tp.git","repoName":"tp","organization":"AY2324S2-CS2103T-W12-2","domainName":"github"},"branch":"master","displayName":"AY2324S2-CS2103T-W12-2/tp[master]","outputFolderName":"AY2324S2-CS2103T-W12-2_tp_master"},{"location":{"location":"https://github.com/AY2324S2-CS2103T-T09-2/tp.git","repoName":"tp","organization":"AY2324S2-CS2103T-T09-2","domainName":"github"},"branch":"master","displayName":"AY2324S2-CS2103T-T09-2/tp[master]","outputFolderName":"AY2324S2-CS2103T-T09-2_tp_master"},{"location":{"location":"https://github.com/AY2324S2-CS2103T-T17-3/tp.git","repoName":"tp","organization":"AY2324S2-CS2103T-T17-3","domainName":"github"},"branch":"master","displayName":"AY2324S2-CS2103T-T17-3/tp[master]","outputFolderName":"AY2324S2-CS2103T-T17-3_tp_master"},{"location":{"location":"https://github.com/AY2324S2-CS2103T-W13-4/tp.git","repoName":"tp","organization":"AY2324S2-CS2103T-W13-4","domainName":"github"},"branch":"master","displayName":"AY2324S2-CS2103T-W13-4/tp[master]","outputFolderName":"AY2324S2-CS2103T-W13-4_tp_master"},{"location":{"location":"https://github.com/AY2324S2-CS2103T-W08-2/tp.git","repoName":"tp","organization":"AY2324S2-CS2103T-W08-2","domainName":"github"},"branch":"master","displayName":"AY2324S2-CS2103T-W08-2/tp[master]","outputFolderName":"AY2324S2-CS2103T-W08-2_tp_master"},{"location":{"location":"https://github.com/AY2324S2-CS2103T-F11-4/tp.git","repoName":"tp","organization":"AY2324S2-CS2103T-F11-4","domainName":"github"},"branch":"master","displayName":"AY2324S2-CS2103T-F11-4/tp[master]","outputFolderName":"AY2324S2-CS2103T-F11-4_tp_master"},{"location":{"location":"https://github.com/AY2324S2-CS2103T-T16-1/tp.git","repoName":"tp","organization":"AY2324S2-CS2103T-T16-1","domainName":"github"},"branch":"master","displayName":"AY2324S2-CS2103T-T16-1/tp[master]","outputFolderName":"AY2324S2-CS2103T-T16-1_tp_master"},{"location":{"location":"https://github.com/AY2324S2-CS2103T-F10-2/tp.git","repoName":"tp","organization":"AY2324S2-CS2103T-F10-2","domainName":"github"},"branch":"master","displayName":"AY2324S2-CS2103T-F10-2/tp[master]","outputFolderName":"AY2324S2-CS2103T-F10-2_tp_master"},{"location":{"location":"https://github.com/AY2324S2-CS2103T-W09-4/tp.git","repoName":"tp","organization":"AY2324S2-CS2103T-W09-4","domainName":"github"},"branch":"master","displayName":"AY2324S2-CS2103T-W09-4/tp[master]","outputFolderName":"AY2324S2-CS2103T-W09-4_tp_master"},{"location":{"location":"https://github.com/AY2324S2-CS2103T-T15-1/tp.git","repoName":"tp","organization":"AY2324S2-CS2103T-T15-1","domainName":"github"},"branch":"master","displayName":"AY2324S2-CS2103T-T15-1/tp[master]","outputFolderName":"AY2324S2-CS2103T-T15-1_tp_master"},{"location":{"location":"https://github.com/AY2324S2-CS2103T-W09-1/tp.git","repoName":"tp","organization":"AY2324S2-CS2103T-W09-1","domainName":"github"},"branch":"master","displayName":"AY2324S2-CS2103T-W09-1/tp[master]","outputFolderName":"AY2324S2-CS2103T-W09-1_tp_master"},{"location":{"location":"https://github.com/AY2324S2-CS2103T-F14-2/tp.git","repoName":"tp","organization":"AY2324S2-CS2103T-F14-2","domainName":"github"},"branch":"master","displayName":"AY2324S2-CS2103T-F14-2/tp[master]","outputFolderName":"AY2324S2-CS2103T-F14-2_tp_master"},{"location":{"location":"https://github.com/AY2324S2-CS2103T-W13-2/tp.git","repoName":"tp","organization":"AY2324S2-CS2103T-W13-2","domainName":"github"},"branch":"master","displayName":"AY2324S2-CS2103T-W13-2/tp[master]","outputFolderName":"AY2324S2-CS2103T-W13-2_tp_master"},{"location":{"location":"https://github.com/AY2324S2-CS2103T-F13-3/tp.git","repoName":"tp","organization":"AY2324S2-CS2103T-F13-3","domainName":"github"},"branch":"master","displayName":"AY2324S2-CS2103T-F13-3/tp[master]","outputFolderName":"AY2324S2-CS2103T-F13-3_tp_master"},{"location":{"location":"https://github.com/AY2324S2-CS2103T-W10-4/tp.git","repoName":"tp","organization":"AY2324S2-CS2103T-W10-4","domainName":"github"},"branch":"master","displayName":"AY2324S2-CS2103T-W10-4/tp[master]","outputFolderName":"AY2324S2-CS2103T-W10-4_tp_master"},{"location":{"location":"https://github.com/AY2324S2-CS2103T-F12-2/tp.git","repoName":"tp","organization":"AY2324S2-CS2103T-F12-2","domainName":"github"},"branch":"master","displayName":"AY2324S2-CS2103T-F12-2/tp[master]","outputFolderName":"AY2324S2-CS2103T-F12-2_tp_master"},{"location":{"location":"https://github.com/AY2324S2-CS2103T-F12-3/tp.git","repoName":"tp","organization":"AY2324S2-CS2103T-F12-3","domainName":"github"},"branch":"master","displayName":"AY2324S2-CS2103T-F12-3/tp[master]","outputFolderName":"AY2324S2-CS2103T-F12-3_tp_master"},{"location":{"location":"https://github.com/AY2324S2-CS2103T-F14-4/tp.git","repoName":"tp","organization":"AY2324S2-CS2103T-F14-4","domainName":"github"},"branch":"master","displayName":"AY2324S2-CS2103T-F14-4/tp[master]","outputFolderName":"AY2324S2-CS2103T-F14-4_tp_master"},{"location":{"location":"https://github.com/AY2324S2-CS2103T-T16-4/tp.git","repoName":"tp","organization":"AY2324S2-CS2103T-T16-4","domainName":"github"},"branch":"master","displayName":"AY2324S2-CS2103T-T16-4/tp[master]","outputFolderName":"AY2324S2-CS2103T-T16-4_tp_master"},{"location":{"location":"https://github.com/AY2324S2-CS2103T-T14-1/tp.git","repoName":"tp","organization":"AY2324S2-CS2103T-T14-1","domainName":"github"},"branch":"master","displayName":"AY2324S2-CS2103T-T14-1/tp[master]","outputFolderName":"AY2324S2-CS2103T-T14-1_tp_master"}],"errorSet":[],"sinceDate":"2024-02-23","untilDate":"2024-03-08","isSinceDateProvided":true,"isUntilDateProvided":false,"supportedDomainUrlMap":{"NOT_RECOGNIZED":{"BRANCH":"","REPO_URL":"UNSUPPORTED","BASE_URL":"UNSUPPORTED","HISTORY_PATH":"","COMMIT_PATH":"","BLAME_PATH":""},"github":{"BRANCH":"tree/$BRANCH","REPO_URL":"https://github.com/$ORGANIZATION/$REPO_NAME/","BASE_URL":"https://github.com/","HISTORY_PATH":"commits/$BRANCH/$FILE_PATH","COMMIT_PATH":"commit/$COMMIT_HASH","BLAME_PATH":"blame/$BRANCH/$FILE_PATH"}}} +{"repoSenseVersion":"bbb2f694a7","reportGeneratedTime":"Fri Mar 8 17:41:33 2024 UTC+08:00","reportGenerationTime":" 39.14 second(s)","zoneId":"UTC+08:00","reportTitle":"CS2103 tP Code Dashboard","repos":[{"location":{"location":"https://github.com/AY2324S2-CS2103-T14-1/tp.git","repoName":"tp","organization":"AY2324S2-CS2103-T14-1","domainName":"github"},"branch":"master","displayName":"AY2324S2-CS2103-T14-1/tp[master]","outputFolderName":"AY2324S2-CS2103-T14-1_tp_master"},{"location":{"location":"https://github.com/AY2324S2-CS2103-F15-2/tp.git","repoName":"tp","organization":"AY2324S2-CS2103-F15-2","domainName":"github"},"branch":"master","displayName":"AY2324S2-CS2103-F15-2/tp[master]","outputFolderName":"AY2324S2-CS2103-F15-2_tp_master"},{"location":{"location":"https://github.com/AY2324S2-CS2103-F15-3/tp.git","repoName":"tp","organization":"AY2324S2-CS2103-F15-3","domainName":"github"},"branch":"master","displayName":"AY2324S2-CS2103-F15-3/tp[master]","outputFolderName":"AY2324S2-CS2103-F15-3_tp_master"},{"location":{"location":"https://github.com/AY2324S2-CS2103-F09-4/tp.git","repoName":"tp","organization":"AY2324S2-CS2103-F09-4","domainName":"github"},"branch":"master","displayName":"AY2324S2-CS2103-F09-4/tp[master]","outputFolderName":"AY2324S2-CS2103-F09-4_tp_master"},{"location":{"location":"https://github.com/AY2324S2-CS2103-F15-4/tp.git","repoName":"tp","organization":"AY2324S2-CS2103-F15-4","domainName":"github"},"branch":"master","displayName":"AY2324S2-CS2103-F15-4/tp[master]","outputFolderName":"AY2324S2-CS2103-F15-4_tp_master"},{"location":{"location":"https://github.com/AY2324S2-CS2103-F15-1/tp.git","repoName":"tp","organization":"AY2324S2-CS2103-F15-1","domainName":"github"},"branch":"master","displayName":"AY2324S2-CS2103-F15-1/tp[master]","outputFolderName":"AY2324S2-CS2103-F15-1_tp_master"},{"location":{"location":"https://github.com/AY2324S2-CS2103-F08-3/tp.git","repoName":"tp","organization":"AY2324S2-CS2103-F08-3","domainName":"github"},"branch":"master","displayName":"AY2324S2-CS2103-F08-3/tp[master]","outputFolderName":"AY2324S2-CS2103-F08-3_tp_master"},{"location":{"location":"https://github.com/AY2324S2-CS2103-F09-2/tp.git","repoName":"tp","organization":"AY2324S2-CS2103-F09-2","domainName":"github"},"branch":"master","displayName":"AY2324S2-CS2103-F09-2/tp[master]","outputFolderName":"AY2324S2-CS2103-F09-2_tp_master"},{"location":{"location":"https://github.com/AY2324S2-CS2103-F09-1/tp.git","repoName":"tp","organization":"AY2324S2-CS2103-F09-1","domainName":"github"},"branch":"master","displayName":"AY2324S2-CS2103-F09-1/tp[master]","outputFolderName":"AY2324S2-CS2103-F09-1_tp_master"},{"location":{"location":"https://github.com/AY2324S2-CS2103-F08-2/tp.git","repoName":"tp","organization":"AY2324S2-CS2103-F08-2","domainName":"github"},"branch":"master","displayName":"AY2324S2-CS2103-F08-2/tp[master]","outputFolderName":"AY2324S2-CS2103-F08-2_tp_master"},{"location":{"location":"https://github.com/AY2324S2-CS2103-F08-1/tp.git","repoName":"tp","organization":"AY2324S2-CS2103-F08-1","domainName":"github"},"branch":"master","displayName":"AY2324S2-CS2103-F08-1/tp[master]","outputFolderName":"AY2324S2-CS2103-F08-1_tp_master"},{"location":{"location":"https://github.com/AY2324S2-CS2103-F09-3/tp.git","repoName":"tp","organization":"AY2324S2-CS2103-F09-3","domainName":"github"},"branch":"master","displayName":"AY2324S2-CS2103-F09-3/tp[master]","outputFolderName":"AY2324S2-CS2103-F09-3_tp_master"},{"location":{"location":"https://github.com/AY2324S2-CS2103-F08-4/tp.git","repoName":"tp","organization":"AY2324S2-CS2103-F08-4","domainName":"github"},"branch":"master","displayName":"AY2324S2-CS2103-F08-4/tp[master]","outputFolderName":"AY2324S2-CS2103-F08-4_tp_master"},{"location":{"location":"https://github.com/AY2324S2-CS2103T-W08-1/tp.git","repoName":"tp","organization":"AY2324S2-CS2103T-W08-1","domainName":"github"},"branch":"master","displayName":"AY2324S2-CS2103T-W08-1/tp[master]","outputFolderName":"AY2324S2-CS2103T-W08-1_tp_master"},{"location":{"location":"https://github.com/AY2324S2-CS2103T-T13-2/tp.git","repoName":"tp","organization":"AY2324S2-CS2103T-T13-2","domainName":"github"},"branch":"master","displayName":"AY2324S2-CS2103T-T13-2/tp[master]","outputFolderName":"AY2324S2-CS2103T-T13-2_tp_master"},{"location":{"location":"https://github.com/AY2324S2-CS2103T-T11-3/tp.git","repoName":"tp","organization":"AY2324S2-CS2103T-T11-3","domainName":"github"},"branch":"master","displayName":"AY2324S2-CS2103T-T11-3/tp[master]","outputFolderName":"AY2324S2-CS2103T-T11-3_tp_master"},{"location":{"location":"https://github.com/AY2324S2-CS2103T-T17-4/tp.git","repoName":"tp","organization":"AY2324S2-CS2103T-T17-4","domainName":"github"},"branch":"master","displayName":"AY2324S2-CS2103T-T17-4/tp[master]","outputFolderName":"AY2324S2-CS2103T-T17-4_tp_master"},{"location":{"location":"https://github.com/AY2324S2-CS2103T-W12-4/tp.git","repoName":"tp","organization":"AY2324S2-CS2103T-W12-4","domainName":"github"},"branch":"master","displayName":"AY2324S2-CS2103T-W12-4/tp[master]","outputFolderName":"AY2324S2-CS2103T-W12-4_tp_master"},{"location":{"location":"https://github.com/AY2324S2-CS2103T-T12-1/tp.git","repoName":"tp","organization":"AY2324S2-CS2103T-T12-1","domainName":"github"},"branch":"master","displayName":"AY2324S2-CS2103T-T12-1/tp[master]","outputFolderName":"AY2324S2-CS2103T-T12-1_tp_master"},{"location":{"location":"https://github.com/AY2324S2-CS2103T-T10-2/tp.git","repoName":"tp","organization":"AY2324S2-CS2103T-T10-2","domainName":"github"},"branch":"master","displayName":"AY2324S2-CS2103T-T10-2/tp[master]","outputFolderName":"AY2324S2-CS2103T-T10-2_tp_master"},{"location":{"location":"https://github.com/AY2324S2-CS2103T-F10-1/tp.git","repoName":"tp","organization":"AY2324S2-CS2103T-F10-1","domainName":"github"},"branch":"master","displayName":"AY2324S2-CS2103T-F10-1/tp[master]","outputFolderName":"AY2324S2-CS2103T-F10-1_tp_master"},{"location":{"location":"https://github.com/AY2324S2-CS2103T-W13-1/tp.git","repoName":"tp","organization":"AY2324S2-CS2103T-W13-1","domainName":"github"},"branch":"master","displayName":"AY2324S2-CS2103T-W13-1/tp[master]","outputFolderName":"AY2324S2-CS2103T-W13-1_tp_master"},{"location":{"location":"https://github.com/AY2324S2-CS2103T-T09-4/tp.git","repoName":"tp","organization":"AY2324S2-CS2103T-T09-4","domainName":"github"},"branch":"master","displayName":"AY2324S2-CS2103T-T09-4/tp[master]","outputFolderName":"AY2324S2-CS2103T-T09-4_tp_master"},{"location":{"location":"https://github.com/AY2324S2-CS2103T-T14-2/tp.git","repoName":"tp","organization":"AY2324S2-CS2103T-T14-2","domainName":"github"},"branch":"master","displayName":"AY2324S2-CS2103T-T14-2/tp[master]","outputFolderName":"AY2324S2-CS2103T-T14-2_tp_master"},{"location":{"location":"https://github.com/AY2324S2-CS2103T-T16-2/tp.git","repoName":"tp","organization":"AY2324S2-CS2103T-T16-2","domainName":"github"},"branch":"master","displayName":"AY2324S2-CS2103T-T16-2/tp[master]","outputFolderName":"AY2324S2-CS2103T-T16-2_tp_master"},{"location":{"location":"https://github.com/AY2324S2-CS2103T-T10-3/tp.git","repoName":"tp","organization":"AY2324S2-CS2103T-T10-3","domainName":"github"},"branch":"master","displayName":"AY2324S2-CS2103T-T10-3/tp[master]","outputFolderName":"AY2324S2-CS2103T-T10-3_tp_master"},{"location":{"location":"https://github.com/AY2324S2-CS2103T-T17-2/tp.git","repoName":"tp","organization":"AY2324S2-CS2103T-T17-2","domainName":"github"},"branch":"master","displayName":"AY2324S2-CS2103T-T17-2/tp[master]","outputFolderName":"AY2324S2-CS2103T-T17-2_tp_master"},{"location":{"location":"https://github.com/AY2324S2-CS2103T-F13-1/tp.git","repoName":"tp","organization":"AY2324S2-CS2103T-F13-1","domainName":"github"},"branch":"master","displayName":"AY2324S2-CS2103T-F13-1/tp[master]","outputFolderName":"AY2324S2-CS2103T-F13-1_tp_master"},{"location":{"location":"https://github.com/AY2324S2-CS2103T-F14-1/tp.git","repoName":"tp","organization":"AY2324S2-CS2103T-F14-1","domainName":"github"},"branch":"master","displayName":"AY2324S2-CS2103T-F14-1/tp[master]","outputFolderName":"AY2324S2-CS2103T-F14-1_tp_master"},{"location":{"location":"https://github.com/AY2324S2-CS2103T-T11-2/tp.git","repoName":"tp","organization":"AY2324S2-CS2103T-T11-2","domainName":"github"},"branch":"master","displayName":"AY2324S2-CS2103T-T11-2/tp[master]","outputFolderName":"AY2324S2-CS2103T-T11-2_tp_master"},{"location":{"location":"https://github.com/AY2324S2-CS2103T-F11-2/tp.git","repoName":"tp","organization":"AY2324S2-CS2103T-F11-2","domainName":"github"},"branch":"master","displayName":"AY2324S2-CS2103T-F11-2/tp[master]","outputFolderName":"AY2324S2-CS2103T-F11-2_tp_master"},{"location":{"location":"https://github.com/AY2324S2-CS2103T-T08-3/tp.git","repoName":"tp","organization":"AY2324S2-CS2103T-T08-3","domainName":"github"},"branch":"master","displayName":"AY2324S2-CS2103T-T08-3/tp[master]","outputFolderName":"AY2324S2-CS2103T-T08-3_tp_master"},{"location":{"location":"https://github.com/AY2324S2-CS2103T-W12-3/tp.git","repoName":"tp","organization":"AY2324S2-CS2103T-W12-3","domainName":"github"},"branch":"master","displayName":"AY2324S2-CS2103T-W12-3/tp[master]","outputFolderName":"AY2324S2-CS2103T-W12-3_tp_master"},{"location":{"location":"https://github.com/AY2324S2-CS2103T-W08-3/tp.git","repoName":"tp","organization":"AY2324S2-CS2103T-W08-3","domainName":"github"},"branch":"master","displayName":"AY2324S2-CS2103T-W08-3/tp[master]","outputFolderName":"AY2324S2-CS2103T-W08-3_tp_master"},{"location":{"location":"https://github.com/AY2324S2-CS2103T-W10-2/tp.git","repoName":"tp","organization":"AY2324S2-CS2103T-W10-2","domainName":"github"},"branch":"master","displayName":"AY2324S2-CS2103T-W10-2/tp[master]","outputFolderName":"AY2324S2-CS2103T-W10-2_tp_master"},{"location":{"location":"https://github.com/AY2324S2-CS2103T-F12-4/tp.git","repoName":"tp","organization":"AY2324S2-CS2103T-F12-4","domainName":"github"},"branch":"master","displayName":"AY2324S2-CS2103T-F12-4/tp[master]","outputFolderName":"AY2324S2-CS2103T-F12-4_tp_master"},{"location":{"location":"https://github.com/AY2324S2-CS2103T-W11-2/tp.git","repoName":"tp","organization":"AY2324S2-CS2103T-W11-2","domainName":"github"},"branch":"master","displayName":"AY2324S2-CS2103T-W11-2/tp[master]","outputFolderName":"AY2324S2-CS2103T-W11-2_tp_master"},{"location":{"location":"https://github.com/AY2324S2-CS2103T-W08-4/tp.git","repoName":"tp","organization":"AY2324S2-CS2103T-W08-4","domainName":"github"},"branch":"master","displayName":"AY2324S2-CS2103T-W08-4/tp[master]","outputFolderName":"AY2324S2-CS2103T-W08-4_tp_master"},{"location":{"location":"https://github.com/AY2324S2-CS2103T-T09-1/tp.git","repoName":"tp","organization":"AY2324S2-CS2103T-T09-1","domainName":"github"},"branch":"master","displayName":"AY2324S2-CS2103T-T09-1/tp[master]","outputFolderName":"AY2324S2-CS2103T-T09-1_tp_master"},{"location":{"location":"https://github.com/AY2324S2-CS2103T-W11-3/tp.git","repoName":"tp","organization":"AY2324S2-CS2103T-W11-3","domainName":"github"},"branch":"master","displayName":"AY2324S2-CS2103T-W11-3/tp[master]","outputFolderName":"AY2324S2-CS2103T-W11-3_tp_master"},{"location":{"location":"https://github.com/AY2324S2-CS2103T-W11-1/tp.git","repoName":"tp","organization":"AY2324S2-CS2103T-W11-1","domainName":"github"},"branch":"master","displayName":"AY2324S2-CS2103T-W11-1/tp[master]","outputFolderName":"AY2324S2-CS2103T-W11-1_tp_master"},{"location":{"location":"https://github.com/AY2324S2-CS2103T-T12-2/tp.git","repoName":"tp","organization":"AY2324S2-CS2103T-T12-2","domainName":"github"},"branch":"master","displayName":"AY2324S2-CS2103T-T12-2/tp[master]","outputFolderName":"AY2324S2-CS2103T-T12-2_tp_master"},{"location":{"location":"https://github.com/AY2324S2-CS2103T-F11-3/tp.git","repoName":"tp","organization":"AY2324S2-CS2103T-F11-3","domainName":"github"},"branch":"master","displayName":"AY2324S2-CS2103T-F11-3/tp[master]","outputFolderName":"AY2324S2-CS2103T-F11-3_tp_master"},{"location":{"location":"https://github.com/AY2324S2-CS2103T-T11-4/tp.git","repoName":"tp","organization":"AY2324S2-CS2103T-T11-4","domainName":"github"},"branch":"master","displayName":"AY2324S2-CS2103T-T11-4/tp[master]","outputFolderName":"AY2324S2-CS2103T-T11-4_tp_master"},{"location":{"location":"https://github.com/AY2324S2-CS2103T-T10-1/tp.git","repoName":"tp","organization":"AY2324S2-CS2103T-T10-1","domainName":"github"},"branch":"master","displayName":"AY2324S2-CS2103T-T10-1/tp[master]","outputFolderName":"AY2324S2-CS2103T-T10-1_tp_master"},{"location":{"location":"https://github.com/AY2324S2-CS2103T-F14-3/tp.git","repoName":"tp","organization":"AY2324S2-CS2103T-F14-3","domainName":"github"},"branch":"master","displayName":"AY2324S2-CS2103T-F14-3/tp[master]","outputFolderName":"AY2324S2-CS2103T-F14-3_tp_master"},{"location":{"location":"https://github.com/AY2324S2-CS2103T-T08-1/tp.git","repoName":"tp","organization":"AY2324S2-CS2103T-T08-1","domainName":"github"},"branch":"master","displayName":"AY2324S2-CS2103T-T08-1/tp[master]","outputFolderName":"AY2324S2-CS2103T-T08-1_tp_master"},{"location":{"location":"https://github.com/AY2324S2-CS2103T-W09-3/tp.git","repoName":"tp","organization":"AY2324S2-CS2103T-W09-3","domainName":"github"},"branch":"master","displayName":"AY2324S2-CS2103T-W09-3/tp[master]","outputFolderName":"AY2324S2-CS2103T-W09-3_tp_master"},{"location":{"location":"https://github.com/AY2324S2-CS2103T-T11-1/tp.git","repoName":"tp","organization":"AY2324S2-CS2103T-T11-1","domainName":"github"},"branch":"master","displayName":"AY2324S2-CS2103T-T11-1/tp[master]","outputFolderName":"AY2324S2-CS2103T-T11-1_tp_master"},{"location":{"location":"https://github.com/AY2324S2-CS2103T-W10-1/tp.git","repoName":"tp","organization":"AY2324S2-CS2103T-W10-1","domainName":"github"},"branch":"master","displayName":"AY2324S2-CS2103T-W10-1/tp[master]","outputFolderName":"AY2324S2-CS2103T-W10-1_tp_master"},{"location":{"location":"https://github.com/AY2324S2-CS2103T-F10-3/tp.git","repoName":"tp","organization":"AY2324S2-CS2103T-F10-3","domainName":"github"},"branch":"master","displayName":"AY2324S2-CS2103T-F10-3/tp[master]","outputFolderName":"AY2324S2-CS2103T-F10-3_tp_master"},{"location":{"location":"https://github.com/AY2324S2-CS2103T-T13-1/tp.git","repoName":"tp","organization":"AY2324S2-CS2103T-T13-1","domainName":"github"},"branch":"master","displayName":"AY2324S2-CS2103T-T13-1/tp[master]","outputFolderName":"AY2324S2-CS2103T-T13-1_tp_master"},{"location":{"location":"https://github.com/AY2324S2-CS2103T-T13-3/tp.git","repoName":"tp","organization":"AY2324S2-CS2103T-T13-3","domainName":"github"},"branch":"master","displayName":"AY2324S2-CS2103T-T13-3/tp[master]","outputFolderName":"AY2324S2-CS2103T-T13-3_tp_master"},{"location":{"location":"https://github.com/AY2324S2-CS2103T-F13-2/tp.git","repoName":"tp","organization":"AY2324S2-CS2103T-F13-2","domainName":"github"},"branch":"master","displayName":"AY2324S2-CS2103T-F13-2/tp[master]","outputFolderName":"AY2324S2-CS2103T-F13-2_tp_master"},{"location":{"location":"https://github.com/AY2324S2-CS2103T-T12-4/tp.git","repoName":"tp","organization":"AY2324S2-CS2103T-T12-4","domainName":"github"},"branch":"master","displayName":"AY2324S2-CS2103T-T12-4/tp[master]","outputFolderName":"AY2324S2-CS2103T-T12-4_tp_master"},{"location":{"location":"https://github.com/AY2324S2-CS2103T-T08-2/tp.git","repoName":"tp","organization":"AY2324S2-CS2103T-T08-2","domainName":"github"},"branch":"master","displayName":"AY2324S2-CS2103T-T08-2/tp[master]","outputFolderName":"AY2324S2-CS2103T-T08-2_tp_master"},{"location":{"location":"https://github.com/AY2324S2-CS2103T-T12-3/tp.git","repoName":"tp","organization":"AY2324S2-CS2103T-T12-3","domainName":"github"},"branch":"master","displayName":"AY2324S2-CS2103T-T12-3/tp[master]","outputFolderName":"AY2324S2-CS2103T-T12-3_tp_master"},{"location":{"location":"https://github.com/AY2324S2-CS2103T-T09-3/tp.git","repoName":"tp","organization":"AY2324S2-CS2103T-T09-3","domainName":"github"},"branch":"master","displayName":"AY2324S2-CS2103T-T09-3/tp[master]","outputFolderName":"AY2324S2-CS2103T-T09-3_tp_master"},{"location":{"location":"https://github.com/AY2324S2-CS2103T-W12-1/tp.git","repoName":"tp","organization":"AY2324S2-CS2103T-W12-1","domainName":"github"},"branch":"master","displayName":"AY2324S2-CS2103T-W12-1/tp[master]","outputFolderName":"AY2324S2-CS2103T-W12-1_tp_master"},{"location":{"location":"https://github.com/AY2324S2-CS2103T-F10-4/tp.git","repoName":"tp","organization":"AY2324S2-CS2103T-F10-4","domainName":"github"},"branch":"master","displayName":"AY2324S2-CS2103T-F10-4/tp[master]","outputFolderName":"AY2324S2-CS2103T-F10-4_tp_master"},{"location":{"location":"https://github.com/AY2324S2-CS2103T-F13-4/tp.git","repoName":"tp","organization":"AY2324S2-CS2103T-F13-4","domainName":"github"},"branch":"master","displayName":"AY2324S2-CS2103T-F13-4/tp[master]","outputFolderName":"AY2324S2-CS2103T-F13-4_tp_master"},{"location":{"location":"https://github.com/AY2324S2-CS2103T-T15-4/tp.git","repoName":"tp","organization":"AY2324S2-CS2103T-T15-4","domainName":"github"},"branch":"master","displayName":"AY2324S2-CS2103T-T15-4/tp[master]","outputFolderName":"AY2324S2-CS2103T-T15-4_tp_master"},{"location":{"location":"https://github.com/AY2324S2-CS2103T-T13-4/tp.git","repoName":"tp","organization":"AY2324S2-CS2103T-T13-4","domainName":"github"},"branch":"master","displayName":"AY2324S2-CS2103T-T13-4/tp[master]","outputFolderName":"AY2324S2-CS2103T-T13-4_tp_master"},{"location":{"location":"https://github.com/AY2324S2-CS2103T-F11-1/tp.git","repoName":"tp","organization":"AY2324S2-CS2103T-F11-1","domainName":"github"},"branch":"master","displayName":"AY2324S2-CS2103T-F11-1/tp[master]","outputFolderName":"AY2324S2-CS2103T-F11-1_tp_master"},{"location":{"location":"https://github.com/AY2324S2-CS2103T-W09-2/tp.git","repoName":"tp","organization":"AY2324S2-CS2103T-W09-2","domainName":"github"},"branch":"master","displayName":"AY2324S2-CS2103T-W09-2/tp[master]","outputFolderName":"AY2324S2-CS2103T-W09-2_tp_master"},{"location":{"location":"https://github.com/AY2324S2-CS2103T-F12-1/tp.git","repoName":"tp","organization":"AY2324S2-CS2103T-F12-1","domainName":"github"},"branch":"master","displayName":"AY2324S2-CS2103T-F12-1/tp[master]","outputFolderName":"AY2324S2-CS2103T-F12-1_tp_master"},{"location":{"location":"https://github.com/AY2324S2-CS2103T-T17-1/tp.git","repoName":"tp","organization":"AY2324S2-CS2103T-T17-1","domainName":"github"},"branch":"master","displayName":"AY2324S2-CS2103T-T17-1/tp[master]","outputFolderName":"AY2324S2-CS2103T-T17-1_tp_master"},{"location":{"location":"https://github.com/AY2324S2-CS2103T-T15-3/tp.git","repoName":"tp","organization":"AY2324S2-CS2103T-T15-3","domainName":"github"},"branch":"master","displayName":"AY2324S2-CS2103T-T15-3/tp[master]","outputFolderName":"AY2324S2-CS2103T-T15-3_tp_master"},{"location":{"location":"https://github.com/AY2324S2-CS2103T-T16-3/tp.git","repoName":"tp","organization":"AY2324S2-CS2103T-T16-3","domainName":"github"},"branch":"master","displayName":"AY2324S2-CS2103T-T16-3/tp[master]","outputFolderName":"AY2324S2-CS2103T-T16-3_tp_master"},{"location":{"location":"https://github.com/AY2324S2-CS2103T-W13-3/tp.git","repoName":"tp","organization":"AY2324S2-CS2103T-W13-3","domainName":"github"},"branch":"master","displayName":"AY2324S2-CS2103T-W13-3/tp[master]","outputFolderName":"AY2324S2-CS2103T-W13-3_tp_master"},{"location":{"location":"https://github.com/AY2324S2-CS2103T-W10-3/tp.git","repoName":"tp","organization":"AY2324S2-CS2103T-W10-3","domainName":"github"},"branch":"master","displayName":"AY2324S2-CS2103T-W10-3/tp[master]","outputFolderName":"AY2324S2-CS2103T-W10-3_tp_master"},{"location":{"location":"https://github.com/AY2324S2-CS2103T-T15-2/tp.git","repoName":"tp","organization":"AY2324S2-CS2103T-T15-2","domainName":"github"},"branch":"master","displayName":"AY2324S2-CS2103T-T15-2/tp[master]","outputFolderName":"AY2324S2-CS2103T-T15-2_tp_master"},{"location":{"location":"https://github.com/AY2324S2-CS2103T-W12-2/tp.git","repoName":"tp","organization":"AY2324S2-CS2103T-W12-2","domainName":"github"},"branch":"master","displayName":"AY2324S2-CS2103T-W12-2/tp[master]","outputFolderName":"AY2324S2-CS2103T-W12-2_tp_master"},{"location":{"location":"https://github.com/AY2324S2-CS2103T-T09-2/tp.git","repoName":"tp","organization":"AY2324S2-CS2103T-T09-2","domainName":"github"},"branch":"master","displayName":"AY2324S2-CS2103T-T09-2/tp[master]","outputFolderName":"AY2324S2-CS2103T-T09-2_tp_master"},{"location":{"location":"https://github.com/AY2324S2-CS2103T-T17-3/tp.git","repoName":"tp","organization":"AY2324S2-CS2103T-T17-3","domainName":"github"},"branch":"master","displayName":"AY2324S2-CS2103T-T17-3/tp[master]","outputFolderName":"AY2324S2-CS2103T-T17-3_tp_master"},{"location":{"location":"https://github.com/AY2324S2-CS2103T-W13-4/tp.git","repoName":"tp","organization":"AY2324S2-CS2103T-W13-4","domainName":"github"},"branch":"master","displayName":"AY2324S2-CS2103T-W13-4/tp[master]","outputFolderName":"AY2324S2-CS2103T-W13-4_tp_master"},{"location":{"location":"https://github.com/AY2324S2-CS2103T-W08-2/tp.git","repoName":"tp","organization":"AY2324S2-CS2103T-W08-2","domainName":"github"},"branch":"master","displayName":"AY2324S2-CS2103T-W08-2/tp[master]","outputFolderName":"AY2324S2-CS2103T-W08-2_tp_master"},{"location":{"location":"https://github.com/AY2324S2-CS2103T-F11-4/tp.git","repoName":"tp","organization":"AY2324S2-CS2103T-F11-4","domainName":"github"},"branch":"master","displayName":"AY2324S2-CS2103T-F11-4/tp[master]","outputFolderName":"AY2324S2-CS2103T-F11-4_tp_master"},{"location":{"location":"https://github.com/AY2324S2-CS2103T-T16-1/tp.git","repoName":"tp","organization":"AY2324S2-CS2103T-T16-1","domainName":"github"},"branch":"master","displayName":"AY2324S2-CS2103T-T16-1/tp[master]","outputFolderName":"AY2324S2-CS2103T-T16-1_tp_master"},{"location":{"location":"https://github.com/AY2324S2-CS2103T-F10-2/tp.git","repoName":"tp","organization":"AY2324S2-CS2103T-F10-2","domainName":"github"},"branch":"master","displayName":"AY2324S2-CS2103T-F10-2/tp[master]","outputFolderName":"AY2324S2-CS2103T-F10-2_tp_master"},{"location":{"location":"https://github.com/AY2324S2-CS2103T-W09-4/tp.git","repoName":"tp","organization":"AY2324S2-CS2103T-W09-4","domainName":"github"},"branch":"master","displayName":"AY2324S2-CS2103T-W09-4/tp[master]","outputFolderName":"AY2324S2-CS2103T-W09-4_tp_master"},{"location":{"location":"https://github.com/AY2324S2-CS2103T-T15-1/tp.git","repoName":"tp","organization":"AY2324S2-CS2103T-T15-1","domainName":"github"},"branch":"master","displayName":"AY2324S2-CS2103T-T15-1/tp[master]","outputFolderName":"AY2324S2-CS2103T-T15-1_tp_master"},{"location":{"location":"https://github.com/AY2324S2-CS2103T-W09-1/tp.git","repoName":"tp","organization":"AY2324S2-CS2103T-W09-1","domainName":"github"},"branch":"master","displayName":"AY2324S2-CS2103T-W09-1/tp[master]","outputFolderName":"AY2324S2-CS2103T-W09-1_tp_master"},{"location":{"location":"https://github.com/AY2324S2-CS2103T-F14-2/tp.git","repoName":"tp","organization":"AY2324S2-CS2103T-F14-2","domainName":"github"},"branch":"master","displayName":"AY2324S2-CS2103T-F14-2/tp[master]","outputFolderName":"AY2324S2-CS2103T-F14-2_tp_master"},{"location":{"location":"https://github.com/AY2324S2-CS2103T-W13-2/tp.git","repoName":"tp","organization":"AY2324S2-CS2103T-W13-2","domainName":"github"},"branch":"master","displayName":"AY2324S2-CS2103T-W13-2/tp[master]","outputFolderName":"AY2324S2-CS2103T-W13-2_tp_master"},{"location":{"location":"https://github.com/AY2324S2-CS2103T-F13-3/tp.git","repoName":"tp","organization":"AY2324S2-CS2103T-F13-3","domainName":"github"},"branch":"master","displayName":"AY2324S2-CS2103T-F13-3/tp[master]","outputFolderName":"AY2324S2-CS2103T-F13-3_tp_master"},{"location":{"location":"https://github.com/AY2324S2-CS2103T-W10-4/tp.git","repoName":"tp","organization":"AY2324S2-CS2103T-W10-4","domainName":"github"},"branch":"master","displayName":"AY2324S2-CS2103T-W10-4/tp[master]","outputFolderName":"AY2324S2-CS2103T-W10-4_tp_master"},{"location":{"location":"https://github.com/AY2324S2-CS2103T-F12-2/tp.git","repoName":"tp","organization":"AY2324S2-CS2103T-F12-2","domainName":"github"},"branch":"master","displayName":"AY2324S2-CS2103T-F12-2/tp[master]","outputFolderName":"AY2324S2-CS2103T-F12-2_tp_master"},{"location":{"location":"https://github.com/AY2324S2-CS2103T-F12-3/tp.git","repoName":"tp","organization":"AY2324S2-CS2103T-F12-3","domainName":"github"},"branch":"master","displayName":"AY2324S2-CS2103T-F12-3/tp[master]","outputFolderName":"AY2324S2-CS2103T-F12-3_tp_master"},{"location":{"location":"https://github.com/AY2324S2-CS2103T-F14-4/tp.git","repoName":"tp","organization":"AY2324S2-CS2103T-F14-4","domainName":"github"},"branch":"master","displayName":"AY2324S2-CS2103T-F14-4/tp[master]","outputFolderName":"AY2324S2-CS2103T-F14-4_tp_master"},{"location":{"location":"https://github.com/AY2324S2-CS2103T-T16-4/tp.git","repoName":"tp","organization":"AY2324S2-CS2103T-T16-4","domainName":"github"},"branch":"master","displayName":"AY2324S2-CS2103T-T16-4/tp[master]","outputFolderName":"AY2324S2-CS2103T-T16-4_tp_master"},{"location":{"location":"https://github.com/AY2324S2-CS2103T-T14-1/tp.git","repoName":"tp","organization":"AY2324S2-CS2103T-T14-1","domainName":"github"},"branch":"master","displayName":"AY2324S2-CS2103T-T14-1/tp[master]","outputFolderName":"AY2324S2-CS2103T-T14-1_tp_master"}],"errorSet":[],"sinceDate":"2024-02-23","untilDate":"2024-03-08","isSinceDateProvided":true,"isUntilDateProvided":false,"supportedDomainUrlMap":{"NOT_RECOGNIZED":{"BRANCH":"","REPO_URL":"UNSUPPORTED","BASE_URL":"UNSUPPORTED","HISTORY_PATH":"","COMMIT_PATH":"","BLAME_PATH":""},"github":{"BRANCH":"tree/$BRANCH","REPO_URL":"https://github.com/$ORGANIZATION/$REPO_NAME/","BASE_URL":"https://github.com/","HISTORY_PATH":"commits/$BRANCH/$FILE_PATH","COMMIT_PATH":"commit/$COMMIT_HASH","BLAME_PATH":"blame/$BRANCH/$FILE_PATH"}}}